Раздел: AI & Agents
Идентификатор:search· Экран:ui/search/SearchScreen.kt(744) +SearchViewModel.kt(233)
Снимок: 2026-10-11
1. Зачем и что это
Как и Vision, конфиг живёт на backend (~/.y83-ws/search.json), поэтому агент и человек настраивают одно и то же: MCP-тулы web_search, web_fetch, research читают эти же значения. Экран — точка правды, а MCP-вызовы без аргументов подставляют значения отсюда.
Поиск идёт через несколько движков, результаты склеиваются RRF (Reciprocal Rank Fusion), а чтение страниц и синтез делает модель.
2. Как попасть
Хаб инструментов → секция AI & Agents → карточка «Поиск» (hub_search_title, подпись «Поисковые движки, глубина research и цепочки моделей»).
| Откуда ещё | Путь |
|---|---|
| Мост | app_navigate с screen: "search" |
Маршрут: Screen.kt:133 ("search" -> Screen.Search).
3. Экран: элементы и действия
| Секция | Что внутри | Что делает |
|---|---|---|
// model chain | Слоты основной/страховщик + поведение каждого | Выбор моделей, thinking, effort |
// active sources | Список источников (SearchModelRow) | Выбрать источник в слот, назначить верификатора |
// engines | Чипы движков | setEngine |
// research | Стратегия, глубина, бюджет | setStrategy, setDepth, setDeadline |
// test | Поле запроса + режим + кнопка | setTestQuery, setTestMode, test() |
// how it works | Пояснения потока, режимов, моделей | Статичный текст |
Каждая настройка сохраняется сразу при тапе — отдельной кнопки «Сохранить» нет. Состояние busy: Set<String> показывает, какая именно ручка пишется (engine, strategy, depth, slot:0, behavior:1, verify), и кнопки блокируются индивидуально.
Список источников отображает:
kind == "webai"сthinkingSupported→ переключатель thinking (on/off);kind == "provider"сthinkingSupported→ effort с уровнямиsource.effortLevels;- метку поведения под именем: для webai —
thinking on · search auto, для провайдера —effort auto(пустое значение →auto).
4. Возможности подробно
Движки (engine)
Чипы из SearchScreen.kt:189:
| id | Что делает |
|---|---|
fork (по умолчанию) | DDG+Google через overlay и AgentSearch, склейка RRF |
auto | автоматический выбор |
agentsearch | только AgentSearch |
google | Google overlay |
yandex | Yandex overlay |
duckduckgo | прямой DuckDuckGo |
searxng | SearXNG |
Под каждым вариантом — своя строка пояснения (engineHelpRes). Важно: fork и multi (алиас) идут через мост: без подключённого моста fork-поиск недоступен (mcp_call.go:435 — «bridge не подключён — fork-поиск недоступен»), а webget.go:75 трактует multi/fork как мультидвижковый режим.
Стратегия и глубина research
| Параметр | Значения | Смысл |
|---|---|---|
strategy | linear, bounded | linear — простой проход; bounded — ограниченный обход |
depth | quick, normal, deep | quick — 3 страницы (~20 с), normal — 5 страниц, deep — 8 страниц + фоновая верификация |
deadlineS | 60…300 секунд (кламп) | Бюджет времени на research |
Бюджет клампится прямо в VM: setDeadline(seconds) пишет seconds.coerceIn(60, 300). Дефолт — 180 секунд (searchcfg.NewServiceAt). Если бюджет ≤ 0, MCP-вызов research подставляет 180 секунд.
Цепочка моделей
Два слота, как у Vision: SEARCH_PRIMARY = 0, SEARCH_FALLBACK = 1. Логика в searchModelChainWith:
- цепочка чистится от пустых id;
- выбрать можно только
available-источник (иначе выбор игнорируется); - повторный выбор того же id, что уже в этом слоте, просто снимает его;
- источник не может быть в двух слотах сразу — повторный выбор переносит;
- вставка страховщика в цепочку длины 1 идёт через
slot.coerceAtMost(next.size).
Модель-верификатор
setVerifyModel(id) назначает модель, которая перепроверяет факты синтеза. Выбор той же модели снимает верификатора (null → пустая строка). Это процесс, который запускает research_verify: верификатор делает собственный независимый веб-поиск.
Поведение моделей
Для каждого слота цепочки отдельно настраиваются:
| Параметр | Значения |
|---|---|
thinking | on / off (только webai с thinkingSupported) |
effort | auto + уровни из source.effortLevels (только provider с thinkingSupported) |
Сохраняются по ключу behavior:$slot; выход за пределы слотов (slot !in 0..1) игнорируется.
Проверка
Три режима теста (setTestMode принимает ровно current, all_engines, research; другое значение игнорируется):
current— проверить текущую цепочку;all_engines— прогнать все движки и показать варианты;research— полный research.
Запрос по умолчанию, если поле пустое: Kotlin Flow official documentation. При all_engines backend возвращает массив variants (тест ожидает 7 движков) и engine_stats; общий ok считается как «хотя бы один движок ответил» (searchhub.go:155).
5. Данные: БД, файлы, настройки
| Что | Где лежит | Как меняется | Кто читает |
|---|---|---|---|
| Конфиг Search Hub | ~/.y83-ws/search.json (backend) | PUT /api/v1/search/config | web_search, web_fetch, research, research_verify |
| Токены AgentSearch | ~/.y83-ws/tools.json | Экран «Интеграции» | webget, MCP web-search |
Структура файла — backend/internal/searchcfg/searchcfg.go:
{"engine":"fork","strategy":"","depth":"normal","modelChain":[],
"verifyModel":"","deadlineS":180,"behaviors":[{"thinking":true,"effort":"auto"}]}
6. Backend: REST/роуты
| Метод и путь | Назначение | Обработчик |
|---|---|---|
GET /api/v1/search/config | конфиг + список источников | searchhub.Config, searchhub.go:49 |
PUT /api/v1/search/config | сохранить конфиг | searchhub.Config |
POST /api/v1/search/test | проверка (current / all_engines / research) | searchhub.Test, searchhub.go:57 |
GET /api/v1/search | сам поиск | webget.Search |
Роуты: backend/internal/api/v1/routes.go:95, 155–156, 222.
7. Мост и MCP
| Инструмент | Что делает | |
|---|---|---|
| `web_search {query\ | queries, engine, n}` | поиск; мультизапрос склеивает RRF |
| `web_fetch {url\ | urls, method, headers, body, max, download, overlay}` | чтение страниц, батч 2–5 URL |
research {query, queries, depth, max_pages, max_chars, engine, strategy, deadline_s, verify, verify_model, verify_timeout_s, model, thinking} | поиск + чтение + синтез с цитатами | |
research_verify {id, wait_s} | забрать вердикты фоновой верификации | |
app_navigate screen: "search" | открыть экран |
Агент может переопределить любой параметр на конкретный вызов; конфиг экрана — значения по умолчанию.
8. Настройки, конфиг, квоты и лимиты
| Параметр | Значение |
|---|---|
| Движок по умолчанию | fork |
| Глубина по умолчанию | normal |
| Бюджет по умолчанию | 180 с, кламп 60…300 |
| Слотов в цепочке | 2 |
| Движков в проверке | 7 |
| Стратегия по умолчанию | пусто (linear) |
9. Ловушки и ограничения
- WebAI DeepSeek убран из research. Если в вызове указать модель
webai:*илиdeepseek-v4-flash, backend отвечает ошибкой с подсказкой использоватьbridge_command backend_web_deepseek. Это осознанное разделение: research работает на моделях провайдеров, веб-поиск DeepSeek — отдельным путём. - Research без цепочки моделей не запустится: пустой
modelChainдаёт ошибку «нет доступной модели провайдера для research». - Unavailable-источники скрыты. Список показывает только
available; если источник стал недоступен, он исчезнет из выбора, и его старый id будет отброшен при следующем сохранении (sanitizeSearchConfigфильтрует цепочку по доступным). effortпоказывается только у провайдеров,thinking— только у webai. Неактуальный тумблер на источнике другого типа просто не появится.- fork-поиск зависит от моста. Без подключённого моста
fork/multiвернёт ошибку — это заметно отличается от обычного «пусто», поэтому при диагностике смотрите эту ошибку, а не результат. - Бюджет в UI клампится 60…300, но MCP может передать больше:
verify_timeout_sв research ограничен 600 с на сервере. deadline_s ≤ 0трактуется как 180 с — это дефолт, а не ошибка.- Тест
all_enginesреально ходит во все движки и может занять заметное время.
10. Источники правды
app/src/main/java/com/y83/ws/ui/search/SearchScreen.kt— экран, чипы, пояснения.app/src/main/java/com/y83/ws/ui/search/SearchViewModel.kt— слоты,sanitizeSearchConfig, сохранение, тест.backend/internal/searchcfg/searchcfg.go— конфиг, путь, источники (ModelInfo).backend/internal/handlers/searchhub/searchhub.go—Config,Test, режим all_engines.backend/internal/handlers/webget/webget.go— сам поиск (Search, режим multi/fork, searxng).backend/internal/handlers/mcp/research.go— аргументы research, запрет webai-моделей, дефолты.backend/internal/api/v1/routes.go:95,155–156,222— роуты.skills/y83-websearch/SKILL.md— протокол работы с инструментами.