安裝
在 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 架構格式(用於複雜驗證):
返回值
一個裝飾器函數,包裝工具實作並返回一個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
在多次交換中維持對話會話。 這是 Python 等效於 TypeScript SDK 的 query()
函數內部工作方式 - 它建立一個可以繼續對話的客戶端物件。
主要功能
- 會話連續性:在多次
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] | [] | 允許的工具名稱列表 |
max_thinking_tokens | int | 8000 | 思考過程的最大標記數 |
system_prompt | str | None | None | 系統提示配置。傳遞字串用於自訂提示,或使用 Claude Code 系統提示的預設格式 |
mcp_servers | dict[str, McpServerConfig] | str | Path | {} | MCP 伺服器配置或配置檔案路徑 |
permission_mode | PermissionMode | None | None | 工具使用的權限模式 |
continue_conversation | bool | False | 繼續最近的對話 |
resume | str | None | None | 要恢復的會話 ID |
fork_session | bool | False | 使用 resume 恢復時,分叉到新會話 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 可以存取的額外目錄 |
extra_args | dict[str, str | None] | {} | 直接傳遞給 CLI 的額外 CLI 參數 |
can_use_tool | CanUseTool | None | None | 工具權限回調函數 |
hooks | dict[HookEvent, list[HookMatcher]] | None | None | 用於攔截事件的鉤子配置 |
agents | dict[str, AgentDefinition] | None | None | 程式化定義的子代理 |
setting_sources | list[SettingSource] | None | None (無設定) | 控制 SDK 從哪些檔案系統設定載入設定。省略時,不載入任何設定 |
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
訊息類型
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
輸入:
MultiEdit
工具名稱:MultiEdit
輸入:
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 參考 - 命令列介面
- 常見工作流程 - 逐步指南