@@ -17,7 +17,7 @@ import (
)
// 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 {
Contents : make ( [ ] GeminiChatContent , 0 , len ( textRequest . Messages ) ) ,
SafetySettings : [ ] GeminiChatSafetySettings {
@@ -108,9 +108,10 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) *GeminiChatReques
} )
} else if part . Type == dto . ContentTypeImageURL {
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
if strings . HasPrefix ( part . ImageUrl . ( dto . MessageImageUrl ) . Url , "http" ) {
// 是url, 获取图片的类型和base64编码的数据
@@ -124,7 +125,7 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) *GeminiChatReques
} else {
_ , format , base64String , err := service . DecodeBase64ImageData ( part . ImageUrl . ( dto . MessageImageUrl ) . Url )
if err != nil {
continue
return nil , fmt . Errorf ( "decode base64 image data failed: %s" , err . Error ( ) )
}
parts = append ( parts , GeminiPart {
InlineData : & GeminiInlineData {
@@ -161,7 +162,7 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) *GeminiChatReques
// shouldAddDummyModelMessage = false
//}
}
return & geminiRequest
return & geminiRequest , nil
}
func ( g * GeminiChatResponse ) GetResponseText ( ) string {
@@ -236,13 +237,17 @@ func streamResponseGeminiChat2OpenAI(geminiResponse *GeminiChatResponse) *dto.Ch
var choice dto . ChatCompletionsStreamResponseChoice
//choice.Delta.SetContentString(geminiResponse.GetResponseText())
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
choice . Delta . ToolCalls = getToolCalls ( & geminiResponse . Candidates [ 0 ] )
} else {
// 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