From 2a15dfccead9b1402258060326ff2972eebea8d9 Mon Sep 17 00:00:00 2001 From: Yan <1964649083@qq.com> Date: Sun, 29 Dec 2024 10:11:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Gemini=20=E5=85=B6=E4=BB=96=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=B1=BB=E5=9E=8B=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=88?= =?UTF-8?q?Base64URL=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relay/channel/gemini/relay-gemini.go | 4 ++-- service/image.go | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) 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)