2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.3> Use this file to discover all available pages before exploring further.
4 4
5# 託管 Agent SDK5# 代理 SDK 的託管
6 6
7> 在生產環境中部署 Agent SDK:子流程架構、會話持久化、擴展、可觀測性和 Docker、Kubernetes 及沙箱提供商的多租戶隔離。7> 在生產環境中部署 Agent SDK:子程序架構、工作階段持久化、擴展、可觀測性,以及針對 Docker、Kubernetes 和沙箱提供者的多租戶隔離。
8 8
9Agent SDK 會生成並監督一個擁有 shell、工作目錄和磁盤上會話文件的 `claude` CLI 子流程。託管它不像託管無狀態 API 包裝器。每個運行的代理都是與本地狀態綁定的長期進程,這決定了您如何分配資源、持久化會話以及跨租戶進行擴展。9Agent SDK 會生成並監督一個 `claude` CLI 子程序,該子程序擁有一個 shell、一個工作目錄和磁碟上的工作階段檔案。託管它不像託管無狀態 API 包裝器。每個執行中的代理都是一個與本地狀態相關聯的長期執行程序,這決定了您如何分配資源、持久化工作階段以及跨租戶進行擴展。
10 10
11本頁涵蓋在您自己的基礎設施上自託管:了解[子流程模型](#the-subprocess-model)、[選擇會話模式](#choose-a-session-pattern)、[配置容器](#provision-the-container)以及[處理生產問題](#handle-production-concerns),如持久化、可觀測性、身份驗證和多租戶隔離。有關可部署的 Dockerfile 和 Kubernetes 清單,請參閱[託管指南](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting)。11本頁涵蓋在您自己的基礎設施上進行自我託管。如需可部署的 Dockerfile 和 Kubernetes 清單,請參閱[託管食譜](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting)。
12 12
13如果您不需要基礎設施控制、自定義隔離或自己的數據平面,請改為考慮[託管代理](https://platform.claude.com/docs/zh-TW/managed-agents/overview):一個託管的 REST API,其中 Anthropic 運行代理和沙箱,因此您的應用程序發送事件並流回結果,無需操作任何託管基礎設施。13如果您不需要基礎設施控制、自訂隔離或您自己的資料平面,請改為考慮[受管代理](https://platform.claude.com/docs/en/managed-agents/overview):一個託管的 REST API,其中 Anthropic 執行代理和沙箱,因此您的應用程式發送事件並流回結果,無需操作任何託管基礎設施。
14
15<Info>
16 如需超越基本沙箱的安全強化(包括網路控制、認證管理和隔離選項),請參閱[安全部署](/zh-TW/agent-sdk/secure-deployment)。
17</Info>
18 14
19<h2 id="the-subprocess-model">15<h2 id="the-subprocess-model">
20 子進程模型16 子程序模型
21</h2>17</h2>
22 18
23此頁面上的每個託管決策都遵循 SDK 如何運行代理的方式。當您的代碼調用 `query()` 時,SDK 會生成一個單獨的 `claude` CLI 進程,並通過 stdio 與其通信。該子進程擁有 shell、工作目錄和本地磁盤上的 JSONL 會話記錄。19此頁面上的每個託管決策都遵循 SDK 如何執行代理的方式。當您的程式碼呼叫 `query()` 時,SDK 會產生一個獨立的 `claude` CLI 子程序,並透過 stdio 與其通訊。該子程序擁有 shell、工作目錄和本機磁碟上的 JSONL 工作階段文字記錄。
20
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" />
24 22
25<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" 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" />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" />
26 24
27一個代理會話映射到一個子進程。運行 N 個並發會話意味著 N 個子進程,每個都有自己的進程樹和記錄文件。默認情況下,它們都繼承您應用程序的工作目錄,因此當會話需要單獨的文件系統時,在每個 `query()` 調用上傳遞 `cwd`:25一個代理工作階段對應一個子程序。執行 N 個並行工作階段意味著 N 個子程序,每個都有自己的程序樹和文字記錄檔案。預設情況下,它們都繼承您應用程式的工作目錄。當工作階段需要獨立的檔案系統時,在每個工作階段的 `query()` 呼叫選項中傳遞不同的 `cwd`:
28 26
29<CodeGroup>27<CodeGroup>
30 ```typescript TypeScript theme={null}28 ```typescript TypeScript theme={null}
31 query({ prompt, options: { cwd: "/work/session-a" } })29 import { query } from "@anthropic-ai/claude-agent-sdk";
30
31 for await (const message of query({
32 prompt: "Summarize the files in this directory",
33 options: { cwd: "/work/session-a" },
34 })) {
35 console.log(message);
36 }
32 ```37 ```
33 38
34 ```python Python theme={null}39 ```python Python theme={null}
35 query(prompt=prompt, options=ClaudeAgentOptions(cwd="/work/session-a"))40 import asyncio
41
42 from claude_agent_sdk import ClaudeAgentOptions, query
43
44
45 async def main():
46 async for message in query(
47 prompt="Summarize the files in this directory",
48 options=ClaudeAgentOptions(cwd="/work/session-a"),
49 ):
50 print(message)
51
52
53 asyncio.run(main())
36 ```54 ```
37</CodeGroup>55</CodeGroup>
38 56
57此頁面上的 TypeScript 範例使用頂層 `await`,因此請將它們儲存為 `.mts` 檔案或在 `package.json` 中設定 `"type": "module"`。
58
39<h3 id="state-that-lives-on-local-disk">59<h3 id="state-that-lives-on-local-disk">
40 存儲在本地磁盤上的狀態60 存放在本機磁碟上的狀態
41</h3>61</h3>
42 62
43三種代理狀態默認存儲在容器的文件系統上。它們都不會在容器重新啟動、縮減或移動到不同節點時存活。63三種代理狀態預設存放在容器的檔案系統上。它們都無法在容器重新啟動、縮減或移至不同節點時存活。
44 64
45| 狀態 | 默認位置 |65| 狀態 | 預設位置 |
46| ---------------- | --------------------------------------------------------------------- |66| ---------------- | --------------------------------------------------------------------- |
47| 會話記錄 | `~/.claude/projects/`,或如果設置了 `CLAUDE_CONFIG_DIR`,則為其下的 `projects/` 目錄 |67| 工作階段文字記錄 | `~/.claude/projects/`,或如果設定了 `CLAUDE_CONFIG_DIR`,則為其下的 `projects/` 目錄 |
48| `CLAUDE.md` 內存文件 | 用戶層級的 `~/.claude/CLAUDE.md` 和項目層級的會話工作目錄 |68| `CLAUDE.md` 記憶檔案 | 使用者層級的 `~/.claude/CLAUDE.md` 和專案層級的工作階段工作目錄 |
49| 工作目錄工件 | 會話的工作目錄 |69| 工作目錄成品 | 工作階段的工作目錄 |
50 70
51要在主機之間持久化記錄,請配置 [`SessionStore` 適配器](/zh-TW/agent-sdk/session-storage)。內存文件和其他工作目錄工件需要自己的存儲策略,例如掛載卷或對象存儲同步。71若要在主機之間保留文字記錄,請設定 [`SessionStore` 配接器](/docs/zh-TW/agent-sdk/session-storage)。記憶檔案和其他工作目錄成品需要自己的儲存策略,例如掛載的磁碟區或物件存放區同步。
52 72
53有關會話、恢復和分叉在 API 級別如何工作的信息,請參閱 [Sessions](/zh-TW/agent-sdk/sessions)。73如需了解工作階段、復原和分支在 API 層級如何運作,請參閱[工作階段](/docs/zh-TW/agent-sdk/sessions)。
54 74
55<h2 id="choose-a-session-pattern">75<h2 id="choose-a-session-pattern">
56 選擇會話模式76 選擇工作階段模式
57</h2>77</h2>
58 78
59這四種模式涵蓋會話生命週期:容器相對於其服務的會話存在多長時間。關於容器運行的位置,[託管食譜](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。在此選擇會話模式,並從食譜中選擇部署目標。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。在此選擇工作階段模式,並從食譜中選擇部署目標。
60 80
61<h3 id="ephemeral-sessions">81<h3 id="ephemeral-sessions">
62 臨時會話82 短暫工作階段
63</h3>83</h3>
64 84
65為每個用戶任務創建一個容器,並在任務完成時銷毀它。最適合一次性任務。用戶可能仍然可以在任務完成時與 AI 互動,但一旦完成,容器就會被銷毀。85為每個使用者任務建立一個容器,並在任務完成時銷毀它。最適合一次性任務。使用者仍然可以在任務完成時與 AI 互動,但一旦完成,容器就會被銷毀。
66 86
67示例工作負載包括錯誤調查和修復、發票和收據提取、文檔翻譯和媒體轉換。87範例工作負載包括錯誤調查和修復、發票和收據提取、文件翻譯和媒體轉換。
68 88
69容器運行一個一次性入口點,該入口點調用 SDK 並退出。下面的示例顯示了一個最小的 TypeScript 版本。將其保存為 `entrypoint.mts` 或在 `package.json` 中設置 `"type": "module"`,以便頂級 `await` 可用。89容器執行一個一次性進入點,從 `TASK_PROMPT` 環境變數讀取任務,呼叫 SDK,然後退出。
70 90
71```typescript theme={null}91<CodeGroup>
72import { query } from "@anthropic-ai/claude-agent-sdk";92 ```typescript TypeScript theme={null}
93 import { query } from "@anthropic-ai/claude-agent-sdk";
73 94
74const prompt = process.env.TASK_PROMPT!;95 const prompt = process.env.TASK_PROMPT!;
75for await (const message of query({ prompt, options: { maxTurns: 20 } })) {96 for await (const message of query({ prompt, options: { maxTurns: 20 } })) {
76 console.log(message);97 console.log(message);
77}98 }
78```99 ```
100
101 ```python Python theme={null}
102 import asyncio
103 import os
104
105 from claude_agent_sdk import ClaudeAgentOptions, query
106
107
108 async def main():
109 async for message in query(
110 prompt=os.environ["TASK_PROMPT"],
111 options=ClaudeAgentOptions(max_turns=20),
112 ):
113 print(message)
114
115
116 asyncio.run(main())
117 ```
118</CodeGroup>
119
120指令碼會在每條訊息到達時列印它,包括當任務在轉數限制內完成時 `subtype` 為 `success` 的結果訊息。如果任務改為達到 20 轉限制,結果訊息的 `subtype` 為 `error_max_turns`,且 `query()` 呼叫在產生它後會引發錯誤,因此如果容器需要乾淨地退出,請將迴圈包裝在 try 區塊中。請參閱[處理結果](/docs/zh-TW/agent-sdk/agent-loop#handle-the-result)以了解錯誤子類型。
79 121
80<h3 id="long-running-sessions">122<h3 id="long-running-sessions">
81 長時間運行的會話123 長期執行工作階段
82</h3>124</h3>
83 125
84運行持久容器實例,通常在每個容器中託管多個 SDK 進程,以服務持續的工作。最適合採取自主行動、提供內容或處理高容量消息流的代理。126執行持久容器實例,通常每個容器託管多個 SDK 程序,以服務持續進行的工作。最適合採取自主行動、提供內容或處理高容量訊息流的代理。
85 127
86示例工作負載包括對傳入郵件進行分類和回應的電子郵件代理、通過容器端口託管每個用戶可編輯網站的網站構建器,以及處理來自 Slack 等平台的持續流量的聊天機器人。128範例工作負載包括對傳入郵件進行分類和回應的電子郵件代理、透過容器連接埠託管每個使用者可編輯網站的網站建構器,以及處理來自 Slack 等平台的持續流量的聊天機器人。
87 129
88容器公開 HTTP 或 WebSocket 端點,並將每個活動會話映射到長期查詢及其背後的子進程。在 TypeScript 中,使用 [`streamInput()`](/zh-TW/agent-sdk/typescript#query-object) 向活動會話添加轉換,並使用 [`startup()`](/zh-TW/agent-sdk/typescript#startup) 在傳入流量之前預熱子進程。在 Python 中,使用 [`ClaudeSDKClient`](/zh-TW/agent-sdk/python#claudesdkclient) 在多個轉換中保持會話打開。調整容器大小,使其能夠在內存中保持最大數量的並發會話。130容器公開 HTTP 或 WebSocket 端點,並將每個活躍工作階段對應到長期執行的查詢及其背後的子程序。在 TypeScript 中,使用 [`streamInput()`](/docs/zh-TW/agent-sdk/typescript#query-object) 將轉數新增到活躍工作階段,並使用 [`startup()`](/docs/zh-TW/agent-sdk/typescript#startup) 在傳入流量前預熱子程序。在 Python 中,使用 [`ClaudeSDKClient`](/docs/zh-TW/agent-sdk/python#claudesdkclient) 在轉數間保持工作階段開啟。調整容器大小,使其能夠在記憶體中保持最大並行工作階段數。
89 131
90<h3 id="hybrid-sessions">132<h3 id="hybrid-sessions">
91 混合會話133 混合工作階段
92</h3>134</h3>
93 135
94臨時容器在啟動時從 [`SessionStore`](/zh-TW/agent-sdk/session-storage) 進行補充,並將更新持久化回去。最適合跨越許多交互但在交互之間處於空閒狀態的會話。容器在空閒期間關閉,當用戶返回時重新啟動。136短暫容器,在啟動時從 [`SessionStore`](/docs/zh-TW/agent-sdk/session-storage) 補充,並將更新持久化回去。最適合跨越許多互動但在它們之間處於閒置狀態的工作階段。容器在閒置期間關閉,當使用者返回時重新啟動。
95 137
96示例工作負載包括具有間歇性檢查的個人項目管理器、暫停和恢復數小時的深度研究,以及在交互中加載票證歷史記錄的客戶支持代理。138範例工作負載包括具有間歇性檢查的個人專案管理器、在數小時內暫停和繼續的深度研究,以及在互動間加載票證歷史記錄的客戶支援代理。
97 139
98根據您期望用戶返回的頻率調整提供商的空閒超時。在沒有配置 `SessionStore` 的情況下關閉容器會丟失其轉錄,因此存儲對於此模式是必需的,而不是可選的。140根據您預期使用者返回的頻率調整您提供者的閒置逾時。在沒有配置 `SessionStore` 的情況下關閉容器會遺失其轉錄,因此存放區對於此模式是必需的,而不是可選的。
99 141
100該模式的關鍵在於通過 ID 恢復會話,並附加共享存儲:142該模式取決於透過 ID 使用附加的共享存放區繼續工作階段:
101 143
102<CodeGroup>144<CodeGroup>
103 ```typescript TypeScript theme={null}145 ```typescript TypeScript theme={null}
116 ```158 ```
117 159
118 ```python Python theme={null}160 ```python Python theme={null}
119 from claude_agent_sdk import query, ClaudeAgentOptions161 from claude_agent_sdk import query, ClaudeAgentOptions, SessionStore
162 import asyncio
163
164 user_input: str = ...
165 session_id: str = ... # looked up from your database by user
166 session_store: SessionStore = ... # S3, Redis, Postgres, or your own adapter
120 167
168
169 async def main():
121 async for message in query(170 async for message in query(
122 prompt=user_input,171 prompt=user_input,
123 options=ClaudeAgentOptions(172 options=ClaudeAgentOptions(
124 resume=session_id, # looked up from your database by user173 resume=session_id,
125 session_store=session_store, # S3, Redis, Postgres, or your own adapter174 session_store=session_store,
126 ),175 ),
127 ):176 ):
128 ...177 ...
178
179
180 asyncio.run(main())
129 ```181 ```
130</CodeGroup>182</CodeGroup>
131 183
132有關完整的 `SessionStore` 接口和參考適配器,請參閱[會話存儲](/zh-TW/agent-sdk/session-storage)。
133
134<h3 id="multi-agent-container">184<h3 id="multi-agent-container">
135 多代理容器185 多代理容器
136</h3>186</h3>
137 187
138在一個容器內運行多個 SDK 子進程。最適合必須密切協作的代理,例如多代理模擬,其中代理在共享環境中相互交互。188在一個容器內執行多個 SDK 子程序。最適合必須密切協作的代理,例如多代理模擬,其中代理在共享環境中彼此互動。
139 189
140為每個代理提供自己的工作目錄,以便它們不會相互覆蓋文件,並隔離設置加載,以便每個代理的 `CLAUDE.md` 文件不會洩露到其他代理。有關特定選項,請參閱[多租戶隔離](#multi-tenant-isolation)。190為每個代理提供自己的工作目錄,以便它們不會覆蓋彼此的檔案,並隔離設定加載,以便每個代理的 `CLAUDE.md` 檔案不會洩漏到其他代理。請參閱[多租戶隔離](#multi-tenant-isolation)以了解特定選項。
141 191
142<h2 id="provision-the-container">192<h2 id="provision-the-container">
143 配置容器193 佈建容器
144</h2>194</h2>
145 195
146<h3 id="container-based-sandboxing">196<h3 id="container-based-sandboxing">
147 基於容器的沙箱197 容器型沙箱
148</h3>198</h3>
149 199
150在沙箱容器內運行 SDK,以實現進程隔離、資源限制、網絡控制和臨時文件系統。多個提供商專門提供適合 Agent SDK 模型的沙箱容器環境。200在沙箱容器內執行 SDK,以實現程序隔離、資源限制、網路控制和暫時性檔案系統。
151
152選擇提供商時要回答的問題:
153 201
154* **誰運行沙箱**:沙箱即服務提供商為您運營基礎設施,而自託管選項則提供您可在自己的基礎設施上運行的軟體。202選擇提供者時需要回答的問題:
155* **冷啟動延遲**:從「創建沙箱」到「準備好接受第一個請求」需要多長時間。臨時模式需要亞秒級啟動。長期運行模式可以容忍更長的延遲。
156* **持久存儲**:提供商是否提供持久卷或僅提供臨時磁盤。混合模式需要在沙箱內或沙箱旁邊的某處進行持久存儲。
157* **定價模型**:按秒、按請求或按小時固定計費。按秒計費適合突發性臨時工作負載。按小時計費適合長期運行的會話。
158* **網絡**:支持自定義出站規則、出站代理和私有 VPC 對等互連,用於受管制的環境。
159 203
160要評估的提供商:204* **誰執行沙箱**:沙箱即服務提供者為您操作基礎設施,而自託管選項則提供軟體供您在自己的環境中執行。
205* **冷啟動延遲**:從「建立沙箱」到「準備好接受第一個請求」需要多長時間。暫時性模式需要次秒級啟動。長期執行模式可以容忍更長的延遲。
206* **持久儲存**:提供者是否提供耐久磁碟區或僅提供暫時性磁碟。混合模式需要在沙箱內或沙箱旁邊的某處進行耐久儲存。
207* **定價模式**:按秒、按請求或按小時固定計費。按秒定價適合突發性暫時性工作負載。按小時定價適合長期執行的工作階段。
208* **網路**:支援自訂出站規則、出站代理和私有 VPC 對等互連,適用於受管制的環境。
161 209
162* [Modal Sandbox](https://modal.com/docs/guide/sandbox),附帶[演示實現](https://modal.com/docs/examples/claude-slack-gif-creator)210如需自託管選項(例如 Docker、gVisor 和 Firecracker)以及詳細的隔離設定,請參閱[隔離技術](/docs/zh-TW/agent-sdk/secure-deployment#isolation-technologies)。
163* [Cloudflare Sandboxes](https://github.com/cloudflare/sandbox-sdk)
164* [Daytona](https://www.daytona.io/)
165* [E2B](https://e2b.dev/)
166* [Fly Machines](https://fly.io/docs/machines/)
167* [Vercel Sandbox](https://vercel.com/docs/functions/sandbox)
168
169有關自託管選項(如 Docker、gVisor 和 Firecracker)以及詳細的隔離配置,請參閱[隔離技術](/zh-TW/agent-sdk/secure-deployment#isolation-technologies)。
170 211
171<h3 id="runtime-dependencies">212<h3 id="runtime-dependencies">
172 運行時依賴項213 執行時相依性
173</h3>214</h3>
174 215
175容器只需要您的 SDK 的語言運行時:216容器需要您的 SDK 的語言執行時:
176 217
177* Python SDK 需要 Python 3.10+,或 TypeScript SDK 需要 Node.js 18+218* Python SDK 需要 Python 3.10+,或 TypeScript SDK 需要 Node.js 18+
178* 兩個 SDK 套件都為主機平台捆綁了本機 Claude Code 二進制文件,因此不需要為生成的 CLI 單獨安裝 Claude Code 或 Node.js219* TypeScript 和 Python SDK 都為大多數安裝捆綁了原生 Claude Code 二進位檔,生成的 CLI 不需要單獨的 Node.js 安裝。請參閱[快速入門的安裝說明](/docs/zh-TW/agent-sdk/quickstart),了解需要單獨原生 Claude Code 安裝的安裝方式。
179 220
180捆綁的二進制文件被固定到 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) 更改日誌。221捆綁的二進位檔會固定到 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) 變更日誌。
181 222
182<h3 id="resources">223<h3 id="resources">
183 資源224 資源
184</h3>225</h3>
185 226
186每個代理的 1 GiB RAM、5 GiB 磁盤和 1 個 CPU 是新啟動實例的合理起點。內存使用量隨著會話長度和工具活動而增長,因此應根據您實際需要的會話長度和並發性進行調整,而不是根據空閒基線。有關如何計算每個主機的代理數量,請參閱[擴展和並發](#scaling-and-concurrency)。227每個代理的 1 GiB 記憶體、5 GiB 磁碟和 1 個 CPU 是新啟動執行個體的合理起點。記憶體使用量會隨著工作階段長度和工具活動而增加,因此應根據您實際需要的工作階段長度和並行性進行調整,而不是根據閒置基準。請參閱[擴展和並行性](#scaling-and-concurrency),了解如何計算每個主機的代理數量。
187 228
188<h3 id="network">229<h3 id="network">
189 網絡230 網路
190</h3>231</h3>
191 232
192SDK 需要對 `api.anthropic.com` 的出站 HTTPS,或在 Amazon Bedrock 或 Google Cloud 的 Agent Platform 上運行時對您提供商的區域端點的出站 HTTPS。如果您的代理使用 [MCP servers](/zh-TW/agent-sdk/mcp) 或外部工具,它們還需要對這些端點的出站訪問。對於生產環境,通過強制執行域名允許列表、注入憑證和記錄請求的出站代理路由出站流量。有關完整模式,請參閱[安全部署](/zh-TW/agent-sdk/secure-deployment)。233SDK 需要對 `api.anthropic.com` 的出站 HTTPS,或在 Amazon Bedrock 或 Google Cloud 的代理平台上執行時對提供者的區域端點的出站 HTTPS。如果您的代理使用 [MCP 伺服器](/docs/zh-TW/agent-sdk/mcp)或外部工具,它們也需要對這些端點的出站存取。在生產環境中,透過出站代理路由出站流量,該代理強制執行網域允許清單、注入認證並記錄請求。請參閱[安全部署](/docs/zh-TW/agent-sdk/secure-deployment)了解完整模式。
193 234
194對於入站流量,在容器上公開 HTTP 或 WebSocket 端口。您的應用程式在該端口上處理客戶端請求並在內部調用 SDK;子進程本身不在網絡上監聽。235對於入站流量,在容器上公開 HTTP 或 WebSocket 連接埠。您的應用程式在該連接埠上處理用戶端請求並在內部呼叫 SDK;子程序本身不在網路上接聽。
195 236
196<h2 id="handle-production-concerns">237<h2 id="handle-production-concerns">
197 處理生產環境問題238 處理生產環境的考量
198</h2>239</h2>
199 240
200在部署自託管代理之前,請完成這些決策。241在部署自託管代理程式之前,請先完成這些決策。
201 242
202<h3 id="session-and-state-persistence">243<h3 id="session-and-state-persistence">
203 會話和狀態持久化244 工作階段和狀態持久化
204</h3>245</h3>
205 246
206預設本地磁碟在重新啟動、縮減或移至不同節點時會遺失。對於任何使用者期望恢復的會話,使用 [`SessionStore` 適配器](/zh-TW/agent-sdk/session-storage)將文字記錄鏡像到持久儲存。請參閱[參考實現](/zh-TW/agent-sdk/session-storage#reference-implementations)以了解 S3、Redis 和 Postgres 適配器,以及用於您自己實現的一致性測試套件。247預設的本機磁碟在重新啟動、縮減規模或移至不同節點時會遺失。對於使用者期望能繼續進行的任何工作階段,請使用 [`SessionStore` 配接器](/docs/zh-TW/agent-sdk/session-storage)將文字記錄鏡像到持久儲存體。請參閱[參考實作](/docs/zh-TW/agent-sdk/session-storage#reference-implementations)以取得 S3、Redis 和 Postgres 配接器,以及用於您自己實作的一致性測試套件。
207 248
208關於 `SessionStore` 行為,有三件事需要了解:249關於 `SessionStore` 的行為方式,有三件事需要了解:
209 250
210* **僅文字記錄**:`SessionStore` 鏡像文字記錄,而不是 `CLAUDE.md` 記憶檔案或其他工作目錄工件。掛載共享磁碟區或分別同步這些檔案。251* **僅限文字記錄**:`SessionStore` 鏡像文字記錄,而不是 `CLAUDE.md` 記憶檔案或其他工作目錄成品。請掛載共用磁碟區或分別同步這些檔案。
211* **鏡像,而非替換**:子程序首先寫入本地磁碟,然後存儲接收每個批次的副本。本地寫入保持權威性。252* **鏡像,而非替代**:子程序先寫入本機磁碟,然後 SDK 將每個批次的副本轉送到存放區。新工作階段的本機文字記錄比執行時間更長;從存放區繼續執行的工作階段會在結束時刪除其本機副本,因此存放區保有唯一的持久副本。請參閱[雙寫入架構](/docs/zh-TW/agent-sdk/session-storage#dual-write-architecture)。
212* **`mirror_error` 訊息**:存儲拒絕的批次最多會重新發送三次,每次重試前有短暫的退避;逾時的呼叫不會重試。如果批次仍然失敗,SDK 會捨棄它、發出 `{ type: "system", subtype: "mirror_error" }` 訊息,並繼續查詢。如果存儲持久性很重要,請對這些進行警報。253* **`mirror_error` 訊息**:當 SDK 無法將批次傳遞到存放區時,它會捨棄該批次、發出 `{ type: "system", subtype: "mirror_error" }` 訊息,並繼續查詢。如果存放區持久性很重要,請對這些訊息發出警示。請參閱[鏡像寫入是盡力而為](/docs/zh-TW/agent-sdk/session-storage#mirror-writes-are-best-effort)以了解重試和逾時行為。
213 254
214<h3 id="observability">255<h3 id="observability">
215 可觀測性256 可觀測性
216</h3>257</h3>
217 258
218Agent SDK 代理是長期運行的程序,在許多 API 往返中生成工具呼叫。沒有遙測,您無法看到哪些工具運行、它們花費了多長時間或會話在何處停滯。259Agent SDK 代理程式是長期執行的程序,會在許多 API 往返中產生工具呼叫。沒有遙測,您無法看到哪些工具執行了、執行時間有多長,或工作階段在何處停滯。
219 260
220SDK 從環境繼承 OpenTelemetry 配置。在容器或編排器級別設定 OTEL 環境變數,以便每個 `query()` 呼叫都將跨度、指標和日誌事件匯出到您的收集器。下面的範例為所有三個信號啟用 OTLP 匯出。`CLAUDE_CODE_ENHANCED_TELEMETRY_BETA` 僅對跟蹤是必需的;如果您僅匯出指標和日誌,請省略它。261SDK 從環境繼承 OpenTelemetry 設定。在容器或協調器層級設定 OTEL 環境變數,以便每個 `query()` 呼叫都將跨度、指標和日誌事件匯出到您的收集器。下面的範例為所有三個信號啟用 OTLP 匯出。`CLAUDE_CODE_ENHANCED_TELEMETRY_BETA` 僅對追蹤是必需的;如果您只匯出指標和日誌,請省略它。
221 262
222```bash title=".env' theme={null}263```bash title=".env" theme={null}
223CLAUDE_CODE_ENABLE_TELEMETRY=1264CLAUDE_CODE_ENABLE_TELEMETRY=1
224CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1265CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1
225OTEL_TRACES_EXPORTER=otlp266OTEL_TRACES_EXPORTER=otlp
229OTEL_EXPORTER_OTLP_ENDPOINT=http://collector.example.com:4318270OTEL_EXPORTER_OTLP_ENDPOINT=http://collector.example.com:4318
230```271```
231 272
232預設情況下,匯出中不包含提示文字和工具輸入。請參閱[控制匯出中的敏感資料](/zh-TW/agent-sdk/observability#control-sensitive-data-in-exports)以了解選擇加入標誌,以及[可觀測性](/zh-TW/agent-sdk/observability)以了解完整的信號目錄。273預設情況下,匯出中不包含提示文字和工具輸入。請參閱[控制匯出中的敏感資料](/docs/zh-TW/agent-sdk/observability#control-sensitive-data-in-exports)以取得選擇加入旗標,以及[可觀測性](/docs/zh-TW/agent-sdk/observability)以取得完整的信號目錄。
233 274
234<h3 id="auth-and-secrets">275<h3 id="auth-and-secrets">
235 驗證和祕密276 驗證和密鑰
236</h3>277</h3>
237 278
238託管時有三個驗證問題很重要:279在託管時,有三個驗證考量很重要:
239 280
240* **Anthropic API**:子程序從其環境讀取 `ANTHROPIC_API_KEY`。從您的祕密管理器提供它,或設定 `ANTHROPIC_BASE_URL` 以透過在容器外注入金鑰的代理路由模型呼叫。請參閱[認證管理](/zh-TW/agent-sdk/secure-deployment#credential-management)以了解代理模式,以及[SDK 概述](/zh-TW/agent-sdk/overview#get-started)以了解支援的驗證方法。281* **Anthropic API**:子程序從其環境讀取 `ANTHROPIC_API_KEY`。從您的密鑰管理員提供它,或設定 `ANTHROPIC_BASE_URL` 以透過在容器外注入金鑰的代理路由模型呼叫。請參閱[認證管理](/docs/zh-TW/agent-sdk/secure-deployment#credential-management)以了解代理模式,以及 [SDK 快速入門中的設定](/docs/zh-TW/agent-sdk/quickstart#setup)以了解支援的驗證方法。
241* **入站**:在代理容器前面的閘道處放置驗證。代理應接收預先驗證的請求,不應是驗證使用者令牌的元件。282* **入站**:在代理程式容器前面的閘道放置驗證。代理程式應接收預先驗證的請求,不應是驗證使用者權杖的元件。
242* **出站工具**:將工具認證保留在代理環境之外。透過在請求離開容器後注入 API 金鑰的代理路由出站呼叫。代理進行呼叫;代理添加認證。283* **出站工具**:將工具認證保留在代理程式環境之外。透過在請求離開容器後注入 API 金鑰的代理路由出站呼叫。代理程式進行呼叫;代理新增認證。
243 284
244<h3 id="scaling-and-concurrency">285<h3 id="scaling-and-concurrency">
245 縮放和並行286 縮放和並行
246</h3>287</h3>
247 288
248每個會話在其自己的子程序中運行,因此主機上的並行受其 RAM 可以容納多少個子程序的限制。289每個工作階段在其自己的子程序中執行,因此主機上的並行受限於其 RAM 可以容納多少個子程序。
249 290
250使用此公式調整每個主機的大小:291使用此公式調整每個主機的大小:
251 292
253agents per host = (host RAM - overhead) / (per-session RAM ceiling)294agents per host = (host RAM - overhead) / (per-session RAM ceiling)
254```295```
255 296
256透過在您的目標長度下運行代表性會話並在預期的工具負載下記錄峰值 RSS 來測量每個會話的上限。[資源](#resources)中的 1 GiB 起點是下限,而不是上限。297透過執行代表性工作階段至您的目標長度(在您預期的工具負載下)並記錄峰值 RSS 來測量每個工作階段的上限。[資源](#resources)中的 1 GiB 起點是下限,而非上限。
257
258水平縮放路由取決於您的模式。對於長時間運行的會話,其中容器保持許多會話,在負載平衡器後面運行容器池,並使用 `sessionId` 上的一致性雜湊將每個會話固定到一個容器。固定的會話會持續命中同一容器,因此會命中同一運行中的子程序,直到它被驅逐或容器重新啟動。
259 298
260來自單個會話的大量並行[子代理](/zh-TW/agent-sdk/subagents)可能會達到 API 速率限制。將工作分解為較小的批次,而不是發出一個寬廣的調度。299水平縮放路由取決於您的模式。對於長期執行的工作階段(其中容器保有許多工作階段),在負載平衡器後面執行容器池,並使用 `sessionId` 上的一致雜湊將每個工作階段固定到一個容器。固定的工作階段會持續命中同一個容器,因此會命中同一個執行中的子程序,直到它被驅逐或容器重新啟動。
261 300
262<h3 id="cost">301<h3 id="cost">
263 成本302 成本
264</h3>303</h3>
265 304
266Anthropic 令牌成本通常主導容器基礎設施成本一個數量級或更多。最小配置的容器大約每小時運行 \$0.05,而單個長代理會話可能花費數美元的令牌。請參閱[成本追蹤](/zh-TW/agent-sdk/cost-tracking)以了解每個會話的令牌計帳。305Anthropic 權杖成本通常主導容器基礎設施成本一個數量級或更多。最小化佈建的容器大約每小時執行 \$0.05,而單一長代理程式工作階段可能花費數美元的權杖。請參閱[成本追蹤](/docs/zh-TW/agent-sdk/cost-tracking)以進行每個工作階段的權杖計帳。
267 306
268<h3 id="multi-tenant-isolation">307<h3 id="multi-tenant-isolation">
269 多租戶隔離308 多租戶隔離
270</h3>309</h3>
271 310
272預設 SDK 行為從檔案系統讀取設定和 `CLAUDE.md` 記憶檔案。在為多個租戶提供服務的共享容器中,這些檔案可能會將一個租戶的上下文洩露到另一個租戶的會話中。311預設 SDK 行為從檔案系統讀取設定和 `CLAUDE.md` 記憶檔案。在為多個租戶提供服務的共用容器中,這些檔案可能會將一個租戶的內容洩漏到另一個租戶的工作階段中。
273 312
274要在共享容器內隔離租戶:313若要隔離共用容器內的租戶:
275 314
276* 在 TypeScript 中傳遞 `settingSources: []` 或在 Python 中傳遞 `setting_sources=[]`,以便不載入檔案系統設定。315* 在 TypeScript 中傳遞 `settingSources: []` 或在 Python 中傳遞 `setting_sources=[]` 以跳過使用者、專案和本機設定。
277* 在 `env` 中設定 `CLAUDE_CODE_DISABLE_AUTO_MEMORY=1`。[自動記憶](/zh-TW/memory#auto-memory)在 `~/.claude/projects/<project>/memory/` 載入系統提示,無論 `settingSources` 如何。請參閱[settingSources 不控制的內容](/zh-TW/agent-sdk/claude-code-features#what-settingsources-does-not-control)以了解無條件載入的其他輸入。316* 在 `env` 中設定 `CLAUDE_CODE_DISABLE_AUTO_MEMORY=1`。[自動記憶](/docs/zh-TW/memory#auto-memory)位於 `~/.claude/projects/<project>/memory/` 會載入系統提示,無論 `settingSources` 為何。請參閱 [settingSources 不控制的內容](/docs/zh-TW/agent-sdk/claude-code-features#what-settingsources-does-not-control)以了解無條件載入的其他輸入。
278* 將 `CLAUDE_CONFIG_DIR` 指向每個租戶目錄,以便租戶不共享 `~/.claude.json` 全域配置。317* 將 `CLAUDE_CONFIG_DIR` 指向每個租戶目錄,以便租戶不共用 `~/.claude.json` 全域設定。當每個設定目錄提供一個工作目錄,且您不在租戶間共用 [`SessionStore`](/docs/zh-TW/agent-sdk/session-storage) 時,您也可以在 `env` 中設定 [`CLAUDE_CODE_PROJECT_DIR_NAME`](/docs/zh-TW/sessions#name-the-project-directory-yourself) 以保持其下的文字記錄路徑簡短。需要 TypeScript Agent SDK v0.3.234 或更新版本,或 Python Agent SDK v0.2.140 或更新版本。
279* 使用每個租戶的工作目錄。在每個 `query()` 呼叫上明確傳遞 `cwd`。318* 使用每個租戶的工作目錄。在每個 `query()` 呼叫上明確傳遞 `cwd`。
280* 在您的代理處應用每個租戶的出站規則,例如不同的出站 IP、認證或網域允許清單,以便受損的租戶無法透過另一個租戶的出站原則進行資料外洩。319* 在您的代理應用每個租戶的出站規則,例如不同的出站 IP、認證或網域允許清單,以便受損的租戶無法透過另一個租戶的出站原則進行資料外洩。
281 320
282下面的範例將四個 SDK 級別的選項應用在一起。構造 `tenantDir` 和 `configDir`,以便每個租戶獲得其他租戶無法讀取的路徑。在 TypeScript 中,`env` 替換子程序環境,因此展開 `...process.env` 以保留繼承的變數,如 `PATH` 和 `ANTHROPIC_API_KEY`。在 Python 中,`env` 合併在繼承的環境之上。321下面的範例一起應用設定、自動記憶、設定目錄和工作目錄選項。建構 `tenantDir` 和 `configDir`,以便每個租戶取得沒有其他租戶可以讀取的路徑。在 TypeScript 中,`env` 替代子程序環境,因此展開 `...process.env` 以保留繼承的變數,例如 `PATH` 和 `ANTHROPIC_API_KEY`。在 Python 中,`env` 會合併到繼承的環境之上。
283 322
284<CodeGroup>323<CodeGroup>
285 ```typescript TypeScript theme={null}324 ```typescript TypeScript theme={null}
307 346
308 ```python Python theme={null}347 ```python Python theme={null}
309 from claude_agent_sdk import query, ClaudeAgentOptions348 from claude_agent_sdk import query, ClaudeAgentOptions
349 import asyncio
310 350
351 prompt: str = ...
352 tenant_dir: str = ...
353 config_dir: str = ...
354
355
356 async def main():
311 async for message in query(357 async for message in query(
312 prompt=prompt,358 prompt=prompt,
313 options=ClaudeAgentOptions(359 options=ClaudeAgentOptions(
320 ),366 ),
321 ):367 ):
322 ...368 ...
369
370
371 asyncio.run(main())
323 ```372 ```
324</CodeGroup>373</CodeGroup>
325 374
326如需每個租戶的網路控制,請參閱[安全部署](/zh-TW/agent-sdk/secure-deployment)。
327
328<h2 id="known-limitations">375<h2 id="known-limitations">
329 已知限制376 已知限制
330</h2>377</h2>
331 378
332在您的部署設計中規劃這些限制。379在您的部署設計中規劃這些限制。
333 380
334| 限制 | 解決方案 |381| 限制 | 處理方式 |
335| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |382| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
336| 沒有頂級會話超時 | 會話不會自動超時。在 `Options` 中設置 `maxTurns` 以限制代理在停止前進行多少次工具使用往返。 |383| 沒有頂層工作階段逾時 | 工作階段不會自動逾時。在 TypeScript 中設定 `maxTurns` 或在 Python 中設定 `max_turns`,以限制代理程式在停止前進行多少次工具使用往返。 |
337| 長會話期間的記憶體增長 | 限制會話長度或定期回收子流程。請參閱 [Scaling and concurrency](#scaling-and-concurrency)。 |384| 長工作階段中的記憶體成長 | 限制工作階段長度或定期回收子程序。請參閱[擴展和並行](#scaling-and-concurrency)。 |
338| 大規模並行子代理扇出可能會觸發速率限制 | 將工作分解為較小的批次,而不是發出一次寬泛的調度。 |385| 大規模平行子代理程式展開可能會觸及速率限制 | 將工作分成較小的批次,而不是發出一次寬廣的分派。 |
339| 沒有每個子代理的牆鐘截止時間 | 使用 `AgentDefinition` 中的 `maxTurns` 限制每個 [subagent](/zh-TW/agent-sdk/subagents)。僅對於後台子代理,`CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS` 設置一個停滯監視程序,當 `run_in_background` 子代理停止產生輸出時觸發;它不是總運行時間截止時間。 |386| 沒有每個子代理程式的牆上時鐘截止時間 | 在其 `AgentDefinition` 中使用 `maxTurns` 限制每個[子代理程式](/docs/zh-TW/agent-sdk/subagents)。`CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS` 設定一個停滯監視程式,當子代理程式停止產生輸出時觸發;它不是總執行時間截止時間。 |
387
388<h2 id="troubleshoot-deployment-failures">
389 排除部署失敗
390</h2>
391
392當在已部署的服務中執行的代理程式在您的機器上運作正常但失敗時,請使用本節。下面的每一項都列出一個失敗情況並連結到涵蓋該情況的項目:
393
394* **服務啟動時找不到 CLI**:在 Python 中,容器或服務管理員使用與您的 shell 不同的 `PATH` 來執行您的應用程式,因此在本機運作的安裝對該程序不可見。在 TypeScript 中,映像建置跳過了 SDK 的選用相依性,或 `pathToClaudeCodeExecutable` 指向映像中不存在的檔案。請參閱 [Claude Code not found](/docs/zh-TW/agent-sdk/troubleshooting#clinotfounderror-claude-code-not-found)。
395* **CLI 存在於映像中但無法啟動**:Claude Code 無法從與容器架構或 libc 不相符的二進位檔案啟動,或從在映像建置中失去執行權限的檔案啟動。請參閱 [Failed to start Claude Code](/docs/zh-TW/agent-sdk/troubleshooting#cliconnectionerror-failed-to-start-claude-code)。
396* **Claude Code 程序在執行中途退出**:您的應用程式收到的錯誤取決於 SDK 語言以及 CLI 是否先報告了錯誤結果。[CLI process exit](/docs/zh-TW/agent-sdk/troubleshooting#cli-process-exit) 下的項目涵蓋每條訊息。
340 397
341<h2 id="next-steps">398<h2 id="next-steps">
342 後續步驟399 後續步驟
343</h2>400</h2>
344 401
345* [Hosting cookbook](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)的筆記本逐步解說。402* [Hosting cookbook](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)的筆記本逐步解說。
346* [Session storage](/zh-TW/agent-sdk/session-storage):使用 `SessionStore` 配接器在主機間保留文字記錄。403* [Session storage](/docs/zh-TW/agent-sdk/session-storage):使用 `SessionStore` 配接器在主機間保留文字記錄。
347* [Observability](/zh-TW/agent-sdk/observability):將 OTEL 追蹤、指標和日誌匯出到您的收集器。404* [Observability](/docs/zh-TW/agent-sdk/observability):將 OTEL 追蹤、指標和日誌匯出到您的收集器。
348* [Secure deployment](/zh-TW/agent-sdk/secure-deployment):網路控制、認證管理和隔離強化。405* [Secure deployment](/docs/zh-TW/agent-sdk/secure-deployment):網路控制、認證管理和隔離強化。
349* [Cost tracking](/zh-TW/agent-sdk/cost-tracking):每個會話的權杖和成本計算。406* [Cost tracking](/docs/zh-TW/agent-sdk/cost-tracking):每個會話的權杖和成本計算。