0.15.0 сделала Octocode локальным по умолчанию: API-ключ не нужен, эмбеддинги работают на вашей собственной машине через fastembed. Клонируешь репозиторий, запускаешь octocode index, получаешь результаты — ничто не покидает ваш ноутбук.
fastembed запускает ту горстку моделей, которую он включает в комплект, на вашем CPU, внутри процесса. Отлично для старта — хуже, когда вам нужна более крупная или более новая модель эмбеддингов, GPU или один сервер на всю команду. Провайдер local был добавлен именно для этого: направьте Octocode на любой OpenAI-совместимый сервер эмбеддингов — Ollama, LM Studio, vLLM, llama.cpp, LocalAI, text-embeddings-inference — и индексируйте с той моделью, которую он хостит.
0.17.1 — это релиз, в котором это работает от начала и до конца. Провайдер теперь автоматически определяет размерность эмбеддингов вашей модели — а это та часть, которая нужна индексированию для построения векторного хранилища. Выберите модель, выберите железо — и ваш код по-прежнему никогда не покидает вашу сеть.
Этот пост охватывает локальный провайдер плюс остальные изменения с 0.16.0 (июньский обзор довёл вас до этого момента): режим MCP только для чтения и AST-точный структурный поиск из 0.16.1.
Подключите свой собственный сервер эмбеддингов
Две строки конфигурации:
[embedding]
code_model = "local:nomic-embed-text"
text_model = "local:nomic-embed-text"
Префикс local: говорит Octocode отправлять запросы на эмбеддинги серверу, говорящему на OpenAI API /v1/embeddings. По умолчанию он указывает на http://localhost:11434/v1/embeddings — порт Ollama — так что если Ollama уже запущена, больше ничего настраивать не нужно:
ollama pull nomic-embed-text
octocode index
Указать на что-то другое — это одна переменная окружения:
# vLLM, LM Studio, сервер llama.cpp, LocalAI, text-embeddings-inference —
# что угодно, что выставляет POST /v1/embeddings
export LOCAL_EMBED_API_URL="http://gpu-box.internal:8000/v1/embeddings"
# Опционально — отправляется как `Authorization: Bearer <key>`, если ваш сервер этого хочет
export LOCAL_EMBED_API_KEY="..."
Это вся настройка. Никакого SDK, никакого провайдер-специфичного клея.
Размерность настраивать не нужно
Разные модели эмбеддингов выдают векторы разной ширины — 384, 768, 1024 — и векторное хранилище должно знать эту ширину заранее, чтобы построить индекс. OpenAI-совместимый сервер нигде её не сообщает, поэтому Octocode выясняет её за вас: при первом построении провайдера для вашей модели он отправляет один небольшой пробный запрос, считывает ширину вектора прямо из ответа и кэширует её на остаток запуска. Затем индекс строится вокруг этой размерности.
Практический результат: любая модель, которую может отдать ваш сервер, просто работает. Ничего не нужно искать или задавать для каждой модели. Замените nomic-embed-text на более крупную модель для кода — и Octocode при следующей индексации адаптируется к новой ширине; единственное требование — переиндексация, поскольку векторы от разных моделей несравнимы.
fastembed против local — что выбрать?
Оба локальные. Разница в том, кто запускает модель.
fastembed: |
local: |
|
|---|---|---|
| Запуск | Внутри процесса (ONNX, на вашем CPU) | Отдельный сервер, которым вы управляете |
| Модели | Курируемый набор, включённый в Octocode | Что угодно, что может хостить ваш сервер |
| Железо | CPU этой машины | Там, где живёт сервер — GPU, общий хост |
| Настройка | Нулевая — модели скачиваются при первом использовании | Вы запускаете Ollama/vLLM/и т.д. |
Берите fastembed, когда хотите нулевую настройку и надёжный дефолт. Берите local, когда переросли его:
- Модель, которую
fastembedне включает — более новая модель эмбеддингов для кода, более крупная, что-то заточенное под домен. Если ваш сервер может её отдать, Octocode может индексировать с ней. - Настоящее железо. Эмбеддинг крупного монорепозитория на CPU ноутбука медленный. Направьте
LOCAL_EMBED_API_URLна GPU-сервер, и эмбеддинг будет выполняться там, а не на вашем ноутбуке. - Один сервер на команду. Запустите единственный инстанс Ollama или vLLM; Octocode каждого разработчика указывает на него. Консистентные векторы, одно место для обновления модели.
И свойство, которое между ними не меняется: это самостоятельно размещённый, приватный поиск по коду — ваш код остаётся внутри вашей сети. Та же гарантия, что поставила 0.15.0, теперь без привязки к включённым в комплект моделям или CPU вашего ноутбука.
Режим MCP только для чтения
По умолчанию, когда AI-агент подключается к MCP-серверу Octocode, сервер теперь обслуживает поиск по вашему существующему индексу и никогда его не трогает. Никакого фонового индексатора, никакого file watcher'а, никакой внезапной переиндексации, запущенной в тот момент, когда ваш ассистент подключился.
Это переключатель mcp_index, и false — значение по умолчанию:
[index]
# false (по умолчанию): MCP обслуживает search, view_signatures и structural_search
# по СУЩЕСТВУЮЩЕМУ индексу, только для чтения. Никакой фоновой индексации или file watcher.
# true: MCP поддерживает индекс свежим внутри процесса с фоновым индексатором + watcher'ом.
mcp_index = false
Почему по умолчанию только чтение? Индексация и обслуживание — разные задачи. Вы индексируете в CI, на git-хуке или вручную — осознанно, когда код меняется. Задача MCP-сервера — отвечать на вопросы агента быстро и предсказуемо, а не поднимать file watcher и переэмбеддить ваш репозиторий из-за того, что редактор тронул файл. Только чтение означает меньшее потребление ресурсов в простое, отсутствие конкуренции за ресурсы и отсутствие неожиданной работы в момент подключения инструмента.
CLI-команду index это не затрагивает — octocode index индексирует, как и всегда. mcp_index лишь управляет тем внутрипроцессным индексатором, который MCP-сервер иначе запускал бы.
Для режима только для чтения есть и небольшой штрих: если семантический поиск возвращается пустым (потому что индекс устарел или ещё не построен), Octocode добавляет однострочную подсказку, направляющую агента к structural_search и view_signatures, вместо того чтобы дать ему повторять семантический поиск в пустоту.
Хотите старое всегда-свежее поведение — долгоживущий сервер, который сам себя поддерживает в актуальном состоянии? Установите mcp_index = true, и фоновый индексатор с watcher'ом вернутся.
Структурный поиск, теперь AST-точный (0.16.1)
У 0.16.1 не было своего поста, поэтому стоит отметить: MCP-сервер Octocode получил полноценный инструмент структурного поиска, отдельный от семантического поиска и grep.
Семантический поиск отлично подходит для "где живёт повтор платежа?". Grep отлично подходит для буквальных строк. Структурный поиск — для вопросов между ними — найти эту форму кода, независимо от форматирования или именования — и для символов:
- Определения и ссылки символов с поддержкой шаблонов — "где определён
handle_*и кто его вызывает?" - Умные и смягчённые стратегии сопоставления. Как и улучшения структурного grep в 0.15.0, он восстанавливается, когда запрошенный тип узла неправильный для языка, вместо того чтобы возвращать ничего.
- Ограничения метапеременных — сужают совпадения с помощью regex и реляционных фильтров, а не только сырыми паттернами.
- Отслеживание хлебных крошек, так что каждое совпадение говорит вам, в каком классе/функции/модуле оно вложено, по разным языкам (Swift включён).
- Пагинация и кэширование запросов, так что агент может листать большие наборы результатов, не перезапуская весь скан.
Под капотом он обходит дерево с учётом gitignore и параллельно, с предфильтрацией по литеральным токенам и лексическим фолбэком, когда путь через AST оказывается пустым — быстро на больших репозиториях, и он не пропускает совпадения молча. Для AI-агента это точный, навигируемый способ находить конкретные структуры кода и трассировать символы.
Всё остальное
view_signatures принимает один файл как строку. Агенты (и люди) могут передать один файл как обычную строку, не оборачивая его в массив из одного элемента. Меньше трения для самого частого случая.
Определения инструментов больше не захардкожены. Список инструментов MCP-сервера теперь генерируется, а не поддерживается вручную, что не даёт схеме и реализации разойтись.
Чистка зависимостей и CI. Зависимости Rust обновлены, релизный пайплайн переведён на общие переиспользуемые workflow. Никаких изменений в поведении — просто более аккуратная и надёжная сборка.
Обновление
# Homebrew
brew upgrade muvon/tap/octocode
# Универсальный установщик
curl -fsSL https://raw.githubusercontent.com/Muvon/octocode/master/install.sh | sh
# Cargo
cargo install octocode --version 0.17.1
Если вас устраивает fastembed, делать ничего не нужно — ваша конфигурация и индекс продолжают работать. Чтобы переключиться на свой собственный сервер эмбеддингов:
- Запустите сервер, говорящий на OpenAI embeddings API (например,
ollama serve), и загрузите модель. - Установите
code_model/text_modelвlocal:<model>вconfig.toml. НаправьтеLOCAL_EMBED_API_URLна сервер, если он не на дефолтном порту Ollama. - Переиндексируйте — векторы меняются вместе с моделью:
octocode clear && octocode index.
Хотите, чтобы ваш MCP-сервер продолжал индексировать в фоне, как делали старые версии? Установите mcp_index = true. Иначе вступает в силу дефолт «только чтение» — индексируйте из CLI или CI, а серверу дайте обслуживать.
Octocode — open source (Apache 2.0) на github.com/Muvon/octocode. Это движок поиска по коду, стоящий за Octomind — и теперь вы можете запускать каждый эмбеддинг, который он генерирует, на железе, которое контролируете вы, с любой выбранной вами моделью.



