All four agents bumped to v1.1.0. momentum (#114): infers engagement_trend ('up'|'stable'|'down') by comparing done-rate in the last 7 days vs the prior 7 days. Agent surfaces the trend in its snippet ("trending up — build on the momentum"). overdue-task (#115): infers lateness_tolerance_days (0/1/2) from snooze rate. Agent now filters tasks against the tolerance so low-urgency users aren't nagged about tasks that are only hours overdue. recent-patterns (#116): infers window_days (7/14/30) from feedback event density — sparse users get a wider window so the snippet isn't always empty. focus-area (#113): no inferred params (project-level feedback linkage needed, tracked under #78). preferred_areas pref was declared but ignored; agent now honours it as a tiebreaker and mentions it in the snippet. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
53 lines
2.2 KiB
Python
53 lines
2.2 KiB
Python
"""POST /agents/{agent_id}/infer — inference framework endpoint."""
|
|
import pytest
|
|
from httpx import AsyncClient, ASGITransport
|
|
|
|
from main import app
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_infer_time_of_day_cold_start():
|
|
"""Fewer than min_history events → cold_start_default for preferred_hour."""
|
|
transport = ASGITransport(app=app)
|
|
async with AsyncClient(transport=transport, base_url="http://test") as client:
|
|
resp = await client.post("/agents/time-of-day/infer", json={
|
|
"user_id": "u1",
|
|
"feedback_history": [
|
|
{"action": "done", "dwell_ms": 60000, "created_at": "2026-05-01T09:00:00+00:00"},
|
|
] * 5, # 5 < min_history=10
|
|
})
|
|
assert resp.status_code == 200
|
|
body = resp.json()
|
|
assert body["agent_id"] == "time-of-day"
|
|
assert body["inferred_prefs"]["preferred_hour"] is None
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_infer_time_of_day_enough_history():
|
|
"""10+ events → preferred_hour is inferred as the mode done-hour."""
|
|
events = [{"action": "done", "dwell_ms": 60000, "created_at": "2026-05-01T09:00:00+00:00"}] * 10
|
|
transport = ASGITransport(app=app)
|
|
async with AsyncClient(transport=transport, base_url="http://test") as client:
|
|
resp = await client.post("/agents/time-of-day/infer", json={"user_id": "u1", "feedback_history": events})
|
|
assert resp.status_code == 200
|
|
body = resp.json()
|
|
assert body["inferred_prefs"]["preferred_hour"] == 9
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_infer_agent_with_no_inferred_params():
|
|
"""Agents with no inferred_params return an empty dict (focus-area has none)."""
|
|
transport = ASGITransport(app=app)
|
|
async with AsyncClient(transport=transport, base_url="http://test") as client:
|
|
resp = await client.post("/agents/focus-area/infer", json={"user_id": "u1", "feedback_history": []})
|
|
assert resp.status_code == 200
|
|
assert resp.json()["inferred_prefs"] == {}
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_infer_unknown_agent_404():
|
|
transport = ASGITransport(app=app)
|
|
async with AsyncClient(transport=transport, base_url="http://test") as client:
|
|
resp = await client.post("/agents/ghost/infer", json={"user_id": "u1", "feedback_history": []})
|
|
assert resp.status_code == 404
|