Loading...
    • Руководство разработчика
    • Справочник API
    • MCP
    • Ресурсы
    • Примечания к выпуску
    Search...
    ⌘K
    Первые шаги
    Введение в ClaudeБыстрый старт
    Модели и цены
    Обзор моделейВыбор моделиЧто нового в Claude 4.6Руководство миграцииУстаревшие моделиЦены
    Разработка с Claude
    Обзор функцийИспользование Messages APIОбработка причин остановкиЛучшие практики промптирования
    Возможности модели
    Extended thinkingAdaptive thinkingУсилиеБыстрый режим (preview)Структурированные выходные данныеЦитированияПотоковая передача сообщенийПакетная обработкаПоддержка PDFРезультаты поискаМногоязычная поддержкаEmbeddingsЗрение
    Инструменты
    ОбзорКак реализовать использование инструментовИнструмент веб-поискаИнструмент веб-загрузкиИнструмент выполнения кодаИнструмент памятиИнструмент BashИнструмент управления компьютеромИнструмент текстового редактора
    Инфраструктура инструментов
    Поиск инструментовПрограммный вызов инструментовПотоковая передача инструментов с детализацией
    Управление контекстом
    Контекстные окнаСжатиеРедактирование контекстаКэширование промптовПодсчет токенов
    Файлы и ресурсы
    Files API
    Agent Skills
    ОбзорБыстрый стартЛучшие практикиSkills для предприятийИспользование Skills с API
    Agent SDK
    ОбзорБыстрый стартTypeScript SDKTypeScript V2 (preview)Python SDKРуководство миграции
    MCP в API
    MCP коннекторУдаленные MCP серверы
    Claude на платформах третьих сторон
    Amazon BedrockMicrosoft FoundryVertex AI
    Инженерия промптов
    ОбзорГенератор промптовИспользование шаблонов промптовУлучшитель промптовБудьте ясны и прямолинейныИспользуйте примеры (многошаговое промптирование)Дайте Claude думать (CoT)Используйте XML тегиДайте Claude роль (системные промпты)Цепочка сложных промптовСоветы для длинного контекстаСоветы для Extended thinking
    Тестирование и оценка
    Определение критериев успехаРазработка тестовых случаевИспользование инструмента оценкиСнижение задержки
    Укрепление защиты
    Снижение галлюцинацийУвеличение согласованности выходных данныхСмягчение jailbreaksПотоковая передача отказовСнижение утечки промптаДержите Claude в образе
    Администрирование и мониторинг
    Обзор Admin APIРезидентность данныхРабочие пространстваUsage and Cost APIClaude Code Analytics APIZero Data Retention
    Console
    Log in
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...

    Solutions

    • AI agents
    • Code modernization
    • Coding
    • Customer support
    • Education
    • Financial services
    • Government
    • Life sciences

    Partners

    • Amazon Bedrock
    • Google Cloud's Vertex AI

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Company

    • Anthropic
    • Careers
    • Economic Futures
    • Research
    • News
    • Responsible Scaling Policy
    • Security and compliance
    • Transparency

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Help and security

    • Availability
    • Status
    • Support
    • Discord

    Terms and policies

    • Privacy policy
    • Responsible disclosure policy
    • Terms of service: Commercial
    • Terms of service: Consumer
    • Usage policy
    Agent SDK

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

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

    Установка

    pip install claude-agent-sdk

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

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

    Быстрое сравнение

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

    Когда использовать query() (новый сеанс каждый раз)

    Лучше всего для:

    • Одноразовых вопросов, где вам не нужна история разговора
    • Независимых задач, которые не требуют контекста из предыдущих обменов
    • Простых скриптов автоматизации
    • Когда вы хотите начать с нуля каждый раз

    Когда использовать ClaudeSDKClient (непрерывный разговор)

    Лучше всего для:

    • Продолжения разговоров - Когда вам нужно, чтобы Claude помнил контекст
    • Уточняющих вопросов - Построение на основе предыдущих ответов
    • Интерактивных приложений - Интерфейсы чата, REPL
    • Логики, управляемой ответами - Когда следующее действие зависит от ответа Claude
    • Управления сеансом - Явное управление жизненным циклом разговора

    Функции

    query()

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

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

    Параметры

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

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

    Возвращает 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',
            cwd="/home/user/project"
        )
    
        async for message in query(
            prompt="Create a Python web server",
            options=options
        ):
            print(message)
    
    
    asyncio.run(main())

    tool()

    Декоратор для определения инструментов MCP с типобезопасностью.

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

    Параметры

    ПараметрТипОписание
    namestrУникальный идентификатор инструмента
    descriptionstrПонятное описание того, что делает инструмент
    input_schematype | dict[str, Any]Схема, определяющая входные параметры инструмента (см. ниже)

    Опции входной схемы

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

    create_sdk_mcp_server()

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

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

    Параметры

    ПараметрТипПо умолчаниюОписание
    namestr-Уникальный идентификатор сервера
    versionstr"1.0.0"Строка версии сервера
    toolslist[SdkMcpTool[Any]] | NoneNoneСписок функций инструментов, созданных с декоратором @tool

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

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

    Пример

    from claude_agent_sdk import tool, create_sdk_mcp_server
    
    @tool("add", "Add two numbers", {"a": float, "b": float})
    async def add(args):
        return {
            "content": [{
                "type": "text",
                "text": f"Sum: {args['a'] + args['b']}"
            }]
        }
    
    @tool("multiply", "Multiply two numbers", {"a": float, "b": float})
    async def multiply(args):
        return {
            "content": [{
                "type": "text",
                "text": f"Product: {args['a'] * args['b']}"
            }]
        }
    
    calculator = create_sdk_mcp_server(
        name="calculator",
        version="2.0.0",
        tools=[add, multiply]  # Pass decorated functions
    )
    
    # Use with Claude
    options = ClaudeAgentOptions(
        mcp_servers={"calc": calculator},
        allowed_tools=["mcp__calc__add", "mcp__calc__multiply"]
    )

    Классы

    ClaudeSDKClient

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

    Ключевые функции

    • Непрерывность сеанса: Сохраняет контекст разговора на протяжении нескольких вызовов query()
    • Один разговор: Claude помнит предыдущие сообщения в сеансе
    • Поддержка прерываний: Может остановить Claude во время выполнения
    • Явный жизненный цикл: Вы контролируете, когда сеанс начинается и заканчивается
    • Логика, управляемая ответами: Может реагировать на ответы и отправлять уточнения
    • Пользовательские инструменты и хуки: Поддерживает пользовательские инструменты (созданные с декоратором @tool) и хуки
    class ClaudeSDKClient:
        def __init__(self, options: ClaudeAgentOptions | 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 rewind_files(self, user_message_uuid: str) -> None
        async def disconnect(self) -> None

    Методы

    МетодОписание
    __init__(options)Инициализирует клиент с необязательной конфигурацией
    connect(prompt)Подключается к Claude с необязательной начальной подсказкой или потоком сообщений
    query(prompt, session_id)Отправляет новый запрос в потоковом режиме
    receive_messages()Получает все сообщения от Claude в виде асинхронного итератора
    receive_response()Получает сообщения до и включая ResultMessage
    interrupt()Отправляет сигнал прерывания (работает только в потоковом режиме)
    rewind_files(user_message_uuid)Восстанавливает файлы в их состояние в указанном пользовательском сообщении. Требует enable_file_checkpointing=True. См. Контрольные точки файлов
    disconnect()Отключается от Claude

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

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

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

    Важно: При итерации по сообщениям избегайте использования 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 - Claude remembers 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": "text", "text": "Analyze the following data:"}
        await asyncio.sleep(0.5)
        yield {"type": "text", "text": "Temperature: 25°C"}
        await asyncio.sleep(0.5)
        yield {"type": "text", "text": "Humidity: 60%"}
        await asyncio.sleep(0.5)
        yield {"type": "text", "text": "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
    
    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")
    
            # Let it run for a bit
            await asyncio.sleep(2)
    
            # Interrupt the task
            await client.interrupt()
            print("Task interrupted!")
    
            # Send a new command
            await client.query("Just say hello instead")
    
            async for message in client.receive_response():
                # Process the new response
                pass
    
    asyncio.run(interruptible_task())

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

    from claude_agent_sdk import (
        ClaudeSDKClient,
        ClaudeAgentOptions
    )
    from claude_agent_sdk.types import PermissionResultAllow, PermissionResultDeny
    
    async def custom_permission_handler(
        tool_name: str,
        input_data: dict,
        context: dict
    ) -> 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():
        options = ClaudeAgentOptions(
            can_use_tool=custom_permission_handler,
            allowed_tools=["Read", "Write", "Edit"]
        )
    
        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.

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

    ClaudeAgentOptions

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

    @dataclass
    class ClaudeAgentOptions:
        tools: list[str] | ToolsPreset | None = None
        allowed_tools: list[str] = field(default_factory=list)
        system_prompt: str | SystemPromptPreset | None = None
        mcp_servers: dict[str, McpServerConfig] | str | Path = field(default_factory=dict)
        permission_mode: PermissionMode | None = None
        continue_conversation: bool = False
        resume: str | None = None
        max_turns: int | None = None
        max_budget_usd: float | None = None
        disallowed_tools: list[str] = field(default_factory=list)
        model: str | None = None
        fallback_model: str | None = None
        betas: list[SdkBeta] = field(default_factory=list)
        output_format: OutputFormat | 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
        fork_session: bool = False
        agents: dict[str, AgentDefinition] | None = None
        setting_sources: list[SettingSource] | None = None
        max_thinking_tokens: int | None = None
    СвойствоТипПо умолчаниюОписание
    toolslist[str] | ToolsPreset | NoneNoneКонфигурация инструментов. Используйте {"type": "preset", "preset": "claude_code"} для инструментов Claude Code по умолчанию
    allowed_toolslist[str][]Список разрешенных имен инструментов
    system_promptstr | SystemPromptPreset | NoneNoneКонфигурация системной подсказки. Передайте строку для пользовательской подсказки или используйте {"type": "preset", "preset": "claude_code"} для системной подсказки Claude Code. Добавьте "append" для расширения предустановки
    mcp_serversdict[str, McpServerConfig] | str | Path{}Конфигурации MCP сервера или путь к файлу конфигурации
    permission_modePermissionMode | NoneNoneРежим разрешений для использования инструментов
    continue_conversationboolFalseПродолжить самый последний разговор
    resumestr | NoneNoneID сеанса для возобновления
    max_turnsint | NoneNoneМаксимальное количество ходов разговора
    max_budget_usdfloat | NoneNoneМаксимальный бюджет в USD для сеанса
    disallowed_toolslist[str][]Список запрещенных имен инструментов
    enable_file_checkpointingboolFalseВключить отслеживание изменений файлов для перемотки. См. Контрольные точки файлов
    modelstr | NoneNoneМодель Claude для использования
    fallback_modelstr | NoneNoneРезервная модель для использования, если основная модель не работает
    betaslist[SdkBeta][]Функции бета-версии для включения. См. SdkBeta для доступных опций
    output_formatOutputFormat | NoneNoneОпределите формат вывода для результатов агента. См. Структурированные выходы для деталей
    permission_prompt_tool_namestr | NoneNoneИмя инструмента MCP для подсказок разрешений
    cwdstr | Path | NoneNoneТекущий рабочий каталог
    cli_pathstr | Path | NoneNoneПользовательский путь к исполняемому файлу Claude Code CLI
    settingsstr | NoneNoneПуть к файлу настроек
    add_dirslist[str | Path][]Дополнительные каталоги, к которым Claude может получить доступ
    envdict[str, str]{}Переменные окружения
    extra_argsdict[str, str | None]{}Дополнительные аргументы CLI для передачи непосредственно в CLI
    max_buffer_sizeint | NoneNoneМаксимальное количество байтов при буферизации stdout CLI
    debug_stderrAnysys.stderrУстарело - Объект, похожий на файл, для вывода отладки. Используйте вместо этого обратный вызов stderr
    stderrCallable[[str], None] | NoneNoneФункция обратного вызова для вывода stderr из CLI
    can_use_toolCanUseTool | NoneNoneФункция обратного вызова разрешения инструмента. См. Типы разрешений для деталей
    hooksdict[HookEvent, list[HookMatcher]] | NoneNoneКонфигурации хуков для перехвата событий
    userstr | NoneNoneИдентификатор пользователя
    include_partial_messagesboolFalseВключить события потокового сообщения с частичным сообщением. Если включено, выдаются сообщения StreamEvent
    fork_sessionboolFalseПри возобновлении с resume разветвить на новый ID сеанса вместо продолжения исходного сеанса
    agentsdict[str, AgentDefinition] | NoneNoneПрограммно определенные подагенты
    pluginslist[SdkPluginConfig][]Загрузить пользовательские плагины из локальных путей. См. Плагины для деталей
    sandboxSandboxSettings | NoneNoneПрограммно настройте поведение песочницы. См. Параметры песочницы для деталей
    setting_sourceslist[SettingSource] | NoneNone (нет настроек)Контролируйте, какие параметры файловой системы загружать. Если опущено, параметры не загружаются. Примечание: Должно включать "project" для загрузки файлов CLAUDE.md
    max_thinking_tokensint | NoneNoneМаксимальное количество токенов для блоков мышления

    OutputFormat

    Конфигурация для валидации структурированного вывода.

    class OutputFormat(TypedDict):
        type: Literal["json_schema"]
        schema: dict[str, Any]
    ПолеОбязательноОписание
    typeДаДолжно быть "json_schema" для валидации JSON Schema
    schemaДаОпределение JSON Schema для валидации вывода

    SystemPromptPreset

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

    class SystemPromptPreset(TypedDict):
        type: Literal["preset"]
        preset: Literal["claude_code"]
        append: NotRequired[str]
    ПолеОбязательноОписание
    typeДаДолжно быть "preset" для использования предустановленной системной подсказки
    presetДаДолжно быть "claude_code" для использования системной подсказки Claude Code
    appendНетДополнительные инструкции для добавления к предустановленной системной подсказке

    SettingSource

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

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

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

    Когда setting_sources опущен или None, SDK не загружает никакие параметры файловой системы. Это обеспечивает изоляцию для приложений SDK.

    Почему использовать setting_sources?

    Загрузить все параметры файловой системы (поведение прежних версий):

    # Load all settings like SDK v0.0.x did
    from claude_agent_sdk import query, ClaudeAgentOptions
    
    async for message in query(
        prompt="Analyze this code",
        options=ClaudeAgentOptions(
            setting_sources=["user", "project", "local"]  # Load all settings
        )
    ):
        print(message)

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

    # Load only project settings, ignore user and local
    async for message in query(
        prompt="Run CI checks",
        options=ClaudeAgentOptions(
            setting_sources=["project"]  # Only .claude/settings.json
        )
    ):
        print(message)

    Тестирование и окружения CI:

    # Ensure consistent behavior in CI by excluding local settings
    async for message in query(
        prompt="Run tests",
        options=ClaudeAgentOptions(
            setting_sources=["project"],  # Only team-shared settings
            permission_mode="bypassPermissions"
        )
    ):
        print(message)

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

    # Define everything programmatically (default behavior)
    # No filesystem dependencies - setting_sources defaults to None
    async for message in query(
        prompt="Review this PR",
        options=ClaudeAgentOptions(
            # setting_sources=None is the default, no need to specify
            agents={ /* ... */ },
            mcp_servers={ /* ... */ },
            allowed_tools=["Read", "Grep", "Glob"]
        )
    ):
        print(message)

    Загрузка инструкций проекта CLAUDE.md:

    # Load project settings to include CLAUDE.md files
    async for message in query(
        prompt="Add a new feature following project conventions",
        options=ClaudeAgentOptions(
            system_prompt={
                "type": "preset",
                "preset": "claude_code"  # Use Claude Code's system prompt
            },
            setting_sources=["project"],  # Required to load CLAUDE.md from project
            allowed_tools=["Read", "Write", "Edit"]
        )
    ):
        print(message)

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

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

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

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

    AgentDefinition

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

    @dataclass
    class AgentDefinition:
        description: str
        prompt: str
        tools: list[str] | None = None
        model: Literal["sonnet", "opus", "haiku", "inherit"] | None = None
    ПолеОбязательноОписание
    descriptionДаОписание на естественном языке того, когда использовать этого агента
    toolsНетМассив разрешенных имен инструментов. Если опущено, наследует все инструменты
    promptДаСистемная подсказка агента
    modelНетПереопределение модели для этого агента. Если опущено, использует основную модель

    PermissionMode

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

    PermissionMode = Literal[
        "default",           # Standard permission behavior
        "acceptEdits",       # Auto-accept file edits
        "plan",              # Planning mode - no execution
        "bypassPermissions"  # Bypass all permission checks (use with caution)
    ]

    CanUseTool

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

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

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

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

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

    ToolPermissionContext

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

    @dataclass
    class ToolPermissionContext:
        signal: Any | None = None  # Future: abort signal support
        suggestions: list[PermissionUpdate] = field(default_factory=list)
    FieldTypeDescription
    signalAny | NoneЗарезервировано для будущей поддержки сигнала прерывания
    suggestionslist[PermissionUpdate]Предложения обновления разрешений из CLI

    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
    FieldTypeDefaultDescription
    behaviorLiteral["allow"]"allow"Должно быть "allow"
    updated_inputdict[str, Any] | NoneNoneИзмененный ввод для использования вместо исходного
    updated_permissionslist[PermissionUpdate] | NoneNoneОбновления разрешений для применения

    PermissionResultDeny

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

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

    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
    FieldTypeDescription
    typeLiteral[...]Тип операции обновления разрешения
    ruleslist[PermissionRuleValue] | NoneПравила для операций добавления/замены/удаления
    behaviorLiteral["allow", "deny", "ask"] | NoneПоведение для операций на основе правил
    modePermissionMode | NoneРежим для операции setMode
    directorieslist[str] | NoneКаталоги для операций добавления/удаления каталогов
    destinationLiteral[...] | NoneГде применить обновление разрешения

    SdkBeta

    Литеральный тип для бета-функций SDK.

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

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

    McpSdkServerConfig

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

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

    McpServerConfig

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

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

    SdkPluginConfig

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

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

    Пример:

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

    Для полной информации о создании и использовании плагинов см. Плагины.

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

    Message

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

    Message = UserMessage | AssistantMessage | SystemMessage | ResultMessage | StreamEvent

    UserMessage

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

    @dataclass
    class UserMessage:
        content: str | list[ContentBlock]

    AssistantMessage

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

    @dataclass
    class AssistantMessage:
        content: list[ContentBlock]
        model: str

    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
        total_cost_usd: float | None = None
        usage: dict[str, Any] | None = None
        result: str | None = None
        structured_output: Any = None

    StreamEvent

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

    @dataclass
    class StreamEvent:
        uuid: str
        session_id: str
        event: dict[str, Any]  # The raw Anthropic API stream event
        parent_tool_use_id: str | None = None
    FieldTypeDescription
    uuidstrУникальный идентификатор для этого события
    session_idstrИдентификатор сеанса
    eventdict[str, Any]Данные события потока API Anthropic
    parent_tool_use_idstr | NoneID использования родительского инструмента, если это событие от подагента

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

    ContentBlock

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

    ContentBlock = TextBlock | ThinkingBlock | ToolUseBlock | ToolResultBlock

    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

    Типы ошибок

    ClaudeSDKError

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

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

    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

    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

    Типы хуков

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

    HookEvent

    Поддерживаемые типы событий хука. Обратите внимание, что из-за ограничений установки Python SDK не поддерживает хуки SessionStart, SessionEnd и Notification.

    HookEvent = Literal[
        "PreToolUse",      # Called before tool execution
        "PostToolUse",     # Called after tool execution
        "UserPromptSubmit", # Called when user submits a prompt
        "Stop",            # Called when stopping execution
        "SubagentStop",    # Called when a subagent stops
        "PreCompact"       # Called before message compaction
    ]

    HookCallback

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

    HookCallback = Callable[
        [dict[str, Any], str | None, HookContext],
        Awaitable[dict[str, Any]]
    ]

    Параметры:

    • input_data: Данные ввода, специфичные для хука (см. Руководство по хукам)
    • tool_use_id: Необязательный идентификатор использования инструмента (для хуков, связанных с инструментами)
    • context: Контекст хука с дополнительной информацией

    Возвращает словарь, который может содержать:

    • decision: "block" для блокировки действия
    • systemMessage: Системное сообщение для добавления в стенограмму
    • hookSpecificOutput: Выходные данные, специфичные для хука

    HookContext

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

    @dataclass
    class HookContext:
        signal: Any | None = None  # Future: abort signal support

    HookMatcher

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

    @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 for all hooks in this matcher (default: 60)

    HookInput

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

    HookInput = (
        PreToolUseHookInput
        | PostToolUseHookInput
        | UserPromptSubmitHookInput
        | StopHookInput
        | SubagentStopHookInput
        | PreCompactHookInput
    )

    BaseHookInput

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

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

    PreToolUseHookInput

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

    class PreToolUseHookInput(BaseHookInput):
        hook_event_name: Literal["PreToolUse"]
        tool_name: str
        tool_input: dict[str, Any]
    FieldTypeDescription
    hook_event_nameLiteral["PreToolUse"]Всегда "PreToolUse"
    tool_namestrИмя инструмента, который вот-вот будет выполнен
    tool_inputdict[str, Any]Входные параметры для инструмента

    PostToolUseHookInput

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

    class PostToolUseHookInput(BaseHookInput):
        hook_event_name: Literal["PostToolUse"]
        tool_name: str
        tool_input: dict[str, Any]
        tool_response: Any
    FieldTypeDescription
    hook_event_nameLiteral["PostToolUse"]Всегда "PostToolUse"
    tool_namestrИмя инструмента, который был выполнен
    tool_inputdict[str, Any]Входные параметры, которые были использованы
    tool_responseAnyОтвет от выполнения инструмента

    UserPromptSubmitHookInput

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

    class UserPromptSubmitHookInput(BaseHookInput):
        hook_event_name: Literal["UserPromptSubmit"]
        prompt: str
    FieldTypeDescription
    hook_event_nameLiteral["UserPromptSubmit"]Всегда "UserPromptSubmit"
    promptstrЗапрос, отправленный пользователем

    StopHookInput

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

    class StopHookInput(BaseHookInput):
        hook_event_name: Literal["Stop"]
        stop_hook_active: bool
    FieldTypeDescription
    hook_event_nameLiteral["Stop"]Всегда "Stop"
    stop_hook_activeboolАктивен ли хук остановки

    SubagentStopHookInput

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

    class SubagentStopHookInput(BaseHookInput):
        hook_event_name: Literal["SubagentStop"]
        stop_hook_active: bool
    FieldTypeDescription
    hook_event_nameLiteral["SubagentStop"]Всегда "SubagentStop"
    stop_hook_activeboolАктивен ли хук остановки

    PreCompactHookInput

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

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

    HookJSONOutput

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

    HookJSONOutput = AsyncHookJSONOutput | SyncHookJSONOutput

    SyncHookJSONOutput

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

    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[dict[str, Any]]

    Используйте continue_ (с подчеркиванием) в коде Python. Он автоматически преобразуется в continue при отправке в CLI.

    AsyncHookJSONOutput

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

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

    Используйте async_ (с подчеркиванием) в коде Python. Он автоматически преобразуется в async при отправке в CLI.

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

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

    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 (default 60s timeout)
            ],
            'PostToolUse': [
                HookMatcher(hooks=[log_tool_use])
            ]
        }
    )
    
    async for message in query(
        prompt="Analyze this codebase",
        options=options
    ):
        print(message)

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

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

    Task

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

    Ввод:

    {
        "description": str,      # A short (3-5 word) description of the task
        "prompt": str,           # The task for the agent to perform
        "subagent_type": str     # The type of specialized agent to use
    }

    Вывод:

    {
        "result": str,                    # Final result from the subagent
        "usage": dict | None,             # Token usage statistics
        "total_cost_usd": float | None,  # Total cost in USD
        "duration_ms": int | None         # Execution duration in milliseconds
    }

    AskUserQuestion

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

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

    Ввод:

    {
        "questions": [                    # Questions to ask the user (1-4 questions)
            {
                "question": str,          # The complete question to ask the user
                "header": str,            # Very short label displayed as a chip/tag (max 12 chars)
                "options": [              # The available choices (2-4 options)
                    {
                        "label": str,         # Display text for this option (1-5 words)
                        "description": str    # Explanation of what this option means
                    }
                ],
                "multiSelect": bool       # Set to true to allow multiple selections
            }
        ],
        "answers": dict | None            # User answers populated by the permission system
    }

    Вывод:

    {
        "questions": [                    # The questions that were asked
            {
                "question": str,
                "header": str,
                "options": [{"label": str, "description": str}],
                "multiSelect": bool
            }
        ],
        "answers": dict[str, str]         # Maps question text to answer string
                                          # Multi-select answers are comma-separated
    }

    Bash

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

    Ввод:

    {
        "command": str,                  # The command to execute
        "timeout": int | None,           # Optional timeout in milliseconds (max 600000)
        "description": str | None,       # Clear, concise description (5-10 words)
        "run_in_background": bool | None # Set to true to run in background
    }

    Вывод:

    {
        "output": str,              # Combined stdout and stderr output
        "exitCode": int,            # Exit code of the command
        "killed": bool | None,      # Whether command was killed due to timeout
        "shellId": str | None       # Shell ID for background processes
    }

    Edit

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

    Ввод:

    {
        "file_path": str,           # The absolute path to the file to modify
        "old_string": str,          # The text to replace
        "new_string": str,          # The text to replace it with
        "replace_all": bool | None  # Replace all occurrences (default False)
    }

    Вывод:

    {
        "message": str,      # Confirmation message
        "replacements": int, # Number of replacements made
        "file_path": str     # File path that was edited
    }

    Read

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

    Ввод:

    {
        "file_path": str,       # The absolute path to the file to read
        "offset": int | None,   # The line number to start reading from
        "limit": int | None     # The number of lines to read
    }

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

    {
        "content": str,         # File contents with line numbers
        "total_lines": int,     # Total number of lines in file
        "lines_returned": int   # Lines actually returned
    }

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

    {
        "image": str,       # Base64 encoded image data
        "mime_type": str,   # Image MIME type
        "file_size": int    # File size in bytes
    }

    Write

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

    Ввод:

    {
        "file_path": str,  # The absolute path to the file to write
        "content": str     # The content to write to the file
    }

    Вывод:

    {
        "message": str,        # Success message
        "bytes_written": int,  # Number of bytes written
        "file_path": str       # File path that was written
    }

    Glob

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

    Ввод:

    {
        "pattern": str,       # The glob pattern to match files against
        "path": str | None    # The directory to search in (defaults to cwd)
    }

    Вывод:

    {
        "matches": list[str],  # Array of matching file paths
        "count": int,          # Number of matches found
        "search_path": str     # Search directory used
    }

    Grep

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

    Ввод:

    {
        "pattern": str,                    # The regular expression pattern
        "path": str | None,                # File or directory to search in
        "glob": str | None,                # Glob pattern to filter files
        "type": str | None,                # File type to search
        "output_mode": str | None,         # "content", "files_with_matches", or "count"
        "-i": bool | None,                 # Case insensitive search
        "-n": bool | None,                 # Show line numbers
        "-B": int | None,                  # Lines to show before each match
        "-A": int | None,                  # Lines to show after each match
        "-C": int | None,                  # Lines to show before and after
        "head_limit": int | None,          # Limit output to first N lines/entries
        "multiline": bool | None           # Enable multiline mode
    }

    Вывод (режим 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],  # Files containing matches
        "count": int         # Number of files with matches
    }

    NotebookEdit

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

    Ввод:

    {
        "notebook_path": str,                     # Absolute path to the Jupyter notebook
        "cell_id": str | None,                    # The ID of the cell to edit
        "new_source": str,                        # The new source for the cell
        "cell_type": "code" | "markdown" | None,  # The type of the cell
        "edit_mode": "replace" | "insert" | "delete" | None  # Edit operation type
    }

    Вывод:

    {
        "message": str,                              # Success message
        "edit_type": "replaced" | "inserted" | "deleted",  # Type of edit performed
        "cell_id": str | None,                       # Cell ID that was affected
        "total_cells": int                           # Total cells in notebook after edit
    }

    WebFetch

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

    Ввод:

    {
        "url": str,     # The URL to fetch content from
        "prompt": str   # The prompt to run on the fetched content
    }

    Вывод:

    {
        "response": str,           # AI model's response to the prompt
        "url": str,                # URL that was fetched
        "final_url": str | None,   # Final URL after redirects
        "status_code": int | None  # HTTP status code
    }

    WebSearch

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

    Ввод:

    {
        "query": str,                        # The search query to use
        "allowed_domains": list[str] | None, # Only include results from these domains
        "blocked_domains": list[str] | None  # Never include results from these domains
    }

    Вывод:

    {
        "results": [
            {
                "title": str,
                "url": str,
                "snippet": str,
                "metadata": dict | None
            }
        ],
        "total_results": int,
        "query": str
    }

    TodoWrite

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

    Ввод:

    {
        "todos": [
            {
                "content": str,                              # The task description
                "status": "pending" | "in_progress" | "completed",  # Task status
                "activeForm": str                            # Active form of the description
            }
        ]
    }

    Вывод:

    {
        "message": str,  # Success message
        "stats": {
            "total": int,
            "pending": int,
            "in_progress": int,
            "completed": int
        }
    }

    BashOutput

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

    Ввод:

    {
        "bash_id": str,       # The ID of the background shell
        "filter": str | None  # Optional regex to filter output lines
    }

    Вывод:

    {
        "output": str,                                      # New output since last check
        "status": "running" | "completed" | "failed",       # Current shell status
        "exitCode": int | None                              # Exit code when completed
    }

    KillBash

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

    Ввод:

    {
        "shell_id": str  # The ID of the background shell to kill
    }

    Вывод:

    {
        "message": str,  # Success message
        "shell_id": str  # ID of the killed shell
    }

    ExitPlanMode

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

    Ввод:

    {
        "plan": str  # The plan to run by the user for approval
    }

    Вывод:

    {
        "message": str,          # Confirmation message
        "approved": bool | None  # Whether user approved the plan
    }

    ListMcpResources

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

    Ввод:

    {
        "server": str | None  # Optional server name to filter resources by
    }

    Вывод:

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

    ReadMcpResource

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

    Ввод:

    {
        "server": str,  # The MCP server name
        "uri": str      # The resource URI to read
    }

    Вывод:

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

    Расширенные функции с ClaudeSDKClient

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

    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):
            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 - Claude remembers all previous messages in this session
                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())

    Использование хуков для модификации поведения

    from claude_agent_sdk import (
        ClaudeSDKClient,
        ClaudeAgentOptions,
        HookMatcher,
        HookContext
    )
    import asyncio
    from typing import Any
    
    async def pre_tool_logger(
        input_data: dict[str, Any],
        tool_use_id: str | None,
        context: HookContext
    ) -> dict[str, Any]:
        """Log all tool usage before execution."""
        tool_name = input_data.get('tool_name', 'unknown')
        print(f"[PRE-TOOL] About to use: {tool_name}")
    
        # You can modify or block the tool execution here
        if tool_name == "Bash" and "rm -rf" in str(input_data.get('tool_input', {})):
            return {
                'hookSpecificOutput': {
                    'hookEventName': 'PreToolUse',
                    'permissionDecision': 'deny',
                    'permissionDecisionReason': 'Dangerous command blocked'
                }
            }
        return {}
    
    async def post_tool_logger(
        input_data: dict[str, Any],
        tool_use_id: str | None,
        context: HookContext
    ) -> dict[str, Any]:
        """Log results after tool execution."""
        tool_name = input_data.get('tool_name', 'unknown')
        print(f"[POST-TOOL] Completed: {tool_name}")
        return {}
    
    async def user_prompt_modifier(
        input_data: dict[str, Any],
        tool_use_id: str | None,
        context: HookContext
    ) -> dict[str, Any]:
        """Add context to user prompts."""
        original_prompt = input_data.get('prompt', '')
    
        # Add timestamp to all prompts
        from datetime import datetime
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
        return {
            'hookSpecificOutput': {
                'hookEventName': 'UserPromptSubmit',
                'updatedPrompt': f"[{timestamp}] {original_prompt}"
            }
        }
    
    async def main():
        options = ClaudeAgentOptions(
            hooks={
                'PreToolUse': [
                    HookMatcher(hooks=[pre_tool_logger]),
                    HookMatcher(matcher='Bash', hooks=[pre_tool_logger])
                ],
                'PostToolUse': [
                    HookMatcher(hooks=[post_tool_logger])
                ],
                'UserPromptSubmit': [
                    HookMatcher(hooks=[user_prompt_modifier])
                ]
            },
            allowed_tools=["Read", "Write", "Bash"]
        )
    
        async with ClaudeSDKClient(options=options) as client:
            await client.query("List files in current directory")
    
            async for message in client.receive_response():
                # Hooks will automatically log tool usage
                pass
    
    asyncio.run(main())

    Мониторинг прогресса в реальном времени

    from claude_agent_sdk import (
        ClaudeSDKClient,
        ClaudeAgentOptions,
        AssistantMessage,
        ToolUseBlock,
        ToolResultBlock,
        TextBlock
    )
    import asyncio
    
    async def monitor_progress():
        options = ClaudeAgentOptions(
            allowed_tools=["Write", "Bash"],
            permission_mode="acceptEdits"
        )
    
        async with ClaudeSDKClient(options=options) as client:
            await client.query(
                "Create 5 Python files with different sorting algorithms"
            )
    
            # Monitor progress in real-time
            files_created = []
            async for message in client.receive_messages():
                if isinstance(message, AssistantMessage):
                    for block in message.content:
                        if isinstance(block, ToolUseBlock):
                            if block.name == "Write":
                                file_path = block.input.get("file_path", "")
                                print(f"🔨 Creating: {file_path}")
                        elif isinstance(block, ToolResultBlock):
                            print(f"✅ Completed tool execution")
                        elif isinstance(block, TextBlock):
                            print(f"💭 Claude says: {block.text[:100]}...")
    
                # Check if we've received the final result
                if hasattr(message, 'subtype') and message.subtype in ['success', 'error']:
                    print(f"\n🎯 Task completed!")
                    break
    
    asyncio.run(monitor_progress())

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

    Базовые операции с файлами (использование query)

    from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ToolUseBlock
    import asyncio
    
    async def create_project():
        options = ClaudeAgentOptions(
            allowed_tools=["Read", "Write", "Bash"],
            permission_mode='acceptEdits',
            cwd="/home/user/project"
        )
    
        async for message in query(
            prompt="Create a Python project structure with setup.py",
            options=options
        ):
            if isinstance(message, AssistantMessage):
                for block in message.content:
                    if isinstance(block, ToolUseBlock):
                        print(f"Using tool: {block.name}")
    
    asyncio.run(create_project())

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

    from claude_agent_sdk import (
        query,
        CLINotFoundError,
        ProcessError,
        CLIJSONDecodeError
    )
    
    try:
        async for message in query(prompt="Hello"):
            print(message)
    except CLINotFoundError:
        print("Please install Claude Code: npm install -g @anthropic-ai/claude-code")
    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}")

    Режим потоковой передачи с клиентом

    from claude_agent_sdk import ClaudeSDKClient
    import asyncio
    
    async def interactive_session():
        async with ClaudeSDKClient() as client:
            # Send initial message
            await client.query("What's the weather like?")
    
            # Process responses
            async for msg in client.receive_response():
                print(msg)
    
            # Send follow-up
            await client.query("Tell me more about that")
    
            # Process follow-up response
            async for msg in client.receive_response():
                print(msg)
    
    asyncio.run(interactive_session())

    Использование пользовательских инструментов с ClaudeSDKClient

    from claude_agent_sdk import (
        ClaudeSDKClient,
        ClaudeAgentOptions,
        tool,
        create_sdk_mcp_server,
        AssistantMessage,
        TextBlock
    )
    import asyncio
    from typing import Any
    
    # Define custom tools with @tool decorator
    @tool("calculate", "Perform mathematical calculations", {"expression": str})
    async def calculate(args: dict[str, Any]) -> dict[str, Any]:
        try:
            result = eval(args["expression"], {"__builtins__": {}})
            return {
                "content": [{
                    "type": "text",
                    "text": f"Result: {result}"
                }]
            }
        except Exception as e:
            return {
                "content": [{
                    "type": "text",
                    "text": f"Error: {str(e)}"
                }],
                "is_error": True
            }
    
    @tool("get_time", "Get current time", {})
    async def get_time(args: dict[str, Any]) -> dict[str, Any]:
        from datetime import datetime
        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        return {
            "content": [{
                "type": "text",
                "text": f"Current time: {current_time}"
            }]
        }
    
    async def main():
        # Create SDK MCP server with custom tools
        my_server = create_sdk_mcp_server(
            name="utilities",
            version="1.0.0",
            tools=[calculate, get_time]
        )
    
        # Configure options with the server
        options = ClaudeAgentOptions(
            mcp_servers={"utils": my_server},
            allowed_tools=[
                "mcp__utils__calculate",
                "mcp__utils__get_time"
            ]
        )
    
        # Use ClaudeSDKClient for interactive tool usage
        async with ClaudeSDKClient(options=options) as client:
            await client.query("What's 123 * 456?")
    
            # Process calculation response
            async for message in client.receive_response():
                if isinstance(message, AssistantMessage):
                    for block in message.content:
                        if isinstance(block, TextBlock):
                            print(f"Calculation: {block.text}")
    
            # Follow up with time query
            await client.query("What time is it now?")
    
            async for message in client.receive_response():
                if isinstance(message, AssistantMessage):
                    for block in message.content:
                        if isinstance(block, TextBlock):
                            print(f"Time: {block.text}")
    
    asyncio.run(main())

    Конфигурация песочницы

    SandboxSettings

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

    class SandboxSettings(TypedDict, total=False):
        enabled: bool
        autoAllowBashIfSandboxed: bool
        excludedCommands: list[str]
        allowUnsandboxedCommands: bool
        network: SandboxNetworkConfig
        ignoreViolations: SandboxIgnoreViolations
        enableWeakerNestedSandbox: bool
    СвойствоТипПо умолчаниюОписание
    enabledboolFalseВключить режим песочницы для выполнения команд
    autoAllowBashIfSandboxedboolFalseАвтоматически одобрять команды bash при включенной песочнице
    excludedCommandslist[str][]Команды, которые всегда обходят ограничения песочницы (например, ["docker"]). Они выполняются без изоляции автоматически без участия модели
    allowUnsandboxedCommandsboolFalseРазрешить модели запрашивать выполнение команд вне песочницы. Когда True, модель может установить dangerouslyDisableSandbox в входных данных инструмента, что переходит к системе разрешений
    networkSandboxNetworkConfigNoneКонфигурация песочницы, специфичная для сети
    ignoreViolationsSandboxIgnoreViolationsNoneНастройка того, какие нарушения песочницы игнорировать
    enableWeakerNestedSandboxboolFalseВключить более слабую вложенную песочницу для совместимости

    Ограничения доступа к файловой системе и сети НЕ настраиваются через параметры песочницы. Вместо этого они получены из правил разрешений:

    • Ограничения чтения файловой системы: Правила отказа в чтении
    • Ограничения записи файловой системы: Правила разрешения/отказа редактирования
    • Ограничения сети: Правила разрешения/отказа WebFetch

    Используйте параметры песочницы для изоляции выполнения команд и правила разрешений для контроля доступа к файловой системе и сети.

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

    from claude_agent_sdk import query, ClaudeAgentOptions, SandboxSettings
    
    sandbox_settings: SandboxSettings = {
        "enabled": True,
        "autoAllowBashIfSandboxed": True,
        "network": {
            "allowLocalBinding": True
        }
    }
    
    async for message in query(
        prompt="Build and test my project",
        options=ClaudeAgentOptions(sandbox=sandbox_settings)
    ):
        print(message)

    Безопасность Unix-сокетов: Опция allowUnixSockets может предоставить доступ к мощным системным сервисам. Например, разрешение /var/run/docker.sock фактически предоставляет полный доступ к хост-системе через Docker API, обходя изоляцию песочницы. Разрешайте только Unix-сокеты, которые строго необходимы, и поймите последствия безопасности каждого из них.

    SandboxNetworkConfig

    Конфигурация, специфичная для сети, для режима песочницы.

    class SandboxNetworkConfig(TypedDict, total=False):
        allowLocalBinding: bool
        allowUnixSockets: list[str]
        allowAllUnixSockets: bool
        httpProxyPort: int
        socksProxyPort: int
    СвойствоТипПо умолчаниюОписание
    allowLocalBindingboolFalseРазрешить процессам привязываться к локальным портам (например, для серверов разработки)
    allowUnixSocketslist[str][]Пути Unix-сокетов, к которым могут получить доступ процессы (например, сокет Docker)
    allowAllUnixSocketsboolFalseРазрешить доступ ко всем Unix-сокетам
    httpProxyPortintNoneПорт HTTP-прокси для сетевых запросов
    socksProxyPortintNoneПорт SOCKS-прокси для сетевых запросов

    SandboxIgnoreViolations

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

    class SandboxIgnoreViolations(TypedDict, total=False):
        file: list[str]
        network: list[str]
    СвойствоТипПо умолчаниюОписание
    filelist[str][]Шаблоны путей файлов для игнорирования нарушений
    networklist[str][]Шаблоны сети для игнорирования нарушений

    Откат разрешений для команд без песочницы

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

    excludedCommands vs allowUnsandboxedCommands:

    • excludedCommands: Статический список команд, которые всегда автоматически обходят песочницу (например, ["docker"]). Модель не имеет контроля над этим.
    • allowUnsandboxedCommands: Позволяет модели решать во время выполнения, запрашивать ли выполнение без песочницы, установив dangerouslyDisableSandbox: True в входных данных инструмента.
    from claude_agent_sdk import query, ClaudeAgentOptions
    
    async def can_use_tool(tool: str, input: dict) -> bool:
        # Check if the model is requesting to bypass the sandbox
        if tool == "Bash" and input.get("dangerouslyDisableSandbox"):
            # The model wants to run this command outside the sandbox
            print(f"Unsandboxed command requested: {input.get('command')}")
    
            # Return True to allow, False to deny
            return is_command_authorized(input.get("command"))
        return True
    
    async def main():
        async for message in query(
            prompt="Deploy my application",
            options=ClaudeAgentOptions(
                sandbox={
                    "enabled": True,
                    "allowUnsandboxedCommands": True  # Model can request unsandboxed execution
                },
                permission_mode="default",
                can_use_tool=can_use_tool
            )
        ):
            print(message)

    Этот паттерн позволяет вам:

    • Аудит запросов модели: Логировать, когда модель запрашивает выполнение без песочницы
    • Реализовать списки разрешений: Разрешить выполнение только определенных команд без песочницы
    • Добавить рабочие процессы одобрения: Требовать явную авторизацию для привилегированных операций

    Команды, выполняемые с dangerouslyDisableSandbox: True, имеют полный доступ к системе. Убедитесь, что ваш обработчик can_use_tool тщательно проверяет эти запросы.

    Если permission_mode установлен на bypassPermissions и allow_unsandboxed_commands включен, модель может автономно выполнять команды вне песочницы без каких-либо подсказок одобрения. Эта комбинация фактически позволяет модели молча выходить из изоляции песочницы.

    См. также

    • Руководство Python SDK - Учебник и примеры
    • Обзор SDK - Общие концепции SDK
    • Справочник TypeScript SDK - Документация TypeScript SDK
    • Справочник CLI - Интерфейс командной строки
    • Общие рабочие процессы - Пошаговые руководства

    Was this page helpful?

    • Установка
    • Выбор между query() и ClaudeSDKClient
    • Быстрое сравнение
    • Когда использовать query() (новый сеанс каждый раз)
    • Когда использовать ClaudeSDKClient (непрерывный разговор)
    • Функции
    • query()
    • tool()
    • create_sdk_mcp_server()
    • Классы
    • ClaudeSDKClient
    • Типы
    • SdkMcpTool
    • ClaudeAgentOptions
    • OutputFormat
    • SystemPromptPreset
    • SettingSource
    • AgentDefinition
    • PermissionMode
    • CanUseTool
    • ToolPermissionContext
    • PermissionResult
    • PermissionResultAllow
    • PermissionResultDeny
    • PermissionUpdate
    • SdkBeta
    • McpSdkServerConfig
    • McpServerConfig
    • SdkPluginConfig
    • Типы сообщений
    • Message
    • UserMessage
    • AssistantMessage
    • SystemMessage
    • ResultMessage
    • StreamEvent
    • Типы блоков содержимого
    • ContentBlock
    • TextBlock
    • ThinkingBlock
    • ToolUseBlock
    • ToolResultBlock
    • Типы ошибок
    • ClaudeSDKError
    • CLINotFoundError
    • CLIConnectionError
    • ProcessError
    • CLIJSONDecodeError
    • Типы хуков
    • HookEvent
    • HookCallback
    • HookContext
    • HookMatcher
    • HookInput
    • BaseHookInput
    • PreToolUseHookInput
    • PostToolUseHookInput
    • UserPromptSubmitHookInput
    • StopHookInput
    • SubagentStopHookInput
    • PreCompactHookInput
    • HookJSONOutput
    • Пример использования хука
    • Типы ввода/вывода инструмента
    • Task
    • AskUserQuestion
    • Bash
    • Edit
    • Read
    • Write
    • Glob
    • Grep
    • NotebookEdit
    • WebFetch
    • WebSearch
    • TodoWrite
    • BashOutput
    • KillBash
    • ExitPlanMode
    • ListMcpResources
    • ReadMcpResource
    • Расширенные функции с ClaudeSDKClient
    • Построение интерфейса непрерывного разговора
    • Использование хуков для модификации поведения
    • Мониторинг прогресса в реальном времени
    • Примеры использования
    • Базовые операции с файлами (использование query)
    • Обработка ошибок
    • Режим потоковой передачи с клиентом
    • Использование пользовательских инструментов с ClaudeSDKClient
    • Конфигурация песочницы
    • SandboxSettings
    • SandboxNetworkConfig
    • SandboxIgnoreViolations
    • Откат разрешений для команд без песочницы
    • См. также