* fix(datadog): pass callback_specific_params so DatadogCostManagementLogger receives cost_tag_keys (#29590) * fix(datadog): pass callback_specific_params so DatadogCostManagementLogger receives cost_tag_keys * test(proxy): regression test that load_config forwards callback_specific_params * fix(proxy): guard lakera_prompt_injection callback_specific_params against non-dict Addresses review feedback: forwarding callback_settings as callback_specific_params (so DatadogCostManagementLogger receives cost_tag_keys) exposed the lakera_prompt_injection branch, which did lakeraAI_Moderation(**callback_specific_params ["lakera_prompt_injection"]) with no type guard. A config like `callback_settings: {lakera_prompt_injection: "any-string"}` then hit `**"any-string"` -> TypeError: argument after ** must be a mapping, not str. Guard the lakera branch with isinstance(dict), matching the existing presidio and datadog_cost_management branches (non-dict values fall back to {}). Add a regression test asserting initialize_callbacks_on_proxy ignores a non-dict value instead of crashing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test: inject fake lakera_ai module to avoid importing the real one CI fix for the lakera regression test: it stubbed litellm.proxy.proxy_server with a SimpleNamespace and then monkeypatch.setattr'd the real lakera_ai module, which forces importing it — and lakera_ai does `from litellm.proxy.proxy_server import LiteLLM_TeamTable`, absent on the stub -> ImportError under proxy-infra tests. Inject a fake lakera_ai module into sys.modules instead, so the callbacks branch's `from ...lakera_ai import lakeraAI_Moderation` resolves to the stub without loading the real module. The guard under test (isinstance(dict) in the lakera branch) is unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(callbacks): guard compression/websearch interceptors against non-dict callback_settings (#30153) #29590 forwards the full callback_settings dict into initialize_callbacks_on_proxy, which activates the compression_interception and websearch_interception consumers. Their initialize_from_proxy_config read the callback_settings subkey without an isinstance(dict) guard, so a non-dict value such as `compression_interception: true` reached from_config_yaml(...).get(...) and aborted proxy startup with AttributeError. #29590 added that guard for lakera_prompt_injection but not for these two Mirror the isinstance(dict) guard already used by the lakera, presidio, and datadog branches so a non-dict value is ignored and the callback initializes with defaults. A parametrized test feeds every callback_settings consumer a non-dict value through initialize_callbacks_on_proxy to catch a future consumer that forgets the guard * fix(callbacks): normalize non-dict callback_specific_params to empty dict A blank callback_settings: key in YAML loads as None, and config.get('callback_settings', {}) returns None because dict.get only falls back to the default when the key is absent. Forwarding that value verbatim to initialize_callbacks_on_proxy made the first '<name>' in callback_specific_params membership test raise TypeError: argument of type 'NoneType' is not iterable, aborting proxy startup. Same failure for any non-dict root such as callback_settings: true. Normalize the value at the function boundary so both callsites (and any future ones) initialize callbacks with their defaults instead of crashing. --------- Co-authored-by: Hedi Daoud <150018939+hdaoud23@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| _types | ||
| agentops | ||
| arize | ||
| azure_sentinel | ||
| azure_storage | ||
| bitbucket | ||
| cloudzero | ||
| compression_interception | ||
| datadog | ||
| deepeval | ||
| dotprompt | ||
| email_templates | ||
| focus | ||
| gcs_bucket | ||
| gcs_pubsub | ||
| generic_api | ||
| generic_prompt_management | ||
| gitlab | ||
| langfuse | ||
| levo | ||
| litellm_agent | ||
| opentelemetry_utils | ||
| opik | ||
| otel | ||
| prometheus_helpers | ||
| SlackAlerting | ||
| vantage | ||
| vector_store_integrations | ||
| weave | ||
| websearch_interception | ||
| __init__.py | ||
| additional_logging_utils.py | ||
| anthropic_cache_control_hook.py | ||
| argilla.py | ||
| athina.py | ||
| braintrust_logging.py | ||
| braintrust_mock_client.py | ||
| callback_configs.json | ||
| custom_batch_logger.py | ||
| custom_guardrail.py | ||
| custom_logger.py | ||
| custom_prompt_management.py | ||
| custom_secret_manager.py | ||
| custom_sso_handler.py | ||
| dynamodb.py | ||
| email_alerting.py | ||
| galileo.py | ||
| greenscale.py | ||
| helicone_mock_client.py | ||
| helicone.py | ||
| humanloop.py | ||
| lago.py | ||
| langsmith_mock_client.py | ||
| langsmith.py | ||
| langtrace.py | ||
| literal_ai.py | ||
| logfire_logger.py | ||
| lunary.py | ||
| mlflow.py | ||
| mock_client_factory.py | ||
| openmeter.py | ||
| opentelemetry.py | ||
| posthog_mock_client.py | ||
| posthog.py | ||
| prometheus_services.py | ||
| prometheus.py | ||
| prompt_layer.py | ||
| prompt_management_base.py | ||
| Readme.md | ||
| rubrik.py | ||
| s3_v2.py | ||
| s3.py | ||
| sqs.py | ||
| supabase.py | ||
| test_httpx.py | ||
| traceloop.py | ||
| weights_biases.py | ||
Integrations
This folder contains logging integrations for litellm
eg. logging to Datadog, Langfuse, Prometheus, s3, GCS Bucket, etc.