refactor: simplifica o adapter DeepAgents

This commit is contained in:
alex alves
2026-11-05 16:22:23 -03:00
parent fbbe47d90d
commit 85fc4c4d46
3 changed files with 56 additions and 52 deletions

View File

@@ -18,20 +18,20 @@ def test_deep_agent_session_config():
adapter = object.__new__(DeepAgentsAdapter)
assert adapter._config("session-a") == {
assert adapter._session_config("session-a") == {
"configurable": {
"thread_id": "session-a",
}
}
assert adapter._config("session-b") == {
assert adapter._session_config("session-b") == {
"configurable": {
"thread_id": "session-b",
}
}
with pytest.raises(ValueError):
adapter._config("")
adapter._session_config("")
@@ -41,8 +41,8 @@ def test_deep_agent_cleanup_is_idempotent():
from voice_assistant.agent.deep_agent import DeepAgentsAdapter
adapter = object.__new__(DeepAgentsAdapter)
adapter.model = MagicMock()
adapter.model.aclose = AsyncMock()
adapter._model = MagicMock()
adapter._model.aclose = AsyncMock()
adapter._closed = False
async def scenario():
@@ -51,7 +51,7 @@ def test_deep_agent_cleanup_is_idempotent():
asyncio.run(scenario())
adapter.model.aclose.assert_awaited_once()
adapter._model.aclose.assert_awaited_once()
assert adapter._closed is True
@@ -90,7 +90,7 @@ def test_deep_agent_stream_can_be_cancelled():
self.content = content
self.tool_call_chunks = []
adapter.agent = FakeAgent()
adapter._graph = FakeAgent()
async def consume():
async for _ in adapter.stream(
@@ -389,6 +389,6 @@ def test_deep_agent_factory_configures_authentication(monkeypatch, options, expe
model_factory.assert_called_once()
kwargs = model_factory.call_args.kwargs
assert (kwargs["auth_type"], kwargs["auth_profile"], kwargs["auth_file_location"]) == expected_auth
assert adapter.model is model_factory.return_value
assert agent_factory.call_args.kwargs["model"] is adapter.model
assert adapter._model is model_factory.return_value
assert agent_factory.call_args.kwargs["model"] is adapter._model

View File

@@ -11,7 +11,7 @@ def make_adapter(events, timeout=0.05):
adapter = object.__new__(DeepAgentsAdapter)
adapter._closed = False
adapter._stream_event_timeout = timeout
adapter.agent = SimpleNamespace(astream=lambda *args, **kwargs: events)
adapter._graph = SimpleNamespace(astream=lambda *args, **kwargs: events)
return adapter
@@ -138,9 +138,42 @@ def test_adapter_streams_real_deepagents_graph_with_fake_model():
adapter = object.__new__(DeepAgentsAdapter)
adapter._closed = False
adapter._stream_event_timeout = 2.0
adapter.agent = create_deep_agent(
adapter._graph = create_deep_agent(
model=Model(responses=["Olá Lara."]), tools=[], checkpointer=MemorySaver(),
)
response = await adapter.process("session", 1, "Diga olá")
assert response == "Olá Lara."
asyncio.run(scenario())
def test_process_rejects_empty_text_response_and_closes_stream():
async def scenario():
closed = asyncio.Event()
async def source():
try:
yield event([{"type": "reasoning", "text": "Interno"}])
finally:
closed.set()
with pytest.raises(RuntimeError, match="empty streaming response"):
await make_adapter(source()).process("session", 1, "Olá")
assert closed.is_set()
asyncio.run(scenario())
def test_process_propagates_provider_failure_and_closes_stream():
async def scenario():
closed = asyncio.Event()
async def source():
try:
yield event("Texto parcial")
raise ValueError("provider failure")
finally:
closed.set()
with pytest.raises(ValueError, match="provider failure"):
await make_adapter(source()).process("session", 1, "Olá")
assert closed.is_set()
asyncio.run(scenario())