Fix agent API wrapper constructor compatibility
This commit is contained in:
parent
730ea70f78
commit
4533118b68
2 changed files with 112 additions and 5 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import inspect
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
|
|
@ -43,13 +44,30 @@ class AgentApiWrapper(AgentApi):
|
||||||
self._base_url = self._normalize_base_url(base_url or url or "")
|
self._base_url = self._normalize_base_url(base_url or url or "")
|
||||||
self._init_kwargs = dict(kwargs)
|
self._init_kwargs = dict(kwargs)
|
||||||
self.chat_id = chat_id
|
self.chat_id = chat_id
|
||||||
super().__init__(
|
if self._supports_modern_constructor():
|
||||||
agent_id=agent_id,
|
super().__init__(
|
||||||
url=self._build_ws_url(self._base_url, chat_id),
|
agent_id=agent_id,
|
||||||
**kwargs,
|
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
|
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
|
@staticmethod
|
||||||
def _normalize_base_url(base_url: str) -> str:
|
def _normalize_base_url(base_url: str) -> str:
|
||||||
parsed = urlsplit(base_url)
|
parsed = urlsplit(base_url)
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,8 @@ import asyncio
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from core.protocol import SettingsAction
|
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.interface import MessageChunk, MessageResponse, UserSettings
|
||||||
from sdk.prototype_state import PrototypeStateStore
|
from sdk.prototype_state import PrototypeStateStore
|
||||||
from sdk.real import RealPlatformClient
|
from sdk.real import RealPlatformClient
|
||||||
|
|
@ -59,6 +61,93 @@ class LegacyAgentApi:
|
||||||
self.last_tokens_used = 7
|
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
|
@pytest.mark.asyncio
|
||||||
async def test_real_platform_client_get_or_create_user_uses_local_state():
|
async def test_real_platform_client_get_or_create_user_uses_local_state():
|
||||||
client = RealPlatformClient(
|
client = RealPlatformClient(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue