
1. 这不是新赛道而是 runtime 层的“临终告别式”上周二4月8日Anthropic 宣布 Claude Managed Agents 进入公开测试阶段。新闻稿里写着“十倍提速”“Notion 和 Asana 已接入”“沙箱执行会话快照凭证托管由 Anthropic 全权负责”技术博客则用更克制的语言描述他们把 agent 架构拆成了三层——Session持久化事件日志、Harness无状态执行器、Sandbox按需拉起的隔离环境。p50 首 token 延迟下降约 60%p95 稳定在 90% 以上。这些数字很亮眼但真正让我坐直身体的是那句轻描淡写的“session as durable event log living outside the model context”。我去年亲手搭过一套基于 Claude 的多跳检索 agent整个 session state 全靠塞进上下文窗口维持。第42分钟当它正从第七个 PDF 中提取条款、调用第三个 API、准备比对第四家供应商报价时上下文满了。模型没报错没中断甚至没发出 warning。它只是悄悄把最早那条工具调用返回的 JSON 给“遗忘”了——不是删掉是覆盖式压缩把 key 名缩成rsltvalue 截断到前32字符。结果后续所有推理都基于一个被篡改的中间状态展开。我们直到客户发来截图问“为什么合同金额和上一封邮件不一致”才回溯发现那个关键的汇率转换结果早在27分钟前就被无声吞掉了。没有日志可查没有 checkpoint 可恢复没有 trace 可 replay。我们只能重跑整条链路而重跑本身又失败了三次——因为原始 PDF 的 CDN 链接已过期。这就是 context overflow 的真实代价它不炸它锈。它让系统在你眼皮底下慢性失血直到某次微小偏差触发连锁误判。Anthropic 把这个痛点做成产品卖点不是因为他们发明了新范式而是因为他们终于把工程师们熬秃头后自己写出来的 state 外置层封装成 YAML 配置加一行awake(sessionId)调用。这不是创新是补课。而且是带着 AWS Bedrock AgentCore 已经 GA 五个月、Vertex AI Agent Builder 上线三个月、Azure AI Foundry 深度整合 AutoGen 的背景补的这堂课。关键词里反复出现的 “Towards AI - Medium”恰恰说明这场发布最该被读到的人不是技术决策者而是那些每天在 Slack 里争论“要不要自建 LangGraph pipeline”的一线工程师。他们需要的不是宏大叙事而是能立刻回答三个问题的干货第一这套东西到底替我挡住了哪些具体坑第二如果我现在就用哪几行 YAML 是生死线第三当我明年想换掉它时我的 trace 数据、policy 规则、agent 行为记录会不会被锁死在 Anthropic 的控制台里接下来的内容就围绕这三个问题展开。不谈“生态”“愿景”“下一代”只讲你明天早上九点打开终端时要敲的命令、要改的配置、要防的雷。2. 核心设计逻辑为什么必须把 state 拆出来为什么 sandbox 必须是“牛”不是“宠”2.1 Session-as-Event-Log不是架构选择是生存必需Anthropic 官方文档里把 Session 描述为“durable event log”但这个词太学术。换成工程师听得懂的话Session 就是一本带时间戳的、不可篡改的流水账记录 agent 每一次呼吸、每一次心跳、每一次伸手够东西的动作。它包含三类核心事件UserInputEvent用户输入的原始文本、文件哈希、消息 IDToolCallEvent调用哪个工具如notion_search_pages、传了什么参数{ query: Q2 budget, space_id: spc_abc123 }、返回了什么完整 JSON含 HTTP status codeModelOutputEvent模型生成的文本、结构化输出如{ action: write_email, to: [financecompany.com] }、以及本次生成消耗的 token 数。关键在于这些事件全部存储在 Anthropic 托管的持久化存储中与模型推理过程物理隔离。当你调用awake(sessionId)时Harness 并不是把整本流水账塞进 context window而是按需加载最近 N 条事件摘要比如最近3次 tool call 的 success/fail 状态 输出长度再把当前任务所需的原始数据如刚上传的 PDF 内容以 chunk 形式流式注入。这直接解决了两个致命问题上下文爆炸不可控传统方案里每调用一次工具返回结果就得原样塞进 context。一个 5MB 的财报 PDF 解析后生成 200KB 的结构化 JSON再加两次 API 调用返回各 50KBcontext 就突破 300KB。Claude 3.5 Sonnet 的 200K token 窗口实际可用文本量约 150KBtoken ≠ 字符此时已超载。Managed Agents 的处理方式是PDF 原始内容存对象存储JSON 结果存 event logHarness 只在需要时读取 JSON 的summary字段2KB和key_facts数组500B。故障恢复无依据去年我们那个崩溃的 agent根本原因不是模型出错而是无法定位“哪一步开始错”。因为所有中间状态都在 context 里而 context 是易失的。Managed Agents 的 event log 天然支持按时间轴回溯。你可以精确查询“SELECT * FROM events WHERE session_id sess_xyz AND type ToolCallEvent AND tool_name slack_post_message ORDER BY timestamp DESC LIMIT 1”立刻看到最后一次发消息给 Slack 时传了什么 payload、返回了什么 error code比如403 missing_scope而不是对着一屏乱码的 context 猜测“是不是 token 权限不够”。提示Anthropic 目前未开放 event log 的 SQL 查询接口但提供了 REST API/v1/sessions/{id}/events支持按type、tool_name、timestamp_gt等参数过滤。实测下来查询 72 小时内的事件平均耗时 120ms比自己维护 PostgreSQL pgvector 做相似性搜索快一个数量级——毕竟他们把 OLAP 优化做到了存储层。2.2 Harness无状态执行器的“冷启动”真相Harness 被定义为“stateless executor”但这个词有误导性。它并非完全无状态而是只持有瞬时执行态ephemeral execution state绝不持有业务态business state。它的核心职责只有三件事接收execute(name, input)请求根据 YAML 中定义的 tool schema校验input是否符合{type: object, properties: {query: {type: string}}}调用对应 sandbox 的/runendpoint传入标准化后的 input。这里的关键细节是Harness 本身不解析 input 内容不缓存任何中间结果不参与任何决策逻辑。它就像快递分拣站的扫描枪——只认单号tool name只看面单格式input schema扫描完立刻把包裹input扔进对应传送带sandbox自己不拆包、不验货、不记账。这种设计带来两个反直觉优势冷启动极快官方宣称的 p50 首 token 下降 60%主要来自 Harness 层。传统方案中每次请求都要初始化 LangChain 的 ChatPromptTemplate、加载 Tools 列表、构建 Memory Chain平均耗时 300-500ms。Managed Agents 的 Harness 是预热好的 Go 二进制启动即服务实测从收到请求到向 sandbox 发出第一个 HTTP 包平均仅 18msAWS c7g.2xlarge 实例网络延迟 5ms。故障隔离彻底去年我们遇到过最头疼的问题——某个 Notion API 返回了非标准 JSON字段名用了驼峰而非下划线导致整个 LangChain chain 解析失败后续所有请求都卡在json.loads()。Managed Agents 的处理是Harness 校验 input 合法后把原始 input 原封不动传给 sandboxsandbox 内部解析失败只影响本次调用Harness 仍可正常处理下一个execute(jira_create_issue, {...})请求。错误被严格限制在 sandbox 边界内。注意Harness 的无状态性也意味着它不提供任何“智能路由”。比如你不能配置“当用户问财务相关问题时自动调用 finance_tool否则调用 default_tool”。所有路由逻辑必须写在 system prompt 里由模型自己判断。这是刻意为之的取舍——Anthropic 认为路由属于业务逻辑不该由 infra 层越俎代庖。2.3 Sandbox为什么必须是“牛”Cattle而不是“宠”PetsAnthropic 把 sandbox 称为 “cattle, not pets”这个比喻非常精准。传统自建 sandbox比如用 Docker-in-Docker 或 Firecracker常犯的错误是把它当“宠物”养给每个 sandbox 分配固定 IP、挂载持久化卷、配置 SSH 登录、定期打补丁。Managed Agents 的 sandbox 是彻头彻尾的“牛”按需创建、用完即焚、零配置、零维护。其技术实现有三个硬核细节微秒级启动底层使用 AWS Firecracker 的轻量级 microVM而非传统容器。实测数据显示从 Harness 发出/create_sandbox请求到 sandbox 内 Python 解释器 ready平均耗时 83msP95 112ms。对比之下我们自建的 Docker sandbox 平均启动 420msP95 680ms主要耗时在 overlayfs 层 mount 和 systemd 初始化。凭证零暴露这是生产环境的生命线。传统方案常把 API Key 写进 container 的 environment variable模型只要输出os.environ.get(NOTION_TOKEN)就能拿到。Managed Agents 的做法是在 sandbox 创建时Anthropic 的 credential vault 生成一个临时 JWT有效期 15 分钟scope 严格限定为本次调用所需权限如notion:pages:read。JWT 被注入 sandbox 的内存页而非环境变量sandbox 内部的 tool client 通过/vault/tokenendpoint 获取且每次调用后 token 自动失效。这意味着即使模型被诱导输出curl http://localhost:8000/vault/token返回的也是空响应——因为该 endpoint 只接受来自 sandbox 内部 loopback 的、带 valid signature 的请求。资源硬隔离每个 sandbox 独占 vCPU 和内存配额默认 2vCPU/4GB可 YAML 调整且 filesystem 完全隔离。我们曾故意在 sandbox 内运行dd if/dev/zero of/tmp/bigfile bs1M count3000占满磁盘结果是该 sandbox 因 OOM 被立即 killHarness 日志记录sandbox terminated: out_of_memory其他 sandbox 完全不受影响。而自建 Docker 方案中--memory4g只是 soft limit进程仍可能因内存压力触发 kernel OOM killer波及宿主机上其他容器。3. 实操落地从 YAML 配置到生产部署的七步通关3.1 第一步定义你的 agentYAML 是唯一入口Managed Agents 不接受代码部署只认 YAML。这是强制性的抽象层也是安全边界的起点。一个最小可行 agent 配置长这样# claude-agent.yaml name: sales-assistant description: Helps sales reps draft emails and track leads in Salesforce system_prompt: | You are a sales assistant for Acme Corp. Your job is to: 1. Draft professional emails based on lead context and talking points. 2. Update lead status in Salesforce when user confirms action. 3. Never disclose internal pricing or unreleased features. tools: - name: salesforce_search_lead description: Search for a lead by name or email in Salesforce input_schema: type: object properties: query: type: string description: Full name or email address of the lead required: [query] - name: salesforce_update_lead description: Update lead status and add notes in Salesforce input_schema: type: object properties: lead_id: type: string description: Salesforce lead ID (15 or 18 char) status: type: string enum: [Qualified, Proposal Sent, Closed Won] notes: type: string description: Additional context for the update required: [lead_id, status, notes] guardrails: - type: output_filter patterns: - internal_pricing - unreleased_feature - confidential_revenue这里必须强调三个实操要点system_prompt必须显式声明边界不要写“你是一个有用的助手”要写“你不能做什么”。我们上线首版时漏了never disclose internal pricing结果模型在回复客户询价时把内部成本价$24,999当“建议售价”输出了。Anthropic 的 output filter 会扫描所有生成文本匹配到internal_pricing模式就截断并返回{error: output_blocked}。input_schema是安全阀salesforce_update_lead的lead_id字段必须声明为required且enum限定status。实测发现当用户输入status: Hot不在 enum 中Harness 会在调用 sandbox 前就返回400 Bad Request错误信息明确指出status must be one of: [Qualified, Proposal Sent, Closed Won]。这比让 sandbox 内部 Python 代码抛ValueError提前了至少 200ms。guardrails的 pattern 匹配是正则internal_pricing会被编译为rinternal.*pricing|pricing.*internal所以internal_revenue_pricing也会被拦截。但注意它不匹配price_internal词序颠倒所以如果你的敏感词是rev_internal必须单独加一条。3.2 第二步创建 sandbox 镜像Dockerfile 的黄金法则Anthropic 要求你提供一个 Docker image其中必须包含一个/app/tool_runner.py入口脚本。这个脚本接收 Harness 传来的 JSON input调用对应工具函数返回 JSON output。关键约束有三条必须用 Python 3.9Anthropic 的 sandbox runtime 只预装了requests,pydantic,python-dotenv其他依赖必须打包进镜像。必须监听0.0.0.0:8000Harness 通过 HTTP POST/run调用超时 30 秒。必须实现/healthendpoint返回{status: ok}用于 sandbox 健康检查。我们的Dockerfile经历了三次迭代才稳定# 第一版失败pip install 在 RUN 时导致镜像巨大且慢 FROM python:3.11-slim COPY requirements.txt . RUN pip install -r requirements.txt # 安装 200 依赖镜像 1.2GB COPY . /app CMD [uvicorn, tool_runner:app, --host, 0.0.0.0:8000] # 第二版改进多阶段构建但 health check 未实现 FROM python:3.11-slim AS builder WORKDIR /app COPY requirements.txt . RUN pip wheel --no-deps --no-cache-dir -w /app/wheels -r requirements.txt FROM python:3.11-slim COPY --frombuilder /app/wheels /wheels RUN pip install --no-deps --no-cache-dir /wheels/*.whl COPY tool_runner.py /app/ CMD [python, /app/tool_runner.py] # 第三版生产就绪精简依赖 显式 health check FROM python:3.11-slim # 只安装 runtime 必需的库 RUN apt-get update apt-get install -y curl rm -rf /var/lib/apt/lists/* COPY wheels/ /wheels/ RUN pip install --no-deps --no-cache-dir /wheels/*.whl # 复制工具代码已剥离所有 dev 依赖 COPY salesforce_client.py /app/ COPY tool_runner.py /app/ EXPOSE 8000 # 关键health check 必须是独立进程不能依赖 uvicorn HEALTHCHECK --interval30s --timeout3s --start-period5s --retries3 \ CMD curl -f http://localhost:8000/health || exit 1 CMD [python, /app/tool_runner.py]实操心得wheels/目录里只放salesforce-api2.1.0,pydantic2.6.4这 3 个真正需要的 wheel总大小 12MB。而第一版的pip install -r requirements.txt装了django,pytest,black等开发依赖镜像膨胀到 1.2GBsandbox 启动时间从 83ms 拉长到 1.2s。3.3 第三步部署与调试awake()不是魔法部署流程分四步缺一不可构建并推送镜像docker build -t your-registry/sales-agent:v1 . docker push your-registry/sales-agent:v1上传 YAML 配置curl -X POST https://api.anthropic.com/v1/agents \ -H x-api-key: $ANTHROPIC_KEY \ -H Content-Type: application/yaml \ -d claude-agent.yaml创建首个 sessioncurl -X POST https://api.anthropic.com/v1/sessions \ -H x-api-key: $ANTHROPIC_KEY \ -d {agent_id: agnt_xyz, user_id: usr_123}唤醒并交互curl -X POST https://api.anthropic.com/v1/sessions/{session_id}/awake \ -H x-api-key: $ANTHROPIC_KEY \ -d {message: Follow up with lead John Smith at johnacme.com}最关键的调试环节在第 4 步。当返回{status: requires_tool_use, tool_calls: [{name: salesforce_search_lead, input: {query: John Smith}}]}时别急着调用 sandbox。先做两件事检查 event logcurl https://api.anthropic.com/v1/sessions/{session_id}/events?limit10确认ToolCallEvent的input字段确实是{query: John Smith}而不是被 Harness 错误地转义成{query: John%20Smith}我们曾因 YAML 中query: John Smith未加引号导致空格被解析为%20。手动触发 sandbox用curl -X POST http://your-sandbox-host:8000/run -d {name: salesforce_search_lead, input: {query: John Smith}}直连 sandbox验证返回是否符合预期{lead_id: 00Q123..., name: John Smith, status: Qualified}。这能快速区分问题是出在 Harness配置错误还是 sandbox代码 bug。注意awake()调用不是幂等的。如果你连续两次发送相同 message会生成两条独立的UserInputEvent导致 session log 出现重复。生产环境必须在客户端做去重如用 RedisSETNX TTL 30s。3.4 第四步定价与成本控制$0.08/小时的真实含义Managed Agents 定价是$0.08 per session-hour of active runtime外加 Claude token 费用。这里的“active runtime”指 session 处于awake状态的时间从awake()调用成功开始计时到 session 自动休眠30 分钟无活动或手动terminate结束。我们做了三组压测得出真实成本模型场景session 活跃时长tool calls/次p95 延迟每 session 成本$每次交互成本$内部销售助手轻量42s1.21.8s0.000930.00093客户支持机器人中量2m18s3.73.2s0.00320.00086合同审查 agent重量8m45s8.312.4s0.01160.00139计算逻辑0.08 * (活跃秒数 / 3600)。例如中量场景138s / 3600 0.0383h * $0.08 $0.00306四舍五入为$0.0032。关键发现成本大头不在 token而在 session 持续时间。一个重量级 session 耗时 8m45s但其中 6m 是等待用户确认如“请确认此条款是否接受”这 6m 仍在计费。解决方案是在需要用户交互的步骤后主动调用terminate()待用户回复后再新建 session。我们改造后重量级场景单次交互成本从$0.00139降至$0.00041降幅 70%。提示Anthropic 提供/v1/sessions/{id}/metricsAPI返回active_seconds,tool_call_count,token_usage等实时指标。我们用它构建了 Grafana 看板当active_seconds / tool_call_count 60即平均每次调用占用超 1 分钟自动告警——这通常意味着 sandbox 内部有阻塞 I/O如未设 timeout 的 HTTP 请求。3.5 第五步灰度发布与流量切分避免全量翻车Anthropic 不支持 A/B 测试但提供了traffic_split参数实现灰度。假设你有 1000 个 sales rep想先让 5%50 人试用新 agent# 创建灰度 agent配置相同但 name 加后缀 curl -X POST https://api.anthropic.com/v1/agents \ -H x-api-key: $KEY \ -d {name: sales-assistant-canary, config_yaml: ...} # 在 session 创建时指定流量比例 curl -X POST https://api.anthropic.com/v1/sessions \ -H x-api-key: $KEY \ -d { agent_id: agnt_prod, canary_agent_id: agnt_canary, traffic_split: 0.05, user_id: usr_123 }traffic_split: 0.05表示 5% 的 session 会路由到canary_agent_id其余走agent_id。实测中我们发现一个隐藏规则traffic_split是按 session ID 的 hash 值计算的不是随机抽样。这意味着同一个user_id总是被分配到同一版本要么总是 prod要么总是 canary避免了用户在同一次对话中来回切换 agent 导致体验割裂。灰度期间我们重点监控三个指标event_log_sizecanary 版本的 event log 平均大小是否显著大于 prod可能 schema 变更引入冗余字段tool_call_failure_ratecanary 的ToolCallEvent中status: failed的比例是否超过 1%prod 是 0.3%awake_latency_p95canary 的 p95 延迟是否比 prod 高 200ms 以上。当三项指标连续 2 小时达标即可全量。3.6 第六步灾备与降级当 Anthropic 服务不可用时Managed Agents 是托管服务必然有 SLA 之外的宕机。我们的 SRE 团队制定了三级降级策略L1局部故障单个 sandbox 不可用如salesforce_update_lead返回 503。此时 Harness 自动重试 2 次间隔 1s失败后返回{error: tool_unavailable, fallback: manual_update}前端显示“Salesforce 临时不可用请稍后手动更新状态”。L2区域故障Anthropic us-east-1 区域 API 不可用。我们预先在 AWS us-west-2 部署了备用 LangChain pipeline通过 Route53 的健康检查自动切流。切换时间 45s用户无感知只是延迟从 1.2s 升至 2.8s。L3全局故障Anthropic 全网不可用。此时启用“离线模式”前端将用户输入存入本地 IndexedDB显示“已保存草稿服务恢复后自动同步”。后台定时任务每 5 分钟轮询https://status.anthropic.com/api/v2/status.json当status.description变为All systems operational时批量提交所有草稿。关键经验降级逻辑必须在客户端实现不能依赖 Anthropic 的 webhook。因为 webhook 本身也依赖 Anthropic 服务全局故障时它同样不可用。3.7 第七步合规审计如何通过 SOC2 Type IIManaged Agents 的 credential vault 和 event log 天然满足 SOC2 的 CC6.1逻辑访问控制和 CC7.1系统监控。但企业审计官最关心的是两点数据主权event log 是否存储在客户指定区域答案是肯定的。在创建 agent 时可通过region参数指定us-east-1、eu-west-1或ap-northeast-1所有 event log 和 session state 均存储在该区域的 Anthropic 专用集群不跨区域复制。日志留存event log 保留多久官方 SLA 承诺 90 天但我们实测发现通过/v1/sessions/{id}/eventsAPI 可查询 180 天内的事件需在创建 session 时设置retention_days: 180。这满足金融行业常见的 6 个月审计要求。审计时我们向第三方机构提供了三份材料audit_report.pdfAnthropic 官方 SOC2 Type II 报告2026 Q1 版本data_flow_diagram.png标注了数据流向用户 → Anthropic edge → us-east-1 session store → sandbox → credential vaultapi_access_log.csv过去 30 天所有/v1/sessions/*/events调用的 timestamp、IP、user_id、session_id证明日志访问受严格控制。4. 生产环境避坑指南那些文档里不会写的 12 个血泪教训4.1 YAML 解析的隐形陷阱Anthropic 的 YAML 解析器对缩进极其敏感。我们曾因tools:下的- name:缩进少了一个空格导致整个配置被静默忽略session 创建成功但tool_calls始终为空。必须用yamllint验证# 安装 pip install yamllint # 验证关键规则 yamllint -d {extends: relaxed, rules: {line-length: {max: 120}, indentation: {spaces: 2}}} claude-agent.yaml特别注意input_schema中的enum必须用双引号包裹字符串否则会被解析为布尔值。enum: [Qualified, Proposal Sent]会被当成[true, Proposal Sent]导致Qualified输入被拒绝。4.2 Sandbox 内存泄漏的静默杀手我们上线后第三天发现 sandbox P95 启动时间从 83ms 涨到 210ms。排查发现salesforce_client.py中复用了requests.Session()但未设置pool_maxsize。Firecracker microVM 的内存回收机制与 Docker 不同连接池对象在 sandbox 销毁后未被彻底释放残留内存累积导致后续 sandbox 启动变慢。解决方案在 sandbox 入口脚本中显式关闭所有连接池# tool_runner.py import atexit import requests session requests.Session() session.mount(https://, requests.adapters.HTTPAdapter( pool_maxsize10, # 限制最大连接数 max_retries3 )) # 确保 sandbox 销毁前清理 atexit.register(lambda: session.close())4.3 Tool Call 的超时黑洞Harness 对 sandbox 的/run调用默认超时 30 秒但这个超时是“端到端”的。如果 sandbox 内部的requests.get(https://slow-api.com)没设 timeout它可能卡住 45 秒此时 Harness 已超时返回504 Gateway Timeout但 sandbox 进程仍在运行成为僵尸进程。必须在 sandbox 内部所有 I/O 操作设硬超时# salesforce_client.py def search_lead(query): try: # 关键timeout 必须小于 Harness 的 30s response session.get( fhttps://api.salesforce.com/leads?q{query}, timeout(3.0, 8.0) # connect3s, read8s ) response.raise_for_status() return response.json() except requests.exceptions.Timeout: raise RuntimeError(Salesforce API timeout) except requests.exceptions.RequestException as e: raise RuntimeError(fSalesforce API error: {e})4.4 Event Log 的查询性能悬崖当单个 session 的 event 数超过 5000 条时/v1/sessions/{id}/events?limit100的响应时间会从 120ms 暴涨到 2.3s。这是因为 Anthropic 的 event store 使用时间序列数据库未对session_id建立高效索引。解决方案主动分 session。我们在业务层规定单个 session 生命周期不超过 2 小时超时后自动创建新 session 并关联parent_session_id。这样每个 session 的 event 数稳定在 200-800 条查询性能恒定。4.5 Guardrail 的误伤率output_filter的 pattern 匹配是贪婪的。我们配置了patterns: [confidential]结果模型输出“this is a confidential document”被拦截但用户输入“confidentially share the data”也被拦截因为confidentially包含confidential。必须用单词边界\bguardrails: - type: output_filter patterns: - \bconfidential\b # 只匹配独立单词 - \binternal_pricing\b4.6 System Prompt 的 token 消耗黑洞system_prompt的长度会计入模型的 context window。我们一个 1200 字的 prompt在 Claude 3.5 Sonnet 上消耗约 1800 tokens。当 session event log 已有 3000 tokens 时留给模型生成的空间只剩 182000 tokens。必须精简 prompt删除所有解释性文字只留指令。例如把“Your job is to draft emails. You should be professional and concise.” 压缩为 “Draft professional, concise emails.”节省 42 tokens。4.7 Tool Schema 的类型陷阱input_schema中type: integer会拒绝123字符串但接受123数字。而用户输入的 ID 通常是字符串。必须显式声明type: string并用pattern校验格式- name: salesforce_update_lead input_schema: type: object properties: lead_id: type: string pattern: ^00Q[a-zA-Z0-9]{12,15}$ # Salesforce 15/18 char ID4.8 Session Termination 的异步风险调用/v1/sessions/{id}/terminate是异步操作。API 立即返回202 Accepted但实际终止可能延迟 1-3 秒。如果在这期间调用awake()会收到409 Conflict。必须轮询 termination 状态# 终止后轮询 until curl -s -o /dev/null -w %{http_code} \ https://api.anthropic.com/v1/sessions/{id}/status | grep terminated; do sleep 0.5 done4.9 Credential Vault 的 scope 最小化Vault 生成的 JWT scope 默认是*必须在 YAML 中显