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) 。每一次用户输入、每一次工具调用、每一次模型推理、每一次错误发生,都被序列化为一个结构化的事件(Event),并打上精确的时间戳和唯一 ID,然后持久化到 Anthropic 托管的、高可用的存储后端。这个事件日志是“外部”的,完全独立于任何一次具体的模型调用。这意味着:

  • 崩溃恢复成为常态 :如果某个 Harness (后面会讲)在执行过程中意外退出,系统可以立刻通过 awake(sessionId) API 调用,从事件日志的最后一个已知稳定点重新加载状态,并继续执行。整个过程对用户透明,就像操作系统进程被杀死后,你双击图标它又回来了。
  • 审计与调试成为可能 :当一个代理产出错误结果时,你不再需要对着一团乱麻的 prompt 和日志抓耳挠腮。你可以直接查询该 Session ID 下的所有事件,按时间线还原每一步发生了什么、调用了哪个工具、传入了什么参数、返回了什么结果。这不再是“猜”,而是“看”。
  • 上下文窗口回归本职 :模型的上下文窗口终于可以专注于它最擅长的事——进行高质量的、短时程的推理。它不再需要背负起“长期记忆”和“状态管理”的沉重包袱。这不仅提升了单次响应的质量,也大幅降低了 token 消耗,因为再也不用把冗长的历史日志一遍遍塞进 prompt 里。

这个设计的灵感,直接来源于分布式系统中的“事件溯源(Event Sourcing)”模式。它牺牲了一点点写入的即时性(需要额外的网络请求来记录事件),但换来了无与伦比的读取灵活性、系统健壮性和可观察性。这是一种典型的“以空间换时间、以写入换读取”的成熟工程权衡。

2.2 “Harness”作为无状态执行器:计算资源的“ cattle 化”

如果说 Session 是代理的“大脑记忆”,那么 Harness 就是它的“肌肉躯干”。在 Managed Agents 架构中,Harness 被明确定义为一个 完全无状态(Stateless)的执行单元 。它不保存任何会话数据,不维护任何内部变量,它的唯一职责就是接收一个标准化的指令 execute(name, input) -> string ,然后去调用指定的工具或服务,并将结果原样返回。这个设计带来了几个关键优势:

  • 极致的弹性与伸缩性 :因为 Harness 本身不携带状态,所以它可以被瞬间创建、销毁、替换。当流量高峰到来时,Anthropic 可以毫秒级地拉起成百上千个全新的 Harness 实例;当流量回落,又能立刻释放掉所有闲置实例。这彻底摆脱了传统有状态服务需要“预热”、“优雅下线”等复杂生命周期管理的束缚。
  • 故障隔离与快速恢复 :一个 Harness 崩溃了?没关系。系统会立刻用一个新的、干净的 Harness 实例来接管后续工作。由于所有状态都存放在外部的 Session 日志里,新实例只需要读取日志就能无缝续上。这就像汽车的一个气缸坏了,你不需要修整台发动机,只需换一个气缸,车就能继续跑。
  • 简化开发与部署 :对于开发者而言,你只需要关注如何编写一个符合 execute(name, input) 接口的工具函数。它是一个纯粹的、幂等的、无副作用的函数。你不需要操心这个函数会在哪台机器上运行,也不需要担心它运行完后状态怎么保存。这极大地降低了构建和集成新工具的门槛。

这个理念,正是云计算时代“Cattle, not Pets”(把服务器当牲畜,而不是当宠物)思想的完美体现。Harness 就是那些被批量饲养、随时可替换的“牛”,它们的价值在于集群的整体吞吐和可靠性,而不在于某一个体的独特性。

2.3 “Sandbox”作为隔离执行环境:安全边界的物理化

AI 代理最大的安全隐患之一,就是它拥有“行动力”。它不仅能“说”,还能“做”——调用 API、读写数据库、发送邮件、甚至执行 shell 命令。如果这个“行动力”没有被严格约束,后果不堪设想。Managed Agents 通过“Sandbox”(沙箱)机制,为每一次工具调用构建了一个物理层面的隔离边界。这个沙箱不是简单的 Docker 容器,而是一个更轻量、启动更快、资源占用更少的隔离环境(具体实现细节 Anthropic 未完全公开,但业界普遍认为是基于 WebAssembly 或轻量级虚拟机技术)。其核心安全原则是:

  • 凭证永不暴露 :这是最致命的一环。在传统方案中,开发者常常会把 API Key 等敏感凭证作为环境变量注入到容器里,然后让代理代码去读取。这等于把一把万能钥匙挂在了门把手上。Managed Agents 的做法是:在沙箱被创建的那一刻,Anthropic 的凭证管理系统(Vault)会将所需的、最小权限的凭证, 直接注入到沙箱的内核空间或安全执行上下文里 ,代理代码本身永远无法通过任何方式( process.env , os.getenv() 等)读取到这些字符串。它只能发出一个受控的、带签名的调用请求,由沙箱底层的安全代理(Security Proxy)来完成实际的凭证绑定和网络请求。
  • 资源硬隔离 :每个沙箱都有独立的 CPU 时间片、内存配额和文件系统挂载点。一个沙箱里的程序崩溃、内存泄漏或无限循环,绝不会影响到其他沙箱,更不会拖垮整个主机。
  • 网络白名单 :沙箱默认是网络隔离的。它只能访问预先在 YAML 配置中声明的、经过严格审核的外部服务端点(如 notion.com/api/v1/ , asana.com/graphql )。任何未经许可的出站连接都会被防火墙直接拦截。

这套组合拳,把过去靠“程序员自觉”和“代码审查”来保障的安全,升级为由基础设施强制执行的、物理层面的硬隔离。它不是“希望”代理不作恶,而是让它“根本没机会”作恶。

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

Managed Agents 的核心价值,最终要落到开发者每天打交道的配置文件、账单和业务场景上。脱离了这些细节的架构讨论,都是空中楼阁。下面我们就深入到最接地气的层面,看看它到底怎么用、怎么算、以及在真实世界里如何发光发热。

3.1 用 YAML 定义你的“数字员工”:从抽象到具象

Anthropic 提供了两种方式来定义一个 Agent:一种是自然语言描述(适合快速原型),另一种是结构化的 YAML 文件(适合生产环境)。后者才是我们重点关注的对象,因为它承载了所有关键的、可版本控制的、可审计的配置。一个典型的 agent.yaml 文件结构如下:

# agent.yaml
name: "Sales-Dev-Researcher"
description: "An agent that researches potential leads and drafts personalized outreach emails."

# 系统提示词,定义角色、目标、行为准则
system_prompt: |
  You are a senior sales development representative at Acme Corp.
  Your goal is to identify high-potential leads from Crunchbase data and draft a concise,
  value-driven email for the sales team to send.

# 定义该 Agent 可以使用的工具列表
tools:
  - name: "crunchbase_search"
    description: "Search Crunchbase for companies matching specific criteria (industry, size, funding)."
    # 工具的输入 Schema,用于模型理解如何调用
    input_schema:
      type: "object"
      properties:
        industry:
          type: "string"
          description: "The target industry, e.g., 'FinTech', 'Healthcare'."
        employee_count:
          type: "string"
          description: "The approximate number of employees, e.g., '51-200'."
    # 该工具调用时,将使用哪个沙箱环境
    sandbox: "crunchbase-sandbox"

  - name: "email_generator"
    description: "Generates a personalized, professional email based on lead info and company context."
    input_schema:
      type: "object"
      properties:
        company_name:
          type: "string"
        key_executive:
          type: "string"
        value_proposition:
          type: "string"
    sandbox: "email-sandbox"

# 定义沙箱环境,每个环境对应一个隔离的执行域
sandboxes:
  - name: "crunchbase-sandbox"
    # 指定该沙箱允许访问的网络端点(白名单)
    network_policy:
      allow:
        - "https://data.crunchbase.com/api/v4"
    # 指定该沙箱可以使用的凭证(由 Anthropic Vault 提供)
    credentials:
      - "crunchbase_api_key"

  - name: "email-sandbox"
    network_policy:
      allow:
        - "https://api.sendgrid.com/v3"
    credentials:
      - "sendgrid_api_key"

# 定义运行时的“护栏”(Guardrails),防止越界行为
guardrails:
  # 内容安全策略:禁止生成包含特定关键词的文本
  content_filter:
    deny_list:
      - "confidential"
      - "internal_only"
      - "password"
  # 行为限制:禁止在单次会话中调用同一工具超过5次
  rate_limiting:
    - tool: "crunchbase_search"
      max_calls_per_session: 5

这个 YAML 文件,就是你 Agent 的“宪法”。它清晰地定义了:

  • 你是谁( system_prompt :角色、目标、语气。
  • 你能做什么( tools :每一个工具的功能、输入格式、以及它将在哪个沙箱里运行。
  • 你在哪里做事( sandboxes :每个沙箱的网络权限、凭证授权,实现了严格的“最小权限原则”。
  • 你不能做什么( guardrails :内容过滤、调用频率限制等,构成了安全与合规的最后防线。

提示:YAML 中的 sandbox 名称必须与 sandboxes 列表中的定义完全一致。这是一个常见的配置错误点,会导致工具调用失败。建议在 CI/CD 流程中加入 YAML Schema 校验步骤。

3.2 定价模型:消费即服务,但需精打细算

Managed Agents 的定价模式非常“云原生”: 按实际消耗的“活跃会话时长”计费 。具体来说,是 $0.08 每 session-hour 。这里的“session-hour”指的是一个会话(Session)处于“活跃”(Active)状态的总时长。一个会话何时算“活跃”?官方文档的定义是: 从会话创建开始,到会话进入“空闲”(Idle)状态超过 5 分钟为止。 也就是说,如果你的 Agent 处理一个用户请求,从开始到结束只用了 3 秒,那么你只支付 3/3600 ≈ $0.000067 。但如果你的 Agent 是一个需要长时间等待用户反馈的“协作者”(比如一个帮你规划一周行程的助手),它可能会在一个会话里持续存在数小时,这时费用就会累积。

这个模型的优势在于极致的公平性——你只为真正消耗的计算资源付费。但它的陷阱在于, “空闲”时间的定义很容易被忽视。 例如,一个客服 Agent 在用户提问后,需要调用 3 个内部 API 来查询订单、库存和物流信息。如果这三个调用之间有串行依赖(必须等第一个返回后再发起第二个),那么在等待第一个 API 返回的 2 秒里,会话是“活跃”的;在等待第二个返回的 1.5 秒里,会话依然是“活跃”的。这 3.5 秒的等待时间,全部计入你的账单。

注意:为了优化成本,强烈建议在设计 Agent 流程时,尽可能将可以并行的工具调用(如同时查询多个数据源)合并为一个并行任务。Anthropic 的 Harness 支持并发执行,这能显著缩短总的“活跃”时长。一个串行调用耗时 6 秒的流程,如果能并行,可能只需 2.5 秒,成本直接降低 3 倍以上。

此外,这个 $0.08/session-hour 叠加在标准 Claude 模型 token 费用之上的 。你需要为输入的 prompt token、模型生成的 output token,以及所有工具调用返回的 JSON 结构体 token,分别付费。因此,一个经济高效的 Agent,不仅要考虑运行时,还要考虑“沟通效率”——用最精炼的 prompt 让模型一次就把事情做对,避免因理解偏差导致的反复调用和 token 浪费。

3.3 真实世界的应用图谱:Notion、Rakuten 与 Sentry 的启示

理论再好,也要看它在真实战场上的表现。Anthropic 在发布时点名的几家早期采用者,为我们提供了绝佳的实践样本。

  • Notion :他们将 Managed Agents 深度集成到 Notion Workspace 中,让团队可以直接在文档里“委托”任务给 Claude。例如,一个产品经理在产品需求文档(PRD)里选中一段文字,右键选择“让 Claude 总结这个功能的潜在风险”,Agent 就会自动调用 Notion API 读取该文档片段,再调用 Claude 模型进行分析,并将结果以评论形式插入原文档。这里的关键在于,Agent 的整个生命周期(读取、分析、写入)都发生在 Notion 的安全边界内,用户的文档内容从未离开过 Notion 的服务器,而 Agent 的“行动力”(写入评论)则由 Anthropic 的沙箱和凭证系统严格管控。这解决了企业级 SaaS 最核心的“数据主权”焦虑。

  • Rakuten :这家日本电商巨头构建了覆盖销售、市场、财务三大职能的 Agent 矩阵,并统一通过 Slack 和 Teams 进行接入。一个销售 Agent 可以实时监控 CRM 中的新线索,自动触发电话脚本生成;一个市场 Agent 可以分析社交媒体舆情,自动生成下周的广告投放建议;一个财务 Agent 则能对接 ERP 系统,自动完成月度费用报销的初审。Rakuten 的案例揭示了 Managed Agents 的另一个巨大价值: 统一的治理入口 。所有这些跨部门、跨系统的 Agent,都遵循同一套 YAML 配置规范、同一套沙箱安全策略、同一套事件日志标准。IT 部门无需为每个部门的 Agent 单独搭建运维体系,只需在 Anthropic 的控制台里,就能看到所有 Agent 的健康状况、调用量、错误率和审计日志。

  • Sentry :这个著名的错误监控平台,将其核心的“调试”能力与 Claude 的“修复”能力进行了强耦合。当 Sentry 检测到一个线上应用的严重错误(Crash)时,它会自动触发一个 Managed Agent。该 Agent 首先调用 Sentry 的 API 获取完整的错误堆栈、源码上下文和用户行为轨迹;然后,它将这些信息喂给 Claude 模型,要求其分析根因并生成一个修复补丁(Patch);最后,Agent 调用 GitHub API,自动创建一个 Pull Request(PR),并将分析报告作为 PR 描述。整个过程,从发现问题到提出解决方案,全程自动化,且每一步都有迹可循。这已经不是“辅助编程”,而是“自主运维”的雏形。

这三个案例共同指向一个结论:Managed Agents 的最大价值,不在于它让单个任务变得更快,而在于它让 跨系统、跨职能、跨组织的自动化协作 ,第一次具备了企业级的可靠性、安全性和可管理性。

4. 实操过程与核心环节实现:从零部署一个“会议纪要整理员”

纸上得来终觉浅,绝知此事要躬行。让我们抛开所有宏观论述,手把手带你完成一个完整、可运行的 Managed Agents 实战项目:一个能自动整理 Zoom 会议录音并生成结构化纪要的 Agent。这个项目涵盖了从环境准备、配置编写、本地测试到云端部署的全部核心环节,是你理解整个技术栈的最佳入口。

4.1 环境准备与工具链安装

在开始编码之前,你需要准备好以下几样东西:

  1. Anthropic API Key :前往 Anthropic Console 创建一个新项目,并获取你的 ANTHROPIC_API_KEY 。请务必将其保存在安全的地方,切勿硬编码在代码中。
  2. CLI 工具 claude :Anthropic 官方提供的命令行工具,用于与 Managed Agents 服务交互。它可以通过 pip install anthropic-cli 安装。安装完成后,运行 claude login 并输入你的 API Key 进行认证。
  3. 本地开发环境 :一个支持 Python 3.9+ 的环境。我们将使用 anthropic Python SDK 来编写工具函数。

提示: claude CLI 工具是整个开发流程的“瑞士军刀”。它不仅能部署 Agent,还能实时查看会话日志、手动触发工具调用、甚至模拟一个会话进行调试。熟练掌握它,能节省你 80% 的排错时间。

4.2 编写核心工具函数:语音转文字与纪要生成

Managed Agents 的灵魂在于其工具(Tools)。我们需要编写两个核心工具:

  • transcribe_audio :将上传的音频文件(MP3/WAV)转换为文字。
  • generate_minutes :将原始文字稿,提炼成包含“决策项”、“待办事项”、“关键讨论点”的结构化 Markdown 纪要。

以下是 transcribe_audio.py 的完整代码:

# transcribe_audio.py
import os
import requests
from typing import Dict, Any

def transcribe_audio(audio_url: str) -> Dict[str, Any]:
    """
    将远程音频 URL 转换为文字。
    使用开源 Whisper API 服务(此处为示例,生产环境请使用自有或商业服务)
    """
    # 这里应该调用你自己的 Whisper 服务,例如:
    # response = requests.post("https://your-whisper-api.com/transcribe", json={"url": audio_url})
    # 为演示简洁,我们返回一个模拟结果
    mock_transcript = """[00:00:00] Alex: Hi everyone, welcome to the Q2 OKR planning meeting.
[00:00:15] Sam: Thanks Alex. Let's start with the engineering team's top priority: shipping the new search API by May 15th.
[00:00:32] Jamie: We're on track. The backend is done, frontend integration starts next Monday.
[00:00:48] Alex: Great. What about the marketing campaign? Sarah, can you give us an update?
[00:00:55] Sarah: Yes. The launch date is set for June 1st. We need final approval on the budget by April 25th.
[00:01:10] Alex: Approved. Any other blockers? ..."""
    
    return {
        "success": True,
        "text": mock_transcript,
        "duration_seconds": 120
    }

# 这个函数会被 Anthropic 的 Harness 调用,所以必须是顶级函数,且参数名与 YAML 中的 input_schema 严格匹配。

接下来是 generate_minutes.py

# generate_minutes.py
from typing import Dict, Any

def generate_minutes(transcript: str) -> Dict[str, Any]:
    """
    根据会议文字稿,生成结构化纪要。
    """
    # 这里是核心逻辑。在生产环境中,你会调用 Claude 模型,提供精心设计的 system prompt。
    # 为演示,我们用一个简单的规则引擎模拟。
    decisions = []
    action_items = []
    key_points = []

    lines = transcript.split("\n")
    for line in lines:
        if "approved" in line.lower() or "ok" in line.lower():
            decisions.append(line.strip())
        elif "need" in line.lower() or "must" in line.lower() or "by" in line.lower():
            action_items.append(line.strip())
        elif ":" in line and len(line) > 20:
            key_points.append(line.strip())

    return {
        "success": True,
        "minutes": f"""# Q2 OKR Planning Meeting Minutes

## Decisions Made
- {chr(10).join(['* ' + d for d in decisions[:3]])}

## Action Items
- {chr(10).join(['* ' + a for a in action_items[:3]])}

## Key Discussion Points
- {chr(10).join(['* ' + k for k in key_points[:3]])}
""",
        "summary": "Meeting covered engineering timeline, marketing launch, and budget approval."
    }

4.3 编写 YAML 配置与部署

现在,我们来编写这个 Agent 的 meeting-minutes-agent.yaml

name: "Meeting-Minutes-Aggregator"
description: "An agent that transcribes Zoom recordings and generates structured meeting minutes."

system_prompt: |
  You are a meticulous and efficient meeting secretary.
  Your job is to take an audio recording of a meeting and produce a clear, actionable, and well-structured markdown document.

tools:
  - name: "transcribe_audio"
    description: "Converts an audio file URL into a plain text transcript."
    input_schema:
      type: "object"
      properties:
        audio_url:
          type: "string"
          description: "The publicly accessible URL of the audio file (MP3 or WAV)."
    sandbox: "whisper-sandbox"

  - name: "generate_minutes"
    description: "Generates a structured markdown meeting minutes document from a raw transcript."
    input_schema:
      type: "object"
      properties:
        transcript:
          type: "string"
          description: "The full text transcript of the meeting."
    sandbox: "llm-sandbox"

sandboxes:
  - name: "whisper-sandbox"
    network_policy:
      allow:
        - "https://your-whisper-api.com"
    # 此沙箱不使用外部凭证,故无需 credentials 字段

  - name: "llm-sandbox"
    network_policy:
      allow:
        - "https://api.anthropic.com"
    # 此沙箱由 Anthropic 自动注入 Claude 模型调用所需的凭证

guardrails:
  content_filter:
    deny_list:
      - "confidential"
      - "private"
  rate_limiting:
    - tool: "transcribe_audio"
      max_calls_per_session: 1
    - tool: "generate_minutes"
      max_calls_per_session: 1

部署它,只需一行命令:

claude agents deploy --file meeting-minutes-agent.yaml

如果一切顺利,CLI 会返回一个唯一的 agent_id ,例如 agent_abc123 。恭喜,你的 Agent 已经在 Anthropic 的云上“上岗”了。

4.4 启动会话与调试:见证“事件日志”的力量

现在,让我们启动一个真实的会话,并体验一下 Managed Agents 的核心魅力。

  1. 创建会话

    claude sessions create --agent-id agent_abc123
    # 返回 session_id: sess_xyz789
    
  2. 向会话发送第一条消息(用户指令)

    claude sessions send --session-id sess_xyz789 --message "Please process this Zoom recording: https://example.com/recording.mp3"
    
  3. 查看实时事件日志

    claude sessions events --session-id sess_xyz789 --follow
    

    你会看到类似这样的输出流:

    [2026-04-10T14:22:01Z] USER_INPUT: Please process this Zoom recording: https://example.com/recording.mp3
    [2026-04-10T14:22:02Z] MODEL_OUTPUT: I will first transcribe the audio, then generate the minutes. Calling transcribe_audio...
    [2026-04-10T14:22:03Z] TOOL_CALL: transcribe_audio({"audio_url": "https://example.com/recording.mp3"})
    [2026-04-10T14:22:05Z] TOOL_RESULT: {"success": true, "text": "[00:00:00] Alex: Hi everyone...", "duration_seconds": 120}
    [2026-04-10T14:22:06Z] MODEL_OUTPUT: Transcription complete. Now generating minutes... Calling generate_minutes...
    [2026-04-10T14:22:07Z] TOOL_CALL: generate_minutes({"transcript": "[00:00:00] Alex: Hi everyone..."})
    [2026-04-10T14:22:08Z] TOOL_RESULT: {"success": true, "minutes": "# Q2 OKR Planning Meeting Minutes\n\n## Decisions Made\n- * Alex: Approved. ..."}
    [2026-04-10T14:22:09Z] MODEL_OUTPUT: Here are the structured meeting minutes: ...
    

实操心得:这个 --follow 命令,是我每天必开的“生命线”。它让我能像看直播一样,实时监控 Agent 的每一步思考和行动。当结果不对时,我不用去猜模型在想什么,我直接看日志里 TOOL_RESULT 是什么,就知道是上游数据出了问题,还是下游工具逻辑有 bug。这种“所见即所得”的调试体验,是传统 LLM 应用开发中梦寐以求的。

5. 常见问题与排查技巧实录:踩过的坑,比文档还管用

再完美的架构,在真实世界的泥潭里也会遇到各种意想不到的状况。以下是我在过去三个月里,和几十个客户一起踩过、填过、总结出来的最典型、最高频的 5 个问题及其独家排查技巧。它们不是教科书里的“标准答案”,而是来自一线战场的“生存指南”。

5.1 问题:工具调用失败,日志里只显示 TOOL_CALL ,没有 TOOL_RESULT

现象 :在 claude sessions events --follow 的输出中,你看到了 TOOL_CALL: transcribe_audio(...) ,但等了足足 30 秒,依然没有看到对应的 TOOL_RESULT 。会话卡住了。

排查思路与技巧

  1. 首先检查沙箱网络策略 :这是 70% 的同类问题的根源。运行 claude sandboxes list ,找到你使用的沙箱(如 whisper-sandbox ),然后仔细核对 network_policy.allow 列表。确认你工具函数中 requests.post() 的 URL,是否与列表中的条目 完全匹配 。注意, https://api.whisper.com https://api.whisper.com/v1 是两个不同的端点!
  2. 其次检查工具函数的超时设置 :你的 Python 工具函数里, requests.post() 是否设置了 timeout=(10, 30) ?如果没有,它可能会在 DNS 解析失败时卡住长达 2 分钟。 强制添加超时是铁律。
  3. 终极手段:本地模拟沙箱 :Anthropic CLI 提供了一个隐藏功能 claude sandboxes exec --sandbox-name whisper-sandbox --command "python -c \"import requests; print(requests.get('https://api.whisper.com/health').status_code)\"" 。它会直接在云端的、与生产环境一模一样的沙箱里执行你的命令。如果这个命令失败了,那问题 100% 出在沙箱的网络或环境配置上,而不是你的代码。

注意:不要在工具函数里打印大量 debug 信息到 print() 。沙箱的标准输出(stdout)是被重定向的,这些信息不会出现在你的会话日志里,只会增加不必要的开销。调试信息请写入 logging 模块,并确保日志级别设为 INFO 或更高。

5.2 问题:Agent 生成了敏感信息,但 guardrails.content_filter 没有生效

现象 :你在 guardrails.content_filter.deny_list 里加了 "password" ,但 Agent 依然在回复中生成了 "The password is 123456"

原因与解决方案 content_filter 的工作原理,是在模型生成的 output token 流 到达用户之前,对其进行 逐 token 的扫描和拦截 。它不是一个“后处理”的过滤器。因此,它的失效通常有两个原因:

  • 模型“绕口令” :模型学会了用同义词、缩写或特殊符号来规避检测,比如生成 "The pwd is 123456" "The p@ssw0rd is 123456" 。这不是 deny_list 的缺陷,而是它的设计局限。
  • 解决方案 :将 deny_list 升级为 regex_patterns 。在 YAML 中,你可以这样写:
    guardrails:
      content_filter:
        regex_patterns:
          - pattern: "password|pwd|p@ssw0rd|pass.*word"
            action: "block"
    
    正则表达式能捕捉到更广泛的变体,防御力更强。

5.3 问题:会话费用远超预期, session-hour 计费异常

现象 :一个只处理了 10 秒的会话,账单上却显示了 1.5 小时的费用。

排查技巧

  1. 使用 claude sessions get --session-id <id> :这个命令会返回会话的完整元数据,其中包含 created_at last_active_at ended_at (如果已结束)。计算 last_active_at - created_at ,就能得到精确的“活跃时长”。如果这个时长本身就很长,说明你的 Agent 流程里有隐式的长等待。
  2. 检查是否有“幽灵”工具调用 :有时,一个工具函数在执行失败后,会陷入一个无限重试循环(比如网络错误后不断 time.sleep(1) 然后重试)。这个循环本身会让会话保持“活跃”。在你的工具函数里, 务必为所有重试逻辑加上最大重试次数和指数退避(exponential backoff)
  3. 利用 --idle-timeout 参数 :在创建会话时,你可以显式指定空闲超时时间: claude sessions create --agent-id <id> --idle-timeout 60 。这会将默认的 5 分钟(300 秒)空闲超时,缩短为 1 分钟。对于纯批处理类 Agent(如会议纪要),这是最立竿见影的成本优化手段。

5.

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐