本页面介绍如何控制 LangSmith 发送追踪记录的位置:

静态设置目标项目

LangSmith 使用 项目 的概念来对追踪记录进行分组。如果未指定,项目将默认为 default。 您可以设置 LANGSMITH_PROJECT 环境变量,为整个应用程序运行配置自定义项目名称。在运行应用程序之前进行设置:
LANGSMITH_PROJECT 标志仅在 JS SDK 版本 >= 0.2.16 中受支持,如果您使用的是旧版本,请改用 LANGCHAIN_PROJECT。
如果指定的项目不存在,LangSmith 将在接收到第一条追踪记录时自动创建它。

动态设置目标项目

您也可以在程序运行时通过多种方式设置项目名称,具体取决于您为追踪标注代码的方式。当您希望将同一应用程序中的追踪记录记录到不同项目时,这非常有用:
  • 在装饰或配置时传递项目名称。
  • 为每次单独调用覆盖项目名称。
  • 在直接构造运行时设置项目名称。
使用以下方法动态设置项目名称会覆盖通过 LANGSMITH_PROJECT 环境变量设置的项目名称。

动态设置目标工作区

如果您需要根据运行时配置(例如,将不同用户或租户路由到单独的工作区)动态将追踪记录路由到不同的 LangSmith 工作区,其方法因语言而异:
  • Python:使用特定于工作区的 LangSmith 客户端,并配合 tracing_context。
  • TypeScript:将自定义客户端传递给 traceable,或在回调中使用 LangChainTracer。
这种方法适用于多租户应用程序,您希望在工作区级别按客户、环境或团队隔离追踪记录。它适用于任何与 LangSmith 兼容的追踪,包括 LangChain、OpenAI 和使用 @traceable 装饰的自定义函数。

先决条件

通用跨工作区追踪

将此方法用于通用应用程序,在这些应用程序中,您希望根据运行时逻辑(例如,客户 ID、租户或环境)动态将追踪记录路由到不同的工作区。 关键组件:
  1. 使用各自的 workspace_id 为每个工作区初始化单独的 Client 实例。
  2. 使用 tracing_context(Python)或将特定于工作区的 client 传递给 traceable(TypeScript)来路由追踪记录。
  3. 通过应用程序的运行时配置传递工作区配置。
  4. 为每条路由覆盖工作区和项目名称,以进一步组织每个工作区内的追踪记录。

为 LangSmith 部署覆盖默认工作区

在将代理部署到 LangSmith 时,您可以使用图生命周期上下文管理器覆盖追踪记录发送到的默认工作区。当您希望根据通过 config 参数传递的运行时配置将已部署代理的追踪记录路由到不同的工作区时,这非常有用。
在使用跨工作区追踪进行部署时,请确保您的服务密钥或 PAT 具有访问所有目标工作区的必要权限。对于生产部署,我们建议使用多工作区服务密钥。对于 LangSmith 部署,您必须将具有跨工作区访问权限的服务密钥添加到您的环境变量(例如 LS_CROSS_WORKSPACE_KEY)中,以覆盖部署生成的默认服务密钥。

使用副本将追踪记录写入多个目的地

副本允许您同时将每条追踪记录发送到多个项目或工作区。与每条追踪记录只去一个目的地的动态路由模式不同,副本会并行将追踪记录复制到所有已配置的目的地。 副本可用于:
  • 将生产环境的追踪记录镜像到暂存或个人项目中进行调试。
  • 在不更改任何应用程序代码的情况下,写入多个工作区以实现多租户隔离。
  • 将追踪记录发送到同一服务器下的不同项目,并允许每个副本覆盖元数据。

通过环境变量配置副本

将 LANGSMITH_RUNS_ENDPOINTS 环境变量设置为 JSON 值。支持两种格式:
  • 对象格式:将每个端点 URL 映射到其 API 密钥:
  • 数组格式:副本对象的列表,当您需要多个副本指向同一 URL 或希望为每个副本设置 project_name 时很有用:
您不能同时使用 LANGSMITH_RUNS_ENDPOINTS 和 LANGSMITH_ENDPOINT。如果两者都设置,LangSmith 会引发错误。请仅使用其中一个来配置您的端点。

在运行时配置副本

您也可以在代码中直接传递副本,当目的地因请求或租户而异时,这很有用。
您还可以使用 updates 字段将附加字段(例如元数据或标签)合并到特定副本的运行中——主追踪记录保持不变。副本错误是非致命的:如果副本端点不可用,LangSmith 会记录错误,但不会影响主追踪记录。
认证信息不会在分布式追踪中传播。当一条追踪记录跨越多个服务时,LangSmith 会自动将副本的 project_name 和 updates 转发到下游服务,但不会转发 API 密钥或凭据。每个服务必须为其副本目的地配置自己的凭据。

在同一服务器内复制(仅项目副本)

如果您的所有副本都使用同一个 LangSmith 服务器,您可以省略 api_url 和 auth,仅指定 project_name。SDK 将重用默认的客户端凭据:

在所有副本实例上留下反馈

当您使用副本时,每个副本都会收到每条运行记录的副本。要为特定副本上的运行提交反馈,您需要该副本的运行 ID。从 Python SDK 0.10.8 和 JS SDK 0.8.5 开始,您可以将一个副本指定为主副本,并使用 compute_run_id_for_secondary_replica 确定性地计算所有其他副本的运行 ID。 主副本保留原始运行 ID 不变。每个辅助副本都会收到一个由原始运行 ID 和辅助副本的项目名称派生的确定性运行 ID。使用 compute_run_id_for_secondary_replica(original_run_id, project_name) 计算辅助运行 ID,并在调用 create_feedback 时传递它。
compute_run_id_for_secondary_replica / computeRunIdForSecondaryReplica 辅助函数在 Python SDK >= 0.10.8 和 JS SDK >= 0.8.5 中可用。如果您使用的是早期 SDK 版本,请升级以使用此功能。

在 LangSmith 和 OpenTelemetry 目的地之间路由

您可以在运行时决定给定的调用是将追踪记录发送到 LangSmith、发送到 OpenTelemetry (OTel) 后端,还是同时发送到两者,而无需重新部署或修改应用程序逻辑。当您希望根据环境甚至每个请求切换可观测性后端,并在运行时做出决策时,这非常有用。 使用 tracing_mode 构造函数参数或 LANGSMITH_TRACING_MODE 环境变量设置追踪模式。两者接受相同的值;显式的 tracing_mode 参数始终优先于环境变量:
  • "langsmith"(默认):以原生格式将追踪记录发送到 LangSmith。
  • "otel":将追踪记录作为 OpenTelemetry Span 导出到已配置的 OTel 后端。
  • "hybrid"(仅限 Python):从单个副本同时发送到 LangSmith 和 OTel 后端。
如果您正在使用已弃用的 Client 上的 otel_enabled 参数(仅限 Python),请迁移到 tracing_mode:Client(otel_enabled=True) → Client(tracing_mode="hybrid")。otel_enabled 参数将在下一个次要版本中移除。
将配置好的 Client 直接传递到副本中,以在运行时应用所需的模式:
每个 Client 上的 tracing_mode 决定了该副本的导出路径。在 Python 中,"hybrid" 模式在单个副本内处理两个目的地。在 TypeScript 中,“同时发送到两者”的情况使用两个单独的副本,每个副本对应一个客户端,因为没有 "hybrid" 模式。由于每个副本独立解析其自己的客户端,您也可以在单个 tracing_context 内混合模式,例如,保留一个副本发送到 LangSmith,同时通过第二个副本将相同的追踪记录转发到 OTel 收集器。