Model Registry

The model registry lets transports advertise which models they support and what each model can do. This enables capability-based model selection and cost-aware routing.

ModelSpec

A frozen dataclass describing a single model:

@dataclass(frozen=True, slots=True)
class ModelSpec:
    id: str
    capabilities: frozenset[Capability] = frozenset()
    max_output_tokens: int = 8192
    context_window: int = 128000
    input_cost: float = 0.0
    output_cost: float = 0.0

Capability

Models declare their capabilities via a StrEnum:

class Capability(StrEnum):
    text = "text"
    vision = "vision"
    reasoning = "reasoning"
    tool_use = "tool_use"
    json_mode = "json_mode"
    structured_outputs = "structured_outputs"
    embedding = "embedding"

ModelRegistry

A dict-like container for ModelSpec values with powerful query methods:

registry = ModelRegistry()
registry["gpt-4o"] = ModelSpec(
    id="gpt-4o",
    capabilities=frozenset({Capability.text, Capability.vision, Capability.tool_use}),
    context_window=128000,
    input_cost=2.50,
    output_cost=10.00,
)

Query methods

All query methods return a new ModelRegistry, so they can be chained:

by_prefix(prefix)

Filter models whose ID starts with a prefix.

registry.by_prefix("gpt-4")
by_capability(*caps)

Keep only models that have all specified capabilities.

registry.by_capability(Capability.vision, Capability.tool_use)
search(*q)

Keep models whose ID contains all query substrings.

registry.search("gpt", "4o")
by_cost(*, output=False, desc=False)

Sort by input cost (default) or output cost, ascending or descending.

cheapest = registry.by_cost()            # cheapest input first
priciest = registry.by_cost(desc=True)   # most expensive first
ids()

Return a plain list of model ID strings.

registry.by_capability(Capability.vision).ids()
# ["gpt-4o", "gpt-4o-mini", ...]

Chaining example

# Find the cheapest vision-capable model with tool use
model = (
    registry
    .by_capability(Capability.vision, Capability.tool_use)
    .by_cost()
    .ids()[0]
)