diff --git a/llms/googleai/googleai.go b/llms/googleai/googleai.go index b56cb3203..bcba2071b 100644 --- a/llms/googleai/googleai.go +++ b/llms/googleai/googleai.go @@ -37,7 +37,11 @@ func (g *GoogleAI) Call(ctx context.Context, prompt string, options ...llms.Call } // GenerateContent implements the [llms.Model] interface. -func (g *GoogleAI) GenerateContent(ctx context.Context, messages []llms.MessageContent, options ...llms.CallOption) (*llms.ContentResponse, error) { +func (g *GoogleAI) GenerateContent( + ctx context.Context, + messages []llms.MessageContent, + options ...llms.CallOption, +) (*llms.ContentResponse, error) { if g.CallbacksHandler != nil { g.CallbacksHandler.HandleLLMGenerateContentStart(ctx, messages) } @@ -229,7 +233,12 @@ func convertContent(content llms.MessageContent) (*genai.Content, error) { // generateFromSingleMessage generates content from the parts of a single // message. -func generateFromSingleMessage(ctx context.Context, model *genai.GenerativeModel, parts []llms.ContentPart, opts *llms.CallOptions) (*llms.ContentResponse, error) { +func generateFromSingleMessage( + ctx context.Context, + model *genai.GenerativeModel, + parts []llms.ContentPart, + opts *llms.CallOptions, +) (*llms.ContentResponse, error) { convertedParts, err := convertParts(parts) if err != nil { return nil, err @@ -252,7 +261,12 @@ func generateFromSingleMessage(ctx context.Context, model *genai.GenerativeModel return convertAndStreamFromIterator(ctx, iter, opts) } -func generateFromMessages(ctx context.Context, model *genai.GenerativeModel, messages []llms.MessageContent, opts *llms.CallOptions) (*llms.ContentResponse, error) { +func generateFromMessages( + ctx context.Context, + model *genai.GenerativeModel, + messages []llms.MessageContent, + opts *llms.CallOptions, +) (*llms.ContentResponse, error) { history := make([]*genai.Content, 0, len(messages)) for _, mc := range messages { content, err := convertContent(mc) @@ -295,7 +309,11 @@ func generateFromMessages(ctx context.Context, model *genai.GenerativeModel, mes // resulting text into the opts-provided streaming function. // Note that this is tricky in the face of multiple // candidates, so this code assumes only a single candidate for now. -func convertAndStreamFromIterator(ctx context.Context, iter *genai.GenerateContentResponseIterator, opts *llms.CallOptions) (*llms.ContentResponse, error) { +func convertAndStreamFromIterator( + ctx context.Context, + iter *genai.GenerateContentResponseIterator, + opts *llms.CallOptions, +) (*llms.ContentResponse, error) { candidate := &genai.Candidate{ Content: &genai.Content{}, } @@ -398,7 +416,15 @@ func convertTools(tools []llms.Tool) ([]*genai.Tool, error) { } if required, ok := params["required"]; ok { - rs := required.([]string) + ri := required.([]interface{}) + rs := make([]string, 0, len(ri)) + for _, r := range ri { + rString, ok := r.(string) + if !ok { + return nil, fmt.Errorf("tool [%d]: expected string for required", i) + } + rs = append(rs, rString) + } schema.Required = rs } genaiFuncDecl.Parameters = schema diff --git a/llms/googleai/vertex/vertex.go b/llms/googleai/vertex/vertex.go index 59fdaa44b..5260b8250 100644 --- a/llms/googleai/vertex/vertex.go +++ b/llms/googleai/vertex/vertex.go @@ -39,7 +39,11 @@ func (g *Vertex) Call(ctx context.Context, prompt string, options ...llms.CallOp } // GenerateContent implements the [llms.Model] interface. -func (g *Vertex) GenerateContent(ctx context.Context, messages []llms.MessageContent, options ...llms.CallOption) (*llms.ContentResponse, error) { +func (g *Vertex) GenerateContent( + ctx context.Context, + messages []llms.MessageContent, + options ...llms.CallOption, +) (*llms.ContentResponse, error) { if g.CallbacksHandler != nil { g.CallbacksHandler.HandleLLMGenerateContentStart(ctx, messages) } @@ -231,7 +235,12 @@ func convertContent(content llms.MessageContent) (*genai.Content, error) { // generateFromSingleMessage generates content from the parts of a single // message. -func generateFromSingleMessage(ctx context.Context, model *genai.GenerativeModel, parts []llms.ContentPart, opts *llms.CallOptions) (*llms.ContentResponse, error) { +func generateFromSingleMessage( + ctx context.Context, + model *genai.GenerativeModel, + parts []llms.ContentPart, + opts *llms.CallOptions, +) (*llms.ContentResponse, error) { convertedParts, err := convertParts(parts) if err != nil { return nil, err @@ -254,7 +263,12 @@ func generateFromSingleMessage(ctx context.Context, model *genai.GenerativeModel return convertAndStreamFromIterator(ctx, iter, opts) } -func generateFromMessages(ctx context.Context, model *genai.GenerativeModel, messages []llms.MessageContent, opts *llms.CallOptions) (*llms.ContentResponse, error) { +func generateFromMessages( + ctx context.Context, + model *genai.GenerativeModel, + messages []llms.MessageContent, + opts *llms.CallOptions, +) (*llms.ContentResponse, error) { history := make([]*genai.Content, 0, len(messages)) for _, mc := range messages { content, err := convertContent(mc) @@ -293,7 +307,11 @@ func generateFromMessages(ctx context.Context, model *genai.GenerativeModel, mes // resulting text into the opts-provided streaming function. // Note that this is tricky in the face of multiple // candidates, so this code assumes only a single candidate for now. -func convertAndStreamFromIterator(ctx context.Context, iter *genai.GenerateContentResponseIterator, opts *llms.CallOptions) (*llms.ContentResponse, error) { +func convertAndStreamFromIterator( + ctx context.Context, + iter *genai.GenerateContentResponseIterator, + opts *llms.CallOptions, +) (*llms.ContentResponse, error) { candidate := &genai.Candidate{ Content: &genai.Content{}, } @@ -395,7 +413,15 @@ func convertTools(tools []llms.Tool) ([]*genai.Tool, error) { } if required, ok := params["required"]; ok { - rs := required.([]string) + ri := required.([]interface{}) + rs := make([]string, 0, len(ri)) + for _, r := range ri { + rString, ok := r.(string) + if !ok { + return nil, fmt.Errorf("tool [%d]: expected string for required", i) + } + rs = append(rs, rString) + } schema.Required = rs } genaiFuncDecl.Parameters = schema