Retrieval control plane for AI agents
Govern when agents search, when they answer, and what it cost.
One API between your agent and Tavily, Serper, or Exa — decides when to search, when to answer, when to escalate, and why.
>> WHO THIS IS FOR
allow_answer + audit trail, not vibes| Question | Decision | Reason |
|---|---|---|
| Refund policy | Answer | 4 trusted sources |
| Legal liability | Escalate | Evidence threshold not met |
| HIPAA question | Block | Policy violation |
{
"allow_answer": false,
"audit_id": "99c08409-28ec-4427-...",
"policy": {
"profile": "legal",
"action": "block",
"reasons": ["only 2 qualifying sources; minimum is 3"]
},
"overall_confidence": 0.80
}
Drop in before Tavily. One call from your agent loop.
from query_fanout import RetrievalClient
client = RetrievalClient(preset="tavily", policy="legal", agent_id="support-bot")
report = await client.retrieve("How do refund policies work?")
if report.allow_answer:
answer(report.synthesis)
else:
escalate(report.audit_id, report.policy.reasons)
Probe-first retrieval + allow_answer — the middleware layer your agent calls before search backends.
Probe once. Fan out only when confidence is low.
allow_answer under legal, support, research policies.
Sources, policy calls, blocks—each with an audit ID.
Swipe chart → to read full pipeline
Across 125 production-style agent queries vs naive always-search on live Tavily — 125-task field study.
audit_id + compliance exportLegal block rates are from a controlled web-search benchmark with default policy thresholds — illustrative of gating behavior, not a compliance certification or production SLA.