Skip to main content

Agent SDK Reference - Python

เอกสารอ้างอิง API ครบถ้วนสำหรับ Python Agent SDK รวมถึงทุก functions, types และ classes

การติดตั้ง

pip install claude-agent-sdk

การเลือกระหว่าง query() และ ClaudeSDKClient

Python SDK มีสองวิธีในการ interact กับ Claude Code:

Featurequery()ClaudeSDKClient
Sessionสร้าง session ใหม่โดยค่าเริ่มต้นใช้ session เดิมซ้ำ
Conversationการแลกเปลี่ยนครั้งเดียวการแลกเปลี่ยนหลายครั้งใน context เดียวกัน
Connectionจัดการโดยอัตโนมัติควบคุมด้วยตนเอง
Streaming Input✅ รองรับ✅ รองรับ
Interrupts❌ ไม่รองรับ✅ รองรับ
Hooks✅ รองรับ✅ รองรับ
Custom Tools✅ รองรับ✅ รองรับ
Continue Chatด้วยตนเองผ่าน continue_conversation หรือ resume✅ อัตโนมัติ
Use Caseงานครั้งเดียวการสนทนาต่อเนื่อง

เมื่อไรใช้ query() (งานครั้งเดียว)

เหมาะสำหรับ:

  • คำถามครั้งเดียวที่ไม่ต้องการประวัติการสนทนา
  • งานอิสระที่ไม่ต้องการ context จากการแลกเปลี่ยนก่อนหน้า
  • สคริปต์ automation ง่ายๆ
  • เมื่อต้องการเริ่มต้นใหม่ทุกครั้ง

เมื่อไรใช้ ClaudeSDKClient (การสนทนาต่อเนื่อง)

เหมาะสำหรับ:

  • การดำเนินการสนทนาต่อ - เมื่อต้องการให้ Claude จำ context
  • คำถาม Follow-up - สร้างต่อจาก responses ก่อนหน้า
  • Interactive applications - Chat interfaces, REPLs
  • Response-driven logic - เมื่อขั้นตอนต่อไปขึ้นอยู่กับ response ของ Claude
  • Session control - จัดการ conversation lifecycle อย่างชัดเจน

Functions

query()

สร้าง session ใหม่สำหรับการ interact กับ Claude Code แต่ละครั้งโดยค่าเริ่มต้น ส่งคืน async iterator ที่ yield messages เมื่อมาถึง

async def query(
*,
prompt: str | AsyncIterable[dict[str, Any]],
options: ClaudeAgentOptions | None = None,
transport: Transport | None = None
) -> AsyncIterator[Message]

Parameters

ParameterTypeคำอธิบาย
promptstr | AsyncIterable[dict]Input prompt เป็น string หรือ async iterable สำหรับ streaming mode
optionsClaudeAgentOptions | NoneOptional configuration object (ค่าเริ่มต้นเป็น ClaudeAgentOptions() ถ้าเป็น None)
transportTransport | NoneOptional custom transport สำหรับสื่อสารกับ CLI process

ตัวอย่าง

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions


async def main():
options = ClaudeAgentOptions(
system_prompt="You are an expert Python developer",
permission_mode="acceptEdits",
cwd="/home/user/project",
)

async for message in query(prompt="Create a Python web server", options=options):
print(message)


asyncio.run(main())

tool()

Decorator สำหรับกำหนด MCP tools ด้วย type safety

def tool(
name: str,
description: str,
input_schema: type | dict[str, Any],
annotations: ToolAnnotations | None = None
) -> Callable[[Callable[[Any], Awaitable[dict[str, Any]]]], SdkMcpTool[Any]]

ตัวอย่าง

from claude_agent_sdk import tool
from typing import Any


@tool("greet", "Greet a user", {"name": str})
async def greet(args: dict[str, Any]) -> dict[str, Any]:
return {"content": [{"type": "text", "text": f"Hello, {args['name']}!"}]}

create_sdk_mcp_server()

สร้าง in-process MCP server ที่รันภายใน Python application ของคุณ

def create_sdk_mcp_server(
name: str,
version: str = "1.0.0",
tools: list[SdkMcpTool[Any]] | None = None
) -> McpSdkServerConfig

ตัวอย่าง

from claude_agent_sdk import tool, create_sdk_mcp_server


@tool("add", "Add two numbers", {"a": float, "b": float})
async def add(args):
return {"content": [{"type": "text", "text": f"Sum: {args['a'] + args['b']}"}]}


@tool("multiply", "Multiply two numbers", {"a": float, "b": float})
async def multiply(args):
return {"content": [{"type": "text", "text": f"Product: {args['a'] * args['b']}"}]}


calculator = create_sdk_mcp_server(
name="calculator",
version="2.0.0",
tools=[add, multiply],
)

options = ClaudeAgentOptions(
mcp_servers={"calc": calculator},
allowed_tools=["mcp__calc__add", "mcp__calc__multiply"],
)

list_sessions()

แสดงรายการ sessions ที่ผ่านมาพร้อม metadata เป็น synchronous ส่งคืนทันที

def list_sessions(
directory: str | None = None,
limit: int | None = None,
include_worktrees: bool = True
) -> list[SDKSessionInfo]

ตัวอย่าง

from claude_agent_sdk import list_sessions

for session in list_sessions(directory="/path/to/project", limit=10):
print(f"{session.summary} ({session.session_id})")

get_session_messages()

ดึง messages จาก session ที่ผ่านมา

def get_session_messages(
session_id: str,
directory: str | None = None,
limit: int | None = None,
offset: int = 0
) -> list[SessionMessage]

get_session_info()

อ่าน metadata สำหรับ session เดียวโดย ID

def get_session_info(
session_id: str,
directory: str | None = None,
) -> SDKSessionInfo | None

rename_session()

เปลี่ยนชื่อ session โดยการต่อท้าย custom-title entry

def rename_session(
session_id: str,
title: str,
directory: str | None = None,
) -> None

tag_session()

Tag session ส่ง None เพื่อลบ tag

def tag_session(
session_id: str,
tag: str | None,
directory: str | None = None,
) -> None

Classes

ClaudeSDKClient

รักษา conversation session ข้ามการแลกเปลี่ยนหลายครั้ง นี่คือ Python equivalent ของวิธีที่ query() function ใน TypeScript SDK ทำงานภายใน

class ClaudeSDKClient:
def __init__(self, options: ClaudeAgentOptions | None = None, transport: Transport | None = None)
async def connect(self, prompt: str | AsyncIterable[dict] | None = None) -> None
async def query(self, prompt: str | AsyncIterable[dict], session_id: str = "default") -> None
async def receive_messages(self) -> AsyncIterator[Message]
async def receive_response(self) -> AsyncIterator[Message]
async def interrupt(self) -> None
async def set_permission_mode(self, mode: str) -> None
async def set_model(self, model: str | None = None) -> None
async def rewind_files(self, user_message_id: str) -> None
async def get_mcp_status(self) -> McpStatusResponse
async def reconnect_mcp_server(self, server_name: str) -> None
async def toggle_mcp_server(self, server_name: str, enabled: bool) -> None
async def stop_task(self, task_id: str) -> None
async def get_server_info(self) -> dict[str, Any] | None
async def disconnect(self) -> None

Context Manager Support

async with ClaudeSDKClient() as client:
await client.query("Hello Claude")
async for message in client.receive_response():
print(message)

ตัวอย่าง - การดำเนินการสนทนาต่อ

import asyncio
from claude_agent_sdk import ClaudeSDKClient, AssistantMessage, TextBlock, ResultMessage


async def main():
async with ClaudeSDKClient() as client:
# คำถามแรก
await client.query("What's the capital of France?")

async for message in client.receive_response():
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
print(f"Claude: {block.text}")

# คำถาม Follow-up - session เก็บ context ก่อนหน้าไว้
await client.query("What's the population of that city?")

async for message in client.receive_response():
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
print(f"Claude: {block.text}")


asyncio.run(main())

ตัวอย่าง - การใช้ interrupts

import asyncio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, ResultMessage


async def interruptible_task():
options = ClaudeAgentOptions(allowed_tools=["Bash"], permission_mode="acceptEdits")

async with ClaudeSDKClient(options=options) as client:
await client.query("Count from 1 to 100 slowly, using the bash sleep command")

await asyncio.sleep(2)
await client.interrupt()
print("Task interrupted!")

async for message in client.receive_response():
if isinstance(message, ResultMessage):
print(f"Interrupted task finished with subtype={message.subtype!r}")


asyncio.run(interruptible_task())

Types

ClaudeAgentOptions

Configuration dataclass สำหรับ Claude Code queries

@dataclass
class ClaudeAgentOptions:
tools: list[str] | ToolsPreset | None = None
allowed_tools: list[str] = field(default_factory=list)
system_prompt: str | SystemPromptPreset | None = None
mcp_servers: dict[str, McpServerConfig] | str | Path = field(default_factory=dict)
strict_mcp_config: bool = False
permission_mode: PermissionMode | None = None
continue_conversation: bool = False
resume: str | None = None
max_turns: int | None = None
max_budget_usd: float | None = None
disallowed_tools: list[str] = field(default_factory=list)
model: str | None = None
fallback_model: str | None = None
betas: list[SdkBeta] = field(default_factory=list)
output_format: dict[str, Any] | None = None
cwd: str | Path | None = None
cli_path: str | Path | None = None
settings: str | None = None
add_dirs: list[str | Path] = field(default_factory=list)
env: dict[str, str] = field(default_factory=dict)
extra_args: dict[str, str | None] = field(default_factory=dict)
max_buffer_size: int | None = None
stderr: Callable[[str], None] | None = None
can_use_tool: CanUseTool | None = None
hooks: dict[HookEvent, list[HookMatcher]] | None = None
user: str | None = None
include_partial_messages: bool = False
include_hook_events: bool = False
fork_session: bool = False
agents: dict[str, AgentDefinition] | None = None
setting_sources: list[SettingSource] | None = None
sandbox: SandboxSettings | None = None
plugins: list[SdkPluginConfig] = field(default_factory=list)
thinking: ThinkingConfig | None = None
effort: EffortLevel | None = None
enable_file_checkpointing: bool = False
session_store: SessionStore | None = None
session_store_flush: SessionStoreFlushMode = "batched"

PermissionMode

PermissionMode = Literal[
"default", # พฤติกรรม permission มาตรฐาน
"acceptEdits", # ยอมรับการแก้ไขไฟล์โดยอัตโนมัติ
"plan", # Planning mode - สำรวจโดยไม่แก้ไข
"dontAsk", # ปฏิเสธสิ่งที่ไม่ได้รับการ pre-approved แทนการแจ้ง
"bypassPermissions",# ข้ามการตรวจสอบ permission
]

EffortLevel

EffortLevel = Literal[
"low", # การคิดน้อยที่สุด responses เร็วที่สุด
"medium", # การคิดปานกลาง
"high", # การใช้เหตุผลลึก
"xhigh", # การใช้เหตุผลขยาย
"max", # ความพยายามสูงสุด
]

ThinkingConfig

ควบคุมพฤติกรรม extended thinking:

class ThinkingConfigAdaptive(TypedDict):
type: Literal["adaptive"]
display: NotRequired[ThinkingDisplay]

class ThinkingConfigEnabled(TypedDict):
type: Literal["enabled"]
budget_tokens: int
display: NotRequired[ThinkingDisplay]

class ThinkingConfigDisabled(TypedDict):
type: Literal["disabled"]

ThinkingConfig = ThinkingConfigAdaptive | ThinkingConfigEnabled | ThinkingConfigDisabled

Message Types

Message

Union type ของ messages ที่เป็นไปได้ทั้งหมด

Message = (
UserMessage
| AssistantMessage
| SystemMessage
| ResultMessage
| StreamEvent
| RateLimitEvent
)

ResultMessage

Final result message พร้อมข้อมูลค่าใช้จ่ายและการใช้งาน

@dataclass
class ResultMessage:
subtype: str
duration_ms: int
duration_api_ms: int
is_error: bool
num_turns: int
session_id: str
stop_reason: str | None = None
total_cost_usd: float | None = None
usage: dict[str, Any] | None = None
result: str | None = None
structured_output: Any = None
model_usage: dict[str, Any] | None = None
permission_denials: list[Any] | None = None
deferred_tool_use: DeferredToolUse | None = None
errors: list[str] | None = None
api_error_status: int | None = None
uuid: str | None = None

field subtype เป็นหนึ่งใน: "success", "error_during_execution", "error_max_turns", "error_max_budget_usd" หรือ "error_max_structured_output_retries"

dict usage มี:

  • input_tokens: Token input ทั้งหมดที่ใช้
  • output_tokens: Token output ทั้งหมดที่สร้าง
  • cache_creation_input_tokens: Tokens ที่ใช้สร้าง cache entries ใหม่
  • cache_read_input_tokens: Tokens ที่อ่านจาก cache entries ที่มีอยู่