feat: 算力引擎 Go 后端核心(new-api)
- 统一 OpenAI 兼容 /v1 中继 + 渠道/额度/令牌/流水 - 各领域包:relay 模型网关、model 数据层、controller 管理 API
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
package ali
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/QuantumNous/new-api/common"
|
||||
relaycommon "github.com/QuantumNous/new-api/relay/common"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func testRelayInfo() *relaycommon.RelayInfo {
|
||||
return &relaycommon.RelayInfo{
|
||||
ChannelMeta: &relaycommon.ChannelMeta{},
|
||||
}
|
||||
}
|
||||
|
||||
func TestConvertToAliRequestWan27I2VBuildsMediaFromImage(t *testing.T) {
|
||||
adaptor := &TaskAdaptor{}
|
||||
req := relaycommon.TaskSubmitReq{
|
||||
Model: "wan2.7-i2v",
|
||||
Prompt: "animate the first frame",
|
||||
Image: "https://example.com/first.png",
|
||||
Size: "720p",
|
||||
Duration: 10,
|
||||
}
|
||||
|
||||
aliReq, err := adaptor.convertToAliRequest(testRelayInfo(), req)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "wan2.7-i2v", aliReq.Model)
|
||||
require.Equal(t, "720P", aliReq.Parameters.Resolution)
|
||||
require.Equal(t, 10, aliReq.Parameters.Duration)
|
||||
require.Equal(t, []AliVideoMedia{
|
||||
{Type: "first_frame", URL: "https://example.com/first.png"},
|
||||
}, aliReq.Input.Media)
|
||||
require.Empty(t, aliReq.Input.ImgURL)
|
||||
|
||||
body, err := common.Marshal(aliReq)
|
||||
require.NoError(t, err)
|
||||
require.Contains(t, string(body), `"media"`)
|
||||
require.NotContains(t, string(body), `"img_url"`)
|
||||
}
|
||||
|
||||
func TestConvertToAliRequestWan27I2VBuildsFirstAndLastFrameFromImages(t *testing.T) {
|
||||
adaptor := &TaskAdaptor{}
|
||||
req := relaycommon.TaskSubmitReq{
|
||||
Model: "wan2.7-i2v",
|
||||
Prompt: "interpolate between frames",
|
||||
Images: []string{
|
||||
"https://example.com/first.png",
|
||||
"https://example.com/last.png",
|
||||
},
|
||||
}
|
||||
|
||||
aliReq, err := adaptor.convertToAliRequest(testRelayInfo(), req)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []AliVideoMedia{
|
||||
{Type: "first_frame", URL: "https://example.com/first.png"},
|
||||
{Type: "last_frame", URL: "https://example.com/last.png"},
|
||||
}, aliReq.Input.Media)
|
||||
}
|
||||
|
||||
func TestConvertToAliRequestWan27I2VPrefersImageBeforeImagesAndInputReference(t *testing.T) {
|
||||
adaptor := &TaskAdaptor{}
|
||||
req := relaycommon.TaskSubmitReq{
|
||||
Model: "wan2.7-i2v",
|
||||
Prompt: "use the direct image",
|
||||
Image: " https://example.com/direct.png ",
|
||||
Images: []string{"https://example.com/images-first.png", " https://example.com/images-last.png "},
|
||||
InputReference: "https://example.com/input-reference.png",
|
||||
}
|
||||
|
||||
aliReq, err := adaptor.convertToAliRequest(testRelayInfo(), req)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []AliVideoMedia{
|
||||
{Type: "first_frame", URL: "https://example.com/direct.png"},
|
||||
{Type: "last_frame", URL: "https://example.com/images-last.png"},
|
||||
}, aliReq.Input.Media)
|
||||
}
|
||||
|
||||
func TestConvertToAliRequestWan27I2VFallsBackToFirstNonEmptyImage(t *testing.T) {
|
||||
adaptor := &TaskAdaptor{}
|
||||
req := relaycommon.TaskSubmitReq{
|
||||
Model: "wan2.7-i2v",
|
||||
Prompt: "skip blank images",
|
||||
Image: " ",
|
||||
Images: []string{
|
||||
" ",
|
||||
" https://example.com/first.png ",
|
||||
" https://example.com/last.png ",
|
||||
},
|
||||
InputReference: "https://example.com/input-reference.png",
|
||||
}
|
||||
|
||||
aliReq, err := adaptor.convertToAliRequest(testRelayInfo(), req)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []AliVideoMedia{
|
||||
{Type: "first_frame", URL: "https://example.com/first.png"},
|
||||
{Type: "last_frame", URL: "https://example.com/last.png"},
|
||||
}, aliReq.Input.Media)
|
||||
}
|
||||
|
||||
func TestConvertToAliRequestWan27I2VKeepsExplicitMetadataMedia(t *testing.T) {
|
||||
adaptor := &TaskAdaptor{}
|
||||
req := relaycommon.TaskSubmitReq{
|
||||
Model: "wan2.7-i2v",
|
||||
Prompt: "continue the clip",
|
||||
Image: "https://example.com/direct.png",
|
||||
Images: []string{"https://example.com/images-first.png", "https://example.com/images-last.png"},
|
||||
InputReference: "https://example.com/input-reference.png",
|
||||
Metadata: map[string]interface{}{
|
||||
"input": map[string]interface{}{
|
||||
"media": []interface{}{
|
||||
map[string]interface{}{
|
||||
"type": "first_clip",
|
||||
"url": "https://example.com/input.mp4",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
aliReq, err := adaptor.convertToAliRequest(testRelayInfo(), req)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []AliVideoMedia{
|
||||
{Type: "first_clip", URL: "https://example.com/input.mp4"},
|
||||
}, aliReq.Input.Media)
|
||||
require.Empty(t, aliReq.Input.ImgURL)
|
||||
|
||||
body, err := common.Marshal(aliReq)
|
||||
require.NoError(t, err)
|
||||
require.Contains(t, string(body), `"media"`)
|
||||
require.NotContains(t, string(body), `"img_url"`)
|
||||
}
|
||||
|
||||
func TestConvertToAliRequestWan27I2VRequiresMedia(t *testing.T) {
|
||||
adaptor := &TaskAdaptor{}
|
||||
req := relaycommon.TaskSubmitReq{
|
||||
Model: "wan2.7-i2v",
|
||||
Prompt: "animate without a frame",
|
||||
}
|
||||
|
||||
_, err := adaptor.convertToAliRequest(testRelayInfo(), req)
|
||||
|
||||
require.Error(t, err)
|
||||
require.True(t, strings.Contains(err.Error(), "requires image"))
|
||||
}
|
||||
|
||||
func TestConvertToAliRequestWan25I2VKeepsLegacyImgURL(t *testing.T) {
|
||||
adaptor := &TaskAdaptor{}
|
||||
req := relaycommon.TaskSubmitReq{
|
||||
Model: "wan2.5-i2v-preview",
|
||||
Prompt: "animate the first frame",
|
||||
Image: "https://example.com/first.png",
|
||||
}
|
||||
|
||||
aliReq, err := adaptor.convertToAliRequest(testRelayInfo(), req)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "https://example.com/first.png", aliReq.Input.ImgURL)
|
||||
require.Empty(t, aliReq.Input.Media)
|
||||
|
||||
body, err := common.Marshal(aliReq)
|
||||
require.NoError(t, err)
|
||||
require.Contains(t, string(body), `"img_url"`)
|
||||
require.NotContains(t, string(body), `"media"`)
|
||||
}
|
||||
Reference in New Issue
Block a user