Konversi fungsi apa pun menjadi fungsi chatgpt.
AI-FNS adalah perpustakaan kecil yang mengubah fungsi apa pun menjadi fungsi yang dapat dipanggil dengan chatgpt.
Spesifikasi yang mendasarinya didasarkan pada fitur panggilan fungsi baru Openai.
pnpm install ai-fns zod? ? Buat skema JSON untuk fungsi Anda secara manual dan berikan ke 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 ,
} ,
} ,
] ,
} ) ; Gunakan ai-fns untuk secara otomatis menghasilkan skema untuk fungsi Anda dan berikan ke 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 ] ,
} ) ; Berikut adalah contoh fungsi yang menghitung output dari ekspresi matematika yang diberikan:
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 } ` ;
}
}
) ;Sekarang, Anda bisa meminta chatgpt untuk melakukan beberapa matematika untuk Anda:
User: What's 45^(2.12) / 45?
Assistant: The result of 45^(2.12) / 45 is approximately 71.06.
Berikut adalah contoh fungsi yang mengambil berita terbaru dari umpan 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.
Fitur panggilan fungsi baru Openai memungkinkan Anda untuk memanggil fungsi dari dalam chatgpt.
Namun, itu mengharuskan Anda untuk lulus sebagai skema JSON untuk fungsi Anda yang berisi jenis input dan output fungsi Anda. Ini agak rumit untuk dilakukan secara manual.
Perpustakaan ini secara otomatis menangani konversi untuk Anda
Apakah Anda punya ide untuk suatu fungsi? Jangan ragu untuk membuka permintaan tarik!
Cukup buat file baru di direktori src/functions dan tambahkan fungsi Anda. Pastikan untuk menambahkan deskripsi dan skema untuk fungsi Anda.
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 ) ;