{"record":{"id":"aecc297b688051bd","repo":"BerriAI/litellm","slug":"missing-slack-webhook-url-from-environment","errorCode":null,"errorMessage":"Missing SLACK_WEBHOOK_URL from environment","messagePattern":"Missing SLACK_WEBHOOK_URL from environment","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/integrations/SlackAlerting/slack_alerting.py","lineNumber":1345,"sourceCode":"            return\n        if alert_type not in self.alert_types:\n            return\n\n        from datetime import datetime\n\n        # Check if digest mode is enabled for this alert type\n        alert_type_name_str: Final = getattr(alert_type, \"value\", str(alert_type))\n        _atc: Final = self.alert_type_config.get(alert_type_name_str)\n        if _atc is not None and _atc.digest:\n            # Resolve webhook URL for this alert type (needed for digest entry)\n            if self.alert_to_webhook_url is not None and alert_type in self.alert_to_webhook_url:\n                _digest_webhook: str | list[str] | None = self.alert_to_webhook_url[alert_type]\n            elif self.default_webhook_url is not None:\n                _digest_webhook = self.default_webhook_url\n            else:\n                _digest_webhook = os.getenv(\"SLACK_WEBHOOK_URL\", None)\n            if _digest_webhook is None:\n                raise ValueError(\"Missing SLACK_WEBHOOK_URL from environment\")\n\n            digest_key: Final = f\"{alert_type_name_str}:{request_model or ''}:{api_base or ''}\"\n\n            async with self.digest_lock:\n                now: Final = datetime.now()\n                if digest_key in self.digest_buckets:\n                    self.digest_buckets[digest_key][\"count\"] += 1\n                    self.digest_buckets[digest_key][\"last_time\"] = now\n                else:\n                    self.digest_buckets[digest_key] = DigestEntry(\n                        alert_type=alert_type_name_str,\n                        request_model=request_model or \"\",\n                        api_base=api_base or \"\",\n                        first_message=message,\n                        level=level,\n                        count=1,\n                        start_time=now,\n                        last_time=now,","sourceCodeStart":1327,"sourceCodeEnd":1363,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/integrations/SlackAlerting/slack_alerting.py#L1327-L1363","documentation":"For alert types configured with digest mode, litellm resolves a webhook URL (per-alert mapping, then default_webhook_url, then SLACK_WEBHOOK_URL env) before enqueueing a digest entry; if all three are None it raises ValueError (litellm/integrations/SlackAlerting/slack_alerting.py:1345).","triggerScenarios":"Enabling a digest alert type in alert_types (e.g. 'spend_tracked') without configuring any webhook: no alert_to_webhook_url entry, no default SLACK_WEBHOOK_URL in env/config, and SLACK_WEBHOOK_URL unset.","commonSituations":"Enabling new alert types in litellm.yaml while the webhook is only configured for other types; deploying to a new environment missing the SLACK_WEBHOOK_URL secret.","solutions":["Set SLACK_WEBHOOK_URL in the proxy environment","Or configure a webhook URL in general_settings (default webhook) or per-alert in alert_to_webhook_url","Disable digest mode for that alert type if no webhook is intended","Verify env propagation into docker/k8s deployment"],"exampleFix":"# before\nlitellm_settings:\n  alerting: [\"spend_tracked\"]  # no webhook anywhere\n\n# after\n# env: SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T000/B000/XXXX\nlitellm_settings:\n  alerting: [\"spend_tracked\"]","handlingStrategy":"validation","validationCode":"import os\n\ndef digest_webhook_available(alerting) -> bool:\n    return bool(\n        getattr(alerting, \"default_webhook_url\", None)\n        or getattr(alerting, \"alert_to_webhook_url\", None)\n        or os.getenv(\"SLACK_WEBHOOK_URL\")\n    )","typeGuard":null,"tryCatchPattern":"try:\n    await alerting._send_alert(...)\nexcept ValueError as e:\n    if \"Missing SLACK_WEBHOOK_URL\" in str(e):\n        log.warning(\"alert skipped: no webhook configured\")\n    else:\n        raise","preventionTips":["Configure SLACK_WEBHOOK_URL (or per-alert webhooks) whenever digest alert types are enabled","Validate alerting env vars in deployment manifests","Disable digest mode for alert types without webhooks"],"tags":["alerting","slack","webhook","environment-variables","digest"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}