Семантический поиск по истории сессий OpenCode. Локально, на устройстве. Поиск по смыслу, не по точному слову.
Под капотом — модель эмбеддингов Qwen3-Embedding-0.6B (Apache-2.0), запускаемая через mlx-embeddings на Apple Silicon (MLX) или sentence-transformers на других платформах.
Регистрирует в OpenCode тул semsearch. LLM может его вызывать, чтобы найти прошлые разговоры:
«Найди мне сессию про three.js solar system»
«Где я спрашивал про настройку провайдера alibaba?»
«Покажи прошлый раз, когда я возился с Flow Moscow»
На выходе — список наиболее релевантных сообщений с атрибуцией к сессии (id, title, role: user/assistant, превью). LLM сам группирует/дедуплицирует результаты в финальном ответе.
OpenCode.app
↓ tool call
semsearch.ts ← OpenCode custom tool (Node)
↓ execFile
~/.local/share/venvs/semsearch/bin/python
↓
semsearch_engine.py ← MLX / sentence-transformers + KNN
↓
~/.local/share/opencode/semsearch_index.db ← sidecar (SQLite, BLOB-вектора)
- Исходный
opencode.dbоткрывается read-only — не блокируется работающим OpenCode.app - Индекс — отдельный sidecar-файл, не трогает основную БД
- Эмбеддинги 1024-dim (Qwen3-Embedding-0.6B), квантизация mxfp8 на macOS
git clone https://github.com/vokasug/opencode-semsearch.git
cd opencode-semsearch
./install.shinstall.sh автоматически:
- Определяет платформу:
Darwin/arm64→ MLX, остальное → sentence-transformers - Создаёт venv в
~/.local/share/venvs/semsearchи ставит зависимости - Копирует
lib/semsearch.{ts,engine.py,index.py}в~/.config/opencode/tools/ - Строит начальный индекс
После — перезапусти OpenCode.app. Тул semsearch появится автоматически.
SKIP_INDEX=1 ./install.sh # без первичной индексации
INSTALL_DIR=~/.config/opencode/tools ./install.sh
OPENCODE_DB=/path/to/opencode.db ./install.sh
DRY_RUN=1 ./install.sh # только проверкаПросто спроси LLM естественным языком:
«Найди сессию где я возился с C++ игрой про скейтбординг»
LLM сам вызовет semsearch({"query": "...", "top": 10}) и вернёт результат.
После установки доступна CLI-обёртка:
oc-semsearch query "three.js solar system"
oc-semsearch query "alibaba провайдер" --role user --since 7
oc-semsearch build # перестроить индекс
oc-semsearch stats # сколько проиндексировано
oc-semsearch doctor # self-check
oc-semsearch upgrade # git pull + пересборка
oc-semsearch uninstall # полный откат| Аргумент | Тип | Default | Описание |
|---|---|---|---|
query |
string | (обяз.) | Поисковый запрос на естественном языке (RU/EN) |
top |
number | 10 | Количество результатов (max 50) |
role |
enum | "any" |
Фильтр по автору: user / assistant / any |
since_days |
number | — | Искать только в сессиях последних N дней |
only_active |
bool | true |
Скрывать архивные сессии |
При каждом вызове тула автоматически проверяется, есть ли новые сообщения, не попавшие в индекс. Если есть — догоняются до выполнения поиска. Обычно это +0 мс; первичный build (~530 сообщений) — ~2 минуты на Apple Silicon.
- macOS arm64 (Apple Silicon) — для MLX-бэкенда
- Или любая ОС с Python 3.10+ и PyTorch (fallback через sentence-transformers)
- ~1 GB диска на модель, ~5 MB на sidecar-индекс
- OpenCode ≥ 1.17
| Этап | Время |
|---|---|
| Холодный старт (загрузка модели) | ~5-10 сек |
| Embedding одного запроса | ~150 ms |
| KNN по 500 сообщениям | ~80 ms |
| Догонка 1 нового сообщения | ~300 ms |
| Полный build (~530 сообщений) | ~2 мин |
- Первые 600 символов каждого сообщения +
max_length=128токенов — компромисс между качеством и скоростью на mxfp8 - Reasoning-части (chain-of-thought) пропускаются — они могут быть огромными и замедлять эмбеддер
<system-reminder>блоки автоматически удаляются из индексируемого текста- На mxfp8-квантизации mlx-embeddings качество ≈ bf16-версии при меньшем размере
Apache-2.0 (как у Qwen3-Embedding).
- docs/examples.md — примеры вызовов и типичные сценарии
- docs/architecture.md — детали реализации