95 lines
2.7 KiB
Go
95 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
|
|
"git.vaala.cloud/VaalaCat/go-openai"
|
|
"git.vaala.cloud/VaalaCat/go-openai/jsonschema"
|
|
)
|
|
|
|
func main() {
|
|
ctx := context.Background()
|
|
client := openai.NewClient(os.Getenv("OPENAI_API_KEY"))
|
|
|
|
// describe the function & its inputs
|
|
params := jsonschema.Definition{
|
|
Type: jsonschema.Object,
|
|
Properties: map[string]jsonschema.Definition{
|
|
"location": {
|
|
Type: jsonschema.String,
|
|
Description: "The city and state, e.g. San Francisco, CA",
|
|
},
|
|
"unit": {
|
|
Type: jsonschema.String,
|
|
Enum: []string{"celsius", "fahrenheit"},
|
|
},
|
|
},
|
|
Required: []string{"location"},
|
|
}
|
|
f := openai.FunctionDefinition{
|
|
Name: "get_current_weather",
|
|
Description: "Get the current weather in a given location",
|
|
Parameters: params,
|
|
}
|
|
t := openai.Tool{
|
|
Type: openai.ToolTypeFunction,
|
|
Function: &f,
|
|
}
|
|
|
|
// simulate user asking a question that requires the function
|
|
dialogue := []openai.ChatCompletionMessage{
|
|
{Role: openai.ChatMessageRoleUser, Content: "What is the weather in Boston today?"},
|
|
}
|
|
fmt.Printf("Asking OpenAI '%v' and providing it a '%v()' function...\n",
|
|
dialogue[0].Content, f.Name)
|
|
resp, err := client.CreateChatCompletion(ctx,
|
|
openai.ChatCompletionRequest{
|
|
Model: openai.GPT4TurboPreview,
|
|
Messages: dialogue,
|
|
Tools: []openai.Tool{t},
|
|
},
|
|
)
|
|
if err != nil || len(resp.Choices) != 1 {
|
|
fmt.Printf("Completion error: err:%v len(choices):%v\n", err,
|
|
len(resp.Choices))
|
|
return
|
|
}
|
|
msg := resp.Choices[0].Message
|
|
if len(msg.ToolCalls) != 1 {
|
|
fmt.Printf("Completion error: len(toolcalls): %v\n", len(msg.ToolCalls))
|
|
return
|
|
}
|
|
|
|
// simulate calling the function & responding to OpenAI
|
|
dialogue = append(dialogue, msg)
|
|
fmt.Printf("OpenAI called us back wanting to invoke our function '%v' with params '%v'\n",
|
|
msg.ToolCalls[0].Function.Name, msg.ToolCalls[0].Function.Arguments)
|
|
dialogue = append(dialogue, openai.ChatCompletionMessage{
|
|
Role: openai.ChatMessageRoleTool,
|
|
Content: "Sunny and 80 degrees.",
|
|
Name: msg.ToolCalls[0].Function.Name,
|
|
ToolCallID: msg.ToolCalls[0].ID,
|
|
})
|
|
fmt.Printf("Sending OpenAI our '%v()' function's response and requesting the reply to the original question...\n",
|
|
f.Name)
|
|
resp, err = client.CreateChatCompletion(ctx,
|
|
openai.ChatCompletionRequest{
|
|
Model: openai.GPT4TurboPreview,
|
|
Messages: dialogue,
|
|
Tools: []openai.Tool{t},
|
|
},
|
|
)
|
|
if err != nil || len(resp.Choices) != 1 {
|
|
fmt.Printf("2nd completion error: err:%v len(choices):%v\n", err,
|
|
len(resp.Choices))
|
|
return
|
|
}
|
|
|
|
// display OpenAI's response to the original question utilizing our function
|
|
msg = resp.Choices[0].Message
|
|
fmt.Printf("OpenAI answered the original request with: %v\n",
|
|
msg.Content)
|
|
}
|