Оформление
searcher
Сервис поиска в интернете и загрузки страниц. Единственный сервис, который не следует контракту EVA, и это важно понимать.
Назначение
Выполняет две вещи: ищет в интернете и возвращает короткий список результатов, либо открывает страницу в настоящем браузере, дожидается отрисовки и сохраняет её содержимое в виде Markdown.
В платформе источник называется Searcher.
Инструменты
| Инструмент | Назначение |
|---|---|
internet_search | Поиск. Параметры: строка запроса, механизм поиска, число результатов |
page_download | Загрузка страниц. Параметры: список адресов, список имён, путь сохранения, что именно сохранять |
describe_tool | Служебный. Возвращает схемы параметров и ответа для указанного инструмента |
Ответ поиска это список записей с заголовком, адресом и коротким описанием.
Что за ним стоит
| Составляющая | Значение | Обязателен |
|---|---|---|
| SearXNG | Механизм поиска по умолчанию | Да для поиска |
| Brave Search API | Второй механизм поиска | Нет, ключ в поставке пустой |
| Chrome и chromedriver | Нужны для загрузки страниц, поставляются вместе с сервисом | Да для загрузки |
| Kafka | Не используется инструментами MCP, но создаётся при запуске процесса | Фактически да для запуска |
| Модели машинного обучения | Не используются | Нет |
На схеме есть обращение к локальной модели, в коде его нет
Архитектурная схема продукта показывает стрелку от Searcher к локальной языковой модели. В коде сервиса нет ни одного обращения к языковой модели: ни дополнения текста, ни переупорядочивания результатов, ни составления краткого изложения.
Чем он принципиально отличается от остальных
Это главное, что нужно знать про этот сервис.
| Как у остальных | Как здесь |
|---|---|
Есть привязка сессии init_eva_session | Отсутствует |
| Работа с файлами чата через слой S3 | Отсутствует |
Результат записывается в папку artifact чата | Записывается на диск самого сервиса |
| Единый формат ответа с признаком успеха | Другой формат |
| Устойчивые коды ошибок | Отсутствуют, ошибка приходит строкой |
Загрузка страницы не доходит до пользователя
Загруженные страницы сохраняются на диск контейнера сервиса, а модели возвращаются пути внутри этого контейнера. Через чат пользователь эти файлы получить не может. Поиск работает и полезен, а загрузка страниц в связке с чатом сегодня неприменима.
Ограничения и особенности поведения
| Ограничение | Подробности |
|---|---|
| Таймаут отрисовки страницы | 15 секунд. По истечении возвращается то, что успело отрисоваться, и это считается успехом |
| Таймаут поиска | 10 секунд, без повторных попыток |
| Число результатов | Не ограничивается сверху |
| Имя сохранённого файла | Собирается из адреса и обрезается. Переданные имена в ответе повторяются, но на имя файла не влияют |
| Создание каталога | Не выполняется. Если каталога нет, работа завершится общей ошибкой |
| Путь сохранения | Приходит от модели и не проверяется. Выход за пределы рабочего каталога возможен |
| Одновременная работа | По одному рабочему потоку на поиск и на загрузку |
| Ожидание результата | Активный опрос без таймаута. Зависший обработчик держит вызов до срабатывания 30-секундного ограничения платформы |
| Браузер | Новый процесс на каждый вызов. При ошибке между запуском и закрытием процесс остаётся висеть |
Замечания по безопасности
Ключ Brave Search лежит в файле настроек сервиса. Общий внутренний регламент этих сервисов прямо запрещает хранить секреты в файле настроек.
У сервиса есть отдельный адрес, позволяющий менять настройки работающего процесса и читать их обратно. Авторизации на нём в этом коде нет.
Проверить на стенде
Указания этого сервиса модели содержат прямые повеления вида «ты обязан вызвать инструмент, а не отвечать из собственных знаний». Именно такие формулировки ищет встроенная проверка источников на подмену поведения модели. На стенде источник Searcher показан подключённым, значит проверку он прошёл, но при изменении текстов это стоит перепроверять.
Развёртывание
| Параметр | Значение |
|---|---|
| Транспорт MCP | Streamable HTTP, порт 8815 |
| Второй интерфейс | HTTP и Kafka на порту 8015 |
| Образ | python:3.12 с библиотеками Chrome, браузер скачивается при сборке |
| Файл для docker compose | Отсутствует |
Два интерфейса в одном процессе
Сервис одновременно поднимает MCP в отдельном потоке и веб-интерфейс с обработчиком Kafka в основном. Общий регламент этих сервисов требует оставлять только MCP. Практическое следствие: без Kafka процесс, скорее всего, не поднимется, хотя инструментам MCP она не нужна.