diff --git a/dto/openai_image.go b/dto/openai_image.go index 52986fbf..fdef12b1 100644 --- a/dto/openai_image.go +++ b/dto/openai_image.go @@ -27,7 +27,10 @@ type ImageRequest struct { OutputCompression json.RawMessage `json:"output_compression,omitempty"` PartialImages json.RawMessage `json:"partial_images,omitempty"` // Stream bool `json:"stream,omitempty"` - Watermark *bool `json:"watermark,omitempty"` + Images json.RawMessage `json:"images,omitempty"` + Mask json.RawMessage `json:"mask,omitempty"` + InputFidelity json.RawMessage `json:"input_fidelity,omitempty"` + Watermark *bool `json:"watermark,omitempty"` // zhipu 4v WatermarkEnabled json.RawMessage `json:"watermark_enabled,omitempty"` UserId json.RawMessage `json:"user_id,omitempty"` diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index 3fd8d76a..6941ca54 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -426,6 +426,9 @@ func (a *Adaptor) ConvertAudioRequest(c *gin.Context, info *relaycommon.RelayInf func (a *Adaptor) ConvertImageRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.ImageRequest) (any, error) { switch info.RelayMode { case relayconstant.RelayModeImagesEdits: + if isJSONRequest(c) { + return request, nil + } var requestBody bytes.Buffer writer := multipart.NewWriter(&requestBody) @@ -551,6 +554,13 @@ func (a *Adaptor) ConvertImageRequest(c *gin.Context, info *relaycommon.RelayInf } } +func isJSONRequest(c *gin.Context) bool { + if c == nil || c.Request == nil { + return false + } + return strings.HasPrefix(c.Request.Header.Get("Content-Type"), "application/json") +} + // detectImageMimeType determines the MIME type based on the file extension func detectImageMimeType(filename string) string { ext := strings.ToLower(filepath.Ext(filename)) @@ -593,7 +603,7 @@ func (a *Adaptor) ConvertOpenAIResponsesRequest(c *gin.Context, info *relaycommo func (a *Adaptor) DoRequest(c *gin.Context, info *relaycommon.RelayInfo, requestBody io.Reader) (any, error) { if info.RelayMode == relayconstant.RelayModeAudioTranscription || info.RelayMode == relayconstant.RelayModeAudioTranslation || - info.RelayMode == relayconstant.RelayModeImagesEdits { + (info.RelayMode == relayconstant.RelayModeImagesEdits && !isJSONRequest(c)) { return channel.DoFormRequest(a, c, info, requestBody) } else if info.RelayMode == relayconstant.RelayModeRealtime { return channel.DoWssRequest(a, c, info, requestBody) diff --git a/relay/helper/valid_request.go b/relay/helper/valid_request.go index c5477cce..2581b281 100644 --- a/relay/helper/valid_request.go +++ b/relay/helper/valid_request.go @@ -1,7 +1,6 @@ package helper import ( - "encoding/json" "errors" "fmt" "math" @@ -156,7 +155,7 @@ func GetAndValidOpenAIImageRequest(c *gin.Context, relayMode int) (*dto.ImageReq imageRequest.Quality = formData.Get("quality") imageRequest.Size = formData.Get("size") if imageValue := formData.Get("image"); imageValue != "" { - imageRequest.Image, _ = json.Marshal(imageValue) + imageRequest.Image, _ = common.Marshal(imageValue) } if imageRequest.Model == "gpt-image-1" {