default feature flag to False (opt-in), fix CodeQL log injection, update docs

This commit is contained in:
michelligabriele 2026-03-24 14:50:48 +01:00
parent be153a0874
commit e4e9362919
No known key found for this signature in database
4 changed files with 30 additions and 23 deletions

View file

@ -236,9 +236,9 @@ The referenced credential can contain any combination of:
Only keys present in the credential are applied. Keys already in the request (e.g. clientside `api_version`) are never overwritten.
## Disabling the Feature
## Enabling the Feature
The feature is enabled by default. To disable it globally:
This feature is **disabled by default** and must be explicitly enabled. To enable it:
<Tabs>
@ -246,7 +246,7 @@ The feature is enabled by default. To disable it globally:
```yaml
litellm_settings:
enable_model_config_credential_overrides: false
enable_model_config_credential_overrides: true
```
</TabItem>
@ -254,13 +254,17 @@ litellm_settings:
<TabItem value="env" label="Environment Variable">
```bash
export LITELLM_ENABLE_MODEL_CONFIG_CREDENTIAL_OVERRIDES=false
export LITELLM_ENABLE_MODEL_CONFIG_CREDENTIAL_OVERRIDES=true
```
</TabItem>
</Tabs>
:::info
The feature flag must be enabled before `model_config` entries in team/project metadata take effect. Without it, credential routing is completely inert — no metadata is read, no credentials are resolved.
:::
## Related Documentation
- [Adding LLM Credentials](./ui_credentials.md) — Create and manage reusable credentials

View file

@ -318,7 +318,7 @@ return_response_headers: bool = (
False # get response headers from LLM Api providers - example x-remaining-requests,
)
enable_json_schema_validation: bool = False
enable_model_config_credential_overrides: bool = True
enable_model_config_credential_overrides: bool = False
enable_key_alias_format_validation: bool = (
False # opt-in validation of key_alias format on /key/generate and /key/update
)

View file

@ -1363,7 +1363,7 @@ def _apply_credential_overrides_from_model_config(
5. Team default override (defaultconfig)
6. Deployment default (no action needed)
"""
# Feature flag gate — operators can disable this with litellm.enable_model_config_credential_overrides = False
# Feature flag gate — disabled by default, opt in with litellm.enable_model_config_credential_overrides = True
if not litellm.enable_model_config_credential_overrides:
return
@ -1402,9 +1402,10 @@ def _apply_credential_overrides_from_model_config(
credential_values = CredentialAccessor.get_credential_values(credential_name)
if not credential_values:
_safe_cred = str(credential_name).replace("\n", "").replace("\r", "")
verbose_proxy_logger.warning(
"model_config references credential '%s' but it was not found or has no values",
credential_name,
_safe_cred,
)
return
@ -1413,10 +1414,12 @@ def _apply_credential_overrides_from_model_config(
if key in credential_values and key not in data:
data[key] = credential_values[key]
_safe_model = str(model_name).replace("\n", "").replace("\r", "")
_safe_cred = str(credential_name).replace("\n", "").replace("\r", "")
verbose_proxy_logger.debug(
"Applied credential override '%s' for model '%s'",
credential_name,
model_name,
_safe_cred,
_safe_model,
)
@ -1461,10 +1464,11 @@ def _resolve_credential_from_model_config(
)
if credential_name:
return credential_name
_safe_name = str(name).replace("\n", "").replace("\r", "")
verbose_proxy_logger.debug(
"model_config entry '%s' found but has no litellm_credentials, "
"falling through to defaultconfig",
name,
_safe_name,
)
# Default check

View file

@ -1830,8 +1830,10 @@ async def test_bearer_token_not_in_debug_logs():
@pytest.fixture()
def setup_test_credentials():
"""Populate litellm.credential_list with test credentials, clean up after."""
"""Populate litellm.credential_list with test credentials and enable feature flag, clean up after."""
original = litellm.credential_list[:]
original_flag = litellm.enable_model_config_credential_overrides
litellm.enable_model_config_credential_overrides = True
litellm.credential_list.extend(
[
CredentialItem(
@ -1879,6 +1881,7 @@ def setup_test_credentials():
)
yield
litellm.credential_list[:] = original
litellm.enable_model_config_credential_overrides = original_flag
# --- Unit tests for _extract_credential_from_entry ---
@ -2304,8 +2307,9 @@ def test_apply_overrides_with_alias(setup_test_credentials):
assert data["api_key"] == "key-hotel-eastus"
def test_apply_overrides_feature_flag_disabled(setup_test_credentials):
"""Feature flag litellm.enable_model_config_credential_overrides disables the feature."""
def test_apply_overrides_feature_flag_disabled_by_default():
"""Feature flag defaults to False — credential overrides are inert until explicitly enabled."""
assert litellm.enable_model_config_credential_overrides is False
data = {"model": "gpt-4"}
user_api_key_dict = UserAPIKeyAuth(
api_key="test-key",
@ -2315,16 +2319,11 @@ def test_apply_overrides_feature_flag_disabled(setup_test_credentials):
}
},
)
original = litellm.enable_model_config_credential_overrides
try:
litellm.enable_model_config_credential_overrides = False
_apply_credential_overrides_from_model_config(
data=data, user_api_key_dict=user_api_key_dict
)
assert "api_base" not in data
assert "api_key" not in data
finally:
litellm.enable_model_config_credential_overrides = original
_apply_credential_overrides_from_model_config(
data=data, user_api_key_dict=user_api_key_dict
)
assert "api_base" not in data
assert "api_key" not in data
def test_extract_credential_provider_hint_prefers_exact_match():