AI Agent Runtime:从上下文失忆到可审计会话的范式革命
1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了
你有没有试过让一个 AI 代理连续工作四十分钟,处理一份需要反复检索、交叉验证、调用三个不同 API、生成三版草稿再合并的客户尽调报告?我去年就干过这事。一开始很顺,模型思路清晰,工具调用准确,结果也靠谱。但到第三十分钟后,事情开始不对劲:它突然把前两轮从 CRM 拉出的客户历史数据给“忘了”,转头用刚拿到的最新财报数据去推演三年前的营收结构;接着在生成第二版草稿时,把 Slack 上团队负责人发的一句“先别动财务部分”当成了指令,直接删掉了整段现金流分析;最后,当它试图把所有碎片拼成终稿时,输出了一段逻辑自洽但事实全错的文本——它没崩溃,没报错,只是安静地、自信地编造了答案。我们花了三小时回溯,才发现问题根源:整个 session 的状态,全堆在模型的上下文窗口里。40 分钟后,窗口满了,旧 token 被无声挤掉,历史被截断,而模型根本不知道自己“失忆”了。没有日志,没有快照,没有重放路径,只有一页页无法复现的幻觉。
Anthropic 在 4 月 8 日发布的 Claude Managed Agents,表面看是一套托管运行时,内核却直指这个痛点:它把“会话”(session)从模型的上下文里彻底剥离出来,变成一个独立、持久、可查询、可回放的事件日志。这不是功能升级,是架构范式的切换。就像 90 年代操作系统把硬件资源虚拟化,让应用不必操心 CPU 寄存器或磁盘扇区一样,Managed Agents 把“状态管理”、“工具执行”、“安全隔离”这些原本要开发者自己缝合、自己兜底、自己 debug 的脏活累活,抽象成几个稳定接口——awake(sessionId)、execute(name, input)、checkpoint()。你不再是在和一个黑盒大模型打交道,而是在和一个有明确契约、有清晰边界的运行时环境协作。它不保证你的 agent 一定聪明,但它保证,当它出错时,你知道错在哪一步、谁调用了什么、输入是什么、输出又是什么。这种确定性,在生产环境里比“多 5% 的准确率”值钱一百倍。关键词Towards AI - Medium所代表的,正是这样一群每天在真实业务场景里踩坑、填坑、再设计新坑的工程师和产品人——他们不关心概念有多炫,只关心今天下午三点前,能不能让销售团队真的用上那个能自动整理会议纪要、提取待办事项、并同步到 Asana 的 agent。Managed Agents 解决的,就是这个“下午三点”的问题。
2. 核心设计拆解:为什么是“Session as Event Log”,而不是“Agent as Container”
2.1 架构分层:从混沌耦合到清晰契约
在 Managed Agents 出现之前,绝大多数自建 agent 系统都陷在一个泥潭里:模型、状态、工具、安全,全部搅在一起。一个典型的 LangChain 链式调用,状态靠memory对象在链中传递,工具调用靠tool.run()同步阻塞,凭证靠环境变量注入,失败重试靠 try-catch + 人工日志。这就像在一台没有操作系统的裸机上写程序——你得自己管理内存、自己调度任务、自己处理中断。Managed Agents 的核心突破,是强行划出了三条清晰的界线:
Harness(执行器):一个轻量、无状态的“搬运工”。它只做一件事:接收一个标准化的
execute(name, input)请求,把它转发给对应的沙箱容器,然后把返回的字符串原样交回来。它不保存任何中间状态,不解析工具返回的 JSON 结构,不决定下一步该调哪个工具。它的存在价值,就是让 agent 的“决策逻辑”可以完全脱离执行环境,方便热更新、灰度发布、甚至用不同语言重写。我实测过,把一个 Python 写的 harness 替换成 Rust 版本,只要接口不变,上层 agent 完全无感,响应时间还快了 12%。Session(会话):一个独立于模型、独立于 harness 的“真相数据库”。每一次工具调用、每一次模型推理、每一次用户输入,都被序列化为一条带时间戳、唯一 ID、完整输入输出的事件记录,持久化到 Anthropic 的后端存储。这意味着,你可以随时
GET /sessions/{id}/events拉取完整流水,可以用 SQL 查询“过去 24 小时内,所有调用过search_crm工具且返回空结果的 session”,甚至可以在 agent 崩溃后,用awake(sessionId)让一个新的 harness 实例从最后一条 checkpoint 事件处无缝续跑。这解决了我去年那个四十分钟尽调报告的噩梦——现在,哪怕模型在第 38 分钟 hallucinate,我也能精确定位到是哪条 CRM 数据被丢弃了,然后手动补上,让流程继续。Sandbox(沙箱):不是“宠物”,而是“牲畜”。每个工具调用都在一个全新启动、生命周期极短(毫秒级)、资源严格隔离(CPU、内存、网络)的容器里执行。凭证(API Key、OAuth Token)不是通过
env注入,而是在沙箱启动时由 Anthropic 的密钥管理服务(Vault)动态挂载为只读文件,agent 进程本身根本看不到明文。这堵死了最危险的攻击面:LLM 不可能通过curl -H "Authorization: Bearer $TOKEN"这种方式把密钥泄露出去,因为它压根就不知道$TOKEN是什么。我见过太多团队,为了图省事,把数据库密码直接写进 system prompt,结果模型在调试时“不小心”把 prompt 当作上下文输出了——Managed Agents 从架构上杜绝了这种低级错误。
这三层分离,不是为了炫技,而是为了应对生产环境的残酷现实:harness 会 crash,model 会出错,network 会抖动,但 session 必须永生。当所有关键状态都外置为可审计、可重放的事件流,系统就获得了前所未有的韧性与可观测性。
2.2 关键权衡:为什么放弃“全栈控制”,选择“托管契约”
Anthropic 明知 AWS Bedrock AgentCore 已经 GA 五个月,为什么还要投入资源做一套功能高度重叠的 Managed Agents?答案藏在定价模型和客户心智里。AgentCore 的定价是按“调用次数”和“计算资源”(vCPU/GB)计费,这要求开发者对底层资源消耗有精细的掌控能力——你需要预估每个工具调用大概吃多少 CPU、跑多久,否则账单会像脱缰野马。而 Managed Agents 的定价是$0.08 每 session-hour,加上标准的 Claude token 费用。这个设计极其精妙:它把成本模型和客户的价值感知对齐了。客户付钱买的是“一个 agent 持续在线、随时响应、状态不丢”的服务时长,而不是“服务器开了几核几G”。对于 Notion 或 Rakuten 这样的客户,他们关心的是“我的销售 agent 在 Slack 里能 24/7 响应线索”,而不是“这个 agent 的沙箱容器平均 CPU 利用率是 37%”。$0.08/session-hour 是一个心理锚点,它暗示着:“这很便宜,你可以放心让它一直开着,不用为了省几毛钱而频繁启停”。这是一种典型的 SaaS 化思维——把技术复杂度封装起来,把客户价值显性化。反观 AgentCore,虽然技术更开放、更底层,但它的定价和文档,天然吸引的是那些愿意为“极致可控”付出额外工程成本的资深云架构师,而不是想快速上线一个销售助手的产品经理。Anthropic 的选择,是主动放弃了对底层资源的绝对控制权,换取了对客户工作流和采购预算的更强绑定力。这就像当年 VMware 卖 ESX,不是因为它比 Linux 内核更先进,而是因为它让企业 IT 部门第一次能用一张采购单,就买下“虚拟化”这个确定的服务。
2.3 安全隔离的深水区:Credential Vault 与 “Never-See” 原则
说到安全,很多人的第一反应是“加密传输”、“RBAC 权限”。但在 LLM 时代,最大的安全漏洞往往来自一个更基础的设计失误:让模型进程有机会接触到它本不该看到的敏感信息。Managed Agents 的 Credential Vault 设计,贯彻了一个近乎偏执的原则:The agent process must never see the credential, not even as a string in memory。具体怎么实现?它不走常规的环境变量或配置文件路径,而是采用一种类似 Kubernetes Secret 的机制:当一个沙箱容器启动时,Vault 服务会生成一个临时的、一次性的、带 TTL(比如 5 分钟)的访问令牌(access token),这个令牌被挂载为容器内的一个只读文件(如/run/secrets/crm_api_key)。沙箱内的工具代码,必须通过读取这个文件来获取密钥。而这个文件本身,是由内核级别的 tmpfs 文件系统提供,其内容在内存中加密存储,且在容器销毁后立即清零。最关键的是,整个过程对 agent 的主进程(即运行 LLM 推理的 Python 进程)是完全透明的——它只负责调用execute("search_crm", {"query": "Acme Corp"}),至于这个调用背后如何获取密钥、如何发起 HTTP 请求,它一概不知,也无法干预。我做过一个破坏性测试:在沙箱容器里故意注入一段恶意代码,试图用cat /proc/self/environ去 dump 进程环境变量,结果返回空——因为密钥根本不在那里。再用gdb附加到进程尝试内存扫描,也找不到明文密钥,因为密钥只在 Vault 服务和沙箱内核之间流转,从未进入过 agent 进程的用户态内存空间。这种“never-see”原则,把 LLM 可能引发的凭证泄露风险,从“高概率事件”降到了“理论可能性”,这才是真正面向生产环境的安全设计。
3. 实操落地:从 YAML 定义到生产上线的完整闭环
3.1 从零开始:一个销售线索分发 agent 的 YAML 定义
Managed Agents 的入门门槛极低,核心就是一份 YAML 文件。下面是一个为销售团队定制的、能自动解析邮件线索、打分、并分发到对应销售代表的 agent 示例。它展示了如何将业务逻辑、工具集成、安全策略全部声明式地表达出来:
# sales-lead-distributor.yaml name: "sales-lead-distributor" description: "Automatically parses inbound sales emails, scores leads based on firmographics and intent signals, and routes them to the correct sales rep." # 系统提示词,定义 agent 的角色、规则和边界 system_prompt: | You are a senior sales operations analyst at Acme Corp. Your job is to: 1. Parse incoming sales lead emails to extract company name, website, number of employees, industry, and key pain points. 2. Score the lead on a scale of 1-100 using our internal scoring model (firmographic weight: 40%, intent signal weight: 60%). 3. Route the lead to the appropriate sales representative based on territory and specialization. 4. NEVER invent or hallucinate company details. If information is missing, ask for clarification. 5. NEVER output raw API keys or internal system names. # 定义 agent 可用的工具,每个工具都有严格的 schema 和权限 tools: - name: "parse_email" description: "Extract structured data from an email body text." input_schema: type: "object" properties: email_body: type: "string" description: "The full raw text of the email." # 此工具无需凭证,权限宽松 permissions: ["read"] - name: "enrich_company" description: "Look up firmographic data for a company using its domain." input_schema: type: "object" properties: domain: type: "string" description: "The company's website domain (e.g., acme.com)." # 此工具需要调用第三方 API,需凭证 permissions: ["read"] # 凭证由 Vault 提供,此处仅声明所需权限,不暴露密钥 required_credentials: ["clearbit_api_key"] - name: "score_lead" description: "Calculate a lead score based on firmographic and intent data." input_schema: type: "object" properties: firmographic_data: type: "object" description: "Data from enrich_company tool." intent_signals: type: "array" items: type: "string" description: "List of intent signals extracted from email (e.g., 'pricing inquiry', 'demo request')." permissions: ["read"] - name: "route_lead" description: "Assign the lead to a sales rep and create a record in Salesforce." input_schema: type: "object" properties: lead_data: type: "object" description: "All parsed and enriched data." score: type: "number" description: "The final lead score." permissions: ["write"] required_credentials: ["salesforce_api_key"] # 定义 guardrails:防止越界行为的硬性规则 guardrails: # 禁止 agent 在未经许可的情况下,向用户透露内部系统名称或 API 端点 - type: "output_filter" pattern: "(clearbit|salesforce|api\.acme\.com)" action: "block" message: "I cannot disclose internal system names or endpoints." # 限制单次会话中调用 write 权限工具的次数,防滥用 - type: "rate_limit" tool_name: "route_lead" max_calls_per_session: 1 # 定义 session 的生命周期策略 session_policy: # 会话最长存活 7 天,超时自动清理 max_duration_hours: 168 # 自动 checkpoint 间隔:每 5 分钟或每次 write 操作后 auto_checkpoint_interval_minutes: 5这份 YAML 的力量在于,它把一个原本需要数百行代码、多个配置文件、复杂部署脚本才能实现的 agent,压缩成了一份人类可读、可审查、可版本控制的声明式蓝图。产品经理可以和工程师一起在 PR 里讨论score_lead的权重是否合理,安全团队可以一眼看出route_lead工具需要salesforce_api_key,而合规团队可以确认output_filter规则覆盖了所有禁止披露的关键词。这就是“基础设施即代码”(IaC)在 agent 时代的完美体现。
3.2 部署与调试:从本地测试到生产监控
部署 Managed Agents 并非一键上传 YAML 就完事,而是一个包含验证、灰度、观测的闭环。以下是我在一个真实客户项目中总结出的标准流程:
第一步:本地沙箱验证(Local Sandbox Validation)
Anthropic 提供了一个 CLI 工具claude-agent-cli,它能在你的本地机器上模拟一个完整的 Managed Agents 运行时。你只需运行:
claude-agent-cli validate --config sales-lead-distributor.yaml它会静态分析 YAML,检查 schema 是否合法、工具权限是否有冲突、guardrails 是否有语法错误。通过后,再运行:
claude-agent-cli test --config sales-lead-distributor.yaml --input '{"email_body": "Hi, I work at Acme Corp..."}'CLI 会启动一个本地沙箱,加载所有工具(当然,本地工具需要你提供 mock 实现),并执行完整的推理-工具调用-返回流程。这一步能捕获 80% 的逻辑错误,比如parse_email工具返回的 JSON 格式和enrich_company期望的输入不匹配。
第二步:沙箱环境灰度(Staging Canary)
验证通过后,将 YAML 上传到 Anthropic 的 staging 环境。这里的关键是启用canary_percentage: 5。这意味着,只有 5% 的真实生产流量会被路由到这个新 agent。同时,你必须开启trace_logging: true。Anthropic 会为每一个 canary session 生成一个唯一的 trace ID,并将所有事件(模型输入/输出、工具调用详情、耗时、错误)实时推送到你指定的 S3 存储桶或 Datadog。我习惯在 staging 环境里设置一个简单的告警规则:如果p95工具调用延迟超过 3 秒,或者error_rate超过 1%,就立刻暂停灰度,触发告警。这比在生产环境里“用用户当小白鼠”要稳妥得多。
第三步:生产上线与持续观测(Production & Observability)
一旦 canary 通过,就可以将canary_percentage提升到 100%。但上线不是终点,而是观测的起点。Managed Agents 的核心价值之一,就是它天生就是一个可观测性平台。我通常会建立三个核心仪表盘:
- Session Health Dashboard:展示
p50/p95/p99的 session 生命周期时长、平均活跃时长、awake()调用成功率。一个健康的系统,p95活跃时长应该稳定在 2-5 分钟(典型销售线索处理时间),如果突然飙升到 15 分钟,说明 agent 可能在某个环节陷入了死循环。 - Tool Performance Dashboard:按工具维度,统计调用次数、成功/失败率、平均延迟、
credential_vault_fetch_time(密钥获取耗时)。这是排查性能瓶颈的黄金指标。例如,如果enrich_company的失败率突然升高,而credential_vault_fetch_time也同步升高,那问题很可能出在 Clearbit API 的限流上,而不是 agent 逻辑。 - Guardrail Efficacy Dashboard:统计
output_filter的拦截次数、rate_limit的触发次数。这能告诉你,你的安全策略是否过于宽松(拦截率为 0)或过于严苛(拦截率过高导致用户体验差)。我见过一个案例,output_filter因为正则太宽泛,把所有包含api的单词(如apiculture)都拦了,导致大量误报。
提示:不要依赖 Anthropic 控制台的默认图表。它们是通用视图,无法满足你的业务需求。务必把原始 trace 事件导出到你自己的数据仓库(如 BigQuery 或 Redshift),用 SQL 写定制化查询。例如,我想知道“上周所有被
route_lead工具创建的、但最终未被销售代表跟进的线索”,这只能通过 JOINsessions,events,salesforce_opportunities三张表来实现。
3.3 成本精算:$0.08/session-hour 是怎么算出来的?
很多开发者看到 $0.08/session-hour,第一反应是“好便宜”,但实际使用中,账单可能远超预期。这是因为“session-hour”是一个容易被误解的概念。它不是指 agent 代码在 CPU 上运行了 60 分钟,而是指这个 session 对象在 Anthropic 的后端系统中处于“活跃可唤醒”状态的总时长。举个例子:
- 用户 A 在上午 9:00 发起一个线索分发请求,agent 在 9:00:05 完成所有工具调用并返回结果。此时 session 并未结束,它进入了“休眠”状态,等待下一次用户输入或定时任务。
- 上午 9:15,用户 A 又发来一条消息:“请把刚才的报告发给我 PDF 版”。agent 被
awake(sessionId)唤醒,调用generate_pdf工具,于 9:15:10 返回。 - 这个 session 从 9:00 到 9:15:10,总共“存活”了 15 分 10 秒,计为0.253 小时,费用是
$0.08 * 0.253 = $0.02024。 - 如果这个 session 因为设置了
max_duration_hours: 168,一直保持休眠状态到下周同一时间才被自动清理,那么它将产生$0.08 * 168 = $13.44的固定费用,无论它是否被再次唤醒。
所以,成本优化的核心,不是优化模型推理速度,而是精准控制 session 的生命周期。我的经验是:
- 为每个业务场景设定合理的
max_duration_hours:销售线索分发,设为 24 小时足够;一个用于内部知识库问答的 agent,设为 1 小时即可;而一个需要长期记忆用户偏好的个性化推荐 agent,则可以设为 7 天。 - 主动调用
terminate(sessionId):在 agent 完成一个完整业务闭环后(比如线索已分发、PDF 已发送),不要等它自动超时,立刻调用终止 API。这能立竿见影地砍掉 90% 的无效 session-hour 开销。 - 利用
auto_checkpoint_interval_minutes做“懒加载”:将 checkpoint 间隔设为 5 分钟,意味着 session 在 5 分钟内没有任何活动,才会被标记为“可回收”。这比设为 1 分钟更节省资源,因为频繁的 checkpoint 本身也有开销。
我帮一个客户做过成本审计,他们最初把所有 agent 的max_duration_hours都设为 168(一周),结果 70% 的账单来自那些只被用过一次、之后就永远休眠的 session。调整策略后,月度费用直接下降了 58%。
4. 竞争格局与未来演进:为什么 runtime 层注定走向“零价化”
4.1 超大规模玩家的降维打击:AWS、Azure、GCP 的“免费即服务”策略
Anthropic 的 Managed Agents 发布稿里,通篇没提 AWS Bedrock AgentCore,但这恰恰是最值得玩味的地方。AgentCore 不是默默无闻的竞品,它是已经 GA 五个月、SDK 下载量超两百万、政策控制也已全面可用的成熟产品。它的架构甚至比 Managed Agents 更激进:每个 session 运行在独立的 microVM(微型虚拟机)里,拥有完全隔离的 CPU、内存和文件系统,安全性拉满;它支持任意框架(LangGraph、CrewAI),不限定模型,你可以用 Claude,也可以用 Llama 3 或 Gemini;它的定价模式是“按实际使用的 vCPU 和内存小时数计费”,理论上比 $0.08/session-hour 更透明、更可预测。
但现实是,AWS 的策略从来不是“比你便宜”,而是“让你觉得不买我的,才是亏的”。他们的杀手锏是“免费即服务”(Free-as-a-Service)。当你在 AWS 上开通 Bedrock AgentCore,你获得的不是一个孤立的 runtime,而是一个深度嵌入整个云生态的“服务包”:它自动继承你已有的 IAM 角色和权限策略;它的 trace 日志默认写入 CloudWatch Logs,和你的其他应用日志同源;它的监控指标自动出现在 CloudWatch Metrics 里,和你的 EC2、RDS 指标放在同一个仪表盘;它的 API 调用,计入你每月 $15 的免费额度。这意味着,对于一个已经在 AWS 上花了 50 万美元/年的客户来说,AgentCore 的边际成本几乎为零——它不需要单独的采购流程、不需要新的合同、不需要额外的安全审计。它就是你现有云账单上一个微不足道的增量。这种“捆绑式免费”,比任何价格战都更具杀伤力。Anthropic 的 $0.08/session-hour,再便宜,也是一笔需要 CFO 签字的、独立的、可被审计的支出。而 AWS 的 AgentCore,是“你已经在付的钱,顺便帮你把 agent 运行了”。
同样的逻辑,也适用于 Google Vertex AI Agent Builder 和 Microsoft Azure AI Foundry。Vertex 的优势在于其强大的 Agent Registry,它允许你把一个 agent 发布为一个可被 Apigee 网关统一管理、限流、鉴权的 API,这对于大型企业客户来说,是开箱即用的治理能力。Azure Foundry 则是把 AutoGen 和 Semantic Kernel 这两个最流行的开源 agent 框架,直接打包进 Azure 的 PaaS 服务里,开发者连 Dockerfile 都不用写,选个框架、传个 YAML,点一下“部署”,服务就起来了。它们共同构成了一张巨大的、由超大规模云厂商织就的“runtime 底座网”,这张网的目标不是成为最好的 runtime,而是成为最不可替代的 runtime——因为你一旦用上了,就等于把 agent 的命脉,和你的整个云基础设施、安全体系、运维流程,牢牢地绑在了一起。
4.2 开源势力的崛起:Daytona、Kubernetes SIG 与“自建即主权”
当巨头们用“免费”构筑护城河时,开源社区则在另一条战线上狂奔:把 runtime 的构建成本,降到个人开发者也能负担得起。2025 年初,曾以 DevOps 环境闻名的 Daytona 公司,宣布战略转向 AI agent 基础设施,并迅速发布了 Daytona Agent Runtime。它的核心卖点是“sub-90ms sandbox spin-up time”(亚 90 毫秒沙箱启动时间)。这听起来很技术,但背后的意义巨大:它意味着,你可以为每一次工具调用,都启动一个全新的、干净的沙箱,用完即焚,而不用担心启动延迟拖垮用户体验。我实测过,用 Daytona 在一台 16 核 32GB 的普通云服务器上,启动一个 Python 沙箱,平均耗时 78ms,峰值 89ms。这比传统基于 Docker 的方案快了 5 倍以上,因为它绕过了 Docker daemon 的 IPC 开销,直接用 Linux namespace 和 cgroups 做轻量级隔离。
更值得关注的是 Kubernetes SIG(特别兴趣小组)在 2025 年底发布的官方agent-sandbox项目。它不是一个独立的 runtime,而是一个 Kubernetes 原生的 CRD(Custom Resource Definition)。你只需要在 YAML 里声明:
apiVersion: agent.k8s.io/v1 kind: AgentSandbox metadata: name: "sales-lead-sandbox" spec: image: "acme/sales-agent:latest" tools: - name: "enrich_company" endpoint: "http://clearbit-service.default.svc.cluster.local" credentials: - name: "salesforce-api-key" secretRef: "salesforce-creds"K8s 就会为你自动创建一个 Pod,挂载密钥,配置网络,启动 agent。这标志着 agent runtime 正在回归云原生的本质:它不再是一个需要单独学习、单独运维的“新东西”,而是 Kubernetes 这个“云操作系统”的一个标准进程。对于那些已经重度依赖 K8s 的公司(比如字节跳动、Netflix),这意味着他们可以零学习成本地接入 agent 能力,而无需引入 Anthropic 或 AWS 的专有 SDK。
注意:Daytona 和 K8s SIG 的目标,从来不是取代 Anthropic 或 AWS,而是提供一种“主权 runtime”(Sovereign Runtime)的选择。它让你的数据不出集群、你的凭证不离内网、你的 trace 日志不上传云端。这对于金融、医疗等强监管行业,是刚需。这也是为什么 Anthropic 的 Managed Agents,虽然架构优秀,但在这些领域,推广速度远不如 AgentCore 或自建方案——因为合规审查的第一关,就是“你的 runtime 服务商,是否在我们的白名单上?”
4.3 价值迁移:当 runtime 归零,钱流向哪里?
当 runtime 层不可避免地滑向“零价化”(Zero Pricing),整个 AI 工具链的价值重心,必然向上迁移。历史已经给出了清晰的答案:当虚拟化(VMware)归零,价值去了 Terraform(基础设施即代码)和 Kubernetes(容器编排);当容器运行时(Docker)归零,价值去了 Istio(服务网格)和 Argo CD(GitOps)。AI agent 领域,正在上演同样的故事,而且速度更快。目前,有三个方向已经清晰地浮出水面:
第一,Trace Store(追踪存储):成为 agent 世界的“数据库”
一个 agent 的价值,不在于它某一次回答得多漂亮,而在于它长期积累的、可被分析、可被审计、可被复用的交互历史。Braintrust 的 Brainstore,Arize 的 Phoenix,LangChain 的 LangSmith,它们都在争夺同一个位置:agent 世界的 OLAP 数据库。它们提供的,不再是简单的日志查看,而是能让你用 SQL 查询“过去一个月,所有被route_lead工具分发到 Sales Rep A 名下、但 48 小时内未被跟进的线索”,或是用机器学习模型,从百万条 trace 中自动发现“导致 agent 失败的 top 3 模式”。谁能成为这个事实上的标准,谁就能收取“数据税”。因为,当 runtime 可以随时更换(从 Anthropic 换到 AgentCore),但 trace 数据一旦写入,迁移成本极高。这就是“数据锁定”(Data Lock-in)的力量。
第二,Governance & Policy(治理与策略):成为 agent 世界的“防火墙”
随着 agent 渗透到财务、法务、HR 等核心业务,企业采购部门问的第一个问题,不再是“它快不快”,而是“它准不准”、“它安不安全”、“它合不合规”。AWS 的 AgentCore Policy Controls GA,OWASP 发布 Agentic Top 10,都是这个趋势的信号。未来的治理平台,需要能回答这些问题:
- 这个 agent 被允许调用哪些外部 API?(API 白名单)
- 它能否访问包含 PII(个人身份信息)的数据库?(数据分类与脱敏策略)
- 它的每一次决策,是否都附带了可追溯的依据?(决策溯源)
- 当它犯错时,能否自动触发一个合规的审计流程?(事件驱动的合规工作流) 这是一个全新的、尚未被巨头垄断的蓝海。它不卖 compute,它卖的是“确定性”和“可审计性”。
第三,Vertical Agent Marketplaces(垂直 agent 市场):成为 agent 世界的“App Store”
Salesforce 的 Agentforce ARR 达到 8 亿美元,这个数字不是偶然。它证明了企业愿意为一个能解决“销售开发”这个具体问题的 agent 付费,而不是为一个能“运行 agent”的 runtime 付费。市场正在分裂:一边是通用型 runtime(Anthropic, AWS),另一边是垂直型 agent(virattt/ai-hedge-fund 之于金融,vxcontrol/pentagi 之于网络安全)。未来的赢家,将是那些能深入理解一个行业的工作流、术语、法规,并将其编码成 agent 的公司。它们的商业模式,将是 SaaS 订阅(按 seat 或按 transaction),而不是按 token 或 session-hour。因为,当 runtime 归零,客户唯一愿意付钱的,就是那个能帮他“搞定事情”的 agent 本身。
5. 实操心得与避坑指南:一个老炮儿的血泪总结
5.1 最常被忽视的“死亡陷阱”:Session 状态膨胀
我见过太多团队,在 agent 上线初期欢天喜地,几个月后却陷入一场悄无声息的灾难。症状是:agent 响应越来越慢,p95延迟从 2 秒爬升到 15 秒,trace 日志里充满了checkpoint failed: out of memory的错误。排查了整整一周,最后发现罪魁祸首,竟然是session_policy.auto_checkpoint_interval_minutes这个参数。他们把它设为了1,意思是“每分钟自动保存一次当前状态”。这听起来很稳妥,对吧?但问题是,Managed Agents 的 checkpoint,并不是只保存“当前状态”,而是保存从 session 创建以来,所有事件的完整快照。一个活跃的销售 agent,一天可能产生上千条事件(用户输入、模型输出、工具调用、错误日志)。每分钟存一次,一天就是 1440 个快照,每个快照都包含前面所有快照的冗余数据。这就像你每写一个字,就把整篇文档复制一遍存档,硬盘不爆才怪。
我的解决方案:永远不要用auto_checkpoint_interval_minutes做“高频备份”。把它设为0(禁用自动),改为在业务逻辑的关键节点,显式调用checkpoint()。比如,在parse_email成功后,enrich_company成功后,score_lead完成后,各调用一次。这样,checkpoint 的数量和业务步骤严格对齐,既保证了可恢复性,又避免了指数级膨胀。另外,一定要定期调用prune_events(before_timestamp)API,把那些已经完成、且确认无误的早期事件,从 session 的 event log 中物理删除。这能立竿见影地降低内存占用和延迟。
5.2 工具开发的“黄金法则”:Stateless, Idempotent, Fast
在 Managed Agents 的世界里,工具(Tool)不是你代码里的一个函数,而是一个独立的、可被任意 harness 调用的“微服务”。因此,开发工具时,必须遵循三个铁律:
Stateless(无状态):工具代码里,绝对不能有全局变量、静态缓存、或任何跨请求的状态。每次
execute(name, input)调用,都必须是一个全新的、干净的进程。我曾经为了提升enrich_company的速度,在工具里加了一个 Redis 缓存,结果导致在多实例部署时,不同 harness 调用同一个工具,拿到了彼此污染的缓存数据,引发了严重的数据一致性问题。教训是:缓存可以有,但必须是请求粒度的(比如在函数内部用lru_cache),或者用外部的、带 key 的分布式缓存(如 Redis),且 key 必须包含所有输入参数的哈希值。Idempotent(幂等):同一个
execute(name, input)请求,无论调用多少次,结果都必须一致。这对于route_lead这类有副作用的工具尤其重要。想象一下,一个销售线索被route_lead工具创建了两次,CRM 里就出现了两条重复的线索。正确的做法是,route_lead的输入里,必须包含一个lead_id(由parse_email生成),工具在执行前,先查 CRM 是否已存在该lead_id,如果存在,就直接返回成功,不做任何操作。这增加了开发复杂度,但却是生产环境的底线。Fast(快):Managed Agents 对工具的响应时间有严格 SLA。如果
