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:
@@ -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,
|
||||
|
||||
80
skills/web-search/SKILL.md
Normal file
80
skills/web-search/SKILL.md
Normal 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.
|
||||
Reference in New Issue
Block a user