Files
new-api/relay/channel/task/ali/adaptor_test.go
T
Scott 52858ad1e6 feat: support Wan2.7 i2v media mapping (#4984)
* feat: support Wan2.7 i2v media mapping

* fix: normalize wan2.7 i2v image inputs
2026-07-01 21:21:41 +08:00

173 lines
5.1 KiB
Go

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"`)
}