diff --git a/dto/gemini.go b/dto/gemini.go index 4d738c22a..7c5969efd 100644 --- a/dto/gemini.go +++ b/dto/gemini.go @@ -126,7 +126,7 @@ func (r *GeminiChatRequest) SetModelName(modelName string) { func (r *GeminiChatRequest) GetTools() []GeminiChatTool { var tools []GeminiChatTool - if strings.HasSuffix(string(r.Tools), "[") { + if strings.HasPrefix(string(r.Tools), "[") { // is array if err := common.Unmarshal(r.Tools, &tools); err != nil { logger.LogError(nil, "error_unmarshalling_tools: "+err.Error()) diff --git a/service/convert.go b/service/convert.go index 7228db9a9..f357f6842 100644 --- a/service/convert.go +++ b/service/convert.go @@ -674,20 +674,21 @@ func GeminiToOpenAIRequest(geminiRequest *dto.GeminiChatRequest, info *relaycomm var tools []dto.ToolCallRequest for _, tool := range geminiRequest.GetTools() { if tool.FunctionDeclarations != nil { - // 将 Gemini 的 FunctionDeclarations 转换为 OpenAI 的 ToolCallRequest - functionDeclarations, ok := tool.FunctionDeclarations.([]dto.FunctionRequest) - if ok { - for _, function := range functionDeclarations { - openAITool := dto.ToolCallRequest{ - Type: "function", - Function: dto.FunctionRequest{ - Name: function.Name, - Description: function.Description, - Parameters: function.Parameters, - }, - } - tools = append(tools, openAITool) + functionDeclarations, err := common.Any2Type[[]dto.FunctionRequest](tool.FunctionDeclarations) + if err != nil { + common.SysError(fmt.Sprintf("failed to parse gemini function declarations: %v (type=%T)", err, tool.FunctionDeclarations)) + continue + } + for _, function := range functionDeclarations { + openAITool := dto.ToolCallRequest{ + Type: "function", + Function: dto.FunctionRequest{ + Name: function.Name, + Description: function.Description, + Parameters: function.Parameters, + }, } + tools = append(tools, openAITool) } } }