From 4533118b68a5d34ed86db972ab1a76db5ad9a168 Mon Sep 17 00:00:00 2001 From: Mikhail Putilovskij Date: Sun, 19 Apr 2026 17:11:49 +0300 Subject: [PATCH] Fix agent API wrapper constructor compatibility --- sdk/agent_api_wrapper.py | 28 +++++++++--- tests/platform/test_real.py | 89 +++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 5 deletions(-) diff --git a/sdk/agent_api_wrapper.py b/sdk/agent_api_wrapper.py index bf21f09..3e400f7 100644 --- a/sdk/agent_api_wrapper.py +++ b/sdk/agent_api_wrapper.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import inspect import logging import sys import re @@ -43,13 +44,30 @@ class AgentApiWrapper(AgentApi): self._base_url = self._normalize_base_url(base_url or url or "") self._init_kwargs = dict(kwargs) self.chat_id = chat_id - super().__init__( - agent_id=agent_id, - url=self._build_ws_url(self._base_url, chat_id), - **kwargs, - ) + if self._supports_modern_constructor(): + super().__init__( + agent_id=agent_id, + base_url=self._base_url, + chat_id=chat_id, + **kwargs, + ) + else: + super().__init__( + agent_id=agent_id, + url=self._build_ws_url(self._base_url, chat_id), + **kwargs, + ) self.last_tokens_used = 0 + @staticmethod + def _supports_modern_constructor() -> bool: + try: + parameters = inspect.signature(AgentApi.__init__).parameters + except (TypeError, ValueError): + return False + + return "base_url" in parameters and "chat_id" in parameters + @staticmethod def _normalize_base_url(base_url: str) -> str: parsed = urlsplit(base_url) diff --git a/tests/platform/test_real.py b/tests/platform/test_real.py index 94b9520..a0ff7a8 100644 --- a/tests/platform/test_real.py +++ b/tests/platform/test_real.py @@ -3,6 +3,8 @@ import asyncio import pytest from core.protocol import SettingsAction +import sdk.agent_api_wrapper as agent_api_wrapper_module +from sdk.agent_api_wrapper import AgentApiWrapper from sdk.interface import MessageChunk, MessageResponse, UserSettings from sdk.prototype_state import PrototypeStateStore from sdk.real import RealPlatformClient @@ -59,6 +61,93 @@ class LegacyAgentApi: self.last_tokens_used = 7 +def test_agent_api_wrapper_uses_modern_constructor_when_available(monkeypatch): + calls: list[dict[str, object]] = [] + + def fake_init(self, agent_id, base_url, chat_id, **kwargs): + calls.append( + { + "agent_id": agent_id, + "base_url": base_url, + "chat_id": chat_id, + "kwargs": kwargs, + } + ) + self.id = agent_id + self.url = base_url + self.callback = kwargs.get("callback") + self.on_disconnect = kwargs.get("on_disconnect") + + monkeypatch.setattr(agent_api_wrapper_module.AgentApi, "__init__", fake_init) + + wrapper = AgentApiWrapper( + agent_id="agent-1", + base_url="https://agent.example.com/v1/agent_ws", + chat_id="chat-1", + callback="cb", + on_disconnect="disconnect", + ) + child = wrapper.for_chat("chat-2") + + assert calls == [ + { + "agent_id": "agent-1", + "base_url": "https://agent.example.com", + "chat_id": "chat-1", + "kwargs": {"callback": "cb", "on_disconnect": "disconnect"}, + }, + { + "agent_id": "agent-1", + "base_url": "https://agent.example.com", + "chat_id": "chat-2", + "kwargs": {"callback": "cb", "on_disconnect": "disconnect"}, + }, + ] + assert wrapper._base_url == "https://agent.example.com" + assert wrapper.chat_id == "chat-1" + assert wrapper.last_tokens_used == 0 + assert child.chat_id == "chat-2" + + +def test_agent_api_wrapper_falls_back_to_legacy_url_constructor(monkeypatch): + calls: list[dict[str, object]] = [] + + def fake_init(self, agent_id, url, callback=None, on_disconnect=None): + calls.append( + { + "agent_id": agent_id, + "url": url, + "callback": callback, + "on_disconnect": on_disconnect, + } + ) + self.id = agent_id + self.url = url + self.callback = callback + self.on_disconnect = on_disconnect + + monkeypatch.setattr(agent_api_wrapper_module.AgentApi, "__init__", fake_init) + + wrapper = AgentApiWrapper( + agent_id="agent-2", + url="https://agent.example.com/v1/agent_ws/chat-9/", + chat_id="chat-9", + callback="cb", + ) + + assert calls == [ + { + "agent_id": "agent-2", + "url": "https://agent.example.com/v1/agent_ws/chat-9/", + "callback": "cb", + "on_disconnect": None, + } + ] + assert wrapper._base_url == "https://agent.example.com" + assert wrapper.chat_id == "chat-9" + assert wrapper.last_tokens_used == 0 + + @pytest.mark.asyncio async def test_real_platform_client_get_or_create_user_uses_local_state(): client = RealPlatformClient(