mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-09-11 14:41:21 +00:00
fix(ali): 修复阿里图片模型映射后仍使用原始模型名判断协议的问题 (#6772)
* feat(ali): support Qwen Image 3 requests * refactor(ali): narrow Qwen Image 3 support * fix(ali): focus image model mapping fix
This commit is contained in:
@@ -110,15 +110,15 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) {
|
|||||||
case constant.RelayModeResponses:
|
case constant.RelayModeResponses:
|
||||||
fullRequestURL = fmt.Sprintf("%s/api/v2/apps/protocols/compatible-mode/v1/responses", info.ChannelBaseUrl)
|
fullRequestURL = fmt.Sprintf("%s/api/v2/apps/protocols/compatible-mode/v1/responses", info.ChannelBaseUrl)
|
||||||
case constant.RelayModeImagesGenerations:
|
case constant.RelayModeImagesGenerations:
|
||||||
if isSyncImageModel(info.OriginModelName) {
|
if isSyncImageModel(info.UpstreamModelName) {
|
||||||
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/multimodal-generation/generation", info.ChannelBaseUrl)
|
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/multimodal-generation/generation", info.ChannelBaseUrl)
|
||||||
} else {
|
} else {
|
||||||
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/text2image/image-synthesis", info.ChannelBaseUrl)
|
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/text2image/image-synthesis", info.ChannelBaseUrl)
|
||||||
}
|
}
|
||||||
case constant.RelayModeImagesEdits:
|
case constant.RelayModeImagesEdits:
|
||||||
if isOldWanModel(info.OriginModelName) {
|
if isOldWanModel(info.UpstreamModelName) {
|
||||||
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/image2image/image-synthesis", info.ChannelBaseUrl)
|
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/image2image/image-synthesis", info.ChannelBaseUrl)
|
||||||
} else if isWanModel(info.OriginModelName) {
|
} else if isWanModel(info.UpstreamModelName) {
|
||||||
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/image-generation/generation", info.ChannelBaseUrl)
|
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/image-generation/generation", info.ChannelBaseUrl)
|
||||||
} else {
|
} else {
|
||||||
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/multimodal-generation/generation", info.ChannelBaseUrl)
|
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/multimodal-generation/generation", info.ChannelBaseUrl)
|
||||||
@@ -143,14 +143,14 @@ func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Header, info *rel
|
|||||||
req.Set("X-DashScope-Plugin", c.GetString("plugin"))
|
req.Set("X-DashScope-Plugin", c.GetString("plugin"))
|
||||||
}
|
}
|
||||||
if info.RelayMode == constant.RelayModeImagesGenerations {
|
if info.RelayMode == constant.RelayModeImagesGenerations {
|
||||||
if isSyncImageModel(info.OriginModelName) {
|
if isSyncImageModel(info.UpstreamModelName) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
req.Set("X-DashScope-Async", "enable")
|
req.Set("X-DashScope-Async", "enable")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if info.RelayMode == constant.RelayModeImagesEdits {
|
if info.RelayMode == constant.RelayModeImagesEdits {
|
||||||
if isWanModel(info.OriginModelName) {
|
if isWanModel(info.UpstreamModelName) {
|
||||||
req.Set("X-DashScope-Async", "enable")
|
req.Set("X-DashScope-Async", "enable")
|
||||||
}
|
}
|
||||||
req.Set("Content-Type", "application/json")
|
req.Set("Content-Type", "application/json")
|
||||||
@@ -183,7 +183,7 @@ func (a *Adaptor) ConvertOpenAIRequest(c *gin.Context, info *relaycommon.RelayIn
|
|||||||
|
|
||||||
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 info.RelayMode == constant.RelayModeImagesGenerations {
|
if info.RelayMode == constant.RelayModeImagesGenerations {
|
||||||
if isSyncImageModel(info.OriginModelName) {
|
if isSyncImageModel(info.UpstreamModelName) {
|
||||||
a.IsSyncImageModel = true
|
a.IsSyncImageModel = true
|
||||||
}
|
}
|
||||||
aliRequest, err := oaiImage2AliImageRequest(info, request, a.IsSyncImageModel)
|
aliRequest, err := oaiImage2AliImageRequest(info, request, a.IsSyncImageModel)
|
||||||
@@ -192,11 +192,11 @@ func (a *Adaptor) ConvertImageRequest(c *gin.Context, info *relaycommon.RelayInf
|
|||||||
}
|
}
|
||||||
return aliRequest, nil
|
return aliRequest, nil
|
||||||
} else if info.RelayMode == constant.RelayModeImagesEdits {
|
} else if info.RelayMode == constant.RelayModeImagesEdits {
|
||||||
if isOldWanModel(info.OriginModelName) {
|
if isOldWanModel(info.UpstreamModelName) {
|
||||||
return oaiFormEdit2WanxImageEdit(c, info, request)
|
return oaiFormEdit2WanxImageEdit(c, info, request)
|
||||||
}
|
}
|
||||||
if isSyncImageModel(info.OriginModelName) {
|
if isSyncImageModel(info.UpstreamModelName) {
|
||||||
if isWanModel(info.OriginModelName) {
|
if isWanModel(info.UpstreamModelName) {
|
||||||
a.IsSyncImageModel = false
|
a.IsSyncImageModel = false
|
||||||
} else {
|
} else {
|
||||||
a.IsSyncImageModel = true
|
a.IsSyncImageModel = true
|
||||||
|
|||||||
@@ -2,11 +2,13 @@ package ali
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/QuantumNous/new-api/common"
|
"github.com/QuantumNous/new-api/common"
|
||||||
relaycommon "github.com/QuantumNous/new-api/relay/common"
|
relaycommon "github.com/QuantumNous/new-api/relay/common"
|
||||||
|
"github.com/QuantumNous/new-api/relay/constant"
|
||||||
relayhelper "github.com/QuantumNous/new-api/relay/helper"
|
relayhelper "github.com/QuantumNous/new-api/relay/helper"
|
||||||
"github.com/QuantumNous/new-api/relaykit/dto"
|
"github.com/QuantumNous/new-api/relaykit/dto"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@@ -126,3 +128,34 @@ func TestConvertOpenAIRequestPreservesExplicitZeroForMappedQwenModel(t *testing.
|
|||||||
assert.True(t, value.Exists())
|
assert.True(t, value.Exists())
|
||||||
assert.Equal(t, int64(0), value.Int())
|
assert.Equal(t, int64(0), value.Int())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMappedAliImageModelUsesUpstreamProtocol(t *testing.T) {
|
||||||
|
c, _ := gin.CreateTestContext(httptest.NewRecorder())
|
||||||
|
c.Request = httptest.NewRequest(http.MethodPost, "/v1/images/generations", nil)
|
||||||
|
|
||||||
|
info := &relaycommon.RelayInfo{
|
||||||
|
RelayMode: constant.RelayModeImagesGenerations,
|
||||||
|
OriginModelName: "customer-image-model",
|
||||||
|
ChannelMeta: &relaycommon.ChannelMeta{
|
||||||
|
ChannelBaseUrl: "https://dashscope.aliyuncs.com",
|
||||||
|
UpstreamModelName: "qwen-image-3.0-pro",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
adaptor := &Adaptor{}
|
||||||
|
url, err := adaptor.GetRequestURL(info)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, "https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation", url)
|
||||||
|
|
||||||
|
header := http.Header{}
|
||||||
|
require.NoError(t, adaptor.SetupRequestHeader(c, &header, info))
|
||||||
|
assert.Empty(t, header.Get("X-DashScope-Async"))
|
||||||
|
|
||||||
|
converted, err := adaptor.ConvertImageRequest(c, info, dto.ImageRequest{
|
||||||
|
Model: info.UpstreamModelName,
|
||||||
|
Prompt: "poster",
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.True(t, adaptor.IsSyncImageModel)
|
||||||
|
assert.IsType(t, &AliImageRequest{}, converted)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user