79 lines
2.1 KiB
Go
Raw Normal View History

2024-11-05 17:11:33 +08:00
package mistral
import (
"one-api/common"
2024-11-05 17:11:33 +08:00
"one-api/dto"
"regexp"
2024-11-05 17:11:33 +08:00
)
var mistralToolCallIdRegexp = regexp.MustCompile("^[a-zA-Z0-9]{9}$")
2025-02-22 16:29:48 +08:00
func requestOpenAI2Mistral(request *dto.GeneralOpenAIRequest) *dto.GeneralOpenAIRequest {
2024-11-05 17:11:33 +08:00
messages := make([]dto.Message, 0, len(request.Messages))
idMap := make(map[string]string)
2024-11-05 17:11:33 +08:00
for _, message := range request.Messages {
// 1. tool_calls.id
toolCalls := message.ParseToolCalls()
if toolCalls != nil {
for i := range toolCalls {
if !mistralToolCallIdRegexp.MatchString(toolCalls[i].ID) {
if newId, ok := idMap[toolCalls[i].ID]; ok {
toolCalls[i].ID = newId
} else {
newId, err := common.GenerateRandomCharsKey(9)
if err == nil {
idMap[toolCalls[i].ID] = newId
toolCalls[i].ID = newId
}
}
}
}
message.SetToolCalls(toolCalls)
}
// 2. tool_call_id
if message.ToolCallId != "" {
if newId, ok := idMap[message.ToolCallId]; ok {
message.ToolCallId = newId
} else {
if !mistralToolCallIdRegexp.MatchString(message.ToolCallId) {
newId, err := common.GenerateRandomCharsKey(9)
if err == nil {
idMap[message.ToolCallId] = newId
message.ToolCallId = newId
}
}
}
}
2025-02-22 16:29:48 +08:00
mediaMessages := message.ParseContent()
if message.Role == "assistant" && message.ToolCalls != nil && message.Content == "" {
mediaMessages = []dto.MediaContent{}
}
2025-02-22 16:29:48 +08:00
for j, mediaMessage := range mediaMessages {
if mediaMessage.Type == dto.ContentTypeImageURL {
imageUrl := mediaMessage.GetImageMedia()
2025-02-22 16:29:48 +08:00
mediaMessage.ImageUrl = imageUrl.Url
mediaMessages[j] = mediaMessage
2024-11-05 17:11:33 +08:00
}
}
2025-02-22 16:29:48 +08:00
message.SetMediaContent(mediaMessages)
2024-11-05 17:11:33 +08:00
messages = append(messages, dto.Message{
Role: message.Role,
Content: message.Content,
ToolCalls: message.ToolCalls,
ToolCallId: message.ToolCallId,
})
}
return &dto.GeneralOpenAIRequest{
Model: request.Model,
Stream: request.Stream,
Messages: messages,
Temperature: request.Temperature,
TopP: request.TopP,
MaxTokens: request.MaxTokens,
Tools: request.Tools,
ToolChoice: request.ToolChoice,
}
}