> ## Documentation Index
> Fetch the complete documentation index at: https://polza.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Поиск в интернете

> Как добавить веб-поиск к любой AI модели

Polza.AI поддерживает веб-поиск для любой модели — от GPT-5 до Claude и Gemini. Модель получает актуальные данные из интернета и включает ссылки на источники в ответ.

## Быстрый старт

### Chat Completions API

Добавьте плагин `web` в запрос:

<CodeGroup>
  ```typescript TypeScript theme={null}
  import OpenAI from 'openai';

  const openai = new OpenAI({
    baseURL: 'https://polza.ai/api/v1',
    apiKey: '<POLZA_AI_API_KEY>'
  });

  const completion = await openai.chat.completions.create({
    model: 'openai/gpt-5.2',
    messages: [
      { role: 'user', content: 'Последние новости о квантовых компьютерах' }
    ],
    // @ts-ignore — plugins не входит в типы OpenAI SDK
    plugins: [{ id: 'web' }]
  });

  console.log(completion.choices[0].message.content);
  console.log(completion.choices[0].message.annotations); // ссылки на источники
  ```

  ```python Python theme={null}
  from openai import OpenAI

  client = OpenAI(
      base_url="https://polza.ai/api/v1",
      api_key="<POLZA_AI_API_KEY>"
  )

  completion = client.chat.completions.create(
      model="openai/gpt-5.2",
      messages=[
          {"role": "user", "content": "Последние новости о квантовых компьютерах"}
      ],
      extra_body={
          "plugins": [{"id": "web"}]
      }
  )

  print(completion.choices[0].message.content)
  print(completion.choices[0].message.annotations)  # ссылки на источники
  ```

  ```bash cURL theme={null}
  curl -X POST "https://polza.ai/api/v1/chat/completions" \
    -H "Authorization: Bearer <POLZA_AI_API_KEY>" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "openai/gpt-5.2",
      "messages": [
        {"role": "user", "content": "Последние новости о квантовых компьютерах"}
      ],
      "plugins": [{"id": "web"}]
    }'
  ```
</CodeGroup>

### Responses API

Используйте `tools` с типом `web_search_preview`:

<CodeGroup>
  ```typescript TypeScript theme={null}
  const response = await fetch('https://polza.ai/api/v1/responses', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer <POLZA_AI_API_KEY>',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      model: 'openai/gpt-5.2',
      input: 'Последние новости о квантовых компьютерах',
      tools: [{ type: 'web_search_preview' }]
    })
  });

  const data = await response.json();
  console.log(data.output[0].content[0].text);
  console.log(data.output[0].content[0].annotations); // ссылки на источники
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://polza.ai/api/v1/responses',
      headers={'Authorization': 'Bearer <POLZA_AI_API_KEY>'},
      json={
          'model': 'openai/gpt-5.2',
          'input': 'Последние новости о квантовых компьютерах',
          'tools': [{'type': 'web_search_preview'}]
      }
  )

  data = response.json()
  print(data['output'][0]['content'][0]['text'])
  print(data['output'][0]['content'][0]['annotations'])  # ссылки на источники
  ```

  ```bash cURL theme={null}
  curl -X POST "https://polza.ai/api/v1/responses" \
    -H "Authorization: Bearer <POLZA_AI_API_KEY>" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "openai/gpt-5.2",
      "input": "Последние новости о квантовых компьютерах",
      "tools": [{"type": "web_search_preview"}]
    }'
  ```
</CodeGroup>

## Способы активации

| Способ                                  | API              | Совместимость | Описание                                 |
| --------------------------------------- | ---------------- | ------------- | ---------------------------------------- |
| `plugins: [{id: "web"}]`                | Chat Completions | Все модели    | Рекомендуемый. Явное подключение плагина |
| `tools: [{type: "web_search_preview"}]` | Responses API    | Все модели    | OpenAI-совместимый формат                |
| `web_search_options`                    | Chat Completions | Ограниченный  | Нативный параметр OpenAI                 |

<Warning>
  `web_search_options` — нативный параметр OpenAI, поддерживается ограниченным числом моделей. Для остальных моделей параметр будет проигнорирован. Используйте `plugins: [{id: "web"}]` для максимальной совместимости.
</Warning>

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

1. **Запрос с плагином `web`** — вы отправляете запрос с включённым веб-поиском
2. **Определение типа модели** — система проверяет, поддерживает ли модель нативный поиск
3. **Выполнение поиска**:
   * Для моделей с нативным поиском (OpenAI, Anthropic, xAI, Perplexity — 38 моделей) — активируется встроенный web search провайдера
   * Для остальных моделей (Gemini, DeepSeek и др.) — поиск выполняется через Exa и результаты добавляются в контекст модели
4. **Ответ с цитатами** — модель формирует ответ на основе найденных данных. Ссылки на источники возвращаются в `annotations` для обоих типов поиска

## Формат ответа

### Chat Completions API

Результаты поиска возвращаются в поле `annotations`:

```json theme={null}
{
  "choices": [{
    "message": {
      "role": "assistant",
      "content": "Квантовый компьютер IBM достиг рекордных показателей...",
      "annotations": [
        {
          "type": "url_citation",
          "url_citation": {
            "url": "https://example.com/quantum",
            "title": "IBM Quantum Breakthrough",
            "start_index": 0,
            "end_index": 55
          }
        }
      ]
    }
  }]
}
```

### Responses API

```json theme={null}
{
  "id": "resp_abc123",
  "object": "response",
  "status": "completed",
  "output_text": "Квантовый компьютер IBM достиг рекордных показателей...",
  "output": [{
    "type": "message",
    "id": "msg_abc123",
    "status": "completed",
    "role": "assistant",
    "content": [{
      "type": "output_text",
      "text": "Квантовый компьютер IBM достиг рекордных показателей...",
      "annotations": [
        {
          "type": "url_citation",
          "url_citation": {
            "url": "https://example.com/quantum",
            "title": "IBM Quantum Breakthrough",
            "start_index": 0,
            "end_index": 55
          }
        }
      ]
    }]
  }]
}
```

### Поля аннотации

| Поле                       | Тип    | Описание                                 |
| -------------------------- | ------ | ---------------------------------------- |
| `type`                     | string | Всегда `"url_citation"`                  |
| `url_citation.url`         | string | URL источника                            |
| `url_citation.title`       | string | Заголовок страницы                       |
| `url_citation.content`     | string | Фрагмент текста (не всегда присутствует) |
| `url_citation.start_index` | number | Начало цитаты в тексте ответа            |
| `url_citation.end_index`   | number | Конец цитаты в тексте ответа             |

## Настройки плагина

### Параметры

| Параметр        | Тип     | По умолчанию | Описание                                                    |
| --------------- | ------- | ------------ | ----------------------------------------------------------- |
| `max_results`   | number  | 5            | Максимальное количество результатов поиска                  |
| `search_prompt` | string  | —            | Собственный промпт для поиска (иначе модель формирует сама) |
| `engine`        | string  | auto         | Поисковый движок: `native`, `exa` или auto                  |
| `enabled`       | boolean | true         | Включить/выключить плагин                                   |

### Поисковые движки

| Движок              | Описание                                                         | Когда используется                       |
| ------------------- | ---------------------------------------------------------------- | ---------------------------------------- |
| `native`            | Встроенный поиск провайдера (OpenAI, Anthropic, xAI, Perplexity) | Когда модель поддерживает нативный поиск |
| `exa`               | Поиск через [Exa](https://exa.ai/) — ключевые слова + эмбеддинги | Универсальный, работает с любой моделью  |
| auto (по умолчанию) | `native` если доступен, иначе `exa`                              | Рекомендуется                            |

### Пример с настройками

```json theme={null}
{
  "model": "google/gemini-2.5-pro",
  "messages": [
    {"role": "user", "content": "Сравни последние релизы NVIDIA и AMD"}
  ],
  "plugins": [{
    "id": "web",
    "engine": "exa",
    "max_results": 3,
    "search_prompt": "Новости NVIDIA AMD GPU 2025-2026"
  }]
}
```

## Usage и стоимость

Веб-поиск увеличивает количество `prompt_tokens`, так как контекст поиска добавляется в промпт модели. Для моделей с нативным поиском в `usage` также доступно поле `server_tool_use`:

```json theme={null}
{
  "usage": {
    "prompt_tokens": 8465,
    "completion_tokens": 342,
    "total_tokens": 8807,
    "server_tool_use": {
      "web_search_requests": 1
    },
    "cost_rub": 1.07,
    "cost": 1.07
  }
}
```

Поля `cost_rub` и `cost` содержат стоимость запроса в рублях, списанную с баланса.

<Note>
  `server_tool_use` присутствует только при нативном поиске провайдера. `annotations` возвращаются в обоих случаях, но формат отличается — см. таблицу ниже.
</Note>

### Различия аннотаций: нативный поиск vs Exa

| Поле                        | Нативный поиск                 | Exa поиск                    |
| --------------------------- | ------------------------------ | ---------------------------- |
| `start_index` / `end_index` | Позиция цитаты в тексте ответа | `0` (позиция не указывается) |
| `content`                   | Отсутствует                    | Текст страницы-источника     |
| `title`                     | Заголовок страницы             | Заголовок страницы           |
| `url`                       | URL источника                  | URL источника                |

## Совместимость

Нативный веб-поиск поддерживается **38 моделями** от 4 провайдеров. Для остальных моделей используется поиск через Exa.

| Провайдер  | Нативный поиск | Моделей | Примеры                                              |
| ---------- | -------------- | ------- | ---------------------------------------------------- |
| OpenAI     | ✅              | 15      | gpt-5.2-pro, o3, o4-mini, gpt-4o-search-preview      |
| Anthropic  | ✅              | 8       | claude-opus-4.6, claude-sonnet-4.5, claude-haiku-4.5 |
| xAI        | ✅              | 8       | grok-4, grok-3, grok-3-mini                          |
| Perplexity | ✅              | 5       | sonar, sonar-pro, sonar-deep-research                |
| Google     | через Exa      | —       | gemini-2.5-pro, gemini-2.5-flash                     |
| DeepSeek   | через Exa      | —       | deepseek-r1, deepseek-chat                           |

<Tip>
  Используйте `plugins: [{id: "web"}]` для максимальной совместимости — он работает с **любой** моделью.
</Tip>

## Советы

<AccordionGroup>
  <Accordion title="Не комбинируйте с json_object" icon="triangle-exclamation">
    Формат ответа `json_object` или `json_schema` может мешать модели включать цитаты и ссылки на источники. Если вам нужен структурированный вывод с веб-поиском, обрабатывайте текстовый ответ с аннотациями отдельно.
  </Accordion>

  <Accordion title="Используйте search_prompt для точности" icon="magnifying-glass">
    Параметр `search_prompt` позволяет задать конкретный поисковый запрос вместо того, чтобы модель формировала его сама. Это полезно при сложных или многосоставных вопросах, когда автоматический поиск может быть неточным.
  </Accordion>

  <Accordion title="Проверяйте annotations" icon="link">
    Наличие `url_citation` в `annotations` подтверждает, что веб-поиск был выполнен и модель использовала найденные данные. Если `annotations` пуст — модель ответила из собственных знаний.
  </Accordion>

  <Accordion title="Комбинация с изображениями" icon="image">
    Веб-поиск можно комбинировать с отправкой изображений. Например, отправьте фото продукта и попросите найти актуальные цены — модель выполнит поиск с учётом визуального контекста.
  </Accordion>
</AccordionGroup>

## Следующие шаги

<CardGroup cols={2}>
  <Card title="Плагины" icon="plug" href="/gaidy/plugins">
    Все доступные плагины и их настройки
  </Card>

  <Card title="Tool Calling" icon="wrench" href="/gaidy/tool-calling">
    Вызов функций для получения данных
  </Card>

  <Card title="Responses API" icon="reply" href="/api-reference/responses/create">
    Документация Responses API
  </Card>

  <Card title="Chat Completions" icon="comments" href="/gaidy/chat-completions">
    Основы работы с Chat Completions API
  </Card>
</CardGroup>
