MAATRIX / Блог / Как поднять своё ИИ-автодополнение кода на сервере

Как поднять своё ИИ-автодополнение кода на сервере

Как поднять своё ИИ-автодополнение кода на сервере

MAATRIX

GitHub официально блокирует Copilot для аккаунтов и IP из России: расширение в VS Code честно отвечает Copilot is not available in your location, а карта российского банка для оплаты подписки не проходит вообще — это два независимых барьера, а не один. Ниже — как поднять свой Copilot на сервере: Ollama с кодовой моделью и расширение вроде Continue или Twinny, которые дописывают код прямо из вашего файла, а не отправляют его в чужое облако.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Зачем свой Copilot: где рвётся облачный вариант

Дело не в цене — GitHub Copilot Pro стоит $10 в месяц, Business — $19 за место, и с 1 июня 2026 года само автодополнение и next-edit подсказки на платных тарифах вообще не расходуют лимит: тарифицируются только чат и агентные режимы через AI Credits. Формально дёшево. Дело в доступе: GitHub официально относит Россию к странам с торговыми ограничениями и по этому списку блокирует Copilot, приватные репозитории, Actions и Packages — это прямо в их политике по экспортному контролю. С российским IP или аккаунтом расширение не активируется. Вторая, независимая стена — оплата: реквизиты российских банков в стоп-листе платёжного процессора GitHub, привязка карты обрывается раньше, чем запрос уходит на их серверы. Проксировать через зарубежный IP можно, но карту это не чинит, а код всё равно уходит на серверы Microsoft при каждой паузе в наборе текста — для команды с NDA это отдельный повод не пользоваться сервисом вообще.

Идея свой Copilot на сервере простая: движок инференса (Ollama) и кодовая модель крутятся на вашей машине — в офисе или на арендованном VPS, — а редактор дёргает их по HTTP так же, как дёргал бы Copilot. Код не покидает инфраструктуру, доступ не зависит от блокировок GitHub, а плата — за сервер, а не за место в команде на годы вперёд. Взамен вы берёте на себя то, что раньше делал GitHub: подбор модели под задержку, доступ по сети и безопасность порта. Это не подмена один в один — модель на 3–7 млрд параметров не тянет на уровень Copilot по сложным многофайловым правкам, но именно для дописывания строки или блока разница на практике куда меньше, чем кажется.

Автодополнение — это не чат: при чём тут FIM и «база» модели

Чат-модель дописывает текст слева направо: вопрос — ответ токен за токеном. Автодополнение устроено иначе: курсор стоит посреди функции, и модели нужно продолжить именно там, зная и то, что написано до курсора, и то, что уже написано после. Это Fill-in-the-Middle (FIM), и обычная чат-модель для этого не приспособлена.

У кодовых моделей вроде Qwen2.5-Coder за FIM отвечают служебные токены: <|fim_prefix|>, <|fim_suffix|>, <|fim_middle|>. Расширение собирает из файла текст до курсора, текст после курсора и служебную разметку — и шлёт запрос вида <|fim_prefix|>{код до курсора}<|fim_suffix|>{код после курсора}<|fim_middle|>; модель продолжает с этого места, а не с начала диалога. Проверить самостоятельно: ollama show qwen2.5-coder:7b-base --modelfile печатает реальный TEMPLATE, зашитый в модель, — там видны те же токены.

Второй нюанс — какой тег брать. Qwen2.5-Coder на Ollama выходит парами: base и instruct на каждый размер (0.5b, 1.5b, 3b, 7b, 14b, 32b). Instruct дообучен вести диалог — на «допиши код» может начать с «Конечно! Вот дополнение:», что для автодополнения не годится, подсказка должна быть чистым кодом. Base учили на FIM без диалоговой обвязки — это и есть тег для поля автодополнения. Instruct пригождается для чат-панели того же расширения; держать в Ollama можно обе модели сразу.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть Ollama

Ставим движок: Ollama и кодовая модель на сервере

Ollama из каталога apps.maatrix.io ставится автоматически при заказе сервера — команды вводить не нужно, работает на Ubuntu и Debian, адрес и доступы появляются в личном кабинете. Дальше заходите по SSH и тянете кодовую модель — заодно и instruct-версию для чат-панели того же расширения:

ollama pull qwen2.5-coder:3b-base
ollama pull qwen2.5-coder:7b-instruct

Обратите внимание на суффикс: короткий тег qwen2.5-coder:7b без суффикса резолвится в instruct-версию в квантовании Q4_K_M — тот же принцип, что и у остальной линейки Qwen (какое квантование выбрать для Qwen). Для поля автодополнения нужен именно -base. Проверить, что скачалось:

$ ollama list
NAME                          ID              SIZE      MODIFIED
qwen2.5-coder:3b-base         a1b2c3d4e5f6    1.9 GB    2 minutes ago
qwen2.5-coder:7b-instruct     f6e5d4c3b2a1    4.7 GB    3 minutes ago

Опечатка в теге лечится честной ошибкой:

$ ollama run qwen2.5-coder:3b
Error: model "qwen2.5-coder:3b" not found, try pulling it first

Проверить, что модель реально дописывает код, а не просто загрузилась, можно без редактора — напрямую через API с raw: true, который отключает шаблонизацию чата и отправляет модели ваш промпт как есть:

curl -s http://127.0.0.1:11434/api/generate -d '{
  "model": "qwen2.5-coder:3b-base",
  "prompt": "<|fim_prefix|>def is_prime(n):\n    if n < 2:\n        return False\n<|fim_suffix|>\n    return True<|fim_middle|>",
  "raw": true,
  "stream": false
}' | jq -r '.response'

Рабочая модель вернёт что-то вроде тела цикла for i in range(2, int(n**0.5) + 1): if n % i == 0: return False — то есть именно продолжение кода, без «вот дополнение для вас» и прочей вежливости чат-моделей. Если нужен более общий разбор развёртывания Ollama — материал о локальном запуске LLM через Ollama.

Открываем доступ по сети — и сразу закрываем его от чужих

По умолчанию Ollama слушает только 127.0.0.1:11434 — если пишете код на том же сервере, где крутится модель, ничего делать не нужно. Но обычный сценарий другой: редактор у вас на ноутбуке, модель — на арендованном сервере, и порт нужно открыть наружу. Правится через override, чтобы обновление сервиса не затёрло правку:

sudo systemctl edit ollama.service
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl daemon-reload && sudo systemctl restart ollama

Честная оговорка: у HTTP API Ollama нет встроенной авторизации. Любой, кто достучится до порта 11434, может скачивать ваши модели, гонять инференс за ваш счёт или читать, что вы туда посылаете, — а посылаете вы туда исходный код. Для инструмента, через который проходит кодовая база компании, открытый порт без защиты — риск на порядок выше, чем для обычного чат-бота.

Рабочих варианта три. Одному разработчику проще не открывать порт вовсе, а пробросить его по SSH: ssh -N -L 11434:127.0.0.1:11434 user@server-ip, в редакторе — http://127.0.0.1:11434, трафик идёт внутри туннеля. Команде на известных адресах — фаервол по белому списку: sudo ufw allow from 203.0.113.0/24 to any port 11434 proto tcp, затем sudo ufw deny 11434/tcp запретом по умолчанию. Команде с разных сетей — обратный прокси с TLS и базовой авторизацией перед портом 11434. Голый OLLAMA_HOST=0.0.0.0 без одного из этих трёх пунктов — не экономия на настройке, а бесплатный доступ чужим к вашему коду.

Подключаем редактор: Continue и Twinny поверх своего сервера

Оба расширения ставятся на вашей стороне — в редакторе, а не на сервере — и оба с открытым кодом.

Continue (VS Code и JetBrains) хранит настройки в ~/.continue/config.yaml — старый config.json в актуальной документации проекта помечен как deprecated. Модель для автодополнения задаётся ролью:

models:
  - name: Qwen2.5 Coder 3B FIM
    provider: ollama
    model: qwen2.5-coder:3b-base
    apiBase: http://203.0.113.10:11434
    roles:
      - autocomplete
    autocompleteOptions:
      debounceDelay: 350
      maxPromptTokens: 1024

apiBase — адрес сервера (или http://127.0.0.1:11434 через SSH-туннель). debounceDelay — пауза после остановки печати перед запросом: по умолчанию 350 мс, меньше — отзывчивее, но чаще грузит сервер. maxPromptTokens — потолок контекста FIM-запроса, вся арифметика задержки — в следующем разделе. Для чат-панели заводится вторая запись с roles: [chat] и тегом qwen2.5-coder:7b-instruct — обе модели живут в одной Ollama.

Twinny (только VS Code) настраивается через панель без ручного редактирования конфигов и заточен именно под Ollama. В Provider Manager добавляете FIM-провайдера: протокол http, хост — адрес сервера, порт 11434, путь /api/generate, модель qwen2.5-coder:3b-base, шаблон FIM — в списке есть готовый пункт Qwen. Для чата — отдельный провайдер с путём /v1, OpenAI-совместимым эндпоинтом Ollama. Twinny быстрее заводится под пару Ollama и Qwen, Continue гибче для JetBrains или смеси локальной модели с облачным чатом.

Честный расчёт: какая модель уложится в вашу задержку

Здесь легко наобещать — модель ведь и правда дописывает код. Вопрос в том, за сколько. Ghost-текст, всплывающий, пока вы ещё печатаете, должен появляться за доли секунды: пара сотен миллисекунд ощущается как отклик, пара секунд — как подвисание, и такое автодополнение быстро выключают.

Задержка — это два разных шага: сначала модель «переваривает» FIM-контекст (prompt eval, упирается в вычисления), потом генерирует ответ (eval, упирается в память). На нашем стенде (AMD EPYC 9554, 16 vCPU = 8 физических ядер плюс их гипертреды, Ollama 0.33.1, qwen2.5:7b Q4_K_M) на 16 потоках prompt eval — 68,0 ток/с, eval — 7,4 ток/с. При дефолтном maxPromptTokens: 1024 из конфига Continue выше это 1024 / 68,0 ≈ 15 секунд только на обработку контекста до первого токена ответа, плюс генерация подсказки — 30 токенов при 7,4 ток/с добавят ещё 4 секунды. Итог около 19 секунд на 7B с контекстом в тысячу токенов — это «спросил и подождал», а не ghost-текст на лету.

Два рычага. Резать контекст: 256–512 токенов вместо 1024 сокращают обработку пропорционально, а для строки-двух вокруг курсора этого обычно хватает. Брать модель меньше: на тех же 16 потоках qwen2.5:3b в нашем замере генерирует 34,1 ток/с — не «немного быстрее», а на порядок:

МодельГенерация, ток/с (16 потоков)В памяти
qwen2.5:3b34,12,2 ГБ
mistral:7b12,15,0 ГБ
qwen2.5:7b7,4–7,65,1 ГБ
llama3.1:8b12,85,6 ГБ

Заодно это объясняет разброс внутри класса: mistral:7b и llama3.1:8b обгоняют qwen2.5:7b при том же или большем числе параметров — вероятная причина в словаре Qwen2.5 на 151 936 токенов, у 7B почти 14% параметров уходит на его матрицы (разбор квантования Qwen). Coder-версии того же размера устроены так же, поэтому и по скорости ведут себя так же.

Для нескольких человек на сервере добавляется очередь — Ollama по умолчанию держит один запрос на модель за раз; тюнинг потоков и OLLAMA_NUM_PARALLEL — в статье Ollama не использует все ядра CPU. Итог: 1.5B–3B с урезанным контекстом — вменяемый ghost-текст на CPU, 7B — уже «спроси и подожди».

Какой сервер брать под свой ИИ-автодополнение в MAATRIX

Минимум для одного-двух разработчиков. 4 физических ядра с AVX2, 8 ГБ RAM, 40 ГБ NVMe. Помещается qwen2.5-coder:3b-base (1,9 ГБ весов) с запасом под KV-кэш и систему — при урезанном контексте это честный ghost-текст, а не ожидание. Ограничение прямо: сложные многострочные правки по всему файлу здесь не для CPU, модель такого размера тянет строку-блок, а не архитектурные изменения.

Комфортный вариант для команды. 8 физических ядер, 32 ГБ RAM, 100 ГБ NVMe. Одновременно держатся qwen2.5-coder:3b-base под автодополнение и qwen2.5-coder:7b-instruct под чат-панель того же расширения — OLLAMA_MAX_LOADED_MODELS=2 не упирается в память, и очередь из нескольких редакторов не превращается в минуты ожидания.

Для 7B+ на автодополнении с быстрым откликом для нескольких человек нужна видеокарта, а не CPU: обработка контекста упирается в вычисления, а 7–8B в 4-битном квантовании просят 5–6 ГБ VRAM — у MAATRIX это уровень RTX 4090 или A5000 (GPU-сервер в Великобритании для инференса LLM).

Локация — Великобритания. Copilot закрыт для России и по местоположению, и по картам — взамен брать российский сервер было бы тем же кругом проблем для команды с европейскими контрагентами. Лондон даёт низкий пинг до коллег в ЕС и деловую респектабельность юрисдикции для хранения кода компании. Для аудитории строго внутри России ближе была бы российская локация, но здесь речь про инструмент разработки, не зависящий от чужих блокировок.

Оплата — картой российского банка, по СБП, криптовалютой или токеном MAAT: то, чего не смогла дать подписка Copilot. Сервер приходит с автоматически установленной Ollama из каталога, дальше — ollama pull нужного тега и настройка расширения из раздела выше; от заказа до первой подсказки в редакторе — минуты, а не заявка на корпоративную карту. Заказать сервер под задачу — аренда VPS для доступа к нейросетям в Великобритании.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть Ollama

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Какая модель лучше всего подходит для автодополнения, если сервер только на CPU?

qwen2.5-coder:1.5b-base или :3b-base. 3B в нашем замере генерирует на порядок быстрее 7B (34,1 против 7,4–7,6 ток/с на 16 потоках) и весит на диске 1,9 ГБ против 4,7 — с урезанным maxPromptTokens это живой ghost-текст, а не секунды ожидания, как у 7B на CPU.

Безопасно ли открывать порт 11434 для команды разработчиков?

Нет, без защиты. У Ollama нет встроенной авторизации — открытый OLLAMA_HOST=0.0.0.0 пускает к моделям и коду кого угодно. Одному проще пробросить порт по SSH-туннелю, команде — ограничить фаерволом по белому списку IP или поставить обратный прокси с TLS и базовой авторизацией.

Чем модель для автодополнения отличается от модели для чата в том же расширении?

Тегом и ролью. Автодополнению нужен -base, обученный на FIM без диалоговой обвязки, и роль autocomplete в Continue (или отдельный FIM-провайдер в Twinny). Чату — -instruct и роль chat (или отдельный чат-провайдер). Обе модели можно держать в Ollama одновременно, они не мешают друг другу.

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.