Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,6 @@ 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 2 | `RealtimeModels.LUCY_VTON_2` | 1088x624 | 30 |
| Lucy VTON 3 | `RealtimeModels.LUCY_VTON_3` | 1088x624 | 30 |
| Lucy VTON 3.5 | `RealtimeModels.LUCY_VTON_3_5` | 1280x720 | 30 |
| Lucy Restyle 2 | `RealtimeModels.LUCY_RESTYLE_2` | 1280x704 | 30 |

Expand All @@ -309,14 +307,12 @@ client.queue.submit(VideoModels.LUCY_RESTYLE_2, restyle)
| Lucy Clip | `VideoModels.LUCY_CLIP` | `/v1/jobs/lucy-clip` | 1280x704 | 25 |
| 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 2 | `VideoModels.LUCY_VTON_2` | `/v1/jobs/lucy-vton-2` | 1088x624 | 20 |
| Lucy VTON 3 | `VideoModels.LUCY_VTON_3` | `/v1/jobs/lucy-vton-3` | 1088x624 | 20 |
| Lucy VTON 3.5 | `VideoModels.LUCY_VTON_3_5` | `/v1/jobs/lucy-vton-3.5` | 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-2`, `lucy-vton-3`, `lucy-vton-3.5`, `lucy-clip`)
- `VideoEditInput` (`lucy-2.1`, `lucy-2.5`, `lucy-vton-3.5`, `lucy-clip`)
- `VideoRestyleInput` (`lucy-restyle-2`)

## API Reference
Expand Down
13 changes: 1 addition & 12 deletions sdk/src/main/java/ai/decart/sdk/RealtimeModels.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ object RealtimeModels {
// Canonical models
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)
val LUCY_VTON_2 = RealtimeModel("lucy-vton-2", "/v1/stream", 30, 1088, 624)
val LUCY_VTON_3 = RealtimeModel("lucy-vton-3", "/v1/stream", 30, 1088, 624)
val LUCY_VTON_3_5 = RealtimeModel("lucy-vton-3.5", "/v1/stream", 30, 1280, 720)
val LUCY_RESTYLE_2 = RealtimeModel("lucy-restyle-2", "/v1/stream", 30, 1280, 704)

Expand All @@ -22,32 +20,23 @@ object RealtimeModels {
val LUCY_VTON_LATEST = RealtimeModel("lucy-vton-latest", "/v1/stream", 30, 1280, 720)
val LUCY_RESTYLE_LATEST = RealtimeModel("lucy-restyle-latest", "/v1/stream", 30, 1280, 704)

// Deprecated models (old names, still work on the API)
@Deprecated("Use LUCY_VTON_2 instead", replaceWith = ReplaceWith("LUCY_VTON_2"))
val LUCY_2_1_VTON_2 = RealtimeModel("lucy-2.1-vton-2", "/v1/stream", 30, 1088, 624)

/** Get model by name, or null if not found */
@Suppress("DEPRECATION")
fun fromName(name: String): RealtimeModel? = when (name) {
// Canonical names
"lucy-2.1" -> LUCY_2_1
"lucy-2.5" -> LUCY_2_5
"lucy-vton-2" -> LUCY_VTON_2
"lucy-vton-3" -> LUCY_VTON_3
"lucy-vton-3.5" -> LUCY_VTON_3_5
"lucy-restyle-2" -> LUCY_RESTYLE_2
// Latest aliases
"lucy-latest" -> LUCY_LATEST
"lucy-vton-latest" -> LUCY_VTON_LATEST
"lucy-restyle-latest" -> LUCY_RESTYLE_LATEST
// Deprecated names
"lucy-2.1-vton-2" -> LUCY_2_1_VTON_2
else -> null
}

/** All available realtime models (canonical only) */
val all: List<RealtimeModel> = listOf(
LUCY_2_1, LUCY_2_5, LUCY_VTON_2, LUCY_VTON_3, LUCY_VTON_3_5, LUCY_RESTYLE_2,
LUCY_2_1, LUCY_2_5, LUCY_VTON_3_5, LUCY_RESTYLE_2,
LUCY_LATEST, LUCY_VTON_LATEST, LUCY_RESTYLE_LATEST,
)
}
17 changes: 3 additions & 14 deletions sdk/src/main/java/ai/decart/sdk/VideoModels.kt
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,7 @@ object VideoModels {
/** Lucy 2.5 video editing with optional reference image. Output: 1280x720, 20fps. */
val LUCY_2_5 = VideoModel("lucy-2.5", "/v1/jobs/lucy-2.5", 20, 1280, 720, ModelInputType.VIDEO_EDIT)

/** Lucy virtual try-on video editing. Output: 1088x624, 20fps. */
val LUCY_VTON_2 = VideoModel("lucy-vton-2", "/v1/jobs/lucy-vton-2", 20, 1088, 624, ModelInputType.VIDEO_EDIT)

/** Lucy virtual try-on 3 video editing. Output: 1088x624, 20fps. */
val LUCY_VTON_3 = VideoModel("lucy-vton-3", "/v1/jobs/lucy-vton-3", 20, 1088, 624, ModelInputType.VIDEO_EDIT)

/** Lucy virtual try-on 3.5 video editing. Output: 1088x624, 20fps. */
/** 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)

/** Video restyling with prompt or reference image. Output: 1280x704, 22fps. */
Expand All @@ -75,9 +69,6 @@ object VideoModels {
@Deprecated("Use LUCY_RESTYLE_2 instead", replaceWith = ReplaceWith("LUCY_RESTYLE_2"))
val LUCY_RESTYLE_V2V = VideoModel("lucy-restyle-v2v", "/v1/jobs/lucy-restyle-v2v", 22, 1280, 704, ModelInputType.VIDEO_RESTYLE)

@Deprecated("Use LUCY_VTON_2 instead", replaceWith = ReplaceWith("LUCY_VTON_2"))
val LUCY_2_1_VTON_2 = VideoModel("lucy-2.1-vton-2", "/v1/jobs/lucy-2.1-vton-2", 20, 1088, 624, ModelInputType.VIDEO_EDIT)

/** Get model by name, or null if not found */
fun fromName(name: String): VideoModel? = allIncludingDeprecated.find { it.name == name }

Expand All @@ -86,8 +77,6 @@ object VideoModels {
LUCY_CLIP,
LUCY_2_1,
LUCY_2_5,
LUCY_VTON_2,
LUCY_VTON_3,
LUCY_VTON_3_5,
LUCY_RESTYLE_2,
LUCY_LATEST,
Expand All @@ -99,8 +88,8 @@ object VideoModels {
/** All models including deprecated names */
@Suppress("DEPRECATION")
val allIncludingDeprecated: List<VideoModel> = listOf(
LUCY_CLIP, LUCY_2_1, LUCY_2_5, LUCY_VTON_2, LUCY_VTON_3, LUCY_VTON_3_5, LUCY_RESTYLE_2,
LUCY_CLIP, LUCY_2_1, LUCY_2_5, LUCY_VTON_3_5, LUCY_RESTYLE_2,
LUCY_LATEST, LUCY_VTON_LATEST, LUCY_RESTYLE_LATEST, LUCY_CLIP_LATEST,
LUCY_PRO_V2V, LUCY_RESTYLE_V2V, LUCY_2_1_VTON_2,
LUCY_PRO_V2V, LUCY_RESTYLE_V2V,
)
}
11 changes: 1 addition & 10 deletions sdk/src/test/java/ai/decart/sdk/RealtimeModelsTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@ class RealtimeModelsTest {

@Test
fun `all models have correct count`() {
assertEquals(9, RealtimeModels.all.size)
assertEquals(7, RealtimeModels.all.size)
}

@Test
fun `fromName returns correct model for canonical names`() {
assertEquals(RealtimeModels.LUCY_2_1, RealtimeModels.fromName("lucy-2.1"))
assertEquals(RealtimeModels.LUCY_2_5, RealtimeModels.fromName("lucy-2.5"))
assertEquals(RealtimeModels.LUCY_VTON_2, RealtimeModels.fromName("lucy-vton-2"))
assertEquals(RealtimeModels.LUCY_VTON_3, RealtimeModels.fromName("lucy-vton-3"))
assertEquals(RealtimeModels.LUCY_VTON_3_5, RealtimeModels.fromName("lucy-vton-3.5"))
assertEquals(RealtimeModels.LUCY_RESTYLE_2, RealtimeModels.fromName("lucy-restyle-2"))
}
Expand All @@ -27,11 +25,6 @@ class RealtimeModelsTest {
assertEquals(RealtimeModels.LUCY_RESTYLE_LATEST, RealtimeModels.fromName("lucy-restyle-latest"))
}

@Test
fun `fromName returns correct model for deprecated names`() {
assertNotNull(RealtimeModels.fromName("lucy-2.1-vton-2"))
}

@Test
fun `fromName returns null for unknown`() {
assertNull(RealtimeModels.fromName("nonexistent_model"))
Expand Down Expand Up @@ -61,8 +54,6 @@ class RealtimeModelsTest {

listOf(
RealtimeModels.LUCY_2_1,
RealtimeModels.LUCY_VTON_2,
RealtimeModels.LUCY_VTON_3,
RealtimeModels.LUCY_LATEST,
).forEach { model ->
assertEquals("${model.name} width", expectedWidth, model.width)
Expand Down
28 changes: 6 additions & 22 deletions sdk/src/test/java/ai/decart/sdk/VideoModelsTest.kt
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
package ai.decart.sdk

import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Test

class VideoModelsTest {
@Test
fun `video models match JS SDK registry`() {
assertEquals(11, VideoModels.all.size)
assertEquals(VideoModels.LUCY_VTON_2, VideoModels.fromName("lucy-vton-2"))
assertEquals(20, VideoModels.LUCY_VTON_2.fps)
assertEquals(1088, VideoModels.LUCY_VTON_2.width)
assertEquals(624, VideoModels.LUCY_VTON_2.height)
assertEquals(ModelInputType.VIDEO_EDIT, VideoModels.LUCY_VTON_2.inputType)
assertEquals(9, 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)
assertEquals(624, VideoModels.LUCY_2_1.height)
assertEquals(ModelInputType.VIDEO_EDIT, VideoModels.LUCY_2_1.inputType)
}

@Test
Expand All @@ -25,16 +24,6 @@ class VideoModelsTest {
assertEquals(ModelInputType.VIDEO_EDIT, VideoModels.LUCY_2_5.inputType)
}

@Test
fun `lucy-vton-3 matches JS SDK registry`() {
assertEquals(VideoModels.LUCY_VTON_3, VideoModels.fromName("lucy-vton-3"))
assertEquals("/v1/jobs/lucy-vton-3", VideoModels.LUCY_VTON_3.jobsUrlPath)
assertEquals(20, VideoModels.LUCY_VTON_3.fps)
assertEquals(1088, VideoModels.LUCY_VTON_3.width)
assertEquals(624, VideoModels.LUCY_VTON_3.height)
assertEquals(ModelInputType.VIDEO_EDIT, VideoModels.LUCY_VTON_3.inputType)
}

@Test
fun `lucy-vton-3_5 matches JS SDK registry`() {
assertEquals(VideoModels.LUCY_VTON_3_5, VideoModels.fromName("lucy-vton-3.5"))
Expand All @@ -44,9 +33,4 @@ class VideoModelsTest {
assertEquals(720, VideoModels.LUCY_VTON_3_5.height)
assertEquals(ModelInputType.VIDEO_EDIT, VideoModels.LUCY_VTON_3_5.inputType)
}

@Test
fun `deprecated vton aliases are available`() {
assertNotNull(VideoModels.fromName("lucy-2.1-vton-2"))
}
}