Merge pull request #2338 from QuantumNous/revert-2321-pr/gemini-image-edit
Revert "Gemini Image系列支持图像编辑"
This commit is contained in:
@@ -27,8 +27,6 @@ import (
|
|||||||
func SetupApiRequestHeader(info *common.RelayInfo, c *gin.Context, req *http.Header) {
|
func SetupApiRequestHeader(info *common.RelayInfo, c *gin.Context, req *http.Header) {
|
||||||
if info.RelayMode == constant.RelayModeAudioTranscription || info.RelayMode == constant.RelayModeAudioTranslation {
|
if info.RelayMode == constant.RelayModeAudioTranscription || info.RelayMode == constant.RelayModeAudioTranslation {
|
||||||
// multipart/form-data
|
// multipart/form-data
|
||||||
} else if info.RelayMode == constant.RelayModeImagesEdits {
|
|
||||||
// multipart/form-data
|
|
||||||
} else if info.RelayMode == constant.RelayModeRealtime {
|
} else if info.RelayMode == constant.RelayModeRealtime {
|
||||||
// websocket
|
// websocket
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -130,29 +130,11 @@ func processSizeParameters(size, quality string) ImageConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *Adaptor) ConvertImageRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.ImageRequest) (any, error) {
|
func (a *Adaptor) ConvertImageRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.ImageRequest) (any, error) {
|
||||||
if model_setting.IsGeminiModelSupportImagine(info.UpstreamModelName) {
|
if strings.HasPrefix(info.UpstreamModelName, "gemini-3-pro-image") {
|
||||||
var content any
|
|
||||||
if base64Data, err := relaycommon.GetImageBase64sFromForm(c); err == nil {
|
|
||||||
content = []any{
|
|
||||||
dto.MediaContent{
|
|
||||||
Type: dto.ContentTypeText,
|
|
||||||
Text: request.Prompt,
|
|
||||||
},
|
|
||||||
dto.MediaContent{
|
|
||||||
Type: dto.ContentTypeFile,
|
|
||||||
File: &dto.MessageFile{
|
|
||||||
FileData: base64Data.String(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
content = request.Prompt
|
|
||||||
}
|
|
||||||
|
|
||||||
chatRequest := dto.GeneralOpenAIRequest{
|
chatRequest := dto.GeneralOpenAIRequest{
|
||||||
Model: request.Model,
|
Model: request.Model,
|
||||||
Messages: []dto.Message{
|
Messages: []dto.Message{
|
||||||
{Role: "user", Content: content},
|
{Role: "user", Content: request.Prompt},
|
||||||
},
|
},
|
||||||
N: int(request.N),
|
N: int(request.N),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ func ThinkingAdaptor(geminiRequest *dto.GeminiChatRequest, info *relaycommon.Rel
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 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 CovertOpenAI2Gemini(c *gin.Context, textRequest dto.GeneralOpenAIRequest, info *relaycommon.RelayInfo, base64Data ...*relaycommon.Base64Data) (*dto.GeminiChatRequest, error) {
|
func CovertOpenAI2Gemini(c *gin.Context, textRequest dto.GeneralOpenAIRequest, info *relaycommon.RelayInfo) (*dto.GeminiChatRequest, error) {
|
||||||
|
|
||||||
geminiRequest := dto.GeminiChatRequest{
|
geminiRequest := dto.GeminiChatRequest{
|
||||||
Contents: make([]dto.GeminiChatContent, 0, len(textRequest.Messages)),
|
Contents: make([]dto.GeminiChatContent, 0, len(textRequest.Messages)),
|
||||||
@@ -454,11 +454,10 @@ func CovertOpenAI2Gemini(c *gin.Context, textRequest dto.GeneralOpenAIRequest, i
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else if part.Type == dto.ContentTypeFile {
|
} else if part.Type == dto.ContentTypeFile {
|
||||||
file := part.GetFile()
|
if part.GetFile().FileId != "" {
|
||||||
if file.FileId != "" {
|
|
||||||
return nil, fmt.Errorf("only base64 file is supported in gemini")
|
return nil, fmt.Errorf("only base64 file is supported in gemini")
|
||||||
}
|
}
|
||||||
format, base64String, err := service.DecodeBase64FileData(file.FileData)
|
format, base64String, err := service.DecodeBase64FileData(part.GetFile().FileData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("decode base64 file data failed: %s", err.Error())
|
return nil, fmt.Errorf("decode base64 file data failed: %s", err.Error())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -229,54 +226,3 @@ func ValidateBasicTaskRequest(c *gin.Context, info *RelayInfo, action string) *d
|
|||||||
storeTaskRequest(c, info, action, req)
|
storeTaskRequest(c, info, action, req)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func GetImagesBase64sFromForm(c *gin.Context) ([]*Base64Data, error) {
|
|
||||||
return GetBase64sFromForm(c, "image")
|
|
||||||
}
|
|
||||||
func GetImageBase64sFromForm(c *gin.Context) (*Base64Data, error) {
|
|
||||||
base64s, err := GetImagesBase64sFromForm(c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return base64s[0], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Base64Data struct {
|
|
||||||
MimeType string
|
|
||||||
Data string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Base64Data) String() string {
|
|
||||||
return fmt.Sprintf("data:%s;base64,%s", m.MimeType, m.Data)
|
|
||||||
}
|
|
||||||
func GetBase64sFromForm(c *gin.Context, fieldName string) ([]*Base64Data, error) {
|
|
||||||
mf := c.Request.MultipartForm
|
|
||||||
if mf == nil {
|
|
||||||
if _, err := c.MultipartForm(); err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to parse image edit form request: %w", err)
|
|
||||||
}
|
|
||||||
mf = c.Request.MultipartForm
|
|
||||||
}
|
|
||||||
imageFiles, exists := mf.File[fieldName]
|
|
||||||
if !exists || len(imageFiles) == 0 {
|
|
||||||
return nil, errors.New("field " + fieldName + " is not found or empty")
|
|
||||||
}
|
|
||||||
var imageBase64s []*Base64Data
|
|
||||||
for _, file := range imageFiles {
|
|
||||||
image, err := file.Open()
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("failed to open image file")
|
|
||||||
}
|
|
||||||
defer image.Close()
|
|
||||||
imageData, err := io.ReadAll(image)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("failed to read image file")
|
|
||||||
}
|
|
||||||
mimeType := http.DetectContentType(imageData)
|
|
||||||
base64Data := base64.StdEncoding.EncodeToString(imageData)
|
|
||||||
imageBase64s = append(imageBase64s, &Base64Data{
|
|
||||||
MimeType: mimeType,
|
|
||||||
Data: base64Data,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return imageBase64s, nil
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -141,7 +141,6 @@ func GetAndValidOpenAIImageRequest(c *gin.Context, relayMode int) (*dto.ImageReq
|
|||||||
imageRequest.N = uint(common.String2Int(formData.Get("n")))
|
imageRequest.N = uint(common.String2Int(formData.Get("n")))
|
||||||
imageRequest.Quality = formData.Get("quality")
|
imageRequest.Quality = formData.Get("quality")
|
||||||
imageRequest.Size = formData.Get("size")
|
imageRequest.Size = formData.Get("size")
|
||||||
imageRequest.ResponseFormat = formData.Get("response_format")
|
|
||||||
if imageValue := formData.Get("image"); imageValue != "" {
|
if imageValue := formData.Get("image"); imageValue != "" {
|
||||||
imageRequest.Image, _ = json.Marshal(imageValue)
|
imageRequest.Image, _ = json.Marshal(imageValue)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user