安裝
在 query() 和 ClaudeSDKClient 之間選擇
Python SDK 提供了兩種與 Claude Code 互動的方式:
快速比較
| 功能 | query() | ClaudeSDKClient |
|---|---|---|
| 會話 | 每次建立新會話 | 重複使用相同會話 |
| 對話 | 單次交換 | 同一上下文中的多次交換 |
| 連接 | 自動管理 | 手動控制 |
| 串流輸入 | ✅ 支援 | ✅ 支援 |
| 中斷 | ❌ 不支援 | ✅ 支援 |
| 鉤子 | ❌ 不支援 | ✅ 支援 |
| 自訂工具 | ❌ 不支援 | ✅ 支援 |
| 繼續聊天 | ❌ 每次新會話 | ✅ 保持對話 |
| 使用案例 | 一次性任務 | 連續對話 |
何時使用 query()(每次新會話)
最適合:
- 不需要對話歷史的一次性問題
- 不需要來自先前交換的上下文的獨立任務
- 簡單的自動化指令碼
- 當您想每次都重新開始時
何時使用 ClaudeSDKClient(連續對話)
最適合:
- 繼續對話 - 當您需要 Claude 記住上下文時
- 後續問題 - 基於先前的回應進行構建
- 互動式應用程式 - 聊天介面、REPL
- 回應驅動邏輯 - 當下一步行動取決於 Claude 的回應時
- 會話控制 - 明確管理對話生命週期
函數
query()
為與 Claude Code 的每次互動建立新會話。返回一個非同步迭代器,在消息到達時產生消息。每次呼叫 query() 都會重新開始,不記得先前的互動。
參數
| 參數 | 類型 | 描述 |
|---|---|---|
prompt | str | AsyncIterable[dict] | 輸入提示,可以是字串或非同步可迭代物件(用於串流模式) |
options | ClaudeAgentOptions | None | 可選的配置物件(如果為 None,預設為 ClaudeAgentOptions()) |
返回
返回一個AsyncIterator[Message],從對話中產生消息。
範例 - 使用選項
tool()
用於定義具有類型安全的 MCP 工具的裝飾器。
參數
| 參數 | 類型 | 描述 |
|---|---|---|
name | str | 工具的唯一識別碼 |
description | str | 工具功能的人類可讀描述 |
input_schema | type | dict[str, Any] | 定義工具輸入參數的架構(見下文) |
輸入架構選項
-
簡單類型對應(推薦):
-
JSON Schema 格式(用於複雜驗證):
返回
一個裝飾器函數,包裝工具實現並返回一個SdkMcpTool 實例。
範例
create_sdk_mcp_server()
建立在 Python 應用程式內執行的進程內 MCP 伺服器。
參數
| 參數 | 類型 | 預設值 | 描述 |
|---|---|---|---|
name | str | - | 伺服器的唯一識別碼 |
version | str | "1.0.0" | 伺服器版本字串 |
tools | list[SdkMcpTool[Any]] | None | None | 使用 @tool 裝飾器建立的工具函數清單 |
返回
返回一個McpSdkServerConfig 物件,可以傳遞給 ClaudeAgentOptions.mcp_servers。
範例
類別
ClaudeSDKClient
在多次交換中維持對話會話。 這是 TypeScript SDK 的 query() 函數內部工作方式的 Python 等效物 - 它建立一個可以繼續對話的客戶端物件。
主要功能
- 會話連續性:在多個
query()呼叫中維持對話上下文 - 相同對話:Claude 記住會話中的先前消息
- 中斷支援:可以在執行中停止 Claude
- 明確生命週期:您控制會話何時開始和結束
- 回應驅動流程:可以對回應做出反應並發送後續消息
- 自訂工具和鉤子:支援自訂工具(使用
@tool裝飾器建立)和鉤子
方法
| 方法 | 描述 |
|---|---|
__init__(options) | 使用可選配置初始化客戶端 |
connect(prompt) | 使用可選初始提示或消息串流連接到 Claude |
query(prompt, session_id) | 以串流模式發送新請求 |
receive_messages() | 以非同步迭代器的形式接收來自 Claude 的所有消息 |
receive_response() | 接收消息直到並包括 ResultMessage |
interrupt() | 發送中斷信號(僅在串流模式中有效) |
disconnect() | 從 Claude 斷開連接 |
上下文管理器支援
客戶端可以用作非同步上下文管理器以進行自動連接管理:
重要: 在迭代消息時,避免使用 break 提前退出,因為這可能會導致 asyncio 清理問題。相反,讓迭代自然完成或使用標誌來追蹤何時找到所需內容。
範例 - 繼續對話
範例 - 使用 ClaudeSDKClient 進行串流輸入
範例 - 使用中斷
範例 - 進階權限控制
類型
SdkMcpTool
使用 @tool 裝飾器建立的 SDK MCP 工具的定義。
| 屬性 | 類型 | 描述 |
|---|---|---|
name | str | 工具的唯一識別碼 |
description | str | 人類可讀的描述 |
input_schema | type[T] | dict[str, Any] | 輸入驗證的架構 |
handler | Callable[[T], Awaitable[dict[str, Any]]] | 處理工具執行的非同步函數 |
ClaudeAgentOptions
Claude Code 查詢的配置資料類別。
| 屬性 | 類型 | 預設值 | 描述 |
|---|---|---|---|
allowed_tools | list[str] | [] | 允許的工具名稱清單 |
system_prompt | str | SystemPromptPreset | None | None | 系統提示配置。傳遞字串以取得自訂提示,或使用 {"type": "preset", "preset": "claude_code"} 以取得 Claude Code 的系統提示。新增 "append" 以擴展預設 |
mcp_servers | dict[str, McpServerConfig] | str | Path | {} | MCP 伺服器配置或配置檔案的路徑 |
permission_mode | PermissionMode | None | None | 工具使用的權限模式 |
continue_conversation | bool | False | 繼續最近的對話 |
resume | str | None | None | 要恢復的會話 ID |
max_turns | int | None | None | 最大對話輪次 |
disallowed_tools | list[str] | [] | 不允許的工具名稱清單 |
model | str | None | None | 要使用的 Claude 模型 |
permission_prompt_tool_name | str | None | None | 權限提示的 MCP 工具名稱 |
cwd | str | Path | None | None | 目前工作目錄 |
settings | str | None | None | 設定檔案的路徑 |
add_dirs | list[str | Path] | [] | Claude 可以存取的其他目錄 |
env | dict[str, str] | {} | 環境變數 |
extra_args | dict[str, str | None] | {} | 要直接傳遞給 CLI 的其他 CLI 引數 |
max_buffer_size | int | None | None | 緩衝 CLI stdout 時的最大位元組數 |
debug_stderr | Any | sys.stderr | 已棄用 - 用於偵錯輸出的類似檔案的物件。改用 stderr 回呼 |
stderr | Callable[[str], None] | None | None | 用於 CLI 的 stderr 輸出的回呼函數 |
can_use_tool | CanUseTool | None | None | 工具權限回呼函數 |
hooks | dict[HookEvent, list[HookMatcher]] | None | None | 用於攔截事件的鉤子配置 |
user | str | None | None | 使用者識別碼 |
include_partial_messages | bool | False | 包括部分消息串流事件 |
fork_session | bool | False | 使用 resume 恢復時,分支到新的會話 ID 而不是繼續原始會話 |
agents | dict[str, AgentDefinition] | None | None | 以程式設計方式定義的子代理 |
plugins | list[SdkPluginConfig] | [] | 從本機路徑載入自訂外掛程式。如需詳細資訊,請參閱 外掛程式 |
setting_sources | list[SettingSource] | None | None(無設定) | 控制要載入哪些檔案系統設定。省略時,不會載入任何設定。注意: 必須包括 "project" 以載入 CLAUDE.md 檔案 |
SystemPromptPreset
使用 Claude Code 的預設系統提示和可選新增項目的配置。
| 欄位 | 必需 | 描述 |
|---|---|---|
type | 是 | 必須是 "preset" 以使用預設系統提示 |
preset | 是 | 必須是 "claude_code" 以使用 Claude Code 的系統提示 |
append | 否 | 要附加到預設系統提示的其他指示 |
SettingSource
控制 SDK 從哪些檔案系統配置來源載入設定。
| 值 | 描述 | 位置 |
|---|---|---|
"user" | 全域使用者設定 | ~/.claude/settings.json |
"project" | 共用的專案設定(版本控制) | .claude/settings.json |
"local" | 本機專案設定(gitignored) | .claude/settings.local.json |
預設行為
當setting_sources 被省略或為 None 時,SDK 不會載入任何檔案系統設定。這為 SDK 應用程式提供了隔離。
為什麼使用 setting_sources?
載入所有檔案系統設定(舊版行為):設定優先順序
載入多個來源時,設定會以此優先順序(從高到低)合併:- 本機設定(
.claude/settings.local.json) - 專案設定(
.claude/settings.json) - 使用者設定(
~/.claude/settings.json)
agents、allowed_tools)始終會覆蓋檔案系統設定。
AgentDefinition
以程式設計方式定義的子代理的配置。
| 欄位 | 必需 | 描述 |
|---|---|---|
description | 是 | 何時使用此代理的自然語言描述 |
tools | 否 | 允許的工具名稱陣列。如果省略,繼承所有工具 |
prompt | 是 | 代理的系統提示 |
model | 否 | 此代理的模型覆蓋。如果省略,使用主模型 |
PermissionMode
用於控制工具執行的權限模式。
McpSdkServerConfig
使用 create_sdk_mcp_server() 建立的 SDK MCP 伺服器的配置。
McpServerConfig
MCP 伺服器配置的聯合類型。
McpStdioServerConfig
McpSSEServerConfig
McpHttpServerConfig
SdkPluginConfig
SDK 中載入外掛程式的配置。
| 欄位 | 類型 | 描述 |
|---|---|---|
type | Literal["local"] | 必須是 "local"(目前僅支援本機外掛程式) |
path | str | 外掛程式目錄的絕對或相對路徑 |
消息類型
Message
所有可能消息的聯合類型。
UserMessage
使用者輸入消息。
AssistantMessage
具有內容區塊的助手回應消息。
SystemMessage
具有中繼資料的系統消息。
ResultMessage
具有成本和使用資訊的最終結果消息。
內容區塊類型
ContentBlock
所有內容區塊的聯合類型。
TextBlock
文字內容區塊。
ThinkingBlock
思考內容區塊(適用於具有思考能力的模型)。
ToolUseBlock
工具使用請求區塊。
ToolResultBlock
工具執行結果區塊。
錯誤類型
ClaudeSDKError
所有 SDK 錯誤的基本例外類別。
CLINotFoundError
當 Claude Code CLI 未安裝或找不到時引發。
CLIConnectionError
當連接到 Claude Code 失敗時引發。
ProcessError
當 Claude Code 程序失敗時引發。
CLIJSONDecodeError
當 JSON 解析失敗時引發。
鉤子類型
HookEvent
支援的鉤子事件類型。請注意,由於設定限制,Python SDK 不支援 SessionStart、SessionEnd 和 Notification 鉤子。
HookCallback
鉤子回呼函數的類型定義。
input_data:鉤子特定的輸入資料(請參閱 鉤子文件)tool_use_id:可選的工具使用識別碼(適用於工具相關的鉤子)context:具有其他資訊的鉤子上下文
decision:"block"以阻止操作systemMessage:要新增到文字記錄的系統消息hookSpecificOutput:鉤子特定的輸出資料
HookContext
傳遞給鉤子回呼的上下文資訊。
HookMatcher
用於將鉤子與特定事件或工具相符的配置。
鉤子使用範例
工具輸入/輸出類型
所有內建 Claude Code 工具的輸入/輸出架構文件。雖然 Python SDK 不會將這些匯出為類型,但它們代表消息中工具輸入和輸出的結構。Task
工具名稱:Task
輸入:
Bash
工具名稱:Bash
輸入:
Edit
工具名稱:Edit
輸入:
Read
工具名稱:Read
輸入:
Write
工具名稱:Write
輸入:
Glob
工具名稱:Glob
輸入:
Grep
工具名稱:Grep
輸入:
NotebookEdit
工具名稱:NotebookEdit
輸入:
WebFetch
工具名稱:WebFetch
輸入:
WebSearch
工具名稱:WebSearch
輸入:
TodoWrite
工具名稱:TodoWrite
輸入:
BashOutput
工具名稱:BashOutput
輸入:
KillBash
工具名稱:KillBash
輸入:
ExitPlanMode
工具名稱:ExitPlanMode
輸入:
ListMcpResources
工具名稱:ListMcpResources
輸入:
ReadMcpResource
工具名稱:ReadMcpResource
輸入:
ClaudeSDKClient 的進階功能
建立連續對話介面
使用鉤子進行行為修改
即時進度監控
使用範例
基本檔案操作(使用 query)
錯誤處理
使用客戶端的串流模式
使用 ClaudeSDKClient 的自訂工具
另請參閱
- Python SDK 指南 - 教學和範例
- SDK 概述 - 一般 SDK 概念
- TypeScript SDK 參考 - TypeScript SDK 文件
- CLI 參考 - 命令列介面
- 常見工作流程 - 逐步指南