# Octocode 0.17.1: локальные эмбеддинги с Ollama, vLLM и любым OpenAI-совместимым сервером

> Octocode 0.17.1 индексирует ваш код через локальный провайдер эмбеддингов — направьте его на любой OpenAI-совместимый сервер (Ollama, vLLM, LM Studio), и он автоматически определит размерность модели, всё на вашем собственном железе.

[0.15.0 сделала Octocode локальным по умолчанию](/blog/octocode-0-15-0-local-first-hybrid-search): 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 ([июньский обзор](/blog/release-round-june-2026) довёл вас до этого момента): режим MCP только для чтения и AST-точный структурный поиск из 0.16.1.

---

## Подключите свой собственный сервер эмбеддингов

Две строки конфигурации:

```toml
[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 уже запущена, больше ничего настраивать не нужно:

```bash
ollama pull nomic-embed-text
octocode index
```

Указать на что-то другое — это одна переменная окружения:

```bash
# 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` — значение по умолчанию:

```toml
[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. Никаких изменений в поведении — просто более аккуратная и надёжная сборка.

---

## Обновление

```bash
# 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](https://github.com/Muvon/octocode). Это движок поиска по коду, стоящий за [Octomind](https://octomind.run) — и теперь вы можете запускать каждый эмбеддинг, который он генерирует, на железе, которое контролируете вы, с любой выбранной вами моделью.
