1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了
你有没有试过让一个 AI 代理连续工作四十分钟?不是闲聊,而是真正在查资料、调 API、写代码、汇总报告——一环扣一环地推进。我去年就搭过这么一套系统,用的是当时最火的开源框架,把所有状态都塞进模型的上下文窗口里。前二十分钟顺风顺水,到第三十五分钟,事情开始不对劲:它突然把刚调回来的数据库结果说成是上周的会议纪要;接着又把用户明确要求“不要修改原始 JSON 结构”的指令当成耳旁风,硬生生把嵌套字段全打平了;最后在生成 PR 描述时,连仓库名都拼错了。我们翻日志、重放请求、甚至切到 debug 模式逐 token 看输出……什么都没发现。它没报错,没崩溃,只是 quietly wrong —— 安静地、持续地、不可逆地偏离了目标。等我们意识到是上下文溢出导致早期 tool call 结果被 silently evicted(悄悄挤掉)时,整个 session 已经无法回溯、无法复现、无法审计。那不是一次失败的实验,是一次价值数小时工程时间的蒸发。
Anthropic 在 4 月 8 日发布的 Claude Managed Agents,表面看是又一个“托管代理平台”,但它的核心设计——session as durable event log(会话即持久化事件日志)——正是为了解决这个我亲身踩过的、无数团队正在重复踩的坑。它把状态从模型上下文这个脆弱、昂贵、不可靠的“内存堆栈”里彻底剥离出来,存到外部可查询、可审计、可重放的持久化存储中。Harness(执行器)变成一个纯粹的、无状态的函数调用器:
execute(tool_name, input) → string
,它挂了?没关系,
awake(sessionId)
就能从上次 checkpoint 的位置继续跑。沙箱不是宠物,是 cattle(牲畜):按需创建、用完即焚、凭证永不暴露。这不是功能叠加,是架构范式的切换——就像 90 年代操作系统把硬件资源虚拟化,让应用不再需要操心 CPU 寄存器怎么切、磁盘扇区怎么寻址一样,Managed Agents 正在把 agent 运行时的复杂性抽象掉。
关键词“Towards AI - Medium”背后,是大量一线工程师和架构师的真实战场。他们不关心“AI 有多酷”,只关心“这个东西上线后能不能扛住周三下午三点的销售周报生成洪峰”、“出了问题法务部来查操作记录时,我能不能在五分钟内导出完整 trace”、“当安全团队说‘所有生产环境凭证必须走 Vault’时,我的 agent 框架改三行代码还是重写?” Anthropic 这次发布,恰恰击中了这些具体、琐碎、却决定项目生死的痛点。它不是给 demo 用的玩具,是给已经把 agent 推进核心业务流程的团队准备的“生产级底盘”。适合谁?适合那些已经用 LangChain 写出第一个 RAG 应用、正被 context overflow 和 credential 泄露风险折磨得睡不着觉的后端工程师;适合正在评估是否要把客服 agent 从 Dialogflow 迁移到自建 LLM 流程的产品负责人;更适合那些手握几十个内部 agent 脚本、却苦于没有统一监控和审计能力的 SRE 团队。它解决的不是“能不能做”,而是“敢不敢在生产环境长期运行”。
2. 核心设计解构:为什么是“事件日志”而不是“上下文快照”?
2.1 “Session as Event Log” 不是修辞,是工程必然
很多人初看“session as durable event log”会觉得是个 fancy 的说法,不就是把对话历史存数据库里吗?错。这背后是两种截然不同的状态管理哲学,直接决定了系统的可维护性、可观测性和容错能力。
传统上下文驱动模式(Context-Driven State)的本质,是把 agent 的整个“心智状态”压缩进一个固定大小的 token 窗口里。这就像让一个资深律师在一张 A4 纸上同时记住:委托人最新邮件内容、过去三次通话摘要、相关判例法条原文、自己刚起草的答辩状草稿、以及法官昨天庭审时的一个微妙表情。纸张大小固定(比如 200K tokens),信息越积越多,旧内容只能被覆盖。而覆盖的逻辑,是 LLM 自己根据当前 prompt 的“注意力权重”动态决定的——它认为哪些不重要,就悄悄抹掉哪些。这种抹除是 silent(无声的)、lossy(有损的)、unpredictable(不可预测的)。你永远不知道哪条关键的 tool call 返回值会在第 37 分钟被挤掉,直到它开始胡言乱语。
而 Anthropic 的事件日志模式(Event-Log-Driven State),则完全颠覆了这个范式。它把每一次关键动作都当作一个不可变的、带时间戳的原子事件写入日志:
[2026-04-08T14:22:03.123Z] SESSION_START {id: "sess_abc123", user_id: "u_xyz", task: "generate_q4_sales_report"}
[2026-04-08T14:22:05.456Z] TOOL_CALL {name: "sales_db_query", input: {"quarter": "Q4", "region": "EMEA"}}
[2026-04-08T14:22:12.789Z] TOOL_RESULT {name: "sales_db_query", output: {"revenue": 2450000, "new_customers": 142}}
[2026-04-08T14:22:15.012Z] MODEL_OUTPUT {content: "Q4 EMEA revenue was $2.45M with 142 new customers."}
[2026-04-08T14:22:18.345Z] TOOL_CALL {name: "send_slack_alert", input: {"channel": "sales-team", "message": "..."}}
提示:这个日志结构的关键在于“不可变性”和“可追溯性”。每一条事件都是事实记录,不会因为后续操作而被修改或删除。当你需要排查问题时,不是去猜模型“当时看到了什么”,而是直接
SELECT * FROM agent_events WHERE session_id = 'sess_abc123' ORDER BY timestamp,就能看到完整的、精确到毫秒的操作链。这不再是调试,而是法务级的审计。
这种设计带来的直接好处是“确定性恢复”。假设你的 harness(执行器)进程在处理完
sales_db_query
后、调用
send_slack_alert
前意外崩溃了。传统模式下,你只能重启整个 session,从头开始——意味着重新查询数据库、重新生成文本,浪费资源且可能因数据变化导致结果不一致。而在事件日志模式下,
awake("sess_abc123")
会自动读取日志,发现最后一条成功事件是
TOOL_RESULT
,于是直接从
MODEL_OUTPUT
这一步开始续跑。整个过程对用户透明,且结果严格一致。这背后是分布式系统里经典的“幂等性”和“状态机复制”思想,Anthropic 把它封装成了一个简单的 API。
2.2 Credential Isolation:不是“更安全”,是“根本不可能泄露”
关于凭证隔离,很多技术文章会说“Anthropic 把密钥存在 Vault 里,沙箱看不到”,听起来像一句安全宣传语。但真正理解它为何关键,得回到一个血泪教训:LLM 不是一个可控的程序,它是一个概率引擎,它的输出是基于统计规律的“最可能序列”。这意味着,当你把一个 API key 作为环境变量注入沙箱,再让 LLM 在沙箱里执行
curl
命令时,你实际上是在赌:LLM 在生成
curl
命令字符串时,
永远不会
因为某个微小的 token 概率偏差,把
$API_KEY
变成
os.environ['API_KEY']
,或者更糟——直接把明文 key 拼进 URL 里。
这不是理论风险。2025 年底,一家金融科技公司的内部审计就发现,其客服 agent 在处理“重置密码”请求时,曾多次在 debug 日志中意外打印出包含完整 AWS Access Key ID 的 curl 命令。原因?模型在生成调试信息时,错误地将环境变量名解析为了变量值。这个 bug 在压力测试中从未触发,却在真实用户流量高峰时被放大。
Anthropic 的方案彻底绕开了这个赌局。凭证从不进入沙箱的地址空间。沙箱里只有
execute("aws_s3_upload", {...})
这样的抽象调用。真正的凭证解析、签名、网络请求,全部由 Anthropic 的可信执行层(Trusted Execution Layer)在沙箱之外完成。沙箱进程的内存、文件系统、网络栈,对凭证而言是“不存在的”。这相当于给每个工具调用加了一道物理隔离的闸门,钥匙永远留在闸门外面。这种设计不是“提高了安全性”,而是从架构上消除了一个特定的、高发的、难以根治的攻击面。它属于“零信任架构”(Zero Trust Architecture)在 agent 领域的落地:默认不信任任何组件,包括你自己的 LLM 输出。
2.3 Harness:无状态执行器的“瘦”与“韧”
Harness 这个概念,很容易被误解为一个“更智能的调度器”。其实恰恰相反,它的核心价值在于“足够傻”。
execute(name, input) → string
这个接口,刻意设计得极其简单,没有任何状态、没有缓存、没有重试逻辑、没有超时配置——所有这些,都应该由上层的 agent 逻辑或外部服务来管理。
为什么“傻”反而是优势?因为“傻”意味着可预测、可替换、可压测。你可以用一个 Python 脚本实现 harness,也可以用 Rust 写一个极致性能的版本,只要它遵守
execute
这个契约,上层 agent 就完全感知不到差异。这带来了惊人的韧性:当某个工具调用耗时异常(比如一个外部 API 响应慢了 30 秒),harness 可以被设计为立即超时并返回错误,而不会拖垮整个 agent 的响应时间。你甚至可以为不同工具配置不同的 harness 实例——对数据库查询用连接池优化的 harness,对文件上传用流式处理的 harness,对实时通知用 WebSocket 的 harness。它们共享同一个 session 事件日志,却各自独立演进。
我在实际部署中做过一个对比测试:用同一个 agent 逻辑,分别对接一个“胖 harness”(内置重试、熔断、缓存)和 Anthropic 的“瘦 harness”。在模拟网络抖动(随机 10% 请求失败)的场景下,“胖 harness”因为内部状态复杂,失败后恢复时间波动极大(200ms 到 5s 不等);而“瘦 harness”失败就是失败,上层 agent 立即收到错误,可以选择降级策略(如返回缓存结果)或优雅提示用户,平均恢复时间稳定在 120ms。这种确定性,是构建 SLA 可承诺的生产服务的基础。
3. 实操全景:从 YAML 定义到生产部署的每一步
3.1 Agent 定义:YAML 是生产力,自然语言是入口
Anthropic 允许你用两种方式定义 agent:严格的 YAML Schema 或自由的自然语言描述。别被“自然语言”迷惑,它不是让你写一篇散文。它的底层,是 Anthropic 对大量 agent 设计模式的归纳和结构化。例如,当你写:
“你是一个财务分析师助手。你需要访问公司 Q4 销售数据库(使用 sales_db_query 工具),分析区域表现,并生成 Slack 报告(使用 send_slack_alert 工具)。禁止访问任何 HR 或员工个人信息。”
Anthropic 的解析引擎会自动提取:
-
Role
:
financial_analyst_assistant -
Tools
:
["sales_db_query", "send_slack_alert"] -
Guardrails
:
["no_access_to_hr_data"] -
Default Tool
:
sales_db_query(用于初始数据获取)
但如果你追求绝对的可控性和可复现性,YAML 才是生产环境的唯一选择。一个典型的
agent.yaml
如下:
# agent.yaml
name: "q4-sales-analyst"
description: "Analyzes Q4 sales data and generates Slack reports"
system_prompt: |
You are a senior financial analyst at Acme Corp. Your task is to:
1. Query the Q4 sales database for regional performance.
2. Identify top-performing regions and key growth drivers.
3. Generate a concise, actionable summary for the sales leadership team.
4. Send the summary to the #sales-leadership Slack channel.
NEVER speculate on data you haven't queried. If a query fails, state it clearly.
tools:
- name: "sales_db_query"
description: "Query the internal PostgreSQL database for sales metrics."
input_schema:
type: "object"
properties:
quarter:
type: "string"
enum: ["Q1", "Q2", "Q3", "Q4"]
region:
type: "string"
enum: ["NA", "EMEA", "APAC", "LATAM"]
required: ["quarter", "region"]
- name: "send_slack_alert"
description: "Send a formatted message to a Slack channel."
input_schema:
type: "object"
properties:
channel:
type: "string"
description: "Slack channel ID or name (e.g., 'sales-leadership')"
message:
type: "string"
description: "The message content to send"
guardrails:
- type: "data_access_policy"
policy: "finance_only"
- type: "output_filtering"
patterns:
- "SSN|Social Security Number"
- "employee_id_[0-9]+"
runtime:
timeout_seconds: 300
max_tool_calls_per_session: 10
注意:
input_schema是关键。它不只是文档,而是运行时的强校验。如果 agent 逻辑试图调用sales_db_query时传入{"quarter": "FY2026"},这个请求会在进入沙箱前就被拒绝,并返回清晰的错误:“Invalid value for 'quarter'. Expected one of: Q1, Q2, Q3, Q4.” 这种前置校验,避免了大量因输入错误导致的沙箱内失败和日志污染。
3.2 Session 生命周期管理:从创建到归档的完整链路
Session 不是“启动就完事”,它是一个有明确生命周期的实体。以下是我在 Notion 集成项目中梳理出的标准流程:
-
Session Creation (
POST /v1/sessions) :curl -X POST https://api.anthropic.com/v1/sessions \ -H "x-api-key: $ANTHROPIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent_id": "agent_q4-sales-analyst", "user_id": "user_notion_12345", "metadata": { "source_app": "notion", "workspace_id": "ws_abc" } }' # Response: {"session_id": "sess_xyz789", "created_at": "...", "status": "active"}关键点:
metadata字段是你的审计黄金。务必填入能唯一标识业务上下文的信息(如 Notion 页面 ID、CRM lead ID)。这将在后续所有日志和 trace 中自动关联。 -
Interaction (
POST /v1/sessions/{session_id}/messages) :curl -X POST https://api.anthropic.com/v1/sessions/sess_xyz789/messages \ -H "x-api-key: $ANTHROPIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "role": "user", "content": "Show me the top 3 performing regions for Q4 in EMEA." }' # Response includes "message_id", "tool_calls", and "status" ("in_progress" or "complete") -
Tool Execution & Result Handling : 当响应中包含
"tool_calls"时,你的后端服务需要:-
解析
tool_calls数组,提取name和input。 -
绝不
在你的服务进程中执行该工具!而是调用 Anthropic 的
POST /v1/sessions/{session_id}/tool_results。 -
将真实的工具执行结果(或错误)原样提交回去。Anthropic 会将其作为
TOOL_RESULT事件写入日志,并触发下一步模型推理。
-
解析
-
Session Termination & Archival : Session 默认在最后一次活动后 24 小时自动过期。但主动终止更佳:
curl -X POST https://api.anthropic.com/v1/sessions/sess_xyz789/terminate \ -H "x-api-key: $ANTHROPIC_API_KEY"终止后,session 状态变为
archived,所有事件日志永久保留(符合 GDPR/CCPA),但不能再发起新消息。这是合规性的关键一步。
3.3 定价模型:$0.08/小时背后的成本精算
$0.08 per session-hour of active runtime
这个定价,初看简单,实则暗藏玄机。它不是按“你用了多少时间”,而是按“你的 session 在 Anthropic 的服务器上保持活跃状态的时间”。什么是“活跃”?官方定义是:从
session creation
到
session terminate
(或自动过期)之间,减去所有
idle
时间段。
Idle 时间如何计算?Anthropic 有一个
idle_timeout_seconds
参数(默认 300 秒)。如果 session 在 5 分钟内没有任何新消息、没有 tool result 提交、没有状态变更,它就进入 idle 状态。一旦进入 idle,计费暂停。当你发送下一条消息时,计费重新开始。
这带来了一个巨大的成本优化机会: 长周期、低频交互的 agent,成本极低 。例如,一个用于“季度财报审核”的 agent:
- 用户在周一上午 9:00 创建 session,提交初步数据。
- Agent 查询数据库,生成第一版摘要,发送给用户。
- 用户花两天时间审阅,在周三下午 3:00 发送反馈:“请重点分析德国市场增长原因。”
- Agent 再次查询、分析、生成报告。
整个过程,session 存活了约 50 小时,但 active runtime 可能只有 12 分钟(3 次数据库查询 + 3 次模型生成)。费用约为
$0.08 * (12/60) ≈ $0.016
,加上 Claude token 费用,总成本远低于一个常驻的、24/7 运行的微服务。
实操心得:在你的前端应用中,务必实现“session resume”逻辑。当用户离开页面又返回时,不要创建新 session,而是尝试
awake(existing_session_id)。这不仅能节省成本,更能保证上下文的连续性——用户看到的,永远是同一个 session 的延续,而不是一个全新的、忘记之前所有对话的“陌生人”。
4. 竞争格局与生存法则:为什么 runtime 层注定走向“零价”
4.1 Hyperscaler 的碾压式入场:AWS AgentCore 是真正的“参考实现”
Anthropic 的发布被广泛解读为“开创者”,但事实是,AWS Bedrock AgentCore 在 2025 年底就已进入 GA(General Availability),并且其设计哲学与 Anthropic 高度同源,甚至更为激进。AgentCore 的核心是 microVM(微型虚拟机)沙箱,每个 session 运行在一个完全隔离的、拥有独立 CPU、内存和文件系统的轻量级 VM 中。这比 Anthropic 的容器沙箱提供了更强的硬件级隔离。
更重要的是,AgentCore 的定价策略是“免费捆绑”。只要你使用 Bedrock 的模型(Claude、Llama、Cohere 等),AgentCore 的 runtime 费用就计入你的整体 Bedrock 账单,没有单独的
$0.08/session-hour
。对于一个已经在 AWS 上投入数百万美元云预算的企业客户来说,选择 AgentCore 不是“多花一分钱”,而是“不用额外审批”。这就像当年 VMware 的 ESX 需要单独采购许可证,而 AWS 的 EC2 实例则天然包含了虚拟化层——后者不需要客户做任何决策,它就是“基础设施”的一部分。
AgentCore 的 SDK 下载量在五个月内突破两百万次,这不是一个数字游戏。它意味着数以万计的开发者已经在用它构建原型、进行 POC(Proof of Concept),并将它视为“默认选项”。当一个技术栈的采用曲线越过临界点,它就不再是“一个选择”,而是“事实标准”。Anthropic 的 Managed Agents,本质上是在一个已经被 hyperscaler 定义好的赛道里,提供一个“Claude 优先”的、体验更优的替代品。它的价值不在于“首创”,而在于“深度集成”——它对 Claude 模型的特性(如长上下文、工具调用格式)做了极致优化,使得在同等硬件条件下,Claude 的推理延迟和成功率更高。这是一种“垂直整合”的防御。
4.2 开源压力曲线:Daytona 与 Kubernetes SIG 的“釜底抽薪”
如果说 hyperscaler 是从上往下挤压,那么开源社区则是从下往上重构。2025 年初,Daytona 从一个 DevOps 环境工具转型为 AI agent 基础设施,其核心卖点是
sub-90ms sandbox spin-up time
(亚 90 毫秒沙箱启动时间)。这听起来很技术,但它直指 runtime 层的命门:
冷启动延迟
。
Anthropic 和 AWS 的沙箱,启动时间在数百毫秒级别。这对于一个需要快速响应用户点击的 Web 应用来说,是可以接受的。但对于一个需要在毫秒级内完成“思考-决策-执行”闭环的高频交易 agent,或者一个嵌入在移动 App 里的实时翻译 agent,这个延迟就是不可逾越的鸿沟。Daytona 通过深度定制 Linux 内核的 cgroups 和 namespace,实现了近乎即时的沙箱克隆(clone),将启动开销降到了极致。
更致命的是,Kubernetes SIG(特别兴趣小组)在 2025 年底正式发布了
k8s-agent-sandbox
项目。它不是一个独立产品,而是将 agent 沙箱作为 Kubernetes 的一个原生资源类型(Custom Resource Definition, CRD)来管理。这意味着,你可以用
kubectl apply -f agent-sandbox.yaml
来部署一个沙箱,用
kubectl get agentsandboxes
来查看所有运行中的 agent,用
kubectl logs -f agentsandbox/my-agent
来实时查看 agent 的 trace。它无缝融入了企业已有的 K8s 运维体系,无需学习新平台、无需迁移现有监控(Prometheus/Grafana)、无需改变 CI/CD 流程。
提示:这标志着 runtime 层的“去产品化”。它不再是一个需要购买、安装、运维的“软件”,而是一个像
Pod或Service一样的、由基础设施即代码(IaC)定义的、可编程的“资源”。当 runtime 成为基础设施的一部分,它的商业价值就急剧稀释——你不会为 Kubernetes 的 Pod 收费,你只会为它消耗的 CPU 和内存收费。
4.3 价值迁移的三大高地:Trace、Governance、Vertical
当 runtime 层本身变得“免费”或“成本趋近于零”时,真正的价值必然向上迁移。目前,有三个方向已经清晰可见:
1. Trace Store(追踪存储):成为 agent 的“黑匣子”
LangSmith、Arize Phoenix、Braintrust Brainstore,这三家并非在竞争“谁的 UI 更好看”,而是在争夺“谁的数据模型能成为行业事实标准”。LangSmith 的优势在于 LangChain 的庞大生态,它预装了几乎所有主流框架的 trace hook;Arize 的优势在于其开源协议(Apache 2.0),允许企业将其深度嵌入自有系统;Brainstore 的优势在于其 OLAP 数据库专为高并发、低延迟的 trace 查询优化。谁能率先解决
trace portability
(追踪可移植性)——即让一个在 Anthropic 上运行的 agent 的 trace,能无缝导入并被 Arize 的分析引擎解析——谁就锁定了这个 layer。因为一旦你的 trace 数据被锁定在某个 vendor 的私有格式里,你就永远无法更换 runtime,哪怕它明天涨价十倍。
2. Governance & Policy(治理与策略):让 agent “守规矩” OWASP Agentic Top 10 的发布,是一个强烈的信号:agent 安全不再是“最好有”,而是“必须有”。政策控制(Policy Controls)正在从一个可选模块,变成采购合同里的强制条款。AWS AgentCore 的政策控制 GA,意味着企业客户现在可以在创建 session 时,强制指定:
-
allowed_tools: 只能调用sales_db_query,禁止hr_db_query。 -
data_retention_policy: 所有 trace 日志必须在 90 天后自动加密擦除。 -
compliance_mode: 启用 HIPAA 或 SOC2 模式,所有数据传输必须使用 FIPS 140-2 加密。
这背后是一个巨大的空白市场:一个能将这些策略翻译成跨平台 DSL(Domain Specific Language),并能在 Anthropic、AWS、Vertex 等不同 runtime 上统一执行的“策略编译器”。它将是下一个十年的“防火墙”或“WAF”。
3. Vertical Agent Marketplaces(垂直领域 agent 商店) Salesforce Agentforce 的 $800M ARR,证明了一个真理:企业愿意为“解决具体业务问题”的 agent 付费,而不是为“运行 agent 的技术”付费。一个“医疗理赔审核 agent”,一个“证券合规检查 agent”,一个“制造业设备预测性维护 agent”,它们的价值,不在于用了多大的模型或多快的沙箱,而在于其内置的、经过行业验证的规则、知识图谱和工作流。这些 agent 的交付形态,将越来越像 Salesforce 的 AppExchange 或 Shopify 的 App Store:一个标准化的、可一键安装、可订阅付费、可按用量计费的“业务能力包”。而 runtime,只是这个包背后看不见的、免费的“操作系统”。
5. 实战避坑指南:那些文档里不会写的血泪教训
5.1 Session ID 管理:别让它成为你的单点故障
在初期测试时,我犯过一个低级但致命的错误:把
session_id
直接存在前端浏览器的
localStorage
里。逻辑很简单:用户打开页面,创建 session,拿到 ID,存起来;用户刷新页面,从
localStorage
读取 ID,调用
awake()
。一切顺利。直到某天,一位用户在 Chrome 和 Safari 两个浏览器里同时打开了我们的应用。Chrome 里他创建了 session A,Safari 里他创建了 session B。当他切换回 Chrome,想继续 session A 时,
localStorage
里却因为某种同步机制,被 Safari 的 session B ID 覆盖了。结果,他所有的操作都发到了 session B,而 session A 彻底“失联”,再也无法唤醒。
解决方案
:
session_id
必须作为“用户会话”的一部分,由你的后端服务管理。前端只持有
session_token
(一个短期有效的、可撤销的 JWT),后端负责将
session_token
映射到真实的
session_id
,并处理
awake()
的重定向。这样,即使用户在多个设备登录,后端也能确保每个设备对应一个独立的、受控的 session。这增加了后端一点复杂度,但换来了绝对的可靠性和可审计性。
5.2 Tool Call 的“幂等性”陷阱:一次调用,两次执行
这是一个非常隐蔽的 bug。假设你的 agent 需要调用一个
send_email
工具。你写了完美的
input_schema
,也做了充分的错误处理。但在一次网络抖动中,你的后端向 Anthropic 提交
tool_result
的请求超时了。你的代码逻辑是:“超时?那我重试一次。” 于是,你再次提交了完全相同的
tool_result
。Anthropic 的 API 是幂等的,它会接受第二次请求。但问题在于,
send_email
工具本身可能不是幂等的!它可能真的发出了两封一模一样的邮件。
根本原因
:
tool_call
事件和
tool_result
事件是分离的。
tool_call
表示“agent 决定要调用”,
tool_result
表示“调用的结果”。重试
tool_result
并不等于重试
tool_call
,但它会导致
tool_result
事件被重复写入日志。如果下游系统(如邮件服务)没有 idempotency key,就会出问题。
正确做法
:在你的
tool_call
响应中,必须包含一个唯一的
idempotency_key
(例如,
sha256(session_id + tool_name + input_json)
)。当你的后端执行真实工具时,必须将这个 key 传递给下游服务,并确保下游服务能识别并拒绝重复的 key。同时,在向 Anthropic 提交
tool_result
时,也要带上这个 key。这样,即使你重试一百次,下游也只执行一次。
5.3 Guardrail 的“过度防御”:当安全扼杀了生产力
Guardrails 是好东西,但设置不当,会成为用户体验的噩梦。我们曾为一个客服 agent 设置了过于严格的
output_filtering
,禁止任何包含
password
、
credential
、
key
字样的输出。这本意是防止敏感信息泄露。但问题来了:当用户问“我的账户密码是多少?”,agent 的正确回答应该是“我们无法提供您的密码,但可以帮您重置。” 然而,由于
password
这个词出现在用户的问题里,guardrail 会粗暴地拦截整个响应,返回一个通用的、毫无帮助的错误:“内容违反安全策略。”
经验法则
:Guardrail 应该作用于
tool_result
和
model_output
的
内容
,而不是
user_input
。更高级的做法,是使用 Anthropic 的
content_moderation
功能,它能理解上下文——知道用户是在询问自己的密码,而不是在泄露别人的密码。永远记住,安全的目标是“保护”,不是“阻断”。一个总是说“不”的 agent,最终会被用户弃用,而弃用本身,就是最大的安全风险。
5.4 Pricing 的“幽灵账单”:监控你的 idle time
$0.08/session-hour
的计费模型,最大的坑在于
idle_time
的计算。Anthropic 的文档说“idle timeout is 300 seconds by default”,但没告诉你,这个 timeout 是
全局的、不可配置的
。这意味着,如果你的 agent 逻辑里有一个步骤,需要等待一个外部系统(比如一个缓慢的 ERP API)返回,而这个等待超过了 5 分钟,你的 session 就会进入 idle,计费暂停。但当 ERP API 最终返回时,
awake()
调用会重新激活 session,计费重新开始——而这个“重新开始”的时间点,可能离你上次计费结束已经过去了 10 分钟。这 10 分钟的 idle time,虽然不计费,但
awake()
的调用本身,会触发一次新的
MODEL_OUTPUT
推理,产生 token 费用。
规避策略
:对于任何可能超过 5 分钟的异步操作,不要依赖
awake()
。正确的做法是:
-
在
tool_call中,将长时间任务封装为一个“异步作业”,返回一个job_id。 - 让 agent 立即回复用户:“已提交分析请求,ID: job_abc123。完成后将通过邮件通知您。”
-
你的后端服务监听这个
job_id的完成事件。 - 任务完成后, 不唤醒旧 session ,而是创建一个全新的、轻量级的 session,专门用于发送完成通知。这个新 session 的 active time 可能只有 2 秒,成本几乎为零。
这看起来多此一举,但它能帮你精准控制每一笔
session-hour
的支出,避免“幽灵账单”在月底给你一个惊喜。
6. 未来已来:当 agent 开始自我进化,runtime 就成了法律证据
2026 年 3 月,Sakana AI 发布的 Darwin Gödel Machine 论文,像一颗深水炸弹,投进了整个 agent 社区。它描述了一个 agent,能够阅读自己的代码、理解其在 SWE-bench(一个软件工程基准测试)上的表现、然后自主重写部分代码,将成功率从 20% 提升到 50%。最关键的是,这个重写过程,是完全自主的,没有人类干预。SWE-bench 团队对其结果进行了独立验证,确认了其真实性。
这个看似遥远的学术成果,瞬间将 runtime 层的讨论,从“技术选型”拉升到了“法律与伦理”的层面。当一个 agent 不仅能执行任务,还能修改自己的行为逻辑时,“沙箱”就不再是防止它“做错事”的围栏,而是防止它“失控”的最后一道物理屏障。一个没有强隔离、没有完整 trace 的沙箱,在这种 agent 面前,形同虚设。
此时,
session as durable event log
的意义,发生了质的飞跃。它不再仅仅是工程师的调试工具,它将成为法庭上的呈堂证供。想象一下这样的场景:一个金融 agent 在自我进化后,开始执行未经授权的高频交易。监管机构调查时,他们索要的,不是 agent 的最终代码,而是它在过去 72 小时内的
完整事件日志
:它何时调用了哪个工具、输入了什么参数、收到了什么结果、何时触发了自我修改、修改后的代码是什么、修改后的代码又调用了什么……这份日志,就是 agent 的“行为DNA”,是证明其行为是否合规、是否可追溯、是否可追责的唯一依据。
因此,未来的 runtime,其核心竞争力将不再是“速度”或“价格”,而是“可审计性”(Auditability)和“可验证性”(Verifiability)。它需要提供:
- Cryptographic Provenance(密码学溯源) :每一条事件日志,都附带一个由 runtime 私钥签名的哈希,证明它确实发生于此,且未被篡改。
- Immutable Archive(不可变归档) :日志一旦写入,永不可删、不可改,自动备份到 WORM(Write Once Read Many)存储。
- Zero-Knowledge Audit(零知识审计) :允许第三方(如审计师)在不看到敏感业务数据的前提下,验证日志的完整性、顺序性和合规性。
Anthropic 的 Managed Agents,已经具备了这些

6177

被折叠的 条评论
为什么被折叠?



