Semble — библиотека поиска по коду, созданная для агентов. Она мгновенно возвращает именно те фрагменты кода, которые нужны агенту, расходуя примерно на 98% меньше токенов, чем связка grep+read. Полная индексация и поиск по кодовой базе занимают меньше секунды: индексирование выполняется примерно в 200 раз быстрее, а запросы — в 10 раз быстрее, чем у специализированных трансформерных моделей, при этом качество поиска составляет 99% от их уровня (см. бенчмарки). Всё работает на CPU без API-ключей, GPU и внешних сервисов. Запустите Semble как MCP-сервер или вызывайте из командной строки через AGENTS.md — и любой агент (Claude Code, Cursor, Codex, OpenCode и другие) получит мгновенный доступ к любому репозиторию.
Быстрый старт
Агент обращается к Semble на естественном языке (например: "How is authentication handled?") и получает в ответ только релевантные фрагменты кода — без grep и без чтения файлов целиком.
Semble поддерживает три взаимодополняющих способа настройки. Рекомендуется использовать все три, но можно выбрать только нужные:
-
MCP-сервер: MCP-сервер для вашего агента.
-
AGENTS.md: сниппет для AGENTS.md с инструкциями по вызову Semble через CLI.
-
Sub-agent: выделенный суб-агент
semble-searchдля окружений, которые его поддерживают.
MCP
Зарегистрируйте Semble как нативный инструмент через MCP — тогда агент сможет вызывать его напрямую. Добавьте в Claude Code (требуется uv):
claude mcp add semble -s user -- uvx --from "semble[mcp]" semble
Настройка для других окружений (Cursor, Codex, OpenCode и др.) описана в разделе MCP-сервер ниже.
AGENTS.md
Добавьте инструкции по использованию Semble в контекст агента, чтобы он знал, когда и как вызывать CLI. Установите CLI Semble, затем добавьте приведённый ниже сниппет в файл AGENTS.md или CLAUDE.md:
uv tool install semble # Установка через uv (рекомендуется)
pip install semble # Или через pip
Сниппет для AGENTS.md / CLAUDE.md:
## Code Search
Use `semble search` to find code by describing what it does or naming a symbol/identifier, instead of grep:
```bash
semble search "authentication flow" ./my-project
semble search "save_pretrained" ./my-project
semble search "save model to disk" ./my-project --top-k 10
```
The index is built on first run (and cached for subsequent runs) and invalidated automatically when files change.
Use `--content docs` to search documentation and prose, `--content config` for config files (yaml, toml, etc.), or `--content all` to search code, docs, and config:
```bash
semble search "deployment guide" ./my-project --content docs
semble search "database host port" ./my-project --content config
semble search "authentication" ./my-project --content all
```
Use `semble find-related` to discover code similar to a known location (pass `file_path` and `line` from a prior search result):
```bash
semble find-related src/auth.py 42 ./my-project
```
`path` defaults to the current directory when omitted; git URLs are accepted.
If `semble` is not on `$PATH`, use `uvx --from "semble[mcp]" semble` in its place.
### Workflow
1. Start with `semble search` to find relevant chunks. The index is built and cached automatically.
2. Use `--content docs` for documentation, `--content config` for config files, or `--content all` for everything.
3. Inspect full files only when the returned chunk does not give enough context.
4. Optionally use `semble find-related` with a promising result's `file_path` and `line` to discover related implementations.
5. Use grep only when you need exhaustive literal matches or quick confirmation of an exact string.
Суб-агент
Если ваше окружение поддерживает суб-агентов, установите выделенный суб-агент semble-search, чтобы поиск выполнялся в собственном контексте (требуется CLI):
semble init # Claude Code → .claude/agents/semble-search.md
Настройка для других окружений (Cursor, Codex, OpenCode и др.) описана в разделе Настройка суб-агента ниже.
Обновление Semble:
uv tool upgrade semble # через uv
uv cache clean semble # для пользователей MCP (после этого перезапустите MCP-клиент)
pip install --upgrade semble # через pip
Основные возможности
-
Быстро: индексирует средний репозиторий примерно за 250 мс, отвечает на запросы примерно за 1,5 мс — всё на CPU.
-
Точно: NDCG@10 равен 0,854 на наших бенчмарках — сопоставимо со специализированными трансформерными моделями для кода, но значительно меньше по размеру и стоимости.
-
Экономит токены: возвращает только релевантные фрагменты, расходуя примерно на 98% меньше токенов, чем grep+read.
-
Не требует настройки: работает на CPU без API-ключей, GPU и внешних сервисов.
-
MCP-сервер: совместим с Claude Code, Cursor, Codex, OpenCode, VS Code и любым другим MCP-совместимым агентом.
-
Локально и удалённо: принимает локальный путь или git URL.
MCP-сервер
Semble может работать как MCP-сервер (сервер Model Context Protocol), позволяя агентам напрямую искать по любой кодовой базе. Репозитории клонируются и индексируются по требованию. Индексы сохраняются в системную папку кэша и переиспользуются между сессиями; локальные пути отслеживаются на предмет изменений файлов и переиндексируются автоматически.
Настройка
Требуется установленный uv.
Claude Code:
claude mcp add semble -s user -- uvx --from "semble[mcp]" semble
Cursor — добавьте в ~/.cursor/mcp.json (или в .cursor/mcp.json в вашем проекте):
{
"mcpServers": {
"semble": {
"command": "uvx",
"args": ["--from", "semble[mcp]", "semble"]
}
}
}
Codex — добавьте в ~/.codex/config.toml:
[mcp_servers.semble]
command = "uvx"
args = ["--from", "semble[mcp]", "semble"]
OpenCode — добавьте в ~/.opencode/config.json:
{
"mcp": {
"semble": {
"type": "local",
"command": ["uvx", "--from", "semble[mcp]", "semble"]
}
}
}
VS Code — добавьте в .vscode/mcp.json в вашем проекте (или в mcp.json профиля пользователя):
{
"servers": {
"semble": {
"command": "uvx",
"args": ["--from", "semble[mcp]", "semble"]
}
}
}
GitHub Copilot CLI — добавьте в ~/.copilot/mcp-config.json:
{
"mcpServers": {
"semble": {
"command": "uvx",
"args": ["--from", "semble[mcp]", "semble"]
}
}
}
Windsurf — добавьте в ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"semble": {
"command": "uvx",
"args": ["--from", "semble[mcp]", "semble"]
}
}
}
Gemini CLI — добавьте в ~/.gemini/settings.json:
{
"mcpServers": {
"semble": {
"command": "uvx",
"args": ["--from", "semble[mcp]", "semble"]
}
}
}
Kiro — добавьте в ~/.kiro/settings/mcp.json (или в .kiro/settings/mcp.json в вашем проекте):
{
"mcpServers": {
"semble": {
"command": "uvx",
"args": ["--from", "semble[mcp]", "semble"]
}
}
}
Zed — добавьте в ~/.config/zed/settings.json (или в .zed/settings.json в вашем проекте):
{
"context_servers": {
"semble": {
"command": "uvx",
"args": ["--from", "semble[mcp]", "semble"]
}
}
}
Инструменты
| Инструмент | Описание |
|---|---|
|
Поиск по кодовой базе по запросу на естественном языке или по фрагменту кода. Параметр |
|
По заданному пути к файлу и номеру строки возвращает фрагменты, семантически схожие с кодом в этом месте. |
По умолчанию MCP-сервер индексирует только файлы с кодом. Чтобы также индексировать документацию, конфигурационные файлы или всё сразу, добавьте --content docs, --content config или --content all к команде сервера — либо их комбинацию, например --content code docs. Пример для Claude Code: claude mcp add semble -s user — uvx --from "semble[mcp]" semble --content all.
Настройка суб-агента
Claude Code, Gemini CLI, Cursor, OpenCode, GitHub Copilot CLI и Kiro поддерживают выделенный суб-агент для поиска через Semble. Достаточно один раз выполнить semble init в корне проекта:
semble init # Claude Code → .claude/agents/semble-search.md
semble init --agent gemini # Gemini CLI → .gemini/agents/semble-search.md
semble init --agent cursor # Cursor → .cursor/agents/semble-search.md
semble init --agent opencode # OpenCode → .opencode/agents/semble-search.md
semble init --agent copilot # Copilot CLI → .github/agents/semble-search.md
semble init --agent kiro # Kiro → .kiro/agents/semble-search.md
Если semble не находится в $PATH, добавьте перед командой префикс uvx --from "semble[mcp]".
CLI
Semble также поставляется как самостоятельный инструмент командной строки (CLI). Это удобно в скриптах или везде, где нужны результаты поиска без MCP-сессии.
# Поиск в локальном репозитории (индекс строится и кэшируется автоматически)
semble search "authentication flow" ./my-project
# Поиск в удалённом репозитории (клонируется по требованию)
semble search "save model to disk" https://github.com/MinishLab/model2vec
# Ограничить количество результатов
semble search "save model to disk" ./my-project --top-k 10
# Искать в документации/конфигах/везде, а не только в коде
semble search "deployment guide" ./my-project --content docs # или: config, all
# Найти код, похожий на код в заданном месте
semble find-related src/auth.py 42 ./my-project
--content принимает значения code (по умолчанию), docs, config или all. Параметр path по умолчанию равен текущей директории; принимаются git URL. Если semble не находится в $PATH, используйте uvx --from "semble[mcp]" semble.
Управление индексируемыми файлами
Semble читает файлы .gitignore и .sembleignore, чтобы определить, какие файлы индексировать. Оба файла используют стандартный синтаксис gitignore, их правила объединяются. .sembleignore позволяет добавлять специфичные для Semble правила, не затрагивая .gitignore. Правила применяются рекурсивно: .sembleignore в поддиректории распространяется на всё её поддерево.
Исключение файлов — добавляйте шаблоны так же, как в .gitignore:
# .sembleignore
generated/ # исключить директорию generated
*.pb.go # исключить Go protobuf-файлы
Добавление нестандартных расширений — используйте префикс !, чтобы принудительно включить файлы, которые Semble не индексирует по умолчанию:
# .sembleignore
!*.proto # включить Protobuf-файлы
!*.cob # включить COBOL-файлы
Кроме того, Semble всегда пропускает набор широко известных директорий, не являющихся исходным кодом, — независимо от файлов игнора: например, node_modules/, .venv/, dist/, build/, pycache/ и подобные.
Статистика экономии
semble savings показывает, сколько токенов Semble сэкономил за всё время использования:
semble savings # сводка по периодам
semble savings --verbose # также показать разбивку по типам вызовов
Semble Token Savings
════════════════════════════════════════════════════════════════
Period Calls Savings
────────────────────────────────────────────────────────────────
Today 42 [███████████████░] ~58.4k tokens (95%)
Last 7 days 287 [██████████████░░] ~312.4k tokens (90%)
All time 1.4k [██████████████░░] ~1.2M tokens (89%)
Экономия вычисляется следующим образом: для каждого вызова Semble фиксирует суммарное количество символов в уникальных файлах, содержащих возвращённые фрагменты, и количество символов в самих возвращённых фрагментах. Оценка сэкономленных токенов: (символов в файлах − символов в фрагментах) / 4 (4 символа на токен). Это консервативная оценка: в качестве базы берётся чтение найденных файлов целиком — именно так агенты для написания кода обычно изучают незнакомый код.
Статистика хранится в системной папке кэша: ~/Library/Caches/semble/ на macOS, ~/.cache/semble/ на Linux, %LOCALAPPDATA%\semble\Cache\ на Windows.
Использование как библиотеки
Semble можно использовать и как Python-библиотеку для программного доступа — это удобно при создании собственного инструментария или при интеграции поиска непосредственно в ваш код.
from semble import ContentType, SembleIndex
# Индексировать локальную директорию (только код, по умолчанию)
index = SembleIndex.from_path("./my-project")
# Индексировать документацию и текст (markdown, rst и т.д.)
index = SembleIndex.from_path("./my-project", content=ContentType.DOCS)
# Индексировать всё (код, документацию и конфиги)
index = SembleIndex.from_path("./my-project", content=[ContentType.CODE, ContentType.DOCS, ContentType.CONFIG])
# Индексировать код и документацию вместе
index = SembleIndex.from_path("./my-project", content=[ContentType.CODE, ContentType.DOCS])
# Индексировать удалённый git-репозиторий
index = SembleIndex.from_git("https://github.com/MinishLab/model2vec")
# Поиск по индексу на естественном языке или по фрагменту кода
results = index.search("save model to disk", top_k=3)
# Найти код, похожий на конкретный результат
related = index.find_related(results[0], top_k=3)
# Каждый результат предоставляет доступ к найденному фрагменту
result = results[0]
result.chunk.file_path # "model2vec/model.py"
result.chunk.start_line # 127
result.chunk.end_line # 150
result.chunk.content # "def save_pretrained(self, path: PathLike, ..."
Бенчмарки
Мы оцениваем качество и скорость на ~1 250 запросах по 63 репозиториям на 19 языках программирования (слева), а также эффективность использования токенов по сравнению с grep+read при эквивалентном уровне полноты выборки (recall) (справа).
Бенчмарк качества (слева) сопоставляет качество поиска (NDCG@10) с общей задержкой: Semble достигает 99% качества 137-миллионного гибридного CodeRankEmbed, при этом индексируя в 218 раз быстрее. Бенчмарк токенной эффективности (справа) показывает, сколько токенов каждый метод тратит для достижения заданного уровня полноты выборки: Semble в среднем использует на 98% меньше токенов и достигает 94% полноты при всего 2 тысячах токенов, тогда как grep+read для достижения 85% требует контекстное окно в 100 тысяч токенов. Подробные результаты по языкам, анализ вариантов и полная методология — в разделе benchmarks.
Как это работает
Semble разбивает каждый файл на фрагменты (chunks) с учётом синтаксиса кода, используя tree-sitter, а затем оценивает каждый запрос относительно этих фрагментов двумя взаимодополняющими методами извлечения (retrieval): статические эмбеддинги (embeddings) Model2Vec на базе специализированной для кода модели potion-code-16M для семантического сходства и BM25 для лексического совпадения идентификаторов и названий API. Два списка оценок объединяются с помощью метода Reciprocal Rank Fusion (RRF).
После объединения результаты переранжируются с учётом набора сигналов, специфичных для кода:
Сигналы ранжирования:
-
Адаптивное взвешивание. Запросы в стиле символов (
Foo::bar,_private,getUserById) получают больший лексический вес, тогда как запросы на естественном языке сохраняют баланс между семантическим и лексическим методами. -
Буст определений. Фрагмент, в котором запрошенный символ определяется (
class,def,funcи т.д.), ранжируется выше фрагментов, где он лишь упоминается. -
Стемминг идентификаторов. Токены запроса приводятся к основе (стеммируются) и сопоставляются с основами идентификаторов в фрагменте, давая дополнительный вес фрагментам, которые их содержат. Например, запрос
parse configподнимает фрагменты сparseConfig,ConfigParserилиconfig_parser. -
Когерентность файла. Если несколько фрагментов из одного файла совпадают с запросом, файл получает буст, так что верхний результат отражает общую релевантность файла, а не единственный вырванный из контекста фрагмент.
-
Штрафы за шум. Тестовые файлы, прослойки совместимости (
compat//legacy/), примеры кода и стабы объявлений.d.tsпонижаются в рейтинге, чтобы каноническая реализация оказывалась на первых позициях.
Поскольку модель эмбеддингов является статической и не выполняет прямого прохода через трансформер во время запроса, всё это работает за миллисекунды на CPU.
Индексы автоматически кэшируются на диск при первом поиске. При последующих запусках Semble обходит файловое дерево и сравнивает времена модификации: если какой-либо файл был добавлен, удалён или изменён, индекс полностью перестраивается. В режиме MCP за изменениями следит файловый наблюдатель (file watcher): он обнаруживает изменения и запускает перестройку автоматически, так что индекс всегда актуален в рамках текущей сессии.
Благодарности
Благодарим Greptile за предоставление бесплатного доступа к их платформе проверки кода на базе искусственного интеллекта.
Лицензия
MIT
Цитирование
Если вы используете Semble в своих исследованиях, пожалуйста, указывайте следующую ссылку:
@software{minishlab2026semble,
author = {{van Dongen}, Thomas and Stephan Tulkens},
title = {Semble: Fast and Accurate Code Search for Agents},
year = {2026},
publisher = {Zenodo},
doi = {10.5281/zenodo.19785932},
url = {https://github.com/MinishLab/semble},
license = {MIT}
}