fix(canvas): NewAPI 视频生成 - 拒绝缺少参考视频的纯音频请求
This commit is contained in:
@@ -1724,6 +1724,10 @@ func newAPIChannel2VideoRequestBody(input canvasGenerationInput) (newAPIVideoReq
|
|||||||
if len(input.ReferenceImages) > 9 || len(input.ReferenceVideos) > 3 || len(input.ReferenceAudios) > 3 {
|
if len(input.ReferenceImages) > 9 || len(input.ReferenceVideos) > 3 || len(input.ReferenceAudios) > 3 {
|
||||||
return newAPIVideoRequest{}, errors.New("NewAPI Video Generations 最多支持 9 张参考图、3 个参考视频和 3 个参考音频")
|
return newAPIVideoRequest{}, errors.New("NewAPI Video Generations 最多支持 9 张参考图、3 个参考视频和 3 个参考音频")
|
||||||
}
|
}
|
||||||
|
// NewAPI Video Generations 只接受附着在参考视频上的音频;纯音频请求会被上游拒绝。
|
||||||
|
if len(input.ReferenceAudios) > 0 && len(input.ReferenceVideos) == 0 {
|
||||||
|
return newAPIVideoRequest{}, errors.New("NewAPI Video Generations 的参考音频必须同时提供至少 1 个参考视频;纯音频生视频请切换到支持该模式的渠道")
|
||||||
|
}
|
||||||
modelName := strings.ToLower(strings.TrimSpace(input.Config.Model))
|
modelName := strings.ToLower(strings.TrimSpace(input.Config.Model))
|
||||||
requiresSingleImage := modelName == "grok-video-1.5" || modelName == "grok-video-1.5-1080p"
|
requiresSingleImage := modelName == "grok-video-1.5" || modelName == "grok-video-1.5-1080p"
|
||||||
images := make([]string, 0, len(input.ReferenceImages))
|
images := make([]string, 0, len(input.ReferenceImages))
|
||||||
|
|||||||
@@ -1064,6 +1064,16 @@ func TestNewAPIChannel2SingleImageModelsRequireOneReference(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNewAPIChannel2RejectsAudioWithoutReferenceVideo(t *testing.T) {
|
||||||
|
_, err := newAPIChannel2VideoRequestBody(canvasGenerationInput{
|
||||||
|
Config: providerConfig{Model: "grok-image-video", VideoSeconds: "6"},
|
||||||
|
ReferenceAudios: []providerMedia{{ID: "audio-1", URL: "https://example.com/reference.mp3"}},
|
||||||
|
})
|
||||||
|
if err == nil || !strings.Contains(err.Error(), "必须同时提供至少 1 个参考视频") {
|
||||||
|
t.Fatalf("newAPIChannel2VideoRequestBody() error = %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestNewAPIChannel2SingleImageModelUsesReferenceForStaleTextToVideoMetadata(t *testing.T) {
|
func TestNewAPIChannel2SingleImageModelUsesReferenceForStaleTextToVideoMetadata(t *testing.T) {
|
||||||
body, err := newAPIChannel2VideoRequestBody(canvasGenerationInput{
|
body, err := newAPIChannel2VideoRequestBody(canvasGenerationInput{
|
||||||
Config: providerConfig{Model: "grok-video-1.5", VideoSeconds: "6"},
|
Config: providerConfig{Model: "grok-video-1.5", VideoSeconds: "6"},
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ export async function pollVideoGenerationTask(config: AiConfig, task: VideoGener
|
|||||||
|
|
||||||
async function createVideoGenerationsTask(config: ResolvedAiConfig, model: string, prompt: string, references: ReferenceImage[], videoReferences: ReferenceVideo[], audioReferences: ReferenceAudio[], options?: RequestOptions): Promise<VideoGenerationTask> {
|
async function createVideoGenerationsTask(config: ResolvedAiConfig, model: string, prompt: string, references: ReferenceImage[], videoReferences: ReferenceVideo[], audioReferences: ReferenceAudio[], options?: RequestOptions): Promise<VideoGenerationTask> {
|
||||||
if (references.length > 9 || videoReferences.length > 3 || audioReferences.length > 3) throw new Error("NewAPI Video Generations 最多支持 9 张参考图、3 个参考视频和 3 个参考音频");
|
if (references.length > 9 || videoReferences.length > 3 || audioReferences.length > 3) throw new Error("NewAPI Video Generations 最多支持 9 张参考图、3 个参考视频和 3 个参考音频");
|
||||||
|
if (audioReferences.length > 0 && videoReferences.length === 0) throw new Error("NewAPI Video Generations 的参考音频必须同时提供至少 1 个参考视频;纯音频生视频请切换到支持该模式的渠道");
|
||||||
const [imageUrls, videoUrls, audioUrls] = await Promise.all([
|
const [imageUrls, videoUrls, audioUrls] = await Promise.all([
|
||||||
Promise.all(references.map((item) => resolveVideoGenerationsUrl(item.url || item.dataUrl, item.storageKey))),
|
Promise.all(references.map((item) => resolveVideoGenerationsUrl(item.url || item.dataUrl, item.storageKey))),
|
||||||
Promise.all(videoReferences.map((item) => resolveVideoGenerationsUrl(item.url, item.storageKey))),
|
Promise.all(videoReferences.map((item) => resolveVideoGenerationsUrl(item.url, item.storageKey))),
|
||||||
|
|||||||
Reference in New Issue
Block a user