背景

我们于 2026 年 5 月发布了 SmithDB,这是一款专为现代 AI 智能体构建的新型可观测性数据库。SmithDB 在所有关键的可观测性工作负载上均提供了行业领先的性能,使 LangSmith 的核心体验速度大幅提升。 查询您的跟踪记录需要使用新的 SDK 方法。本指南将帮助您完成代码库的迁移。

废弃与移除时间表

每个 SDK 方法及其底层端点共享相同的废弃日期。 有关 LangSmith 如何废弃和移除 API 端点及 SDK 方法的详细信息,请参阅 API 和 SDK 废弃政策。

最低 SDK 版本要求

新的 SDK 方法从以下 SDK 版本开始可用:

关于自托管部署

  • 本指南中记录的新方法需要 >=0.16 的自托管版本,与所使用的数据存储无关。
  • ClickHouse 被禁用后,已废弃的方法将停止工作。
  • 在可能的情况下,SDK 会发出警告或错误,指明需要升级到的版本,而不是毫无解释地失败。

使用 AI 智能体进行迁移

本指南旨在被 AI 编程智能体直接获取和应用。将以下提示复制到您的智能体中,以将您的代码库迁移到基于 SmithDB 的方法。

运行记录:查询

查询项目中的运行记录,支持可选的过滤和字段投影。返回分页的结果集。

主要更改

方法名

client.runs.query() 现在是异步的。调用时请使用 await。
查看参考文档以获取完整的参数和字段列表。

查询参数

runs.query 不支持 project_name。请改为传递项目 UUID 作为 project_ids。要通过名称查找 UUID,请使用 client.read_project(project_name="my-project"),或在异步代码中使用 await client.aread_project(project_name="my-project")。
省略 min_start_time 时,默认值为1天前。之前不带 start_time 的 list_runs 会返回所有历史运行记录;现在不带 min_start_time 的 runs.query 会静默地将查询范围限定在最近24小时内。如果需要更宽的时间范围,请传递显式的 min_start_time。

响应字段

向 selects 传递 SCREAMING_SNAKE_CASE 字符串(例如 "ID"、"NAME"、"STATUS")以控制每个 Run 上填充哪些字段;只有被选中的字段才不是 None。默认的 selects 仅包含 "ID"。

示例

列出项目中的所有运行记录

runs.query 不直接接受项目名称。请先使用 client.aread_project() 解析项目 UUID,然后将其作为字符串传递给 project_ids。

选择字段

list_runs 返回一组默认字段,无需选择。runs.query 默认只返回 id——传递 selects=[...] 以请求更多字段。字段名现在是大写的("name" → "NAME")。

按运行类型和时间范围筛选

start_time 重命名为 min_start_time,且 run_type 的值现在是大写的("llm" → "LLM")。

仅筛选根运行记录

is_root 保持不变。
若要专门枚举追踪,请使用 traces.query 而非 is_root=True。参见 追踪:查询:它还通过 trace_aggregates 提供了整个追踪级别的 total_tokens/total_cost。

通过 ID 列表获取运行记录

id=[...] 重命名为 ids=[...]。即使按运行 ID 筛选,project_ids 现在也是必需的——v1 允许省略项目上下文。

迭代运行记录

list_runs 自动处理分页,每次 API 调用最多获取 100 条运行记录,并在返回 limit 条结果后停止。runs.query 不接受总 limit 参数;使用 async for 迭代,并在获得足够数据后使用 break 退出,或使用返回页面的 has_next_page()/get_next_page() 进行手动逐页控制。

筛选包含错误的运行记录

error=True/False 重命名为 has_error=True/False。

按元数据筛选

filter 字符串语法保持不变:eq(metadata_key, ...) 检查键是否存在,与 eq(metadata_value, ...) 组合以匹配特定值。

复杂的布尔筛选器

嵌套的 and() / or() 筛选表达式保持不变。

范围筛选器:filter、trace_filter、tree_filter

filter、trace_filter 和 tree_filter 保持不变。filter 适用于匹配的运行记录,trace_filter 适用于其追踪的根记录,tree_filter 适用于追踪树中的其他运行记录(同级和子级)。

运行:获取

通过 ID 获取单个运行。默认仅返回运行 ID——指定字段选择列表以检索更多数据。

主要变更

方法名称

client.runs.retrieve() 现在是异步的。调用时需要使用 await。
完整的参数和字段列表请参阅 参考文档。

查询参数

runs.retrieve 需要一个新的 project_id 字段,这是 read_run 不需要的。它还接受一个可选的 start_time——提供该参数可以加快检索速度,但并非必需。

响应字段

传递 SCREAMING_SNAKE_CASE 格式的字符串给 selects(例如 "ID", "NAME", "STATUS")以控制返回的 Run 对象上哪些字段被填充;只有被选中的字段才非 None。默认的 selects 仅包含 "ID"。

示例

通过 ID 获取单个运行

runs.retrieve 需要一个额外的 project_id(UUID)参数,这是 read_run 不需要的。它还接受一个可选的 start_time——提供该参数可以加快检索速度,但并非必需。请先通过 client.aread_project() 解析项目 UUID。
Before

选择字段

read_run 返回完整的运行对象,无需选择。runs.retrieve 默认仅返回 id——传递 selects=[...] 以请求更多字段。
Before

处理未找到的运行

read_run 对于缺失的运行会从 langsmith.utils 抛出 LangSmithNotFoundError。runs.retrieve 现在从 langsmith 抛出 NotFoundError。

加载运行的子运行

load_child_runs 标志和嵌套的 child_runs 字段已被移除。使用 traces.list_runs 获取追踪中的所有运行,然后按 parent_run_ids 进行过滤,该字段包含每个运行的完整祖先链,根节点在前,最近的父节点在后。
将 read_run(run_id, load_child_runs=True) 替换为 client.traces.list_runs。

Runs:获取 URL

获取运行的 LangSmith UI URL。

主要变更

方法名称

client.runs.get_url() 现在是异步的。使用 await 来调用它。
请参阅参考文档获取完整参数列表。

参数

runs.get_url 需要直接传入运行的 project_id 和 trace_id,而不是从一个 run 对象或 project_name/project_id 回退中解析它们。

响应

示例

获取运行的 URL

get_run_url 接受一个完整的 run 对象。runs.get_url 是异步的,需要分别传入运行的 project_id(在旧版 v1 架构中为其 session_id)和 trace_id,start_time 可选。

追踪:查询

返回单个追踪项目中的追踪列表(根运行)。每个条目包含追踪的根运行以及可选的追踪级聚合数据(total_tokens、total_cost、first_token_time),这些聚合数据位于 trace_aggregates 下,因此客户端永远不需要根据 trace_id 进行合并。 追踪扫描在 start_time 窗口内进行:min_start_time 默认为请求前24小时,max_start_time 默认为请求时间。可显式设置任一参数以扩大或缩小窗口。 支持过滤器(trace_filter、tree_filter)和字段投影(selects)。

主要变更

方法名称

client.traces.query() 现在是异步的。调用时需要使用 await。
完整的参数和字段列表请参阅参考文档。

查询参数

  • session(项目 UUID 列表)变为 project_id(单个 UUID);traces.query 每次调用严格限定于一个项目。
  • is_root 参数被移除:traces.query 在隐式情况下总是限定于根运行。
  • 通用的 filter(用于对任何运行进行评估)没有直接对应项;请改用 trace_filter 或 tree_filter。
  • trace_filter 和 tree_filter 保持不变;它们已在 list_runs 方法中存在。
  • trace_ids 是新增参数:一条快速路径限制,用于限制到已知的追踪 UUID 集合,在大规模情况下比等效的 trace_filter 更高效。
  • start_time(无默认值)变为 min_start_time,省略时默认为24小时前。
  • max_start_time 是新增参数,默认为请求时间;list_runs 的 end_time 是根据运行自身的结束时间戳进行过滤,而不是扫描窗口的边界。
  • select 重命名为 selects;条目会路由到 trace_aggregates(total_tokens、total_cost、first_token_time)或 root_run(所有其他字段)。

响应字段

  • root_run 携带与“运行:查询”相同的 Run 结构(id、name、run_type、status 等),由 selects 控制。
  • total_tokens/total_cost 从 root_run 移动到 trace_aggregates,它们是追踪中所有运行的总和,而不仅仅是根运行。当没有选择聚合字段时,响应中将完全省略 trace_aggregates。
  • trace_aggregates.first_token_time 是新增字段。

示例

列出追踪(根运行)

获取项目中的每个追踪(根运行),替代 list_runs(is_root=True)。
Before

获取追踪的总令牌数和成本

从 trace_aggregates 而不是根运行中读取追踪的令牌和成本总数,v1 版本是将它们保存在根运行中的。
Before

按状态查找追踪,或按 ID 获取追踪

使用 trace_filter 按状态(例如,出错)过滤追踪,或者跳过过滤,使用 trace_ids 直接更快地获取已知的追踪。
Before

追踪:列出运行记录

根据追踪ID,在最小/最大开始时间范围内返回运行记录。可选的 filter;可重复的 selects 用于选择要返回的字段。

主要变更

方法名称

client.traces.list_runs() 现在是异步的。调用时需使用 await。
完整的参数和字段列表,请参阅参考文档。

查询参数

  • trace_id/trace 从查询参数移至路径参数。
  • project_id 是新增的必填参数(SmithDB 分区键);list_runs(trace_id=...) 不需要它。
  • filter 无变化。
  • min_start_time/max_start_time 是新增参数。与 traces.query 不同,它们都没有默认值:如果两者都省略,则完全不会按时间过滤运行记录。它们各自是可选的,但如果设置了其中一个,则必须同时传递另一个。
  • select 重命名为 selects,使用与 traces.query 相同的 44 个值的枚举。

响应字段

响应包含一个 items 字段:一个按 start_time 排序的 Run 对象列表,结构与上面的 Runs: query 响应相同。

示例

列出追踪中的所有运行记录

根据追踪ID,获取属于某个追踪的所有运行记录。
Before

仅获取追踪中的LLM调用

将追踪的运行记录范围缩小到特定的运行类型,例如仅LLM调用。
Before
好的,我将严格遵守您提供的规则,对该 MDX 文档进行翻译。

数据集实验运行:查询

查询数据集示例以及针对每个示例记录的实验运行。接受一个或多个 experiment_ids,以便您可以并排查看来自多个实验的运行;结果以基于游标的分页页面形式返回。

主要变更

方法名称

client.datasets.experiment_runs.query() 现在是异步的。请使用 await 调用它。
有关完整的参数和字段列表,请参阅参考文档。

查询参数

experiment_ids 是必需的,并替代了 session_ids。其值仍然是实验追踪项目的 UUID——如果你只知道实验名称,请先解析它:client.read_project(project_name="my-experiment").id,或在异步代码中使用 await client.aread_project(project_name="my-experiment")。

响应字段

每个页面项是一个数据集示例及其产生的运行——不是裸露的 Run。其 runs 字段包含与查询运行相同的 Run 对象;有关每个运行的字段,请参阅该部分。下面的表格描述了该项的其余部分:示例字段以及 runs。
get_experiment_results 返回带有 examples_with_runs 迭代器的实验结果。datasets.experiment_runs.query 返回一个分页页面对象(page.items, page.next_cursor);每个项包含:

示例

查询实验运行并请求预览字段

旧版中 preview=True 会自动返回截断的输入/输出。在新 API 中,需要明确请求:在 selects 中传递 INPUTS_PREVIEW 和 OUTPUTS_PREVIEW 以获取相同的截断形式,或传递 INPUTS/OUTPUTS 以获取未截断的值。省略 selects 则仅返回 id。
Before

分页获取结果

以下两个示例都会获取最多 100 条结果,跨尽可能多的页,然后停止——因此这是两个可比的操作,而不是“一页”与“全部”。根据你自己的用例调整 100/page_size 的值。
get_experiment_results 内部进行分页,并在返回 limit 个总结果后停止。datasets.experiment_runs.query 没有总数 limit;使用 async for 迭代返回的页面,并在获取足够数量后使用 break 停止。
Before

按反馈分数排序

按反馈分数对数据集示例排序,仅在查询单个实验时支持。在 Go 和 Java 中,这替代了旧版的 sort_params.sort_by/sort_params.sort_order(现在是 sort.by/sort.order);Python 和 TypeScript 在新 API 中首次获得排序功能。
get_experiment_results 不支持按反馈分数排序。

反馈:创建

为一次运行创建反馈(评分、修正或评论)。

主要变更

必需参数

方法名和端点没有变化。仅会话(项目)ID 要求有所改变。
create_feedback 现在需要 session_id,即拥有该运行的项目(会话)的 UUID。此前该参数是可选的。

示例

创建反馈时提供 session_id

create_feedback 现在除了 run_id 外还需要 session_id。
Before

异常处理变化

基于 SmithDB 的方法会抛出新的异常类,而不是旧的 langsmith.utils 异常类。

已停止支持

以下方法已停止支持。它们调用了已退役的 /feedback/formulas 端点,该端点在复合反馈 v2 上返回 410 Gone,并计划于 2026-08-20 移除。复合分数现在作为复合评估器进行管理,它将复合分数实现为代码评估器加上运行规则。没有 SDK 替代方案。

反馈公式方法