如果您正在构建对话式代理或任何多轮应用程序,LangSmith 会自动将您的 运行 分组到 线程 中。查询线程使您能够重放完整对话、跨会话审计代理行为、构建关于对话长度和延迟的分析,并为下游工作流(如微调和评估)提供数据。 SDK 暴露了两个用于处理线程的方法:

线程的工作原理

您创建的每个运行都可以在其元数据中携带一个 thread_id。LangSmith 使用它将运行分组到线程中。后端会在 metadata 中查找 thread_id(如果未找到,则回退到 session_id)。
我们建议使用 UUID v7 线程 ID。UUIDv7 嵌入了时间戳,这保持了线程的正确时间顺序。LangSmith SDK 导出了一个 uuid7 辅助函数(Python v0.4.43+,JS v0.3.80+):
  • Python: from langsmith import uuid7
  • JS/TS: import { uuid7 } from 'langsmith'
如果您正在使用 追踪集成,请在运行元数据中传递 thread_id:

列出项目中的所有线程

list_threads / listThreads 获取项目中的所有线程,并将它们的运行分组在一起。结果按最近活动时间降序排序。
结果按最近活动排序:
Output

参数

返回值

一个线程对象列表,每个对象包含:
list_threads 始终只返回根运行。如果您需要子运行(例如工具调用、子链),请改用 read_thread,它接受一个 is_root / isRoot 参数,您可以将其设置为 false。

读取单个线程的运行

当您已经知道 thread_id 时,请使用 read_thread / readThread。它直接返回一个遍历该线程运行的迭代器,而无需首先获取所有线程。
与 list_threads 不同,这里的每个项目都是一个直接的 Run 对象——没有分组包装器。默认情况下,运行按时间升序返回。
Output

参数

返回值

一个 Run 对象的迭代器(Python)或异步迭代器(TypeScript)。

示例

按运行属性过滤线程

传递一个过滤表达式,使用 LangSmith 追踪查询语法 来缩小结果范围。例如,仅显示包含至少一次失败运行的线程:

查看超过 24 小时的历史记录

默认情况下,list_threads 只显示最近一天有运行的线程。传递 start_time 以扩大时间窗口:

重建对话

使用 read_thread 并设置 order="asc" 来逐轮重放对话: