# Интернет для модели

> Поиск и чтение публичных страниц из вашего периметра: движки, белый и чёрный списки, типы содержимого, стоп-слова — и то, что настроить нельзя.

Задача, код и база знаний — то, что у команды есть. Интернет — то, чего у неё нет:
документация библиотеки, разбор ошибки, стандарт, чужой README. Интеграция «Интернет»
даёт модели два инструмента — **найти** и **прочитать** — и ставит их не на нашем
бэкенде, а в вашем коннекторе, под управление вашего администратора.

<Callout type="warn">
**Прочтите до установки.** Адреса называет модель, и они уходят к выбранному движку
поиска и на сайты — в их журналы. Прочитанная страница попадает в контекст модели, а сайт
может содержать текст, рассчитанный на модель, а не на человека; белый и чёрный списки
сужают этот риск, но не снимают его. DuckDuckGo работает через неофициальный эндпоинт и
под нагрузкой может ответить проверкой «вы не робот» — тогда переключите движок.
Внутренняя сеть закрыта всегда, но всё, что разрешено списками в публичном интернете,
модель прочитает.
</Callout>

## Почему через коннектор

У среды, в которой работает модель, есть собственная загрузка страниц. Мы её **выключили**
везде — и в «Спросить», и на этапах разработки. Причина проста: с нашего бэкенда ни один
ваш список не действует, а с коннектора действует каждый. Без установленной интеграции
у модели нет интернета вовсе; с ней — ровно столько, сколько разрешил администратор.

## Инструменты

| Инструмент | Что делает |
|---|---|
| `web_search` | ищет в выбранном движке; возвращает заголовки, адреса и выдержки. Результаты с сайтов из чёрного списка (или вне белого) не показываются, и в ответе сказано, сколько скрыто |
| `web_fetch` | читает страницу по адресу. HTML приходит текстом с заголовками, списками, таблицами и адресами ссылок; JSON — отформатированным; страница отдаётся **целиком**, без обрезаний |

Оба инструмента только читают, поэтому доступны везде, где модели даются инструменты
коннектора: в «Спросить», в исследованиях и на читающих этапах прогонов. Сначала модель
ищет, потом читает подходящий результат — как человек.

_Иллюстрация: Вопрос, ответ на который есть только в интернете: модель нашла страницу инструментом поиска, прочитала её и ответила по ней._

## Движки

| Движок | Ключ | Что важно знать |
|---|---|---|
| **DuckDuckGo** (по умолчанию) | не нужен | работает сразу после установки, но через неофициальный HTML-эндпоинт: под нагрузкой отвечает проверкой «вы не робот», и интеграция скажет об этом прямо, а не «ничего не найдено» |
| **SearXNG** | не нужен | ваш собственный метапоиск в периметре — стабильно и приватно; в его `settings.yml` должен быть включён формат `json` (`search.formats`), иначе он ответит 403, и интеграция назовёт эту настройку |
| **Brave Search API** | нужен | коммерческий API с бесплатным тарифом; ключ хранится в коннекторе и уходит только к Brave, никогда — на сайты |

Движок — обычный настроенный хост коннектора: у него свой адрес, свои пути и свой ключ.
Сайты — другое дело.

## Куда модель может ходить

Правило для сайтов называется **web** и отличается от всех остальных правил коннектора:
адрес называет модель, а не вы. Поэтому вместо адреса у вас списки.

**Белый список.** Если он заполнен, модель ходит только на эти сайты, и чёрный список не
действует. **Чёрный список** действует, когда белый пуст: всё, кроме перечисленного.
Пустые оба списка — открытый публичный интернет.

Форма записи одна для обоих, та же, что у поисковых инструментов крупных провайдеров:

| Запись | Что покрывает |
|---|---|
| `example.com` | сайт и все его поддомены (`docs.example.com` тоже) |
| `docs.example.com` | только этот поддомен — не родитель и не соседи |
| `example.com/blog` | всё под этим путём: `/blog`, `/blog/post-1`, … |
| `example.com/*/articles` | `*` — ровно один сегмент пути |

Без схемы (`https://` в записи — ошибка, о которой скажет форма), без порта, без `*` в
самом домене (поддомены и так включены) и только ASCII: буква из другого алфавита,
похожая на латинскую, — это другой домен, и запись с ней отклоняется, чтобы список не
обещал того, чего не делает.

**Типы содержимого.** Что модели можно отдавать, по заголовку `Content-Type` ответа:
`text/html`, `application/json`, `text/*`. Пусто — любые. Проверяется до того, как тело
ответа прочитано.

**Стоп-слова.** Запрос поиска или адрес с любым из этих слов отклоняется на месте, без
единого обращения наружу; регистр не важен.

_Иллюстрация: Форма настройки: движок — выбором, списки — через запятую, типы содержимого и стоп-слова._

## Что настроить нельзя

**Внутренняя сеть закрыта всегда.** Перед каждым запросом коннектор разрешает имя сайта и
отказывается, если хотя бы один из адресов — не публичный: loopback, приватные диапазоны,
link-local (где живут метаданные облаков), CGNAT. Соединение устанавливается ровно с тем
адресом, который прошёл проверку, так что имя не может «передумать» между проверкой и
подключением. Это правило не выключается ни списком, ни настройкой: у обычных подключений
коннектора приватные сети разрешены — в этом их смысл, — а у интернета нет.

**Перенаправления проходят проверку каждое.** Коннектор не следует за `302` сам:
интеграция делает каждый переход отдельным запросом, и публичный сайт, отправляющий
читателя на адрес внутри вашей сети, упирается в тот же отказ.

**Учётные данные на сайты не уходят.** Запрос по правилу web не может нести ни один из
ваших ключей — даже если модель попросит. Ключ Brave уходит только к Brave.

**Только `http` и `https`.** Всё остальное — не веб-адрес.

Отказы приходят модели с причиной, и модель говорит её человеку; каждый вызов, включая
отклонённый, — в журнале подключения и в учёте платформы, как у любого инструмента
коннектора.

## Настройка

1. Установите интеграцию «Интернет» из [маркетплейса](/docs/connector/marketplace) на
   локальной странице коннектора. До установки видно, что она получит: публичный интернет
   в пределах ваших списков, адреса движков, ключ только для Brave.
2. Создайте подключение к проекту разработки. Движок по умолчанию — DuckDuckGo, адреса
   движков уже подставлены; для SearXNG впишите адрес своего экземпляра, для Brave — ключ.
3. Заполните списки. Разумная отправная точка для команды — белый список из документации
   ваших технологий и стандартов; открытый интернет — для команд, которым нужен именно он.

Из командной строки то же самое: `connector install web`, затем
`connector instance add web --config engine=duckduckgo --config deny=pastebin.com`.

<Callout type="info">
Интеграции нужен коннектор версии **0.7 или новее**: правило web и проверка публичности
адреса появились в нём. Старый коннектор откажется ставить интеграцию и назовёт обе
версии.
</Callout>

## Чего интеграция не делает

- Не ходит в интранет и на localhost — ни по списку, ни по просьбе модели.
- Не читает PDF и картинки: в этой версии — HTML, текст и JSON.
- Не кеширует страницы и не индексирует сайты заранее: читается то, что понадобилось для
  ответа, и счёт приходит за это.
- Не подменяет ваш фаервол. Списки — граница на уровне интеграции; сетевая граница
  остаётся вашей, см. [«Изоляцию»](/docs/connector/isolation).
