Программный вызов инструментов позволяет Claude писать код, который вызывает ваши инструменты программно внутри контейнера code execution (выполнения кода), вместо того чтобы требовать обращения к модели для каждого вызова инструмента. Это снижает задержку для рабочих процессов с несколькими инструментами и уменьшает потребление токенов, позволяя Claude фильтровать или обрабатывать данные до того, как они попадут в контекстное окно модели. В бенчмарках агентного поиска, таких как BrowseComp и DeepSearchQA, которые тестируют многошаговое веб-исследование и сложный поиск информации, добавление программного вызова инструментов поверх базовых инструментов поиска улучшило производительность в среднем на 11% при использовании на 24% меньше входных токенов (см. Improved web search with dynamic filtering).
Разница быстро накапливается в реальных рабочих процессах. Рассмотрим проверку соблюдения бюджета для 20 сотрудников: традиционный подход требует 20 отдельных обращений к модели, попутно загружая тысячи строк расходов в контекст. С программным вызовом инструментов один скрипт выполняет все 20 запросов, фильтрует результаты и возвращает только тех сотрудников, которые превысили свои лимиты, сокращая объём данных, над которыми Claude нужно рассуждать, с сотен килобайт до нескольких строк.
Для более глубокого понимания затрат на инференс и контекст, которые решает программный вызов инструментов, см. Advanced tool use.
Эта функция требует, чтобы инструмент выполнения кода был включён.
Эта функция не подпадает под действие политики Zero Data Retention (ZDR). Данные хранятся в соответствии со стандартной политикой хранения данных для этой функции.
Программный вызов инструментов требует code_execution_20260120, который поддерживается в следующих моделях:
| Модель |
|---|
| Claude Fable 5 (claude-fable-5) |
| Claude Mythos 5 (claude-mythos-5) |
| Claude Opus 4.8 (claude-opus-4-8) |
| Claude Opus 4.7 (claude-opus-4-7) |
| Claude Opus 4.6 (claude-opus-4-6) |
| Claude Sonnet 4.6 (claude-sonnet-4-6) |
| Claude Opus 4.5 (claude-opus-4-5-20251101) |
| Claude Sonnet 4.5 (claude-sonnet-4-5-20250929) |
Полную матрицу версий инструмента выполнения кода см. в таблице совместимости моделей инструмента выполнения кода. Программный вызов инструментов доступен в Claude API, Claude Platform on AWS и Microsoft Foundry. В настоящее время он недоступен в Amazon Bedrock или Vertex AI.
Вот пример, в котором Claude программно запрашивает базу данных несколько раз и агрегирует результаты:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=4096,
messages=[
{
"role": "user",
"content": "Query sales data for the West, East, and Central regions, then tell me which region had the highest revenue",
}
],
tools=[
{"type": "code_execution_20260120", "name": "code_execution"},
{
"name": "query_database",
"description": "Execute a SQL query against the sales database. Returns a list of rows as JSON objects.",
"input_schema": {
"type": "object",
"properties": {
"sql": {"type": "string", "description": "SQL query to execute"}
},
"required": ["sql"],
},
"allowed_callers": ["code_execution_20260120"],
},
],
)
print(response)Когда вы настраиваете инструмент для вызова из выполнения кода и Claude решает использовать этот инструмент:
tool_useЭтот подход особенно полезен для:
Пользовательские инструменты преобразуются в асинхронные функции Python для поддержки параллельного вызова инструментов. Когда Claude пишет код, вызывающий ваши инструменты, он использует await (например, result = await query_database("<sql>")) и автоматически включает соответствующую асинхронную функцию-обёртку.
Асинхронная обёртка опущена в примерах кода в этой документации для ясности.
allowed_callersПоле allowed_callers указывает, из каких контекстов может быть вызван инструмент:
{
"name": "query_database",
"description": "Execute a SQL query against the database",
"input_schema": {
// ...
},
"allowed_callers": ["code_execution_20260120"]
}Возможные значения:
["direct"] — Claude направляется на прямой вызов этого инструмента (по умолчанию, если опущено)["code_execution_20260120"] — Claude направляется на вызов этого инструмента только из выполнения кода["direct", "code_execution_20260120"] — Claude может вызывать этот инструмент напрямую или из выполнения кодаВыбирайте либо ["direct"], либо ["code_execution_20260120"] для каждого инструмента, а не включайте оба варианта, так как это даёт Claude более чёткое указание, как лучше использовать инструмент.
allowed_callers управляет тем, как инструмент представляется Claude, и проверяется относительно tool_choice, но это не жёсткая блокировка прямого вызова на уровне API. Claude настоятельно направляется на соблюдение этого параметра, но ваш клиент всё равно должен быть готов обработать прямой tool_use для любого определённого им инструмента. Не полагайтесь на allowed_callers как на границу безопасности.
caller в ответахКаждый блок использования инструмента включает поле caller, указывающее, как он был вызван:
Прямой вызов (традиционное использование инструментов):
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": { "type": "direct" }
}Программный вызов:
{
"type": "tool_use",
"id": "toolu_xyz789",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}tool_id ссылается на инструмент выполнения кода, который выполнил программный вызов.
Программный вызов инструментов использует те же контейнеры, что и выполнение кода:
containerКогда инструмент вызывается программно и контейнер ожидает результат вашего инструмента, вы должны ответить до истечения срока действия контейнера. Отслеживайте поле expires_at. Если срок действия контейнера истечёт, Claude может расценить вызов инструмента как превысивший время ожидания и повторить его.
Вот как работает полный поток программного вызова инструментов:
Отправьте запрос с выполнением кода и инструментом, который разрешает программный вызов. Чтобы включить программный вызов, добавьте поле allowed_callers в определение вашего инструмента.
Предоставьте подробные описания формата вывода вашего инструмента в описании инструмента. Если вы укажете, что инструмент возвращает JSON, Claude попытается десериализовать и обработать результат в коде. Чем больше деталей вы предоставите о схеме вывода, тем лучше Claude сможет обработать ответ программно.
Форма запроса идентична примеру из раздела Быстрый старт: включите code_execution в список инструментов, добавьте allowed_callers: ["code_execution_20260120"] к любому инструменту, который Claude должен вызывать из кода, и отправьте ваше пользовательское сообщение. Остальные шаги в этом рабочем процессе используют пользовательское сообщение "Query customer purchase history from the last quarter and identify our top 5 customers by revenue".
Claude пишет код, который вызывает ваш инструмент. API приостанавливается и возвращает:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll query the purchase history and analyze the results."
},
{
"type": "server_tool_use",
"id": "srvtoolu_abc123",
"name": "code_execution",
"input": {
"code": "results = await query_database('<sql>')\ntop_customers = sorted(results, key=lambda x: x['revenue'], reverse=True)[:5]\nprint(f'Top 5 customers: {top_customers}')"
}
},
{
"type": "tool_use",
"id": "toolu_def456",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}
],
"container": {
"id": "container_xyz789",
"expires_at": "2026-01-20T14:30:00Z"
},
"stop_reason": "tool_use"
}Включите полную историю разговора плюс результат вашего инструмента:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=4096,
container="container_xyz789", # Reuse the container
messages=[
{
"role": "user",
"content": "Query customer purchase history from the last quarter and identify our top 5 customers by revenue",
},
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll query the purchase history and analyze the results.",
},
{
"type": "server_tool_use",
"id": "srvtoolu_abc123",
"name": "code_execution",
"input": {"code": "..."},
},
{
"type": "tool_use",
"id": "toolu_def456",
"name": "query_database",
"input": {"sql": "<sql>"},
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123",
},
},
],
},
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_def456",
"content": '[{"customer_id": "C1", "revenue": 45000}, {"customer_id": "C2", "revenue": 38000}, ...]',
}
],
},
],
tools=[...],
)
print(response)Выполнение кода продолжается и обрабатывает результаты. Если требуются дополнительные вызовы инструментов, повторяйте Шаг 3, пока все вызовы инструментов не будут удовлетворены.
После завершения выполнения кода Claude предоставляет финальный ответ:
{
"content": [
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "Top 5 customers: [{'customer_id': 'C1', 'revenue': 45000}, {'customer_id': 'C2', 'revenue': 38000}, {'customer_id': 'C5', 'revenue': 32000}, {'customer_id': 'C8', 'revenue': 28500}, {'customer_id': 'C3', 'revenue': 24000}]",
"stderr": "",
"return_code": 0,
"content": []
}
},
{
"type": "text",
"text": "I've analyzed the purchase history from last quarter. Your top 5 customers generated $167,500 in total revenue, with Customer C1 leading at $45,000."
}
],
"stop_reason": "end_turn"
}Claude может писать код, который эффективно обрабатывает несколько элементов:
async def _claude_code():
regions = ["West", "East", "Central", "North", "South"]
results = {}
for region in regions:
data = await query_database(f"<sql for {region}>")
results[region] = sum(row["revenue"] for row in data)
# Программная обработка результатов
top_region = max(results.items(), key=lambda x: x[1])
print(f"Top region: {top_region[0]} with ${top_region[1]:,} in revenue")
Этот паттерн:
Claude может прекратить обработку, как только критерии успеха будут выполнены:
async def _claude_code():
endpoints = ["us-east", "eu-west", "apac"]
for endpoint in endpoints:
status = await check_health(endpoint)
if status == "healthy":
print(f"Found healthy endpoint: {endpoint}")
break # Stop early, don't check remaining
async def _claude_code():
file_info = await get_file_info(path)
if file_info["size"] < 10000:
content = await read_full_file(path)
else:
content = await read_file_summary(path)
print(content)
async def _claude_code():
logs = await fetch_logs(server_id)
errors = [log for log in logs if "ERROR" in log]
print(f"Found {len(errors)} errors")
for error in errors[-10:]: # Only return last 10 errors
print(error)
Когда выполнение кода вызывает инструмент:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_xyz789"
}
}Результат вашего инструмента передаётся обратно в выполняющийся код:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000, \"orders\": 23}, {\"customer_id\": \"C2\", \"revenue\": 38000, \"orders\": 18}, ...]"
}
]
}Когда все вызовы инструментов удовлетворены и код завершается:
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_xyz789",
"content": {
"type": "code_execution_result",
"stdout": "Analysis complete. Top 5 customers identified from 847 total records.",
"stderr": "",
"return_code": 0,
"content": []
}
}| Ошибка | Описание | Решение |
|---|---|---|
invalid_tool_input | Входные данные инструмента не соответствуют схеме | Проверьте input_schema вашего инструмента |
invalid_request_error (для tool_choice) | tool_choice указывает на инструмент, чей allowed_callers не включает "direct" | Либо добавьте "direct" в allowed_callers этого инструмента, либо удалите инструмент из tool_choice и позвольте Claude вызывать его из кода |
Если ваш инструмент отвечает слишком долго, выполнение кода получает TimeoutError. Claude видит это в stderr и обычно повторяет попытку:
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "",
"stderr": "TimeoutError: Calling tool ['query_database'] timed out.",
"return_code": 0,
"content": []
}
}Чтобы предотвратить тайм-ауты:
expires_at в ответахЕсли ваш инструмент возвращает ошибку:
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds"
}Код Claude получает эту ошибку и может обработать её соответствующим образом.
strict: true не поддерживаются с программным вызовомtool_choicedisable_parallel_tool_use: true не поддерживается с программным вызовомСледующие инструменты не могут быть вызваны программно:
При ответе на программные вызовы инструментов действуют строгие требования к форматированию:
Ответы только с результатами инструментов: если есть ожидающие программные вызовы инструментов, ожидающие результатов, ваше ответное сообщение должно содержать только блоки tool_result. Вы не можете включать какой-либо текстовый контент, даже после результатов инструментов.
Недопустимо — нельзя включать текст при ответе на программные вызовы инструментов:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
},
{ "type": "text", "text": "What should I do next?" }
]
}Допустимо — только результаты инструментов при ответе на программные вызовы инструментов:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
}
]
}Это ограничение применяется только при ответе на программные вызовы инструментов (из выполнения кода). Для обычных клиентских вызовов инструментов вы можете включать текстовый контент после результатов инструментов.
Программные вызовы инструментов подчиняются тем же ограничениям скорости, что и обычные вызовы инструментов. Каждый вызов инструмента из выполнения кода считается отдельным вызовом.
При реализации пользовательских инструментов, которые будут вызываться программно:
Программный вызов инструментов может значительно снизить потребление токенов:
Например, прямой вызов 10 инструментов использует примерно в 10 раз больше токенов, чем их программный вызов с возвратом сводки.
Во внутренних оценках Anthropic на производственной модели Claude:
tools содержит от 10 до 49 определений инструментов, показывают типичную экономию токенов от 20% до 40% при включённом программном вызове инструментов.Фактическая экономия зависит от характера рабочей нагрузки; см. Когда использовать программный вызов.
Программный вызов инструментов использует ту же тарификацию, что и выполнение кода. Подробности см. в разделе цены на выполнение кода.
Подсчёт токенов для программных вызовов инструментов: результаты инструментов от программных вызовов не учитываются в вашем использовании входных/выходных токенов. Учитываются только финальный результат выполнения кода и ответ Claude.
Программный вызов инструментов обменивает небольшие фиксированные накладные расходы (запуск контейнера, генерация скрипта) на значительную экономию токенов результатов инструментов и обращений к модели. Окупается ли этот обмен, зависит от характера рабочей нагрузки.
Хорошо подходит:
Плохо подходит:
Если вы не уверены, измерьте тарифицируемые входные токены с allowed_callers и без него на репрезентативной выборке вашего трафика, прежде чем включать его повсеместно.
invalid_request_error при установке tool_choice
tool_choice не может указывать на инструмент, чей allowed_callers не содержит "direct". Либо добавьте "direct" в allowed_callers этого инструмента, либо удалите инструмент из tool_choice и позвольте Claude вызывать его из кода.Истечение срока действия контейнера
expires_at в ответахРезультат инструмента не разбирается корректно
caller, чтобы подтвердить программный вызовОбучение Claude включает обширное знакомство с кодом, что делает его эффективным в рассуждениях о вызовах функций и их объединении в цепочки. Когда инструменты представлены как вызываемые функции в среде выполнения кода, Claude может использовать эту сильную сторону, чтобы:
Этот подход позволяет реализовывать рабочие процессы, которые были бы непрактичны при традиционном использовании инструментов (например, обработка файлов размером более 1 млн токенов), позволяя Claude работать с данными программно, а не загружать всё в контекст разговора.
Программный вызов инструментов — это обобщаемый паттерн, который также может быть реализован на вашей собственной инфраструктуре. Вот как сравниваются подходы:
Предоставьте Claude инструмент выполнения кода и опишите, какие функции доступны в этой среде. Когда Claude вызывает инструмент с кодом, ваше приложение выполняет его локально там, где эти функции определены.
Преимущества:
Недостатки:
Используйте, когда: ваше приложение может безопасно выполнять произвольный код, вам нужно простое решение, и управляемое предложение Anthropic не подходит для ваших нужд.
Тот же подход с точки зрения Claude, но код выполняется в изолированном контейнере с ограничениями безопасности (например, без исходящего сетевого трафика). Если вашим инструментам требуются внешние ресурсы, вам понадобится протокол для выполнения вызовов инструментов вне песочницы.
Преимущества:
Недостатки:
Используйте, когда: безопасность критична, и управляемое решение Anthropic не подходит для ваших требований.
Программный вызов инструментов от Anthropic — это управляемая версия изолированного выполнения с предварительно настроенной средой Python, оптимизированной для Claude. Anthropic берёт на себя управление контейнерами, выполнение кода и безопасную коммуникацию при вызове инструментов.
Преимущества:
Рассмотрите использование управляемого решения Anthropic, если вы используете Claude API, Claude Platform on AWS или Microsoft Foundry.
Программный вызов инструментов построен на инфраструктуре выполнения кода и использует те же контейнеры-песочницы. Данные контейнера, включая артефакты выполнения и выводы, хранятся до 30 дней.
О соответствии требованиям ZDR для всех функций см. API и хранение данных.
Узнайте о базовой возможности выполнения кода, которая лежит в основе программного вызова инструментов.
Изучите основы использования инструментов с Claude.
Пошаговое руководство по определению инструментов.
Was this page helpful?