1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了

你有没有在深夜调试一个跑了三小时的 AI 代理,突然发现它开始胡言乱语?不是模型崩了,不是 prompt 写错了,而是——它的“记忆”被挤掉了。上下文窗口就那么大,工具调用日志、中间结果、用户多轮对话、系统指令……全塞进去,像往一个20升的桶里硬灌35升水。最后溢出的不是水,是逻辑:它忘了自己上一步查了什么数据库,忘了用户明确说“别联系销售”,甚至把两个不同客户的订单号搞混。更糟的是,你没法回溯——没有日志、没有快照、没有时间线,只有最后一段残缺的输出。这种失败不炸裂,但特别贵:重跑要钱,重写要人,客户信任一跌再跌。

这就是 Anthropic 在 2026 年 4 月 8 日发布的 Claude Managed Agents 真正解决的问题。它不是又一个“让 AI 更聪明”的玩具,而是一套为生产环境量身打造的、可审计、可恢复、可隔离的 代理运行时基础设施(Agent Runtime Infrastructure) 。关键词是“运行时”——不是模型,不是工具,不是 prompt 工程,而是让所有这些元素能稳定、安全、可追踪地协同工作的底层土壤。它把过去散落在开发者代码里的状态管理、沙箱调度、凭证分发、会话持久化,全部收束成一套清晰、解耦、由 Anthropic 托管的抽象层。你可以把它理解成给 AI 代理装上了现代操作系统的内核:进程管理、内存隔离、文件系统、事件日志。而 Anthropic 的工程博客里那句“session as durable event log living outside the model context”,就是这个内核最锋利的一把刀——它把代理的“生命史”从易失的、容量有限的模型上下文中,搬进了持久化、可查询、不可篡改的外部事件日志里。这背后不是炫技,是血泪教训换来的架构直觉。我去年亲手搭过一套类似系统,就在第42分钟,一个需要调用7个API、遍历3个知识库的复杂分析任务,因为上下文爆满,悄无声息地丢掉了前20分钟的所有中间结果,最终交出一份逻辑自洽却事实全错的报告。我们花了整整两天才定位到问题根源,又花了一周重写状态层。Anthropic 把这个“救命补丁”,做成了开箱即用的产品。它面向的不是想玩 demo 的爱好者,而是每天要处理上千次客户咨询、生成数百份合规报告、自动执行数万笔交易的 SaaS 公司、金融机构和大型企业技术团队。如果你的 AI 应用已经开始影响核心业务流程,或者你正被“代理不可靠”、“结果难复现”、“审计没依据”这些问题反复折磨,那么 Managed Agents 就不是可选项,而是你技术栈里缺失的那块关键拼图。它不承诺让你的模型更强大,但它能确保你已有的能力,每一次都稳稳落地。

2. 核心设计与思路拆解:为什么是“解耦”,而不是“堆功能”

Anthropic 的 Managed Agents 不是凭空造出来的“新物种”,它的精妙之处,在于对整个 AI 代理技术栈进行了一次精准的“外科手术式”解耦。这背后有一套非常清晰、且经过历史验证的工程哲学: 将变化快的部分与变化慢的部分分离,让每一层都能独立演进,互不绑架。 这正是它敢于类比 1990 年代操作系统虚拟化硬件的根本原因。我们来一层层剥开它的设计内核。

2.1 “Session”作为持久化事件日志:告别上下文囚徒

传统代理开发中,“会话(Session)”这个概念是模糊且脆弱的。它往往只是内存里一个对象,或者数据库里一条记录,其内容高度依赖于模型当前的上下文窗口。一旦窗口满了,开发者要么粗暴截断历史,要么引入复杂的“摘要压缩”逻辑,而这两种方式都会导致信息丢失和推理偏差。Managed Agents 彻底重构了这个概念。在这里,“Session”不再是一个容器,而是一个 时间有序、不可变、可追溯的事件流(Event Stream) 。每一次用户输入、每一次工具调用(包括输入参数和原始返回)、每一次模型生成的思考步骤(Thought)、每一次状态变更,都被序列化为一个结构化的事件,写入一个独立于模型的、高可用的持久化存储。这个设计带来了三个颠覆性好处:

第一, 无损恢复与精确回放 。当代理因网络抖动、模型超时或沙箱崩溃而中断时,它不需要从头开始。系统只需调用 awake(sessionId) ,就能根据事件日志,精准地重建出中断前一刻的完整执行状态,包括所有已知的中间结果和决策路径。这不再是“大概率能继续”,而是“100%确定能继续”。第二, 审计与合规的基石 。对于金融、医疗等强监管行业,你必须能回答:“这个贷款审批结论,是基于哪几次 API 调用的数据?调用时的原始参数是什么?模型当时的思考链路是怎样的?”事件日志提供了完整的、机器可读的证据链,满足 SOC2、HIPAA 等审计要求。第三, 调试与优化的利器 。当一个代理给出错误答案时,你不再需要在千行日志里大海捞针。你可以直接查询该 Session ID 下的所有事件,按时间轴展开,一眼就能看到是哪个工具返回了异常数据,还是模型在某个环节做出了错误的推理跳跃。这将调试效率从“数小时”提升到“数分钟”。

提示:这个设计并非 Anthropic 首创,但它是首个将其作为核心抽象、并由云厂商深度集成的商业产品。其价值在于将一个最佳实践,变成了无需开发者操心的默认行为。

2.2 “Harness”作为无状态执行器:让模型回归“计算单元”本质

在 Managed Agents 架构中,“Harness”是一个极其轻量、纯粹的执行引擎。它的唯一职责,就是接收一个标准化的指令 execute(name, input) -> string ,然后去调度对应的工具容器,并将结果原样返回。它本身 不保存任何状态,不参与任何业务逻辑,不持有任何凭证 。这意味着 Harness 可以被设计得极小、极快、极可靠。它可以像一个无状态的 HTTP 服务一样,被水平无限扩展,也可以在任意节点上瞬间启停,而不会影响业务连续性。这种设计彻底解放了模型。模型不再需要“记住”自己调用了哪些工具、结果是什么、下一步该做什么。它只需要专注于一个任务:根据当前的系统提示(System Prompt)、用户输入(User Input)以及刚刚收到的工具返回结果(Tool Response),生成下一个最合理的动作(Action)或最终答案(Answer)。模型的上下文窗口,终于可以只承载“此刻最相关的信息”,而不是成为整个会话历史的垃圾场。这不仅大幅降低了 token 消耗(官方报告 p50 首字延迟下降约 60%),更重要的是,它让模型的推理过程变得更专注、更可控、更可预测。你可以把 Harness 想象成一个超级高效的快递员,它只负责把包裹(input)送到指定地址(tool),再把签收单(output)带回来,至于包裹里是什么、签收单意味着什么,那是你的业务逻辑和模型的事,它一概不管。

2.3 “Sandbox”作为一次性 cattle:安全与成本的终极平衡

如果说 Session 和 Harness 解决了“状态”和“执行”的问题,那么 Sandbox 就解决了“安全”与“隔离”的问题。Managed Agents 的沙箱不是传统意义上需要手动配置、长期维护的“宠物(Pets)”,而是像牲畜(Cattle)一样,按需创建、用完即焚的标准化实例。每次工具调用,系统都会动态拉起一个全新的、干净的容器环境。这个环境有几点关键特性:首先, 凭证零接触 。你的 API Key、数据库密码等敏感信息,被安全地存放在 Anthropic 的密钥管理服务(Vault)中。沙箱启动时,这些凭证会被注入到沙箱内部,但 绝不会以环境变量的形式暴露给运行在其中的代理代码 。代理代码只能通过一个受控的、经过严格审查的 SDK 接口去请求凭证,而这个接口本身会记录每一次凭证使用行为。这就从根本上杜绝了“代理代码被诱导,主动打印出自己的环境变量”这类低级但致命的安全事故。其次, 资源硬隔离 。每个沙箱都有独立的 CPU、内存和文件系统配额,一个沙箱的崩溃或资源耗尽,绝对不会波及同一批次的其他沙箱。最后, 生命周期极短 。一个沙箱的平均存活时间可能只有几秒到几十秒,完成一次工具调用后即被销毁。这种“用完即焚”的模式,极大地缩小了攻击面,也避免了因沙箱长期运行而积累的内存泄漏、文件句柄泄露等运维噩梦。它让安全不再是事后补救的负担,而是从架构设计之初就内建的基因。

3. 核心细节解析与实操要点:YAML 定义、定价模型与真实场景

Managed Agents 的核心魅力,在于它把复杂的分布式系统工程,封装成了一份简洁、声明式的 YAML 文件。但这份简洁的背后,是大量需要开发者深刻理解的细节和权衡。我们来深入看看,一个生产级的 Agent 是如何被定义、部署和计费的。

3.1 Agent 定义:从自然语言到 YAML,你的“代理宪法”

Anthropic 提供了两种定义 Agent 的方式:一种是更友好的“自然语言描述”,另一种是更精确、更可控的“YAML 配置”。对于生产环境,我强烈推荐直接使用 YAML。它就像一份“代理宪法”,明确规定了这个 AI 实体的权限、能力、边界和行为准则。一个典型的 YAML 文件包含以下几个核心区块:

# agent.yaml
name: "Sales-Deal-Analyzer"
description: "An agent that analyzes sales opportunities from CRM data and generates executive summaries."

# 系统指令:这是 Agent 的“灵魂”和“底线”
system_prompt: |
  You are a senior sales operations analyst at Acme Corp.
  Your goal is to analyze sales opportunities and generate concise, actionable summaries for executives.
  You MUST ONLY use the tools provided below. NEVER fabricate data or make assumptions about CRM fields you haven't retrieved.
  If a tool call fails, report the error clearly to the user. Do not retry automatically.

# 工具集:这是 Agent 的“手脚”,定义了它能做什么
tools:
  - name: "get_opportunity_by_id"
    description: "Fetches all details for a specific sales opportunity by its unique ID."
    input_schema:
      type: "object"
      properties:
        opportunity_id:
          type: "string"
          description: "The unique identifier of the opportunity in Salesforce."

  - name: "get_account_revenue_history"
    description: "Retrieves the last 12 months of revenue history for the account associated with an opportunity."
    input_schema:
      type: "object"
      properties:
        account_id:
          type: "string"

# 安全围栏(Guardrails):这是 Agent 的“法律”,定义了它不能做什么
guardrails:
  # 内容安全:防止生成有害、违法、歧视性内容
  content_safety:
    enabled: true
    policies:
      - "hate_speech"
      - "violence"
      - "sexual_content"

  # 数据访问控制:防止越权访问敏感数据
  data_access:
    enabled: true
    allowed_sources:
      - "salesforce-prod"
      - "finance-warehouse"
    denied_patterns:
      - ".*_pii.*" # 禁止访问任何包含 'pii' 字样的数据表

# 运行时配置:这是 Agent 的“工作环境”
runtime_config:
  max_session_duration_hours: 8
  max_tool_calls_per_session: 50
  timeout_seconds: 120

这份 YAML 的每一个字段,都对应着一个关键的工程决策。 system_prompt 不仅是引导词,更是 Agent 行为的法律底线,它必须足够清晰,以防止模型在模糊地带“自由发挥”。 tools input_schema 是重中之重,它强制要求你为每个工具的输入参数定义严格的 JSON Schema。这不仅是给模型看的,更是给 Anthropic 的运行时引擎看的——引擎会用这个 Schema 去校验模型生成的工具调用参数是否合法,从而在执行前就拦截掉大量因格式错误导致的失败。 guardrails 则体现了 Anthropic 对企业级安全的深刻理解。 content_safety 是基础,而 data_access 控制则直击企业痛点:它允许你精细地定义 Agent 只能访问哪些数据源,甚至可以用正则表达式禁止访问特定模式的敏感表。这比在应用层写一堆 if-else 条件判断要健壮得多。

注意:在实际项目中,我见过太多团队把 system_prompt 写得像一篇散文,充满了模糊的形容词(“请尽量专业”、“务必友好”)。这在 Managed Agents 里是灾难性的。你应该把它写成一份精确的、可执行的、不含歧义的操作手册。例如,把“请尽量专业”替换成“所有输出必须使用被动语态,避免第一人称,引用数据时必须标注来源字段名”。

3.2 定价模型:$0.08/小时背后的成本心算

Anthropic 的定价策略非常透明,但也非常“云原生”: $0.08 每 session-hour 的活跃运行时费用,外加标准的 Claude token 费用 。这个“session-hour”是关键,它指的是 Agent 实例处于“活跃等待”或“正在执行”状态的总时长,而不是你发起请求的次数。这背后有一套精妙的成本模型。

首先,你需要理解什么是“活跃”。一个 Session 从你第一次调用 start_session() 开始计时。只要它没有被显式关闭( end_session() ),或者没有因为 max_session_duration_hours 超时而自动终止,它就一直在计费。即使在这8小时内,Agent 大部分时间都在“等待”用户输入,它依然在消耗资源——它需要维持一个连接、保留在内存中的最小状态、以及随时响应的能力。因此, Session 的生命周期管理,是控制成本的第一道闸门 。一个设计良好的 Agent,应该具备“智能休眠”能力。例如,当它完成一个复杂分析并给出最终报告后,不应该傻等着用户下一条指令,而是应该主动询问:“是否需要我为您生成 PPT 汇报稿?或者,我可以结束本次会话。” 这样,用户明确选择“结束”,Session 就立刻终止,计费停止。

其次, max_tool_calls_per_session 是第二道闸门。工具调用是昂贵的,因为它触发了沙箱的创建、网络通信、外部 API 调用。一个低效的 Agent 可能会因为 prompt 设计不佳,反复调用同一个工具来“确认”数据,或者因为逻辑缺陷,陷入无限循环。在 YAML 中设置一个合理的上限,既是成本控制,也是一种安全熔断机制。当达到上限时,Session 会优雅地失败,并返回一个清晰的错误信息,而不是让用户无休止地等待。

最后,token 费用依然是大头。Managed Agents 并没有降低模型本身的成本,它只是让模型的使用更高效。一个能用 1000 个 token 完成的任务,和一个需要 5000 个 token 才能完成的任务,后者在 token 费用上就是前者的五倍。因此, 优化 prompt、精简工具返回的数据、利用模型的 streaming 能力只返回必要信息,这些传统的 LLM 工程技巧,在 Managed Agents 时代不仅没有过时,反而变得更加重要 。因为 runtime 成本是线性的、可预测的,而 token 成本是指数级增长的、难以预估的。

3.3 真实场景拆解:Notion、Rakuten 与 Sentry 的启示

Anthropic 的新闻稿里提到的 Notion、Rakuten 和 Sentry,并非随意挑选的案例,它们代表了 Managed Agents 在不同维度上的成功范式。

Notion 的场景是“工作流嵌入” 。他们没有把 Claude 当作一个独立的聊天机器人,而是将其深度集成到 Notion 的页面、数据库和模板中。当你在一个销售线索数据库里点击“生成跟进邮件”按钮时,背后不是一个简单的 API 调用,而是一个完整的 Managed Agent Session。这个 Session 会:1)从当前数据库行中提取客户名称、公司规模、上次沟通日期;2)调用 Notion 的内部 API 获取该客户的完整历史记录;3)调用一个邮件模板生成工具,结合所有信息生成个性化草稿;4)将草稿直接插入到当前页面的指定位置。整个过程对用户是原子的、无缝的。Managed Agents 的价值在于,它让 Notion 的工程师不必再去维护一套复杂的、容易出错的状态同步逻辑,也不必担心用户在编辑过程中刷新页面导致状态丢失——因为 Session 是持久化的,状态在云端。

Rakuten 的场景是“多渠道代理路由” 。他们构建了销售、营销、财务三套垂直 Agent,但这些 Agent 并非孤立存在。一个销售 Agent 在处理一个大客户时,如果发现客户有复杂的跨境支付需求,它会自动将一个子任务(“查询该客户在东南亚市场的付款成功率”)路由给财务 Agent。这个跨 Agent 的协作,是通过 Managed Agents 的 awake(sessionId) 机制实现的。销售 Agent 创建一个子 Session,将必要的上下文(客户ID、问题描述)作为事件写入日志,然后唤醒财务 Agent 的 Harness。财务 Agent 完成后,将结果写入同一个父 Session 的日志流中。整个过程,对最终用户(销售代表)来说,只是一个连贯的、跨部门的智能响应。这展示了 Managed Agents 如何支撑起真正复杂的、企业级的 AI 工作流编排。

Sentry 的场景是“闭环自动化” 。这是一个将 AI 能力直接注入到软件开发生命周期(SDLC)中的典范。当 Sentry 的监控系统捕获到一个高优先级的线上错误时,它会自动触发一个 Managed Agent Session。这个 Session 的流程是:1)调用 Sentry API 获取错误堆栈、受影响的服务、最近的代码提交;2)调用 GitHub API 获取相关代码文件;3)调用 Claude Code 模型,分析错误原因并生成修复补丁(Patch);4)调用 GitHub API,自动创建一个 Pull Request,附带详细的错误分析和修复说明。整个过程,从发现问题到提出解决方案,可以在几分钟内完成。Managed Agents 的沙箱隔离和凭证安全,是这个场景得以成立的前提——你绝不能让一个分析错误的 AI,拥有直接向生产仓库推送代码的权限。它所有的操作,都必须通过受控的、可审计的、带权限边界的工具调用来完成。

4. 实操过程与核心环节实现:从零部署一个客服质检 Agent

理论讲得再多,不如亲手部署一个。下面,我将以一个真实的、已在某电商客户上线的“客服对话质检 Agent”为例,手把手带你走完从定义、测试到上线的全流程。这个 Agent 的目标是:自动分析客服与客户的通话录音转录文本,识别出服务规范性问题(如未使用标准问候语、未确认客户身份、承诺了无法兑现的服务)、情绪风险点(如客户多次表达不满、客服语气生硬),并生成一份结构化的质检报告。

4.1 步骤一:定义 Agent 的 YAML 配置

我们先创建 customer_service_qa.yaml 。这个配置文件是整个项目的起点,也是后续所有工作的蓝图。

name: "Customer-Service-QA-Agent"
description: "Analyzes customer service call transcripts for compliance and sentiment issues."

system_prompt: |
  You are a quality assurance specialist for Acme E-commerce's customer service team.
  Your task is to analyze a single customer service call transcript and produce a structured QA report.
  You MUST follow this exact output format:
  {
    "compliance_issues": [
      {"type": "MISSING_GREETING", "severity": "HIGH", "evidence": "The agent did not use the standard greeting 'Hello, thank you for calling Acme E-commerce.'"},
      {"type": "UNVERIFIED_IDENTITY", "severity": "MEDIUM", "evidence": "The agent asked for the customer's name but did not verify it against the account."}
    ],
    "sentiment_risks": [
      {"type": "CUSTOMER_FRUSTRATION", "severity": "HIGH", "evidence": "Customer said 'I've been on hold for 20 minutes!' at 00:15:22."},
      {"type": "AGENT_TONE", "severity": "LOW", "evidence": "Agent used the phrase 'Look, just give me the order number' at 00:08:10."}
    ],
    "overall_score": 85,
    "summary": "Good overall interaction, but missed key compliance steps and showed minor tone issues."
  }
  DO NOT add any other text before or after the JSON object. DO NOT explain your reasoning.

tools:
  - name: "analyze_transcript_compliance"
    description: "Performs deep NLP analysis on a transcript to identify compliance violations against company policy."
    input_schema:
      type: "object"
      properties:
        transcript_text:
          type: "string"
          description: "The full text of the customer service call transcript."

  - name: "analyze_transcript_sentiment"
    description: "Analyzes the emotional tone of both the customer and the agent throughout the transcript."
    input_schema:
      type: "object"
      properties:
        transcript_text:
          type: "string"
          description: "The full text of the customer service call transcript."

guardrails:
  content_safety:
    enabled: true
    policies:
      - "hate_speech"
      - "harassment"
  data_access:
    enabled: true
    allowed_sources:
      - "call-transcripts-raw"
      - "policy-docs-v3"

runtime_config:
  max_session_duration_hours: 1
  max_tool_calls_per_session: 5
  timeout_seconds: 90

这个 YAML 的关键点在于 system_prompt 的强制 JSON 输出格式。这确保了下游系统(比如一个 BI 工具)可以稳定地解析结果,而不会被模型的“自由发挥”所干扰。 tools 的命名也刻意区分了“合规性”和“情绪”两个分析维度,这符合我们对质检业务的理解:它们是两个正交的、需要独立评估的指标。

4.2 步骤二:本地沙箱测试与迭代

在将 Agent 部署到 Anthropic 的托管环境之前,我们必须进行充分的本地测试。Anthropic 提供了一个 CLI 工具 claude-agent-cli ,可以让我们在本地模拟整个 Managed Agents 的运行时。

  1. 安装与初始化

    pip install claude-agent-cli
    claude-agent-cli login --api-key YOUR_CLAUDE_API_KEY
    
  2. 启动本地 Harness

    claude-agent-cli run --config customer_service_qa.yaml --local
    

    这条命令会启动一个本地的、无状态的 Harness,它会监听一个端口(如 http://localhost:8080 ),并准备好接收 execute 请求。

  3. 编写测试脚本 : 我们创建一个 test_qa.py 脚本,模拟一次质检任务:

    import requests
    import json
    
    # 模拟一段真实的客服对话转录文本
    test_transcript = """
    [00:00:00] Agent: Hi there, how can I help?
    [00:00:05] Customer: I need to change the shipping address for my order #12345.
    [00:00:12] Agent: Sure, let me pull that up. What's your phone number?
    [00:00:18] Customer: It's 555-123-4567.
    [00:00:25] Agent: Got it. I see your order. The new address will be processed.
    [00:00:30] Customer: Thanks! Also, can you confirm it'll ship today?
    [00:00:35] Agent: Yes, absolutely. It ships today.
    [00:00:40] Customer: Perfect, thanks!
    """
    
    # 向本地 Harness 发送合规性分析请求
    response = requests.post(
        "http://localhost:8080/execute",
        json={
            "name": "analyze_transcript_compliance",
            "input": {"transcript_text": test_transcript}
        }
    )
    print("Compliance Analysis Result:", response.json())
    
    # 向本地 Harness 发送情绪分析请求
    response = requests.post(
        "http://localhost:8080/execute",
        json={
            "name": "analyze_transcript_sentiment",
            "input": {"transcript_text": test_transcript}
        }
    )
    print("Sentiment Analysis Result:", response.json())
    
  4. 观察与迭代 :运行这个脚本,你会看到两个工具返回的原始 JSON 结果。此时,你的工作不是看结果对不对,而是看 模型是否能正确地、稳定地调用这两个工具 。如果模型总是漏掉一个调用,或者参数传错,那问题一定出在 system_prompt input_schema 上。你需要反复调整,直到模型的调用行为变得 100% 可预测。这个过程可能枯燥,但它是保证生产环境稳定性的基石。我曾经在一个项目中,花了整整三天时间,只为让模型能稳定地调用一个带有复杂嵌套数组参数的工具。这三天的投入,换来的是上线后三个月零一次因调用失败导致的质检中断。

4.3 步骤三:部署到 Anthropic 托管环境

当本地测试完全通过后,就可以一键部署了。

# 将 YAML 文件注册到 Anthropic 的托管服务
claude-agent-cli deploy --config customer_service_qa.yaml --name "cs-qa-prod"

# 部署成功后,会返回一个唯一的 Agent ID,例如: "agent_abc123"
# 你可以用这个 ID 来启动一个新会话
session_response = requests.post(
    "https://api.anthropic.com/v1/agents/sessions",
    headers={"x-api-key": "YOUR_CLAUDE_API_KEY"},
    json={"agent_id": "agent_abc123"}
)
session_id = session_response.json()["session_id"]

# 现在,你可以向这个 Session 发送用户消息(即转录文本)
message_response = requests.post(
    f"https://api.anthropic.com/v1/agents/sessions/{session_id}/messages",
    headers={"x-api-key": "YOUR_CLAUDE_API_KEY"},
    json={"content": test_transcript}
)

# 获取最终的质检报告
final_report = message_response.json()["content"]
print("Final QA Report:", final_report)

整个部署过程,从 deploy 命令到获得可用的 session_id ,通常在 30 秒内完成。你不需要管理任何服务器、容器或负载均衡器。Anthropic 的平台会自动为你处理所有的扩缩容、健康检查和故障转移。你唯一需要关心的,就是你的 YAML 配置和你的业务逻辑。

4.4 步骤四:接入生产流水线与成本监控

最后一步,是将这个 Agent 无缝接入到你的现有系统中。对于客服质检场景,我们通常会将其接入到一个 Kafka 消息队列中。每当一个新的通话转录文本被写入 transcripts-raw Topic 时,一个消费者服务就会触发上面的 start_session 流程,并将最终的 final_report 写入 qa-reports Topic,供下游的 BI 系统和告警系统消费。

同时,你必须建立成本监控。Anthropic 的 API 会返回详细的用量元数据。你应该在你的监控系统(如 Prometheus + Grafana)中,创建一个仪表盘,实时追踪以下指标:

  • managed_agent_session_active_hours_total :当前活跃的 Session 总时长。
  • managed_agent_tool_call_count_total :每分钟的工具调用次数。
  • claude_token_usage_total :每分钟的输入/输出 token 消耗。

通过设置告警规则,例如“当 tool_call_count_total 在 5 分钟内突增 300%,且 session_active_hours_total 持续高于 10 小时”,你就能第一时间发现可能是某个 Agent 出现了逻辑缺陷,陷入了无限循环调用。这种主动的、基于指标的运维,是 Managed Agents 赋予开发者的全新能力。

5. 常见问题与排查技巧实录:那些文档里不会写的坑

再完美的架构,也会在真实世界的泥潭里遇到各种意想不到的状况。以下是我在多个客户项目中踩过的坑,以及总结出的独家排查技巧。这些经验,比任何官方文档都来得实在。

5.1 问题一:Session “假死”——明明没超时,却不再响应

现象 :一个 Session 启动后,你发送了用户消息,但迟迟收不到回复。 session_active_hours_total 指标显示它仍在计费,但 tool_call_count_total 却是 0。它既没有返回结果,也没有报错,就像卡在了某个地方。

排查思路与技巧

  1. 第一步,查事件日志 :不要慌着重启。立即调用 Anthropic 的日志查询 API: GET /v1/agents/sessions/{session_id}/events 。查看最后几条事件。如果最后一条是 user_message_received ,而后面没有任何 tool_call_initiated model_thinking 事件,那问题就出在模型本身——它可能被一个过于宽泛或矛盾的 system_prompt 给“困住”了,正在无限地“思考”下一步该做什么。
  2. 第二步,检查 system_prompt 的“指令冲突” :这是最常见的原因。例如,你的 prompt 里写了“请用中文回答”,又写了“所有输出必须是 JSON 格式”。对于某些模型版本,这两条指令会产生冲突,因为它不知道 JSON 是否算作“中文”。解决方案是, 永远把格式要求放在最前面,并用最绝对的语气 。改成:“你必须只输出一个严格符合以下 JSON Schema 的对象,除此之外,不得输出任何其他字符、空格或换行符。”
  3. 第三步,启用 debug_mode :在部署时,可以添加一个 debug_mode: true 的 flag。这会让 Anthropic 在返回结果时,附带一个 debug_trace 字段,里面包含了模型内部的思考链(Chain-of-Thought)的简化版。虽然不是完整的推理过程,但足以帮你判断模型是卡在了哪一步。

实操心得:我有一个“黄金法则”:任何 system_prompt ,在正式上线前,必须用至少 5 个完全不同的、有代表性的输入样本进行测试。这 5 个样本必须覆盖“理想情况”、“边界情况”、“错误输入”、“模糊输入”和“恶意输入”。只有这 5 个样本都稳定通过,这个 prompt 才能进入生产环境。

5.2 问题二:工具调用“参数漂移”——模型总把参数传错

现象 :你的工具 get_customer_by_phone 明明要求一个 phone_number 字符串,但模型有时会传一个 {"phone": "555-123-4567"} 的对象,有时会传一个 ["555-123-4567"] 的数组,甚至有时会传一个 5551234567 的数字。 input_schema 明明写得很清楚,但它就是不遵守。

排查思路与技巧

  1. Schema 必须“穷举”所有可能性 input_schema 不是给开发者看的,是给模型的“语法检查器”看的。你不能只写 type: "string" ,而要写:
    input_schema:
      type: "object"
      properties:
        phone_number:
          type: ["string", "number"] # 允许字符串和数字
          pattern: "^\\+?[0-9\\-\\s]{7,15}$" # 加上正则,强制格式
      required: ["phone_number"]
    
    这个 pattern 是关键。它告诉模型,无论你传进来的是什么类型,最终的值必须匹配这个正则。模型会自动尝试将输入转换为符合正则的字符串。
  2. system_prompt 中“双重强调” :在 prompt 里,除了写“请调用 get_customer_by_phone 工具”,还要加上一句:“调用此工具时, phone_number 参数必须是一个符合国际标准的、带国家代码的纯数字字符串,例如 +15551234567 。请务必在调用前,将用户提供的任何电话号码格式,都标准化为此格式。”
  3. 利用 guardrails data_access 进行兜底 :如果以上都失败了, data_access denied_patterns 可以作为最后一道防线。你可以设置 denied_patterns: ["^\\d{10}$"] ,禁止传入 10 位纯数字(这是北美常见的错误格式),强制模型必须带上 +1 前缀。

5.3 问题三:沙箱“冷启动延迟”——首次调用慢得离谱

现象 :一个 Session 启动后,第一次调用某个工具时,延迟高达 5-8 秒。后续调用就恢复正常(<200ms)。这对于需要快速响应的客服场景是不可接受的。

排查思路与技巧

  1. 这不是 Bug,是 Feature :这是沙箱“按需创建”机制的必然结果。第一次调用时,系统需要拉起容器、加载镜像、建立网络连接。这是无法避免的。
  2. 解决方案是“预热” :在你的应用服务启动时,或者在每天业务高峰前,主动发起一次“空调用”。例如,创建一个专门用于预热的、极简的工具 warmup_tool ,它什么都不做,只是返回一个 "ok" 。在你的服务启动脚本里,循环调用这个工具 5-10 次。这样,当真实流量到来时,沙箱池里已经有了一批“热”的实例在待命。
  3. 利用 runtime_config min_instances :Anthropic 的高级版支持一个 min_instances 参数,你可以设置 min_instances: 3 ,表示系统会始终维持至少 3 个沙箱实例处于就绪状态。这会增加一点固定成本,但能换来极致的响应速度。对于 SLA 要求极高的场景,这笔钱花得值。

5.4 问题四:事件日志“信息过载”——审计时找不到重点

现象 :一个复杂的 Session 可能产生上百

更多推荐