Skip to main content

Registry-driven LLM routing: build classifier prompts from agent descriptions, validate decisions, and dispatch.

Project description

agent-registry-router

CI PyPI Python License

Registry-driven LLM routing: build classifier prompts from agent descriptions, validate decisions, and dispatch to other agents.

What is this? Why use it?

agent-registry-router helps you route LLM traffic to the right agent by:

  • Keeping a registry of agents
  • Building classifier prompts from that registry
  • Validating classifier decisions with clear, typed errors
  • Dispatching to runtime agents with optional observability hooks (on_event) for logging/metrics.

Use it when you need:

  • A stable contract between your classifier and execution layer
  • Deterministic, size-aware prompt construction
  • Lightweight integration with frameworks like PydanticAI
  • Extensibility: plug your own classifier/agents, add hooks for monitoring, and keep routing logic decoupled from business logic

Features

  • Registry-driven classifier prompts (deterministic order, routable-only, size-aware)
  • Fail-fast validation with typed errors (no silent fallbacks)
  • PydanticAI dispatcher with pinned bypass and observability hooks (on_event)
  • Typed package (py.typed) and CI gates (ruff/black/mypy/pytest-cov)
  • FastAPI demo with pinned bypass: examples/fastapi_pinned_bypass/README.md

Scope

  • Routing, validation, observability; bring your own LLM clients/agents.
  • Adapters are opt-in; core stays lightweight.

Status

  • v0.2.0 — fail-fast by default; API surface stable; adapters namespaced.

Install (uv)

From PyPI:

uv pip install agent-registry-router

From a checkout of this repo (dev/editable):

uv venv
source .venv/bin/activate
uv pip install -e .

Core usage

from agent_registry_router.core import (
    AgentRegistration,
    AgentRegistry,
    RouteDecision,
    build_classifier_system_prompt,
    validate_route_decision,
)

registry = AgentRegistry()
registry.register(AgentRegistration(name="general", description="General help."))
registry.register(AgentRegistration(name="special", description="Special help."))

prompt = build_classifier_system_prompt(
    registry,
    preamble="You are a query classifier that routes user messages to the appropriate agent.",
    default_agent="general",
)

decision = RouteDecision(agent="special", confidence=0.9, reasoning="Clear match.")
validated = validate_route_decision(decision, registry=registry, default_agent="general")

Behavior & errors

  • Default agent must be routable; unknown agents or empty registries raise.
  • Classifier selecting a non-routable agent raises InvalidRouteDecision.
  • Missing default or no routable agents raises InvalidFallback.
  • Dispatcher raises AgentNotFound if the chosen agent cannot be resolved.
  • Registry validation uses RegistryError; routing errors derive from RoutingError.
  • Confidence adjustment on invalid routes is unchanged; pinned invalid falls back to the classifier.
  • Prompt listing preserves registration order; only routable agents are included.
  • Agent descriptions are capped at 512 characters; prompts cannot be built without routable agents. Optional max_prompt_chars can bound the generated prompt.
  • Observability: PydanticAIDispatcher accepts on_event callback (receives RoutingEvent) and optional logger; emits events for classifier run, validation, pinned bypass, agent resolution, and agent run.

API contracts

  • Public imports (agent_registry_router.core): AgentRegistry, AgentRegistration, RouteDecision, ValidatedRouteDecision, validate_route_decision, build_classifier_system_prompt, exceptions (AgentRegistryRouterError, RegistryError, RoutingError, InvalidRouteDecision, InvalidFallback, AgentNotFound), and RoutingEvent.
  • Adapter: agent_registry_router.adapters.pydantic_ai exposes PydanticAIDispatcher, DispatchResult. Adapters stay namespaced (not re-exported at package root).
  • Routing invariants: default agent must be routable; empty registry errors; non-routable selections error; pinned invalid falls back to classifier; classifier output must include agent and confidence or InvalidRouteDecision is raised.
  • Prompt determinism: preserves registration order; only routable agents; optional max_prompt_chars; description cap 512 chars.
  • Hooks: on_event receives RoutingEvent(kind, payload, error); hook failures are swallowed; logger is optional.

Adapters

  • PydanticAI dispatcher: src/agent_registry_router/adapters/pydantic_ai/README.md

Tests (uv)

uv pip install -e ".[dev]"
ruff check .
black --check .
mypy --config-file pyproject.mypy.ini .
pytest --cov=agent_registry_router --cov-fail-under=85

Example: FastAPI pinned bypass

See examples/fastapi_pinned_bypass/.

License

Apache-2.0 (see LICENSE).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agent_registry_router-0.2.2.tar.gz (8.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agent_registry_router-0.2.2-py3-none-any.whl (11.5 kB view details)

Uploaded Python 3

File details

Details for the file agent_registry_router-0.2.2.tar.gz.

File metadata

  • Download URL: agent_registry_router-0.2.2.tar.gz
  • Upload date:
  • Size: 8.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for agent_registry_router-0.2.2.tar.gz
Algorithm Hash digest
SHA256 fd026dee5d2193e8484cc8c9e1f465bbd0671b05f96386d2100495aa6537e1f1
MD5 6d7119f65434a25156e74f227b24c32a
BLAKE2b-256 872c19c2d7537edaf674c54e3efa831a7f6372d812272e7d96dc1b0aec5ad97b

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_registry_router-0.2.2.tar.gz:

Publisher: publish-pypi.yml on agibson22/agent-registry-router

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file agent_registry_router-0.2.2-py3-none-any.whl.

File metadata

File hashes

Hashes for agent_registry_router-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 840cc440a7e1b817a5e51bf65d71bf1dea1dc1086788f03eac708faa2a89983a
MD5 8686269866b8c6dfb418013dfc201e71
BLAKE2b-256 97244333c98d580e22886d37425caa2d4bf4f92130cbbd049ba2f7ae6bbbf3cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_registry_router-0.2.2-py3-none-any.whl:

Publisher: publish-pypi.yml on agibson22/agent-registry-router

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page