🐛 fix: function call error (#190)

This commit is contained in:
MartialBE 2024-05-19 13:11:46 +08:00
parent 68e5cf1183
commit c04dfc735f
No known key found for this signature in database
GPG Key ID: 27C0267EC84B0A5C
6 changed files with 54 additions and 8 deletions

View File

@ -150,7 +150,7 @@ func convertFromChatOpenai(request *types.ChatCompletionRequest) *BaiduChatReque
if message.Role == types.ChatMessageRoleSystem {
baiduChatRequest.System = message.StringContent()
continue
} else if message.Role == types.ChatMessageRoleFunction || message.Role == types.ChatMessageRoleTool {
} else if message.ToolCalls != nil {
baiduChatRequest.Messages = append(baiduChatRequest.Messages, BaiduMessage{
Role: types.ChatMessageRoleAssistant,
FunctionCall: &types.ChatCompletionToolCallsFunction{
@ -158,6 +158,7 @@ func convertFromChatOpenai(request *types.ChatCompletionRequest) *BaiduChatReque
Arguments: "{}",
},
})
} else if message.Role == types.ChatMessageRoleFunction || message.Role == types.ChatMessageRoleTool {
baiduChatRequest.Messages = append(baiduChatRequest.Messages, BaiduMessage{
Role: types.ChatMessageRoleUser,
Content: "这是函数调用返回的内容,请回答之前的问题:\n" + message.StringContent(),

View File

@ -133,25 +133,34 @@ func (g *GeminiChatResponse) GetResponseText() string {
func OpenAIToGeminiChatContent(openaiContents []types.ChatCompletionMessage) ([]GeminiChatContent, *types.OpenAIErrorWithStatusCode) {
contents := make([]GeminiChatContent, 0)
useToolName := ""
for _, openaiContent := range openaiContents {
content := GeminiChatContent{
Role: ConvertRole(openaiContent.Role),
Parts: make([]GeminiPart, 0),
}
content.Role = ConvertRole(openaiContent.Role)
if openaiContent.ToolCalls != nil {
if openaiContent.ToolCalls != nil || openaiContent.FunctionCall != nil {
if openaiContent.ToolCalls != nil {
useToolName = openaiContent.ToolCalls[0].Function.Name
} else {
useToolName = openaiContent.FunctionCall.Name
}
content = GeminiChatContent{
Role: "model",
Parts: []GeminiPart{
{
FunctionCall: &GeminiFunctionCall{
Name: openaiContent.ToolCalls[0].Function.Name,
Name: useToolName,
Args: map[string]interface{}{},
},
},
},
}
} else if openaiContent.Role == types.ChatMessageRoleFunction || openaiContent.Role == types.ChatMessageRoleTool {
if openaiContent.Name == nil {
openaiContent.Name = &useToolName
}
content = GeminiChatContent{
Role: "function",
Parts: []GeminiPart{

View File

@ -145,7 +145,12 @@ func convertFromChatOpenai(request *types.ChatCompletionRequest) *MiniMaxChatReq
}
// 如果role为function 则需要在前面一条记录添加function_call如果没有消息则添加一个message
if message.Role == types.ChatMessageRoleFunction || message.Role == types.ChatMessageRoleTool {
if message.ToolCalls != nil {
miniMessage.FunctionCall = &types.ChatCompletionToolCallsFunction{
Name: message.ToolCalls[0].Function.Name,
Arguments: message.ToolCalls[0].Function.Arguments,
}
} else if message.Role == types.ChatMessageRoleFunction {
if len(messges) == 0 {
messges = append(messges, MiniMaxChatMessage{
SenderType: "USER",
@ -187,7 +192,6 @@ func convertFromChatOpenai(request *types.ChatCompletionRequest) *MiniMaxChatReq
miniRequest.Functions = append(miniRequest.Functions, &tool.Function)
}
}
return miniRequest
}

View File

@ -3,6 +3,7 @@ package xunfei
import (
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"one-api/common"
@ -75,7 +76,21 @@ func (p *XunfeiProvider) getChatRequest(request *types.ChatCompletionRequest) (*
func (p *XunfeiProvider) convertFromChatOpenai(request *types.ChatCompletionRequest) *XunfeiChatRequest {
messages := make([]XunfeiMessage, 0, len(request.Messages))
for _, message := range request.Messages {
if message.Role == types.ChatMessageRoleFunction || message.Role == types.ChatMessageRoleTool {
if message.FunctionCall != nil || message.ToolCalls != nil {
useToolName := ""
useToolArgs := ""
if message.ToolCalls != nil {
useToolName = message.ToolCalls[0].Function.Name
useToolArgs = message.ToolCalls[0].Function.Arguments
} else {
useToolName = message.FunctionCall.Name
useToolArgs = message.FunctionCall.Arguments
}
messages = append(messages, XunfeiMessage{
Role: message.Role,
Content: fmt.Sprintf("使用工具:%s参数%s", useToolName, useToolArgs),
})
} else if message.Role == types.ChatMessageRoleFunction || message.Role == types.ChatMessageRoleTool {
messages = append(messages, XunfeiMessage{
Role: types.ChatMessageRoleUser,
Content: "这是函数调用返回的内容,请回答之前的问题:\n" + message.StringContent(),

View File

@ -105,8 +105,11 @@ func (p *ZhipuProvider) convertToChatOpenai(response *ZhipuResponse, request *ty
}
func (p *ZhipuProvider) convertFromChatOpenai(request *types.ChatCompletionRequest) *ZhipuRequest {
for i := range request.Messages {
for i, _ := range request.Messages {
request.Messages[i].Role = convertRole(request.Messages[i].Role)
if request.Messages[i].FunctionCall != nil {
request.Messages[i].FuncToToolCalls()
}
}
zhipuRequest := &ZhipuRequest{
@ -167,7 +170,6 @@ func (p *ZhipuProvider) convertFromChatOpenai(request *types.ChatCompletionReque
}
p.pluginHandle(zhipuRequest)
return zhipuRequest
}

View File

@ -111,6 +111,21 @@ func (m ChatCompletionMessage) ParseContent() []ChatMessagePart {
return nil
}
func (m *ChatCompletionMessage) FuncToToolCalls() {
if m.ToolCalls != nil {
return
}
if m.FunctionCall != nil {
m.ToolCalls = []*ChatCompletionToolCalls{
{
Type: ChatMessageRoleFunction,
Function: m.FunctionCall,
},
}
m.FunctionCall = nil
}
}
type ChatMessageImageURL struct {
URL string `json:"url,omitempty"`
Detail string `json:"detail,omitempty"`