12 12
13如果你不需要在自己的基础设施上运行代理循环本身,请考虑改用[托管代理](https://platform.claude.com/docs/en/managed-agents/overview)。Anthropic 托管代理循环,你的应用程序通过客户端 SDK 或 REST API 发送事件并接收流式结果。工具执行在 Anthropic 托管的云沙箱或你自己的基础设施上的[自托管沙箱](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes)中运行。13如果你不需要在自己的基础设施上运行代理循环本身,请考虑改用[托管代理](https://platform.claude.com/docs/en/managed-agents/overview)。Anthropic 托管代理循环,你的应用程序通过客户端 SDK 或 REST API 发送事件并接收流式结果。工具执行在 Anthropic 托管的云沙箱或你自己的基础设施上的[自托管沙箱](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes)中运行。
14 14
15<h2 id="the-subprocess-model">15## 子进程模型
16 子进程模型
17</h2>
18 16
19本页面上的每个托管决策都遵循 SDK 如何运行代理的方式。当您的代码调用 `query()` 时,SDK 会生成一个单独的 `claude` CLI 进程,并通过 stdio 与其通信。该子进程拥有 shell、工作目录和本地磁盘上的 JSONL 会话记录。17本页面上的每个托管决策都遵循 SDK 如何运行代理的方式。当您的代码调用 `query()` 时,SDK 会生成一个单独的 `claude` CLI 进程,并通过 stdio 与其通信。该子进程拥有 shell、工作目录和本地磁盘上的 JSONL 会话记录。
20 18
21<img src="https://mintcdn.com/claude-code/ikqp3_70mqIahteV/images/agent-sdk/hosting-subprocess.svg?fit=max&auto=format&n=ikqp3_70mqIahteV&q=85&s=9dac857ca9d3b1410c3734900c386004" className="dark:hidden" alt="请求流:从客户端到您的应用,应用在容器内通过 stdio 生成 claude CLI 子进程;子进程写入本地磁盘并通过 HTTPS 调用 api.anthropic.com" width="920" height="220" data-path="images/agent-sdk/hosting-subprocess.svg" />19
22
23<img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/agent-sdk/hosting-subprocess-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=3fdeff3d7f44b2b67762668acfbb25f5" className="hidden dark:block" alt="请求流:从客户端到您的应用,应用在容器内通过 stdio 生成 claude CLI 子进程;子进程写入本地磁盘并通过 HTTPS 调用 api.anthropic.com" width="920" height="220" data-path="images/agent-sdk/hosting-subprocess-dark.svg" />
24 20
25一个代理会话映射到一个子进程。运行 N 个并发会话意味着 N 个子进程,每个都有自己的进程树和记录文件。默认情况下,它们都继承您应用程序的工作目录。当会话需要单独的文件系统时,在每个会话的 `query()` 调用选项中传递不同的 `cwd`:21一个代理会话映射到一个子进程。运行 N 个并发会话意味着 N 个子进程,每个都有自己的进程树和记录文件。默认情况下,它们都继承您应用程序的工作目录。当会话需要单独的文件系统时,在每个会话的 `query()` 调用选项中传递不同的 `cwd`:
26 22
27<CodeGroup>23```typescript TypeScript theme={null}
28 ```typescript TypeScript theme={null}24import { query } from "@anthropic-ai/claude-agent-sdk";
29 import { query } from "@anthropic-ai/claude-agent-sdk";
30 25
31 for await (const message of query({26for await (const message of query({
32 prompt: "Summarize the files in this directory",27 prompt: "Summarize the files in this directory",
33 options: { cwd: "/work/session-a" },28 options: { cwd: "/work/session-a" },
34 })) {29})) {
35 console.log(message);30 console.log(message);
36 }31}
37 ```32```
38 33
39 ```python Python theme={null}34```python Python theme={null}
40 import asyncio35import asyncio
41 36
42 from claude_agent_sdk import ClaudeAgentOptions, query37from claude_agent_sdk import ClaudeAgentOptions, query
43 38
44 39
45 async def main():40async def main():
46 async for message in query(41 async for message in query(
47 prompt="Summarize the files in this directory",42 prompt="Summarize the files in this directory",
48 options=ClaudeAgentOptions(cwd="/work/session-a"),43 options=ClaudeAgentOptions(cwd="/work/session-a"),
50 print(message)45 print(message)
51 46
52 47
53 asyncio.run(main())48asyncio.run(main())
54 ```49```
55</CodeGroup>
56 50
57本页面上的 TypeScript 示例使用顶级 `await`,因此将它们保存为 `.mts` 文件或在 `package.json` 中设置 `"type": "module"`。51本页面上的 TypeScript 示例使用顶级 `await`,因此将它们保存为 `.mts` 文件或在 `package.json` 中设置 `"type": "module"`。
58 52
59<h3 id="state-that-lives-on-local-disk">53### 存储在本地磁盘上的状态
60 存储在本地磁盘上的状态
61</h3>
62 54
63三种代理状态默认存储在容器的文件系统上。它们都不会在容器重启、缩减或移动到不同节点时保留。55三种代理状态默认存储在容器的文件系统上。它们都不会在容器重启、缩减或移动到不同节点时保留。
64 56
72 64
73有关会话、恢复和分叉在 API 级别如何工作的信息,请参阅 [Sessions](/docs/zh-CN/agent-sdk/sessions)。65有关会话、恢复和分叉在 API 级别如何工作的信息,请参阅 [Sessions](/docs/zh-CN/agent-sdk/sessions)。
74 66
75<h2 id="choose-a-session-pattern">67## 选择会话模式
76 选择会话模式
77</h2>
78 68
79这四种模式涵盖会话生命周期:容器相对于它所服务的会话的生存时间。关于容器运行的位置,[托管指南](https://github.com/anthropics/claude-cookbooks/blob/main/claude_agent_sdk/07_Hosting_the_agent.ipynb)提供了[可部署代码](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting),用于本地 Docker、Modal 和 Kubernetes。在此选择会话模式,并从指南中选择部署目标。69这四种模式涵盖会话生命周期:容器相对于它所服务的会话的生存时间。关于容器运行的位置,[托管指南](https://github.com/anthropics/claude-cookbooks/blob/main/claude_agent_sdk/07_Hosting_the_agent.ipynb)提供了[可部署代码](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting),用于本地 Docker、Modal 和 Kubernetes。在此选择会话模式,并从指南中选择部署目标。
80 70
81<h3 id="ephemeral-sessions">71### Ephemeral sessions
82 Ephemeral sessions
83</h3>
84 72
85为每个用户任务创建一个容器,任务完成时销毁它。最适合一次性任务。用户可能仍然可以在任务完成时与 AI 交互,但一旦完成,容器就会被销毁。73为每个用户任务创建一个容器,任务完成时销毁它。最适合一次性任务。用户可能仍然可以在任务完成时与 AI 交互,但一旦完成,容器就会被销毁。
86 74
88 76
89容器运行一个一次性入口点,从 `TASK_PROMPT` 环境变量读取任务,调用 SDK,然后退出。77容器运行一个一次性入口点,从 `TASK_PROMPT` 环境变量读取任务,调用 SDK,然后退出。
90 78
91<CodeGroup>79```typescript TypeScript theme={null}
92 ```typescript TypeScript theme={null}80import { query } from "@anthropic-ai/claude-agent-sdk";
93 import { query } from "@anthropic-ai/claude-agent-sdk";
94 81
95 const prompt = process.env.TASK_PROMPT!;82const prompt = process.env.TASK_PROMPT!;
96 for await (const message of query({ prompt, options: { maxTurns: 20 } })) {83for await (const message of query({ prompt, options: { maxTurns: 20 } })) {
97 console.log(message);84 console.log(message);
98 }85}
99 ```86```
100 87
101 ```python Python theme={null}88```python Python theme={null}
102 import asyncio89import asyncio
103 import os90import os
104 91
105 from claude_agent_sdk import ClaudeAgentOptions, query92from claude_agent_sdk import ClaudeAgentOptions, query
106 93
107 94
108 async def main():95async def main():
109 async for message in query(96 async for message in query(
110 prompt=os.environ["TASK_PROMPT"],97 prompt=os.environ["TASK_PROMPT"],
111 options=ClaudeAgentOptions(max_turns=20),98 options=ClaudeAgentOptions(max_turns=20),
113 print(message)100 print(message)
114 101
115 102
116 asyncio.run(main())103asyncio.run(main())
117 ```104```
118</CodeGroup>
119 105
120脚本在每条消息到达时打印它,包括一条结果消息,当任务在轮次限制内完成时,其 `subtype` 为 `success`。如果任务改为达到 20 轮限制,结果消息的 `subtype` 为 `error_max_turns`,`query()` 调用在产生它后会抛出错误,因此如果容器需要干净地退出,请将循环包装在 try 块中。有关错误子类型,请参阅[处理结果](/docs/zh-CN/agent-sdk/agent-loop#handle-the-result)。106脚本在每条消息到达时打印它,包括一条结果消息,当任务在轮次限制内完成时,其 `subtype` 为 `success`。如果任务改为达到 20 轮限制,结果消息的 `subtype` 为 `error_max_turns`,`query()` 调用在产生它后会抛出错误,因此如果容器需要干净地退出,请将循环包装在 try 块中。有关错误子类型,请参阅[处理结果](/docs/zh-CN/agent-sdk/agent-loop#handle-the-result)。
121 107
122<h3 id="long-running-sessions">108### Long-running sessions
123 Long-running sessions
124</h3>
125 109
126运行持久容器实例,通常每个容器托管多个 SDK 进程,以服务持续工作。最适合采取自主行动、提供内容或处理高容量消息流的代理。110运行持久容器实例,通常每个容器托管多个 SDK 进程,以服务持续工作。最适合采取自主行动、提供内容或处理高容量消息流的代理。
127 111
134 118
135调整容器大小,使其能够在内存中容纳最大并发会话数。119调整容器大小,使其能够在内存中容纳最大并发会话数。
136 120
137<h3 id="hybrid-sessions">121### Hybrid sessions
138 Hybrid sessions
139</h3>
140 122
141从启动时的 [`SessionStore`](/docs/zh-CN/agent-sdk/session-storage) 进行补充并将更新持久化回去的临时容器。最适合跨越许多交互但在交互之间处于空闲状态的会话。容器在空闲期间关闭,当用户返回时重新启动。123从启动时的 [`SessionStore`](/docs/zh-CN/agent-sdk/session-storage) 进行补充并将更新持久化回去的临时容器。最适合跨越许多交互但在交互之间处于空闲状态的会话。容器在空闲期间关闭,当用户返回时重新启动。
142 124
146 128
147该模式的关键在于通过 ID 恢复会话,并附加共享存储:129该模式的关键在于通过 ID 恢复会话,并附加共享存储:
148 130
149<CodeGroup>131```typescript TypeScript theme={null}
150 ```typescript TypeScript theme={null}132import { query, type SessionStore } from "@anthropic-ai/claude-agent-sdk";
151 import { query, type SessionStore } from "@anthropic-ai/claude-agent-sdk";
152 133
153 declare const userInput: string;134declare const userInput: string;
154 declare const sessionId: string; // looked up from your database by user135declare const sessionId: string; // looked up from your database by user
155 declare const sessionStore: SessionStore; // an object store, key-value store, database, or your own adapter136declare const sessionStore: SessionStore; // an object store, key-value store, database, or your own adapter
156 137
157 for await (const message of query({138for await (const message of query({
158 prompt: userInput,139 prompt: userInput,
159 options: { resume: sessionId, sessionStore },140 options: { resume: sessionId, sessionStore },
160 })) {141})) {
161 // ...142 // ...
162 }143}
163 ```144```
164 145
165 ```python Python theme={null}146```python Python theme={null}
166 from claude_agent_sdk import query, ClaudeAgentOptions, SessionStore147from claude_agent_sdk import query, ClaudeAgentOptions, SessionStore
167 import asyncio148import asyncio
168 149
169 user_input: str = ...150user_input: str = ...
170 session_id: str = ... # looked up from your database by user151session_id: str = ... # looked up from your database by user
171 session_store: SessionStore = ... # an object store, key-value store, database, or your own adapter152session_store: SessionStore = ... # an object store, key-value store, database, or your own adapter
172 153
173 154
174 async def main():155async def main():
175 async for message in query(156 async for message in query(
176 prompt=user_input,157 prompt=user_input,
177 options=ClaudeAgentOptions(158 options=ClaudeAgentOptions(
182 ...163 ...
183 164
184 165
185 asyncio.run(main())166asyncio.run(main())
186 ```167```
187</CodeGroup>
188 168
189<h3 id="multi-agent-container">169### Multi-agent container
190 Multi-agent container
191</h3>
192 170
193在一个容器内运行多个 SDK 子进程。最适合必须紧密协作的代理,例如多代理模拟,其中代理在共享环境中相互交互。171在一个容器内运行多个 SDK 子进程。最适合必须紧密协作的代理,例如多代理模拟,其中代理在共享环境中相互交互。
194 172
195为每个代理提供自己的工作目录,以便它们不会相互覆盖文件,并隔离设置加载,以便每个代理的 `CLAUDE.md` 文件不会泄漏到其他代理。有关具体选项,请参阅[多租户隔离](#multi-tenant-isolation)。173为每个代理提供自己的工作目录,以便它们不会相互覆盖文件,并隔离设置加载,以便每个代理的 `CLAUDE.md` 文件不会泄漏到其他代理。有关具体选项,请参阅[多租户隔离](#multi-tenant-isolation)。
196 174
197<h2 id="provision-the-container">175## 配置容器
198 配置容器
199</h2>
200 176
201<h3 id="container-based-sandboxing">177### 基于容器的沙箱隔离
202 基于容器的沙箱隔离
203</h3>
204 178
205在沙箱容器内运行 SDK,以实现进程隔离、资源限制、网络控制和临时文件系统。179在沙箱容器内运行 SDK,以实现进程隔离、资源限制、网络控制和临时文件系统。
206 180
214 188
215有关自托管选项(如 Docker、gVisor 和 Firecracker)以及详细的隔离配置,请参阅 [隔离技术](/docs/zh-CN/agent-sdk/secure-deployment#isolation-technologies)。189有关自托管选项(如 Docker、gVisor 和 Firecracker)以及详细的隔离配置,请参阅 [隔离技术](/docs/zh-CN/agent-sdk/secure-deployment#isolation-technologies)。
216 190
217<h3 id="runtime-dependencies">191### 运行时依赖项
218 运行时依赖项
219</h3>
220 192
221容器需要您的 SDK 的语言运行时:193容器需要您的 SDK 的语言运行时:
222 194
225 197
226捆绑的二进制文件固定到 SDK 包版本,因此更新 SDK 是更新 CLI 的方式。SDK 遵循 semver:持续采用补丁版本,并在采用次要版本之前查看 [TypeScript](https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md) 或 [Python](https://github.com/anthropics/claude-agent-sdk-python/blob/main/CHANGELOG.md) 更新日志。198捆绑的二进制文件固定到 SDK 包版本,因此更新 SDK 是更新 CLI 的方式。SDK 遵循 semver:持续采用补丁版本,并在采用次要版本之前查看 [TypeScript](https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md) 或 [Python](https://github.com/anthropics/claude-agent-sdk-python/blob/main/CHANGELOG.md) 更新日志。
227 199
228<h3 id="resources">200### 资源
229 资源
230</h3>
231 201
232对于新启动的实例,每个代理 1 GiB RAM、5 GiB 磁盘和 1 个 CPU 是一个合理的起点。内存使用量随会话长度和工具活动而增长,因此应根据您实际需要的会话长度和并发性进行调整,而不是根据空闲基线。有关如何计算每个主机的代理数,请参阅 [扩展和并发](#scaling-and-concurrency)。202对于新启动的实例,每个代理 1 GiB RAM、5 GiB 磁盘和 1 个 CPU 是一个合理的起点。内存使用量随会话长度和工具活动而增长,因此应根据您实际需要的会话长度和并发性进行调整,而不是根据空闲基线。有关如何计算每个主机的代理数,请参阅 [扩展和并发](#scaling-and-concurrency)。
233 203
234<h3 id="network">204### 网络
235 网络
236</h3>
237 205
238SDK 需要对 `api.anthropic.com` 的出站 HTTPS,或在 Amazon Bedrock 或 Google Cloud 的 Agent Platform 上运行时对您的提供商的区域端点的出站 HTTPS。如果您的代理使用 [MCP 服务器](/docs/zh-CN/agent-sdk/mcp) 或外部工具,它们还需要对这些端点的出站访问。对于生产环境,通过强制执行域允许列表、注入凭据和记录请求的出站代理路由出站流量。有关完整模式,请参阅 [安全部署](/docs/zh-CN/agent-sdk/secure-deployment)。206SDK 需要对 `api.anthropic.com` 的出站 HTTPS,或在 Amazon Bedrock 或 Google Cloud 的 Agent Platform 上运行时对您的提供商的区域端点的出站 HTTPS。如果您的代理使用 [MCP 服务器](/docs/zh-CN/agent-sdk/mcp) 或外部工具,它们还需要对这些端点的出站访问。对于生产环境,通过强制执行域允许列表、注入凭据和记录请求的出站代理路由出站流量。有关完整模式,请参阅 [安全部署](/docs/zh-CN/agent-sdk/secure-deployment)。
239 207
240对于入站流量,在容器上公开 HTTP 或 WebSocket 端口。您的应用程序在该端口上处理客户端请求并在内部调用 SDK;子进程本身不在网络上侦听。208对于入站流量,在容器上公开 HTTP 或 WebSocket 端口。您的应用程序在该端口上处理客户端请求并在内部调用 SDK;子进程本身不在网络上侦听。
241 209
242<h2 id="handle-production-concerns">210## 处理生产环保
243 处理生产环保
244</h2>
245 211
246在部署自托管代理之前,需要完成这些决策。212在部署自托管代理之前,需要完成这些决策。
247 213
248<h3 id="session-and-state-persistence">214### 会话和状态持久化
249 会话和状态持久化
250</h3>
251 215
252默认本地磁盘在重启、缩减或移动到不同节点时会丢失。对于用户期望恢复的任何会话,使用 [`SessionStore` 适配器](/docs/zh-CN/agent-sdk/session-storage)将记录副本镜像到持久存储。查看[参考实现](/docs/zh-CN/agent-sdk/session-storage#reference-implementations)了解对象存储、键值存储和数据库的示例适配器,以及用于您自己实现的一致性测试套件。216默认本地磁盘在重启、缩减或移动到不同节点时会丢失。对于用户期望恢复的任何会话,使用 [`SessionStore` 适配器](/docs/zh-CN/agent-sdk/session-storage)将记录副本镜像到持久存储。查看[参考实现](/docs/zh-CN/agent-sdk/session-storage#reference-implementations)了解对象存储、键值存储和数据库的示例适配器,以及用于您自己实现的一致性测试套件。
253 217
257* **镜像,不替换**:子进程首先写入本地磁盘,SDK 将每个批次的副本转发到存储。新会话的本地记录比运行时间更长;从存储恢复的运行在结束时删除其本地副本,因此存储保存唯一的持久副本。查看[双写架构](/docs/zh-CN/agent-sdk/session-storage#dual-write-architecture)。221* **镜像,不替换**:子进程首先写入本地磁盘,SDK 将每个批次的副本转发到存储。新会话的本地记录比运行时间更长;从存储恢复的运行在结束时删除其本地副本,因此存储保存唯一的持久副本。查看[双写架构](/docs/zh-CN/agent-sdk/session-storage#dual-write-architecture)。
258* **`mirror_error` 消息**:当 SDK 无法将批次传递到存储时,它会丢弃该批次,发出 `{ type: "system", subtype: "mirror_error" }` 消息,并继续查询。如果存储持久性很重要,请对这些消息进行警报。查看[镜像写入是尽力而为](/docs/zh-CN/agent-sdk/session-storage#mirror-writes-are-best-effort)了解重试和超时行为。222* **`mirror_error` 消息**:当 SDK 无法将批次传递到存储时,它会丢弃该批次,发出 `{ type: "system", subtype: "mirror_error" }` 消息,并继续查询。如果存储持久性很重要,请对这些消息进行警报。查看[镜像写入是尽力而为](/docs/zh-CN/agent-sdk/session-storage#mirror-writes-are-best-effort)了解重试和超时行为。
259 223
260<h3 id="observability">224### 可观测性
261 可观测性
262</h3>
263 225
264Agent SDK 代理是长期运行的进程,在许多 API 往返中生成工具调用。没有遥测,您无法看到哪些工具运行、它们花费了多长时间,或会话在哪里停滞。226Agent SDK 代理是长期运行的进程,在许多 API 往返中生成工具调用。没有遥测,您无法看到哪些工具运行、它们花费了多长时间,或会话在哪里停滞。
265 227
277 239
278默认情况下,导出中不包含提示文本和工具输入。查看[控制导出中的敏感数据](/docs/zh-CN/agent-sdk/observability#control-sensitive-data-in-exports)了解选择加入标志,以及[可观测性](/docs/zh-CN/agent-sdk/observability)了解完整的信号目录。240默认情况下,导出中不包含提示文本和工具输入。查看[控制导出中的敏感数据](/docs/zh-CN/agent-sdk/observability#control-sensitive-data-in-exports)了解选择加入标志,以及[可观测性](/docs/zh-CN/agent-sdk/observability)了解完整的信号目录。
279 241
280<h3 id="auth-and-secrets">242### 身份验证和密钥
281 身份验证和密钥
282</h3>
283 243
284托管时有三个身份验证问题很重要:244托管时有三个身份验证问题很重要:
285 245
287* **入站**:在代理容器前面的网关处放置身份验证。代理应接收预先认证的请求,不应是验证用户令牌的组件。247* **入站**:在代理容器前面的网关处放置身份验证。代理应接收预先认证的请求,不应是验证用户令牌的组件。
288* **出站工具**:将工具凭证保留在代理环境之外。通过代理路由出站调用,该代理在请求离开容器后注入 API 密钥。代理进行调用;代理添加凭证。248* **出站工具**:将工具凭证保留在代理环境之外。通过代理路由出站调用,该代理在请求离开容器后注入 API 密钥。代理进行调用;代理添加凭证。
289 249
290<h3 id="scaling-and-concurrency">250### 扩展和并发
291 扩展和并发
292</h3>
293 251
294每个会话在其自己的子进程中运行,因此主机上的并发受其 RAM 可以容纳的子进程数量限制。252每个会话在其自己的子进程中运行,因此主机上的并发受其 RAM 可以容纳的子进程数量限制。
295 253
303 261
304水平扩展路由取决于您的模式。对于长期运行的会话(其中容器保存许多会话),在负载均衡器后面运行容器池,并使用 `sessionId` 上的一致哈希将每个会话固定到一个容器。固定会话继续命中同一容器,因此同一运行的子进程,直到它被驱逐或容器重启。262水平扩展路由取决于您的模式。对于长期运行的会话(其中容器保存许多会话),在负载均衡器后面运行容器池,并使用 `sessionId` 上的一致哈希将每个会话固定到一个容器。固定会话继续命中同一容器,因此同一运行的子进程,直到它被驱逐或容器重启。
305 263
306<h3 id="cost">264### 成本
307 成本
308</h3>
309 265
310Anthropic 令牌成本通常比容器基础设施成本高一个数量级或更多。最小配置的容器运行成本大约为每小时 \$0.05,而单个长代理会话可能花费数美元的令牌。查看[成本跟踪](/docs/zh-CN/agent-sdk/cost-tracking)了解每会话令牌计数。266Anthropic 令牌成本通常比容器基础设施成本高一个数量级或更多。最小配置的容器运行成本大约为每小时 \$0.05,而单个长代理会话可能花费数美元的令牌。查看[成本跟踪](/docs/zh-CN/agent-sdk/cost-tracking)了解每会话令牌计数。
311 267
312<h3 id="multi-tenant-isolation">268### 多租户隔离
313 多租户隔离
314</h3>
315 269
316默认 SDK 行为从文件系统读取设置和 `CLAUDE.md` 内存文件。在为多个租户服务的共享容器中,这些文件可能会将一个租户的上下文泄露到另一个租户的会话中。270默认 SDK 行为从文件系统读取设置和 `CLAUDE.md` 内存文件。在为多个租户服务的共享容器中,这些文件可能会将一个租户的上下文泄露到另一个租户的会话中。
317 271
325 279
326下面的示例将设置、自动内存、配置目录和工作目录选项应用在一起。构造 `tenantDir` 和 `configDir`,以便每个租户获得其他租户无法读取的路径。在 TypeScript 中,`env` 替换子进程环境,因此展开 `...process.env` 以保持继承的变量,如 `PATH` 和 `ANTHROPIC_API_KEY`。在 Python 中,`env` 合并到继承的环境之上。280下面的示例将设置、自动内存、配置目录和工作目录选项应用在一起。构造 `tenantDir` 和 `configDir`,以便每个租户获得其他租户无法读取的路径。在 TypeScript 中,`env` 替换子进程环境,因此展开 `...process.env` 以保持继承的变量,如 `PATH` 和 `ANTHROPIC_API_KEY`。在 Python 中,`env` 合并到继承的环境之上。
327 281
328<CodeGroup>282```typescript TypeScript theme={null}
329 ```typescript TypeScript theme={null}283import { query } from "@anthropic-ai/claude-agent-sdk";
330 import { query } from "@anthropic-ai/claude-agent-sdk";
331 284
332 declare const prompt: string;285declare const prompt: string;
333 declare const tenantDir: string;286declare const tenantDir: string;
334 declare const configDir: string;287declare const configDir: string;
335 288
336 for await (const message of query({289for await (const message of query({
337 prompt,290 prompt,
338 options: {291 options: {
339 cwd: tenantDir,292 cwd: tenantDir,
344 CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",297 CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
345 },298 },
346 },299 },
347 })) {300})) {
348 // ...301 // ...
349 }302}
350 ```303```
351 304
352 ```python Python theme={null}305```python Python theme={null}
353 from claude_agent_sdk import query, ClaudeAgentOptions306from claude_agent_sdk import query, ClaudeAgentOptions
354 import asyncio307import asyncio
355 308
356 prompt: str = ...309prompt: str = ...
357 tenant_dir: str = ...310tenant_dir: str = ...
358 config_dir: str = ...311config_dir: str = ...
359 312
360 313
361 async def main():314async def main():
362 async for message in query(315 async for message in query(
363 prompt=prompt,316 prompt=prompt,
364 options=ClaudeAgentOptions(317 options=ClaudeAgentOptions(
373 ...326 ...
374 327
375 328
376 asyncio.run(main())329asyncio.run(main())
377 ```330```
378</CodeGroup>
379 331
380<h2 id="known-limitations">332## 已知限制
381 已知限制
382</h2>
383 333
384在您的部署设计中规划这些限制。334在您的部署设计中规划这些限制。
385 335
390| 大规模并行子代理扇出可能会触发速率限制 | 将工作分解为较小的批次,而不是发出一个宽范围的调度。 |340| 大规模并行子代理扇出可能会触发速率限制 | 将工作分解为较小的批次,而不是发出一个宽范围的调度。 |
391| 没有每个子代理的挂钟截止时间 | 在其 `AgentDefinition` 中使用 `maxTurns` 限制每个[子代理](/docs/zh-CN/agent-sdk/subagents)。`CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS` 设置一个停滞监视程序,当子代理停止产生输出时触发;它不是总运行时截止时间。 |341| 没有每个子代理的挂钟截止时间 | 在其 `AgentDefinition` 中使用 `maxTurns` 限制每个[子代理](/docs/zh-CN/agent-sdk/subagents)。`CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS` 设置一个停滞监视程序,当子代理停止产生输出时触发;它不是总运行时截止时间。 |
392 342
393<h2 id="troubleshoot-deployment-failures">343## 排查部署失败
394 排查部署失败
395</h2>
396 344
397当在已部署的服务中运行的代理在您的机器上工作正常但在部署后失败时,请使用本部分。下面的每一项都列出了一个失败情况并链接到相应的条目:345当在已部署的服务中运行的代理在您的机器上工作正常但在部署后失败时,请使用本部分。下面的每一项都列出了一个失败情况并链接到相应的条目:
398 346
400* **CLI 在镜像中存在但无法启动**:Claude Code 无法从与容器架构或 libc 不匹配的二进制文件启动,或者从在镜像构建中失去执行权限的文件启动。请参阅 [Failed to start Claude Code](/docs/zh-CN/agent-sdk/troubleshooting#cliconnectionerror-failed-to-start-claude-code)。348* **CLI 在镜像中存在但无法启动**:Claude Code 无法从与容器架构或 libc 不匹配的二进制文件启动,或者从在镜像构建中失去执行权限的文件启动。请参阅 [Failed to start Claude Code](/docs/zh-CN/agent-sdk/troubleshooting#cliconnectionerror-failed-to-start-claude-code)。
401* **Claude Code 进程在运行中途退出**:您的应用程序收到的错误取决于 SDK 语言以及 CLI 是否首先报告了错误结果。[CLI 进程退出](/docs/zh-CN/agent-sdk/troubleshooting#cli-process-exit) 下的条目涵盖了每条消息。349* **Claude Code 进程在运行中途退出**:您的应用程序收到的错误取决于 SDK 语言以及 CLI 是否首先报告了错误结果。[CLI 进程退出](/docs/zh-CN/agent-sdk/troubleshooting#cli-process-exit) 下的条目涵盖了每条消息。
402 350
403<h2 id="next-steps">351## 后续步骤
404 后续步骤
405</h2>
406 352
407* [托管指南](https://github.com/anthropics/claude-cookbooks/blob/main/claude_agent_sdk/07_Hosting_the_agent.ipynb):包含 Docker、Modal 和 Kubernetes 的[可部署代码](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting)的笔记本演练。353* [托管指南](https://github.com/anthropics/claude-cookbooks/blob/main/claude_agent_sdk/07_Hosting_the_agent.ipynb):包含 Docker、Modal 和 Kubernetes 的[可部署代码](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting)的笔记本演练。
408* [会话存储](/docs/zh-CN/agent-sdk/session-storage):使用 `SessionStore` 适配器在主机间持久化记录。354* [会话存储](/docs/zh-CN/agent-sdk/session-storage):使用 `SessionStore` 适配器在主机间持久化记录。