新工具 GitHub · salahmakboul/call4agents
用 Call4Agents 包住 agent 的副作用动作,崩溃重启后同一动作只执行一次
给 Python agent 的发送、支付等动作加一层,崩溃或恢复后不再重复发送,并可用一条命令离线看到 2 封变 1 封的对比。
效果
网页给出的 quickstart 输出示例:纯 Python 崩溃重发不发库为 2 封、加库为 1 封,参数被改的审批显示 REFUSED;仓库内含 docs/demo.svg,未提供截图以外的视频。
这是什么
新在哪里:以前 agent 崩溃重启后副作用会被重放、只能自己写幂等逻辑;现在用 c4a.effect 包一层就得到“已批准动作至多一次”,审批还绑定到精确参数。
怎么做到的:pip install call4agents 后 c4a.init() 生成 .c4a/ledger.sqlite 与 .c4a/secret,用 @c4a.effect 装饰副作用函数、@c4a.effect(approval=True) 要求审批、@c4a.effect(idempotent_for=...) 复用 Idempotency-Key,并把这些调用放进 with c4a.run("thread-42") 中,按框架恢复用的 id 绑定运行记录;然后执行 call4agents quickstart 观察带库与不带库的崩溃重发对比。
- 适合谁
- 用 Python 写 agent 且动作会发邮件、付款、写数据的开发者,尤其是用 LangGraph、Pydantic AI、OpenAI Agents SDK 或 MCP 的人。
- 能帮你
- 以很低的接入成本给 agent 副作用加上“已批准动作至多一次”与参数绑定审批,并在崩溃恢复后防止重复执行。
评分 三项分开看,不合成总分;热度不等于好用
- 新颖性
- 全新做法 · 2026-10-16 出现
- 热度
- 未知
- 易上手
- 需要一些准备
怎么评的
三项都由本站记录的事实按固定规则算出,编辑不能直接改档位;规则改动会写进更新说明。
新颖性
- ●●● 全新做法,且有来源依据的出现时间在最近 30 天内
- ●●○ 老工具新用法或近期刚开放,且有来源依据的时间在最近 30 天内
- ●○○ 出现时间超过 30 天、未核实到精确日期,或已不再是新做法
- 其他 出现时间未核实、晚于今天,或新颖类型未核实时按最低一档处理,不靠猜测加分
热度
- ●●● 最近一次每周人工确认为“热门”:最近 14 天里独立讨论、实际案例、持续时间、传播平台、相对关注五项门槛全部满足(规则 heat-v1)
- ●●○ 最近一次人工确认为“观察中”:前三项至少一项达到,或讨论增长 ≥ 50%,且至少 2 个独立案例
- ●○○ 最近一次人工确认为“未进入跟踪”
- 其他 还没有人工确认过的热度记录时显示“未知”。热度只统计本站已接入的信源,不代表全网
易上手
- ●●● 准备门槛低且难度入门:不需要新账号或付费,首次尝试不超过 30 分钟,公开可用,会复制粘贴即可
- ●●○ 准备门槛中等,或门槛低但需要改少量代码或配置
- ●○○ 准备门槛高:需要商业软件或付费服务、首次尝试超过 2 小时、特殊硬件或网络、排队或邀请且无替代方案,或需要专业知识
- 其他 只有介绍、还没有站内步骤,或关键步骤已失效时显示“暂不可试”;门槛未核实时显示“未核实”
怎么尝试
- 时间 首次约 5 分钟
- 费用 免费:项目以 Apache-2.0 开源,README 称 quickstart 离线、无需 API 密钥;原站未说明其他费用。
- 账号 不需要新账号
- 环境 Python 3.10–3.13;README 测试覆盖 Linux、macOS、Windows;quickstart 离线运行,可选安装 LangGraph、Pydantic AI、OpenAI Agents SDK。
- 准备 Python 3.10–3.13:运行库与 quickstart 演示
- 准备 pip 安装 call4agents:获取库与 call4agents 命令行工具
- 准备 可选:langgraph、langgraph-checkpoint-sqlite、pydantic-ai、openai-agents(选用):让 quickstart 额外运行各框架的真实崩溃恢复行
- 准备 可选:支持 Idempotency-Key 的外部 API(如 Stripe)(选用):体验 idempotent_for 让外部 API 丢弃重复请求
替代方案:durable workflow 引擎内建的恰好一次保证。能做到:已在 Temporal 等 durable workflow 中运行的动作可由引擎自身防止重放。;差别:基于成熟引擎但需迁移执行模型;Call4Agents 零依赖、直接加在现有 LangGraph/Pydantic AI/OpenAI Agents SDK 代码上,且额外提供参数绑定审批与录制回放对比。。
完成替代方案不算复现本实践。
按下面的步骤就能做出第一个结果。复制命令不会自动执行。
安装 Call4Agents
在 Python 3.10–3.13 环境中安装库,获得 call4agents 命令行。
bash原始来源命令pip install call4agents预期结果:安装成功,终端可执行 call4agents 命令。
运行离线 quickstart 看重复发送对比
运行官方 quickstart,默认跑纯 Python 演示:先崩溃后恢复,对比有无库时的发信次数。
bash原始来源命令call4agents quickstart预期结果:输出显示 without the run record emails sent: 2,with the run record 为 1;参数被改的审批显示 REFUSED。
可选:安装框架后看多框架行
安装 LangGraph、Pydantic AI、OpenAI Agents SDK 后重跑 quickstart,会额外输出每个框架的崩溃恢复行。
bash原始来源命令pip install langgraph langgraph-checkpoint-sqlite pydantic-ai openai-agents预期结果:再次运行 quickstart 时出现 LangGraph / Pydantic AI / OpenAI Agents SDK 各自的 with/without 发信次数对比行。
在自己的代码里初始化并包裹动作
先初始化生成运行记录库与密钥,再用装饰器包裹副作用函数,并把调用放进 c4a.run 上下文。示例代码原样来自 README。
python原始来源命令import call4agents as c4a c4a.init() # creates .c4a/ledger.sqlite and .c4a/secret @c4a.effect # once per (run, tool, exact arguments) def send_email(to, body): ... @c4a.effect(approval=True) # also needs a "yes" for these exact arguments def pay(amount, to): ... with c4a.run("thread-42"): # use the id your framework resumes with send_email("bob", "hi") send_email("bob", "hi") # same action: returns the recorded result, sends nothing预期结果:工作目录出现 .c4a/ledger.sqlite 与 .c4a/secret;第二次相同调用不再真正执行,只返回记录结果。
校验演示与查看环境报告
用内置 selftest 检查演示结果,用 report 打印系统与框架版本(不发送任何数据)。
bash原始来源命令call4agents selftest call4agents report预期结果:selftest 校验通过;report 输出系统与框架版本信息,不发网络请求。