diff --git a/relay/channel/gemini/relay-gemini.go b/relay/channel/gemini/relay-gemini.go index 89f3e202..8068709e 100644 --- a/relay/channel/gemini/relay-gemini.go +++ b/relay/channel/gemini/relay-gemini.go @@ -204,13 +204,13 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) (*GeminiChatReque }, }) } else { - _, format, base64String, err := service.DecodeBase64ImageData(part.ImageUrl.(dto.MessageImageUrl).Url) + format, base64String, err := service.DecodeBase64FileData(part.ImageUrl.(dto.MessageImageUrl).Url) if err != nil { return nil, fmt.Errorf("decode base64 image data failed: %s", err.Error()) } parts = append(parts, GeminiPart{ InlineData: &GeminiInlineData{ - MimeType: "image/" + format, + MimeType: format, Data: base64String, }, }) diff --git a/service/image.go b/service/image.go index 61f5364f..77a0cc7a 100644 --- a/service/image.go +++ b/service/image.go @@ -5,11 +5,12 @@ import ( "encoding/base64" "errors" "fmt" - "golang.org/x/image/webp" "image" "io" "one-api/common" "strings" + + "golang.org/x/image/webp" ) func DecodeBase64ImageData(base64String string) (image.Config, string, string, error) { @@ -31,6 +32,31 @@ func DecodeBase64ImageData(base64String string) (image.Config, string, string, e return config, format, base64String, err } +func DecodeBase64FileData(base64String string) (string, string, error) { + var mimeType string + var idx int + idx = strings.Index(base64String, ",") + if idx == -1 { + _, file_type, base64, err := DecodeBase64ImageData(base64String) + return "image/" + file_type, base64, err + } + mimeType = base64String[:idx] + base64String = base64String[idx+1:] + idx = strings.Index(mimeType, ";") + if idx == -1 { + _, file_type, base64, err := DecodeBase64ImageData(base64String) + return "image/" + file_type, base64, err + } + mimeType = mimeType[:idx] + idx = strings.Index(mimeType, ":") + if idx == -1 { + _, file_type, base64, err := DecodeBase64ImageData(base64String) + return "image/" + file_type, base64, err + } + mimeType = mimeType[idx+1:] + return mimeType, base64String, nil +} + // GetImageFromUrl 获取图片的类型和base64编码的数据 func GetImageFromUrl(url string) (mimeType string, data string, err error) { resp, err := DoDownloadRequest(url)