安裝
在虛擬環境中安裝套件。在最近的 Debian、Ubuntu 和 Homebrew Python 安裝上,針對系統 Python 執行pip install 會失敗,並出現 error: externally-managed-environment 錯誤。
在 query() 和 ClaudeSDKClient 之間選擇
Python SDK 提供了兩種與 Claude Code 互動的方式:
快速比較
何時使用 query()(一次性任務)
最適合:
- 一次性問題,不需要對話歷史
- 不需要先前交換上下文的獨立任務
- 簡單的自動化腳本
- 當您想每次都重新開始時
何時使用 ClaudeSDKClient(持續對話)
最適合:
- 繼續對話 - 當您需要 Claude 記住上下文時
- 後續問題 - 基於先前回應進行構建
- 互動式應用程式 - 聊天介面、REPL
- 回應驅動邏輯 - 當下一個動作取決於 Claude 的回應時
- Session 控制 - 明確管理對話生命週期
函數
query()
為每次與 Claude Code 的互動建立新 session。返回一個非同步迭代器,在消息到達時產生消息。每次呼叫 query() 都會重新開始,不記得先前的互動,除非您傳遞 continue_conversation=True 或在 ClaudeAgentOptions 中傳遞 resume。請參閱 Sessions。
參數
返回
返回AsyncIterator[Message],從對話中產生消息。
範例 - 使用選項
tool()
用於定義具有類型安全的 MCP tools 的裝飾器。
參數
輸入架構選項
-
簡單類型對應(推薦):
-
JSON Schema 格式(用於複雜驗證):
返回
一個裝飾器函數,包裝 tool 實現並返回SdkMcpTool 實例。
範例
ToolAnnotations
從 mcp.types 重新匯出(也可以從 claude_agent_sdk 匯入)。所有欄位都是可選提示;客戶端不應依賴它們進行安全決策。
create_sdk_mcp_server()
建立在 Python 應用程式內執行的進程內 MCP 伺服器。
參數
返回
返回McpSdkServerConfig 物件,可以傳遞給 ClaudeAgentOptions.mcp_servers。
範例
list_sessions()
列出過去的 sessions 及其中繼資料。按專案目錄篩選或列出所有專案中的 sessions。同步;立即返回。
參數
返回類型:SDKSessionInfo
範例
列印專案的 10 個最近 sessions。結果按last_modified 降序排序,因此第一項是最新的。省略 directory 以搜尋所有專案。
get_session_messages()
從過去的 session 中檢索消息。同步;立即返回。
參數
返回類型:SessionMessage
範例
get_session_info()
按 ID 讀取單個 session 的中繼資料,無需掃描完整專案目錄。同步;立即返回。
參數
返回
SDKSessionInfo,如果找不到 session,則返回 None。
範例
查詢單個 session 的中繼資料,無需掃描專案目錄。當您已經從先前的執行中獲得 session ID 時很有用。rename_session()
通過附加自訂標題項來重新命名 session。重複呼叫是安全的;最新的標題獲勝。同步。
參數
如果
session_id 不是有效的 UUID 或 title 為空,則引發 ValueError;如果找不到 session,則引發 FileNotFoundError。
範例
重新命名最近的 session,以便稍後更容易找到。新標題在後續讀取時出現在SDKSessionInfo.custom_title 中。
tag_session()
標記 session。傳遞 None 以清除標籤。重複呼叫是安全的;最新的標籤獲勝。同步。
參數
如果
session_id 不是有效的 UUID 或 tag 在清理後為空,則引發 ValueError;如果找不到 session,則引發 FileNotFoundError。
範例
標記 session,然後在稍後的讀取中按該標籤篩選。傳遞None 以清除現有標籤。
類別
ClaudeSDKClient
在多個交換中維持對話 session。 這是 TypeScript SDK 的 query() 函數內部工作方式的 Python 等效物 - 它建立一個可以繼續對話的客戶端物件。
主要功能
- Session 連續性:在多個
query()呼叫中維持對話上下文 - 相同對話:session 保留先前的消息
- 中斷支援:可以在任務中途停止執行
- 明確生命週期:您控制 session 何時開始和結束
- 回應驅動流程:可以對回應做出反應並發送後續消息
- 自訂 tools 和 hooks:支援自訂 tools(使用
@tool裝飾器建立)和 hooks
方法
上下文管理器支援
客戶端可以用作非同步上下文管理器以進行自動連接管理:
重要: 在迭代消息時,避免使用 break 提前退出,因為這可能導致 asyncio 清理問題。相反,讓迭代自然完成或使用標誌來追蹤何時找到所需內容。
範例 - 繼續對話
範例 - 使用 ClaudeSDKClient 進行串流輸入
範例 - 使用中斷
中斷後的緩衝區行為:
interrupt() 發送停止信號但不清除消息緩衝區。已由中斷任務產生的消息,包括其 ResultMessage(帶有 subtype="error_during_execution"),保留在流中。您必須在讀取新查詢的回應之前使用 receive_response() 清空它們。如果您在 interrupt() 之後立即發送新查詢並僅呼叫一次 receive_response(),您將收到中斷任務的消息,而不是新查詢的回應。範例 - 進階權限控制
類型
@dataclass vs TypedDict: 此 SDK 使用兩種類型。用 @dataclass 裝飾的類別(例如 ResultMessage、AgentDefinition、TextBlock)在執行時是物件實例,支援屬性存取:msg.result。用 TypedDict 定義的類別(例如 ThinkingConfigEnabled、McpStdioServerConfig、SyncHookJSONOutput)在執行時是純字典,需要鍵存取:config["budget_tokens"],而不是 config.budget_tokens。ClassName(field=value) 呼叫語法對兩者都有效,但只有 dataclasses 產生具有屬性的物件。SdkMcpTool
使用 @tool 裝飾器建立的 SDK MCP tool 的定義。
Transport
自訂傳輸實現的抽象基類。使用此來透過自訂通道與 Claude 程序通訊(例如,遠端連接而不是本地子程序)。
匯入:
from claude_agent_sdk import Transport
ClaudeAgentOptions
Claude Code 查詢的配置 dataclass。
處理緩慢或停滯的 API 回應
CLI 子程序讀取多個環境變數,控制 API 逾時和停滯偵測。透過ClaudeAgentOptions.env 傳遞它們:
API_TIMEOUT_MS:Anthropic 客戶端上的每個請求逾時,以毫秒為單位。預設600000。適用於主迴圈和所有子代理。CLAUDE_CODE_MAX_RETRIES:最大 API 重試次數。預設10,上限為15。每次重試都有自己的API_TIMEOUT_MS視窗,因此最壞情況下的牆時間大約是API_TIMEOUT_MS × (CLAUDE_CODE_MAX_RETRIES + 1)加上退避。對於需要等待更長中斷的無人值守執行,設定CLAUDE_CODE_RETRY_WATCHDOG=1:它無限期重試容量錯誤,自 Claude Code v2.1.199 起,會將其他暫時性錯誤的預設值提高到300並移除此變數的上限。CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS:使用run_in_background啟動的子代理的停滯監視程式。預設600000。在每個串流事件上重置;停滯時中止子代理,將任務標記為失敗,並將錯誤呈現給父代理,包含任何部分結果。不適用於同步子代理。CLAUDE_ENABLE_STREAM_WATCHDOG搭配CLAUDE_STREAM_IDLE_TIMEOUT_MS:當標頭已到達但回應本體停止串流時中止請求。監視程式預設在所有提供者上啟用;設定CLAUDE_ENABLE_STREAM_WATCHDOG=0以停用它。CLAUDE_STREAM_IDLE_TIMEOUT_MS預設為300000並限制在該最小值。中止的請求會經過正常重試路徑。
OutputFormat
結構化輸出驗證的配置。將此作為 dict 傳遞給 ClaudeAgentOptions 上的 output_format 欄位:
SystemPromptPreset
使用 Claude Code 的預設系統提示配置,可選新增。
SystemPromptFile
用於從檔案而不是作為字串傳遞自訂系統提示的配置。SDK 將此對應到 CLI --system-prompt-file 旗標。當提示很大時使用檔案形式:SDK 在 CLI 子程序 argv 上傳遞字串 system_prompt,受限於 OS 命令列長度限制,在 SDK 發送任何 API 請求之前。在 Linux 上,單個參數長於大約 128 KB 會在程序生成時失敗,出現 Argument list too long。在 Windows 上,整個命令列上限為大約 32 KB,因此字串形式在較低閾值失敗。
SettingSource
控制 SDK 從哪些檔案系統配置來源載入設定。
預設行為
當setting_sources 被省略或為 None 時,query() 載入與 Claude Code CLI 相同的檔案系統設定:使用者、專案和本地。無論如何都會載入受管原則設定;當 session 使用組織認證在符合條件的配置上進行驗證時,會擷取伺服器管理的設定。見 settingSources 不控制的內容 以了解無論此選項如何都會讀取的輸入,以及如何停用它們。
為什麼使用 setting_sources
停用檔案系統設定:在 Python SDK 0.1.59 及更早版本中,空清單的處理方式與省略選項相同,因此
setting_sources=[] 沒有停用檔案系統設定。如果您需要空清單生效,請升級到較新版本。TypeScript SDK 不受影響。設定優先順序
當載入多個來源時,設定會以此優先順序合併(最高到最低):- 本地設定(
.claude/settings.local.json) - 專案設定(
.claude/settings.json) - 使用者設定(
~/.claude/settings.json)
agents 和 allowed_tools)會覆蓋使用者、專案和本地檔案系統設定。受管原則設定優先於程式設計選項。
AgentDefinition
以程式設計方式定義的子代理的配置。
AgentDefinition 欄位名稱使用 camelCase,例如 disallowedTools、permissionMode 和 maxTurns。這些名稱直接對應到與 TypeScript SDK 共享的線路格式。這與 ClaudeAgentOptions 不同,後者對等頂級欄位(例如 disallowed_tools 和 permission_mode)使用 Python snake_case。因為 AgentDefinition 是 dataclass,傳遞 snake_case 關鍵字在構造時會引發 TypeError。PermissionMode
用於控制 tool 執行的權限模式。
EffortLevel
用於指導思考深度的努力級別。
CanUseTool
tool 權限回呼函數的類型別名。
tool_name:被呼叫的 tool 名稱input_data:tool 的輸入參數context:具有其他資訊的ToolPermissionContext
PermissionResult(PermissionResultAllow 或 PermissionResultDeny)。
回呼是互動式權限提示的 SDK 替代品:它僅在權限評估流程解決為提示時呼叫。由 allowed_tools 項目、設定允許規則或權限模式(例如 acceptEdits 或 bypassPermissions)已批准的 tool 呼叫永遠不會呼叫它。要限制每個 tool 呼叫,改用 PreToolUse hook。
AskUserQuestion、標記為 requiresUserInteraction 的 MCP tools,以及您的組織設定為 ask 的連接器 tools 即使允許規則相符也會到達回呼。在 dontAsk 模式下,這些呼叫會被拒絕,而不呼叫回呼。
ToolPermissionContext
傳遞給 tool 權限回呼的上下文資訊。
PermissionResult
權限回呼結果的聯合類型。
PermissionResultAllow
指示應允許 tool 呼叫的結果。
PermissionResultDeny
指示應拒絕 tool 呼叫的結果。
PermissionUpdate
用於以程式設計方式更新權限的配置。
PermissionRuleValue
要在權限更新中新增、取代或移除的規則。
ToolsPreset
使用 Claude Code 預設 tool 集的預設 tools 配置。
ThinkingConfig
控制擴展思考行為。三個配置的聯合:
可選的
display 欄位控制思考文本是否返回為 "summarized" 或 "omitted"。在 Claude Opus 4.7 及更新版本上,API 預設為 "omitted",因此設定 "summarized" 以在 ThinkingBlock 輸出中接收思考內容。
因為這些是 TypedDict 類別,它們在執行時是純字典。要麼將它們構造為字典字面量,要麼呼叫類別作為構造函數;兩者都產生 dict。使用 config["budget_tokens"] 存取欄位,而不是 config.budget_tokens:
SdkBeta
SDK 測試版功能的字面類型。
ClaudeAgentOptions 中的 betas 欄位一起使用以啟用測試版功能。
McpSdkServerConfig
使用 create_sdk_mcp_server() 建立的 SDK MCP 伺服器的配置。
McpServerConfig
MCP 伺服器配置的聯合類型。
McpStdioServerConfig
McpSSEServerConfig
McpHttpServerConfig
McpServerStatusConfig
MCP 伺服器的配置,如 get_mcp_status() 所報告。這是所有 McpServerConfig 傳輸變體加上用於透過 claude.ai 代理的伺服器的僅輸出 claudeai-proxy 變體的聯合。
McpSdkServerConfigStatus 是 McpSdkServerConfig 的可序列化形式,僅具有 type("sdk")和 name(str)欄位;進程內 instance 被省略。McpClaudeAIProxyServerConfig 具有 type("claudeai-proxy")、url(str)和 id(str)欄位。
McpStatusResponse
來自 ClaudeSDKClient.get_mcp_status() 的回應。在 mcpServers 鍵下包裝伺服器狀態清單。
McpServerStatus
連接的 MCP 伺服器的狀態,包含在 McpStatusResponse 中。
SdkPluginConfig
在 SDK 中載入外掛程式的配置。
範例:
消息類型
Message
所有可能消息的聯合類型。
UserMessage
使用者輸入消息。
AssistantMessage
具有內容區塊的助手回應消息。
AssistantMessageError
助手消息的可能錯誤類型。
SystemMessage
具有中繼資料的系統消息。
ResultMessage
具有成本和使用情況資訊的最終結果消息。
subtype 欄位決定了其他哪些欄位會被填入。它是 "success"、"error_during_execution"、"error_max_turns"、"error_max_budget_usd" 或 "error_max_structured_output_retries" 之一。Python dataclass 將所有變體扁平化為一個形狀,因此不適用於返回的 subtype 的欄位為 None。
當對話在錯誤時結束時,多個欄位會帶有診斷詳細資訊:
is_error:當對話以錯誤狀態結束時為True。在error_*subtypes 上始終為True。在subtype="success"上,當最終模型請求失敗時為True,表示代理迴圈已完成但最後一個 API 呼叫返回了錯誤。api_error_status:終止 API 錯誤的 HTTP 狀態碼。當轉在沒有錯誤的情況下結束時為None。僅在subtype="success"上填入。result:在subtype="success"上為最終助手消息的文字,或在error_*subtypes 上為None。當subtype="success"且is_error=True時,如果可用,此欄位會保存 API 錯誤字串,但可能為空,因此請檢查api_error_status和前面的AssistantMessage內容以獲取詳細資訊。errors:迴圈級別的錯誤字串,例如最大轉數消息。僅在error_*subtypes 上填入。
usage 字典在出現時包含以下鍵:
model_usage 字典將模型名稱對應到每個模型的使用情況。內部字典鍵使用 camelCase,因為該值從基礎 CLI 程序未修改地傳遞,符合 TypeScript ModelUsage 類型:
StreamEvent
用於在串流期間進行部分消息更新的串流事件。僅在 ClaudeAgentOptions 中 include_partial_messages=True 時接收。透過 from claude_agent_sdk.types import StreamEvent 匯入。
RateLimitEvent
當速率限制狀態變更時發出(例如,從 "allowed" 到 "allowed_warning")。使用此來在使用者達到硬限制之前警告他們,或在狀態為 "rejected" 時退避。
RateLimitInfo
由 RateLimitEvent 攜帶的速率限制狀態。
TaskStartedMessage
在背景任務啟動時發出。背景任務是在主轉之外追蹤的任何內容:背景 Bash 命令、Monitor 監視、透過 Agent tool 生成的子代理或遠端代理。task_type 欄位告訴您是哪一個。此命名與 Task 到 Agent tool 重新命名無關。
TaskUsage
背景任務的令牌和計時資料。
TaskProgressMessage
定期為執行中的背景任務發出進度更新。
TaskNotificationMessage
在背景任務完成、失敗或停止時發出。背景任務包括 run_in_background Bash 命令、Monitor 監視和背景子代理。
內容區塊類型
ContentBlock
所有內容區塊的聯合類型。
TextBlock
文字內容區塊。
ThinkingBlock
思考內容區塊(用於具有思考能力的模型)。
ToolUseBlock
工具使用請求區塊。
ToolResultBlock
工具執行結果區塊。
錯誤類型
ClaudeSDKError
所有 SDK 錯誤的基礎例外類別。
CLINotFoundError
當 Claude Code CLI 未安裝或找不到時引發。
CLIConnectionError
當連接到 Claude Code 失敗時引發。
ProcessError
當 Claude Code 程序失敗時引發。
CLIJSONDecodeError
當 JSON 解析失敗時引發。
Hook 類型
如需使用 hooks 的綜合指南,包括範例和常見模式,見 Hooks 指南。HookEvent
支援的 hook 事件類型。
TypeScript SDK 支援 Python 中尚未提供的其他 hook 事件:
SessionStart、SessionEnd、Setup、TeammateIdle、TaskCompleted、ConfigChange、WorktreeCreate、WorktreeRemove、PostToolBatch 和 MessageDisplay。HookCallback
hook 回呼函數的類型定義。
input:強類型 hook 輸入,具有基於hook_event_name的判別聯合(見HookInput)tool_use_id:可選 tool 使用識別碼(用於 tool 相關 hooks)context:具有其他資訊的 hook 上下文
HookJSONOutput:
decision:"block"以阻止動作systemMessage:警告消息,顯示給使用者hookSpecificOutput:hook 特定輸出資料
HookContext
傳遞給 hook 回呼的上下文資訊。
HookMatcher
用於將 hooks 符合到特定事件或 tools 的配置。
HookInput
所有 hook 輸入類型的聯合類型。實際類型取決於 hook_event_name 欄位。
BaseHookInput
所有 hook 輸入類型中存在的基礎欄位。
PreToolUseHookInput
PreToolUse hook 事件的輸入資料。
PostToolUseHookInput
PostToolUse hook 事件的輸入資料。
PostToolUseFailureHookInput
PostToolUseFailure hook 事件的輸入資料。在 tool 執行失敗時呼叫。
UserPromptSubmitHookInput
UserPromptSubmit hook 事件的輸入資料。
StopHookInput
Stop hook 事件的輸入資料。
SubagentStopHookInput
SubagentStop hook 事件的輸入資料。
PreCompactHookInput
PreCompact hook 事件的輸入資料。
NotificationHookInput
Notification hook 事件的輸入資料。
SubagentStartHookInput
SubagentStart hook 事件的輸入資料。
PermissionRequestHookInput
PermissionRequest hook 事件的輸入資料。允許 hooks 以程式設計方式處理權限決策。
HookJSONOutput
hook 回呼返回值的聯合類型。
SyncHookJSONOutput
具有控制和決策欄位的同步 hook 輸出。
在 Python 程式碼中使用
continue_(帶下劃線)。發送到 CLI 時會自動轉換為 continue。HookSpecificOutput
包含 hook 事件名稱和事件特定欄位的 TypedDict。形狀取決於 hookEventName 值。如需每個 hook 事件的可用欄位的完整詳情,見 使用 hooks 控制執行。
事件特定輸出類型的判別聯合。hookEventName 欄位決定哪些欄位有效。
AsyncHookJSONOutput
延遲 hook 執行的非同步 hook 輸出。
在 Python 程式碼中使用
async_(帶下劃線)。發送到 CLI 時會自動轉換為 async。Hook 使用範例
此範例註冊兩個 hooks:一個阻止危險的 bash 命令(如rm -rf /),另一個記錄所有 tool 使用情況以進行審計。安全 hook 僅在 Bash 命令上執行(透過 matcher),而記錄 hook 在所有 tools 上執行。
Tool 輸入/輸出類型
所有內建 Claude Code tools 的輸入/輸出架構文件。雖然 Python SDK 不將這些匯出為類型,但它們代表消息中 tool 輸入和輸出的結構。Agent
Tool 名稱:Agent(先前為 Task,仍接受作為別名)
輸入:
AskUserQuestion
Tool 名稱:AskUserQuestion
在執行期間詢問使用者澄清問題。見 處理批准和使用者輸入 以了解使用詳情。
輸入:
Bash
Tool 名稱:Bash
輸入:
Monitor
Tool 名稱:Monitor
執行背景來源並將每個事件傳遞給 Claude,以便它可以做出反應而無需輪詢:command 執行指令碼並每個 stdout 行發出一個事件,ws 開啟 WebSocket 並每個文字框架發出一個事件。請提供 command 或 ws 中的恰好一個。
當 Monitor 執行命令時,它遵循與 Bash 相同的權限規則;WebSocket 監視會單獨提示批准。ws 來源需要 Claude Code v2.1.195 或更新版本。見 Monitor tool 參考 以了解行為和提供者可用性。
輸入:
Edit
Tool 名稱:Edit
輸入:
Read
Tool 名稱:Read
輸入:
Write
Tool 名稱:Write
輸入:
Glob
Tool 名稱:Glob
輸入:
Grep
Tool 名稱:Grep
輸入:
NotebookEdit
Tool 名稱:NotebookEdit
輸入:
WebFetch
Tool 名稱:WebFetch
輸入:
WebSearch
Tool 名稱:WebSearch
輸入:
TodoWrite
Tool 名稱:TodoWrite
自 Claude Code v2.1.142 起,
TodoWrite 預設為停用。改用 TaskCreate、TaskGet、TaskUpdate 和 TaskList。見 遷移到 Task tools 以更新您的監視程式碼,或設定 CLAUDE_CODE_ENABLE_TASKS=0 以還原為 TodoWrite。TaskCreate
Tool 名稱:TaskCreate
輸入:
TaskUpdate
Tool 名稱:TaskUpdate
輸入:
TaskGet
Tool 名稱:TaskGet
輸入:
TaskList
Tool 名稱:TaskList
輸入:
BashOutput
Tool 名稱:BashOutput
輸入:
KillBash
Tool 名稱:KillBash
輸入:
ExitPlanMode
Tool 名稱:ExitPlanMode
輸入:
ListMcpResources
Tool 名稱:ListMcpResourcesTool
輸入:
ReadMcpResource
Tool 名稱:ReadMcpResourceTool
輸入:
使用 ClaudeSDKClient 的進階功能
建立持續對話介面
使用 Hooks 進行行為修改
即時進度監控
範例使用
基本檔案操作(使用 query)
錯誤處理
使用客戶端的串流模式
使用 ClaudeSDKClient 的自訂 tools
沙箱配置
SandboxSettings
沙箱行為的配置。使用此來啟用命令沙箱並以程式設計方式配置網路限制。
沙箱取決於平台支援,在 Linux 上,需要
bubblewrap 和 socat 等工具。預設情況下,當 enabled 為 True 但沙箱無法啟動時,命令會在沙箱外執行,並在 stderr 上顯示警告。此預設與 TypeScript SDK 不同,其中 failIfUnavailable 預設為 true。在沙箱設定中設定 "failIfUnavailable": True 以改為停止。該鍵尚未在 SandboxSettings 上宣告,但 SDK 會將其轉發給 Claude Code,後者會遵守它。query() 然後報告 ResultMessage,其中 subtype="error_during_execution" 且原因在 errors 中。監視該子類型,而不是期望 query() 在產生訊息之前引發。範例使用
SandboxNetworkConfig
沙箱模式的網路特定配置。這些設定適用於當父 SandboxSettings 中的 enabled 為 True 時的沙箱化 Bash 命令。它們不會限制 WebFetch 工具,該工具改用權限規則。
SandboxIgnoreViolations
用於忽略特定沙箱違規的配置。
未沙箱化命令的權限回退
當allowUnsandboxedCommands 啟用時,模型可以透過在 tool 輸入中設定 dangerouslyDisableSandbox: True 來請求在沙箱外執行命令。這些請求回退到現有權限系統,意味著您的 can_use_tool 處理程序將被呼叫,允許您實現自訂授權邏輯。
excludedCommands vs allowUnsandboxedCommands:excludedCommands:始終自動繞過沙箱的靜態命令清單(例如["docker"])。模型無法控制此。allowUnsandboxedCommands:讓模型在執行時透過在 tool 輸入中設定dangerouslyDisableSandbox: True來決定是否請求未沙箱化執行。
- 審計模型請求:記錄模型何時請求未沙箱化執行
- 實現允許清單:僅允許特定命令在沙箱外執行
- 新增批准工作流程:需要明確授權以進行特權操作
另見
- SDK 概述 - 一般 SDK 概念
- TypeScript SDK 參考 - TypeScript SDK 文件
- CLI 參考 - 命令列介面
- 常見工作流程 - 逐步指南