diff --git a/README.md b/README.md index e62df9e..e4b00e4 100644 --- a/README.md +++ b/README.md @@ -316,6 +316,7 @@ client.queue.submit(VideoModels.LUCY_RESTYLE_2, restyle) | Lucy 2.1 | `RealtimeModels.LUCY_2_1` | 1088x624 | 30 | | Lucy 2.5 | `RealtimeModels.LUCY_2_5` | 1280x720 | 30 | | Lucy VTON 3.5 | `RealtimeModels.LUCY_VTON_3_5` | 1280x720 | 30 | +| Lucy VTON 3.6 | `RealtimeModels.LUCY_VTON_3_6` | 1280x720 | 30 | | Lucy Restyle 2 | `RealtimeModels.LUCY_RESTYLE_2` | 1280x704 | 30 | ### Batch Video Models @@ -326,11 +327,12 @@ client.queue.submit(VideoModels.LUCY_RESTYLE_2, restyle) | Lucy 2.1 | `VideoModels.LUCY_2_1` | `/v1/jobs/lucy-2.1` | 1088x624 | 20 | | Lucy 2.5 | `VideoModels.LUCY_2_5` | `/v1/jobs/lucy-2.5` | 1280x720 | 20 | | Lucy VTON 3.5 | `VideoModels.LUCY_VTON_3_5` | `/v1/jobs/lucy-vton-3.5` | 1280x720 | 20 | +| Lucy VTON 3.6 | `VideoModels.LUCY_VTON_3_6` | `/v1/jobs/lucy-vton-3.6` | 1280x720 | 20 | | Lucy Restyle 2 | `VideoModels.LUCY_RESTYLE_2` | `/v1/jobs/lucy-restyle-2` | 1280x704 | 22 | Typed input helpers: -- `VideoEditInput` (`lucy-2.1`, `lucy-2.5`, `lucy-vton-3.5`, `lucy-clip`) +- `VideoEditInput` (`lucy-2.1`, `lucy-2.5`, `lucy-vton-3.5`, `lucy-vton-3.6`, `lucy-clip`) - `VideoRestyleInput` (`lucy-restyle-2`) ## API Reference diff --git a/sdk/src/main/java/ai/decart/sdk/RealtimeModels.kt b/sdk/src/main/java/ai/decart/sdk/RealtimeModels.kt index dc71407..b404d54 100644 --- a/sdk/src/main/java/ai/decart/sdk/RealtimeModels.kt +++ b/sdk/src/main/java/ai/decart/sdk/RealtimeModels.kt @@ -21,6 +21,8 @@ object RealtimeModels { val LUCY_2_1 = RealtimeModel("lucy-2.1", "/v1/stream", 30, 1088, 624) val LUCY_2_5 = RealtimeModel("lucy-2.5", "/v1/stream", 30, 1280, 720, setOf(Speed.FAST)) val LUCY_VTON_3_5 = RealtimeModel("lucy-vton-3.5", "/v1/stream", 30, 1280, 720, setOf(Speed.FAST)) + + val LUCY_VTON_3_6 = RealtimeModel("lucy-vton-3.6", "/v1/stream", 30, 1280, 720) val LUCY_RESTYLE_2 = RealtimeModel("lucy-restyle-2", "/v1/stream", 30, 1280, 704) // Latest aliases (server-side resolution) @@ -34,6 +36,7 @@ object RealtimeModels { "lucy-2.1" -> LUCY_2_1 "lucy-2.5" -> LUCY_2_5 "lucy-vton-3.5" -> LUCY_VTON_3_5 + "lucy-vton-3.6" -> LUCY_VTON_3_6 "lucy-restyle-2" -> LUCY_RESTYLE_2 // Latest aliases "lucy-latest" -> LUCY_LATEST @@ -44,7 +47,7 @@ object RealtimeModels { /** All available realtime models (canonical only) */ val all: List = listOf( - LUCY_2_1, LUCY_2_5, LUCY_VTON_3_5, LUCY_RESTYLE_2, + LUCY_2_1, LUCY_2_5, LUCY_VTON_3_5, LUCY_VTON_3_6, LUCY_RESTYLE_2, LUCY_LATEST, LUCY_VTON_LATEST, LUCY_RESTYLE_LATEST, ) } diff --git a/sdk/src/main/java/ai/decart/sdk/VideoModels.kt b/sdk/src/main/java/ai/decart/sdk/VideoModels.kt index 93817d9..cdee6e1 100644 --- a/sdk/src/main/java/ai/decart/sdk/VideoModels.kt +++ b/sdk/src/main/java/ai/decart/sdk/VideoModels.kt @@ -53,6 +53,9 @@ object VideoModels { /** Lucy virtual try-on 3.5 video editing. Output: 1280x720, 20fps. */ val LUCY_VTON_3_5 = VideoModel("lucy-vton-3.5", "/v1/jobs/lucy-vton-3.5", 20, 1280, 720, ModelInputType.VIDEO_EDIT) + /** Lucy virtual try-on 3.6 video editing. Output: 1280x720, 20fps. */ + val LUCY_VTON_3_6 = VideoModel("lucy-vton-3.6", "/v1/jobs/lucy-vton-3.6", 20, 1280, 720, ModelInputType.VIDEO_EDIT) + /** Video restyling with prompt or reference image. Output: 1280x704, 22fps. */ val LUCY_RESTYLE_2 = VideoModel("lucy-restyle-2", "/v1/jobs/lucy-restyle-2", 22, 1280, 704, ModelInputType.VIDEO_RESTYLE) @@ -78,6 +81,7 @@ object VideoModels { LUCY_2_1, LUCY_2_5, LUCY_VTON_3_5, + LUCY_VTON_3_6, LUCY_RESTYLE_2, LUCY_LATEST, LUCY_VTON_LATEST, @@ -88,7 +92,7 @@ object VideoModels { /** All models including deprecated names */ @Suppress("DEPRECATION") val allIncludingDeprecated: List = listOf( - LUCY_CLIP, LUCY_2_1, LUCY_2_5, LUCY_VTON_3_5, LUCY_RESTYLE_2, + LUCY_CLIP, LUCY_2_1, LUCY_2_5, LUCY_VTON_3_5, LUCY_VTON_3_6, LUCY_RESTYLE_2, LUCY_LATEST, LUCY_VTON_LATEST, LUCY_RESTYLE_LATEST, LUCY_CLIP_LATEST, LUCY_PRO_V2V, LUCY_RESTYLE_V2V, ) diff --git a/sdk/src/test/java/ai/decart/sdk/RealtimeModelsTest.kt b/sdk/src/test/java/ai/decart/sdk/RealtimeModelsTest.kt index b3db3d0..d2f87f8 100644 --- a/sdk/src/test/java/ai/decart/sdk/RealtimeModelsTest.kt +++ b/sdk/src/test/java/ai/decart/sdk/RealtimeModelsTest.kt @@ -8,7 +8,7 @@ class RealtimeModelsTest { @Test fun `all models have correct count`() { - assertEquals(7, RealtimeModels.all.size) + assertEquals(8, RealtimeModels.all.size) } @Test @@ -16,6 +16,7 @@ class RealtimeModelsTest { assertEquals(RealtimeModels.LUCY_2_1, RealtimeModels.fromName("lucy-2.1")) assertEquals(RealtimeModels.LUCY_2_5, RealtimeModels.fromName("lucy-2.5")) assertEquals(RealtimeModels.LUCY_VTON_3_5, RealtimeModels.fromName("lucy-vton-3.5")) + assertEquals(RealtimeModels.LUCY_VTON_3_6, RealtimeModels.fromName("lucy-vton-3.6")) assertEquals(RealtimeModels.LUCY_RESTYLE_2, RealtimeModels.fromName("lucy-restyle-2")) } @@ -74,6 +75,12 @@ class RealtimeModelsTest { assertEquals(720, RealtimeModels.LUCY_VTON_3_5.height) } + @Test + fun `lucy vton 3_6 outputs 720p`() { + assertEquals(1280, RealtimeModels.LUCY_VTON_3_6.width) + assertEquals(720, RealtimeModels.LUCY_VTON_3_6.height) + } + // lucy-vton-latest resolves server-side to lucy-vton-3.5, so it shares its 720p geometry. @Test fun `lucy vton latest outputs 720p`() { diff --git a/sdk/src/test/java/ai/decart/sdk/VideoModelsTest.kt b/sdk/src/test/java/ai/decart/sdk/VideoModelsTest.kt index e85be96..69aa33e 100644 --- a/sdk/src/test/java/ai/decart/sdk/VideoModelsTest.kt +++ b/sdk/src/test/java/ai/decart/sdk/VideoModelsTest.kt @@ -6,7 +6,7 @@ import org.junit.Test class VideoModelsTest { @Test fun `video models match JS SDK registry`() { - assertEquals(9, VideoModels.all.size) + assertEquals(10, VideoModels.all.size) assertEquals(VideoModels.LUCY_2_1, VideoModels.fromName("lucy-2.1")) assertEquals(20, VideoModels.LUCY_2_1.fps) assertEquals(1088, VideoModels.LUCY_2_1.width) @@ -33,4 +33,14 @@ class VideoModelsTest { assertEquals(720, VideoModels.LUCY_VTON_3_5.height) assertEquals(ModelInputType.VIDEO_EDIT, VideoModels.LUCY_VTON_3_5.inputType) } + + @Test + fun `lucy-vton-3_6 matches JS SDK registry`() { + assertEquals(VideoModels.LUCY_VTON_3_6, VideoModels.fromName("lucy-vton-3.6")) + assertEquals("/v1/jobs/lucy-vton-3.6", VideoModels.LUCY_VTON_3_6.jobsUrlPath) + assertEquals(20, VideoModels.LUCY_VTON_3_6.fps) + assertEquals(1280, VideoModels.LUCY_VTON_3_6.width) + assertEquals(720, VideoModels.LUCY_VTON_3_6.height) + assertEquals(ModelInputType.VIDEO_EDIT, VideoModels.LUCY_VTON_3_6.inputType) + } }