自定义 Agents 指南
安装、接入、事件方法、完整示例及常见问题。
使用框架?
LangChain、CrewAI、LlamaIndex 和 Pydantic AI 只需一次调用即可完成接入。
安装
failproofai-sdk 形式安装,在 Python 中以 failproofai_sdk 导入。框架扩展(如 failproofai-sdk[langgraph])会同时安装对应框架本身;适配器始终包含在基础安装包中。
连接 Failproof 守护进程
- 控制台
- CLI
-
前往 Admin → Keys,创建一个具有
events:add权限的密钥。 - 在 Agent 所在机器上将 Failproof 守护进程连接到 Cloud。
- 运行一次已接入的会话,然后在 Observe → Events 下找到其精确 ID。
-
前往 Observe → Sessions,选择相同环境,打开重建后的追踪视图。

配置
也可通过环境变量进行设置:
事件会先缓存在内存中,后台线程每隔
flush_interval 秒写入一次,解释器退出时会执行最后一次 flush。如果进程被强制终止,尚未写入的数据将会丢失。
标识
每条事件都归属于某个 session 和某个 agent。使用上下文管理器会自动填充两者,因此通常无需手动传入:session_id 或 agent_id 同样有效,且优先级更高。如果两者均未绑定也未传入,调用会抛出 TypeError,而不是静默发送一条 Cloud 会悄悄丢弃的事件。
标识信息存储在上下文变量中,会自动跟随
asyncio 任务传播,但不会跟随新线程传播——请用 failproofai_sdk.propagate() 包装 worker 线程,否则其事件将无法关联到对应 session。事件目录
共 15 个方法,大多数以成对形式出现——先调用开始方法,再调用结束方法,SDK 会自动计算两者之间的耗时。
另有三个独立方法:
error、human_pause、human_interrupt。
每个方法的所有字段
每个方法的所有字段
每个方法同样接受
session_id 和 agent_id,上下文管理器会自动填充。值为 None 的字段会被丢弃,不会以 JSON null 形式发送,且每个方法均返回 None。配对与耗时
一条规则:结束事件的 id 必须与其对应开始事件相同。 这是配对的依据,也是 SDK 计算耗时的基础。
不要自行传入
duration_ms。 SDK 会自动计算,手动传入会抛出 ValueError。
唯一例外是 model_response——只有你才知道真实的 provider 延迟。请传入整数毫秒值,传入浮点数会抛出异常,因为该列为 32 位整数,否则将会存储为空值。
边界情况
边界情况
- id 只需在同类事件和同一 session 内唯一。 工具调用和 hook 可以共用同一个 id;同时运行的两个 session 可以复用相同的 id 而不会冲突。
- id 不限定于某个 agent 的作用域。 在一个 agent 下开始、在另一个 agent 下结束的配对仍然可以匹配——这在多 agent 代码中是正常情况。
- 建议使用
request_id,但非必填。 不传时,模型事件按到达顺序配对,因此同一 agent 中的两个并发调用可能会配对错误。 - 跨进程的配对在 Cloud 中仍然可以匹配,但 SDK 无法计算耗时——因为两个进程都只看到了一半。
- 最多同时等待 10,000 个开始事件。 超出后最旧的会被丢弃,确保内存泄漏不会无限增长。
自定义字段
传入的任何额外关键字参数都会随事件一起存储:Decimal、set、bytes、模型对象——都会被转换为字符串存储。
以下五个字段名为保留字,传入后会直接被拒绝:timestamp、session_id、agent_id、type、environment。
数据投递与验证
- 控制台
- CLI
在 Observe → Events 中,确认第一条事件为
agent_start,最后一条为 agent_end。然后打开 Observe → Sessions,确认模型、工具、人工、hook 和错误事件按预期顺序出现。使用 session ID 作为排查问题的首要线索。$FAILPROOFAI_HOME/custom-agents/events,否则检查 ~/.failproofai/custom-agents/events。JSONL 文件的存在证明 SDK 已成功发出事件;spool 持续增长说明问题在于守护进程配置或数据投递,而 spool 为空则说明问题在于接入代码或进程生命周期。
只在守护进程停止时检查 spool。守护进程运行期间,它会在毫秒内收集并删除每批数据,因此目录列表会与收集器产生竞争,显示的事件数量会远少于实际发出的数量。

