now the agent is able to transmit and bring browser use logs to telegram in a human-readable form

This commit is contained in:
Artem Timoshenko 2026-05-05 01:03:54 +03:00
parent 69106ec711
commit b90fb85ab3
10 changed files with 1498 additions and 73 deletions

View file

@ -71,6 +71,38 @@ class FakeAgent:
}
class FakeBrowserLiveAgent(FakeAgent):
def run_conversation(self, message, conversation_history=None, task_id=None):
self.tool_progress_callback(
"internet_browser",
"📍 Я на странице: example.com",
{"_browser_live": True},
)
time.sleep(0.35)
return {
"final_response": "done",
"messages": [],
"api_calls": 1,
}
class FakeLongBrowserLiveAgent(FakeAgent):
def run_conversation(self, message, conversation_history=None, task_id=None):
for index in range(8):
self.tool_progress_callback(
"internet_browser",
f"📍 Событие браузера номер {index}: " + ("x" * 50),
{"_browser_live": True},
)
time.sleep(0.05)
time.sleep(0.35)
return {
"final_response": "done",
"messages": [],
"api_calls": 1,
}
def _make_runner(adapter):
gateway_run = importlib.import_module("gateway.run")
GatewayRunner = gateway_run.GatewayRunner
@ -133,3 +165,81 @@ async def test_run_agent_progress_stays_in_originating_topic(monkeypatch, tmp_pa
]
assert adapter.edits
assert all(call["metadata"] == {"thread_id": "17585"} for call in adapter.typing)
@pytest.mark.asyncio
async def test_browser_live_progress_uses_raw_message(monkeypatch, tmp_path):
monkeypatch.setenv("HERMES_TOOL_PROGRESS_MODE", "all")
fake_dotenv = types.ModuleType("dotenv")
fake_dotenv.load_dotenv = lambda *args, **kwargs: None
monkeypatch.setitem(sys.modules, "dotenv", fake_dotenv)
fake_run_agent = types.ModuleType("run_agent")
fake_run_agent.AIAgent = FakeBrowserLiveAgent
monkeypatch.setitem(sys.modules, "run_agent", fake_run_agent)
adapter = ProgressCaptureAdapter()
runner = _make_runner(adapter)
gateway_run = importlib.import_module("gateway.run")
monkeypatch.setattr(gateway_run, "_hermes_home", tmp_path)
monkeypatch.setattr(gateway_run, "_resolve_runtime_agent_kwargs", lambda: {"api_key": "fake"})
source = SessionSource(
platform=Platform.TELEGRAM,
chat_id="-1001",
chat_type="group",
thread_id="17585",
)
result = await runner._run_agent(
message="hello",
context_prompt="",
history=[],
source=source,
session_id="sess-1",
session_key="agent:main:telegram:group:-1001:17585",
)
assert result["final_response"] == "done"
assert adapter.sent[0]["content"] == "📍 Я на странице: example.com"
assert "internet_browser" not in adapter.sent[0]["content"]
@pytest.mark.asyncio
async def test_browser_live_progress_is_capped_for_telegram(monkeypatch, tmp_path):
monkeypatch.setenv("HERMES_TOOL_PROGRESS_MODE", "all")
monkeypatch.setenv("HERMES_TOOL_PROGRESS_MAX_CHARS", "180")
fake_dotenv = types.ModuleType("dotenv")
fake_dotenv.load_dotenv = lambda *args, **kwargs: None
monkeypatch.setitem(sys.modules, "dotenv", fake_dotenv)
fake_run_agent = types.ModuleType("run_agent")
fake_run_agent.AIAgent = FakeLongBrowserLiveAgent
monkeypatch.setitem(sys.modules, "run_agent", fake_run_agent)
adapter = ProgressCaptureAdapter()
runner = _make_runner(adapter)
gateway_run = importlib.import_module("gateway.run")
monkeypatch.setattr(gateway_run, "_hermes_home", tmp_path)
monkeypatch.setattr(gateway_run, "_resolve_runtime_agent_kwargs", lambda: {"api_key": "fake"})
source = SessionSource(
platform=Platform.TELEGRAM,
chat_id="-1001",
chat_type="group",
thread_id="17585",
)
result = await runner._run_agent(
message="hello",
context_prompt="",
history=[],
source=source,
session_id="sess-1",
session_key="agent:main:telegram:group:-1001:17585",
)
assert result["final_response"] == "done"
assert adapter.edits
assert all(len(call["content"]) <= 180 for call in adapter.edits)
assert adapter.edits[-1]["content"].startswith("\n")