|
@@ -17,7 +17,7 @@ import (
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
// Setting safety to the lowest possible values since Gemini is already powerless enough
|
|
// Setting safety to the lowest possible values since Gemini is already powerless enough
|
|
|
-func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) *GeminiChatRequest {
|
|
|
|
|
|
|
+func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) (*GeminiChatRequest, error) {
|
|
|
geminiRequest := GeminiChatRequest{
|
|
geminiRequest := GeminiChatRequest{
|
|
|
Contents: make([]GeminiChatContent, 0, len(textRequest.Messages)),
|
|
Contents: make([]GeminiChatContent, 0, len(textRequest.Messages)),
|
|
|
SafetySettings: []GeminiChatSafetySettings{
|
|
SafetySettings: []GeminiChatSafetySettings{
|
|
@@ -108,9 +108,10 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) *GeminiChatReques
|
|
|
})
|
|
})
|
|
|
} else if part.Type == dto.ContentTypeImageURL {
|
|
} else if part.Type == dto.ContentTypeImageURL {
|
|
|
imageNum += 1
|
|
imageNum += 1
|
|
|
- //if imageNum > GeminiVisionMaxImageNum {
|
|
|
|
|
- // continue
|
|
|
|
|
- //}
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if constant.GeminiVisionMaxImageNum != -1 && imageNum > constant.GeminiVisionMaxImageNum {
|
|
|
|
|
+ return nil, fmt.Errorf("too many images in the message, max allowed is %d", constant.GeminiVisionMaxImageNum)
|
|
|
|
|
+ }
|
|
|
// 判断是否是url
|
|
// 判断是否是url
|
|
|
if strings.HasPrefix(part.ImageUrl.(dto.MessageImageUrl).Url, "http") {
|
|
if strings.HasPrefix(part.ImageUrl.(dto.MessageImageUrl).Url, "http") {
|
|
|
// 是url,获取图片的类型和base64编码的数据
|
|
// 是url,获取图片的类型和base64编码的数据
|
|
@@ -124,7 +125,7 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) *GeminiChatReques
|
|
|
} else {
|
|
} else {
|
|
|
_, format, base64String, err := service.DecodeBase64ImageData(part.ImageUrl.(dto.MessageImageUrl).Url)
|
|
_, format, base64String, err := service.DecodeBase64ImageData(part.ImageUrl.(dto.MessageImageUrl).Url)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
- continue
|
|
|
|
|
|
|
+ return nil, fmt.Errorf("decode base64 image data failed: %s", err.Error())
|
|
|
}
|
|
}
|
|
|
parts = append(parts, GeminiPart{
|
|
parts = append(parts, GeminiPart{
|
|
|
InlineData: &GeminiInlineData{
|
|
InlineData: &GeminiInlineData{
|
|
@@ -161,7 +162,7 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) *GeminiChatReques
|
|
|
// shouldAddDummyModelMessage = false
|
|
// shouldAddDummyModelMessage = false
|
|
|
//}
|
|
//}
|
|
|
}
|
|
}
|
|
|
- return &geminiRequest
|
|
|
|
|
|
|
+ return &geminiRequest, nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (g *GeminiChatResponse) GetResponseText() string {
|
|
func (g *GeminiChatResponse) GetResponseText() string {
|
|
@@ -236,13 +237,17 @@ func streamResponseGeminiChat2OpenAI(geminiResponse *GeminiChatResponse) *dto.Ch
|
|
|
var choice dto.ChatCompletionsStreamResponseChoice
|
|
var choice dto.ChatCompletionsStreamResponseChoice
|
|
|
//choice.Delta.SetContentString(geminiResponse.GetResponseText())
|
|
//choice.Delta.SetContentString(geminiResponse.GetResponseText())
|
|
|
if len(geminiResponse.Candidates) > 0 && len(geminiResponse.Candidates[0].Content.Parts) > 0 {
|
|
if len(geminiResponse.Candidates) > 0 && len(geminiResponse.Candidates[0].Content.Parts) > 0 {
|
|
|
- respFirst := geminiResponse.Candidates[0].Content.Parts[0]
|
|
|
|
|
- if respFirst.FunctionCall != nil {
|
|
|
|
|
|
|
+ respFirstParts := geminiResponse.Candidates[0].Content.Parts
|
|
|
|
|
+ if respFirstParts[0].FunctionCall != nil {
|
|
|
// function response
|
|
// function response
|
|
|
choice.Delta.ToolCalls = getToolCalls(&geminiResponse.Candidates[0])
|
|
choice.Delta.ToolCalls = getToolCalls(&geminiResponse.Candidates[0])
|
|
|
} else {
|
|
} else {
|
|
|
// text response
|
|
// text response
|
|
|
- choice.Delta.SetContentString(respFirst.Text)
|
|
|
|
|
|
|
+ var texts []string
|
|
|
|
|
+ for _, part := range respFirstParts {
|
|
|
|
|
+ texts = append(texts, part.Text)
|
|
|
|
|
+ }
|
|
|
|
|
+ choice.Delta.SetContentString(strings.Join(texts, "\n"))
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
var response dto.ChatCompletionsStreamResponse
|
|
var response dto.ChatCompletionsStreamResponse
|