fix(tracing): support LANGCHAIN_* env fallback for LangSmith config (#1065)

* 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

* fix(tracing): correct LANGSMITH_* precedence over LANGCHAIN_* for enabled flag (#1067)

* Initial plan

* fix(tracing): use first-present-wins logic for enabled flag, add precedence docs and test

Co-authored-by: WillemJiang <219644+WillemJiang@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: WillemJiang <219644+WillemJiang@users.noreply.github.com>

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
This commit is contained in:
Willem Jiang
2026-03-11 10:26:56 +08:00
committed by GitHub
parent f836d8e17c
commit 96dbee00e3
2 changed files with 116 additions and 4 deletions

View File

@@ -0,0 +1,71 @@
"""Tests for src.config.tracing_config."""
from __future__ import annotations
from src.config import tracing_config as tracing_module
def _reset_tracing_cache() -> None:
tracing_module._tracing_config = None
def test_prefers_langsmith_env_names(monkeypatch):
monkeypatch.setenv("LANGSMITH_TRACING", "true")
monkeypatch.setenv("LANGSMITH_API_KEY", "lsv2_key")
monkeypatch.setenv("LANGSMITH_PROJECT", "smith-project")
monkeypatch.setenv("LANGSMITH_ENDPOINT", "https://smith.example.com")
_reset_tracing_cache()
cfg = tracing_module.get_tracing_config()
assert cfg.enabled is True
assert cfg.api_key == "lsv2_key"
assert cfg.project == "smith-project"
assert cfg.endpoint == "https://smith.example.com"
assert tracing_module.is_tracing_enabled() is True
def test_falls_back_to_langchain_env_names(monkeypatch):
monkeypatch.delenv("LANGSMITH_TRACING", raising=False)
monkeypatch.delenv("LANGSMITH_API_KEY", raising=False)
monkeypatch.delenv("LANGSMITH_PROJECT", raising=False)
monkeypatch.delenv("LANGSMITH_ENDPOINT", raising=False)
monkeypatch.setenv("LANGCHAIN_TRACING_V2", "true")
monkeypatch.setenv("LANGCHAIN_API_KEY", "legacy-key")
monkeypatch.setenv("LANGCHAIN_PROJECT", "legacy-project")
monkeypatch.setenv("LANGCHAIN_ENDPOINT", "https://legacy.example.com")
_reset_tracing_cache()
cfg = tracing_module.get_tracing_config()
assert cfg.enabled is True
assert cfg.api_key == "legacy-key"
assert cfg.project == "legacy-project"
assert cfg.endpoint == "https://legacy.example.com"
assert tracing_module.is_tracing_enabled() is True
def test_langsmith_tracing_false_overrides_langchain_tracing_v2_true(monkeypatch):
"""LANGSMITH_TRACING=false must win over LANGCHAIN_TRACING_V2=true."""
monkeypatch.setenv("LANGSMITH_TRACING", "false")
monkeypatch.setenv("LANGCHAIN_TRACING_V2", "true")
monkeypatch.setenv("LANGSMITH_API_KEY", "some-key")
_reset_tracing_cache()
cfg = tracing_module.get_tracing_config()
assert cfg.enabled is False
assert tracing_module.is_tracing_enabled() is False
def test_defaults_when_project_not_set(monkeypatch):
monkeypatch.setenv("LANGSMITH_TRACING", "yes")
monkeypatch.setenv("LANGSMITH_API_KEY", "key")
monkeypatch.delenv("LANGSMITH_PROJECT", raising=False)
monkeypatch.delenv("LANGCHAIN_PROJECT", raising=False)
_reset_tracing_cache()
cfg = tracing_module.get_tracing_config()
assert cfg.project == "deer-flow"