From 0a476c6db94eecc252cbea11d5756f2d446c3a5e Mon Sep 17 00:00:00 2001 From: Tomer Shlasky Date: Mon, 14 Sep 2026 13:59:07 +0300 Subject: [PATCH] feat: remove retired lucy-vton-2 and lucy-vton-3 model IDs Claude-Session: https://claude.ai/code/session_01TNMMxPdhY2U2YZpnbKxZEN --- examples/nextjs-realtime/README.md | 1 - examples/react-vite/README.md | 1 - examples/sdk-core/README.md | 1 - examples/sdk-core/realtime/lucy-vton-2.ts | 48 ------------ examples/sdk-core/video/virtual-try-on.ts | 4 +- examples/tanstack-streamer/README.md | 1 - packages/sdk/AGENTS.md | 6 -- packages/sdk/index.html | 5 -- packages/sdk/src/process/types.ts | 9 +-- packages/sdk/src/shared/model.ts | 88 +--------------------- packages/sdk/tests/e2e-realtime.test.ts | 2 - packages/sdk/tests/e2e.test.ts | 25 +------ packages/sdk/tests/unit.test.ts | 89 +---------------------- 13 files changed, 9 insertions(+), 271 deletions(-) delete mode 100644 examples/sdk-core/realtime/lucy-vton-2.ts diff --git a/examples/nextjs-realtime/README.md b/examples/nextjs-realtime/README.md index a46388e..ee8a60b 100644 --- a/examples/nextjs-realtime/README.md +++ b/examples/nextjs-realtime/README.md @@ -46,4 +46,3 @@ pnpm dev This example uses `lucy-restyle-2` for style transformation. You can also use: - `lucy-2.1` - Lucy 2.1 for video editing with reference image support -- `lucy-vton-2` - Lucy VTON 2 diff --git a/examples/react-vite/README.md b/examples/react-vite/README.md index d163c16..e2466a5 100644 --- a/examples/react-vite/README.md +++ b/examples/react-vite/README.md @@ -44,4 +44,3 @@ pnpm dev This example uses `lucy-restyle-2` for style transformation. You can also use: - `lucy-2.1` - Lucy 2.1 for video editing with reference image support -- `lucy-vton-2` - Lucy VTON 2 diff --git a/examples/sdk-core/README.md b/examples/sdk-core/README.md index e81af9a..4d1e8d2 100644 --- a/examples/sdk-core/README.md +++ b/examples/sdk-core/README.md @@ -49,7 +49,6 @@ See `examples/nextjs-realtime` or `examples/react-vite` for runnable demos. - `realtime/lucy-restyle-basic.ts` - Realtime style transformation with `lucy-restyle-2` - `realtime/lucy-2.1.ts` - Lucy 2.1 realtime video editing with reference image support -- `realtime/lucy-vton-2.ts` - Lucy VTON 2 - `realtime/connection-events.ts` - Handling connection state and errors - `realtime/prompt-update.ts` - Updating prompt dynamically - `realtime/custom-model.ts` - Using a custom model definition (e.g., preview/experimental models) diff --git a/examples/sdk-core/realtime/lucy-vton-2.ts b/examples/sdk-core/realtime/lucy-vton-2.ts deleted file mode 100644 index 7d9de70..0000000 --- a/examples/sdk-core/realtime/lucy-vton-2.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Browser-only example - requires WebRTC APIs - * Lucy VTON 2 (Virtual Try-On) for realtime garment/outfit transfer - * See examples/nextjs-realtime or examples/react-vite for runnable demos - */ - -import { createDecartClient, models } from "@decartai/sdk"; - -async function main() { - const model = models.realtime("lucy-vton-2"); - - const stream = await navigator.mediaDevices.getUserMedia({ - audio: true, - video: { - frameRate: model.fps, - width: model.width, - height: model.height, - }, - }); - - const client = createDecartClient({ - apiKey: process.env.DECART_API_KEY!, - }); - - const realtimeClient = await client.realtime.connect(stream, { - model, - onRemoteStream: (editedStream) => { - const video = document.getElementById("output") as HTMLVideoElement; - video.srcObject = editedStream; - }, - initialState: { - prompt: { - text: "Wearing a red leather jacket", - enhance: true, - }, - }, - }); - - // Use a reference image of a garment to try on - await realtimeClient.set({ - prompt: "Wearing the outfit from the reference image", - image: "https://example.com/outfit-reference.png", - }); - - console.log("Session ID:", realtimeClient.sessionId); -} - -main(); diff --git a/examples/sdk-core/video/virtual-try-on.ts b/examples/sdk-core/video/virtual-try-on.ts index 5028c88..c41afb2 100644 --- a/examples/sdk-core/video/virtual-try-on.ts +++ b/examples/sdk-core/video/virtual-try-on.ts @@ -12,12 +12,12 @@ run(async () => { apiKey, }); - console.log("Processing virtual try-on with lucy-vton-3..."); + console.log("Processing virtual try-on with lucy-vton-latest..."); const inputVideo = fs.readFileSync("input.mp4"); const result = await client.queue.submitAndPoll({ - model: models.video("lucy-vton-3"), + model: models.video("lucy-vton-latest"), prompt: "Wearing a red leather jacket", data: new Blob([inputVideo]), onStatusChange: (job) => { diff --git a/examples/tanstack-streamer/README.md b/examples/tanstack-streamer/README.md index 8da7566..7c4e9f4 100644 --- a/examples/tanstack-streamer/README.md +++ b/examples/tanstack-streamer/README.md @@ -54,4 +54,3 @@ pnpm dev This example uses `lucy-2.1` for video editing with reference image support. You can also use: - `lucy-restyle-2` - Lucy Restyle for style transformation -- `lucy-vton-2` - Lucy VTON 2 diff --git a/packages/sdk/AGENTS.md b/packages/sdk/AGENTS.md index 9b4aed5..1e51391 100644 --- a/packages/sdk/AGENTS.md +++ b/packages/sdk/AGENTS.md @@ -70,23 +70,17 @@ ### Realtime Models (WebRTC) - `lucy-2.1` - Real-time video editing (supports reference image) - `lucy-2.5` - Real-time video editing (supports reference image) -- `lucy-vton-2` - Real-time virtual try-on 2 -- `lucy-vton-3` - Real-time virtual try-on 3 - `lucy-vton-3.5` - Real-time virtual try-on 3.5 - `lucy-restyle-2` - Real-time video restyling - `lucy-latest`, `lucy-vton-latest`, `lucy-restyle-latest` - Server-resolved aliases for the latest stable version (`lucy-vton-latest` → `lucy-vton-3.5`) -- Deprecated: `lucy-2.1-vton-2` → `lucy-vton-2` ### Video Models (Queue API) - `lucy-clip` - video-to-video editing - `lucy-2.1` - long-form video editing (720p) - `lucy-2.5` - long-form video editing (720p) -- `lucy-vton-2` - virtual try-on 2 video editing -- `lucy-vton-3` - virtual try-on 3 video editing - `lucy-vton-3.5` - virtual try-on 3.5 video editing - `lucy-restyle-2` - video restyling - `lucy-latest`, `lucy-vton-latest`, `lucy-restyle-latest`, `lucy-clip-latest` - Server-resolved aliases (`lucy-vton-latest` → `lucy-vton-3.5`) -- Deprecated: `lucy-2.1-vton-2` → `lucy-vton-2` ### Image Models (Process API) - `lucy-image-2` - image-to-image editing diff --git a/packages/sdk/index.html b/packages/sdk/index.html index 47633ae..614e183 100644 --- a/packages/sdk/index.html +++ b/packages/sdk/index.html @@ -343,14 +343,9 @@

Configuration

- - - - - diff --git a/packages/sdk/src/process/types.ts b/packages/sdk/src/process/types.ts index a1b1194..92305dd 100644 --- a/packages/sdk/src/process/types.ts +++ b/packages/sdk/src/process/types.ts @@ -163,14 +163,7 @@ export type ModelSpecificInputs = T["name"] extends " ? ImageEditingInputs : T["name"] extends "lucy-restyle-v2v" | "lucy-restyle-2" ? VideoRestyleInputs - : T["name"] extends - | "lucy-2.1" - | "lucy-2.5" - | "lucy-vton-2" - | "lucy-vton-3" - | "lucy-vton-3.5" - | "lucy-2.1-vton-2" - | "lucy-vton-latest" + : T["name"] extends "lucy-2.1" | "lucy-2.5" | "lucy-vton-3.5" | "lucy-vton-latest" ? VideoEdit2Inputs : T["name"] extends "lucy-pro-v2v" | "lucy-clip" ? VideoEditInputs diff --git a/packages/sdk/src/shared/model.ts b/packages/sdk/src/shared/model.ts index de4de43..66c2e2c 100644 --- a/packages/sdk/src/shared/model.ts +++ b/packages/sdk/src/shared/model.ts @@ -5,31 +5,14 @@ import { globalInstanceSchema } from "../utils/runtime"; const CANONICAL_MODEL_NAMES = [ "lucy-2.1", "lucy-2.5", - "lucy-vton-2", - "lucy-vton-3", "lucy-vton-3.5", "lucy-restyle-2", "lucy-clip", "lucy-image-2", ] as const; -const CANONICAL_REALTIME_MODEL_NAMES = [ - "lucy-2.1", - "lucy-2.5", - "lucy-vton-2", - "lucy-vton-3", - "lucy-vton-3.5", - "lucy-restyle-2", -] as const; -const CANONICAL_VIDEO_MODEL_NAMES = [ - "lucy-clip", - "lucy-2.1", - "lucy-2.5", - "lucy-vton-2", - "lucy-vton-3", - "lucy-vton-3.5", - "lucy-restyle-2", -] as const; +const CANONICAL_REALTIME_MODEL_NAMES = ["lucy-2.1", "lucy-2.5", "lucy-vton-3.5", "lucy-restyle-2"] as const; +const CANONICAL_VIDEO_MODEL_NAMES = ["lucy-clip", "lucy-2.1", "lucy-2.5", "lucy-vton-3.5", "lucy-restyle-2"] as const; const CANONICAL_IMAGE_MODEL_NAMES = ["lucy-image-2"] as const; export const canonicalRealtimeModels = z.enum(CANONICAL_REALTIME_MODEL_NAMES); @@ -43,7 +26,6 @@ export type CanonicalModel = z.infer; * Old names still work but will log a deprecation warning. */ export const modelAliases = { - "lucy-2.1-vton-2": "lucy-vton-2", "lucy-pro-v2v": "lucy-clip", "lucy-restyle-v2v": "lucy-restyle-2", "lucy-pro-i2i": "lucy-image-2", @@ -70,24 +52,18 @@ export const realtimeModels = z.union([ // Canonical names z.literal("lucy-2.1"), z.literal("lucy-2.5"), - z.literal("lucy-vton-2"), - z.literal("lucy-vton-3"), z.literal("lucy-vton-3.5"), z.literal("lucy-restyle-2"), // Latest aliases (server-side resolution) z.literal("lucy-latest"), z.literal("lucy-vton-latest"), z.literal("lucy-restyle-latest"), - // Deprecated names (use canonical names above instead) - z.literal("lucy-2.1-vton-2"), ]); export const videoModels = z.union([ // Canonical names z.literal("lucy-clip"), z.literal("lucy-2.1"), z.literal("lucy-2.5"), - z.literal("lucy-vton-2"), - z.literal("lucy-vton-3"), z.literal("lucy-vton-3.5"), z.literal("lucy-restyle-2"), // Latest aliases (server-side resolution) @@ -96,7 +72,6 @@ export const videoModels = z.union([ z.literal("lucy-restyle-latest"), z.literal("lucy-clip-latest"), // Deprecated names (use canonical names above instead) - z.literal("lucy-2.1-vton-2"), z.literal("lucy-pro-v2v"), z.literal("lucy-restyle-v2v"), ]); @@ -264,8 +239,6 @@ export const modelInputSchemas = { "lucy-restyle-2": restyleSchema, "lucy-2.1": videoEdit2Schema, "lucy-2.5": videoEdit2Schema, - "lucy-vton-2": videoEdit2Schema, - "lucy-vton-3": videoEdit2Schema, "lucy-vton-3.5": videoEdit2Schema, // Latest aliases (server-side resolution) "lucy-latest": videoEdit2Schema, @@ -274,7 +247,6 @@ export const modelInputSchemas = { "lucy-clip-latest": videoEditSchema, "lucy-image-latest": imageEditSchema, // Deprecated names (kept for backward compatibility) - "lucy-2.1-vton-2": videoEdit2Schema, "lucy-pro-v2v": videoEditSchema, "lucy-pro-i2i": imageEditSchema, "lucy-restyle-v2v": restyleSchema, @@ -359,22 +331,6 @@ const _models = { height: 720, inputSchema: z.object({}), }, - "lucy-vton-2": { - urlPath: "/v1/stream", - name: "lucy-vton-2" as const, - fps: { ideal: 30, max: 30 }, - width: 1088, - height: 624, - inputSchema: z.object({}), - }, - "lucy-vton-3": { - urlPath: "/v1/stream", - name: "lucy-vton-3" as const, - fps: { ideal: 30, max: 30 }, - width: 1088, - height: 624, - inputSchema: z.object({}), - }, "lucy-vton-3.5": { urlPath: "/v1/stream", name: "lucy-vton-3.5" as const, @@ -417,15 +373,6 @@ const _models = { height: 704, inputSchema: z.object({}), }, - // Deprecated names (use canonical names above instead) - "lucy-2.1-vton-2": { - urlPath: "/v1/stream", - name: "lucy-2.1-vton-2" as const, - fps: { ideal: 30, max: 30 }, - width: 1088, - height: 624, - inputSchema: z.object({}), - }, }, image: { // Canonical name @@ -488,24 +435,6 @@ const _models = { height: 720, inputSchema: modelInputSchemas["lucy-2.5"], }, - "lucy-vton-2": { - urlPath: "/v1/generate/lucy-vton-2", - queueUrlPath: "/v1/jobs/lucy-vton-2", - name: "lucy-vton-2" as const, - fps: 20, - width: 1088, - height: 624, - inputSchema: modelInputSchemas["lucy-vton-2"], - }, - "lucy-vton-3": { - urlPath: "/v1/generate/lucy-vton-3", - queueUrlPath: "/v1/jobs/lucy-vton-3", - name: "lucy-vton-3" as const, - fps: 20, - width: 1088, - height: 624, - inputSchema: modelInputSchemas["lucy-vton-3"], - }, "lucy-vton-3.5": { urlPath: "/v1/generate/lucy-vton-3.5", queueUrlPath: "/v1/jobs/lucy-vton-3.5", @@ -563,15 +492,6 @@ const _models = { inputSchema: modelInputSchemas["lucy-clip-latest"], }, // Deprecated names (use canonical names above instead) - "lucy-2.1-vton-2": { - urlPath: "/v1/generate/lucy-2.1-vton-2", - queueUrlPath: "/v1/jobs/lucy-2.1-vton-2", - name: "lucy-2.1-vton-2" as const, - fps: 20, - width: 1088, - height: 624, - inputSchema: modelInputSchemas["lucy-2.1-vton-2"], - }, "lucy-pro-v2v": { urlPath: "/v1/generate/lucy-pro-v2v", queueUrlPath: "/v1/jobs/lucy-pro-v2v", @@ -628,8 +548,6 @@ export const models = { * Available options: * - `"lucy-2.1"` - Lucy 2.1 realtime video editing * - `"lucy-2.5"` - Lucy 2.5 realtime video editing - * - `"lucy-vton-2"` - Lucy virtual try-on 2 - * - `"lucy-vton-3"` - Lucy virtual try-on 3 * - `"lucy-vton-3.5"` - Lucy virtual try-on 3.5 (latest) * - `"lucy-restyle-2"` - Realtime video restyling */ @@ -648,8 +566,6 @@ export const models = { * - `"lucy-clip"` - Video-to-video editing * - `"lucy-2.1"` - Long-form video editing (Lucy 2.1) * - `"lucy-2.5"` - Long-form video editing (Lucy 2.5) - * - `"lucy-vton-2"` - Virtual try-on 2 video editing - * - `"lucy-vton-3"` - Virtual try-on 3 video editing * - `"lucy-vton-3.5"` - Virtual try-on 3.5 video editing (latest) * - `"lucy-restyle-2"` - Video restyling */ diff --git a/packages/sdk/tests/e2e-realtime.test.ts b/packages/sdk/tests/e2e-realtime.test.ts index 4635797..a9a6355 100644 --- a/packages/sdk/tests/e2e-realtime.test.ts +++ b/packages/sdk/tests/e2e-realtime.test.ts @@ -60,8 +60,6 @@ const REALTIME_MODELS: RealTimeModels[] = [ "lucy-restyle-2", "lucy-2.1", "lucy-2.5", - "lucy-vton-2", - "lucy-vton-3", "lucy-vton-3.5", ]; diff --git a/packages/sdk/tests/e2e.test.ts b/packages/sdk/tests/e2e.test.ts index 1394e03..7d7c09e 100644 --- a/packages/sdk/tests/e2e.test.ts +++ b/packages/sdk/tests/e2e.test.ts @@ -11,7 +11,7 @@ const OUTPUT_DIR = join(__dirname, "e2e-output"); const VIDEO_FIXTURE = join(__dirname, "fixtures", "video.mp4"); const IMAGE_FIXTURE = join(__dirname, "fixtures", "image.png"); // Try-on models take the GARMENT as reference_image; a non-garment reference (the dogs above) makes -// lucy-vton-3 undress the subject and the output fails moderation (PLA-808, PLA-817). +// the try-on models undress the subject and the output fails moderation (PLA-808, PLA-817). const GARMENT_FIXTURE = join(__dirname, "fixtures", "garment.png"); const TIMEOUT = 5 * 60 * 1000; // 5 minutes @@ -194,29 +194,6 @@ describe.concurrent("E2E Tests", { timeout: TIMEOUT, retry: 2 }, () => { await expectResult(result, "lucy-2.5-reference_image", ".mp4"); }); - it("lucy-vton-3: virtual try-on (prompt)", async () => { - const result = await client.queue.submitAndPoll({ - model: models.video("lucy-vton-3"), - prompt: "Wearing a red leather jacket", - data: videoBlob, - seed: 42, - }); - - await expectResult(result, "lucy-vton-3-prompt", ".mp4"); - }); - - it("lucy-vton-3: virtual try-on (reference_image)", async () => { - const result = await client.queue.submitAndPoll({ - model: models.video("lucy-vton-3"), - prompt: "", - reference_image: garmentBlob, - data: videoBlob, - seed: 42, - }); - - await expectResult(result, "lucy-vton-3-reference_image", ".mp4"); - }); - it("lucy-vton-3.5: virtual try-on (prompt)", async () => { const result = await client.queue.submitAndPoll({ model: models.video("lucy-vton-3.5"), diff --git a/packages/sdk/tests/unit.test.ts b/packages/sdk/tests/unit.test.ts index 65223cf..8c7ca10 100644 --- a/packages/sdk/tests/unit.test.ts +++ b/packages/sdk/tests/unit.test.ts @@ -2502,27 +2502,18 @@ describe("Canonical Model Names", () => { "lucy-clip-latest", "lucy-image-latest", ]; - const deprecatedAliases = ["lucy-2.1-vton-2", "lucy-pro-v2v", "lucy-restyle-v2v", "lucy-pro-i2i"]; + const deprecatedAliases = ["lucy-pro-v2v", "lucy-restyle-v2v", "lucy-pro-i2i"]; it("canonical schemas exclude deprecated and latest aliases", () => { for (const alias of [...latestAliases, ...deprecatedAliases]) { expect(canonicalModelSchema.safeParse(alias).success).toBe(false); } - expect(canonicalRealtimeModels.options).toEqual([ - "lucy-2.1", - "lucy-2.5", - "lucy-vton-2", - "lucy-vton-3", - "lucy-vton-3.5", - "lucy-restyle-2", - ]); + expect(canonicalRealtimeModels.options).toEqual(["lucy-2.1", "lucy-2.5", "lucy-vton-3.5", "lucy-restyle-2"]); expect(canonicalVideoModels.options).toEqual([ "lucy-clip", "lucy-2.1", "lucy-2.5", - "lucy-vton-2", - "lucy-vton-3", "lucy-vton-3.5", "lucy-restyle-2", ]); @@ -2583,7 +2574,7 @@ describe("Canonical Model Names", () => { it("lists all models when called without options", () => { const listedModels = listModels(); - expect(listedModels).toHaveLength(27); + expect(listedModels).toHaveLength(21); expect(listedModels.some((model) => model.kind === "realtime" && model.name === "lucy-2.1")).toBe(true); expect(listedModels.some((model) => model.kind === "video" && model.name === "lucy-clip")).toBe(true); expect(listedModels.some((model) => model.kind === "image" && model.name === "lucy-image-2")).toBe(true); @@ -2595,7 +2586,6 @@ describe("Canonical Model Names", () => { expect(realtimeModels.every((model) => model.kind === "realtime")).toBe(true); expect(realtimeNames).toContain("lucy-latest"); - expect(realtimeNames).toContain("lucy-2.1-vton-2"); }); it("lists canonical model definitions without latest or deprecated aliases", () => { @@ -2658,24 +2648,6 @@ describe("Canonical Model Names", () => { expect(model.height).toBe(720); }); - it("lucy-vton-2 canonical name works", () => { - const model = models.realtime("lucy-vton-2"); - expect(model.name).toBe("lucy-vton-2"); - expect(model.urlPath).toBe("/v1/stream"); - expect(model.fps).toEqual({ ideal: 30, max: 30 }); - expect(model.width).toBe(1088); - expect(model.height).toBe(624); - }); - - it("lucy-vton-3 canonical name works", () => { - const model = models.realtime("lucy-vton-3"); - expect(model.name).toBe("lucy-vton-3"); - expect(model.urlPath).toBe("/v1/stream"); - expect(model.fps).toEqual({ ideal: 30, max: 30 }); - expect(model.width).toBe(1088); - expect(model.height).toBe(624); - }); - it("lucy-vton-3.5 canonical name works", () => { const model = models.realtime("lucy-vton-3.5"); expect(model.name).toBe("lucy-vton-3.5"); @@ -2718,26 +2690,6 @@ describe("Canonical Model Names", () => { expect(model.width).toBe(1280); expect(model.height).toBe(720); }); - it("lucy-vton-2 as video model works", () => { - const model = models.video("lucy-vton-2"); - expect(model.name).toBe("lucy-vton-2"); - expect(model.urlPath).toBe("/v1/generate/lucy-vton-2"); - expect(model.queueUrlPath).toBe("/v1/jobs/lucy-vton-2"); - expect(model.fps).toBe(20); - expect(model.width).toBe(1088); - expect(model.height).toBe(624); - }); - - it("lucy-vton-3 as video model works", () => { - const model = models.video("lucy-vton-3"); - expect(model.name).toBe("lucy-vton-3"); - expect(model.urlPath).toBe("/v1/generate/lucy-vton-3"); - expect(model.queueUrlPath).toBe("/v1/jobs/lucy-vton-3"); - expect(model.fps).toBe(20); - expect(model.width).toBe(1088); - expect(model.height).toBe(624); - }); - it("lucy-vton-3.5 as video model works", () => { const model = models.video("lucy-vton-3.5"); expect(model.name).toBe("lucy-vton-3.5"); @@ -2875,16 +2827,6 @@ describe("Canonical Model Names", () => { expect(isVideoModel("lucy-2.1")).toBe(true); }); - it("lucy-vton-2 is both a realtime and video model", () => { - expect(isRealtimeModel("lucy-vton-2")).toBe(true); - expect(isVideoModel("lucy-vton-2")).toBe(true); - }); - - it("lucy-2.1-vton-2 is a deprecated alias for lucy-vton-2 on both surfaces", () => { - expect(isRealtimeModel("lucy-2.1-vton-2")).toBe(true); - expect(isVideoModel("lucy-2.1-vton-2")).toBe(true); - }); - it("lucy-restyle-2 is both a realtime and video model", () => { expect(isRealtimeModel("lucy-restyle-2")).toBe(true); expect(isVideoModel("lucy-restyle-2")).toBe(true); @@ -2892,25 +2834,6 @@ describe("Canonical Model Names", () => { }); describe("Deprecated names still work", () => { - it("lucy-2.1-vton-2 still works as realtime and video alias", () => { - _resetDeprecationWarnings(); - const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); - - const realtimeModel = models.realtime("lucy-2.1-vton-2"); - const videoModel = models.video("lucy-2.1-vton-2"); - - expect(realtimeModel.name).toBe("lucy-2.1-vton-2"); - expect(videoModel.name).toBe("lucy-2.1-vton-2"); - expect(videoModel.urlPath).toBe("/v1/generate/lucy-2.1-vton-2"); - expect(videoModel.queueUrlPath).toBe("/v1/jobs/lucy-2.1-vton-2"); - expect(warnSpy).toHaveBeenCalledTimes(1); - expect(warnSpy).toHaveBeenCalledWith( - expect.stringContaining('Model "lucy-2.1-vton-2" is deprecated. Use "lucy-vton-2" instead.'), - ); - - warnSpy.mockRestore(); - }); - it("lucy-pro-v2v still works as video model", () => { const model = models.video("lucy-pro-v2v"); expect(model.name).toBe("lucy-pro-v2v"); @@ -2931,12 +2854,6 @@ describe("Canonical Model Names", () => { expect(warnSpy).toHaveBeenCalledWith( expect.stringContaining('Model "lucy-pro-v2v" is deprecated. Use "lucy-clip" instead.'), ); - warnSpy.mockClear(); - _resetDeprecationWarnings(); - models.video("lucy-2.1-vton-2"); - expect(warnSpy).toHaveBeenCalledWith( - expect.stringContaining('Model "lucy-2.1-vton-2" is deprecated. Use "lucy-vton-2" instead.'), - ); warnSpy.mockRestore(); });