import { describe, it, expect } from "vitest"; import { resolveHappyHorseRequestModel, HAPPY_HORSE_UI_MODEL, HAPPY_HORSE_T2V_MODEL, HAPPY_HORSE_I2V_MODEL, HAPPY_HORSE_R2V_MODEL } from "./happyHorseRouting"; import { resolveViduRequestModel, VIDU_UI_MODEL, VIDU_T2V_MODEL, VIDU_I2V_MODEL } from "./viduRouting"; import { resolvePixverseRequestModel, PIXVERSE_UI_MODEL, PIXVERSE_T2V_MODEL, PIXVERSE_I2V_MODEL, PIXVERSE_KF2V_MODEL } from "./pixverseRouting"; type ResolveFn = (input: { model: string; referenceUrls?: string[]; imageReferenceCount?: number }) => string; // 三家路由在参考图数量上的分支差异是回归测试重点。 // HappyHorse: 0->t2v, 1->i2v, >=2->r2v // Vidu: 0->t2v, >=1->i2v (无 r2v) // Pixverse: 0->t2v, 1->i2v, >=2->kf2v describe.each([ { name: "HappyHorse", resolve: resolveHappyHorseRequestModel, ui: HAPPY_HORSE_UI_MODEL, t2v: HAPPY_HORSE_T2V_MODEL, i2v: HAPPY_HORSE_I2V_MODEL, third: HAPPY_HORSE_R2V_MODEL }, { name: "Vidu", resolve: resolveViduRequestModel, ui: VIDU_UI_MODEL, t2v: VIDU_T2V_MODEL, i2v: VIDU_I2V_MODEL, third: null }, { name: "Pixverse", resolve: resolvePixverseRequestModel, ui: PIXVERSE_UI_MODEL, t2v: PIXVERSE_T2V_MODEL, i2v: PIXVERSE_I2V_MODEL, third: PIXVERSE_KF2V_MODEL }, ] as Array<{ name: string; resolve: ResolveFn; ui: string; t2v: string; i2v: string; third: string | null }>)( "$name routing by imageReferenceCount", ({ resolve, ui, t2v, i2v, third }) => { it("returns the input model unchanged when it is not this provider", () => { expect(resolve({ model: "some-other-model" })).toBe("some-other-model"); }); it("routes 0 reference images to t2v", () => { expect(resolve({ model: ui, imageReferenceCount: 0 })).toBe(t2v); }); it("routes 1 reference image to i2v", () => { expect(resolve({ model: ui, imageReferenceCount: 1 })).toBe(i2v); }); if (third) { it("routes >=2 reference images to the third model", () => { expect(resolve({ model: ui, imageReferenceCount: 2 })).toBe(third); expect(resolve({ model: ui, imageReferenceCount: 5 })).toBe(third); }); } else { it("routes >=1 reference images to i2v (no third model for this provider)", () => { expect(resolve({ model: ui, imageReferenceCount: 2 })).toBe(i2v); expect(resolve({ model: ui, imageReferenceCount: 5 })).toBe(i2v); }); } }, ); describe("reference count fallback (referenceUrls when imageReferenceCount omitted)", () => { it("HappyHorse counts non-empty urls", () => { expect( resolveHappyHorseRequestModel({ model: HAPPY_HORSE_UI_MODEL, referenceUrls: ["", " ", "https://example.com/a.png"], }), ).toBe(HAPPY_HORSE_I2V_MODEL); }); it("Vidu falls back to 0 when all urls are empty/whitespace", () => { expect( resolveViduRequestModel({ model: VIDU_UI_MODEL, referenceUrls: ["", " "], }), ).toBe(VIDU_T2V_MODEL); }); it("Pixverse counts two non-empty urls as kf2v", () => { expect( resolvePixverseRequestModel({ model: PIXVERSE_UI_MODEL, referenceUrls: ["https://a.png", "https://b.png"], }), ).toBe(PIXVERSE_KF2V_MODEL); }); it("imageReferenceCount takes precedence over referenceUrls length", () => { // Even though referenceUrls has 3 entries, explicit count of 0 wins. expect( resolveHappyHorseRequestModel({ model: HAPPY_HORSE_UI_MODEL, referenceUrls: ["a", "b", "c"], imageReferenceCount: 0, }), ).toBe(HAPPY_HORSE_T2V_MODEL); }); it("handles undefined referenceUrls with undefined count", () => { expect(resolveViduRequestModel({ model: VIDU_UI_MODEL })).toBe(VIDU_T2V_MODEL); }); });