From bbf96199d8b1d14e64fb29eeab7b515e0f603707 Mon Sep 17 00:00:00 2001 From: milan Date: Wed, 26 Aug 2026 05:01:07 +0000 Subject: [PATCH] fix(langfuse): only pass environment when the SDK client supports it Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/integrations/langfuse/langfuse.py | 4 +++- .../integrations/test_langfuse.py | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/litellm/integrations/langfuse/langfuse.py b/litellm/integrations/langfuse/langfuse.py index 37685b582c6..86e392fc166 100644 --- a/litellm/integrations/langfuse/langfuse.py +++ b/litellm/integrations/langfuse/langfuse.py @@ -1,5 +1,6 @@ #### What this does #### # On success, logs events to Langfuse +import inspect import os import traceback from collections.abc import Callable, Iterable, Mapping @@ -181,10 +182,11 @@ class LangFuseLogger: "debug": self.langfuse_debug, "flush_interval": self.langfuse_flush_interval, # flush interval in seconds "httpx_client": self.langfuse_client, - "environment": self.langfuse_environment, } self.langfuse_sdk_version: str = langfuse.version.__version__ + if "environment" in inspect.signature(Langfuse.__init__).parameters: + parameters["environment"] = self.langfuse_environment if Version(self.langfuse_sdk_version) >= Version("2.6.0"): parameters["sdk_integration"] = "litellm" self.Langfuse: Langfuse = self.safe_init_langfuse_client(parameters) diff --git a/tests/test_litellm/integrations/test_langfuse.py b/tests/test_litellm/integrations/test_langfuse.py index f7c5a774bdb..0d717c67829 100644 --- a/tests/test_litellm/integrations/test_langfuse.py +++ b/tests/test_litellm/integrations/test_langfuse.py @@ -1179,6 +1179,14 @@ def test_max_langfuse_clients_limit(): class _RecordingLangfuse: last_parameters: Optional[dict] = None + def __init__(self, environment=None, **parameters): + type(self).last_parameters = {"environment": environment, **parameters} + self.client = MagicMock() + + +class _RecordingLangfuseWithoutEnvironment: + last_parameters: Optional[dict] = None + def __init__(self, **parameters): type(self).last_parameters = parameters self.client = MagicMock() @@ -1224,6 +1232,19 @@ def test_langfuse_environment_falls_back_to_deployment_env_var(monkeypatch): assert _RecordingLangfuse.last_parameters["environment"] == "deployment-wide" +def test_langfuse_environment_omitted_for_old_sdk_versions(monkeypatch): + monkeypatch.setenv("LANGFUSE_MOCK", "false") + monkeypatch.setattr(litellm, "initialized_langfuse_clients", 0) + with patch("langfuse.Langfuse", _RecordingLangfuseWithoutEnvironment): + LangFuseLogger( + langfuse_public_key="pk-env", + langfuse_secret="sk-env", + langfuse_host="https://test.langfuse.com", + langfuse_environment="staging", + ) + assert "environment" not in _RecordingLangfuseWithoutEnvironment.last_parameters + + def test_dynamic_langfuse_environment_triggers_dynamic_logger(): from litellm.integrations.langfuse.langfuse_handler import LangFuseHandler from litellm.types.utils import StandardCallbackDynamicParams