diff --git a/dto/openai_response.go b/dto/openai_response.go index 3a4c971b..38072673 100644 --- a/dto/openai_response.go +++ b/dto/openai_response.go @@ -107,7 +107,7 @@ type FunctionCall struct { Name string `json:"name,omitempty"` // call function with arguments in JSON format Parameters any `json:"parameters,omitempty"` // request - Arguments string `json:"arguments,omitempty"` + Arguments string `json:"arguments"` } type ChatCompletionsStreamResponse struct { diff --git a/relay/channel/gemini/relay-gemini.go b/relay/channel/gemini/relay-gemini.go index 5db01c20..6f4cd10b 100644 --- a/relay/channel/gemini/relay-gemini.go +++ b/relay/channel/gemini/relay-gemini.go @@ -368,7 +368,7 @@ func responseGeminiChat2OpenAI(response *GeminiChatResponse) *dto.OpenAITextResp Choices: make([]dto.OpenAITextResponseChoice, 0, len(response.Candidates)), } content, _ := json.Marshal("") - is_tool_call := false + isToolCall := false for _, candidate := range response.Candidates { choice := dto.OpenAITextResponseChoice{ Index: int(candidate.Index), @@ -380,12 +380,12 @@ func responseGeminiChat2OpenAI(response *GeminiChatResponse) *dto.OpenAITextResp } if len(candidate.Content.Parts) > 0 { var texts []string - var tool_calls []dto.ToolCall + var toolCalls []dto.ToolCall for _, part := range candidate.Content.Parts { if part.FunctionCall != nil { choice.FinishReason = constant.FinishReasonToolCalls if call := getToolCall(&part); call != nil { - tool_calls = append(tool_calls, *call) + toolCalls = append(toolCalls, *call) } } else { if part.ExecutableCode != nil { @@ -400,9 +400,9 @@ func responseGeminiChat2OpenAI(response *GeminiChatResponse) *dto.OpenAITextResp } } } - if len(tool_calls) > 0 { - choice.Message.SetToolCalls(tool_calls) - is_tool_call = true + if len(toolCalls) > 0 { + choice.Message.SetToolCalls(toolCalls) + isToolCall = true } choice.Message.SetStringContent(strings.Join(texts, "\n")) @@ -418,7 +418,7 @@ func responseGeminiChat2OpenAI(response *GeminiChatResponse) *dto.OpenAITextResp choice.FinishReason = constant.FinishReasonContentFilter } } - if is_tool_call { + if isToolCall { choice.FinishReason = constant.FinishReasonToolCalls } diff --git a/relay/constant/api_type.go b/relay/constant/api_type.go index f7a87536..8ccfee03 100644 --- a/relay/constant/api_type.go +++ b/relay/constant/api_type.go @@ -30,6 +30,7 @@ const ( APITypeMokaAI APITypeVolcEngine APITypeBaiduV2 + APITypeOpenRouter APITypeDummy // this one is only for count, do not add any channel after this ) @@ -86,6 +87,8 @@ func ChannelType2APIType(channelType int) (int, bool) { apiType = APITypeVolcEngine case common.ChannelTypeBaiduV2: apiType = APITypeBaiduV2 + case common.ChannelTypeOpenRouter: + apiType = APITypeOpenRouter } if apiType == -1 { return APITypeOpenAI, false diff --git a/relay/relay_adaptor.go b/relay/relay_adaptor.go index c9111106..00cff316 100644 --- a/relay/relay_adaptor.go +++ b/relay/relay_adaptor.go @@ -18,6 +18,7 @@ import ( "one-api/relay/channel/mokaai" "one-api/relay/channel/ollama" "one-api/relay/channel/openai" + "one-api/relay/channel/openrouter" "one-api/relay/channel/palm" "one-api/relay/channel/perplexity" "one-api/relay/channel/siliconflow" @@ -83,6 +84,8 @@ func GetAdaptor(apiType int) channel.Adaptor { return &volcengine.Adaptor{} case constant.APITypeBaiduV2: return &baidu_v2.Adaptor{} + case constant.APITypeOpenRouter: + return &openrouter.Adaptor{} } return nil }