BerriAI/litellm · error · HTTPException

Setting(s) {blocked_enterprise_keys} are a LiteLLM Enterpris

Error message

Setting(s) {blocked_enterprise_keys} are a LiteLLM Enterprise feature and are not available on this build.

What it means

Licensing guard in update_ui_settings: the request includes UI settings that are only registered by litellm-enterprise, which is absent from this build. The keys are named so the caller knows exactly which fields are enterprise-gated; they cannot be set on the open-source build regardless of values.

Source

Thrown at litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py:1474

            ),
        )

    # Validate against the same effective class GET advertises, so
    # enterprise-registered fields are typed consistently on both sides.
    effective_cls: Final = _get_effective_ui_settings_class()
    try:
        settings: Final = effective_cls.model_validate(settings_body)
    except ValidationError as e:
        raise HTTPException(status_code=422, detail=e.errors())

    # Only include fields the caller actually sent (not Pydantic defaults).
    settings_dict: Final[Mapping[str, JsonValue]] = settings.model_dump(exclude_unset=True)

    # Reject enterprise-only settings up front so the caller gets a clear
    # signal instead of a silent drop.
    blocked_enterprise_keys = sorted((settings_dict.keys() & _ENTERPRISE_ONLY_UI_SETTINGS) - ALLOWED_UI_SETTINGS_FIELDS)
    if blocked_enterprise_keys:
        raise HTTPException(
            status_code=403,
            detail={
                "error": (
                    f"Setting(s) {blocked_enterprise_keys} are a LiteLLM "
                    "Enterprise feature and are not available on this build."
                )
            },
        )

    # Enforce allowlist and drop anything unexpected
    incoming: Final = {k: v for k, v in settings_dict.items() if k in ALLOWED_UI_SETTINGS_FIELDS}

    # Merge with existing persisted settings so a partial PATCH doesn't
    # overwrite fields the caller didn't send.
    existing: dict[str, JsonValue] = {}
    db_existing: Final = await _ui_settings_db(UISettingsRepository(prisma_client)).find_unique(
        where={"id": "ui_settings"}
    )

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. Remove the enterprise-only keys from the payload, or run a LiteLLM Enterprise build with LITELLM_LICENSE set.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py:1474 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18). Data as JSON: /api/errors/41d3dcf26b5ff138. Report an issue: GitHub.