Each agent now exports a module-level MANIFEST declaring id, version, pref_schema, required_consents, ttl_sec, and silenced_in_contexts. The registry surfaces both the agent and its manifest, and rejects on mismatch so the two cannot drift. ml/serving exposes GET /agents/registry; services/api proxies it as GET /api/agents/registry with a 60s in-process cache so admin pageviews don't hammer upstream. Failures aren't cached. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
22 lines
766 B
Python
22 lines
766 B
Python
"""GET /agents/registry — manifests are exposed in JSON-serialisable form."""
|
|
import pytest
|
|
from httpx import AsyncClient, ASGITransport
|
|
|
|
from main import app
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_registry_returns_all_agents():
|
|
transport = ASGITransport(app=app)
|
|
async with AsyncClient(transport=transport, base_url="http://test") as client:
|
|
resp = await client.get("/agents/registry")
|
|
|
|
assert resp.status_code == 200
|
|
payload = resp.json()
|
|
ids = {a["id"] for a in payload["agents"]}
|
|
assert ids == {"overdue-task", "momentum", "time-of-day", "recent-patterns", "focus-area"}
|
|
|
|
sample = payload["agents"][0]
|
|
for key in ("id", "version", "description", "pref_schema", "required_consents", "ttl_sec"):
|
|
assert key in sample
|