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, делать ничего не нужно — ваша конфигурация и индекс продолжают работать. Чтобы переключиться на свой собственный сервер эмбеддингов:

  1. Запустите сервер, говорящий на OpenAI embeddings API (например, ollama serve), и загрузите модель.
  2. Установите code_model / text_model в local:<model> в config.toml. Направьте LOCAL_EMBED_API_URL на сервер, если он не на дефолтном порту Ollama.
  3. Переиндексируйте — векторы меняются вместе с моделью: octocode clear && octocode index.

Хотите, чтобы ваш MCP-сервер продолжал индексировать в фоне, как делали старые версии? Установите mcp_index = true. Иначе вступает в силу дефолт «только чтение» — индексируйте из CLI или CI, а серверу дайте обслуживать.


Octocode — open source (Apache 2.0) на github.com/Muvon/octocode. Это движок поиска по коду, стоящий за Octomind — и теперь вы можете запускать каждый эмбеддинг, который он генерирует, на железе, которое контролируете вы, с любой выбранной вами моделью.