88 lines
3.7 KiB
TypeScript
88 lines
3.7 KiB
TypeScript
|
|
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);
|
||
|
|
});
|
||
|
|
});
|