feat(skills): web-search — live web search via search_web tool (llm-web-proxy)

Policy skill: search ON by default (agent decides when fresh data is
needed), user can say «поищи» to force or «без поиска» to disable for
the rest of the session (conversational, like using-interns grant).

TDD: RED (no-skill subagent refuses, offers rustup/blog workarounds) →
GREEN (with skill: calls search_web, returns answer with [1] sources +
honest staleness caveat). Live-verified against real DeepSeek search.

Depends on pi-extension search_web (OpeItcLoc03/pi-extensions) +
llm-web-proxy modelPrefix support (victor/llm-web-proxy v0.1.6).
Design: .wiki/concepts/web-search-skill-design.md.
This commit is contained in:
2026-08-22 17:47:35 +03:00
parent dbdd4306c9
commit 349aa7cd04
2 changed files with 81 additions and 0 deletions

View File

@@ -121,6 +121,7 @@ an explicit `adapted-from` marker in its frontmatter.
| `command-index` | `author: ours` — just/Makefile command-index convention (standard targets, auto-doc; idea 3/18) |
| `code-review` | `adapted-from: mattpocock/skills @ 84fdeffd` (MIT) — two-axis + Fowler baseline; output: caveman-review format |
| `writing-skills` | `adapted-from: obra/superpowers @ 6.2.0` (MIT) — TDD-for-skills core + ideya 8 self-skill-authoring |
| `web-search` | `author: ours` — search_web tool (pi-extension) + policy: when to search, «без поиска» session-off |
| all other `skills/*` | `author: ours` |
Adaptation policy: a clone is rewritten to our conventions (`.tasks/` boards,

View File

@@ -0,0 +1,80 @@
---
name: web-search
author: ours
version: 0.1.0
description: >
Use when the user asks for fresh or external information — news, prices,
versions, dates, current facts — or says «поищи», «найди актуальное»,
"search for", "look up". Search the web via the `search_web` tool (a
search-capable model from llm-web-proxy with live citations) instead of
guessing from training data, refusing, or scraping by hand. Search is ON by
default — the agent decides when to call it; the user can turn it OFF for
the rest of the session by saying «без поиска» / "no search".
---
# Web Search
Твоя основная модель не имеет веб-поиска. `search_web` — тул, который
отправляет запрос search-модели (веб-поиск DeepSeek с цитатами) на чистом
контексте и возвращает ответ с [1][2]-источниками. **Поиск включён по
умолчанию** — не отказывайся и не выдумывай, когда нужны свежие данные.
## Когда вызывать search_web
- Юзер просит «поищи X», «найди актуальное про Y», "search for", "look up".
- Вопрос про свежие/внешние данные: новости, цены, версии, даты релизов,
«что сейчас актуально про X», подтверждение факта, где обучение могло устареть.
- Нужна проверка внешнего факта или ссылки, которой нет в контексте сессии.
## Когда НЕ вызывать
- Вопросы по коду/проекту, дизайн, рефакторинг — ответ в репо и контексте.
- Уже загруженные доки/файлы сессии — не ищи то, что уже прочитано.
- **Юзер сказал «без поиска» в этой сессии** — тул не вызывать до конца сессии.
## Как вызывать
```
search_web:
query: "последняя версия Rust — что нового в релизе"
```
Один запрос = **один вызов** тула. Не спамить серией поисков — если ответа
не хватило, уточни запрос один раз.
## Правила ответа
1. Ответ с [1][2] — сохраняй нумерацию, в конце дай список источников.
2. `sources` пустой — так и скажи: «без источников», **не выдумывай URL**.
3. Пустой/неудачный поиск — честно: «поиск не дал результата», не галлюцинируй.
4. Если поиск вернул ответ на другом языке — переведи, источники оставь.
## Механизм «без поиска»
- **Default**: поиск включён — сам решаешь, когда нужны свежие данные.
- Юзер: «без поиска» / "no search" → **перестань вызывать search_web до конца
сессии**. Подтверди одной строкой. Не искать даже если запрос «поисковый».
- Юзер снова: «поищи» → верни поиск (повторный грант, до конца сессии).
- Следующая сессия — снова поиск включён (грант не переживает сессии).
## Ошибки тула
`search_web failed: ...` — честно скажи юзеру, что поиск недоступен
(модель не настроена: `/search-status`, или сервер llm-web-proxy не запущен:
`lwp serve`), и предложи путь дальше.
## Настройка
Search-модель (default `lwp/deepseek-pro-search-web`, pro-search):
1. env `PI_SEARCH_MODEL` — например `lwp/deepseek-flash-search-web`
2. файл `~/.pi/search-model.json``{ "model": "..." }`
Тул `search_web` — pi-расширение `~/projects/pi-extensions/extensions/search-web.ts`
(репо `OpeItcLoc03/pi-extensions`). Правки — commit + push → `just install``/reload`.
## Out of scope
- НЕ автоматический поиск в каждом сообщении — тул зовётся, когда запрос
реально требует внешних данных.
- НЕ скрейпинг страниц (это browser-cdp): search_web ищет и отвечает с цитатами,
а не открывает конкретные URL.