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="Request flow: client to your app, which spawns a claude CLI subprocess over stdio inside the container; the subprocess writes to local disk and calls api.anthropic.com over HTTPS" 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="Request flow: client to your app, which spawns a claude CLI subprocess over stdio inside the container; the subprocess writes to local disk and calls api.anthropic.com over HTTPS" 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 層級如何運作,請參閱[工作階段](/docs/zh-TW/agent-sdk/sessions)。65如需了解工作階段、復原和分支在 API 層級如何運作,請參閱[工作階段](/docs/zh-TW/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### 短暫工作階段
82 短暫工作階段
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-TW/agent-sdk/agent-loop#handle-the-result)以了解錯誤子類型。106指令碼會在每條訊息到達時列印它,包括當任務在轉數限制內完成時 `subtype` 為 `success` 的結果訊息。如果任務改為達到 20 轉限制,結果訊息的 `subtype` 為 `error_max_turns`,且 `query()` 呼叫在產生它後會引發錯誤,因此如果容器需要乾淨地退出,請將迴圈包裝在 try 區塊中。請參閱[處理結果](/docs/zh-TW/agent-sdk/agent-loop#handle-the-result)以了解錯誤子類型。
121 107
122<h3 id="long-running-sessions">108### 長期執行工作階段
123 長期執行工作階段
124</h3>
125 109
126執行持久容器實例,通常每個容器託管多個 SDK 程序,以服務持續進行的工作。最適合採取自主行動、提供內容或處理高容量訊息流的代理。110執行持久容器實例,通常每個容器託管多個 SDK 程序,以服務持續進行的工作。最適合採取自主行動、提供內容或處理高容量訊息流的代理。
127 111
134 118
135調整容器大小,使其能夠在記憶體中保持最大並行工作階段數。119調整容器大小,使其能夠在記憶體中保持最大並行工作階段數。
136 120
137<h3 id="hybrid-sessions">121### 混合工作階段
138 混合工作階段
139</h3>
140 122
141短暫容器,在啟動時從 [`SessionStore`](/docs/zh-TW/agent-sdk/session-storage) 補充,並將更新持久化回去。最適合跨越許多互動但在它們之間處於閒置狀態的工作階段。容器在閒置期間關閉,當使用者返回時重新啟動。123短暫容器,在啟動時從 [`SessionStore`](/docs/zh-TW/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### 多代理容器
190 多代理容器
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-TW/agent-sdk/secure-deployment#isolation-technologies)。189如需自託管選項(例如 Docker、gVisor 和 Firecracker)以及詳細的隔離設定,請參閱[隔離技術](/docs/zh-TW/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 遵循語義版本控制:持續採用修補程式版本,並在採用次要版本之前檢閱 [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 遵循語義版本控制:持續採用修補程式版本,並在採用次要版本之前檢閱 [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 記憶體、5 GiB 磁碟和 1 個 CPU 是新啟動執行個體的合理起點。記憶體使用量會隨著工作階段長度和工具活動而增加,因此應根據您實際需要的工作階段長度和並行性進行調整,而不是根據閒置基準。請參閱[擴展和並行性](#scaling-and-concurrency),了解如何計算每個主機的代理數量。202每個代理的 1 GiB 記憶體、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 的代理平台上執行時對提供者的區域端點的出站 HTTPS。如果您的代理使用 [MCP 伺服器](/docs/zh-TW/agent-sdk/mcp)或外部工具,它們也需要對這些端點的出站存取。在生產環境中,透過出站代理路由出站流量,該代理強制執行網域允許清單、注入認證並記錄請求。請參閱[安全部署](/docs/zh-TW/agent-sdk/secure-deployment)了解完整模式。206SDK 需要對 `api.anthropic.com` 的出站 HTTPS,或在 Amazon Bedrock 或 Google Cloud 的代理平台上執行時對提供者的區域端點的出站 HTTPS。如果您的代理使用 [MCP 伺服器](/docs/zh-TW/agent-sdk/mcp)或外部工具,它們也需要對這些端點的出站存取。在生產環境中,透過出站代理路由出站流量,該代理強制執行網域允許清單、注入認證並記錄請求。請參閱[安全部署](/docs/zh-TW/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-TW/agent-sdk/session-storage)將文字記錄鏡像到持久儲存體。請參閱[參考實作](/docs/zh-TW/agent-sdk/session-storage#reference-implementations)以取得物件存放區、鍵值存放區和資料庫的範例配接器,以及用於您自己實作的一致性測試套件。216預設的本機磁碟在重新啟動、縮減規模或移至不同節點時會遺失。對於使用者期望能繼續進行的任何工作階段,請使用 [`SessionStore` 配接器](/docs/zh-TW/agent-sdk/session-storage)將文字記錄鏡像到持久儲存體。請參閱[參考實作](/docs/zh-TW/agent-sdk/session-storage#reference-implementations)以取得物件存放區、鍵值存放區和資料庫的範例配接器,以及用於您自己實作的一致性測試套件。
253 217
257* **鏡像,而非替代**:子程序先寫入本機磁碟,然後 SDK 將每個批次的副本轉送到存放區。新工作階段的本機文字記錄比執行時間更長;從存放區繼續執行的工作階段會在結束時刪除其本機副本,因此存放區保有唯一的持久副本。請參閱[雙寫入架構](/docs/zh-TW/agent-sdk/session-storage#dual-write-architecture)。221* **鏡像,而非替代**:子程序先寫入本機磁碟,然後 SDK 將每個批次的副本轉送到存放區。新工作階段的本機文字記錄比執行時間更長;從存放區繼續執行的工作階段會在結束時刪除其本機副本,因此存放區保有唯一的持久副本。請參閱[雙寫入架構](/docs/zh-TW/agent-sdk/session-storage#dual-write-architecture)。
258* **`mirror_error` 訊息**:當 SDK 無法將批次傳遞到存放區時,它會捨棄該批次、發出 `{ type: "system", subtype: "mirror_error" }` 訊息,並繼續查詢。如果存放區持久性很重要,請對這些訊息發出警示。請參閱[鏡像寫入是盡力而為](/docs/zh-TW/agent-sdk/session-storage#mirror-writes-are-best-effort)以了解重試和逾時行為。222* **`mirror_error` 訊息**:當 SDK 無法將批次傳遞到存放區時,它會捨棄該批次、發出 `{ type: "system", subtype: "mirror_error" }` 訊息,並繼續查詢。如果存放區持久性很重要,請對這些訊息發出警示。請參閱[鏡像寫入是盡力而為](/docs/zh-TW/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-TW/agent-sdk/observability#control-sensitive-data-in-exports)以取得選擇加入旗標,以及[可觀測性](/docs/zh-TW/agent-sdk/observability)以取得完整的信號目錄。240預設情況下,匯出中不包含提示文字和工具輸入。請參閱[控制匯出中的敏感資料](/docs/zh-TW/agent-sdk/observability#control-sensitive-data-in-exports)以取得選擇加入旗標,以及[可觀測性](/docs/zh-TW/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-TW/agent-sdk/cost-tracking)以進行每個工作階段的權杖計帳。266Anthropic 權杖成本通常主導容器基礎設施成本一個數量級或更多。最小化佈建的容器大約每小時執行 \$0.05,而單一長代理程式工作階段可能花費數美元的權杖。請參閱[成本追蹤](/docs/zh-TW/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-TW/agent-sdk/subagents)。`CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS` 設定一個停滯監視程式,當子代理程式停止產生輸出時觸發;它不是總執行時間截止時間。 |341| 沒有每個子代理程式的牆上時鐘截止時間 | 在其 `AgentDefinition` 中使用 `maxTurns` 限制每個[子代理程式](/docs/zh-TW/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-TW/agent-sdk/troubleshooting#cliconnectionerror-failed-to-start-claude-code)。348* **CLI 存在於映像中但無法啟動**:Claude Code 無法從與容器架構或 libc 不相符的二進位檔案啟動,或從在映像建置中失去執行權限的檔案啟動。請參閱 [Failed to start Claude Code](/docs/zh-TW/agent-sdk/troubleshooting#cliconnectionerror-failed-to-start-claude-code)。
401* **Claude Code 程序在執行中途退出**:您的應用程式收到的錯誤取決於 SDK 語言以及 CLI 是否先報告了錯誤結果。[CLI 程序退出](/docs/zh-TW/agent-sdk/troubleshooting#cli-process-exit) 下的項目涵蓋每條訊息。349* **Claude Code 程序在執行中途退出**:您的應用程式收到的錯誤取決於 SDK 語言以及 CLI 是否先報告了錯誤結果。[CLI 程序退出](/docs/zh-TW/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-TW/agent-sdk/session-storage):使用 `SessionStore` 配接器在主機間保留文字記錄。354* [工作階段儲存](/docs/zh-TW/agent-sdk/session-storage):使用 `SessionStore` 配接器在主機間保留文字記錄。