Перейти к содержимому

Веб-поиск

Модель может искать в интернете сама, и поиск за неё выполняет роутер. Вы просите его тем же способом, каким уже пользуетесь на своём эндпоинте, и получаете готовый ответ со списком источников.

Это не обычный вызов инструмента: вам не нужно принимать запрос от модели, выполнять поиск и отправлять результат обратно. Роутер делает все три шага сам, внутри одного вашего запроса.

Работает на всех трёх эндпоинтах, различается только то, как поиск попросить и в каком виде придут источники.

На 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 больше единицы. Запрос обслуживается как обычно, просто без поиска.