В Anthropic Messages обоих режимов доступны ровно две серверные функции. Их исполняет Claude API: вашему коду не нужно возвращать обычный клиентский tool_result.
| Функция | Точный type | Обязательные лимиты |
|---|---|---|
| Web search | web_search_20250305 | max_uses: 1–5 |
| Web fetch | web_fetch_20250910 | max_uses: 1–3; max_content_tokens: 1–25 000 (приблизительно, только текст) |
{
"model": "claude-opus-5",
"max_tokens": 2048,
"tools": [
{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 3,
"allowed_domains": ["docs.python.org"]
},
{
"type": "web_fetch_20250910",
"name": "web_fetch",
"max_uses": 2,
"max_content_tokens": 12000,
"allowed_domains": ["docs.python.org"],
"citations": {"enabled": true}
}
],
"messages": [{
"role": "user",
"content": "Найди актуальную документацию asyncio и открой лучший результат"
}]
}| Объект | Разрешённые поля |
|---|---|
| Web search | type, name, max_uses; опционально allowed_domains или blocked_domains, allowed_callers |
| Web fetch | Поля Web search + обязательный max_content_tokens; опционально citations |
nameдолжен быть ровноweb_searchилиweb_fetch; в одном запросе допускается не больше одного server tool каждого типа. Guard принимает только перечисленные поля: неизвестные поля (включая официальный search-параметрuser_location) и другие typed tool variants отклоняются с400.- Если передан
allowed_callers, допустимо только точное значение["direct"]. allowed_domainsиblocked_domainsвзаимоисключающие. Каждый список содержит не больше 100 ASCII-доменов: без схемы, IP-адресов, query/fragment, обратного слеша и wildcard в hostname.- Для Web search после домена разрешён опциональный path, например
docs.python.org/3/*; для Web fetch разрешён только голый домен без path. citationsу Web fetch, если передан, имеет точную форму{"enabled": true}или{"enabled": false}без дополнительных полей. Client tools должны не иметьtypeлибо использоватьtype: "custom".
- Клиент обязан явно передать указанные лимиты. Превышение или неизвестная версия server tool отклоняются с
400до запуска функции. - Обе функции сначала возвращают
server_tool_use, затем соответствующийweb_search_tool_resultилиweb_fetch_tool_result; search citations обязательны, fetch citations опциональны. - Ошибка самой функции может прийти внутри успешного HTTP
200: ищите tool-result block, у которогоcontent.typeзаканчивается на_tool_result_error, и читайтеcontent.error_code. - Web fetch принимает URL не длиннее 250 символов, который уже встречался в user message, client tool result либо предыдущем search/fetch result. Поддерживаются текст, HTML и PDF; сайты с обязательным JavaScript-rendering не поддерживаются, а неудачные fetch-попытки расходуют
max_uses. - Успешный Web search без совпадений возвращает
content: []— это не tool error.
| Что | Списание |
|---|---|
| Web search | $0.01 за каждый provider-reported billed request + обычные input tokens результата |
| Неоплачиваемая provider-ошибка Web search | Плата $0.01 не списывается |
| Web fetch | Без отдельной платы; содержимое страницы считается input tokens |
- Kimi. Поиск и загрузка страницы вынесены в два отдельных endpoint'а,
POST /v1/kimi/searchиPOST /v1/kimi/fetch. Модель они не вызывают: возвращают текст, который вы сами кладёте в следующий чат-запрос. Отдельной платы за них нет, вы платите только за токены этого запроса. Тела запросов, лимиты и коды ошибок на странице Kimi: Chat Completions. - Composer и Grok. Встроенный веб-поиск доступен во время ответа. Отдельного публичного вызова для управления этим поиском нет; типизированные Anthropic server tools не принимаются. Клиентские функции подключаются отдельно полем
toolsи исполняются вашим клиентом.
Поиск model-directed: tools разрешает операцию, но модель решает, нужна ли она. Ниже — три точные формы; похожие объекты другого API не являются заменой.
Chat Completions:
{
"type": "web_search",
"web_search": {
"enable": true,
"search_engine": "search-prime",
"search_result": true,
"count": 2
}
}Messages:
{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 1
}Responses:
{"type": "web_search_preview"}| API | Подтверждение выполненной операции |
|---|---|
| Chat | Непустой финальный web_search |
| Messages | server_tool_use (web_search) с парным web_search_tool_result |
| Responses | Завершённый web_search_call |
Guard добавляет $0.10 только за подтверждённый вызов. count: 2 в Chat означает два result rows, а не две платные операции. В Messages max_uses резервирует допустимое число операций, но итог платится по факту.
Gemini ищет в сети поиском Google. Поиск работает на всех трёх API и включается объектом в tools; оплачивается он отдельно, по числу поисковых запросов.
| API | Объект в tools |
|---|---|
| Messages | {"type": "web_search_20250305", "name": "web_search"} |
| Chat Completions | {"type": "web_search"} |
| Responses | {"type": "web_search"} |
{
"model": "gemini-4-argon",
"max_tokens": 4096,
"messages": [{"role": "user", "content": "What is new today?"}],
"tools": [{"type": "web_search_20250305", "name": "web_search"}]
}| Что | Списание |
|---|---|
| Поисковый запрос | $0.014 за каждый запрос, начиная с первого |
| Перед ответом | удерживается стоимость одного поиска ($0.014); итог считается по фактическому числу поисков |
| Найденный текст | обычные входные токены |
- Инструмент
web_search_20250305присылает и Claude Code: поиск из Claude Code работает. - Отдельного инструмента
web_fetchу Gemini пока нет: запрос с ним получает понятный отказ, а поиск Google работает. - Предел числа поисков
max_usesпринимается, но не соблюдается: сколько искать, решает Google. Каждый поиск оплачивается по цене, указанной выше. - Списки сайтов (
allowed_domains,blocked_domains) не поддерживаются: запрос с ними получает понятный отказ.
Muse ищет в сети поиском Meta через Messages и Responses; в Chat Completions поиска нет. Инструмент web_search_20250305, который присылает Claude Code, Guard переводит в поиск Meta.
{
"model": "muse-wonder-1.0",
"max_tokens": 4096,
"messages": [{"role": "user", "content": "What is new today?"}],
"tools": [{"type": "web_search_20250305", "name": "web_search"}]
}| Что | Списание |
|---|---|
| Поисковый запрос | $0.0025 за каждый запрос, начиная с первого |
| Перед ответом | удерживается стоимость пяти поисков (5 × $0.0025 = $0.0125); итог считается по фактическому числу поисков |
| Чтение страницы | идёт через родной поиск Meta и само по себе платным поиском не считается |
- Страницы читает сам поиск Meta. Отдельного инструмента
web_fetchу Muse нет. - Предел числа поисков
max_uses, который Claude Code присылает с каждым поиском, принимается, но не соблюдается: сколько искать, решает Meta. Каждый поиск оплачивается по цене, указанной выше. Поиск из Claude Code работает. - Списки сайтов (
allowed_domains,blocked_domains) Meta не поддерживает: запрос с ними получает понятный отказ.