将 LangSmith 检测到的代理问题转发到事件管理、寻呼或聊天工具中。LangSmith Engine 会在打开新问题,或将新的追踪记录关联到已打开的问题时,向你的端点发送 Webhook 事件。 要配置 Webhook 订阅,请打开追踪项目 Engine 标签页中的 Engine Settings 面板。请参阅配置 Engine。
目标可以将事件发送到 Webhook URL 或 Slack 频道。两者使用本页所述的相同事件类型和最低优先级筛选。Slack 目标通过 LangSmith 托管的 Slack 应用发布消息,而不是发送下面的JSON payload,因此签名密钥和自定义标头不适用。要设置 Slack 投递,请参阅通知 Slack 频道。本页其余内容介绍 Webhook URL 目标。

投递

LangSmith 会向你的 Webhook URL 发送带有 JSON body 的 POST 请求。请求使用 Content-Type: application/json,并包含你附加到订阅的所有自定义标头。
重试会投递字节完全相同的 payload,包括相同的 id。请根据 id 去重,以免重试投递在下游产生重复效果。

自定义标头

你可以为每个订阅附加任意标头(例如 Authorization: Bearer …),以便在你的端点对调用方进行身份验证。Content-Type 始终由 LangSmith 设置,无法覆盖。

签名密钥

每个订阅都有一个签名密钥。LangSmith 使用此密钥对原始 Webhook 请求 body 进行签名,并将结果发送到 X-LangSmith-Signature 标头中。 标头值格式如下:
在解析或处理 payload 之前验证签名。HMAC 输入是请求 body 的确切原始字节,HMAC 密钥是订阅的签名密钥。在验证之前,不要先解析 JSON body 再重新序列化。

轮换签名密钥

当签名密钥可能已泄露,或组织的凭据轮换策略要求使用新密钥时,请轮换签名密钥。 要轮换密钥,请在 Engine Settings 中打开订阅行,点击 Roll signing secret,然后确认。LangSmith 会生成新的签名密钥,并立即将其用于后续 Webhook 投递。轮换完成后,旧密钥会立即停止用于投递签名。 轮换密钥后,请更新所有使用新值验证 X-LangSmith-Signature 的消费者。

严重性筛选

每个订阅都有一个介于 0 到 3 之间的 severity_threshold。对于问题事件,仅当问题的 severity 小于或等于该阈值时,才会投递事件。数字越小表示越紧急。 例如,severity_threshold: 1 的订阅只会接收 URGENT (0) 和 HIGH (1) 问题的事件。 严重性阈值不适用于 issue.agent_run.failed,因为运行失败事件的范围是 Engine 会话,而不是某个具体问题。

事件类型筛选

每个订阅都会指定希望接收的事件类型。未显式指定列表的订阅默认使用 ["issue.created"]。

事件信封

投递到你端点的每个事件都使用相同的外层 JSON 结构。

Issue data.object

对于 issue.created 和 issue.trace.added,data.object 是问题的快照。应将其视为生成事件时问题的权威状态。

运行失败 data.object

对于 issue.agent_run.failed,data.object 描述失败的 Engine 运行。

data.trace

data.trace 仅包含在 issue.trace.added 事件中。

批量合并

单个上游操作可能产生多个 Webhook 事件。当 Engine 打开一个新问题并向其附加五条追踪记录时,你会收到一个 issue.created 事件和五个 issue.trace.added 事件,这些事件都共享同一个 request_id。使用 request_id 将它们归并为一条下游通知。

事件类型

以下是 LangSmith Engine 当前发送的完整事件类型集合。未来可能会添加新类型,因此处理程序应忽略未知的 type 值,而不是因此失败。

issue.created

LangSmith Engine 创建新问题时发送。省略 data.trace。

issue.trace.added

新追踪记录关联到现有问题时发送。data.trace 描述关联的追踪记录。

issue.agent_run.failed

LangSmith Engine 未能完成运行时发送。此事件的范围是会话,因此不包含 data.trace,也不使用严重性筛选。

测试你的端点

在将真实订阅指向你的端点之前,发送一个示例 payload,以验证端点能够接受请求并在 20 秒超时内确认收到:
使用 issue.created 中的示例 body 作为 sample-issue-created.json。请验证:
  • 自定义 Authorization 标头能够到达,并且与订阅中配置的密钥匹配。
  • 处理程序会根据事件的 id 持久化事件,以便对重试进行去重。
  • 处理程序会在启动缓慢的下游工作之前返回 2xx。

安全性

  • Webhook URL 会在创建订阅时以及投递时再次进行验证。在 SaaS 中,私有 IP 范围和元数据 IP 范围会被阻止。http:// 和 https:// 均可接受;请使用 https://,以免 payload 和任何自定义标头以明文传输。
  • LangSmith 使用订阅的签名密钥对 Webhook body 进行签名。在处理 payload 之前验证 X-LangSmith-Signature。
  • 你还可以在订阅上设置自定义标头,例如 Authorization: Bearer …,用于在你的端点进行路由或额外身份验证。
  • 根据事件的 id 进行去重,以免重试投递导致重复通知。

最佳实践

  • 快速确认。 持久化事件后立即响应 2xx。将耗时较长的工作(扇出、寻呼、下游 API 调用)放入队列,以便处理程序保持在 20 秒超时范围内。
  • 容忍未知事件类型。 忽略处理程序无法识别的 type 值。未来可能会添加新的事件类型,恕不另行通知。
  • 容忍新增字段。 使用宽松的架构解析 payload。现有事件类型可能会在不另行通知的情况下新增字段。