Skip to content

Commit 004820a

Browse files
committed
fix(tracing): support LANGCHAIN_* env fallback for LangSmith config
- add backward-compatible env parsing in tracing_config.py - support fallback keys: LANGCHAIN_TRACING_V2 / LANGCHAIN_TRACING LANGCHAIN_API_KEY LANGCHAIN_PROJECT LANGCHAIN_ENDPOINT - keep LANGSMITH_* as preferred source when both are present - add regression tests in test_tracing_config.py
1 parent d5135ab commit 004820a

2 files changed

Lines changed: 82 additions & 4 deletions

File tree

backend/src/config/tracing_config.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,25 @@ def is_configured(self) -> bool:
2525
_tracing_config: TracingConfig | None = None
2626

2727

28+
def _env_flag_true(*names: str) -> bool:
29+
"""Return True when any provided env var is set to a truthy value."""
30+
truthy_values = {"1", "true", "yes", "on"}
31+
for name in names:
32+
value = os.environ.get(name)
33+
if value and value.strip().lower() in truthy_values:
34+
return True
35+
return False
36+
37+
38+
def _first_env_value(*names: str) -> str | None:
39+
"""Return the first non-empty environment value from candidate names."""
40+
for name in names:
41+
value = os.environ.get(name)
42+
if value and value.strip():
43+
return value.strip()
44+
return None
45+
46+
2847
def get_tracing_config() -> TracingConfig:
2948
"""Get the current tracing configuration from environment variables.
3049
Returns:
@@ -37,10 +56,11 @@ def get_tracing_config() -> TracingConfig:
3756
if _tracing_config is not None: # Double-check after acquiring lock
3857
return _tracing_config
3958
_tracing_config = TracingConfig(
40-
enabled=os.environ.get("LANGSMITH_TRACING", "").lower() == "true",
41-
api_key=os.environ.get("LANGSMITH_API_KEY"),
42-
project=os.environ.get("LANGSMITH_PROJECT", "deer-flow"),
43-
endpoint=os.environ.get("LANGSMITH_ENDPOINT", "https://api.smith.langchain.com"),
59+
# Keep compatibility with both legacy LANGCHAIN_* and newer LANGSMITH_* variables.
60+
enabled=_env_flag_true("LANGSMITH_TRACING", "LANGCHAIN_TRACING_V2", "LANGCHAIN_TRACING"),
61+
api_key=_first_env_value("LANGSMITH_API_KEY", "LANGCHAIN_API_KEY"),
62+
project=_first_env_value("LANGSMITH_PROJECT", "LANGCHAIN_PROJECT") or "deer-flow",
63+
endpoint=_first_env_value("LANGSMITH_ENDPOINT", "LANGCHAIN_ENDPOINT") or "https://api.smith.langchain.com",
4464
)
4565
return _tracing_config
4666

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
"""Tests for src.config.tracing_config."""
2+
3+
from __future__ import annotations
4+
5+
from src.config import tracing_config as tracing_module
6+
7+
8+
def _reset_tracing_cache() -> None:
9+
tracing_module._tracing_config = None
10+
11+
12+
def test_prefers_langsmith_env_names(monkeypatch):
13+
monkeypatch.setenv("LANGSMITH_TRACING", "true")
14+
monkeypatch.setenv("LANGSMITH_API_KEY", "lsv2_key")
15+
monkeypatch.setenv("LANGSMITH_PROJECT", "smith-project")
16+
monkeypatch.setenv("LANGSMITH_ENDPOINT", "https://smith.example.com")
17+
18+
_reset_tracing_cache()
19+
cfg = tracing_module.get_tracing_config()
20+
21+
assert cfg.enabled is True
22+
assert cfg.api_key == "lsv2_key"
23+
assert cfg.project == "smith-project"
24+
assert cfg.endpoint == "https://smith.example.com"
25+
assert tracing_module.is_tracing_enabled() is True
26+
27+
28+
def test_falls_back_to_langchain_env_names(monkeypatch):
29+
monkeypatch.delenv("LANGSMITH_TRACING", raising=False)
30+
monkeypatch.delenv("LANGSMITH_API_KEY", raising=False)
31+
monkeypatch.delenv("LANGSMITH_PROJECT", raising=False)
32+
monkeypatch.delenv("LANGSMITH_ENDPOINT", raising=False)
33+
34+
monkeypatch.setenv("LANGCHAIN_TRACING_V2", "true")
35+
monkeypatch.setenv("LANGCHAIN_API_KEY", "legacy-key")
36+
monkeypatch.setenv("LANGCHAIN_PROJECT", "legacy-project")
37+
monkeypatch.setenv("LANGCHAIN_ENDPOINT", "https://legacy.example.com")
38+
39+
_reset_tracing_cache()
40+
cfg = tracing_module.get_tracing_config()
41+
42+
assert cfg.enabled is True
43+
assert cfg.api_key == "legacy-key"
44+
assert cfg.project == "legacy-project"
45+
assert cfg.endpoint == "https://legacy.example.com"
46+
assert tracing_module.is_tracing_enabled() is True
47+
48+
49+
def test_defaults_when_project_not_set(monkeypatch):
50+
monkeypatch.setenv("LANGSMITH_TRACING", "yes")
51+
monkeypatch.setenv("LANGSMITH_API_KEY", "key")
52+
monkeypatch.delenv("LANGSMITH_PROJECT", raising=False)
53+
monkeypatch.delenv("LANGCHAIN_PROJECT", raising=False)
54+
55+
_reset_tracing_cache()
56+
cfg = tracing_module.get_tracing_config()
57+
58+
assert cfg.project == "deer-flow"

0 commit comments

Comments
 (0)