Просмотр исходного кода

fix: Gemini 其他文件类型的支持(Base64URL)

Yan 1 год назад
Родитель
Сommit
2a15dfccea
2 измененных файлов с 29 добавлено и 3 удалено
  1. 2 2
      relay/channel/gemini/relay-gemini.go
  2. 27 1
      service/image.go

+ 2 - 2
relay/channel/gemini/relay-gemini.go

@@ -204,13 +204,13 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest) (*GeminiChatReque
 						},
 						},
 					})
 					})
 				} else {
 				} else {
-					_, format, base64String, err := service.DecodeBase64ImageData(part.ImageUrl.(dto.MessageImageUrl).Url)
+					format, base64String, err := service.DecodeBase64FileData(part.ImageUrl.(dto.MessageImageUrl).Url)
 					if err != nil {
 					if err != nil {
 						return nil, fmt.Errorf("decode base64 image data failed: %s", err.Error())
 						return nil, fmt.Errorf("decode base64 image data failed: %s", err.Error())
 					}
 					}
 					parts = append(parts, GeminiPart{
 					parts = append(parts, GeminiPart{
 						InlineData: &GeminiInlineData{
 						InlineData: &GeminiInlineData{
-							MimeType: "image/" + format,
+							MimeType: format,
 							Data:     base64String,
 							Data:     base64String,
 						},
 						},
 					})
 					})

+ 27 - 1
service/image.go

@@ -5,11 +5,12 @@ import (
 	"encoding/base64"
 	"encoding/base64"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
-	"golang.org/x/image/webp"
 	"image"
 	"image"
 	"io"
 	"io"
 	"one-api/common"
 	"one-api/common"
 	"strings"
 	"strings"
+
+	"golang.org/x/image/webp"
 )
 )
 
 
 func DecodeBase64ImageData(base64String string) (image.Config, string, string, error) {
 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
 	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编码的数据
 // GetImageFromUrl 获取图片的类型和base64编码的数据
 func GetImageFromUrl(url string) (mimeType string, data string, err error) {
 func GetImageFromUrl(url string) (mimeType string, data string, err error) {
 	resp, err := DoDownloadRequest(url)
 	resp, err := DoDownloadRequest(url)