{"record":{"id":"69ed1dbee632952d","repo":"BerriAI/litellm","slug":"posthog-credentials-not-found-in-kwargs","errorCode":null,"errorMessage":"PostHog credentials not found in kwargs","messagePattern":"PostHog credentials not found in kwargs","errorType":"validation","errorClass":"Exception","httpStatus":null,"severity":"warning","filePath":"litellm/integrations/posthog.py","lineNumber":84,"sourceCode":"            self.flush_lock = None\n            self.log_queue = []\n\n            # Register cleanup handler to flush internal queue on exit\n            atexit.register(self._flush_on_exit)\n\n            super().__init__(**kwargs, flush_lock=None, batch_size=POSTHOG_MAX_BATCH_SIZE)\n\n        except Exception as e:\n            verbose_logger.exception(\"PostHog: Got exception on init PostHog client %s\", e)\n            raise e\n\n    def log_success_event(self, kwargs, response_obj, start_time, end_time):\n        try:\n            verbose_logger.debug(\"PostHog: Sync logging - Enters logging function for model %s\", kwargs)\n\n            api_key, api_url = self._get_credentials_for_request(kwargs)\n            if api_key is None or api_url is None:\n                raise Exception(\"PostHog credentials not found in kwargs\")\n            event_payload: Final = self.create_posthog_event_payload(kwargs)\n\n            headers: Final = {\n                \"Content-Type\": \"application/json\",\n            }\n\n            payload: Final = self._create_posthog_payload([event_payload], api_key)\n            capture_url: Final = f\"{api_url.rstrip('/')}/batch/\"\n\n            response: Final = self.sync_client.post(\n                url=capture_url,\n                content=safe_dumps(payload),\n                headers=headers,\n            )\n            response.raise_for_status()\n\n            if response.status_code != 200:\n                raise Exception(f\"Response from PostHog API status_code: {response.status_code}, text: {response.text}\")","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/integrations/posthog.py#L66-L102","documentation":"Inside log_success_event, PostHog credentials are resolved per request from standard_callback_dynamic_params (posthog_api_key / posthog_api_url) falling back to the instance defaults captured at init; if the final (api_key, api_url) pair contains None this Exception is raised. In stock deployments it is nearly unreachable — init already refuses to start without POSTHOG_API_KEY — and the enclosing try/except swallows it into a verbose_logger.exception, so the LLM call is never affected; you only see it in logs.","triggerScenarios":"A PostHogLogger subclass or patched instance whose POSTHOG_API_KEY / posthog_host attributes were deleted or never assigned; passing standard_callback_dynamic_params that explicitly set posthog_api_key=None while instance defaults are also missing; test fixtures mutating the logger.","commonSituations":"Custom subclasses overriding __init__ without calling super(); unit tests that monkeypatch credential attributes to None; almost never seen in normal proxy/SDK usage.","solutions":["Confirm POSTHOG_API_KEY is set in the running process and restart so __init__ captures it","If forwarding per-request dynamic params, send real posthog_api_key / posthog_api_url values rather than explicit None","Audit any subclass or patch of PostHogLogger so instance attributes survive initialization"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"logger = PostHogLogger()\nif not getattr(logger, 'POSTHOG_API_KEY', None) or not getattr(logger, 'posthog_host', None):\n    raise RuntimeError('PostHog credentials missing on logger instance')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not subclass/patch PostHogLogger in ways that drop instance credential attributes","If forwarding standard_callback_dynamic_params, always include real values or omit the keys","Watch verbose logs: this error is only ever logged, never raised to callers"],"tags":["posthog","telemetry","credentials","callback"],"backgroundTag":"missing-credentials","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}