y83 code / инструмент

Поиск

«Поиск» (он же Search Hub) — настройка всего веб-поиска проекта разом: движок, стратегия и глубина research, цепочка моделей для синтеза, модель-верификатор, бюджет времени и поведение (thinking/effort) для каждого звена цепочки.

раздел реестра
AI и агенты
код
977 строк в 2 файлах
документ
13-search.md
Раздел: 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
googleGoogle overlay
yandexYandex overlay
duckduckgoпрямой DuckDuckGo
searxngSearXNG

Под каждым вариантом — своя строка пояснения (engineHelpRes). Важно: fork и multi (алиас) идут через мост: без подключённого моста fork-поиск недоступен (mcp_call.go:435 — «bridge не подключён — fork-поиск недоступен»), а webget.go:75 трактует multi/fork как мультидвижковый режим.

Стратегия и глубина research

ПараметрЗначенияСмысл
strategylinear, boundedlinear — простой проход; bounded — ограниченный обход
depthquick, normal, deepquick — 3 страницы (~20 с), normal — 5 страниц, deep — 8 страниц + фоновая верификация
deadlineS60…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: верификатор делает собственный независимый веб-поиск.

Поведение моделей

Для каждого слота цепочки отдельно настраиваются:

ПараметрЗначения
thinkingon / off (только webai с thinkingSupported)
effortauto + уровни из 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/configweb_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 — протокол работы с инструментами.

Источник: docs/project/hub/13-search.md · AI и агенты · 977 строк в 2 файлах. Страница собирается из документации проекта при сборке сайта.