Веб-поиск
Модель может искать в интернете сама, и поиск за неё выполняет роутер. Вы просите его тем же способом, каким уже пользуетесь на своём эндпоинте, и получаете готовый ответ со списком источников.
Это не обычный вызов инструмента: вам не нужно принимать запрос от модели, выполнять поиск и отправлять результат обратно. Роутер делает все три шага сам, внутри одного вашего запроса.
Работает на всех трёх эндпоинтах, различается только то, как поиск попросить и в каком виде придут источники.
Как включить
Заголовок раздела «Как включить»На POST /v1/chat/completions поле web_search_options. Пустого объекта достаточно; внутри можно задать max_uses. Вместо поля можно передать web_search в tools:
curl https://api.waibee.com/v1/chat/completions \ -H "Authorization: Bearer $WAIBEE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "openai/gpt-4o-mini", "web_search_options": {}, "messages": [{ "role": "user", "content": "Какая последняя версия Python? Одна строка." }] }'На POST /v1/messages это инструмент в формате Anthropic. Поле max_uses необязательное, а версия инструмента подойдёт любая из тех, что выпускает Anthropic:
curl https://api.waibee.com/v1/messages \ -H "x-api-key: $WAIBEE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "anthropic/claude-haiku-4.5", "max_tokens": 512, "tools": [{ "type": "web_search_20250305", "name": "web_search", "max_uses": 2 }], "messages": [{ "role": "user", "content": "Какая последняя версия Python? Одна строка." }] }'На POST /v1/responses это инструмент web_search в tools:
"tools": [{ "type": "web_search" }]Что придёт в ответе
Заголовок раздела «Что придёт в ответе»Источники приходят в том же виде, в каком их отдают сами OpenAI и Anthropic. Поэтому клиент, написанный под их встроенный поиск, читает наш ответ без единой правки.
На /v1/chat/completions это message.annotations с цитатами:
"annotations": [ { "type": "url_citation", "url_citation": { "url": "https://www.python.org/downloads/", "title": "Downloads", "start_index": 0, "end_index": 0 } }]Оба индекса всегда 0. Схема OpenAI требует эти поля, поэтому они есть, но реального
участка текста за ними нет: источник отвечает на запрос целиком, а не на конкретные слова
ответа.
На /v1/messages это блоки server_tool_use и web_search_tool_result перед текстом ответа. На /v1/responses это элемент waibee:web_search с поисковым запросом и списком найденного.
При "stream": true источники приходят внутри того же потока: аннотацией в delta на chat completions, парой блоков на messages и парой событий на responses. Поток при этом один, сколько бы поисков модель ни сделала: одно открывающее событие и одно завершающее.
Сколько поисков сделает модель
Заголовок раздела «Сколько поисков сделает модель»По умолчанию до 10 поисков на один запрос. Своё число задаётся полем max_uses на любой из трёх поверхностей: в web_search_options или в записи инструмента на chat completions, в записи инструмента на messages и responses. Действует меньшее из вашего и нашего максимума, а он равен 20. Попросить больше не ошибка: число просто уменьшится до максимума.
Когда лимит исчерпан, модель узнаёт об этом и отвечает тем, что успела найти.
Если поиск недоступен, запрос не падает. Модель получает пустой результат, дописывает ответ и обычно сама предупреждает, что найти ничего не удалось.
Лимит на длину ответа, который вы задали, тратится на весь запрос целиком, а не заново на каждый поиск. Если он кончится, пока модель ещё ищет, ответ придёт помеченным как оборванный:
| Эндпоинт | Как помечен |
|---|---|
/v1/chat/completions |
finish_reason: "length" |
/v1/messages |
stop_reason: "max_tokens" |
/v1/responses |
status: "incomplete" |
Сколько это стоит
Заголовок раздела «Сколько это стоит»Каждый выполненный поиск оплачивается отдельно от токенов. Тариф указан на странице тарифов, а не здесь: он может измениться, а документация об этом не узнает.
Поиск, который не удался, не оплачивается.
Ещё две вещи, которые видно в счёте:
- Входных токенов станет заметно больше. Найденное уходит модели во ввод следующего шага, и это несколько тысяч токенов на запрос.
- Если запрос упал уже после поиска, поиск всё равно оплачен. Мы за него заплатили поставщику, и отменить это нельзя. Токены такого запроса при этом не оплачиваются.
Что стоит учесть заранее
Заголовок раздела «Что стоит учесть заранее»- Найденное не переезжает в следующий запрос. Туда уходит ваша история и текст ответа, но не результаты поиска. Если факт нужен для продолжения диалога, он должен попасть в текст ответа.
- Своя функция с именем
web_searchостаётся вашей. Роутер её не подменяет и вызовы к ней не перехватывает. - На
/v1/chat/completionsпоиск не работает вместе сnбольше единицы. Запрос обслуживается как обычно, просто без поиска.