Files
hermes-agent/evals/api_delegation_sync_probe.py

67 lines
3.1 KiB
Python

"""Model-free API delegation delivery probe; run in an isolated HERMES_HOME.
Uses real request-context binding, dispatch policy and SQLite persistence. This
is local mechanism evidence, not provider inference or native Windows evidence.
"""
import asyncio
import inspect
import json
import os
from pathlib import Path
from types import SimpleNamespace
async def probe():
from gateway.platforms.api_server import APIServerAdapter
from gateway.session_context import clear_session_vars
from gateway.wake import persist_delegation_delivery
from hermes_state import SessionDB
from tools.delegate_tool_dispatch import _resolve_async_wake_sid
decisions = {}
for name, capable in (("headerless", ""), ("explicit", "1")):
kw = dict(chat_id="api-parent", session_id="api-parent")
if "session_history_delivery" in inspect.signature(APIServerAdapter._bind_api_server_session).parameters:
kw["session_history_delivery"] = capable
tokens = APIServerAdapter._bind_api_server_session(**kw)
try:
args = ["api-parent"]
if len(inspect.signature(_resolve_async_wake_sid).parameters) > 1:
args.append(capable == "1")
decisions[name] = _resolve_async_wake_sid(*args)
finally:
clear_session_vars(tokens)
db = SessionDB(db_path=Path(os.environ["HERMES_HOME"]) / "state.db")
db.create_session("api-parent", source="api_server")
db.create_session("stranger", source="api_server")
adapter = SimpleNamespace(_ensure_session_db=lambda: db)
evt = {"type": "async_delegation", "delegation_id": "probe-unit-1"}
await asyncio.gather(*(persist_delegation_delivery(adapter, text="OWNER_RESULT", session_id="api-parent", evt=evt) for _ in range(2)))
decisions["replayed_rows"] = len(db.get_messages("api-parent"))
db.end_session("api-parent", "compression")
db.create_session("api-child", source="api_server", parent_session_id="api-parent")
try:
await persist_delegation_delivery(adapter, text="LATE_RESULT", session_id="api-parent", evt={**evt, "delegation_id": "probe-unit-2"})
decisions["rotation"] = "persisted"
except Exception as exc:
decisions["rotation"] = type(exc).__name__
decisions["child_rows"] = len(db.get_messages("api-child"))
db.acquire_session_turn_lease("api-child", "fixture-client-turn", wait_seconds=0)
busy_evt = {**evt, "delegation_id": "busy-unit"}
try:
await persist_delegation_delivery(adapter, text="BUSY_RESULT", session_id="api-child", evt=busy_evt)
decisions["busy_delivery"] = "inserted"
except Exception as exc:
decisions["busy_delivery"] = type(exc).__name__
finally:
db.release_session_turn_lease("api-child", "fixture-client-turn")
await persist_delegation_delivery(adapter, text="BUSY_RESULT", session_id="api-child", evt=busy_evt)
decisions["after_release_rows"] = len(db.get_messages("api-child"))
decisions["stranger_rows"] = len(db.get_messages("stranger"))
db.close()
return decisions
if __name__ == "__main__":
print(json.dumps(asyncio.run(probe()), indent=2))