Skip to content

Commit 5a0c5e5

Browse files
committed
feat: add -latest model aliases for server-side resolution
Add lucy-latest, lucy-vton-latest, lucy-restyle-latest, lucy-clip-latest, lucy-motion-latest, and lucy-image-latest convenience aliases that always point to the current latest version of each model family. These are resolved server-side, so the SDK passes them through with no deprecation warnings.
1 parent c999638 commit 5a0c5e5

2 files changed

Lines changed: 147 additions & 0 deletions

File tree

decart/models.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
"lucy-restyle",
1515
"lucy-restyle-2",
1616
"live-avatar",
17+
# Latest aliases (server-side resolution)
18+
"lucy-latest",
19+
"lucy-vton-latest",
20+
"lucy-restyle-latest",
1721
# Deprecated names
1822
"mirage",
1923
"mirage_v2",
@@ -28,6 +32,11 @@
2832
"lucy-2.1",
2933
"lucy-restyle-2",
3034
"lucy-motion",
35+
# Latest aliases (server-side resolution)
36+
"lucy-latest",
37+
"lucy-restyle-latest",
38+
"lucy-clip-latest",
39+
"lucy-motion-latest",
3140
# Deprecated names
3241
"lucy-pro-v2v",
3342
"lucy-restyle-v2v",
@@ -36,6 +45,8 @@
3645
ImageModels = Literal[
3746
# Canonical names
3847
"lucy-image-2",
48+
# Latest alias (server-side resolution)
49+
"lucy-image-latest",
3950
# Deprecated names
4051
"lucy-pro-i2i",
4152
]
@@ -236,6 +247,31 @@ class ImageToImageInput(DecartBaseModel):
236247
height=720,
237248
input_schema=BaseModel,
238249
),
250+
# Latest aliases (server-side resolution)
251+
"lucy-latest": ModelDefinition(
252+
name="lucy-latest",
253+
url_path="/v1/stream",
254+
fps=20,
255+
width=1088,
256+
height=624,
257+
input_schema=BaseModel,
258+
),
259+
"lucy-vton-latest": ModelDefinition(
260+
name="lucy-vton-latest",
261+
url_path="/v1/stream",
262+
fps=20,
263+
width=1088,
264+
height=624,
265+
input_schema=BaseModel,
266+
),
267+
"lucy-restyle-latest": ModelDefinition(
268+
name="lucy-restyle-latest",
269+
url_path="/v1/stream",
270+
fps=22,
271+
width=1280,
272+
height=704,
273+
input_schema=BaseModel,
274+
),
239275
# Deprecated names
240276
"mirage": ModelDefinition(
241277
name="mirage",
@@ -320,6 +356,39 @@ class ImageToImageInput(DecartBaseModel):
320356
height=704,
321357
input_schema=ImageToMotionVideoInput,
322358
),
359+
# Latest aliases (server-side resolution)
360+
"lucy-latest": ModelDefinition(
361+
name="lucy-latest",
362+
url_path="/v1/jobs/lucy-latest",
363+
fps=20,
364+
width=1088,
365+
height=624,
366+
input_schema=VideoEdit2Input,
367+
),
368+
"lucy-restyle-latest": ModelDefinition(
369+
name="lucy-restyle-latest",
370+
url_path="/v1/jobs/lucy-restyle-latest",
371+
fps=22,
372+
width=1280,
373+
height=704,
374+
input_schema=VideoRestyleInput,
375+
),
376+
"lucy-clip-latest": ModelDefinition(
377+
name="lucy-clip-latest",
378+
url_path="/v1/jobs/lucy-clip-latest",
379+
fps=25,
380+
width=1280,
381+
height=704,
382+
input_schema=VideoToVideoInput,
383+
),
384+
"lucy-motion-latest": ModelDefinition(
385+
name="lucy-motion-latest",
386+
url_path="/v1/jobs/lucy-motion-latest",
387+
fps=25,
388+
width=1280,
389+
height=704,
390+
input_schema=ImageToMotionVideoInput,
391+
),
323392
# Deprecated names
324393
"lucy-pro-v2v": ModelDefinition(
325394
name="lucy-pro-v2v",
@@ -356,6 +425,15 @@ class ImageToImageInput(DecartBaseModel):
356425
height=704,
357426
input_schema=ImageToImageInput,
358427
),
428+
# Latest alias (server-side resolution)
429+
"lucy-image-latest": ModelDefinition(
430+
name="lucy-image-latest",
431+
url_path="/v1/generate/lucy-image-latest",
432+
fps=25,
433+
width=1280,
434+
height=704,
435+
input_schema=ImageToImageInput,
436+
),
359437
# Deprecated names
360438
"lucy-pro-i2i": ModelDefinition(
361439
name="lucy-pro-i2i",

tests/test_models.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,75 @@ def test_deprecation_warning_only_once() -> None:
164164
assert len(w) == 1
165165

166166

167+
def test_latest_realtime_models() -> None:
168+
model = models.realtime("lucy-latest")
169+
assert model.name == "lucy-latest"
170+
assert model.url_path == "/v1/stream"
171+
assert model.fps == 20
172+
assert model.width == 1088
173+
assert model.height == 624
174+
175+
model = models.realtime("lucy-vton-latest")
176+
assert model.name == "lucy-vton-latest"
177+
assert model.url_path == "/v1/stream"
178+
assert model.fps == 20
179+
assert model.width == 1088
180+
assert model.height == 624
181+
182+
model = models.realtime("lucy-restyle-latest")
183+
assert model.name == "lucy-restyle-latest"
184+
assert model.url_path == "/v1/stream"
185+
assert model.fps == 22
186+
assert model.width == 1280
187+
assert model.height == 704
188+
189+
190+
def test_latest_video_models() -> None:
191+
model = models.video("lucy-latest")
192+
assert model.name == "lucy-latest"
193+
assert model.url_path == "/v1/jobs/lucy-latest"
194+
assert model.fps == 20
195+
assert model.width == 1088
196+
assert model.height == 624
197+
198+
model = models.video("lucy-restyle-latest")
199+
assert model.name == "lucy-restyle-latest"
200+
assert model.url_path == "/v1/jobs/lucy-restyle-latest"
201+
assert model.fps == 22
202+
203+
model = models.video("lucy-clip-latest")
204+
assert model.name == "lucy-clip-latest"
205+
assert model.url_path == "/v1/jobs/lucy-clip-latest"
206+
assert model.fps == 25
207+
208+
model = models.video("lucy-motion-latest")
209+
assert model.name == "lucy-motion-latest"
210+
assert model.url_path == "/v1/jobs/lucy-motion-latest"
211+
assert model.fps == 25
212+
213+
214+
def test_latest_image_models() -> None:
215+
model = models.image("lucy-image-latest")
216+
assert model.name == "lucy-image-latest"
217+
assert model.url_path == "/v1/generate/lucy-image-latest"
218+
219+
220+
def test_latest_aliases_no_deprecation_warning() -> None:
221+
_warned_aliases.clear()
222+
223+
with warnings.catch_warnings(record=True) as w:
224+
warnings.simplefilter("always")
225+
models.realtime("lucy-latest")
226+
models.realtime("lucy-vton-latest")
227+
models.realtime("lucy-restyle-latest")
228+
models.video("lucy-latest")
229+
models.video("lucy-restyle-latest")
230+
models.video("lucy-clip-latest")
231+
models.video("lucy-motion-latest")
232+
models.image("lucy-image-latest")
233+
assert len(w) == 0
234+
235+
167236
def test_invalid_model() -> None:
168237
with pytest.raises(DecartSDKError):
169238
models.video("invalid-model")

0 commit comments

Comments
 (0)