Skip to content

Commit 51047e5

Browse files
authored
feat: add reference_image support for lucy-pro-i2i (#43)
1 parent f0e022c commit 51047e5

3 files changed

Lines changed: 34 additions & 1 deletion

File tree

decart/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class ImageToImageInput(DecartBaseModel):
113113
max_length=1000,
114114
)
115115
data: FileInput
116+
reference_image: Optional[FileInput] = None
116117
seed: Optional[int] = None
117118
resolution: Optional[str] = None
118119
enhance_prompt: Optional[bool] = None

decart/process/request.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ async def send_request(
8989

9090
for key, value in inputs.items():
9191
if value is not None:
92-
if key in ("data", "start", "end"):
92+
if key in ("data", "start", "end", "reference_image"):
9393
content, content_type = await file_input_to_bytes(value, session)
9494
form_data.add_field(key, content, content_type=content_type)
9595
else:

tests/test_process.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,38 @@ async def test_process_image_to_image() -> None:
4141
assert result == b"fake image data"
4242

4343

44+
@pytest.mark.asyncio
45+
async def test_process_image_to_image_with_reference_image() -> None:
46+
"""Test image-to-image with optional reference_image."""
47+
client = DecartClient(api_key="test-key")
48+
49+
with patch("aiohttp.ClientSession") as mock_session_cls:
50+
mock_response = MagicMock()
51+
mock_response.ok = True
52+
mock_response.read = AsyncMock(return_value=b"fake image data")
53+
54+
mock_session = MagicMock()
55+
mock_session.__aenter__ = AsyncMock(return_value=mock_session)
56+
mock_session.__aexit__ = AsyncMock(return_value=None)
57+
mock_session.post = MagicMock()
58+
mock_session.post.return_value.__aenter__ = AsyncMock(return_value=mock_response)
59+
mock_session.post.return_value.__aexit__ = AsyncMock(return_value=None)
60+
61+
mock_session_cls.return_value = mock_session
62+
63+
result = await client.process(
64+
{
65+
"model": models.image("lucy-pro-i2i"),
66+
"prompt": "Add the object from the reference image",
67+
"data": b"fake input image",
68+
"reference_image": b"fake reference image",
69+
"enhance_prompt": False,
70+
}
71+
)
72+
73+
assert result == b"fake image data"
74+
75+
4476
@pytest.mark.asyncio
4577
async def test_process_rejects_video_models() -> None:
4678
"""Test that process() rejects video models with helpful error message."""

0 commit comments

Comments
 (0)