SpyBara
Go Premium

agent-sdk/python.md 2026-09-27 23:59 UTC to 2026-09-28 22:01 UTC

This page contains 55 additions and 55 deletions.

2026
Sat 12 03:02 Mon 14 22:58 Fri 18 23:58 Tue 22 23:59 Fri 25 23:58 Mon 28 22:59

Справочник Agent SDK - Python

Полный справочник API для Python Agent SDK, включая все функции, типы и классы.

Установка

Установите пакет в виртуальное окружение. На недавних установках Debian, Ubuntu и Homebrew Python запуск pip install для системного Python завершается ошибкой error: externally-managed-environment.

python3 -m venv .venv
source .venv/bin/activate
pip install claude-agent-sdk

Для uv, Windows PowerShell и настройки API ключа см. Начало работы в быстром старте Agent SDK.

Выбор между `query()` и `ClaudeSDKClient`

Python SDK предоставляет два способа взаимодействия с Claude Code:

Функция query() ClaudeSDKClient
Сеанс Создает новый сеанс по умолчанию Повторно использует один и тот же сеанс
Разговор Один обмен Несколько обменов в одном контексте
Соединение Управляется автоматически Ручное управление
Потоковый ввод ✅ Поддерживается ✅ Поддерживается
Прерывания ❌ Не поддерживается ✅ Поддерживается
Hooks ✅ Поддерживается ✅ Поддерживается
Пользовательские инструменты ✅ Поддерживается ✅ Поддерживается
Продолжить чат Ручное через continue_conversation или resume ✅ Автоматическое
Вариант использования Одноразовые задачи Непрерывные разговоры

Используйте ClaudeSDKClient для интерактивных приложений, таких как интерфейсы чата, или когда следующее действие зависит от ответа Claude.

Функции

`query()`

Создает новый сеанс для каждого взаимодействия с Claude Code по умолчанию. Возвращает асинхронный итератор, который выдает сообщения по мере их поступления. Каждый вызов query() начинается с нуля без памяти о предыдущих взаимодействиях, если вы не передадите continue_conversation=True или resume в ClaudeAgentOptions. См. Sessions.

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

Параметры

Параметр Тип Описание
prompt str | AsyncIterable[dict] Входная подсказка в виде строки или асинхронного итератора для режима потоковой передачи
options ClaudeAgentOptions | None Объект дополнительной конфигурации (по умолчанию ClaudeAgentOptions(), если None)
transport Transport | None Дополнительный пользовательский транспорт для связи с процессом CLI

Возвращаемое значение

Возвращает AsyncIterator[Message], который выдает сообщения из разговора.

Пример - С параметрами

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",
    )

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


asyncio.run(main())

`tool()`

Декоратор для определения MCP tools с проверкой типов.

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]]

Параметры

Параметр Тип Описание
name str Уникальный идентификатор инструмента
description str Понятное описание того, что делает инструмент
input_schema type | dict[str, Any] Схема, определяющая входные параметры инструмента. См. Input schema options
annotations ToolAnnotations | None Дополнительные аннотации MCP tool, предоставляющие подсказки поведения клиентам

Варианты схемы ввода

  1. Простое сопоставление типов (рекомендуется):

    {"text": str, "count": int, "enabled": bool}
    
  2. Формат JSON Schema (для сложной валидации):

    {
        "type": "object",
        "properties": {
            "text": {"type": "string"},
            "count": {"type": "integer", "minimum": 0},
        },
        "required": ["text"],
    }
    

Возвращаемое значение

Функция-декоратор, которая оборачивает реализацию инструмента и возвращает экземпляр SdkMcpTool.

Пример

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']}!"}]}

`ToolAnnotations`

Подсказки поведения для инструмента, передаваемые как аргумент annotations функции tool(). ToolAnnotations расширяет mcp.types.ToolAnnotations SDK MCP с полем maxResultSizeChars, и вы можете писать каждую подсказку в camelCase или snake_case: ToolAnnotations(readOnlyHint=True) и ToolAnnotations(read_only_hint=True) эквивалентны. Вы также можете передать простой mcp.types.ToolAnnotations везде, где SDK принимает аннотации.

Имена snake_case и типизированное поле maxResultSizeChars требуют Python Agent SDK 0.2.140 или позже. Версии 0.1.31 по 0.2.139 переэкспортируют mcp.types.ToolAnnotations без изменений. В версиях 0.1.55 по 0.2.139 вы все еще можете передать maxResultSizeChars как аргумент ключевого слова: класс MCP принимает дополнительные поля, и SDK пересылает значение в Claude Code.

Все поля являются дополнительными. Клиенты не должны полагаться на подсказки для решений безопасности.

Поле Тип По умолчанию Описание
title str | None None Понятное название инструмента
readOnlyHint bool | None False Если True, инструмент не изменяет свою среду
destructiveHint bool | None True Если True, инструмент может выполнять деструктивные обновления (имеет смысл только когда readOnlyHint равен False)
idempotentHint bool | None False Если True, повторные вызовы с одинаковыми аргументами не имеют дополнительного эффекта (имеет смысл только когда readOnlyHint равен False)
openWorldHint bool | None True Если True, инструмент взаимодействует с внешними сущностями (например, веб-поиск). Если False, область инструмента закрыта (например, инструмент памяти)
maxResultSizeChars int | None None Количество символов, до которого Claude Code сохраняет результат этого инструмента встроенным в разговор вместо сохранения в файл, до 500 000. Результаты, содержащие изображения, не затрагиваются. Параметр Claude Code, а не подсказка MCP: SDK отправляет его в _meta инструмента как anthropic/maxResultSizeChars. См. Raise the limit for a specific tool
from claude_agent_sdk import tool, ToolAnnotations
from typing import Any


@tool(
    "search",
    "Search the web",
    {"query": str},
    annotations=ToolAnnotations(readOnlyHint=True, openWorldHint=True),
)
async def search(args: dict[str, Any]) -> dict[str, Any]:
    return {"content": [{"type": "text", "text": f"Results for: {args['query']}"}]}

`create_sdk_mcp_server()`

Создайте встроенный MCP server, который работает в вашем приложении Python.

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

Параметры

Параметр Тип По умолчанию Описание
name str - Уникальный идентификатор сервера
version str "1.0.0" Строка версии сервера
tools list[SdkMcpTool[Any]] | None None Список функций инструментов, созданных с помощью декоратора @tool

Возвращаемое значение

Возвращает объект McpSdkServerConfig, который можно передать в ClaudeAgentOptions.mcp_servers.

Пример

from claude_agent_sdk import tool, create_sdk_mcp_server, ClaudeAgentOptions


@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],  # Pass decorated functions
)

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

`list_sessions()`

Выводит список прошлых сеансов с метаданными. Фильтруйте по каталогу проекта или выводите сеансы во всех проектах. Синхронно; возвращается немедленно.

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

Параметры

Параметр Тип По умолчанию Описание
directory str | None None Каталог для вывода сеансов. Если опущено, возвращает сеансы во всех проектах
limit int | None None Максимальное количество возвращаемых сеансов
offset int 0 Количество сеансов для пропуска с начала отсортированных результатов. Используйте с limit для разбиения на страницы
include_worktrees bool True Когда directory находится внутри репозитория git, включайте сеансы из всех путей worktrees

Тип возвращаемого значения: `SDKSessionInfo`

Свойство Тип Описание
session_id str Уникальный идентификатор сеанса
summary str Отображаемое название: пользовательское название, автоматически созданное резюме или первая подсказка
last_modified int Время последнего изменения в миллисекундах с начала эпохи
file_size int | None Размер файла сеанса в байтах (None для удаленных хранилищ)
custom_title str | None Название сеанса, установленное пользователем
first_prompt str | None Первая значимая подсказка пользователя в сеансе
git_branch str | None Ветка Git в конце сеанса
cwd str | None Рабочий каталог для сеанса
tag str | None Тег сеанса, установленный пользователем (см. tag_session())
created_at int | None Время создания сеанса в миллисекундах с начала эпохи

Пример

Выведите 10 самых последних сеансов для проекта. Результаты отсортированы по last_modified в убывающем порядке, поэтому первый элемент - самый новый. Опустите directory, чтобы искать во всех проектах.

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()`

Извлекает сообщения из прошлого сеанса. Синхронно; возвращается немедленно.

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

Параметры

Параметр Тип По умолчанию Описание
session_id str обязательно ID сеанса для извлечения сообщений
directory str | None None Каталог проекта для поиска. Если опущено, ищет во всех проектах
limit int | None None Максимальное количество возвращаемых сообщений
offset int 0 Количество сообщений для пропуска с начала

Тип возвращаемого значения: `SessionMessage`

Свойство Тип Описание
type Literal["user", "assistant"] Роль сообщения
uuid str Уникальный идентификатор сообщения
session_id str Идентификатор сеанса
message Any Необработанное содержимое сообщения
parent_tool_use_id str | None Для сообщений подагента, ID блока tool-use Agent, который его создал. None для сообщений основного сеанса и более старых сеансов
parent_agent_id str | None Для сообщений от вложенного подагента, ID агента родительского подагента. None для сообщений основного сеанса, сообщений подагента верхнего уровня и более старых сеансов. Требует Python Agent SDK 0.2.140 или позже

Пример

from claude_agent_sdk import list_sessions, get_session_messages

sessions = list_sessions(limit=1)
if sessions:
    messages = get_session_messages(sessions[0].session_id)
    for msg in messages:
        print(f"[{msg.type}] {msg.uuid}")

`get_session_info()`

Читает метаданные для одного сеанса по ID без сканирования полного каталога проекта. Синхронно; возвращается немедленно.

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

Параметры

Параметр Тип По умолчанию Описание
session_id str обязательно UUID сеанса для поиска
directory str | None None Путь каталога проекта. Если опущено, ищет во всех каталогах проектов

Возвращает SDKSessionInfo или None, если сеанс не найден.

Пример

Найдите метаданные одного сеанса без сканирования каталога проекта. Полезно, когда у вас уже есть ID сеанса из предыдущего запуска.

from claude_agent_sdk import get_session_info

info = get_session_info("550e8400-e29b-41d4-a716-446655440000")
if info:
    print(f"{info.summary} (branch: {info.git_branch}, tag: {info.tag})")

`rename_session()`

Переименовывает сеанс, добавляя запись с пользовательским названием. Повторные вызовы безопасны; побеждает самое последнее название. Синхронно.

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

Параметры

Параметр Тип По умолчанию Описание
session_id str обязательно UUID сеанса для переименования
title str обязательно Новое название. Должно быть непустым после удаления пробелов
directory str | None None Путь каталога проекта. Если опущено, ищет во всех каталогах проектов

Вызывает ValueError, если session_id не является допустимым UUID или title пуст; FileNotFoundError, если сеанс не найден.

Пример

Переименуйте самый последний сеанс, чтобы его было легче найти позже. Новое название появляется в SDKSessionInfo.custom_title при последующих чтениях.

from claude_agent_sdk import list_sessions, rename_session

sessions = list_sessions(directory="/path/to/project", limit=1)
if sessions:
    rename_session(sessions[0].session_id, "Refactor auth module")

`tag_session()`

Помечает сеанс. Передайте None для очистки тега. Повторные вызовы безопасны; побеждает самый последний тег. Синхронно.

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

Параметры

Параметр Тип По умолчанию Описание
session_id str обязательно UUID сеанса для пометки
tag str | None обязательно Строка тега или None для очистки. Очищается от Unicode перед сохранением
directory str | None None Путь каталога проекта. Если опущено, ищет во всех каталогах проектов

Вызывает ValueError, если session_id не является допустимым UUID или tag пуст после очистки; FileNotFoundError, если сеанс не найден.

Пример

Пометьте сеанс, затем отфильтруйте по этому тегу при последующем чтении. Передайте None для очистки существующего тега.

from claude_agent_sdk import list_sessions, tag_session

# Tag the most recent session
sessions = list_sessions(directory="/path/to/project", limit=1)
if sessions:
    tag_session(sessions[0].session_id, "needs-review")

# Later: find all sessions with that tag
for session in list_sessions(directory="/path/to/project"):
    if session.tag == "needs-review":
        print(session.summary)

Классы

`ClaudeSDKClient`

Поддерживает сеанс разговора через несколько обменов. Это эквивалент Python того, как функция query() TypeScript SDK работает внутри - она создает объект клиента, который может продолжать разговоры. См. сравнение с query().

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: PermissionMode) -> 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

Методы

Метод Описание
__init__(options) Инициализируйте клиент с дополнительной конфигурацией
connect(prompt) Подключитесь к Claude с дополнительной начальной подсказкой или потоком сообщений
query(prompt, session_id) Отправьте новый запрос в режиме потоковой передачи
receive_messages() Получайте все сообщения от Claude как асинхронный итератор
receive_response() Получайте сообщения до и включая ResultMessage
interrupt() Отправьте сигнал прерывания (работает только в режиме потоковой передачи)
set_permission_mode(mode) Измените режим разрешений для текущего сеанса
set_model(model) Измените модель для текущего сеанса. Передайте None для сброса на модель по умолчанию Claude Code
rewind_files(user_message_id) Восстановите файлы в их состояние в указанном пользовательском сообщении. Требует enable_file_checkpointing=True. См. File checkpointing
get_mcp_status() Получите статус всех настроенных MCP servers. Возвращает McpStatusResponse
reconnect_mcp_server(server_name) Повторите попытку подключения к MCP server, который не удался или был отключен
toggle_mcp_server(server_name, enabled) Включите или отключите MCP server в середине сеанса. Отключение удаляет его инструменты
stop_task(task_id) Остановите выполняющуюся фоновую задачу. TaskNotificationMessage со статусом "stopped" следует в потоке сообщений
get_server_info() Получите информацию об инициализации сервера, включая доступные команды и стили вывода
disconnect() Отключитесь от Claude

Поддержка менеджера контекста

Клиент можно использовать как асинхронный менеджер контекста для автоматического управления соединением:

import asyncio
from claude_agent_sdk import ClaudeSDKClient


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


asyncio.run(main())

Важно: При итерации по сообщениям избегайте использования break для раннего выхода, так как это может вызвать проблемы с очисткой asyncio. Вместо этого позвольте итерации завершиться естественным образом или используйте флаги для отслеживания, когда вы нашли то, что вам нужно.

Пример - Продолжение разговора

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


async def main():
    async with ClaudeSDKClient() as client:
        # First question
        await client.query("What's the capital of France?")

        # Process response
        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 question - the session retains the previous 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}")

        # Another follow-up - still in the same conversation
        await client.query("What are some famous landmarks there?")

        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())

Пример - Потоковый ввод с ClaudeSDKClient

import asyncio
from claude_agent_sdk import ClaudeSDKClient


async def message_stream():
    """Generate messages dynamically."""
    yield {
        "type": "user",
        "message": {"role": "user", "content": "Analyze the following data:"},
    }
    await asyncio.sleep(0.5)
    yield {
        "type": "user",
        "message": {"role": "user", "content": "Temperature: 25°C, Humidity: 60%"},
    }
    await asyncio.sleep(0.5)
    yield {
        "type": "user",
        "message": {"role": "user", "content": "What patterns do you see?"},
    }


async def main():
    async with ClaudeSDKClient() as client:
        # Stream input to Claude
        await client.query(message_stream())

        # Process response
        async for message in client.receive_response():
            print(message)

        # Follow-up in same session
        await client.query("Should we be concerned about these readings?")

        async for message in client.receive_response():
            print(message)


asyncio.run(main())

Пример - Использование прерываний

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:
        # Start a long-running task
        await client.query("Count from 1 to 100 slowly, using the bash sleep command")

        # Let it run for a bit
        await asyncio.sleep(2)

        # Interrupt the task
        await client.interrupt()
        print("Task interrupted!")

        # Drain the interrupted task's messages (including its ResultMessage)
        async for message in client.receive_response():
            if isinstance(message, ResultMessage):
                print(f"Interrupted task: terminal_reason={message.terminal_reason!r}")
                # terminal_reason is "aborted_streaming" or "aborted_tools"
                # for interrupted turns

        # Send a new command
        await client.query("Just say hello instead")

        # Now receive the new response
        async for message in client.receive_response():
            if isinstance(message, ResultMessage) and message.subtype == "success":
                print(f"New result: {message.result}")


asyncio.run(interruptible_task())

Пример - Расширенное управление разрешениями

import asyncio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
from claude_agent_sdk.types import (
    PermissionResultAllow,
    PermissionResultDeny,
    ToolPermissionContext,
)


async def custom_permission_handler(
    tool_name: str, input_data: dict, context: ToolPermissionContext
) -> PermissionResultAllow | PermissionResultDeny:
    """Custom logic for tool permissions."""

    # Block writes to system directories
    if tool_name == "Write" and input_data.get("file_path", "").startswith("/system/"):
        return PermissionResultDeny(
            message="System directory write not allowed", interrupt=True
        )

    # Redirect sensitive file operations
    if tool_name in ["Write", "Edit"] and "config" in input_data.get("file_path", ""):
        safe_path = f"./sandbox/{input_data['file_path']}"
        return PermissionResultAllow(
            updated_input={**input_data, "file_path": safe_path}
        )

    # Allow everything else
    return PermissionResultAllow(updated_input=input_data)


async def main():
    # Don't also list the gated tools in allowed_tools: allow rules approve calls before can_use_tool runs
    options = ClaudeAgentOptions(can_use_tool=custom_permission_handler)

    async with ClaudeSDKClient(options=options) as client:
        await client.query("Update the system config file")

        async for message in client.receive_response():
            # Will use sandbox path instead
            print(message)


asyncio.run(main())

Типы

`SdkMcpTool`

Определение для SDK MCP tool, созданного с помощью декоратора @tool.

@dataclass
class SdkMcpTool(Generic[T]):
    name: str
    description: str
    input_schema: type[T] | dict[str, Any]
    handler: Callable[[T], Awaitable[dict[str, Any]]]
    annotations: ToolAnnotations | None = None
Свойство Тип Описание
name str Уникальный идентификатор инструмента
description str Понятное описание
input_schema type[T] | dict[str, Any] Схема для валидации ввода
handler Callable[[T], Awaitable[dict[str, Any]]] Асинхронная функция, которая обрабатывает выполнение инструмента
annotations ToolAnnotations | None Дополнительные аннотации инструмента (например readOnlyHint, destructiveHint, openWorldHint, maxResultSizeChars)

`Transport`

Абстрактный базовый класс для пользовательских реализаций транспорта. Используйте это для связи с процессом Claude через пользовательский канал (например, удаленное соединение вместо локального подпроцесса).

from abc import ABC, abstractmethod
from collections.abc import AsyncIterator
from typing import Any


class Transport(ABC):
    @abstractmethod
    async def connect(self) -> None: ...

    @abstractmethod
    async def write(self, data: str) -> None: ...

    @abstractmethod
    def read_messages(self) -> AsyncIterator[dict[str, Any]]: ...

    @abstractmethod
    async def close(self) -> None: ...

    @abstractmethod
    def is_ready(self) -> bool: ...

    @abstractmethod
    async def end_input(self) -> None: ...
Метод Описание
connect() Подключите транспорт и подготовьте к связи
write(data) Напишите необработанные данные (JSON + новая строка) в транспорт
read_messages() Асинхронный итератор, который выдает разобранные JSON сообщения
close() Закройте соединение и очистите ресурсы
is_ready() Возвращает True, если транспорт может отправлять и получать
end_input() Закройте входной поток (например, закройте stdin для транспортов подпроцесса)

Импорт: from claude_agent_sdk import Transport

`ClaudeAgentOptions`

Dataclass конфигурации для запросов Claude Code.

@dataclass
class ClaudeAgentOptions:
    tools: list[str] | ToolsPreset | None = None
    allowed_tools: list[str] = field(default_factory=list)
    system_prompt: str | SystemPromptPreset | SystemPromptCustom | SystemPromptFile | 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
    session_id: 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
    permission_prompt_tool_name: str | 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
    debug_stderr: Any = sys.stderr  # Deprecated
    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
    forward_subagent_text: bool = False
    fork_session: bool = False
    resume_session_at: str | None = None
    resume_drops_turn: str | None = None
    agents: dict[str, AgentDefinition] | None = None
    setting_sources: list[SettingSource] | None = None
    skills: list[str] | Literal["all"] | None = None
    sandbox: SandboxSettings | None = None
    plugins: list[SdkPluginConfig] = field(default_factory=list)
    max_thinking_tokens: int | None = None  # Deprecated: use thinking instead
    thinking: ThinkingConfig | None = None
    effort: EffortLevel | None = None
    enable_file_checkpointing: bool = False
    session_store: SessionStore | None = None
    session_store_flush: SessionStoreFlushMode = "batched"
    load_timeout_ms: int = 60_000
    task_budget: TaskBudget | None = None
Свойство Тип По умолчанию Описание
tools list[str] | ToolsPreset | None None Конфигурация инструментов. Используйте {"type": "preset", "preset": "claude_code"} для инструментов Claude Code по умолчанию
allowed_tools list[str] [] Инструменты для автоматического одобрения без запроса. Это не ограничивает Claude только этими инструментами. Если вы назовете один из инструментов отслеживания задач здесь, Claude Code также включает сеанс. Другие неуказанные инструменты переходят к permission_mode и can_use_tool. Используйте disallowed_tools для блокировки инструментов. См. Permissions
system_prompt str | SystemPromptPreset | SystemPromptCustom | SystemPromptFile | None None Конфигурация системной подсказки. Передайте строку для пользовательской подсказки, {"type": "preset", "preset": "claude_code"} для системной подсказки Claude Code с дополнительным "append", {"type": "custom", "prompt": "..."} для пользовательской подсказки, которая также может установить "snapshot", или {"type": "file", "path": "..."} для загрузки большой подсказки с диска. См. SystemPromptPreset, SystemPromptCustom и SystemPromptFile
mcp_servers dict[str, McpServerConfig] | str | Path {} Конфигурации MCP server или путь к файлу конфигурации
strict_mcp_config bool False Когда True, используйте только servers, переданные в mcp_servers, и игнорируйте проект .mcp.json, параметры пользователя, MCP servers, предоставленные plugins, и claude.ai connectors. Соответствует флагу CLI --strict-mcp-config
permission_mode PermissionMode | None None Режим разрешений для использования инструментов
continue_conversation bool False Продолжить самый последний разговор
resume str | None None ID сеанса для возобновления
session_id str | None None Используйте определенный ID сеанса вместо автоматически сгенерированного. Должен быть действительным UUID. Не может быть объединен с continue_conversation или resume, если fork_session также не установлен
max_turns int | None None Максимальное количество агентских ходов (раунды использования инструментов)
max_budget_usd float | None None Остановите запрос, когда оценка стоимости на стороне клиента достигнет этого значения USD. Сравнивается с той же оценкой, что и total_cost_usd. Для предостережений точности и поведения сброса см. Track cost and usage
disallowed_tools list[str] [] Инструменты для отклонения. Простое имя, такое как "Bash", удаляет инструмент из контекста Claude. Правило с областью действия, такое как "Bash(rm *)", оставляет инструмент доступным и отклоняет совпадающие вызовы в каждом режиме разрешений, включая bypassPermissions, для команды как написано. См. Permissions
enable_file_checkpointing bool False Включить отслеживание изменений файлов для перемотки. См. File checkpointing
model str | None None Псевдоним модели Claude или полное имя модели. См. accepted values and provider-specific IDs
fallback_model str | None None Резервная модель для использования, если основная модель не работает. Принимает список, разделенный запятыми. Для руководства см. Choose a model
betas list[SdkBeta] [] Функции бета-версии для включения. См. SdkBeta для доступных опций
output_format dict[str, Any] | None None Формат вывода для структурированных ответов (например, {"type": "json_schema", "schema": {...}}). См. Structured outputs для деталей
permission_prompt_tool_name str | None None Имя MCP tool для подсказок разрешений
cwd str | Path | None None Текущий рабочий каталог
cli_path str | Path | None None Пользовательский путь к исполняемому файлу Claude Code CLI
settings str | None None Путь к файлу параметров или встроенная строка JSON
add_dirs list[str | Path] [] Дополнительные каталоги Claude может получить доступ. SDK передает каждую запись в Claude Code как --add-dir, поэтому с параметром project setting source Claude Code также загружает skills, commands и subagents каталога
env dict[str, str] {} Переменные окружения, объединенные поверх унаследованного окружения процесса. См. Environment variables для переменных, которые читает базовый CLI, и Handle slow or stalled API responses для переменных, связанных с тайм-аутом. Установите CLAUDE_AGENT_SDK_CLIENT_APP для идентификации вашего приложения в заголовке User-Agent
extra_args dict[str, str | None] {} Дополнительные аргументы CLI для прямой передачи в CLI
max_buffer_size int | None None Максимальные байты при буферизации stdout CLI
debug_stderr Any sys.stderr Устарело - SDK игнорирует это значение. Используйте обратный вызов stderr для вывода stderr CLI
stderr Callable[[str], None] | None None Функция обратного вызова для вывода stderr из CLI
can_use_tool CanUseTool | None None Функция обратного вызова разрешения инструмента, вызываемая только когда permission flow переходит к подсказке. Не вызывается для вызовов, автоматически одобренных allowed_tools, правилами разрешения или permission_mode. Правило разрешения не предварительно одобряет действия, которые ни один режим не одобряет автоматически. См. CanUseTool для деталей
hooks dict[HookEvent, list[HookMatcher]] | None None Конфигурации hooks для перехвата событий
user str | None None На платформах POSIX учетная запись пользователя ОС, под которой работает подпроцесс Claude Code. Claude Code сохраняет окружение родительского процесса, включая HOME, и работает в cwd
include_partial_messages bool False Включить события потоковой передачи частичных сообщений. Когда включено, выдаются сообщения StreamEvent
include_hook_events bool False Включить события жизненного цикла hooks в поток сообщений как объекты HookEventMessage
forward_subagent_text bool False Переадресовать текст subagent и блоки мышления в поток сообщений. Без этой опции Claude Code выдает subagent tool_use и tool_result блоки, но не текст или мышление. Требует Python Agent SDK 0.2.140 или позже
fork_session bool False При возобновлении с resume разветвитесь на новый ID сеанса вместо продолжения исходного сеанса
resume_session_at str | None None При возобновлении загрузите разговор только до и включая сообщение с этим UUID. Используйте с resume, и обычно fork_session, для ветвления с более ранней точки. Требует Python Agent SDK 0.2.137 или позже
resume_drops_turn str | None None UUID пользовательского запроса, чей ход усечение resume_session_at отбрасывает. Когда установлено, CLI отказывает в возобновлении, если отброшенный диапазон содержит записи, не относящиеся к этому ходу. Требует Python Agent SDK 0.2.137 или позже и Claude Code v2.1.223 или позже; CLI, поставляемый с этими версиями SDK, удовлетворяет требованию Claude Code
agents dict[str, AgentDefinition] | None None Программно определенные subagents
plugins list[SdkPluginConfig] [] Загрузите пользовательские plugins из локальных путей. См. Plugins для деталей
sandbox SandboxSettings | None None Программно настройте поведение sandbox. См. Sandbox settings для деталей
setting_sources list[SettingSource] | None None (CLI defaults: all sources) Контролируйте, какие параметры файловой системы загружать. Передайте [] для отключения пользовательских, проектных и локальных параметров. С skills установленным и этим полем не установленным, загружаются только пользовательские и проектные источники. Установите setting_sources явно, чтобы сохранить локальные параметры. Управляемая политика конечной точки загружается независимо; параметры, управляемые сервером, загружаются, когда сеанс аутентифицируется с учетными данными организации на подходящей конфигурации. Для входов, читаемых независимо от этой опции, см. What settingSources does not control
skills list[str] | Literal["all"] | None None Skills, доступные сеансу. Передайте "all" для включения каждого обнаруженного skill, или список имен skills. Передавайте только точные имена. SDK отклоняет неправильно сформированные и имена в форме подстановочных знаков с ValueError перед запуском процесса Claude Code; эта проверка требует Python Agent SDK 0.2.129 или позже. Когда установлено, SDK автоматически добавляет инструмент Skill в allowed_tools. Если вы также передаете tools, включите "Skill" в этот список. См. Skills
max_thinking_tokens int | None None Устарело - Максимальные токены для блоков мышления. Вместо этого используйте thinking
thinking ThinkingConfig | None None Управляет поведением расширенного мышления. Имеет приоритет над max_thinking_tokens
effort EffortLevel | None None Уровень усилий для глубины мышления. См. adjust the effort level
session_store SessionStore | None None Зеркалируйте стенограммы сеансов во внешний бэкэнд, чтобы любой хост мог их возобновить. См. Persist sessions to external storage
session_store_flush Literal["batched", "eager"] "batched" Когда сбрасывать записи зеркальной стенограммы в session_store. "batched" сбрасывает один раз за ход или когда буфер заполняется; "eager" запускает фоновый сброс после каждого кадра. Игнорируется, когда session_store равен None
load_timeout_ms int 60000 Тайм-аут для каждого вызова session_store.load() и list_subkeys() во время материализации возобновления, в миллисекундах
task_budget TaskBudget | None None Бюджет токенов на стороне API. Отправляется как output_config.task_budget с заголовком бета-версии task-budgets-2026-03-13. Передайте {"total": <int>}.

Обработка медленных или зависших ответов API

Подпроцесс CLI читает несколько переменных окружения, которые управляют тайм-аутами API и обнаружением зависания. Передайте их через ClaudeAgentOptions.env:

from claude_agent_sdk import ClaudeAgentOptions

options = ClaudeAgentOptions(
    env={
        "API_TIMEOUT_MS": "120000",
        "CLAUDE_CODE_MAX_RETRIES": "2",
        "CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS": "120000",
    },
)
  • API_TIMEOUT_MS: тайм-аут для каждого запроса на клиенте Anthropic в миллисекундах. По умолчанию 600000. Применяется к основному циклу и всем subagents.

  • 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: сторожевой таймер зависания для subagents. Пока сторожевой таймер потока включен, значение по умолчанию составляет CLAUDE_STREAM_IDLE_TIMEOUT_MS плюс 5 минут, что составляет 600000, если вы не повысите эту переменную. Со сторожевым таймером потока выключенным, значение по умолчанию составляет 600000. До v2.1.257 значение по умолчанию всегда было 600000.

    Таймер сбрасывается при каждом событии потока. При зависании Claude Code прерывает subagent и сообщает о зависании родителю. Для фонового subagent он также отмечает задачу как неудачную и прикрепляет любой частичный результат.

  • CLAUDE_ENABLE_STREAM_WATCHDOG с CLAUDE_STREAM_IDLE_TIMEOUT_MS: сторожевой таймер потока, который прерывает запрос, когда заголовки прибыли, но тело ответа перестает потоковать. Сторожевой таймер включен по умолчанию для всех поставщиков; установите CLAUDE_ENABLE_STREAM_WATCHDOG=0 для отключения. CLAUDE_STREAM_IDLE_TIMEOUT_MS по умолчанию 300000 и зажимается до этого минимума. После прерывания, Automatic retries охватывает то, что Claude Code делает, на основе того, как далеко прошел ответ.

    Пока сторожевой таймер ждет ответа, который шлюз позади ANTHROPIC_BASE_URL держит открытым с помощью ping-пингов keep-alive, хост, который устанавливает include_partial_messages, продолжает получать ping StreamEvent сообщения. Читайте эти кадры как живость, а не тайм-аут сеанса на молчание. До v2.1.257 кадры останавливались через 5 минут после последнего реального события потока.

`OutputFormat`

Конфигурация для валидации структурированного вывода. Передайте это как dict в поле output_format на ClaudeAgentOptions:

# Expected dict shape for output_format
{
    "type": "json_schema",
    "schema": {...},  # Your JSON Schema definition
}
Поле Обязательно Описание
type Да Должно быть "json_schema" для валидации JSON Schema
schema Да Определение JSON Schema для валидации вывода

`SystemPromptPreset`

Конфигурация для использования предустановленной системной подсказки Claude Code с дополнительными добавлениями.

class SystemPromptPreset(TypedDict):
    type: Literal["preset"]
    preset: Literal["claude_code"]
    append: NotRequired[str]
    exclude_dynamic_sections: NotRequired[bool]
    snapshot: NotRequired[bool]
Поле Обязательно Описание
type Да Должно быть "preset" для использования предустановленной системной подсказки
preset Да Должно быть "claude_code" для использования системной подсказки Claude Code
append Нет Дополнительные инструкции для добавления к предустановленной системной подсказке
exclude_dynamic_sections Нет Переместите контекст для каждого сеанса, такой как рабочий каталог, флаг git-repo и пути памяти, из системной подсказки в первое пользовательское сообщение. Улучшает повторное использование кэша подсказок между пользователями и машинами. См. Modify system prompts
snapshot Нет Установите значение False для перестройки системной подсказки при каждом запросе вместо повторного использования подсказки, которую сеанс записал при первом запросе. Требует claude-agent-sdk v0.2.153 или позже

`SystemPromptCustom`

Пользовательская системная подсказка в форме объекта, эквивалентная передаче строки как system_prompt, которая также может установить snapshot. Требует claude-agent-sdk v0.2.153 или позже.

class SystemPromptCustom(TypedDict):
    type: Literal["custom"]
    prompt: str
    snapshot: NotRequired[bool]
Поле Обязательно Описание
type Да Должно быть "custom"
prompt Да Текст системной подсказки. Передается в CLI как аргумент командной строки, поэтому ограничения длины командной строки применяются
snapshot Нет То же, что SystemPromptPreset.snapshot, применяется к prompt

`SystemPromptFile`

Конфигурация для загрузки пользовательской системной подсказки из файла вместо передачи ее в виде строки. SDK сопоставляет это с флагом CLI --system-prompt-file. Используйте форму файла, когда подсказка большая: SDK передает строку system_prompt в argv подпроцесса CLI, что подвергается ограничениям длины командной строки ОС перед отправкой SDK любого запроса API. На Linux один аргумент длиннее примерно 128 КБ не работает при порождении процесса с Argument list too long. На Windows вся командная строка ограничена примерно 32 КБ, поэтому форма строки не работает при более низком пороге.

class SystemPromptFile(TypedDict):
    type: Literal["file"]
    path: str
Поле Обязательно Описание
type Да Должно быть "file" для загрузки подсказки с диска
path Да Путь к файлу, содержащему системную подсказку

`SettingSource`

Управляет тем, какие источники конфигурации на основе файловой системы загружает SDK.

SettingSource = Literal["user", "project", "local"]
Значение Описание Местоположение
"user" Глобальные параметры пользователя ~/.claude/settings.json
"project" Общие параметры проекта (контролируемые версией) .claude/settings.json
"local" Локальные параметры проекта, gitignored когда Claude Code сохраняет параметр в него .claude/settings.local.json

Поведение по умолчанию

Когда setting_sources опущено или None и skills не установлен, query() загружает те же параметры файловой системы, что и Claude Code CLI: пользовательские, проектные и локальные. С skills установленным, строка setting_sources описывает текущее значение по умолчанию. Управляемые параметры политики загружаются во всех случаях; параметры, управляемые сервером, загружаются, когда сеанс аутентифицируется с учетными данными организации на подходящей конфигурации. Для получения дополнительной информации см. What settingSources does not control.

Почему использовать setting\_sources

Отключить параметры файловой системы:

# Do not load user, project, or local settings from disk
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions


async def main():
    async for message in query(
        prompt="Analyze this code",
        options=ClaudeAgentOptions(
            setting_sources=[]
        ),
    ):
        print(message)


asyncio.run(main())

Загрузить только определенные источники параметров:

# Load only project settings, ignore user and local
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions


async def main():
    async for message in query(
        prompt="Run CI checks",
        options=ClaudeAgentOptions(
            setting_sources=["project"]  # Only .claude/settings.json
        ),
    ):
        print(message)


asyncio.run(main())

Приложения только SDK:

# Define everything programmatically.
# Pass [] to opt out of filesystem setting sources.
import asyncio
from claude_agent_sdk import AgentDefinition, ClaudeAgentOptions, query


async def main():
    async for message in query(
        prompt="Review this PR",
        options=ClaudeAgentOptions(
            setting_sources=[],
            agents={
                "code-reviewer": AgentDefinition(
                    description="Reviews code changes",
                    prompt="You are a code reviewer. Report issues in the diff.",
                ),
            },
            allowed_tools=["Read", "Grep", "Glob"],
        ),
    ):
        print(message)


asyncio.run(main())

Для загрузки инструкций проекта CLAUDE.md включите "project" в setting_sources. См. Modify system prompts для того, как загрузка CLAUDE.md взаимодействует с опциями системной подсказки.

Приоритет параметров

Когда загружаются несколько источников, параметры объединяются с этим приоритетом (от наивысшего к наименьшему):

  1. Локальные параметры (.claude/settings.local.json)
  2. Параметры проекта (.claude/settings.json)
  3. Параметры пользователя (~/.claude/settings.json)

Программные опции, такие как agents, allowed_tools и settings, переопределяют параметры пользователя, проекта и локальной файловой системы. Управляемые параметры политики имеют приоритет над программными опциями.

`AgentDefinition`

Конфигурация для subagent, определенного программно.

@dataclass
class AgentDefinition:
    description: str
    prompt: str
    tools: list[str] | None = None
    disallowedTools: list[str] | None = None
    model: str | None = None
    skills: list[str] | None = None
    memory: Literal["user", "project", "local"] | None = None
    mcpServers: list[str | dict[str, Any]] | None = None
    initialPrompt: str | None = None
    maxTurns: int | None = None
    background: bool | None = None
    effort: EffortLevel | int | None = None
    permissionMode: PermissionMode | None = None
Поле Обязательно Описание
description Да Описание на естественном языке, когда использовать этого агента
prompt Да Системная подсказка агента
tools Нет Массив разрешенных имен инструментов. Если опущено, наследует каждый инструмент, доступный для subagents
disallowedTools Нет Массив имен инструментов для удаления из набора инструментов агента. Также принимаются шаблоны уровня MCP server: mcp__server или mcp__server__* удаляет каждый инструмент с этого сервера, и mcp__* удаляет каждый MCP tool с любого сервера
model Нет Переопределение модели для этого агента. Принимает псевдоним, такой как "sonnet", "opus", "haiku" или "inherit", или полный ID модели. Когда вы опускаете его, Claude Code выбирает модель в порядке модели subagent
skills Нет Список имен skills для предварительной загрузки в контекст агента при запуске. Неуказанные skills остаются вызываемыми через инструмент Skill
memory Нет Источник памяти для этого агента: "user", "project" или "local"
mcpServers Нет MCP servers, доступные этому агенту. Каждая запись - это имя сервера или встроенный словарь {name: config}
initialPrompt Нет Автоматически отправляется как первый ход пользователя, когда этот агент работает как основной агент потока
maxTurns Нет Максимальное количество агентских ходов перед остановкой агента
background Нет Запустите этого агента как неблокирующую фоновую задачу при вызове
effort Нет Уровень усилий рассуждения для этого агента. Принимает именованный уровень или целое число. См. EffortLevel
permissionMode Нет Режим разрешений для выполнения инструментов в этом агенте. Правила наследования subagent решают, когда он применяется. См. PermissionMode

`PermissionMode`

Режимы разрешений для управления выполнением инструментов.

PermissionMode = Literal[
    "default",  # Standard permission behavior
    "acceptEdits",  # Auto-accept file edits
    "plan",  # Planning mode - explore without editing
    "dontAsk",  # Deny anything not pre-approved instead of prompting
    "bypassPermissions",  # Bypass permission checks; explicit ask rules still prompt (use with caution)
    "auto",  # Model classifier approves or denies permission prompts
]

`EffortLevel`

Уровни усилий для руководства глубиной мышления.

EffortLevel = Literal[
    "low",  # Minimal thinking, fastest responses
    "medium",  # Moderate thinking
    "high",  # Deep reasoning
    "xhigh",  # Extended reasoning; falls back to "high" on models that don't support it
    "max",  # Maximum effort
]

`CanUseTool`

Псевдоним типа для функций обратного вызова разрешения инструмента.

CanUseTool = Callable[
    [str, dict[str, Any], ToolPermissionContext], Awaitable[PermissionResult]
]

Обратный вызов получает:

  • tool_name: Имя вызываемого инструмента
  • input_data: Входные параметры инструмента
  • context: ToolPermissionContext с дополнительной информацией

Возвращает PermissionResult (либо PermissionResultAllow, либо PermissionResultDeny).

Обратный вызов - это замена SDK для интерактивной подсказки разрешения: он вызывается только когда permission evaluation flow разрешается в подсказку. Вызовы инструментов, уже одобренные записью allowed_tools, правилом параметров разрешения или режимом разрешения, таким как acceptEdits или bypassPermissions, никогда его не вызывают. Правило разрешения не предварительно одобряет действия, которые ни один режим не одобряет автоматически; см. How permissions are evaluated для того, какие из них достигают обратного вызова и что происходит в режиме dontAsk и auto. Чтобы контролировать каждый вызов инструмента, используйте вместо этого hook PreToolUse.

`ToolPermissionContext`

Информация контекста, передаваемая в обратные вызовы разрешения инструмента.

@dataclass
class ToolPermissionContext:
    signal: Any | None = None  # Future: abort signal support
    suggestions: list[PermissionUpdate] = field(default_factory=list)
    tool_use_id: str | None = None
    agent_id: str | None = None
    blocked_path: str | None = None
    decision_reason: str | None = None
    title: str | None = None
    display_name: str | None = None
    description: str | None = None
Поле Тип Описание
signal Any | None Зарезервировано для будущей поддержки сигнала прерывания
suggestions list[PermissionUpdate] Предложения обновления разрешений из CLI. Подсказки Bash включают предложение с назначением localSettings, поэтому возврат его в updated_permissions записывает правило в .claude/settings.local.json и сохраняется между сеансами.
tool_use_id str | None Идентификатор конкретного вызова инструмента, для которого эта подсказка предназначена. Всегда заполняется при доставке в can_use_tool
agent_id str | None ID sub-agent, когда вызов происходит из subagent; None для основного агента
blocked_path str | None Путь к файлу, который вызвал запрос разрешения, если применимо. Например, когда команда Bash пытается получить доступ к пути вне разрешенных каталогов
decision_reason str | None Причина, по которой был вызван этот запрос разрешения. Переадресовано из permissionDecisionReason hook PreToolUse, когда hook вернул "ask"
title str | None Полное предложение запроса разрешения, такое как Claude wants to read foo.txt. Используйте как основной текст подсказки, если присутствует
display_name str | None Короткая именная фраза для действия инструмента, такая как Read file, подходящая для меток кнопок
description str | None Понятный подзаголовок для пользовательского интерфейса разрешений

`PermissionResult`

Тип объединения для результатов обратного вызова разрешения.

PermissionResult = PermissionResultAllow | PermissionResultDeny

`PermissionResultAllow`

Результат, указывающий, что вызов инструмента должен быть разрешен.

@dataclass
class PermissionResultAllow:
    behavior: Literal["allow"] = "allow"
    updated_input: dict[str, Any] | None = None
    updated_permissions: list[PermissionUpdate] | None = None
Поле Тип По умолчанию Описание
behavior Literal["allow"] "allow" Должно быть "allow"
updated_input dict[str, Any] | None None Измененный ввод для использования вместо оригинала
updated_permissions list[PermissionUpdate] | None None Обновления разрешений для применения

`PermissionResultDeny`

Результат, указывающий, что вызов инструмента должен быть отклонен.

@dataclass
class PermissionResultDeny:
    behavior: Literal["deny"] = "deny"
    message: str = ""
    interrupt: bool = False
Поле Тип По умолчанию Описание
behavior Literal["deny"] "deny" Должно быть "deny"
message str "" Сообщение, объясняющее, почему инструмент был отклонен
interrupt bool False Следует ли прерывать текущее выполнение

`PermissionUpdate`

Конфигурация для программного обновления разрешений.

@dataclass
class PermissionUpdate:
    type: Literal[
        "addRules",
        "replaceRules",
        "removeRules",
        "setMode",
        "addDirectories",
        "removeDirectories",
    ]
    rules: list[PermissionRuleValue] | None = None
    behavior: Literal["allow", "deny", "ask"] | None = None
    mode: PermissionMode | None = None
    directories: list[str] | None = None
    destination: (
        Literal["userSettings", "projectSettings", "localSettings", "session"] | None
    ) = None
Поле Тип Описание
type Literal[...] Тип операции обновления разрешений
rules list[PermissionRuleValue] | None Правила для операций добавления/замены/удаления
behavior Literal["allow", "deny", "ask"] | None Поведение для операций на основе правил
mode PermissionMode | None Режим для операции setMode
directories list[str] | None Каталоги для операций добавления/удаления каталога
destination Literal[...] | None Где применить обновление разрешений

`PermissionRuleValue`

Правило для добавления, замены или удаления в обновлении разрешений.

@dataclass
class PermissionRuleValue:
    tool_name: str
    rule_content: str | None = None

`ToolsPreset`

Конфигурация предустановленных инструментов для использования набора инструментов Claude Code по умолчанию.

class ToolsPreset(TypedDict):
    type: Literal["preset"]
    preset: Literal["claude_code"]

`ThinkingConfig`

Управляет поведением расширенного мышления. Объединение трех конфигураций:

ThinkingDisplay = Literal["summarized", "omitted"]


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
Вариант Поля Описание
adaptive type, display Claude адаптивно решает, когда думать
enabled type, budget_tokens, display Включить мышление с определенным бюджетом токенов
disabled type Отключить мышление

Дополнительное поле display управляет тем, возвращается ли текст мышления "summarized" или "omitted". На Claude Opus 4.7 и более поздних версиях API по умолчанию используется "omitted", поэтому установите "summarized" для получения содержимого мышления в выводах ThinkingBlock. Claude Code не отправляет display на Amazon Bedrock или Google Cloud's Agent Platform, поэтому на этих поставщиках Opus 4.7 и позже возвращают пустые выводы ThinkingBlock даже когда вы устанавливаете display на "summarized".

Поскольку это классы TypedDict, они являются простыми словарями во время выполнения. Либо создавайте их как литералы словарей, либо вызывайте класс как конструктор; оба создают dict. Получайте доступ к полям с помощью config["budget_tokens"], а не config.budget_tokens:

from claude_agent_sdk import ClaudeAgentOptions, ThinkingConfigEnabled

# Option 1: dict literal (recommended, no import needed)
options = ClaudeAgentOptions(thinking={"type": "enabled", "budget_tokens": 20000})

# Option 2: constructor-style (returns a plain dict)
config = ThinkingConfigEnabled(type="enabled", budget_tokens=20000)
print(config["budget_tokens"])  # 20000
# config.budget_tokens would raise AttributeError

`TaskBudget`

Бюджет задач на стороне API в токенах, используется с полем task_budget в ClaudeAgentOptions.

class TaskBudget(TypedDict):
    total: int
Поле Тип Описание
total int Общий бюджет токенов для задачи

Поскольку это TypedDict, передайте его как простой dict, такой как ClaudeAgentOptions(task_budget={"total": 50000}).

`SdkBeta`

Тип Literal для функций бета-версии SDK.

SdkBeta = Literal["context-1m-2025-08-07"]

Используйте с полем betas в ClaudeAgentOptions для включения функций бета-версии.

`McpSdkServerConfig`

Конфигурация для SDK MCP servers, созданных с помощью create_sdk_mcp_server().

class McpSdkServerConfig(TypedDict):
    type: Literal["sdk"]
    name: str
    instance: Any  # MCP Server instance

`McpServerConfig`

Тип объединения для конфигураций MCP server.

McpServerConfig = (
    McpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig | McpSdkServerConfig
)

`McpStdioServerConfig`

class McpStdioServerConfig(TypedDict):
    type: NotRequired[Literal["stdio"]]  # Optional for backwards compatibility
    command: str
    args: NotRequired[list[str]]
    env: NotRequired[dict[str, str]]

`McpSSEServerConfig`

class McpSSEServerConfig(TypedDict):
    type: Literal["sse"]
    url: str
    headers: NotRequired[dict[str, str]]

`McpHttpServerConfig`

class McpHttpServerConfig(TypedDict):
    type: Literal["http"]
    url: str
    headers: NotRequired[dict[str, str]]

`McpServerStatusConfig`

Конфигурация MCP server, как сообщается get_mcp_status(). Это объединение всех вариантов транспорта McpServerConfig плюс вариант claudeai-proxy только для вывода для servers, проксированных через claude.ai.

McpServerStatusConfig = (
    McpStdioServerConfig
    | McpSSEServerConfig
    | McpHttpServerConfig
    | McpSdkServerConfigStatus
    | McpClaudeAIProxyServerConfig
)

McpSdkServerConfigStatus - это сериализуемая форма McpSdkServerConfig с только полями type ("sdk") и name (str); встроенный instance опущен. McpClaudeAIProxyServerConfig имеет поля type ("claudeai-proxy"), url (str) и id (str).

`McpStatusResponse`

Ответ от ClaudeSDKClient.get_mcp_status(). Оборачивает список статусов сервера под ключом mcpServers.

class McpStatusResponse(TypedDict):
    mcpServers: list[McpServerStatus]

`McpServerStatus`

Статус подключенного MCP server, содержащийся в McpStatusResponse.

class McpServerStatus(TypedDict):
    name: str
    status: McpServerConnectionStatus  # "connected" | "failed" | "needs-auth" | "pending" | "disabled"
    serverInfo: NotRequired[McpServerInfo]
    error: NotRequired[str]
    config: NotRequired[McpServerStatusConfig]
    scope: NotRequired[str]
    tools: NotRequired[list[McpToolInfo]]
Поле Тип Описание
name str Имя сервера
status str Один из "connected", "failed", "needs-auth", "pending" или "disabled"
serverInfo dict (опционально) Имя и версия сервера ({"name": str, "version": str})
error str (опционально) Сообщение об ошибке, если серверу не удалось подключиться
config McpServerStatusConfig (опционально) Конфигурация сервера. Та же форма, что и McpServerConfig (stdio, SSE, HTTP или SDK), плюс вариант claudeai-proxy для servers, подключенных через claude.ai
scope str (опционально) Область конфигурации
tools list (опционально) Инструменты, предоставляемые этим сервером, каждый с полями name, description и annotations

`SdkPluginConfig`

Конфигурация для загрузки plugins в SDK.

class SdkPluginConfig(TypedDict):
    type: Literal["local"]
    path: str
Поле Тип Описание
type Literal["local"] Должно быть "local" (в настоящее время поддерживаются только локальные plugins)
path str Абсолютный или относительный путь к каталогу plugin

Пример:

plugins = [
    {"type": "local", "path": "./my-plugin"},
    {"type": "local", "path": "/absolute/path/to/plugin"},
]

Для полной информации о создании и использовании plugins см. Plugins.

Типы сообщений

`Message`

Тип объединения всех возможных сообщений.

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

`UserMessage`

Сообщение пользовательского ввода.

@dataclass
class UserMessage:
    content: str | list[ContentBlock]
    uuid: str | None = None
    parent_tool_use_id: str | None = None
    tool_use_result: dict[str, Any] | None = None
    origin: MessageOrigin | None = None
Поле Тип Описание
content str | list[ContentBlock] Содержимое сообщения как текст или блоки содержимого
uuid str | None Уникальный идентификатор сообщения
parent_tool_use_id str | None ID использования инструмента, если это сообщение является ответом результата инструмента
tool_use_result dict[str, Any] | None Данные результата инструмента, если применимо
origin MessageOrigin | None Происхождение этого сообщения, заполняется при внедренных ходах, таких как уведомления о задачах и сообщения от коллег. None, когда CLI не атрибутировал его. Требуется Python Agent SDK 0.2.137 или позже

SDK передает tool_use_result из CLI без изменений. Для инструмента на внешнем MCP сервере, результат которого содержит блоки resource_link, словарь имеет ключ resourceLinks, содержащий список словарей с ключами типа TypeScript SDKMcpResourceLink. Claude получает каждую ссылку как строку текста в результате инструмента. Для отображения файлов, возвращенных сервером, читайте resourceLinks вместо анализа этого текста. Ключ resourceLinks требует Python Agent SDK 0.2.150 или позже и Claude Code v2.1.257 или позже; CLI, поставляемый с этой версией SDK, удовлетворяет требованию Claude Code.

CLI опускает ключ, когда результат не содержит ссылок и при результатах от подагентов. CLI сохраняет максимум 50 ссылок на результат и прекращает добавление ссылок, когда список достигает 64 КиБ сериализованного JSON. Инструмент, который вы определяете внутри процесса с помощью tool(), никогда не создает ключ, потому что SDK преобразует его блоки resource_link в текст перед тем, как CLI увидит результат.

`AssistantMessage`

Сообщение ответа помощника с блоками содержимого.

@dataclass
class AssistantMessage:
    content: list[ContentBlock]
    model: str
    parent_tool_use_id: str | None = None
    error: AssistantMessageError | None = None
    usage: dict[str, Any] | None = None
    message_id: str | None = None
    stop_reason: str | None = None
    session_id: str | None = None
    uuid: str | None = None
Поле Тип Описание
content list[ContentBlock] Список блоков содержимого в ответе
model str Модель, которая создала ответ
parent_tool_use_id str | None ID использования инструмента, если это вложенный ответ
error AssistantMessageError | None Тип ошибки, если ответ столкнулся с ошибкой
usage dict[str, Any] | None Использование токенов для каждого сообщения (те же ключи, что и ResultMessage.usage)
message_id str | None ID сообщения API. Несколько сообщений из одного хода имеют одинаковый ID
stop_reason str | None Причина остановки из API (например end_turn, tool_use)
session_id str | None ID сеанса, к которому принадлежит это сообщение
uuid str | None Уникальный идентификатор сообщения в пределах транскрипта сеанса

`AssistantMessageError`

Возможные типы ошибок для сообщений помощника.

AssistantMessageError = Literal[
    "authentication_failed",
    "billing_error",
    "rate_limit",
    "invalid_request",
    "server_error",
    "unknown",
]

Базовый процесс CLI может выдавать типы ошибок, которые этот Literal не перечисляет, такие как max_output_tokens. SDK передает значение без изменений, поэтому обрабатывайте строки вне этого списка так же, как вы обрабатываете unknown. Тип TypeScript SDKAssistantMessageError перечисляет полный набор значений, которые может выдать CLI.

`SystemMessage`

Системное сообщение с метаданными.

@dataclass
class SystemMessage:
    subtype: str
    data: dict[str, Any]

`ResultMessage`

Финальное сообщение результата с информацией о стоимости и использовании.

@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, ModelUsage] | 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
    terminal_reason: str | None = None
    origin: MessageOrigin | None = None

Поле subtype определяет, какие другие поля заполнены. Это одно из "success", "error_during_execution", "error_max_turns", "error_max_budget_usd" или "error_max_structured_output_retries". Dataclass Python объединяет все варианты в одну форму, поэтому поля, которые не применяются к возвращаемому подтипу, имеют значение None.

Несколько полей содержат диагностические детали о том, как разговор закончился:

  • is_error: True, когда разговор закончился в состоянии ошибки. Всегда True на подтипах error_*. На subtype="success" это True, когда финальный запрос модели не удался, что означает, что цикл агента завершился, но последний вызов API вернул ошибку.
  • api_error_status: код состояния HTTP завершающей ошибки API. None, когда ход закончился без ошибки. Заполняется только на subtype="success".
  • result: текст финального сообщения помощника на subtype="success" или None на подтипах error_*. Когда subtype="success" и is_error=True, это содержит строку ошибки API, если она доступна, но может быть пустой, поэтому проверьте api_error_status и предыдущее содержимое AssistantMessage для деталей.
  • errors: строки ошибок уровня цикла, такие как сообщение о максимальных ходах. Заполняется только на подтипах error_*.
  • terminal_reason: почему цикл запроса закончился, например "completed", "max_turns", "api_error", "aborted_streaming" или "aborted_tools". Значение "aborted_streaming" или "aborted_tools" означает, что ход был прерван до завершения. Частые причины - interrupt() и callback разрешения, возвращающий PermissionResultDeny с interrupt=True. None на версиях CLI, которые предшествуют полю, на результатах локальных команд, таких как /voice или /usage, которые обходят цикл запроса, или на синтезированных результатах ошибок, выданных при критическом отказе сеанса. Зеркалирует SDKResultMessage.terminal_reason TypeScript SDK, который перечисляет полный набор значений.
  • origin: происхождение пользовательского сообщения, которое запустило этот ход. В режиме потоковой передачи входных данных проверьте это, чтобы отличить результат вашего собственного запроса, где origin равен None или {"kind": "human"}, от результата внедренного хода, такого как уведомление фоновой задачи. Требуется Python Agent SDK 0.2.137 или позже.

Словарь usage охватывает только основной цикл агента и исключает подагентов и другие вложенные или вспомогательные вызовы модели. В режиме потоковой передачи входных данных значения указаны за ход. Предпочитайте model_usage для учета токенов и стоимости. Словарь usage содержит следующие ключи, если они присутствуют:

Ключ Тип Описание
input_tokens int Входные токены, потребленные циклом агента верхнего уровня. Токены подагента не включены; используйте model_usage для учета всего дерева.
output_tokens int Выходные токены, созданные циклом агента верхнего уровня. Токены подагента не включены.
cache_creation_input_tokens int Токены, используемые для создания новых записей кэша.
cache_read_input_tokens int Токены, прочитанные из существующих записей кэша.

Словарь model_usage отображает имена моделей на использование для каждой модели. Он охватывает каждый вызов модели, сделанный через конвейер запроса: основной цикл, подагентов и внутренние вызовы, такие как компактирование и агентов Workflow. Вспомогательные вызовы вне этого конвейера, такие как классификатор разрешений и запросы подсчета токенов, исключены из model_usage. Рассматривайте model_usage как оценку, а не как выписку по счету.

В режиме потоковой передачи входных данных model_usage и total_cost_usd являются кумулятивными по ходам, поэтому читайте последний результат вместо суммирования по результатам. Вызов, который возобновляет сеанс, также учитывает итоги, восстановленные из более ранних вызовов сеанса. См. Track costs in streaming input mode для сбросов и Recover totals after a session crash для обнуленных результатов.

Каждое значение в model_usage - это TypedDict ModelUsage, импортируемый через from claude_agent_sdk.types import ModelUsage. Его ключи используют camelCase, потому что SDK передает значение без изменений из базового процесса CLI, соответствуя типу TypeScript ModelUsage:

Ключ Тип Описание
inputTokens int Входные токены для этой модели.
outputTokens int Выходные токены для этой модели.
cacheReadInputTokens int Токены чтения кэша для этой модели.
cacheCreationInputTokens int Токены создания кэша для этой модели.
webSearchRequests int Запросы веб-поиска, сделанные этой моделью.
thinkingTokens int Токены мышления, созданные этой моделью, уже подсчитанные в outputTokens. Отсутствуют до тех пор, пока ход не запустится на версии Claude Code, которая его записывает, и не объявлены в TypedDict, поэтому читайте его с .get(). Требуется Python Agent SDK 0.2.150 или позже, чей поставляемый CLI его записывает.
costUSD float Предполагаемая стоимость в USD для этой модели, вычисленная на стороне клиента. См. Track cost and usage для предостережений выставления счетов.
contextWindow int Размер окна контекста для этой модели.
maxOutputTokens int Максимальный лимит выходных токенов для этой модели.
canonicalModel str Канонический ID модели, используемый для поиска цены. Может отличаться от необработанной строки модели, по которой индексируется запись, такой как ID или псевдоним, специфичный для поставщика. Не всегда присутствует.
provider str Поставщик API, который обслуживал эту модель, такой как firstParty, bedrock, vertex, foundry, anthropicAws, mantle или gateway. Не всегда присутствует.

`StreamEvent`

Событие потока для частичных обновлений сообщений во время потоковой передачи. Получается только когда include_partial_messages=True в ClaudeAgentOptions. Импортируйте через from claude_agent_sdk.types import StreamEvent.

@dataclass
class StreamEvent:
    uuid: str
    session_id: str
    event: dict[str, Any]  # The raw Claude API stream event
    parent_tool_use_id: str | None = None
Поле Тип Описание
uuid str Уникальный идентификатор для этого события
session_id str Идентификатор сеанса
event dict[str, Any] Необработанные данные события потока Claude API
parent_tool_use_id str | None Всегда None. События потока выдаются только для основного сеанса. Для атрибуции подагента используйте полные сообщения, такие как AssistantMessage

`RateLimitEvent`

Выдается при изменении статуса ограничения скорости (например, с "allowed" на "allowed_warning"). Используйте это для предупреждения пользователей перед достижением жесткого лимита или для отката, когда статус "rejected".

@dataclass
class RateLimitEvent:
    rate_limit_info: RateLimitInfo
    uuid: str
    session_id: str
Поле Тип Описание
rate_limit_info RateLimitInfo Текущее состояние ограничения скорости
uuid str Уникальный идентификатор события
session_id str Идентификатор сеанса

`RateLimitInfo`

Состояние ограничения скорости, переносимое RateLimitEvent.

RateLimitStatus = Literal["allowed", "allowed_warning", "rejected"]
RateLimitType = Literal[
    "five_hour", "seven_day", "seven_day_opus", "seven_day_sonnet", "overage"
]


@dataclass
class RateLimitInfo:
    status: RateLimitStatus
    resets_at: int | None = None
    rate_limit_type: RateLimitType | None = None
    utilization: float | None = None
    overage_status: RateLimitStatus | None = None
    overage_resets_at: int | None = None
    overage_disabled_reason: str | None = None
    raw: dict[str, Any] = field(default_factory=dict)
Поле Тип Описание
status RateLimitStatus Текущий статус, один из "allowed", "allowed_warning" или "rejected". "allowed_warning" означает приближение к лимиту; "rejected" означает, что лимит был достигнут
resets_at int | None Временная метка Unix, когда окно ограничения скорости сбрасывается
rate_limit_type RateLimitType | None Какое окно ограничения скорости применяется
utilization float | None Доля потребленного ограничения скорости (0,0 до 1,0)
overage_status RateLimitStatus | None Статус использования переплаты по мере использования, если применимо
overage_resets_at int | None Временная метка Unix, когда окно переплаты сбрасывается
overage_disabled_reason str | None Почему переплата недоступна, если статус "rejected"
raw dict[str, Any] Полный необработанный словарь из CLI, включая поля, не смоделированные выше

`ConversationResetMessage`

Выдается при замене разговора без завершения соединения, например после /clear. См. Track costs in streaming input mode для того, как сброс влияет на текущие итоги на последующих объектах ResultMessage. Требуется Python Agent SDK 0.2.137 или позже.

@dataclass
class ConversationResetMessage:
    new_conversation_id: str
    uuid: str
    session_id: str
Поле Тип Описание
new_conversation_id str Непрозрачный идентификатор для свежего разговора. Не session_id последующих сообщений; читайте это из следующего сообщения
uuid str Уникальный идентификатор сообщения
session_id str ID сеанса, который был сброшен. Сообщения после сброса содержат новый session_id

`TaskStartedMessage`

Выдается при запуске фоновой задачи. Фоновая задача - это все, что отслеживается вне основного хода: фоновая команда Bash, наблюдение Monitor, подагент, порожденный через инструмент Agent, или удаленный агент. Поле task_type говорит вам, какой. Это именование не связано с переименованием инструмента Task на Agent.

@dataclass
class TaskStartedMessage(SystemMessage):
    task_id: str
    description: str
    uuid: str
    session_id: str
    tool_use_id: str | None = None
    task_type: str | None = None
Поле Тип Описание
task_id str Уникальный идентификатор для задачи
description str Описание задачи
uuid str Уникальный идентификатор сообщения
session_id str Идентификатор сеанса
tool_use_id str | None Связанный ID использования инструмента
task_type str | None Какой вид фоновой задачи: "local_bash" для фонового Bash и наблюдений Monitor, "local_agent" или "remote_agent"

`TaskUsage`

Данные токенов и времени для фоновой задачи.

class TaskUsage(TypedDict):
    total_tokens: int
    tool_uses: int
    duration_ms: int

`TaskProgressMessage`

Выдается периодически с обновлениями прогресса для выполняющейся фоновой задачи.

@dataclass
class TaskProgressMessage(SystemMessage):
    task_id: str
    description: str
    usage: TaskUsage
    uuid: str
    session_id: str
    tool_use_id: str | None = None
    last_tool_name: str | None = None
Поле Тип Описание
task_id str Уникальный идентификатор для задачи
description str Описание текущего статуса
usage TaskUsage Использование токенов для этой задачи до сих пор
uuid str Уникальный идентификатор сообщения
session_id str Идентификатор сеанса
tool_use_id str | None Связанный ID использования инструмента
last_tool_name str | None Имя последнего инструмента, который использовала задача

`TaskNotificationMessage`

Выдается при завершении, сбое или остановке фоновой задачи. Фоновые задачи включают команды Bash run_in_background, наблюдения Monitor и фоновые подагенты.

@dataclass
class TaskNotificationMessage(SystemMessage):
    task_id: str
    status: TaskNotificationStatus  # "completed" | "failed" | "stopped"
    output_file: str
    summary: str
    uuid: str
    session_id: str
    tool_use_id: str | None = None
    usage: TaskUsage | None = None
Поле Тип Описание
task_id str Уникальный идентификатор для задачи
status TaskNotificationStatus Один из "completed", "failed" или "stopped"
output_file str Путь к файлу вывода задачи
summary str Резюме результата задачи
uuid str Уникальный идентификатор сообщения
session_id str Идентификатор сеанса
tool_use_id str | None Связанный ID использования инструмента
usage TaskUsage | None Финальное использование токенов для задачи

Когда CLI перемещает длительный вызов инструмента MCP в фон, результат инструмента для этого вызова содержит только заполнитель, и реальный результат вызова поступает в это сообщение. При уведомлении "completed" для такого вызова CLI добавляет ключ resource_links, перечисляющий файлы, возвращенные инструментом по ссылке, с теми же записями и ограничениями, что и ключ resourceLinks на UserMessage.tool_use_result. Ключ resource_links требует Python Agent SDK 0.2.150 или позже и Claude Code v2.1.257 или позже; CLI, поставляемый с этой версией SDK, удовлетворяет требованию Claude Code.

Dataclass не имеет поля для resource_links. Читайте его из словаря data, который сообщение наследует от SystemMessage: message.data.get("resource_links"). Сопоставьте уведомление с вызовом, используя tool_use_id. CLI опускает ключ, когда результат не содержал ссылок и при уведомлениях для задач, которые не являются вызовами инструментов MCP.

Типы блоков содержимого

`ContentBlock`

Тип объединения всех блоков содержимого.

ContentBlock = (
    TextBlock
    | ThinkingBlock
    | ToolUseBlock
    | ToolResultBlock
    | ServerToolUseBlock
    | ServerToolResultBlock
)

`TextBlock`

Блок содержимого текста.

@dataclass
class TextBlock:
    text: str

`ThinkingBlock`

Блок содержимого мышления (для моделей с возможностью мышления).

@dataclass
class ThinkingBlock:
    thinking: str
    signature: str

`ToolUseBlock`

Блок запроса использования инструмента.

@dataclass
class ToolUseBlock:
    id: str
    name: str
    input: dict[str, Any]

`ToolResultBlock`

Блок результата выполнения инструмента.

@dataclass
class ToolResultBlock:
    tool_use_id: str
    content: str | list[dict[str, Any]] | None = None
    is_error: bool | None = None

Типы ошибок

Типы ниже определяют, что ваш код перехватывает. Для записей, привязанных к сообщениям об ошибках, которые эти типы вызывают, с причиной и исправлением для каждого, см. Troubleshooting.

`ClaudeSDKError`

Базовый класс исключения для всех ошибок SDK.

class ClaudeSDKError(Exception):
    """Base error for Claude SDK."""

Когда одноразовый query() заканчивается результатом ошибки, например ошибкой превышения лимита ходов, SDK вызывает ResultError после выдачи финального сообщения результата. Версии Python Agent SDK до 0.2.140 вызывали простое Exception, которое не было подклассом ClaudeSDKError.

`CLINotFoundError`

Вызывается, когда Claude Code CLI не установлен или не найден.

class CLINotFoundError(CLIConnectionError):
    def __init__(
        self, message: str = "Claude Code not found", cli_path: str | None = None
    ):
        """
        Args:
            message: Error message (default: "Claude Code not found")
            cli_path: Optional path to the CLI that was not found
        """

`CLIConnectionError`

Вызывается, когда соединение с Claude Code не удается.

class CLIConnectionError(ClaudeSDKError):
    """Failed to connect to Claude Code."""

`ProcessError`

Вызывается, когда процесс Claude Code не работает.

class ProcessError(ClaudeSDKError):
    def __init__(
        self, message: str, exit_code: int | None = None, stderr: str | None = None
    ):
        self.exit_code = exit_code
        self.stderr = stderr

`ResultError`

Вызывается после финального ResultMessage, когда процесс Claude Code завершается, потому что запуск закончился результатом ошибки, таким как ошибка превышения лимита ходов или ошибка API. ResultError является подклассом ProcessError, поэтому существующий обработчик except ProcessError также его перехватывает. Его атрибуты содержат поля этого сообщения результата, поэтому вы можете разветвляться в зависимости от причины сбоя запуска без анализа текста сообщения. Требуется Python Agent SDK версии 0.2.140 или позже.

class ResultError(ProcessError):
    subtype: str | None  # "error_max_turns", "error_during_execution", ...; "success" when the run ended on a failed request
    errors: list[str]  # an empty list when the result message reported none
    result: str | None
    api_error_status: int | None
    terminal_reason: str | None  # "max_turns", "api_error", ...; check this before subtype
    session_id: str | None
    data: dict[str, Any]  # the raw result message payload

Чтобы различить сбои, проверьте terminal_reason перед subtype. Когда финальный запрос не удается, например при ошибке API, Claude Code сообщает subtype "success" с причиной в terminal_reason, например "api_error"; когда лимит, который вы установили, завершает запуск, такой как max_turns или max_budget_usd, он сообщает подтип error_*.

`CLIJSONDecodeError`

Вызывается, когда разбор JSON не удается.

class CLIJSONDecodeError(ClaudeSDKError):
    def __init__(self, line: str, original_error: Exception):
        """
        Args:
            line: The line that failed to parse
            original_error: The original JSON decode exception
        """
        self.line = line
        self.original_error = original_error

Типы hooks

Для полного руководства по использованию hooks с примерами и общими шаблонами см. Hooks guide.

`HookEvent`

Поддерживаемые типы событий hooks.

HookEvent = Literal[
    "PreToolUse",  # Called before tool execution
    "PostToolUse",  # Called after tool execution
    "PostToolUseFailure",  # Called when a tool execution fails
    "UserPromptSubmit",  # Called when user submits a prompt
    "Stop",  # Called when stopping execution
    "SubagentStop",  # Called when a subagent stops
    "PreCompact",  # Called before message compaction
    "Notification",  # Called for notification events
    "SubagentStart",  # Called when a subagent starts
    "PermissionRequest",  # Called when a permission decision is needed
]

`HookCallback`

Определение типа для функций обратного вызова hooks.

HookCallback = Callable[[HookInput, str | None, HookContext], Awaitable[HookJSONOutput]]

Параметры:

  • input: Строго типизированный ввод hooks с дискриминированными объединениями на основе hook_event_name (см. HookInput)
  • tool_use_id: Дополнительный идентификатор использования инструмента (для hooks, связанных с инструментами)
  • context: Контекст hooks с дополнительной информацией

Возвращает HookJSONOutput.

`HookContext`

Информация контекста, передаваемая в обратные вызовы hooks.

class HookContext(TypedDict):
    signal: Any | None  # Future: abort signal support

`HookMatcher`

Конфигурация для сопоставления hooks с определенными событиями или инструментами.

@dataclass
class HookMatcher:
    matcher: str | None = (
        None  # Tool name or pattern to match (e.g., "Bash", "Write|Edit")
    )
    hooks: list[HookCallback] = field(
        default_factory=list
    )  # List of callbacks to execute
    timeout: float | None = (
        None  # Timeout in seconds. When omitted, the per-event default applies:
        # 600 for most events, 30 for UserPromptSubmit
    )

`HookInput`

Тип объединения всех типов ввода hooks. Фактический тип зависит от поля hook_event_name.

HookInput = (
    PreToolUseHookInput
    | PostToolUseHookInput
    | PostToolUseFailureHookInput
    | UserPromptSubmitHookInput
    | StopHookInput
    | SubagentStopHookInput
    | PreCompactHookInput
    | NotificationHookInput
    | SubagentStartHookInput
    | PermissionRequestHookInput
)

`BaseHookInput`

Базовые поля, присутствующие во всех типах ввода hooks.

class BaseHookInput(TypedDict):
    session_id: str
    transcript_path: str
    cwd: str
    permission_mode: NotRequired[str]
Поле Тип Описание
session_id str Текущий идентификатор сеанса
transcript_path str Путь к файлу стенограммы сеанса
cwd str Текущий рабочий каталог
permission_mode str (опционально) Текущий режим разрешений

`PreToolUseHookInput`

Входные данные для событий hooks PreToolUse.

class PreToolUseHookInput(BaseHookInput):
    hook_event_name: Literal["PreToolUse"]
    tool_name: str
    tool_input: dict[str, Any]
    tool_use_id: str
    agent_id: NotRequired[str]
    agent_type: NotRequired[str]
Поле Тип Описание
hook_event_name Literal["PreToolUse"] Всегда "PreToolUse"
tool_name str Имя инструмента, который вот-вот будет выполнен
tool_input dict[str, Any] Входные параметры для инструмента
tool_use_id str Уникальный идентификатор для этого использования инструмента
agent_id str (опционально) Идентификатор подагента, присутствует, когда hooks срабатывает внутри подагента
agent_type str (опционально) Тип подагента, присутствует, когда hooks срабатывает внутри подагента

`PostToolUseHookInput`

Входные данные для событий hooks PostToolUse.

class PostToolUseHookInput(BaseHookInput):
    hook_event_name: Literal["PostToolUse"]
    tool_name: str
    tool_input: dict[str, Any]
    tool_response: Any
    tool_use_id: str
    agent_id: NotRequired[str]
    agent_type: NotRequired[str]
Поле Тип Описание
hook_event_name Literal["PostToolUse"] Всегда "PostToolUse"
tool_name str Имя выполненного инструмента
tool_input dict[str, Any] Использованные входные параметры
tool_response Any Ответ от выполнения инструмента
tool_use_id str Уникальный идентификатор для этого использования инструмента
agent_id str (опционально) Идентификатор подагента, присутствует, когда hooks срабатывает внутри подагента
agent_type str (опционально) Тип подагента, присутствует, когда hooks срабатывает внутри подагента

`PostToolUseFailureHookInput`

Входные данные для событий hooks PostToolUseFailure. Вызывается, когда выполнение инструмента не удается.

class PostToolUseFailureHookInput(BaseHookInput):
    hook_event_name: Literal["PostToolUseFailure"]
    tool_name: str
    tool_input: dict[str, Any]
    tool_use_id: str
    error: str
    is_interrupt: NotRequired[bool]
    agent_id: NotRequired[str]
    agent_type: NotRequired[str]
Поле Тип Описание
hook_event_name Literal["PostToolUseFailure"] Всегда "PostToolUseFailure"
tool_name str Имя инструмента, который не удался
tool_input dict[str, Any] Использованные входные параметры
tool_use_id str Уникальный идентификатор для этого использования инструмента
error str Сообщение об ошибке из неудачного выполнения
is_interrupt bool (опционально) True, когда ошибка достигла Claude Code как прерывание, а не как ошибка, которую сообщил инструмент. Отмена выполняющегося инструмента с помощью interrupt() не срабатывает этот hooks; результат инструмента содержит сообщение о прерывании вместо этого
agent_id str (опционально) Идентификатор подагента, присутствует, когда hooks срабатывает внутри подагента
agent_type str (опционально) Тип подагента, присутствует, когда hooks срабатывает внутри подагента

`UserPromptSubmitHookInput`

Входные данные для событий hooks UserPromptSubmit.

class UserPromptSubmitHookInput(BaseHookInput):
    hook_event_name: Literal["UserPromptSubmit"]
    prompt: str
Поле Тип Описание
hook_event_name Literal["UserPromptSubmit"] Всегда "UserPromptSubmit"
prompt str Отправленная пользователем подсказка

`StopHookInput`

Входные данные для событий hooks Stop.

class StopHookInput(BaseHookInput):
    hook_event_name: Literal["Stop"]
    stop_hook_active: bool
Поле Тип Описание
hook_event_name Literal["Stop"] Всегда "Stop"
stop_hook_active bool Активен ли hooks остановки

`SubagentStopHookInput`

Входные данные для событий hooks SubagentStop.

class SubagentStopHookInput(BaseHookInput):
    hook_event_name: Literal["SubagentStop"]
    stop_hook_active: bool
    agent_id: str
    agent_transcript_path: str
    agent_type: str
Поле Тип Описание
hook_event_name Literal["SubagentStop"] Всегда "SubagentStop"
stop_hook_active bool Активен ли hooks остановки
agent_id str Уникальный идентификатор подагента
agent_transcript_path str Путь к файлу стенограммы подагента
agent_type str Тип подагента

`PreCompactHookInput`

Входные данные для событий hooks PreCompact.

class PreCompactHookInput(BaseHookInput):
    hook_event_name: Literal["PreCompact"]
    trigger: Literal["manual", "auto"]
    custom_instructions: str | None
Поле Тип Описание
hook_event_name Literal["PreCompact"] Всегда "PreCompact"
trigger Literal["manual", "auto"] Что вызвало уплотнение
custom_instructions str | None Пользовательские инструкции для уплотнения

`NotificationHookInput`

Входные данные для событий hooks Notification.

class NotificationHookInput(BaseHookInput):
    hook_event_name: Literal["Notification"]
    message: str
    title: NotRequired[str]
    notification_type: str
Поле Тип Описание
hook_event_name Literal["Notification"] Всегда "Notification"
message str Содержимое сообщения уведомления
title str (опционально) Название уведомления
notification_type str Тип уведомления

`SubagentStartHookInput`

Входные данные для событий hooks SubagentStart.

class SubagentStartHookInput(BaseHookInput):
    hook_event_name: Literal["SubagentStart"]
    agent_id: str
    agent_type: str
Поле Тип Описание
hook_event_name Literal["SubagentStart"] Всегда "SubagentStart"
agent_id str Уникальный идентификатор подагента
agent_type str Тип подагента

`PermissionRequestHookInput`

Входные данные для событий hooks PermissionRequest. Позволяет hooks программно обрабатывать решения разрешений.

class PermissionRequestHookInput(BaseHookInput):
    hook_event_name: Literal["PermissionRequest"]
    tool_name: str
    tool_input: dict[str, Any]
    permission_suggestions: NotRequired[list[Any]]
    agent_id: NotRequired[str]
    agent_type: NotRequired[str]
Поле Тип Описание
hook_event_name Literal["PermissionRequest"] Всегда "PermissionRequest"
tool_name str Имя инструмента, запрашивающего разрешение
tool_input dict[str, Any] Входные параметры для инструмента
permission_suggestions list[Any] (опционально) Предложенные обновления разрешений из CLI
agent_id str (опционально) Идентификатор подагента, присутствует, когда hooks срабатывает внутри подагента
agent_type str (опционально) Тип подагента, присутствует, когда hooks срабатывает внутри подагента

`HookJSONOutput`

Тип объединения для возвращаемых значений обратного вызова hooks.

HookJSONOutput = AsyncHookJSONOutput | SyncHookJSONOutput

`SyncHookJSONOutput`

Синхронный вывод hooks с полями управления и решения.

class SyncHookJSONOutput(TypedDict):
    # Control fields
    continue_: NotRequired[bool]  # Whether to proceed (default: True)
    suppressOutput: NotRequired[bool]  # Hide stdout from transcript
    stopReason: NotRequired[str]  # Message when continue is False

    # Decision fields
    decision: NotRequired[Literal["block"]]
    systemMessage: NotRequired[str]  # Warning message for user
    reason: NotRequired[str]  # Feedback for Claude

    # Hook-specific output
    hookSpecificOutput: NotRequired[HookSpecificOutput]

`HookSpecificOutput`

Дискриминированное объединение типов вывода, специфичных для события. Поле hookEventName определяет, какие поля действительны. Для полных деталей доступных полей для каждого события hooks см. Control execution with hooks.

class PreToolUseHookSpecificOutput(TypedDict):
    hookEventName: Literal["PreToolUse"]
    permissionDecision: NotRequired[Literal["allow", "deny", "ask", "defer"]]
    permissionDecisionReason: NotRequired[str]
    updatedInput: NotRequired[dict[str, Any]]
    additionalContext: NotRequired[str]


class PostToolUseHookSpecificOutput(TypedDict):
    hookEventName: Literal["PostToolUse"]
    additionalContext: NotRequired[str]
    updatedToolOutput: NotRequired[Any]
    updatedMCPToolOutput: NotRequired[Any]  # Deprecated: use updatedToolOutput, which works for all tools


class PostToolUseFailureHookSpecificOutput(TypedDict):
    hookEventName: Literal["PostToolUseFailure"]
    additionalContext: NotRequired[str]


class UserPromptSubmitHookSpecificOutput(TypedDict):
    hookEventName: Literal["UserPromptSubmit"]
    additionalContext: NotRequired[str]


class NotificationHookSpecificOutput(TypedDict):
    hookEventName: Literal["Notification"]
    additionalContext: NotRequired[str]


class SubagentStartHookSpecificOutput(TypedDict):
    hookEventName: Literal["SubagentStart"]
    additionalContext: NotRequired[str]


class PermissionRequestHookSpecificOutput(TypedDict):
    hookEventName: Literal["PermissionRequest"]
    decision: dict[str, Any]


HookSpecificOutput = (
    PreToolUseHookSpecificOutput
    | PostToolUseHookSpecificOutput
    | PostToolUseFailureHookSpecificOutput
    | UserPromptSubmitHookSpecificOutput
    | NotificationHookSpecificOutput
    | SubagentStartHookSpecificOutput
    | PermissionRequestHookSpecificOutput
)

`AsyncHookJSONOutput`

Асинхронный вывод hooks, который откладывает выполнение hooks.

class AsyncHookJSONOutput(TypedDict):
    async_: Literal[True]  # Set to True to defer execution
    asyncTimeout: NotRequired[int]  # Timeout in milliseconds

Пример использования hooks

Этот пример регистрирует два hooks: один, который блокирует опасные команды bash, такие как rm -rf /, и другой, который регистрирует все использование инструментов для аудита. Hooks безопасности работает только на командах Bash (через matcher), в то время как hooks логирования работает на всех инструментах.

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, HookMatcher, HookContext
from typing import Any


async def validate_bash_command(
    input_data: dict[str, Any], tool_use_id: str | None, context: HookContext
) -> dict[str, Any]:
    """Validate and potentially block dangerous bash commands."""
    if input_data["tool_name"] == "Bash":
        command = input_data["tool_input"].get("command", "")
        if "rm -rf /" in command:
            return {
                "hookSpecificOutput": {
                    "hookEventName": "PreToolUse",
                    "permissionDecision": "deny",
                    "permissionDecisionReason": "Dangerous command blocked",
                }
            }
    return {}


async def log_tool_use(
    input_data: dict[str, Any], tool_use_id: str | None, context: HookContext
) -> dict[str, Any]:
    """Log all tool usage for auditing."""
    print(f"Tool used: {input_data.get('tool_name')}")
    return {}


options = ClaudeAgentOptions(
    hooks={
        "PreToolUse": [
            HookMatcher(
                matcher="Bash", hooks=[validate_bash_command], timeout=120
            ),  # 2 min for validation
            HookMatcher(
                hooks=[log_tool_use]
            ),  # Applies to all tools (per-event default timeout)
        ],
        "PostToolUse": [HookMatcher(hooks=[log_tool_use])],
    }
)

async def main():
    async for message in query(prompt="Analyze this codebase", options=options):
        print(message)


asyncio.run(main())

Типы ввода/вывода инструментов

Документация схем ввода/вывода для всех встроенных инструментов Claude Code. Хотя Python SDK не экспортирует их как типы, они представляют структуру входов и выходов инструментов в сообщениях.

Agent

Имя инструмента: Agent. Предыдущее имя Task по-прежнему принимается как псевдоним, и список tools в инициализации SystemMessage сообщает об этом инструменте как Task для обратной совместимости.

Ввод:

{
    "description": str,  # Краткое описание задачи (3-5 слов)
    "prompt": str,  # Задача для выполнения агентом
    "subagent_type": str | None,  # Тип специализированного агента для использования
    "model": "sonnet" | "opus" | "haiku" | "fable" | None,  # Переопределение модели для этого агента
    "run_in_background": bool | None,  # Агенты запускаются в фоне по умолчанию; установите значение False для синхронного выполнения
    "name": str | None,  # Имя для порожденного агента
    "team_name": str | None,  # Устарело; игнорируется
    "mode": "acceptEdits" | "auto" | "bypassPermissions" | "default" | "dontAsk" | "plan" | None,  # Устарело; игнорируется. Правила наследования подагента определяют режим разрешений подагента
    "isolation": "worktree" | "remote" | None,  # Режим изоляции для изменений агента
}

Запускает нового агента для автономной обработки сложных многошаговых задач.

Вывод (статус: "completed"):

{
    "status": "completed",
    "agentId": str,  # ID агента, который был запущен
    "agentType": str | None,  # Тип подагента, который обработал задачу
    "content": [  # Блоки содержимого результата
        {
            "type": "text",
            "text": str,
            "citations": list | None,
        }
    ],
    "resolvedModel": str | None,  # Модель, на которой запустился подагент
    "modelsUsed": list[str] | None,  # Модели, использованные по порядку, с коллапсированными последовательными повторениями
    "totalToolUseCount": int,  # Количество вызовов инструментов, которые сделал агент
    "totalDurationMs": int,  # Длительность выполнения в миллисекундах
    "totalTokens": int,  # Количество токенов из финального запроса API, не из всего запуска
    "usage": {  # Статистика использования токенов
        "input_tokens": int,
        "output_tokens": int,
        "cache_creation_input_tokens": int | None,
        "cache_read_input_tokens": int | None,
        "server_tool_use": {"web_search_requests": int, "web_fetch_requests": int} | None,
        "service_tier": str | None,
        "cache_creation": {"ephemeral_1h_input_tokens": int, "ephemeral_5m_input_tokens": int} | None,
        "inference_geo": str | None,
        "speed": str | None,
        "iterations": Any | None,
        "output_tokens_details": {"thinking_tokens": int | None} | None,
    },
    "toolStats": {  # Совокупная активность инструментов для запуска
        "readCount": int,
        "searchCount": int,
        "bashCount": int,
        "editFileCount": int,
        "linesAdded": int,
        "linesRemoved": int,
        "otherToolCount": int,
        "frameCount": int | None,
    } | None,
    "prompt": str,  # Подсказка, которую запустил агент
    "worktreePath": str | None,  # Присутствует, когда Claude Code сохранил worktree подагента
    "worktreeBranch": str | None,  # Присутствует, когда Claude Code создал этот worktree с git
}

Вывод (статус: "async_launched"):

{
    "status": "async_launched",
    "isAsync": bool | None,  # True при фоновых запусках
    "agentId": str,  # ID запущенного агента
    "description": str,  # Описание задачи
    "resolvedModel": str | None,  # Модель, используемая при переходе в фоновый режим
    "modelsUsed": list[str] | None,  # Модели, использованные перед фоновым режимом, по порядку, с коллапсированными последовательными повторениями
    "prompt": str,  # Подсказка, которую запускает агент
    "outputFile": str,  # Путь файла, где записывается вывод агента
    "canReadOutputFile": bool | None,  # Может ли выходной файл быть прочитан напрямую
}

Вывод (статус: "remote_launched"):

{
    "status": "remote_launched",
    "taskId": str,  # ID удаленной задачи
    "sessionUrl": str,  # Ссылка на удаленный облачный сеанс
    "description": str,  # Описание задачи
    "prompt": str,  # Подсказка, которую запускает агент
    "outputFile": str,  # Путь файла, где записывается вывод агента
}

Возвращает результат от подагента. Вывод различается по полю status: "completed" для завершенных задач, "async_launched" для фоновых задач и "remote_launched" для задач, которые Claude Code отправил в удаленный облачный сеанс, где sessionUrl ссылается на этот сеанс и taskId его идентифицирует. Если Claude Code сохранил изолированный worktree подагента, worktreePath в варианте completed — это место, где его найти, и worktreeBranch — это его ветка, когда Claude Code создал worktree с git.

В варианте completed, resolvedModel называет модель, на которой запустился подагент, которая может отличаться от запрошенного входа model, когда применяется availableModels или другое переопределение. Это поле требует Claude Code v2.1.174 или позже. В варианте async_launched, resolvedModel называет модель, используемую, когда агент перешел в фоновый режим, поэтому обмен, произошедший перед фоновым режимом, отражается там. Поле modelsUsed в обоих вариантах перечисляет использованные модели по порядку, с коллапсированными последовательными повторениями; оно устанавливается только при обмене модели во время выполнения. modelsUsed и поведение resolvedModel во время фонового режима требуют Claude Code v2.1.212 или позже.

Claude Code заполняет usage и totalTokens из финального запроса API подагента, не из всего запуска. Когда присутствует, thinking_tokens под output_tokens_details в usage — это количество выходных токенов этого запроса, которые были токенами мышления. Ключ output_tokens_details требует Python SDK v0.2.136 или позже, который поставляется с Claude Code v2.1.228.

AskUserQuestion

Имя инструмента: AskUserQuestion

Задает пользователю уточняющие вопросы во время выполнения. См. Обработка одобрений и ввода пользователя для деталей использования.

Ввод:

{
    "questions": [  # Вопросы для пользователя (1-4 вопроса)
        {
            "question": str,  # Полный вопрос для пользователя
            "header": str,  # Очень короткая метка, отображаемая как чип/тег (макс 12 символов)
            "options": [  # Доступные варианты (2-4 варианта)
                {
                    "label": str,  # Текст отображения для этого варианта (1-5 слов)
                    "description": str,  # Объяснение того, что означает этот вариант
                    "preview": str | None,  # Содержимое предпросмотра, отображаемое при фокусировке на варианте
                }
            ],
            "multiSelect": bool,  # Установите значение true, чтобы разрешить множественный выбор
        }
    ],
    "answers": dict[str, str] | None,
    # Ответы пользователя, заполненные системой разрешений. Ответы с множественным выбором
    # — это строка, объединенная запятыми из выбранных меток; список меток принимается
    # на входе и приводится к этой форме
    "annotations": dict[str, dict] | None,
    # Аннотации для каждого вопроса от пользователя, ключ — текст вопроса.
    # Каждое значение может содержать "preview" (содержимое предпросмотра выбранного варианта)
    # и "notes" (свободные заметки по выбору)
    "metadata": dict | None,  # Метаданные аналитики, такие как {"source": "remember"}; не отображается пользователю
}

Вывод:

{
    "questions": [  # Вопросы, которые были заданы
        {
            "question": str,
            "header": str,
            "options": [{"label": str, "description": str, "preview": str | None}],
            "multiSelect": bool,
        }
    ],
    "answers": dict[str, str],  # Сопоставляет текст вопроса со строкой ответа
    # Ответы с множественным выбором разделены запятыми
    "response": str | None,
    # Свободный ответ, введенный вместо ответа на вопросы; когда установлено,
    # Claude получает "The user responded: ..." вместо списка ответов
    "annotations": dict[str, dict] | None,  # Аннотации "preview" и "notes" для каждого вопроса из выборов пользователя
    "afkTimeoutMs": int | None,  # Установлено, когда диалог автоматически разрешился после этого количества миллисекунд неактивности пользователя; отсутствует, когда пользователь ответил
}

Bash

Имя инструмента: Bash

Ввод:

{
    "command": str,  # Команда для выполнения
    "timeout": int | None,  # Необязательный тайм-аут в миллисекундах (макс 600000; более высокие значения зажимаются до максимума)
    "description": str | None,  # Четкое, краткое описание (5-10 слов)
    "run_in_background": bool | None,  # Установите значение true для выполнения в фоне
}

Вывод:

{
    "stdout": str,  # Вывод команды; stdout и stderr поступают объединенными в этот один чередующийся поток
    "stderr": str,  # Уведомления, которые добавляет сам инструмент, не stderr команды
    "interrupted": bool,  # Была ли команда прервана
    "isImage": bool | None,  # Содержит ли stdout данные изображения
    "backgroundTaskId": str | None,  # ID фоновой задачи, если команда выполняется в фоне
}

Monitor

Имя инструмента: Monitor

Запускает фоновый источник и доставляет каждое событие в Claude, чтобы он мог реагировать без опроса: command запускает скрипт и выдает одно событие на строку stdout, а ws открывает WebSocket и выдает одно событие на текстовый фрейм. Укажите ровно один из command или ws.

Когда Monitor запускает команду, он следует тем же правилам разрешений, что и Bash; наблюдение за WebSocket запрашивает одобрение отдельно. Источник ws требует Claude Code v2.1.195 или позже. См. Справочник инструмента Monitor для поведения и доступности поставщика.

Ввод:

{
    "command": str | None,  # Скрипт оболочки; каждая строка stdout является событием, выход завершает наблюдение
    "ws": dict | None,  # Источник WebSocket: {"url": str, "protocols": list[str] | None}; каждый текстовый фрейм является событием
    "description": str,  # Краткое описание, показываемое в уведомлениях
    "timeout_ms": int | None,  # Завершить после этого срока (по умолчанию 300000, макс 3600000; эффективный срок составляет максимум 1800000)
}

Вывод:

{
    "taskId": str,  # ID фоновой задачи мониторинга
    "timeoutMs": int,  # Эффективный срок тайм-аута в миллисекундах
    "persistent": bool | None,  # False: каждое наблюдение имеет срок
}

Edit

Имя инструмента: Edit

Ввод:

{
    "file_path": str,  # Абсолютный путь к файлу для изменения
    "old_string": str,  # Текст для замены
    "new_string": str,  # Текст для замены на
    "replace_all": bool | None,  # Заменить все вхождения (по умолчанию False)
}

Вывод:

{
    "message": str,  # Сообщение подтверждения
    "replacements": int,  # Количество выполненных замен
    "file_path": str,  # Путь файла, который был отредактирован
}

Read

Имя инструмента: Read

Ввод:

{
    "file_path": str,  # Абсолютный путь к файлу для чтения
    "offset": int | None,  # Номер строки для начала чтения
    "limit": int | None,  # Количество строк для чтения
}

Вывод (текстовые файлы):

{
    "content": str,  # Содержимое файла с номерами строк
    "total_lines": int,  # Общее количество строк в файле
    "lines_returned": int,  # Фактически возвращенные строки
}

Вывод (изображения):

{
    "image": str,  # Данные изображения в кодировке Base64
    "mime_type": str,  # MIME-тип изображения
    "file_size": int,  # Размер файла в байтах
}

Write

Имя инструмента: Write

Ввод:

{
    "file_path": str,  # Абсолютный путь к файлу для записи
    "content": str,  # Содержимое для записи в файл
}

Вывод:

{
    "message": str,  # Сообщение об успехе
    "bytes_written": int,  # Количество записанных байтов
    "file_path": str,  # Путь файла, который был записан
}

Glob

Имя инструмента: Glob

Ввод:

{
    "pattern": str,  # Шаблон glob для сопоставления файлов
    "path": str | None,  # Каталог для поиска (по умолчанию текущий каталог)
}

Вывод:

{
    "matches": list[str],  # Массив совпадающих путей файлов
    "count": int,  # Количество найденных совпадений
    "search_path": str,  # Использованный каталог поиска
}

Grep

Имя инструмента: Grep

Ввод:

{
    "pattern": str,  # Шаблон регулярного выражения
    "path": str | None,  # Файл или каталог для поиска
    "glob": str | None,  # Шаблон glob для фильтрации файлов
    "type": str | None,  # Тип файла для поиска
    "output_mode": str | None,  # "content", "files_with_matches" или "count"
    "-i": bool | None,  # Поиск без учета регистра
    "-n": bool | None,  # Показать номера строк
    "-B": int | None,  # Строки для отображения перед каждым совпадением
    "-A": int | None,  # Строки для отображения после каждого совпадения
    "-C": int | None,  # Строки для отображения до и после
    "head_limit": int | None,  # Ограничить вывод первыми N строками/записями
    "multiline": bool | None,  # Включить многострочный режим
}

Вывод (режим content):

{
    "matches": [
        {
            "file": str,
            "line_number": int | None,
            "line": str,
            "before_context": list[str] | None,
            "after_context": list[str] | None,
        }
    ],
    "total_matches": int,
}

Вывод (режим files_with_matches):

{
    "files": list[str],  # Файлы, содержащие совпадения
    "count": int,  # Количество файлов с совпадениями
}

NotebookEdit

Имя инструмента: NotebookEdit

Ввод:

{
    "notebook_path": str,  # Абсолютный путь к записной книжке Jupyter
    "cell_id": str | None,  # ID ячейки для редактирования
    "new_source": str,  # Новый исходный код для ячейки
    "cell_type": "code" | "markdown" | None,  # Тип ячейки
    "edit_mode": "replace" | "insert" | "delete" | None,  # Тип операции редактирования
}

Вывод:

{
    "message": str,  # Сообщение об успехе
    "edit_type": "replaced" | "inserted" | "deleted",  # Тип выполненного редактирования
    "cell_id": str | None,  # ID ячейки, которая была затронута
    "total_cells": int,  # Общее количество ячеек в записной книжке после редактирования
}

WebFetch

Имя инструмента: WebFetch

Ввод:

{
    "url": str,  # URL для получения содержимого
    "prompt": str,  # Подсказка для запуска на полученном содержимом
}

Вывод:

{
    "bytes": int,  # Размер полученного содержимого в байтах
    "code": int,  # Код ответа HTTP
    "codeText": str,  # Текст кода ответа HTTP
    "result": str,  # Обработанный результат от применения подсказки к содержимому
    "durationMs": int,  # Время получения и обработки содержимого в миллисекундах
    "url": str,  # URL, который был получен
}

WebSearch

Имя инструмента: WebSearch

Ввод:

{
    "query": str,  # Поисковый запрос для использования
    "allowed_domains": list[str] | None,  # Включать результаты только с этих доменов
    "blocked_domains": list[str] | None,  # Никогда не включать результаты с этих доменов
}

Вывод:

{
    "query": str,  # Поисковый запрос
    "results": list[str | {"tool_use_id": str, "content": list[{"title": str, "url": str}]}],
    "durationSeconds": float,  # Длительность поиска в секундах
}

TodoWrite

Имя инструмента: TodoWrite

Ввод:

{
    "todos": [
        {
            "content": str,  # Описание задачи
            "status": "pending" | "in_progress" | "completed",  # Статус задачи
            "activeForm": str,  # Активная форма описания
        }
    ]
}

Вывод:

{
    "message": str,  # Сообщение об успехе
    "stats": {"total": int, "pending": int, "in_progress": int, "completed": int},
}

TaskCreate

Имя инструмента: TaskCreate

Ввод:

{
    "subject": str,  # Краткое название задачи
    "description": str,  # Подробное описание задачи
    "activeForm": str | None,  # Метка в настоящем времени, показываемая во время выполнения
    "metadata": dict | None,  # Произвольные метаданные вызывающей стороны
}

Вывод:

{
    "task": {"id": str, "subject": str},  # Созданная задача с назначенным ID
}

TaskUpdate

Имя инструмента: TaskUpdate

Ввод:

{
    "taskId": str,  # ID задачи для обновления
    "status": Literal["pending", "in_progress", "completed", "deleted"] | None,
    "subject": str | None,
    "description": str | None,
    "activeForm": str | None,
    "addBlocks": list[str] | None,  # ID задач, которые эта задача теперь блокирует
    "addBlockedBy": list[str] | None,  # ID задач, которые теперь блокируют эту задачу
    "owner": str | None,
    "metadata": dict | None,
}

Вывод:

{
    "success": bool,
    "taskId": str,
    "updatedFields": list[str],  # Названия полей, которые изменились
    "error": str | None,
    "statusChange": {"from": str, "to": str} | None,
}

TaskGet

Имя инструмента: TaskGet

Ввод:

{
    "taskId": str,  # ID задачи для чтения
}

Вывод:

{
    "task": {
        "id": str,
        "subject": str,
        "description": str,
        "status": Literal["pending", "in_progress", "completed"],
        "blocks": list[str],
        "blockedBy": list[str],
    } | None,  # None, когда ID не найден
}

TaskList

Имя инструмента: TaskList

Ввод:

{}

Вывод:

{
    "tasks": [
        {
            "id": str,
            "subject": str,
            "status": Literal["pending", "in_progress", "completed"],
            "owner": str | None,
            "blockedBy": list[str],
        }
    ],
}

TaskOutput

Удалено в Claude Code v2.1.277. Ранее получало вывод из запущенной или завершенной фоновой задачи, с BashOutput, принимаемым как псевдоним; Claude читает выходной файл фоновой задачи с помощью Read вместо этого.

Запись disallowed_tools или правило отказа, которое по-прежнему называет любое имя, игнорируется без предупреждения.

TaskStop

Имя инструмента: TaskStop. Предыдущие имена KillShell и KillBash по-прежнему принимаются как псевдонимы.

Ввод:

{
    "task_id": str | None,  # ID фоновой задачи для остановки
    "shell_id": str | None,  # Устарело: используйте task_id вместо этого
}

Вывод:

{
    "message": str,  # Сообщение о статусе операции
    "task_id": str,  # ID остановленной задачи
    "task_type": str,  # Тип остановленной задачи
    "command": str | None,  # Команда или описание остановленной задачи
}

ExitPlanMode

Имя инструмента: ExitPlanMode

Ввод:

{
    "plan": str  # План для запуска пользователем на одобрение
}

Вывод:

{
    "message": str,  # Сообщение подтверждения
    "approved": bool | None,  # Одобрил ли пользователь план
}

ListMcpResources

Имя инструмента: ListMcpResourcesTool

Ввод:

{
    "server": str | None  # Необязательное имя сервера для фильтрации ресурсов
}

Вывод:

{
    "resources": [
        {
            "uri": str,
            "name": str,
            "description": str | None,
            "mimeType": str | None,
            "server": str,
        }
    ],
    "total": int,
}

ReadMcpResource

Имя инструмента: ReadMcpResourceTool

Ввод:

{
    "server": str,  # Имя сервера MCP
    "uri": str,  # URI ресурса для чтения
}

Вывод:

{
    "contents": [
        {"uri": str, "mimeType": str | None, "text": str | None, "blob": str | None}
    ],
    "server": str,
}

Построение интерфейса непрерывного разговора

Следующий пример сохраняет один ClaudeSDKClient подключённым на протяжении нескольких ходов, поэтому Claude помнит предыдущие сообщения. Введите new для отключения и повторного подключения для новой сессии или exit для завершения разговора.

from claude_agent_sdk import (
    ClaudeSDKClient,
    ClaudeAgentOptions,
    AssistantMessage,
    TextBlock,
)
import asyncio


class ConversationSession:
    """Maintains a single conversation session with Claude."""

    def __init__(self, options: ClaudeAgentOptions | None = None):
        self.client = ClaudeSDKClient(options)
        self.turn_count = 0

    async def start(self):
        await self.client.connect()
        print("Starting conversation session. Claude will remember context.")
        print(
            "Commands: 'exit' to quit, 'interrupt' to stop current task, 'new' for new session"
        )

        while True:
            user_input = input(f"\n[Turn {self.turn_count + 1}] You: ")

            if user_input.lower() == "exit":
                break
            elif user_input.lower() == "interrupt":
                await self.client.interrupt()
                print("Task interrupted!")
                continue
            elif user_input.lower() == "new":
                # Disconnect and reconnect for a fresh session
                await self.client.disconnect()
                await self.client.connect()
                self.turn_count = 0
                print("Started new conversation session (previous context cleared)")
                continue

            # Send message - the session retains all previous messages
            await self.client.query(user_input)
            self.turn_count += 1

            # Process response
            print(f"[Turn {self.turn_count}] Claude: ", end="")
            async for message in self.client.receive_response():
                if isinstance(message, AssistantMessage):
                    for block in message.content:
                        if isinstance(block, TextBlock):
                            print(block.text, end="")
            print()  # New line after response

        await self.client.disconnect()
        print(f"Conversation ended after {self.turn_count} turns.")


async def main():
    options = ClaudeAgentOptions(
        allowed_tools=["Read", "Write", "Bash"], permission_mode="acceptEdits"
    )
    session = ConversationSession(options)
    await session.start()


# Example conversation:
# Turn 1 - You: "Create a file called hello.py"
# Turn 1 - Claude: "I'll create a hello.py file for you..."
# Turn 2 - You: "What's in that file?"
# Turn 2 - Claude: "The hello.py file I just created contains..." (remembers!)
# Turn 3 - You: "Add a main function to it"
# Turn 3 - Claude: "I'll add a main function to hello.py..." (knows which file!)

asyncio.run(main())

Обработка ошибок

Следующий пример оборачивает вызов query() в обработчики для четырех из типов ошибок, которые вызывает SDK.

Этот пример перехватывает ResultError, что требует Python Agent SDK версии 0.2.140 или позже.

import asyncio

from claude_agent_sdk import (
    query,
    CLINotFoundError,
    ProcessError,
    ResultError,
    CLIJSONDecodeError,
)


async def main():
    try:
        async for message in query(prompt="Hello"):
            print(message)
    except CLINotFoundError:
        print(
            "Claude Code CLI not found. Try reinstalling: pip install --force-reinstall claude-agent-sdk"
        )
    # Catch ResultError before ProcessError, which it subclasses. Its message
    # carries the error text. A failed final request, such as an API error,
    # arrives with subtype "success", so branch on terminal_reason first.
    except ResultError as e:
        if e.terminal_reason == "api_error":
            print(f"API request failed: {e}")
        else:
            print(f"Query ended with an error result ({e.terminal_reason or e.subtype}): {e}")
    except ProcessError as e:
        print(f"Process failed with exit code: {e.exit_code}")
    except CLIJSONDecodeError as e:
        print(f"Failed to parse response: {e}")


asyncio.run(main())

Конфигурация Sandbox

`SandboxSettings`

Конфигурация для поведения sandbox. Используйте это для включения sandboxing команд и программной настройки ограничений сети.

class SandboxSettings(TypedDict, total=False):
    enabled: bool
    autoAllowBashIfSandboxed: bool
    excludedCommands: list[str]
    allowUnsandboxedCommands: bool
    network: SandboxNetworkConfig
    ignoreViolations: SandboxIgnoreViolations
    enableWeakerNestedSandbox: bool
Property Type Default Description
enabled bool False Включить режим sandbox для выполнения команд
autoAllowBashIfSandboxed bool True Автоматически одобрять bash команды, когда sandbox включен
excludedCommands list[str] [] Команды, которые обходят ограничения sandbox, такие как ["docker *"]. Они выполняются без sandbox автоматически без участия модели; sandbox.excludedCommands описывает, когда применяется запись
allowUnsandboxedCommands bool True Разрешить модели запрашивать выполнение команд вне sandbox. Когда True, модель может установить dangerouslyDisableSandbox в входных данных инструмента, что переходит к системе разрешений
network SandboxNetworkConfig None Конфигурация sandbox для сети
ignoreViolations SandboxIgnoreViolations None Настройка того, какие нарушения sandbox игнорировать
enableWeakerNestedSandbox bool False Включить более слабый вложенный sandbox для совместимости

Пример использования

import asyncio

from claude_agent_sdk import query, ClaudeAgentOptions

sandbox_settings = {
    "enabled": True,
    "autoAllowBashIfSandboxed": True,
    "failIfUnavailable": True,
    "network": {"allowLocalBinding": True},
}


async def main():
    try:
        async for message in query(
            prompt="Build and test my project",
            options=ClaudeAgentOptions(sandbox=sandbox_settings),
        ):
            print(message)
    except Exception as error:
        # A single-shot query() raises after yielding an error result,
        # such as when failIfUnavailable is set and the sandbox can't start.
        print(f"Session ended with an error: {error}")


asyncio.run(main())

`SandboxNetworkConfig`

Конфигурация для сети в режиме sandbox. Эти параметры применяются к sandboxed Bash командам, когда enabled имеет значение True в родительском SandboxSettings. Они не ограничивают инструмент WebFetch, который использует правила разрешений вместо этого.

class SandboxNetworkConfig(TypedDict, total=False):
    allowedDomains: list[str]
    deniedDomains: list[str]
    allowManagedDomainsOnly: bool
    allowUnixSockets: list[str]
    allowAllUnixSockets: bool
    allowLocalBinding: bool
    allowMachLookup: list[str]
    httpProxyPort: int
    socksProxyPort: int
Property Type Default Description
allowedDomains list[str] [] Имена доменов, к которым могут получить доступ процессы в sandbox
deniedDomains list[str] [] Имена доменов, к которым процессы в sandbox не могут получить доступ. Имеет приоритет над allowedDomains
allowManagedDomainsOnly bool False Только управляемые параметры: когда установлено в управляемых параметрах, игнорировать allowedDomains и WebFetch(domain:...) правила разрешений из источников неуправляемых параметров. Не имеет эффекта при установке через параметры SDK
allowUnixSockets list[str] [] Пути Unix socket, к которым могут получить доступ процессы (например, Docker socket)
allowAllUnixSockets bool False Разрешить доступ ко всем Unix sockets
allowLocalBinding bool False Разрешить процессам привязываться к локальным портам (например, для dev серверов)
allowMachLookup list[str] [] Только macOS: имена сервисов XPC/Mach для разрешения. Поддерживает завершающий подстановочный знак
httpProxyPort int None Порт HTTP прокси для сетевых запросов
socksProxyPort int None Порт SOCKS прокси для сетевых запросов

`SandboxIgnoreViolations`

Конфигурация для игнорирования определенных нарушений sandbox.

class SandboxIgnoreViolations(TypedDict, total=False):
    file: list[str]
    network: list[str]
Property Type Default Description
file list[str] [] Шаблоны путей файлов для игнорирования нарушений
network list[str] [] Шаблоны сети для игнорирования нарушений

Fallback системы разрешений для команд без Sandbox

Когда allowUnsandboxedCommands включен, модель может запросить выполнение команд вне sandbox, установив dangerouslyDisableSandbox: True во входных данных инструмента. Эти запросы переходят к существующей системе разрешений, что означает, что ваш обработчик can_use_tool будет вызван, позволяя вам реализовать пользовательскую логику авторизации.

Ваши записи excludedCommands вместо этого выводят команду из sandbox без участия модели; sandbox.excludedCommands описывает, когда применяется запись.

Следующий пример регистрирует каждый запрос без sandbox и отклоняет его, если только ваша собственная логика авторизации не разрешит это:

import asyncio
from claude_agent_sdk import (
    query,
    ClaudeAgentOptions,
    HookMatcher,
    PermissionResultAllow,
    PermissionResultDeny,
    ToolPermissionContext,
)


def is_command_authorized(command: str | None) -> bool:
    # Replace with your own authorization logic
    return False



async def can_use_tool(
    tool: str, input: dict, context: ToolPermissionContext
) -> PermissionResultAllow | PermissionResultDeny:
    # Check if the model is requesting to bypass the sandbox
    if tool == "Bash" and input.get("dangerouslyDisableSandbox"):
        # The model is requesting to run this command outside the sandbox
        print(f"Unsandboxed command requested: {input.get('command')}")

        if is_command_authorized(input.get("command")):
            return PermissionResultAllow()
        return PermissionResultDeny(
            message="Command not authorized for unsandboxed execution"
        )
    return PermissionResultAllow()


# Required: dummy hook keeps the stream open for can_use_tool
async def dummy_hook(input_data, tool_use_id, context):
    return {"continue_": True}


async def prompt_stream():
    yield {
        "type": "user",
        "message": {"role": "user", "content": "Deploy my application"},
    }


async def main():
    async for message in query(
        prompt=prompt_stream(),
        options=ClaudeAgentOptions(
            sandbox={
                "enabled": True,
                "allowUnsandboxedCommands": True,  # Model can request unsandboxed execution
            },
            permission_mode="default",
            can_use_tool=can_use_tool,
            hooks={"PreToolUse": [HookMatcher(matcher=None, hooks=[dummy_hook])]},
        ),
    ):
        print(message)


asyncio.run(main())

См. также