关于 ratel-langsmith-integrate
为代码库中的 Agent 制定 LangSmith 可观测性接入与仪表板方案,供负责监控配置的团队使用。它只输出实施计划,不修改 Agent 代码,也不调用 LangSmith API。
主要功能
- 01规划追踪位置与命名
- 02映射运行、标签和元数据
- 03按文件列出接入步骤
- 04设计价值与健康仪表板
- 05依据已有评估生成方案
适用场景
- 01为 Agent 规划 LangSmith 追踪
- 02统一会话、工具与模型调用命名
- 03为指标仪表板准备配置规格
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ratel-ai/ skills --skill ratel-langsmith-integrate安装后在 Claude Code 中输入/ratel-langsmith-integrate确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/langsmith-mapping.mdlangsmith-value-map.mdratel-hooks.mdstack-python-agentic.mdstack-python-generic.mdstack-typescript-generic.mdstack-vercel-ai-sdk.mdverification-checklist.md详细介绍
/ratel-langsmith-integrate — 为 Agent 配置 LangSmith 追踪并规划仪表板
像 Ratel 团队那样,将 LangSmith 接入客户的代码库,并规划能证明它物有所值的仪表板。这项技能分为两部分:埋点配置(追踪应放在哪里、如何命名、如何设置)和仪表板构建规范(在 Monitor 和自定义仪表板中构建哪些图表,以及具体配置)。交付成果是计划。不要修改 Agent 代码,也不要调用 LangSmith API——客户会通过 LangSmith UI 点击构建仪表板,这是有意为之。
这是可观测性流程中的 LangSmith 分支。通用技能 /ratel-observability-assessment 以不依赖供应商的方式决定捕获什么以及哪些仪表板很重要,并检测供应商。当供应商是 LangSmith 时,它会转到这里,将计划具体落实为 LangSmith 的原生功能。追踪数据开始流入后,后续步骤是 /ratel-langsmith-analyze,它会读取本计划产生的实时数据。
理念:追踪思维模型,而非调用图
一种常见的失败模式是“把每个函数都包装成一次运行”。这样生成的运行树与代码的调用图一致,却无法告诉你 Agent 试图做什么。当 LangSmith 追踪的结构与一次交互轮次的概念结构一致时,最有用:
- 追踪(根运行) = 一个对外有意义的工作单元(一次聊天轮次、一个任务、一个 webhook)。如果一个请求包含多个 Agent 轮次,就不是“一次 HTTP 请求”;如果一个轮次包含多次模型调用,就不是“一次模型调用”。
- 子运行 = Agent 在该工作单元内执行的一个步骤。子 Agent 调用(
chain运行)、工具调用(tool运行)、模型调用(llm运行)、检索步骤(retriever运行)。嵌套结构应体现委派关系,而非源文件布局。 - 线程 = 一组相关追踪,它们共享同一个线程元数据键(
session_id、thread_id或conversation_id)。通常对应一次用户对话、一个 Agent 运行 ID,或一个任务关联 ID。
完整的原理只在 ../ratel-observability-assessment/references/instrumentation-philosophy.md 中说明。LangSmith 对这套术语的具体映射——即哪个通用概念对应哪种运行类型和元数据键——见 references/langsmith-mapping.md。
为什么仪表板要分为两组
这项技能的仪表板部分始终构建两组仪表板,因为合作初创公司希望通过同一份数据讲述两种不同的故事:
- “Ratel 正在推动指标改善”(Ratel 价值组)——降低 Token 开销、提升检索质量、减少“未找到工具”错误、降低每个会话的成本。这些指标能证明合作的价值。只有在已引入或计划引入 Ratel 时才纳入。
- “我们的 Agent 运行良好”(Agent 健康组)——延迟百分位数、各工具的错误率、会话放弃率、反馈评分分布。无论是否使用 Ratel,这些指标都很有用;它们能帮助客户自己的工程师发现自身问题,从而建立信任。
只有 Ratel 仪表板会显得像是在推销;只有 Agent 健康仪表板则会让人觉得我们忘了此行的目的。只要涉及 Ratel,就应同时纳入两组。LangSmith 内置的 Monitor 标签页已经涵盖了许多项目级的 Agent 健康情况——不要重复构建已有的免费功能(见步骤 5)。
工作流
步骤 0 — 阅读上游可观测性评估(优先输入)
查找 <repo>/.ratel/ratel-observability-assessment.md——这是 /ratel-observability-assessment 的交付物。如果该文件存在,它就是优先输入:读取其中检测到的技术栈、拓扑结构、与厂商无关的埋点策略,以及推荐的仪表板列表。确认检测到的厂商是 LangSmith;如果文件中写的是 Langfuse(或其他厂商),请停止并告知用户:这是 LangSmith 技能,他们需要使用匹配的 *-integrate 技能。
如果文件存在,可以跳过步骤 1–2 中繁琐的检测,直接进入渲染阶段:直接使用其中的技术栈和拓扑结构,然后转到步骤 3。
如果文件不存在,不要直接拒绝。自行快速检测技术栈和厂商(步骤 1–2),并且像构建仪表板需要一套术语体系一样,先询问几个问题,而不是拒绝:
- 一轮聊天/一项任务的规范根运行名称是什么?
- 正在使用(或计划使用)哪些
env、stack和agent_version标签值? - Ratel 是否以任何形式接入了埋点(网关、SDK 或计划接入)?
根据用户的回答继续操作。基于猜测的术语构建的图表看起来没问题,但分组会出错。
步骤 1 — 检测技术栈
(如果上游评估已指出技术栈,则跳过。)阅读清单文件,识别语言和框架。根据对应技术栈的特定模式,选择匹配的参考文档。
# TypeScript / Node detection
test -f package.json && cat package.json | jq -r '.dependencies // {}, .devDependencies // {} | keys[]' | sort -u
# Python detection
test -f pyproject.toml && cat pyproject.toml | grep -A 200 '^\[' || true
test -f requirements.txt && cat requirements.txt
test -f uv.lock && head -50 uv.lock
将依赖项映射到以下某个技术栈配置:
| 清单中的信号 | 技术栈 | 参考文档 |
|---|---|---|
ai、@ai-sdk/* | Vercel AI SDK | references/stack-vercel-ai-sdk.md |
@mastra/core、直接调用 openai/@anthropic-ai/sdk 的手写循环 | TypeScript 通用 | references/stack-typescript-generic.md |
langsmith + openai/anthropic/langchain/llama_index | Python 通用 | references/stack-python-generic.md |
langgraph、crewai、agno、autogen | Python Agent | references/stack-python-agentic.md |
如果信号存在重叠(例如,同时包含 LangGraph 主管流程和原始 OpenAI 调用),请优先选择 Agent 参考文档,并在计划中注明混合技术栈的情况。
如果完全无法识别任何 Agent 层(没有 LLM 客户端导入、Agent 框架或模型调用),请使用诚实跳过路径。
要确认当前的准确标识符(SDK 名称、wrapAISDK 是否可用、环境变量),请在编写时获取最新文档——docs.langchain.com/langsmith(annotate-code、threads、dashboards),或通过 Context7 查阅 langchain-ai/langsmith-sdk 文档。不要臆造 API。
步骤 2 — 绘制 Agent 拓扑图
(如果上游评估已有拓扑图,则跳过/复用。)启动一个 Explore Agent(对于非常小的仓库,也可以直接完成),回答以下四个问题,并注明文件路径:
- 一轮对话从哪里开始? — 入口点:HTTP 处理器、CLI 动词、队列使用者、聊天平台 Webhook。线程键(
session_id)的来源就在这里。 - Agent 单元有哪些? — 主管函数、子 Agent 工厂、按角色专门化的循环。任何接收用户消息并返回响应的单元都包括在内。这些单元将成为根/子运行边界。
- 工具在哪里定义和调用? — 工具注册表(
tools: [...])、@tool装饰器、MCP 服务接线。每个工具都需要呈现为一个tool类型的运行。 - 子 Agent 在哪里将任务交给其他子 Agent? — 主管 → 工作器、并行分发、图节点转换。这些位置需要重新附加线程键和元数据,因为 LangSmith 不会将元数据或标签从父运行传播到子运行。
在计划中用简短的拓扑图(ASCII 或 Mermaid)呈现这些信息。图不必详尽,但要让客户能在实施期间用一张图概览全局。
步骤 3 — 绘制 LangSmith 命名/映射表
阅读 references/langsmith-mapping.md,并将其应用到拓扑图中:
- 每个具有外部意义的单元对应一个根运行名称(
chat-turn、job.summarise-thread、cron.nightly-research),run_type="chain"。 - 每个角色对应一个子运行名称(
supervisor、research-agent、writer-agent),每个工具对应一个子运行名称(tool.<tool-id>、run_type="tool");模型调用命名为llm.<model-shortname>,run_type="llm";检索命名为retrieve.<store>,run_type="retriever"。 - 每个运行都要包含线程键(
session_id,或thread_id/conversation_id)——在根运行上设置,并在每个子运行上重新附加,因为元数据不会继承。 - 标签:技术栈标识符、环境(
dev/staging/prod)、Agent 版本,以及适用时的功能标志分组。 - 元数据键:一组简洁且一致的键,以便图表进行分组 —
agent_role、tool_id、model_id、prompt_version、user_tier、gateway_origin(存在 Ratel 时)。
计划应在一个表格中列出引入的每个运行名称/标签/元数据键,供客户粘贴到共享文档中,并引用 references/langsmith-mapping.md。仪表板规范(步骤 5)和 /ratel-langsmith-analyze 都会读取此表;缺少该表时,它们将无法运行。映射会将供应商中立的约定 ../ratel-observability-assessment/references/semantic-conventions.md 映射到 LangSmith 基本元素上 — 不要重新推导这些规则。
步骤 4 — 规划逐文件插桩变更
对于每个需要接线的文件,引用技术栈参考资料(references/stack-*.md)中的匹配模式,而不是重新推导。每项应包括:文件路径、需要包装的内容、要使用的运行类型(chain/tool/llm/retriever),以及根据步骤 3 表格要附加的名称/标签/元数据 — 包括必须出现在每个运行中的线程键。
第 5 步 — 规划仪表板(两组)
打开 references/langsmith-value-map.md 和 ../ratel-observability-assessment/references/general-agent-dashboards.md。首先,记下内置的 Monitor 标签页已按项目提供的内容(Traces、LLM Calls、Cost & Tokens、Tools、Run Types、Feedback Scores)——不要将它们重新规划为自定义图表。然后,选择与实际已埋点数据相匹配的自定义图表子集。
默认选择:
- Ratel 价值组(仅当已采用或即将采用 Ratel 时):Token Cost & Savings、Retrieval Quality、Gateway Origin Split、Upstream Health、Skill Retrieval Health(v0.1.6 系列中发布的技能)。仅当客户使用包含该功能的 Ratel 预发布版本,或已明确表示将采用该功能时,才添加路线图中有条件的项目(例如,v0.1.9 的 Suggestion Adoption)。名称和图表规格见
references/langsmith-value-map.md。 - Agent 健康状况组:Latency & Cost Overview、Error Surface、Tool Usage、Session Quality、Model & Prompt Drift。内容来自
../ratel-observability-assessment/references/general-agent-dashboards.md——但跳过 Monitor 标签页已涵盖该项目的内容,其余部分则创建为 LangSmith 自定义图表(Langfuse 的“observation”筛选条件改为run type/run name筛选条件;Langfuse 的“trace”筛选条件改为is_root)。
每个仪表板部分按以下顺序编写:
- 名称 — 简短且以行动为导向(
Token Cost & Savings,而不是Dashboard 1)。 - 重要性 — 用通俗英语写一段话;客户的 PM 应能判断该仪表板是否适用于他们。
- 所需数据 — 依赖的运行名称、运行类型、标签和元数据键。第 3 步表格中缺少的任何内容,都是此处列出的 TODO 阻塞项。
- 图表 — 对每张图表,填写
references/langsmith-value-map.md中图表词汇表的五个字段:指标(y 轴);筛选条件(运行名称 / 运行类型 / 标签 / 元数据 /is_root);分组方式(标签 / 元数据 / 运行名称 / 运行类型——前 5 项)或明确的数据系列;图表类型(折线图 / 柱状图)。当分组方式的前 5 项限制不足以满足需求时,使用数据系列明确展示 A/B 对比。 - 分析切入点 / 深入查看 — 图表显示异常时应点击什么,以及深入查看的位置(图表创建后,客户可重复使用的已保存运行表筛选条件)。
- 路线图脚注(仅限 Ratel 仪表板)— 如果某个仪表板能从尚未发布的 Ratel 功能中受益,请注明功能名称和目标版本。复用
../ratel-observability-assessment/references/ratel-value-map.md中的版本映射,确保信息保持最新。
如果某个仪表板依赖的数据尚未埋点,请将其删除。宁可跳过,也不要造假。
步骤 6 — 决定是否添加 Ratel 感知钩子(仅当 Ratel 已存在或即将接入时)
检查清单中的任何位置是否出现 @ratel-ai/sdk、Python ratel-ai 包、ratel-ai-core 或 ratel-mcp / @ratel-ai/mcp-server 包。如果出现,或者客户计划在此次合作中接入 Ratel,请阅读 references/ratel-hooks.md,并在计划中添加一个章节,涵盖:
- 将每个 Ratel 跟踪事件映射到一个 LangSmith 运行(
search→run_type: tool,名称为ratel.search_capabilities;skill_search→ratel.skill_search;get_skill_content→ratel.get_skill_content;InvokeStart/InvokeEnd→run_type: tool,名称为ratel.invoke_tool;等等)。名称已在references/langsmith-value-map.md中预留。 - 每次运行都必须包含的元数据:
gateway_origin(direct与agent)、top_k、hit_count、replace_mode、最高命中项的得分、延迟,以及线程键(由于元数据不会继承,因此需要重新附加)。 - “前 / 后”标注策略,以便客户接入 Ratel 后进行 A/B 对比(通过分组或 Data Series 绘制图表的
feature_flag标签划分,就是 A/B 对比界面)。
如果 Ratel 不存在且没有接入计划,请完全跳过本节。不要在客户自有文档中预先植入 Ratel 的销售宣传——保持计划实事求是。
步骤 7 — 编写计划
将计划写入 <repo>/.ratel/ratel-langsmith-integrate.md(如果 .ratel/ 目录不存在,则创建该目录;如果仓库已采用其他文档规范,请先询问用户确认路径)。
计划必须按以下顺序包含:
- 摘要 — 一个段落:检测到的技术栈、Agent 拓扑、已完成的埋点(如有)、本计划要添加的内容(接线和仪表板),以及各组仪表板的数量。
- 设置 — SDK 安装命令(Python / JS 的
langsmith)、环境变量(LANGSMITH_TRACING=true、LANGSMITH_API_KEY、LANGSMITH_PROJECT、LANGSMITH_ENDPOINT)、LangSmith MCP 服务注册步骤(为客户的 Claude Code / Cursor 配置langsmith-mcp-server,以便/ratel-langsmith-analyze之后能读取运行数据),以及可粘贴并验证的有效“hello trace”代码片段。 - 拓扑 — 步骤 2 中的图示。
- LangSmith 命名 / 映射表 — 步骤 3 中的表格,并引用
references/langsmith-mapping.md。 - 逐文件埋点变更 — 步骤 4 中的内容,并引用对应的
references/stack-*.md。 - 仪表板构建规范 — 步骤 5 中的两组(Ratel 价值 + Agent 健康度),注明内置的 Monitor 标签页已涵盖哪些内容,并引用
references/langsmith-value-map.md和../ratel-observability-assessment/references/general-agent-dashboards.md。 - Ratel 钩子(根据步骤 6 条件决定是否添加),并引用
references/ratel-hooks.md。 - 验证清单 — 从
references/verification-checklist.md复制:埋点完成后,客户可以勾选的六个项目。 - 暂不纳入范围 — 客户采用路线图中的 Ratel 功能(版本为 v<X.Y.Z>)后要添加的仪表板;以及需要目前尚无数据的仪表板。
在聊天中内联打印目录——列出各章节,以及带有一句“为何重要”说明的编号仪表板清单,并告知用户文件路径。不要在聊天中粘贴完整计划正文或完整图表规范;文件本身就是交付成果。
告知用户跟踪数据开始流入后的下一步:运行 /ratel-langsmith-analyze,读取实时数据并提出修复建议。
诚实的跳过路径
遇到以下几种情况时,请停止并说明原因;绝不可编造交付成果:
-
未检测到 Agent 入口。 如果完成步骤 1 后,仍找不到任何 LLM 客户端导入、Agent 循环或模型调用,请停止。不要编写计划。告诉用户:
未检测到 Agent 入口 — 仅检查了
<files looked at>。如果此代码库中的 Agent 代码位于非常规位置,请告诉我在哪里,我会重新检查。在非 Agent 代码库中强行制定埋点计划,只会产出无用文档并损害合作伙伴的信任。
-
我们没有参考资料的技术栈(例如 Ruby、Go 或小众框架)。仍然要制定计划,但需将特定于技术栈的章节标记为“参照 Python 通用参考资料类比编写”,并询问用户是否要启动后续工作来编写新的参考资料。不要假装有把握。
-
客户只想要 Ratel 价值仪表板,但没有使用 Ratel。 Ratel 仪表板至少需要接通网关链路。建议先小规模试用 Ratel(仅接入网关只需半天),再设计依赖它的仪表板。不要把 Ratel 钩子塞进未使用 Ratel 的 Agent 中 — 应改为呈现 Agent 健康状况组,并注明 Ratel 价值组因尚未采用 Ratel 而无法启用。
-
需要埋点/仪表板,但还没有实时数据。 制定计划,但将每个仪表板标记为“受阻:无数据 — 首次生产流量到来后重新评估”。空仪表板会打击团队士气。
参考文件
references/stack-vercel-ai-sdk.mdreferences/stack-typescript-generic.mdreferences/stack-python-generic.mdreferences/stack-python-agentic.mdreferences/langsmith-mapping.md— 通用语义约定在 LangSmith 中的呈现方式references/langsmith-value-map.md— Ratel 运行名称、Ratel 价值图表规范及 LangSmith 图表术语references/ratel-hooks.md— Ratel 事件 → LangSmith 运行references/verification-checklist.md
共享的、与供应商无关的参考资料(由 /ratel-observability-assessment 维护,仅链接,不重复收录):