·5 мин. чтения

Веб-поиск в LLM по API: ответы со ссылками

Как дать нейросети доступ в интернет через API: плагин web, суффикс :online, web_search_options и /v1/search. Примеры для PlusVibe и расходы.

Веб-поиск в LLM по API: ответы со ссылками

Любая языковая модель знает мир только до даты окончания обучения. Спросите её о ключевой ставке или о вчерашнем релизе — она либо честно скажет, что не знает, либо уверенно ошибётся. Веб-поиск закрывает этот пробел: перед ответом по запросу ищутся свежие страницы, а модель отвечает по ним и даёт ссылки на источники.

В PlusVibe поиск можно включить почти у любой платной модели каталога одной строкой в запросе. Ниже — все способы, примеры, которые мы запустили перед публикацией, и из чего складывается стоимость.

Как это работает

Когда в запросе включён поиск, PlusVibe выполняет поисковый запрос, добавляет найденные результаты — заголовок, ссылку и фрагмент текста страницы — в контекст модели и просит её опираться на них и указывать источники. Модель отвечает обычным сообщением, ссылки стоят прямо в тексте ответа.

Отсюда два практических следствия:

  • Ответ приходит в привычном формате — choices[0].message.content для Chat Completions. Отдельных блоков с цитатами нет, разбирать новые поля не нужно.
  • Результаты поиска становятся частью входа, поэтому входных токенов становится больше. В наших проверках запрос из одной строки вырос до 2–5 тысяч входных токенов в зависимости от числа и длины результатов.

Три способа включить поиск в чате

1. Плагин web

curl https://plusvibeapi.ru/v1/chat/completions \
  -H "Authorization: Bearer $PLUSVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-luna",
    "plugins": [{"id": "web", "max_results": 5}],
    "messages": [{"role": "user", "content": "Какая сейчас ключевая ставка Банка России? Дай ссылку на источник."}]
  }'

У плагина есть опции max_results — сколько результатов подставить, не больше 10, — и search_prompt, которая заменяет нашу инструкцию модели о том, как использовать найденное.

В официальном Python SDK поля plugins нет, его передают через extra_body:

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://plusvibeapi.ru/v1",
    api_key=os.environ["PLUSVIBE_API_KEY"],
)

resp = client.chat.completions.create(
    model="gpt-5.6-luna",
    messages=[{"role": "user", "content": "Какая сейчас ключевая ставка Банка России? Дай ссылку на источник."}],
    extra_body={"plugins": [{"id": "web", "max_results": 5}]},
)
print(resp.choices[0].message.content)
print("входных токенов:", resp.usage.prompt_tokens)

В нашем прогоне модель назвала ставку со ссылками на страницы сайта Банка России, а входных токенов было около 2,3 тысячи.

2. Суффикс :online

Самый короткий способ — дописать :online к имени модели. Это удобно в готовых программах, где можно поменять только название модели, а тело запроса не настраивается:

curl https://plusvibeapi.ru/v1/chat/completions \
  -H "Authorization: Bearer $PLUSVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4.1-flash:online",
    "messages": [{"role": "user", "content": "Какая сейчас ключевая ставка Банка России? Дай ссылку на источник."}]
  }'

Если вы закрепляете модель за конкретным маршрутом через суффикс, :online ставится последним.

3. web_search_options

Это поле из формата OpenAI Chat Completions, и его понимает официальный SDK без extra_body. Параметр search_context_size задаёт объём: low — 3 результата, medium — 6, high — 10.

resp = client.chat.completions.create(
    model="gpt-5.6-luna",
    web_search_options={"search_context_size": "low"},
    messages=[{"role": "user", "content": "Какие новости у Банка России за последнюю неделю? Со ссылками."}],
)
print(resp.choices[0].message.content)

Способы можно сочетать — такой запрос всё равно оплачивается как один поиск.

Responses и Messages

Поиск работает не только в /v1/chat/completions, но и в /v1/responses и /v1/messages. Мы проверили gpt-5.6-luna:online через Responses — ответ пришёл со ссылкой на сайт Банка России.

Если инструмент сам передаёт встроенный инструмент поиска — web_search или web_search_preview в формате OpenAI, web_search_20250305 в формате Anthropic, — PlusVibe превращает его в такой же поиск: инструмент убирается из запроса к модели, а ответ получает найденные ссылки. Отдельных блоков web_search_call и web_search_tool_result в ответе не будет — это стоит учесть, если ваш код их ожидает. Подробности — в документации по веб-поиску.

Поиск без модели: /v1/search

Иногда модель не нужна: вы хотите сами получить выдачу и решить, что с ней делать — отфильтровать, скачать страницы, положить в свою базу для RAG. Для этого есть отдельный эндпоинт. Он возвращает только результаты: title, url и snippet, без содержимого страниц.

import os
import requests

r = requests.post(
    "https://plusvibeapi.ru/v1/search",
    headers={"Authorization": f"Bearer {os.environ['PLUSVIBE_API_KEY']}"},
    json={"query": "ключевая ставка Банка России", "max_results": 5},
    timeout=30,
)
data = r.json()
for item in data["results"]:
    print(item["title"])
    print(item["url"])
print("списано:", data["cost_rub"])

Параметры /v1/search: query — до 1000 символов, max_results — от 1 до 20, по умолчанию 10, а также country, language и mode — turbo, base или pro. Поле cost_rub в ответе показывает, сколько списано за этот запрос. Есть и вариант POST /api/search с полями num и region.

Сколько это стоит

Запрос с поиском состоит из двух частей:

  1. Сам поиск — фиксированная плата за запрос, она не зависит от числа результатов. Режим Turbo самый дешёвый, Base и Pro стоят дороже. Текущий тариф — в документации, фактическая сумма для /v1/search приходит в cost_rub.
  2. Токены модели — как у обычного запроса, но вход больше из-за подставленных результатов. Чтобы сэкономить, уменьшайте max_results или ставьте search_context_size: "low".

Если поиск временно недоступен, /v1/search отвечает с ok: false и ничего не списывает. Бесплатные модели с суффиксом :free поиск не поддерживают: такой запрос вернёт ошибку. Число поисков в минуту на одного клиента ограничено.

Цены моделей из наших примеров за 1 млн токенов:

МодельВходВыход
gpt-5.6-luna3,78 ₽/1M22,63 ₽/1M
deepseek-v4.1-flash1,14 ₽/1M4,53 ₽/1M

Когда поиск не нужен

  • Вопрос не зависит от свежих данных: перевод, редактура, код, рассуждение над вашим текстом. Поиск здесь только добавит токенов.
  • Нужные данные у вас уже есть — во внутренней базе знаний. Тогда эффективнее RAG по своим документам, см. статью про Embeddings API.
  • Нужен развёрнутый ответ-исследование с большим числом источников. Для этого есть модели со встроенным поиском — Perplexity Sonar, о них статьи про Sonar API и Sonar или Sonar Pro.

Частые ошибки

Модель отвечает без ссылок. Попросите источники в самом вопросе или задайте свою инструкцию через search_prompt.

Ошибка «Invalid online model address». Суффикс :online стоит не последним или написан отдельно от имени модели. Правильно: gpt-5.6-luna:online.

Ответ опирается на устаревшую страницу. Поиск возвращает то, что нашлось, а не проверенную истину. Если дата важна, укажите её в запросе и попросите модель сверять даты источников.

Итог

Чтобы модель отвечала по свежим данным, достаточно добавить plugins: [{"id": "web"}], дописать :online к имени модели или передать web_search_options. Если нужна только выдача, есть /v1/search. Всё работает с тем же ключом, что и остальной каталог, оплата в рублях.

Нейросети с доступом в интернет

Поиск одной строкой в запросе к GPT, Claude, DeepSeek и другим моделям. Оплата в рублях.

Получить ключ →
нейросеть с доступом в интернет apiвеб-поиск LLMLLM с поискомweb search apiпоиск в интернете через APIответы со ссылкамиonline модель

Попробуйте PlusVibe API

OpenAI-совместимый API: GPT, Claude, Gemini, видео и изображения — один рублёвый ключ. Работает из России без VPN, оплата рублями.

Читайте также

Веб-поиск в LLM по API: ответы со ссылками | PlusVibe API