5.5 KiB
title, type, status, created
| title | type | status | created |
|---|---|---|---|
| web-search skill design | concept | draft | 2026-08-22 |
web-search — скилл веб-поиска через субагента на search-комбо llm-web-proxy
Проблема
Основная модель агента (deepseek-flash-web) не имеет веб-поиска. «Найди актуальное про X» сейчас решается костылями: curl на поисковик (блокируется 403/captcha), CDP-скрейпинг (тысячи токенов мусора в основном контексте), или отпиской «у меня нет веб-поиска».
При этом llm-web-proxy уже имеет search-комбо (deepseek-flash-search-web / deepseek-pro-search-web) — нативный веб-поиск DeepSeek с цитатами, работает из коробки, без новых аккаунтов.
Решение
Pi-расширение с тулом search_web (паттерн vision-subagent) + скилл web-search с политикой «когда искать».
- Поиск включён по умолчанию: агент сам решает, когда нужны свежие данные, и вызывает тул.
- Юзер может явно сказать «поищи X» — явный вызов.
- Юзер может сказать «без поиска» — агент перестаёт вызывать тул до конца сессии (конверсационный механизм, как using-interns revoke; память в контексте сессии, следующая сессия — снова поиск включён).
Тул search_web
Реализация в ~/projects/pi-extensions/extensions/search-web.ts (репо OpeItcLoc03/pi-extensions), по образцу vision-subagent.ts:
search_web(query: string)
→ answer: "полный текст с [1][2]"
sources: ["https://...", ...] # regex по URL из citation-блока; [] если пусто
- Модель:
lwp/deepseek-pro-search-webпо умолчанию (pro-search). Переопределение: envPI_SEARCH_MODELили~/.pi/search-model.json{ "model": "..." }(как PI_VISION_MODEL). - Механика:
modelRegistry.complete()на чистом контексте с system-промптом «ищи в вебе, отвечай с цитатами [1][2]» +search_webинструкция. Таймаут ~120s (как vision). - sources: regex по
https?://\S+в тексте ответа; пусто →[], НЕ ошибка (поиск может не найти цитат). - Ошибки: честный текст «search failed: …», isError: true.
/search-statuscommand (как/vision-model-status). - Модели уже в
~/.pi/agent/models.json(провайдерllm-web, префиксlwp/).
Скилл web-search
Файл: ~/projects/skills/skills/web-search/SKILL.md (sovereign каталог).
When to use (триггеры):
- Вопрос требует свежих/внешних данных: новости, цены, версии, даты, «что сейчас актуально про X»
- «Поищи X», «найди актуальное про Y», «проверь ссылку»
- Подтверждение факта из недавнего времени (обучение модели могло устареть)
Когда НЕ вызывать:
- Дизайн/рефакторинг/интроспекция проекта (код — в репо)
- Вопросы по уже загруженному контексту (доки, файлы сессии)
- «Без поиска» сказано юзером в этой сессии
Правила:
- Один запрос = один вызов тула (не спамить серией поисков без нужды).
- При
sources: []— честно «без источников», не выдумывать URL. - При ответе с [1][2] — оставлять нумерацию, ссылки из sources можно дать списком.
- Механизм «без поиска»: после команды юзера — не вызывать тул до конца сессии, при следующем «поищи» — вернуть (повторный грант).
Тестирование (writing-skills TDD)
- RED: базлайн-субагент без скила — «найди актуальное про X», зафиксировать поведение (костыли/отписка).
- GREEN: субагент со скилом — вызывает
search_web, возвращает answer+sources. - Микро-тест wording'а: триггеры срабатывают на формулировках юзера; no-guidance control.
- Live: реальный вызов тула в сессии pi, проверка answer+sources.
Deploy
- Правки pi-extensions (search-web.ts) → commit + push →
just install. - Скилл:
skills/web-search/SKILL.md→ lint → build → install → README provenance table → commit + push (semver bump). - Обновить
~/.pi/agent/models.jsonпри необходимости (модель уже есть).
Открытые вопросы
- Нет (дизайн одобрен юзером 2026-08-22: pro-search дефолт, answer+sources, конверсационный «без поиска»).