diff --git a/examples/nextjs-realtime/README.md b/examples/nextjs-realtime/README.md index 34c28119..c3a2d718 100644 --- a/examples/nextjs-realtime/README.md +++ b/examples/nextjs-realtime/README.md @@ -47,4 +47,4 @@ This example uses `lucy-restyle-2` for style transformation. You can also use: - `lucy-restyle` - MirageLSD video restyling model (older) - `lucy` - Lucy for video editing (add objects, change elements) -- `lucy-2` - Lucy 2 for video editing with reference image support (better quality) +- `lucy-2.1` - Lucy 2.1 for video editing with reference image support diff --git a/examples/react-vite/README.md b/examples/react-vite/README.md index a5c438fb..40e0224c 100644 --- a/examples/react-vite/README.md +++ b/examples/react-vite/README.md @@ -45,4 +45,4 @@ This example uses `lucy-restyle-2` for style transformation. You can also use: - `lucy-restyle` - MirageLSD video restyling model (older) - `lucy` - Lucy for video editing (add objects, change elements) -- `lucy-2` - Lucy 2 for video editing with reference image support (better quality) +- `lucy-2.1` - Lucy 2.1 for video editing with reference image support diff --git a/examples/sdk-core/README.md b/examples/sdk-core/README.md index 6d749b8b..30a3664a 100644 --- a/examples/sdk-core/README.md +++ b/examples/sdk-core/README.md @@ -38,7 +38,7 @@ Image models use the synchronous Process API - they return immediately with a Bl Video models use the asynchronous Queue API - jobs are submitted and polled for completion. - `video/video-to-video.ts` - Transform existing video with a prompt (`lucy-clip`) -- `video/video-editing.ts` - Edit video with prompt, reference image, or both (`lucy-2`) +- `video/video-editing.ts` - Edit video with prompt, reference image, or both (`lucy-2.1`) - `video/long-form-video-restyle.ts` - Transform existing video with `lucy-restyle-2` - `video/manual-polling.ts` - Manual job status polling @@ -50,7 +50,7 @@ See `examples/nextjs-realtime` or `examples/react-vite` for runnable demos. - `realtime/mirage-basic.ts` - Basic Mirage connection (style transformation) - `realtime/mirage-v2-basic.ts` - Mirage v2 connection (improved style transformation) - `realtime/lucy-v2v-720p.ts` - Lucy v2v realtime (video editing - add objects, change elements) -- `realtime/lucy-2.ts` - Lucy 2 realtime (better quality video editing with reference image support) +- `realtime/lucy-2.1.ts` - Lucy 2.1 realtime video editing with reference image support - `realtime/live-avatar.ts` - Live avatar (audio-driven avatar with playAudio or mic input) - `realtime/connection-events.ts` - Handling connection state and errors - `realtime/prompt-update.ts` - Updating prompt dynamically diff --git a/examples/sdk-core/realtime/lucy-2.ts b/examples/sdk-core/realtime/lucy-2.ts deleted file mode 100644 index f6d9defc..00000000 --- a/examples/sdk-core/realtime/lucy-2.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Browser-only example - requires WebRTC APIs - * Lucy 2 for realtime video editing with reference image + prompt support - * 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-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: "Add a small dog in the background", - enhance: true, - }, - }, - }); - - // set() replaces the full state — prompt + image atomically in a single message - await realtimeClient.set({ - prompt: "A person wearing a superhero costume", - enhance: true, - image: "https://example.com/superhero-reference.png", - }); - - // Prompt-only set() clears the reference image. - await realtimeClient.set({ prompt: "Add sunglasses to the person" }); - - // Accepts File, Blob, base64 string, or URL - const fileInput = document.getElementById("image-upload") as HTMLInputElement; - fileInput.addEventListener("change", async () => { - const file = fileInput.files?.[0]; - if (file) { - await realtimeClient.set({ image: file }); - } - }); - - // setPrompt() as syntactic sugar for set() with prompt only - realtimeClient.setPrompt("Change the person's shirt to red"); - - console.log("Session ID:", realtimeClient.sessionId); -} - -main(); diff --git a/examples/sdk-core/video/video-editing.ts b/examples/sdk-core/video/video-editing.ts index c07242b5..c0f16197 100644 --- a/examples/sdk-core/video/video-editing.ts +++ b/examples/sdk-core/video/video-editing.ts @@ -12,13 +12,13 @@ run(async () => { apiKey, }); - console.log("Editing video with lucy-2..."); + console.log("Editing video with lucy-2.1..."); const inputVideo = fs.readFileSync("input.mp4"); // Option 1: Use a text prompt const result = await client.queue.submitAndPoll({ - model: models.video("lucy-2"), + model: models.video("lucy-2.1"), prompt: "Transform to watercolor painting style with soft brushstrokes", data: new Blob([inputVideo]), onStatusChange: (job) => { @@ -29,7 +29,7 @@ run(async () => { // Option 2: Use a reference image to guide the edit (with empty prompt) // const referenceImage = fs.readFileSync("reference.png"); // const result = await client.queue.submitAndPoll({ - // model: models.video("lucy-2"), + // model: models.video("lucy-2.1"), // prompt: "", // reference_image: new Blob([referenceImage]), // data: new Blob([inputVideo]), @@ -41,7 +41,7 @@ run(async () => { // Option 3: Use both a prompt and a reference image together // const referenceImage = fs.readFileSync("reference.png"); // const result = await client.queue.submitAndPoll({ - // model: models.video("lucy-2"), + // model: models.video("lucy-2.1"), // prompt: "Apply the style from the reference image", // reference_image: new Blob([referenceImage]), // data: new Blob([inputVideo]), diff --git a/examples/tanstack-streamer/README.md b/examples/tanstack-streamer/README.md index 08b5b58b..78cf78df 100644 --- a/examples/tanstack-streamer/README.md +++ b/examples/tanstack-streamer/README.md @@ -27,7 +27,7 @@ pnpm dev ## Features -- Real-time webcam video transformation using `lucy-2` +- Real-time webcam video transformation using `lucy-2.1` - Producer + subscriber streaming pattern - Shareable viewer link via subscribe token - Dynamic style prompt updates @@ -38,7 +38,7 @@ pnpm dev | Route | Description | |-------|-------------| -| `/` | **Producer** — streams your camera through `lucy-2`, shows styled output, and generates a shareable viewer link | +| `/` | **Producer** — streams your camera through `lucy-2.1`, shows styled output, and generates a shareable viewer link | | `/watch?token=...` | **Subscriber** — watches the producer's styled stream (receive-only, no camera needed) | ## How it works @@ -51,7 +51,7 @@ pnpm dev ## Models -This example uses `lucy-2` for video editing with reference image support. You can also use: +This example uses `lucy-2.1` for video editing with reference image support. You can also use: - `lucy-restyle` - MirageLSD video restyling model (older) - `lucy-restyle-2` - MirageLSD v2 for style transformation diff --git a/examples/tanstack-streamer/src/routes/index.tsx b/examples/tanstack-streamer/src/routes/index.tsx index 7b5882e0..1a2ed0eb 100644 --- a/examples/tanstack-streamer/src/routes/index.tsx +++ b/examples/tanstack-streamer/src/routes/index.tsx @@ -19,7 +19,7 @@ function ProducerPage() { const start = useCallback(async () => { try { - const model = models.realtime("lucy-2"); + const model = models.realtime("lucy-2.1"); setStatus("requesting-camera"); const stream = await navigator.mediaDevices.getUserMedia({ @@ -94,7 +94,7 @@ function ProducerPage() {

Producer

- Streams your camera through lucy-2 and generates a subscribe link for viewers. + Streams your camera through lucy-2.1 and generates a subscribe link for viewers.

{status === "idle" && ( diff --git a/examples/ws-signaling-proxy/README.md b/examples/ws-signaling-proxy/README.md index e786586c..bf13467b 100644 --- a/examples/ws-signaling-proxy/README.md +++ b/examples/ws-signaling-proxy/README.md @@ -23,7 +23,7 @@ pnpm dev # starts proxy on ws://localhost:8080 Clients connect to: ``` -ws://localhost:8080/v1/stream?model=lucy_2_rt +ws://localhost:8080/v1/stream?model=lucy-2.1 ``` ## Environment variables diff --git a/examples/ws-signaling-proxy/src/index.ts b/examples/ws-signaling-proxy/src/index.ts index e1253123..4117ea94 100644 --- a/examples/ws-signaling-proxy/src/index.ts +++ b/examples/ws-signaling-proxy/src/index.ts @@ -19,10 +19,10 @@ const server = createServer((_req, res) => { const wss = new WebSocketServer({ server }); wss.on("connection", (clientWs: WebSocket, req) => { - // Accept Decart-style URLs: /v1/stream?api_key=...&model=lucy_2_rt + // Accept Decart-style URLs: /v1/stream?api_key=...&model=lucy-2.1 // The proxy ignores api_key from the client and uses its own. const url = new URL(req.url ?? "/", `http://${req.headers.host}`); - const model = url.searchParams.get("model") ?? "lucy_2_rt"; + const model = url.searchParams.get("model") ?? "lucy-2.1"; console.log(`[proxy] client connected from ${req.url} (model=${model})`); @@ -37,7 +37,7 @@ wss.on("connection", (clientWs: WebSocket, req) => { server.listen(PORT, () => { console.log(`[proxy] listening on ws://localhost:${PORT}`); - console.log(`[proxy] connect with: ws://localhost:${PORT}/?model=lucy_2_rt`); + console.log(`[proxy] connect with: ws://localhost:${PORT}/?model=lucy-2.1`); }); const shutdown = () => { diff --git a/examples/ws-signaling-proxy/test/e2e.ts b/examples/ws-signaling-proxy/test/e2e.ts index 610e6fc0..f08a4f8e 100644 --- a/examples/ws-signaling-proxy/test/e2e.ts +++ b/examples/ws-signaling-proxy/test/e2e.ts @@ -37,7 +37,7 @@ test("e2e: signaling flow through proxy", { timeout: 30_000 }, async (t) => { }); // Connect client - const ws = new WebSocket(`ws://localhost:${port}/v1/stream?model=lucy_2_rt`); + const ws = new WebSocket(`ws://localhost:${port}/v1/stream?model=lucy-2.1`); await new Promise((r, e) => { ws.on("open", r); ws.on("error", e); diff --git a/packages/sdk/AGENTS.md b/packages/sdk/AGENTS.md index 26b40a1d..d4f5bb53 100644 --- a/packages/sdk/AGENTS.md +++ b/packages/sdk/AGENTS.md @@ -66,13 +66,13 @@ - `mirage` - Real-time video restyling model - `mirage_v2` - Real-time video restyling model (v2) - `lucy_v2v_720p_rt` - Real-time video editing model -- `lucy_2_rt` - Real-time video editing model (supports reference image) +- `lucy-2.1` - Real-time video editing model (supports reference image) ### Video Models (Queue API) - `lucy-pro-v2v` - video-to-video (Pro quality) - `lucy-motion` - motion-based image-to-video (trajectory-guided animation) - `lucy-restyle-v2v` - video restyling (video-to-video) -- `lucy-2-v2v` - video-to-video editing (long-form, 720p) +- `lucy-2.1` - video-to-video editing (long-form, 720p) ### Image Models (Process API) - `lucy-pro-i2i` - image-to-image (Pro quality) diff --git a/packages/sdk/index.html b/packages/sdk/index.html index 2d5f9488..4791bef4 100644 --- a/packages/sdk/index.html +++ b/packages/sdk/index.html @@ -238,7 +238,7 @@

Configuration

- +
@@ -527,7 +527,7 @@

Console Logs

// Load initial reference image only when there's an actual prompt let initialImage; - if (promptValue && (model.name === 'lucy_2_rt' || model.name === 'mirage_v2')) { + if (promptValue && (model.name === 'lucy-2.1' || model.name === 'mirage_v2')) { const initialImageResponse = await fetch('./tests/fixtures/image.png'); initialImage = await initialImageResponse.blob(); } diff --git a/packages/sdk/src/process/types.ts b/packages/sdk/src/process/types.ts index f6a591cb..f33505f8 100644 --- a/packages/sdk/src/process/types.ts +++ b/packages/sdk/src/process/types.ts @@ -99,7 +99,7 @@ export interface VideoEditInputs { } /** - * Model-specific input documentation for lucy-2-v2v. + * Model-specific input documentation for Lucy 2.1 video editing models. * Requires prompt (can be empty string). Optional reference_image can also be provided. */ export interface VideoEdit2Inputs { @@ -163,7 +163,7 @@ export type ModelSpecificInputs = T["name"] extends " ? ImageEditingInputs : T["name"] extends "lucy-restyle-v2v" | "lucy-restyle-2" ? VideoRestyleInputs - : T["name"] extends "lucy-2-v2v" | "lucy-2" | "lucy-2.1" | "lucy-2.1-vton" + : T["name"] extends "lucy-2.1" | "lucy-2.1-vton" ? 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 f9dec612..1c702d9c 100644 --- a/packages/sdk/src/shared/model.ts +++ b/packages/sdk/src/shared/model.ts @@ -9,11 +9,9 @@ const MODEL_ALIASES: Record = { mirage: "lucy-restyle", mirage_v2: "lucy-restyle-2", lucy_v2v_720p_rt: "lucy", - lucy_2_rt: "lucy-2", live_avatar: "live-avatar", "lucy-pro-v2v": "lucy-clip", "lucy-restyle-v2v": "lucy-restyle-2", - "lucy-2-v2v": "lucy-2", "lucy-pro-i2i": "lucy-image-2", }; @@ -37,7 +35,6 @@ function warnDeprecated(model: string): void { export const realtimeModels = z.union([ // Canonical names z.literal("lucy"), - z.literal("lucy-2"), z.literal("lucy-2.1"), z.literal("lucy-2.1-vton"), z.literal("lucy-restyle"), @@ -51,13 +48,11 @@ export const realtimeModels = z.union([ z.literal("mirage"), z.literal("mirage_v2"), z.literal("lucy_v2v_720p_rt"), - z.literal("lucy_2_rt"), z.literal("live_avatar"), ]); export const videoModels = z.union([ // Canonical names z.literal("lucy-clip"), - z.literal("lucy-2"), z.literal("lucy-2.1"), z.literal("lucy-2.1-vton"), z.literal("lucy-restyle-2"), @@ -71,7 +66,6 @@ export const videoModels = z.union([ // Deprecated names (use canonical names above instead) z.literal("lucy-pro-v2v"), z.literal("lucy-restyle-v2v"), - z.literal("lucy-2-v2v"), ]); export const imageModels = z.union([ // Canonical name @@ -209,7 +203,6 @@ export const modelInputSchemas = { "lucy-clip": videoEditSchema, "lucy-image-2": imageEditSchema, "lucy-restyle-2": restyleSchema, - "lucy-2": videoEdit2Schema, "lucy-2.1": videoEdit2Schema, "lucy-2.1-vton": videoEdit2Schema, "lucy-motion": z.object({ @@ -258,7 +251,6 @@ export const modelInputSchemas = { "lucy-pro-v2v": videoEditSchema, "lucy-pro-i2i": imageEditSchema, "lucy-restyle-v2v": restyleSchema, - "lucy-2-v2v": videoEdit2Schema, } as const; export type ModelInputSchemas = typeof modelInputSchemas; @@ -317,14 +309,6 @@ const _models = { height: 704, inputSchema: z.object({}), }, - "lucy-2": { - urlPath: "/v1/stream", - name: "lucy-2" as const, - fps: 20, - width: 1088, - height: 624, - inputSchema: z.object({}), - }, "lucy-2.1": { urlPath: "/v1/stream", name: "lucy-2.1" as const, @@ -415,14 +399,6 @@ const _models = { height: 704, inputSchema: z.object({}), }, - lucy_2_rt: { - urlPath: "/v1/stream", - name: "lucy_2_rt" as const, - fps: 20, - width: 1088, - height: 624, - inputSchema: z.object({}), - }, live_avatar: { urlPath: "/v1/stream", name: "live_avatar" as const, @@ -475,15 +451,6 @@ const _models = { height: 704, inputSchema: modelInputSchemas["lucy-clip"], }, - "lucy-2": { - urlPath: "/v1/generate/lucy-2", - queueUrlPath: "/v1/jobs/lucy-2", - name: "lucy-2" as const, - fps: 20, - width: 1280, - height: 720, - inputSchema: modelInputSchemas["lucy-2"], - }, "lucy-2.1": { urlPath: "/v1/generate/lucy-2.1", queueUrlPath: "/v1/jobs/lucy-2.1", @@ -585,15 +552,6 @@ const _models = { height: 704, inputSchema: modelInputSchemas["lucy-restyle-v2v"], }, - "lucy-2-v2v": { - urlPath: "/v1/generate/lucy-2-v2v", - queueUrlPath: "/v1/jobs/lucy-2-v2v", - name: "lucy-2-v2v" as const, - fps: 20, - width: 1280, - height: 720, - inputSchema: modelInputSchemas["lucy-2-v2v"], - }, }, } as const; @@ -602,7 +560,6 @@ export const models = { * Get a realtime streaming model identifier. * * Available options: - * - `"lucy-2"` - Lucy 2 realtime video editing (720p) * - `"lucy-2.1"` - Lucy 2.1 realtime video editing * - `"lucy-2.1-vton"` - Lucy 2.1 virtual try-on * - `"lucy-restyle-2"` - Realtime video restyling @@ -623,7 +580,6 @@ export const models = { * * Available options: * - `"lucy-clip"` - Video-to-video editing - * - `"lucy-2"` - Long-form video editing (720p) * - `"lucy-2.1"` - Long-form video editing (Lucy 2.1) * - `"lucy-2.1-vton"` - Virtual try-on video editing * - `"lucy-restyle-2"` - Video restyling diff --git a/packages/sdk/tests/e2e-realtime.test.ts b/packages/sdk/tests/e2e-realtime.test.ts index d8464cd3..7c4aa1fa 100644 --- a/packages/sdk/tests/e2e-realtime.test.ts +++ b/packages/sdk/tests/e2e-realtime.test.ts @@ -15,14 +15,12 @@ const REALTIME_MODELS: RealTimeModels[] = [ "lucy-restyle", "lucy-restyle-2", "lucy", - "lucy-2", "lucy-2.1", "lucy-2.1-vton", // Deprecated names "mirage", "mirage_v2", "lucy_v2v_720p_rt", - "lucy_2_rt", ]; const TIMEOUT = 1 * 60 * 1000; // 1 minute diff --git a/packages/sdk/tests/e2e.test.ts b/packages/sdk/tests/e2e.test.ts index a146d5bf..1a6ecf25 100644 --- a/packages/sdk/tests/e2e.test.ts +++ b/packages/sdk/tests/e2e.test.ts @@ -154,41 +154,6 @@ describe.concurrent("E2E Tests", { timeout: TIMEOUT, retry: 2 }, () => { await expectResult(result, "lucy-restyle-2-reference_image", ".mp4"); }); - it("lucy-2: video editing (prompt)", async () => { - const result = await client.queue.submitAndPoll({ - model: models.video("lucy-2"), - prompt: "Watercolor painting style with soft brushstrokes", - data: videoBlob, - seed: 42, - }); - - await expectResult(result, "lucy-2-prompt", ".mp4"); - }); - - it("lucy-2: video editing (reference_image)", async () => { - const result = await client.queue.submitAndPoll({ - model: models.video("lucy-2"), - prompt: "", - reference_image: imageBlob, - data: videoBlob, - seed: 42, - }); - - await expectResult(result, "lucy-2-reference_image", ".mp4"); - }); - - it("lucy-2: video editing (prompt + reference_image)", async () => { - const result = await client.queue.submitAndPoll({ - model: models.video("lucy-2"), - prompt: "Watercolor painting style", - reference_image: imageBlob, - data: videoBlob, - seed: 42, - }); - - await expectResult(result, "lucy-2-both", ".mp4"); - }); - it("lucy-2.1: video editing (prompt)", async () => { const result = await client.queue.submitAndPoll({ model: models.video("lucy-2.1"), @@ -259,17 +224,6 @@ describe.concurrent("E2E Tests", { timeout: TIMEOUT, retry: 2 }, () => { await expectResult(result, "lucy-restyle-v2v", ".mp4"); }); - it("lucy-2-v2v (deprecated): video editing", async () => { - const result = await client.queue.submitAndPoll({ - model: models.video("lucy-2-v2v"), - prompt: "Watercolor painting style with soft brushstrokes", - data: videoBlob, - seed: 42, - }); - - await expectResult(result, "lucy-2-v2v", ".mp4"); - }); - // Latest aliases (server-side resolution) it("lucy-latest: video editing", async () => { const result = await client.queue.submitAndPoll({ diff --git a/packages/sdk/tests/unit.test.ts b/packages/sdk/tests/unit.test.ts index b8536062..9c8a49a1 100644 --- a/packages/sdk/tests/unit.test.ts +++ b/packages/sdk/tests/unit.test.ts @@ -501,9 +501,9 @@ describe("Queue API", () => { ).rejects.toThrow("'enhance_prompt' is only valid when using 'prompt', not 'reference_image'"); }); - it("submits lucy-2-v2v job with prompt", async () => { + it("submits lucy-2.1 job with prompt", async () => { server.use( - http.post("http://localhost/v1/jobs/lucy-2-v2v", async ({ request }) => { + http.post("http://localhost/v1/jobs/lucy-2.1", async ({ request }) => { lastRequest = request; lastFormData = await request.formData(); return HttpResponse.json({ @@ -516,7 +516,7 @@ describe("Queue API", () => { const testBlob = new Blob(["test-video"], { type: "video/mp4" }); const result = await decart.queue.submit({ - model: models.video("lucy-2-v2v"), + model: models.video("lucy-2.1"), prompt: "Transform the scene", data: testBlob, enhance_prompt: true, @@ -533,9 +533,9 @@ describe("Queue API", () => { expect(dataFile).toBeInstanceOf(File); }); - it("submits lucy-2-v2v job with empty prompt and reference_image", async () => { + it("submits lucy-2.1 job with empty prompt and reference_image", async () => { server.use( - http.post("http://localhost/v1/jobs/lucy-2-v2v", async ({ request }) => { + http.post("http://localhost/v1/jobs/lucy-2.1", async ({ request }) => { lastRequest = request; lastFormData = await request.formData(); return HttpResponse.json({ @@ -549,7 +549,7 @@ describe("Queue API", () => { const testImageBlob = new Blob(["test-image"], { type: "image/png" }); const result = await decart.queue.submit({ - model: models.video("lucy-2-v2v"), + model: models.video("lucy-2.1"), prompt: "", data: testVideoBlob, reference_image: testImageBlob, @@ -566,9 +566,9 @@ describe("Queue API", () => { expect(refImageFile).toBeInstanceOf(File); }); - it("submits lucy-2-v2v job with reference_image", async () => { + it("submits lucy-2.1 job with reference_image", async () => { server.use( - http.post("http://localhost/v1/jobs/lucy-2-v2v", async ({ request }) => { + http.post("http://localhost/v1/jobs/lucy-2.1", async ({ request }) => { lastRequest = request; lastFormData = await request.formData(); return HttpResponse.json({ @@ -582,7 +582,7 @@ describe("Queue API", () => { const testImageBlob = new Blob(["test-image"], { type: "image/png" }); const result = await decart.queue.submit({ - model: models.video("lucy-2-v2v"), + model: models.video("lucy-2.1"), prompt: "Transform the scene", data: testVideoBlob, reference_image: testImageBlob, @@ -601,10 +601,10 @@ describe("Queue API", () => { expect(refImageFile).toBeInstanceOf(File); }); - it("validates required data input for lucy-2-v2v", async () => { + it("validates required data input for lucy-2.1", async () => { await expect( decart.queue.submit({ - model: models.video("lucy-2-v2v"), + model: models.video("lucy-2.1"), prompt: "test", // biome-ignore lint/suspicious/noExplicitAny: testing invalid input } as any), @@ -1126,31 +1126,31 @@ describe("Tokens API", () => { }); }); -describe("Lucy 2 realtime", () => { +describe("Lucy 2.1 realtime", () => { describe("Model Definition", () => { it("has correct model name", () => { - const lucyModel = models.realtime("lucy_2_rt"); - expect(lucyModel.name).toBe("lucy_2_rt"); + const lucyModel = models.realtime("lucy-2.1"); + expect(lucyModel.name).toBe("lucy-2.1"); }); it("has correct URL path", () => { - const lucyModel = models.realtime("lucy_2_rt"); + const lucyModel = models.realtime("lucy-2.1"); expect(lucyModel.urlPath).toBe("/v1/stream"); }); it("has expected dimensions", () => { - const lucyModel = models.realtime("lucy_2_rt"); + const lucyModel = models.realtime("lucy-2.1"); expect(lucyModel.width).toBe(1088); expect(lucyModel.height).toBe(624); }); it("has correct fps", () => { - const lucyModel = models.realtime("lucy_2_rt"); + const lucyModel = models.realtime("lucy-2.1"); expect(lucyModel.fps).toBe(20); }); it("is recognized as a realtime model", () => { - expect(models.realtime("lucy_2_rt")).toBeDefined(); + expect(models.realtime("lucy-2.1")).toBeDefined(); }); }); }); @@ -3415,15 +3415,6 @@ describe("Canonical Model Names", () => { expect(model.height).toBe(704); }); - it("lucy-2 canonical name works", () => { - const model = models.realtime("lucy-2"); - expect(model.name).toBe("lucy-2"); - expect(model.urlPath).toBe("/v1/stream"); - expect(model.fps).toBe(20); - expect(model.width).toBe(1088); - expect(model.height).toBe(624); - }); - it("lucy-2.1 canonical name works", () => { const model = models.realtime("lucy-2.1"); expect(model.name).toBe("lucy-2.1"); @@ -3472,19 +3463,12 @@ describe("Canonical Model Names", () => { expect(model.fps).toBe(25); }); - it("lucy-2 as video model works", () => { - const model = models.video("lucy-2"); - expect(model.name).toBe("lucy-2"); - expect(model.urlPath).toBe("/v1/generate/lucy-2"); - expect(model.queueUrlPath).toBe("/v1/jobs/lucy-2"); - expect(model.fps).toBe(20); - }); - it("lucy-2.1 as video model works", () => { const model = models.video("lucy-2.1"); expect(model.name).toBe("lucy-2.1"); expect(model.urlPath).toBe("/v1/generate/lucy-2.1"); expect(model.queueUrlPath).toBe("/v1/jobs/lucy-2.1"); + expect(model.fps).toBe(20); }); it("lucy-2.1-vton as video model works", () => { @@ -3625,11 +3609,6 @@ describe("Canonical Model Names", () => { }); describe("Dual-surface models", () => { - it("lucy-2 is both a realtime and video model", () => { - expect(isRealtimeModel("lucy-2")).toBe(true); - expect(isVideoModel("lucy-2")).toBe(true); - }); - it("lucy-2.1 is both a realtime and video model", () => { expect(isRealtimeModel("lucy-2.1")).toBe(true); expect(isVideoModel("lucy-2.1")).toBe(true); @@ -3647,11 +3626,6 @@ describe("Canonical Model Names", () => { }); describe("Deprecated names still work", () => { - it("lucy_2_rt still works as realtime model", () => { - const model = models.realtime("lucy_2_rt"); - expect(model.name).toBe("lucy_2_rt"); - }); - it("mirage_v2 still works as realtime model", () => { const model = models.realtime("mirage_v2"); expect(model.name).toBe("mirage_v2");