Преобразовать любую функцию в функцию CHATGPT.
AI-FNS-это крошечная библиотека, которая преобразует любую функцию в функцию, которую CATGPT может вызвать.
Основная спецификация основана на новой функции Openai.
pnpm install ai-fns zod? ? Создайте схему JSON для вашей функции вручную и передайте ее в CHATGPT
import openai , { OpenAI } from "openai" ;
const openai = new OpenAI ( {
apiKey : env . OPENAI_API_KEY ,
} ) ;
const weather = async ( {
latitude ,
longitude ,
} : {
latitude : number ;
longitude : number ;
} ) => {
try {
const res = await fetch (
`https://api.open-meteo.com/v1/forecast?latitude= ${ latitude } &longitude= ${ longitude } ¤t_weather=true`
) ;
return await res . json ( ) ;
} catch ( error ) {
return error ;
}
} ;
const completion = await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
messages : [ { role : "user" , content : "What's the weather in San Francisco?" } ] ,
functions : [
{
name : "weather" ,
description : "Get the current weather in a given location" ,
parameters : {
type : "object" ,
properties : {
longitude : {
type : "number" ,
minimum : - 180 ,
maximum : 180 ,
description : "Longitude" ,
} ,
latitude : {
type : "number" ,
minimum : - 90 ,
maximum : 90 ,
description : "Latitude" ,
} ,
} ,
required : [ "longitude" , "latitude" ] ,
additionalProperties : false ,
} ,
} ,
] ,
} ) ; Используйте ai-fns для автоматического генерации схемы для вашей функции и передать ее в CHATGPT
import openai , { OpenAI } from "openai" ;
import { z } from "zod" ;
import { aifn } from "ai-fns" ;
const openai = new OpenAI ( {
apiKey : env . OPENAI_API_KEY ,
} ) ;
const { schema , fn } = aifn (
"weather" ,
"Get the current weather in a given location" ,
z . object ( {
longitude : z . number ( ) . min ( - 180 ) . max ( 180 ) . describe ( "Longitude" ) ,
latitude : z . number ( ) . min ( - 90 ) . max ( 90 ) . describe ( "Latitude" ) ,
} ) ,
async ( { latitude , longitude } ) => {
try {
const res = await fetch (
`https://api.open-meteo.com/v1/forecast?latitude= ${ latitude } &longitude= ${ longitude } ¤t_weather=true`
) ;
return await res . json ( ) ;
} catch ( error ) {
return error ;
}
}
) ;
// Ask the AI a question
const completion = await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
messages : [ { role : "user" , content : "What's the weather in San Francisco?" } ] ,
functions : [ schema ] ,
} ) ; Вот пример функции, которая вычисляет вывод данного математического выражения:
import { Parser } from "expr-eval" ;
import { z } from "zod" ;
import { aifn } from "ai-fns" ;
const parser = new Parser ( ) ;
export default aifn (
"calculator" ,
"Calculate the output of a given mathematical expression" ,
z . object ( {
expression : z . string ( ) ,
} ) ,
( { expression } ) => {
try {
const result = parser . parse ( expression ) . evaluate ( ) ;
return result ;
} catch ( error ) {
return `Failed to execute script: ${ error . message } ` ;
}
}
) ;Теперь вы можете просто попросить Chatgpt сделать для вас немного математики:
User: What's 45^(2.12) / 45?
Assistant: The result of 45^(2.12) / 45 is approximately 71.06.
Вот пример функции, которая получает последние новости из RSS -канала:
import { z } from "zod" ;
import { aifn } from "ai-fns" ;
const name = "reddit" ;
const description = "Get stories from reddit" ;
const schema = z . object ( {
subreddit : z . string ( ) . optional ( ) . default ( "all" ) . describe ( "Subreddit" ) ,
limit : z . number ( ) . optional ( ) . default ( 5 ) . describe ( "Limit" ) ,
category : z
. enum ( [ "hot" , "new" , "random" , "top" , "rising" , "controversial" ] )
. default ( "hot" )
. describe ( "category" ) ,
} ) ;
const reddit = async ( {
subreddit ,
category ,
limit ,
} : z . infer < typeof schema > ) => {
try {
const params = new URLSearchParams ( {
limit : limit . toString ( ) ,
} ) ;
const url = `https://www.reddit.com/r/ ${ subreddit } / ${ category } .json? ${ params . toString ( ) } ` ;
const res = await fetch ( url ) ;
return await res . json ( ) ;
} catch ( error ) {
console . log ( error ) ;
return error ;
}
} ;
export default aifn ( name , description , schema , reddit ) ; User: What's the top story on /r/programming today?
Assistant: The top story on /r/programming is "Crumb: A New Programming Language Where There are No Keywords, and Everything is a Function". You can read more about it [here](https://github.com/liam-ilan/crumb). It has received 201 upvotes and has 25 comments.
Новая функция Openai Fulce позволяет вам вызовать функции из ChatGPT.
Тем не менее, это требует, чтобы вы проходили схему JSON для вашей функции, содержащей входные и выходные типы вашей функции. Это немного громоздко сделать вручную.
Эта библиотека автоматически обрабатывает конверсию для вас
У вас есть идея для функции? Не стесняйтесь открыть запрос на тягу!
Просто создайте новый файл в каталоге src/functions и добавьте свою функцию. Обязательно добавьте описание и схему для вашей функции.
import { z } from "zod" ;
import { aifn } from "ai-fns" ;
export const name = "name" ;
export const description = "description" ;
export const schema = z . object ( {
// schema
} ) ;
export const fn = async ( { } : /* schema */ z . infer < typeof schema > ) => {
// function body
} ;
export default aifn ( name , description , schema , fn ) ;