mirror of
https://github.com/mudler/LocalAI.git
synced 2025-05-20 02:24:59 +00:00
fix(grammar): respect JSONmode and grammar from user input (#1935)
* fix(grammar): Fix JSON mode and custom grammar * tests(aio): add jsonmode test * tests(aio): add functioncall test * fix(aio): use hermes-2-pro-mistral as llm for CPU profile * add phi-2-orange
This commit is contained in:
parent
784657a652
commit
35290e146b
5 changed files with 139 additions and 5 deletions
|
@ -2,6 +2,7 @@ package e2e_test
|
|||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
@ -9,8 +10,8 @@ import (
|
|||
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
|
||||
"github.com/sashabaranov/go-openai"
|
||||
"github.com/sashabaranov/go-openai/jsonschema"
|
||||
)
|
||||
|
||||
var _ = Describe("E2E test", func() {
|
||||
|
@ -40,6 +41,82 @@ var _ = Describe("E2E test", func() {
|
|||
Expect(resp.Choices[0].Message.Content).To(Or(ContainSubstring("4"), ContainSubstring("four")), fmt.Sprint(resp.Choices[0].Message.Content))
|
||||
})
|
||||
})
|
||||
|
||||
Context("function calls", func() {
|
||||
It("correctly invoke", func() {
|
||||
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,
|
||||
}
|
||||
|
||||
dialogue := []openai.ChatCompletionMessage{
|
||||
{Role: openai.ChatMessageRoleUser, Content: "What is the weather in Boston today?"},
|
||||
}
|
||||
resp, err := client.CreateChatCompletion(context.TODO(),
|
||||
openai.ChatCompletionRequest{
|
||||
Model: openai.GPT4,
|
||||
Messages: dialogue,
|
||||
Tools: []openai.Tool{t},
|
||||
},
|
||||
)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(len(resp.Choices)).To(Equal(1), fmt.Sprint(resp))
|
||||
|
||||
msg := resp.Choices[0].Message
|
||||
Expect(len(msg.ToolCalls)).To(Equal(1), fmt.Sprint(msg.ToolCalls))
|
||||
Expect(msg.ToolCalls[0].Function.Name).To(Equal("get_current_weather"), fmt.Sprint(msg.ToolCalls[0].Function.Name))
|
||||
Expect(msg.ToolCalls[0].Function.Arguments).To(ContainSubstring("Boston"), fmt.Sprint(msg.ToolCalls[0].Function.Arguments))
|
||||
})
|
||||
})
|
||||
Context("json", func() {
|
||||
It("correctly", func() {
|
||||
model := "gpt-4"
|
||||
|
||||
req := openai.ChatCompletionRequest{
|
||||
ResponseFormat: &openai.ChatCompletionResponseFormat{Type: openai.ChatCompletionResponseFormatTypeJSONObject},
|
||||
Model: model,
|
||||
Messages: []openai.ChatCompletionMessage{
|
||||
{
|
||||
|
||||
Role: "user",
|
||||
Content: "An animal with 'name', 'gender' and 'legs' fields",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := client.CreateChatCompletion(context.TODO(), req)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(len(resp.Choices)).To(Equal(1), fmt.Sprint(resp))
|
||||
|
||||
var i map[string]interface{}
|
||||
err = json.Unmarshal([]byte(resp.Choices[0].Message.Content), &i)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(i).To(HaveKey("name"))
|
||||
Expect(i).To(HaveKey("gender"))
|
||||
Expect(i).To(HaveKey("legs"))
|
||||
})
|
||||
})
|
||||
|
||||
Context("images", func() {
|
||||
It("correctly", func() {
|
||||
resp, err := client.CreateImage(context.TODO(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue