headroomlabs-ai/headroom · error · KeyError

No optimizer registered for '{key}'. Available: {available}

Error message

No optimizer registered for '{key}'. Available: {available}

What it means

The optimizer registry (headroom/cache/registry.py) maps provider or provider-tier keys to optimizer classes. get_optimizer builds a key f"{provider}-{tier}" for non-oss tiers and falls back to the bare provider name if that enterprise key is absent; if neither is registered it raises KeyError listing the available keys. The error therefore means neither the tier-specific nor the base provider optimizer was registered — typically because the provider module that registers it was never imported.

Source

Thrown at headroom/cache/registry.py:109

        Returns:
            Cache optimizer instance

        Raises:
            KeyError: If no optimizer registered for provider/tier
        """
        # Build the lookup key
        if tier != "oss":
            key = f"{provider}-{tier}"
            # Fall back to OSS if enterprise not available
            if key not in cls._optimizers:
                key = provider
        else:
            key = provider

        if key not in cls._optimizers:
            available = list(cls._optimizers.keys())
            raise KeyError(f"No optimizer registered for '{key}'. Available: {available}")

        # Return cached instance if requested
        cache_key = f"{key}:{id(config)}" if config else key
        if cached and cache_key in cls._instances:
            return cls._instances[cache_key]

        # Create new instance
        optimizer_class = cls._optimizers[key]
        instance = optimizer_class(config)

        if cached:
            cls._instances[cache_key] = instance

        return instance

    @classmethod
    def list_providers(cls) -> list[str]:
        """List all registered provider names (excluding tier suffixes)."""

View on GitHub (pinned to 322425c43b)

Solutions

  1. Import the module that registers the optimizer before calling get (e.g. from headroom.cache import anthropic_optimizer) so its @OptimizerRegistry.register decorator runs
  2. Use a key from the 'Available: [...]' list in the message — match provider name and drop to tier='oss' if the enterprise variant isn't registered
  3. Verify spelling and case of provider ('anthropic', 'openai', 'google') against the registered keys
  4. If you implemented a custom optimizer, register it explicitly with OptimizerRegistry.register(key, cls)

Example fix

# before
opt = OptimizerRegistry.get(provider="anthropic", tier="enterprise")  # KeyError

# after
from headroom.cache.anthropic_optimizer import register as _reg  # side-effect registers key
_reg()
opt = OptimizerRegistry.get(provider="anthropic", tier="oss")
Defensive patterns

Strategy: validation

Validate before calling

from headroom.cache.registry import OptimizerRegistry
key = f"{provider}-{tier}" if tier != "oss" else provider
if key not in OptimizerRegistry._optimizers and provider not in OptimizerRegistry._optimizers:
    raise SystemExit(f"optimizer {key!r} not registered; import its module first")

Type guard

def optimizer_available(provider: str, tier: str = "oss") -> bool:
    from headroom.cache.registry import OptimizerRegistry
    opts = OptimizerRegistry._optimizers
    return (f"{provider}-{tier}" if tier != "oss" else provider) in opts or provider in opts

Try / catch

try:
    opt = OptimizerRegistry.get(provider=provider, tier=tier, config=cfg)
except KeyError as e:
    opt = OptimizerRegistry.get(provider=provider, tier="oss", config=cfg)  # downgrade tier

Prevention

When it happens

Trigger: Calling OptimizerRegistry.get(...) (or the cache API that delegates to it) with provider='anthropic', tier='enterprise' when only 'anthropic' or only OSS optimizers are registered; or any provider whose registering module (e.g. the anthropic/openai optimizer module) has not been imported yet, since registration happens at import time.

Common situations: Passing an enterprise tier without the enterprise extra installed; refactors that removed an import side effect; typo'd provider names ('Anthropic' vs 'anthropic'); running a minimal install where only some provider optimizers are available.

Related errors


AI-assisted analysis of headroomlabs-ai/headroom@322425c43b (2026-08-15). Data as JSON: /api/errors/e2553ed98652efc7. Report an issue: GitHub.