add google gemini support
This commit is contained in:
106
google.go
Normal file
106
google.go
Normal file
@@ -0,0 +1,106 @@
|
||||
package go_llm
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/google/generative-ai-go/genai"
|
||||
"google.golang.org/api/option"
|
||||
)
|
||||
|
||||
type google struct {
|
||||
key string
|
||||
model string
|
||||
}
|
||||
|
||||
func (g google) ModelVersion(modelVersion string) (ChatCompletion, error) {
|
||||
g.model = modelVersion
|
||||
|
||||
return g, nil
|
||||
}
|
||||
|
||||
func (g google) requestToGoogleRequest(in Request, model *genai.GenerativeModel) []genai.Part {
|
||||
|
||||
if in.Temperature != nil {
|
||||
model.GenerationConfig.Temperature = in.Temperature
|
||||
}
|
||||
|
||||
res := []genai.Part{}
|
||||
|
||||
for _, c := range in.Messages {
|
||||
res = append(res, genai.Text(c.Text))
|
||||
}
|
||||
|
||||
for _, tool := range in.Toolbox {
|
||||
panic("google toolbox is todo" + tool.Name)
|
||||
|
||||
/*
|
||||
t := genai.Tool{}
|
||||
t.FunctionDeclarations = append(t.FunctionDeclarations, &genai.FunctionDeclaration{
|
||||
Name: tool.Name,
|
||||
Description: tool.Description,
|
||||
Parameters: nil, //tool.Parameters,
|
||||
})
|
||||
*/
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func (g google) responseToLLMResponse(in *genai.GenerateContentResponse) (Response, error) {
|
||||
res := Response{}
|
||||
|
||||
for _, c := range in.Candidates {
|
||||
if c.Content != nil {
|
||||
for _, p := range c.Content.Parts {
|
||||
switch p.(type) {
|
||||
case genai.Text:
|
||||
res.Choices = append(res.Choices, ResponseChoice{
|
||||
Content: string(p.(genai.Text)),
|
||||
})
|
||||
|
||||
case genai.FunctionCall:
|
||||
v := p.(genai.FunctionCall)
|
||||
choice := ResponseChoice{}
|
||||
|
||||
choice.Content = v.Name
|
||||
call := ToolCall{
|
||||
ID: v.Name,
|
||||
FunctionCall: FunctionCall{
|
||||
Name: v.Name,
|
||||
Arguments: v.Args,
|
||||
},
|
||||
}
|
||||
|
||||
choice.Calls = append(choice.Calls, call)
|
||||
|
||||
res.Choices = append(res.Choices, choice)
|
||||
|
||||
default:
|
||||
return Response{}, fmt.Errorf("unknown part type: %T", p)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (g google) ChatComplete(ctx context.Context, req Request) (Response, error) {
|
||||
cl, err := genai.NewClient(ctx, option.WithAPIKey(g.key))
|
||||
|
||||
if err != nil {
|
||||
return Response{}, fmt.Errorf("error creating genai client: %w", err)
|
||||
}
|
||||
|
||||
model := cl.GenerativeModel(g.model)
|
||||
|
||||
parts := g.requestToGoogleRequest(req, model)
|
||||
|
||||
resp, err := model.GenerateContent(ctx, parts...)
|
||||
|
||||
if err != nil {
|
||||
return Response{}, fmt.Errorf("error generating content: %w", err)
|
||||
}
|
||||
|
||||
return g.responseToLLMResponse(resp)
|
||||
}
|
Reference in New Issue
Block a user