{"record":{"id":"41d3dcf26b5ff138","repo":"BerriAI/litellm","slug":"setting-s-blocked-enterprise-keys-are-a-litellm","errorCode":null,"errorMessage":"Setting(s) {blocked_enterprise_keys} are a LiteLLM Enterprise feature and are not available on this build.","messagePattern":"Setting\\(s\\) (.+?) are a LiteLLM Enterprise feature and are not available on this build\\.","errorType":"http","errorClass":"HTTPException","httpStatus":403,"severity":"error","filePath":"litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py","lineNumber":1474,"sourceCode":"            ),\n        )\n\n    # Validate against the same effective class GET advertises, so\n    # enterprise-registered fields are typed consistently on both sides.\n    effective_cls: Final = _get_effective_ui_settings_class()\n    try:\n        settings: Final = effective_cls.model_validate(settings_body)\n    except ValidationError as e:\n        raise HTTPException(status_code=422, detail=e.errors())\n\n    # Only include fields the caller actually sent (not Pydantic defaults).\n    settings_dict: Final[Mapping[str, JsonValue]] = settings.model_dump(exclude_unset=True)\n\n    # Reject enterprise-only settings up front so the caller gets a clear\n    # signal instead of a silent drop.\n    blocked_enterprise_keys = sorted((settings_dict.keys() & _ENTERPRISE_ONLY_UI_SETTINGS) - ALLOWED_UI_SETTINGS_FIELDS)\n    if blocked_enterprise_keys:\n        raise HTTPException(\n            status_code=403,\n            detail={\n                \"error\": (\n                    f\"Setting(s) {blocked_enterprise_keys} are a LiteLLM \"\n                    \"Enterprise feature and are not available on this build.\"\n                )\n            },\n        )\n\n    # Enforce allowlist and drop anything unexpected\n    incoming: Final = {k: v for k, v in settings_dict.items() if k in ALLOWED_UI_SETTINGS_FIELDS}\n\n    # Merge with existing persisted settings so a partial PATCH doesn't\n    # overwrite fields the caller didn't send.\n    existing: dict[str, JsonValue] = {}\n    db_existing: Final = await _ui_settings_db(UISettingsRepository(prisma_client)).find_unique(\n        where={\"id\": \"ui_settings\"}\n    )","sourceCodeStart":1456,"sourceCodeEnd":1492,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py#L1456-L1492","documentation":"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.","triggerScenarios":"Thrown at litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py:1474 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Remove the enterprise-only keys from the payload, or run a LiteLLM Enterprise build with LITELLM_LICENSE set."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}