Встроенные инструменты
В прошлых уроках мы писали инструменты сами. Но часть инструментов настолько типовые, что Anthropic их уже сделала: поиск в интернете, загрузка страниц, выполнение кода в песочнице, работа с файлами. В этом уроке разберём, какие встроенные инструменты есть, как их объявлять и чем принципиально различаются два их вида — серверные и клиентские.
Два вида встроенных инструментов
Серверные выполняет Anthropic. Вы объявляете инструмент в tools, модель его вызывает, результат появляется в ответе — вашему коду ничего делать не нужно, цикл крутится на стороне API. К ним относятся поиск в интернете, загрузка страниц и выполнение кода.
Клиентские определены Anthropic (имя, схема, поведение модели известны заранее), но выполняете их вы. Модель возвращает tool_use, ваш код делает действие и возвращает tool_result, как с обычными инструментами. Это bash, текстовый редактор и память.
Разница важна для безопасности: серверный code_execution крутится в изолированном контейнере у Anthropic, а клиентский bash — на вашей машине, и что он там сделает, зависит только от вашей обёртки.
Поиск и загрузка страниц
Модель знает мир на момент своего обучения. Если помощнику аналитика нужно сравнить требования заказчика с актуальной документацией платёжного шлюза, ему нужен интернет.
const response = await client.messages.create({
model: "claude-opus-5",
max_tokens: 16000,
tools: [
{ type: "web_search_20260209", name: "web_search", max_uses: 5 },
{ type: "web_fetch_20260209", name: "web_fetch", max_uses: 5 },
],
messages: [
{
role: "user",
content:
"В ТЗ сказано, что оплата проходит через СБП по QR. Найди актуальные " +
"ограничения по сумме одного платежа в документации и сравни с ТЗ.",
},
],
});Тип инструмента содержит дату версии, и это не формальность: версия _20260209 умеет фильтровать результаты до того, как они попадут в контекст модели, что экономит токены. name у встроенных инструментов фиксированный, менять нельзя. Полезные параметры: max_uses (сколько раз можно вызвать за один запрос), allowed_domains и blocked_domains (ограничить, куда ходить, например только на docs.claude.com и сайт заказчика).
В ответе появятся новые типы блоков: server_tool_use (что модель сделала) и web_search_tool_result / web_fetch_tool_result (что получила). Обычный текст ответа при этом может содержать ссылки на источники. Ошибка поиска не выбрасывает исключение: она приходит как блок результата с объектом ошибки внутри, так что проверяйте, список это или объект, прежде чем обращаться по индексу.
web_fetch загружает только те адреса, которые уже встречались в диалоге: их дал пользователь или нашёл web_search. Произвольный адрес модель придумать и загрузить не может.
Выполнение кода
Инструмент code_execution запускает код в контейнере у Anthropic: Python с предустановленными библиотеками для данных, без доступа в интернет. Для аналитики это удобнее, чем просить модель «посчитать в уме».
import Anthropic, { toFile } from "@anthropic-ai/sdk";
import { createReadStream } from "fs";
const client = new Anthropic();
const uploaded = await client.files.upload({
file: await toFile(createReadStream("tickets.csv"), undefined, { type: "text/csv" }),
});
const response = await client.messages.create({
model: "claude-opus-5",
max_tokens: 16000,
tools: [{ type: "code_execution_20260120", name: "code_execution" }],
messages: [
{
role: "user",
content: [
{ type: "container_upload", file_id: uploaded.id },
{
type: "text",
text: "Это обращения в поддержку за квартал с категориями. Посчитай " +
"долю каждой категории по месяцам и построй график.",
},
],
},
],
});Модель сама напишет скрипт на pandas, запустит его, увидит вывод и при ошибке поправит. В ответе появятся блоки bash_code_execution_tool_result с stdout, stderr и кодом возврата, а созданные файлы (тот самый график) — как ссылки на file_id, которые можно скачать через Files API. Сохраняя файлы на диск, берите только базовое имя (path.basename) и пишите в отдельную папку: имя файла — это тоже вывод модели.
Контейнер живёт некоторое время после запроса и его можно переиспользовать: в ответе есть response.container.id, передайте его в следующий запрос параметром container, и установленные библиотеки с файлами останутся на месте.
Есть одно правило совместимости: если вы используете web_search_20260209 или web_fetch_20260209, отдельный code_execution в тот же запрос не добавляйте — у веб-инструментов этой версии уже есть своя среда выполнения, и вторая только запутает модель. Объявляйте code_execution, когда он нужен сам по себе.
Пауза в длинной серии
Серверные инструменты крутятся в своём цикле, и у него есть лимит итераций за один запрос. Если модель его исчерпала, но не закончила, ответ придёт со stop_reason: "pause_turn". Это не ошибка. Добавьте ответ в историю и отправьте запрос ещё раз без нового сообщения от пользователя — API продолжит с того места, где остановился.
if (response.stop_reason === "pause_turn") {
messages.push({ role: "assistant", content: response.content });
// повторить запрос с теми же tools и messages
}Если вы используете tool runner из прошлого урока вместе с серверными инструментами, помните: на момент написания он pause_turn сам не обрабатывает и завершит цикл с обрезанным ответом. Проверяйте stop_reason на каждой итерации.
Клиентские: bash и редактор
Для ревьюера PR удобно дать модели читать файлы и запускать тесты. Можно описать свои инструменты, а можно взять готовые определения от Anthropic: модель уже умеет ими пользоваться, схему писать не нужно.
const response = await client.messages.create({
model: "claude-opus-5",
max_tokens: 16000,
tools: [
{ type: "bash_20250124", name: "bash" },
{ type: "text_editor_20250728", name: "str_replace_based_edit_tool" },
],
messages: [{ role: "user", content: "Запусти тесты и почини падающий." }],
});Никакого input_schema здесь нет: схема встроена в модель. Но выполнение — ваше. Для bash модель пришлёт { command: "npm test" } (или { restart: true } — перезапустить сессию), для редактора — команду view, create, str_replace или insert с путём и текстом.
Именно здесь проходит граница ответственности, о которой мы говорили в уроке про агентный цикл. Команда и путь — это вывод модели, а значит, недоверенные данные. Запускайте bash в контейнере или под ограниченным пользователем, проверяйте команды по списку разрешённых, а не запрещённых, ставьте таймауты. Путь для редактора приводите к каноническому виду и проверяйте, что он остался внутри корня проекта: ../../etc/passwd не должен пройти. Не вызывайте writeFile на сырой строке из tool_use никогда.
Третий клиентский инструмент — memory_20250818: модель читает и пишет файлы в каталоге /memories, а хранилище реализуете вы. Это способ дать агенту память между сессиями; в SDK есть помощник betaMemoryTool для реализации бэкенда.
Когда что брать
Правило простое. Нужна информация из интернета — web_search и web_fetch. Нужно посчитать, обработать файл, построить график — code_execution. Нужно работать с вашим репозиторием или окружением — bash и редактор в вашей обёртке с ограничениями. Нужно действие в вашей системе (трекер, CRM, деплой) — свой инструмент из прошлого урока или MCP, о котором пойдёт речь через урок.
Попробуйте сами
10–15 мин на рабочем месте- Дайте помощнику аналитика
web_searchсallowed_domains, ограниченным сайтами документации, и спросите что-нибудь, чего модель не может знать по дате. Посмотрите блокиserver_tool_useв ответе. - Загрузите через Files API любой обезличенный CSV из своего проекта и попросите
code_executionпосчитать простую статистику. Скачайте созданный файл поfile_id. - Напишите обёртку для
bash_20250124, которая разрешает толькоnpm testиgit status, а всё остальное возвращает какtool_resultсis_error. Попросите модель удалить папку и посмотрите, как она отреагирует на отказ.
Коротко
- Серверные инструменты (
web_search,web_fetch,code_execution) выполняет Anthropic; вы только объявляете их вtools. - Клиентские (
bash, текстовый редактор, память) определены Anthropic, но выполняются вашим кодом, со всеми последствиями для безопасности. - Тип инструмента содержит дату версии; берите актуальную из документации.
web_fetchзагружает только адреса, уже встречавшиеся в диалоге.pause_turn— не ошибка: добавьте ответ в историю и повторите запрос.- Не смешивайте
code_executionс веб-инструментами версии_20260209. - Команды и пути из
tool_use— недоверенные данные; проверяйте по списку разрешённого.
Видеоверсия
Сценарий озвучки · 499 слов, ≈ 4 мин
В прошлых уроках мы писали инструменты сами. Но часть инструментов настолько типовые, что Anthropic их уже сделала. В этом уроке разберём встроенные инструменты и главное различие между ними.
Встроенных инструментов два вида. Серверные выполняет сама Anthropic: вы объявляете инструмент в запросе, модель вызывает его, результат появляется в ответе. Вашему коду ничего делать не нужно. Это поиск в интернете, загрузка страниц и выполнение кода. Клиентские инструменты Anthropic только определила — имя, схему, поведение модели, — а выполняете их вы, как обычные инструменты из прошлого урока. Это bash, редактор файлов и память. Разница важна для безопасности: серверное выполнение кода крутится в изолированном контейнере у Anthropic, а клиентский bash — на вашей машине.
Начнём с поиска. Модель знает мир на момент обучения. Если помощнику аналитика нужно сверить требования заказчика с актуальной документацией платёжного сервиса, ему нужен интернет. Объявляем два инструмента: поиск и загрузку страниц. У каждого есть версия в названии типа, и это не формальность: свежая версия умеет отфильтровать результаты до того, как они попадут в контекст, и экономит токены. Полезные параметры — ограничение числа вызовов и список разрешённых доменов, например только документация и сайт заказчика. В ответе появятся новые блоки: что модель искала и что нашла. И одна тонкость: загрузка страниц работает только с адресами, которые уже встречались в диалоге. Придумать адрес и загрузить его модель не может.
Дальше — выполнение кода. Это контейнер у Anthropic с Python и библиотеками для данных, без доступа в интернет. Загружаем через Files API таблицу обращений в поддержку за квартал и просим посчитать долю категорий по месяцам и построить график. Модель сама пишет скрипт, запускает, при ошибке правит. В ответе — вывод скрипта и ссылки на созданные файлы, которые можно скачать. Контейнер можно переиспользовать в следующем запросе: библиотеки и файлы останутся. Одно правило совместимости: если вы используете свежие веб-инструменты, отдельное выполнение кода в тот же запрос не добавляйте — у них уже есть своя среда, и вторая только запутает модель.
Серверные инструменты крутятся в своём цикле, и у него есть лимит итераций на один запрос. Если модель его исчерпала, но не закончила, ответ придёт с причиной остановки «пауза». Это не ошибка. Добавьте ответ в историю и отправьте запрос ещё раз, без нового сообщения от пользователя. Учтите, что tool runner из прошлого урока такую паузу сам не обрабатывает — проверяйте причину остановки на каждой итерации.
Теперь клиентские. Для ревьюера пул-реквестов удобно дать модели bash и редактор файлов. Схему писать не нужно, она встроена в модель: вы объявляете только тип и имя. Но выполнение — ваше. Модель присылает команду или путь к файлу, а это её вывод, то есть недоверенные данные. Запускайте bash в контейнере или под ограниченным пользователем. Проверяйте команды по списку разрешённых, а не запрещённых. Путь к файлу приводите к каноническому виду и проверяйте, что он внутри корня проекта. Никогда не пишите файл по сырой строке из ответа модели.
Правило выбора простое. Информация из интернета — поиск и загрузка. Посчитать или обработать файл — выполнение кода. Работа с вашим репозиторием — bash и редактор в вашей обёртке. Действие в вашей системе — свой инструмент или MCP. В следующем уроке — навыки: как дать модели готовые инструкции для типовых задач.
