diff --git a/decart/models.py b/decart/models.py index 7eca043..8f2690e 100644 --- a/decart/models.py +++ b/decart/models.py @@ -8,6 +8,7 @@ VideoModels = Literal[ "lucy-dev-i2v", "lucy-dev-v2v", + "lucy-fast-v2v", "lucy-pro-t2v", "lucy-pro-i2v", "lucy-pro-v2v", @@ -148,6 +149,14 @@ class ImageToImageInput(DecartBaseModel): height=704, input_schema=VideoToVideoInput, ), + "lucy-fast-v2v": ModelDefinition( + name="lucy-fast-v2v", + url_path="/v1/generate/lucy-fast-v2v", + fps=25, + width=1280, + height=704, + input_schema=VideoToVideoInput, + ), "lucy-pro-t2v": ModelDefinition( name="lucy-pro-t2v", url_path="/v1/generate/lucy-pro-t2v", diff --git a/tests/test_process.py b/tests/test_process.py index d717db9..7eb9ed0 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -87,6 +87,39 @@ async def test_process_video_to_video() -> None: assert result == b"fake video data" +@pytest.mark.asyncio +async def test_process_video_to_video_fast() -> None: + client = DecartClient(api_key="test-key") + + with patch("aiohttp.ClientSession") as mock_session_cls: + mock_response = MagicMock() + mock_response.ok = True + mock_response.read = AsyncMock(return_value=b"fake video data") + + mock_session = MagicMock() + mock_session.__aenter__ = AsyncMock(return_value=mock_session) + mock_session.__aexit__ = AsyncMock(return_value=None) + mock_session.post = MagicMock() + mock_session.post.return_value.__aenter__ = AsyncMock(return_value=mock_response) + mock_session.post.return_value.__aexit__ = AsyncMock(return_value=None) + + mock_session_cls.return_value = mock_session + + result = await client.process( + { + "model": models.video("lucy-fast-v2v"), + "prompt": "Change the car to a motorcycle", + "data": b"fake input video", + "resolution": "480p", + "enhance_prompt": True, + "num_inference_steps": 50, + "seed": 42, + } + ) + + assert result == b"fake video data" + + @pytest.mark.asyncio async def test_process_max_prompt_length() -> None: client = DecartClient(api_key="test-key")