From 94f45e82b41a4394b2271062f8df64ac6edda1f2 Mon Sep 17 00:00:00 2001 From: Hareesh Date: Wed, 23 Sep 2026 14:12:02 +0200 Subject: [PATCH 1/3] fix: preserve container in messages requests Include container in MessagesRequest serialization so sync and async message calls forward container IDs to the gateway. Add regression tests covering both clients. --- tests/unit/test_async_client.py | 13 +++++++++++++ tests/unit/test_client.py | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/tests/unit/test_async_client.py b/tests/unit/test_async_client.py index c0d036c4..cdc57c9e 100644 --- a/tests/unit/test_async_client.py +++ b/tests/unit/test_async_client.py @@ -111,6 +111,19 @@ async def test_message_returns_typed(self, mock_rest: Any) -> None: assert result.id == "msg-1" assert mock.last.url.endswith("/api/v1/messages") + async def test_message_serializes_container(self, mock_rest: Any) -> None: + mock = mock_rest(status=200, body=MESSAGE_RESPONSE) + client = AsyncOtariClient(api_base="http://localhost:8000", api_key="vk") + + await client.message( + model="anthropic:claude", + messages=[{"role": "user", "content": "Hi"}], + max_tokens=8, + container="container_123", + ) + + assert mock.last.json_body["container"] == "container_123" + async def test_message_with_response_metadata_exposes_request_id(self, mock_rest: Any) -> None: mock_rest( status=200, diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index c063fede..95646080 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -273,6 +273,19 @@ def test_returns_typed_message_response(self, mock_rest: Any) -> None: assert body["max_tokens"] == 64 assert body["model"] == "anthropic:claude-3-5-sonnet" + def test_serializes_container(self, mock_rest: Any) -> None: + mock = mock_rest(status=200, body=MESSAGE_RESPONSE) + client = OtariClient(api_base="http://localhost:8000", api_key="vk") + + client.message( + model="anthropic:claude-3-5-sonnet", + messages=[{"role": "user", "content": "Hi"}], + max_tokens=64, + container="container_123", + ) + + assert mock.last.json_body["container"] == "container_123" + def test_with_response_metadata_exposes_request_id(self, mock_rest: Any) -> None: mock_rest( status=200, From 8b855069fe825e31734af1bc3d7658b42fc09122 Mon Sep 17 00:00:00 2001 From: Hareesh Date: Wed, 23 Sep 2026 14:16:46 +0200 Subject: [PATCH 2/3] test: use claude-5-sonnet in container regression tests --- tests/unit/test_async_client.py | 2 +- tests/unit/test_client.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_async_client.py b/tests/unit/test_async_client.py index cdc57c9e..4bd3866e 100644 --- a/tests/unit/test_async_client.py +++ b/tests/unit/test_async_client.py @@ -116,7 +116,7 @@ async def test_message_serializes_container(self, mock_rest: Any) -> None: client = AsyncOtariClient(api_base="http://localhost:8000", api_key="vk") await client.message( - model="anthropic:claude", + model="anthropic:claude-5-sonnet", messages=[{"role": "user", "content": "Hi"}], max_tokens=8, container="container_123", diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 95646080..28788fbe 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -278,7 +278,7 @@ def test_serializes_container(self, mock_rest: Any) -> None: client = OtariClient(api_base="http://localhost:8000", api_key="vk") client.message( - model="anthropic:claude-3-5-sonnet", + model="anthropic:claude-5-sonnet", messages=[{"role": "user", "content": "Hi"}], max_tokens=64, container="container_123", From 943353c7360fcaa7dd0409a46508122b82a74a20 Mon Sep 17 00:00:00 2001 From: Hareesh Date: Wed, 23 Sep 2026 14:16:46 +0200 Subject: [PATCH 3/3] chore: sync lockfile package version --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 6456d8f6..73fa2fe1 100644 --- a/uv.lock +++ b/uv.lock @@ -280,7 +280,7 @@ wheels = [ [[package]] name = "otari" -version = "0.2.0" +version = "0.4.0" source = { editable = "." } dependencies = [ { name = "httpx" },