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

View File

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

View File

@ -145,7 +145,12 @@ func convertFromChatOpenai(request *types.ChatCompletionRequest) *MiniMaxChatReq
} }
// 如果role为function 则需要在前面一条记录添加function_call如果没有消息则添加一个message // 如果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 { if len(messges) == 0 {
messges = append(messges, MiniMaxChatMessage{ messges = append(messges, MiniMaxChatMessage{
SenderType: "USER", SenderType: "USER",
@ -187,7 +192,6 @@ func convertFromChatOpenai(request *types.ChatCompletionRequest) *MiniMaxChatReq
miniRequest.Functions = append(miniRequest.Functions, &tool.Function) miniRequest.Functions = append(miniRequest.Functions, &tool.Function)
} }
} }
return miniRequest return miniRequest
} }

View File

@ -3,6 +3,7 @@ package xunfei
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"io" "io"
"net/http" "net/http"
"one-api/common" "one-api/common"
@ -75,7 +76,21 @@ func (p *XunfeiProvider) getChatRequest(request *types.ChatCompletionRequest) (*
func (p *XunfeiProvider) convertFromChatOpenai(request *types.ChatCompletionRequest) *XunfeiChatRequest { func (p *XunfeiProvider) convertFromChatOpenai(request *types.ChatCompletionRequest) *XunfeiChatRequest {
messages := make([]XunfeiMessage, 0, len(request.Messages)) messages := make([]XunfeiMessage, 0, len(request.Messages))
for _, message := range 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{ messages = append(messages, XunfeiMessage{
Role: types.ChatMessageRoleUser, Role: types.ChatMessageRoleUser,
Content: "这是函数调用返回的内容,请回答之前的问题:\n" + message.StringContent(), 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 { 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) request.Messages[i].Role = convertRole(request.Messages[i].Role)
if request.Messages[i].FunctionCall != nil {
request.Messages[i].FuncToToolCalls()
}
} }
zhipuRequest := &ZhipuRequest{ zhipuRequest := &ZhipuRequest{
@ -167,7 +170,6 @@ func (p *ZhipuProvider) convertFromChatOpenai(request *types.ChatCompletionReque
} }
p.pluginHandle(zhipuRequest) p.pluginHandle(zhipuRequest)
return zhipuRequest return zhipuRequest
} }

View File

@ -111,6 +111,21 @@ func (m ChatCompletionMessage) ParseContent() []ChatMessagePart {
return nil 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 { type ChatMessageImageURL struct {
URL string `json:"url,omitempty"` URL string `json:"url,omitempty"`
Detail string `json:"detail,omitempty"` Detail string `json:"detail,omitempty"`