Observed since 20 Oct, 23:11 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Registry-driven LLM routing: build classifier prompts from agent descriptions, validate decisions, and dispatch.
Registry-driven LLM routing: build classifier prompts, validate decisions, and dispatch to the right agent.
When you have multiple AI agents, something needs to decide which one handles each user message. Most teams hardcode if/else chains or build bespoke classifiers. This library gives you a clean, framework-agnostic way to:
graph LR
A[User Message] --> B{Classifier}
B -->|LLM| C[Build Prompt from Registry]
B -->|FAISS| D[Embed & Similarity Search]
C --> E[RouteDecision]
D --> E
E --> F[Validate Against Registry]
F --> G[Dispatch to Agent]
G --> H[Response]
pip install agent-registry-router
With a framework adapter:
pip install "agent-registry-router[pydanticai]" # PydanticAI
pip install "agent-registry-router[openai-agents]" # OpenAI Agents SDK
pip install "agent-registry-router[google-adk]" # Google ADK
pip install "agent-registry-router[faiss]" # FAISS classifier
from agent_registry_router import (
AgentRegistry,
AgentRegistration,
RouteDecision,
build_classifier_system_prompt,
validate_route_decision,
)
# Register your agents
registry = AgentRegistry()
registry.register(AgentRegistration(name="billing", description="Handles billing and payments."))
registry.register(AgentRegistration(name="technical", description="Handles technical support."))
registry.register(AgentRegistration(name="general", description="Handles general inquiries."))
# Build a classifier prompt from the registry
prompt = build_classifier_system_prompt(registry, default_agent="general")
# Validate a routing decision
decision = RouteDecision(agent="billing", confidence=0.9, reasoning="Payment question.")
validated = validate_route_decision(decision, registry=registry, default_agent="general")
Framework-specific dispatchers that handle classify → validate → dispatch. Each is opt-in — the core has no framework dependencies.
| Adapter | Install Extra | Dispatcher Class |
|---|---|---|
| PydanticAI | pydanticai | PydanticAIDispatcher |
| OpenAI Agents SDK | openai-agents | OpenAIAgentsDispatcher |
| Google ADK | google-adk | GoogleADKDispatcher |
All adapters are duck-typed (no runtime imports of the framework). Any object matching the protocol works. All support:
route_and_run() — classify, validate, dispatchroute_and_stream() — same flow, streaming outputon_event observability hooksfrom agent_registry_router.adapters.pydantic_ai import PydanticAIDispatcher
from agent_registry_router.adapters.openai_agents import OpenAIAgentsDispatcher
from agent_registry_router.adapters.google_adk import GoogleADKDispatcher
An alternative to LLM-based classification: embed agent descriptions, find the nearest match by cosine similarity. Near-zero latency, near-zero cost.
from agent_registry_router import FaissClassifier
classifier = FaissClassifier(
registry=registry,
embed_fn=your_embedding_function, # any callable: list[str] -> list[list[float]]
)
decision = classifier.classify("I was charged twice")
Built-in JSON logging for routing events. One line to set up.
from agent_registry_router import StructuredLogger
dispatcher = PydanticAIDispatcher(
...,
on_event=StructuredLogger(),
)
# Produces: {"ts": "...", "event": "classifier_run_success", "agent": "billing", "confidence": 0.92}
Benchmarks the classifier prompts this library generates across LLMs and FAISS. Includes fixtures, a runner, and a report generator.
make install-eval
cp .env.example .env # add your API keys
make eval
See evals/README.md for details. Bring your own fixtures to benchmark your own agent registries.
Fail-fast by default with typed exceptions:
InvalidRouteDecision — classifier picked a non-routable agentInvalidFallback — default agent isn't routable or registry is emptyAgentNotFound — validated agent can't be resolved for dispatchRegistryError — invalid names, descriptions, or empty registryOpt in to graceful degradation instead of hard failures:
validated = validate_route_decision(
decision,
registry=registry,
default_agent="general",
allow_fallback=True, # swap to default instead of raising on invalid agent
confidence_threshold=0.5, # swap to default when confidence is below threshold
)
if validated.did_fallback:
print(f"Fell back: {validated.fallback_reason}")
on_event hooks + StructuredLogger for production monitoringmake install # install dev dependencies
make lint # ruff + mypy
make test # pytest with 85% coverage gate
make format # auto-format
make eval # run classifier benchmarks (requires API keys)
Apache-2.0
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.4.0 | 3 Mar 2026 | 14 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 20 Oct, 23:11 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:f2fbb02b53aebaa693ec5fcad4cb9c73ab2c9e5d012e7d7e72f3575160808895