Локальный LLM-агент для кода — это кодинг-CLI, например opencode, Aider, Goose, Qwen Code, Crush или Codex, направленный не на облачный API, а на модель, которая работает на вашей машине через Ollama или LM Studio. Вы запускаете локальный сервер (Ollama слушает http://localhost:11434, LM Studio — http://127.0.0.1:1234), выбираете модель с поддержкой вызова инструментов, поднимаете длину контекста заметно выше значения по умолчанию и указываете CLI этот эндпоинт. Это работает, код остаётся у вас, а за токены ничего платить не нужно. Но такой агент медленнее и слабее лучших облачных моделей, поэтому большинство в итоге приходит к гибридной схеме.
Что здесь на самом деле значит «локально»
Кодинг-агент состоит из двух частей: CLI, который читает файлы, запускает команды и правит код, и модели, которая решает, что делать дальше. Переход на локальный вариант заменяет только вторую часть. CLI выполняет тот же цикл, просто отправляет запросы на сервер на localhost, а не в API провайдера.
Оба распространённых локальных сервера понимают OpenAI-совместимый API:
| Сервер | Адрес по умолчанию | Как запустить |
|---|---|---|
| Ollama | http://localhost:11434/v1 | Приложение Ollama или ollama serve |
| LM Studio | http://127.0.0.1:1234/v1 | Вкладка Developer → «Start server» или lms server start |
В документации Ollama отмечено, что OpenAI-клиентам нужно значение API-ключа, но Ollama его игнорирует, поэтому для локального сервера подойдёт любая заглушка.
Настройка, которую все упускают: длина контекста
Прежде чем выбирать CLI, исправьте это. Агенты отправляют много контекста: системный промпт, описания инструментов, содержимое файлов и вывод команд. Локальный сервер с маленьким окном тихо отрежет большую часть.
Контекстное окно Ollama по умолчанию зависит от VRAM: 4k токенов при памяти меньше 24 GiB, 32k от 24 до 48 GiB и 256k при 48 GiB и больше. В документации Aider добавлено, что Ollama молча отбрасывает контекст, не помещающийся в окно. В документации Goose значение по умолчанию в 4096 токенов названо слишком низким, а в собственном руководстве Ollama по Codex просят не меньше 64k.
Увеличьте его при запуске сервера и проверьте:
OLLAMA_CONTEXT_LENGTH=64000 ollama serve
ollama ps # CONTEXT column shows the allocated length
В приложении Ollama в настройках есть ползунок длины контекста, который делает то же самое. Если ollama ps показывает в столбце PROCESSOR, что модель частично на CPU, значит, контекст или модель слишком велики для вашего GPU, и всё будет работать медленнее.
Какие CLI поддерживают локальные модели
Ниже то, что подтверждает документация каждого инструмента. Мы перечисляем только те конфигурации, которые смогли проверить.
| CLI | Локальный путь | Где настраивается |
|---|---|---|
| Codex | --oss с Ollama или LM Studio | Флаг или oss_provider в config.toml |
| opencode | Любой OpenAI-совместимый провайдер | Раздел provider в opencode.json |
| Aider | ollama_chat/<model> или openai/<model> | Переменные окружения |
| Goose | Ollama, LM Studio и другие провайдеры | goose configure |
| Qwen Code | Любой OpenAI-совместимый эндпоинт | Переменные OPENAI_* или ~/.qwen/settings.json |
| Crush | Типы провайдеров ollama и lmstudio | Его конфиг провайдеров |
Codex
У Codex самый короткий путь. По его документации, он может работать с локальным «open source»-провайдером, например Ollama или LM Studio, если передать --oss:
codex --oss # default local model
codex --oss -m gpt-oss:120b # a specific model
Провайдер по умолчанию задаётся в ~/.codex/config.toml через oss_provider = "ollama" (или "lmstudio"). У Ollama также есть ollama launch codex, который настраивает профиль за вас. Внутри Codex команда /model переключает установленные модели с поддержкой инструментов.
opencode
opencode принимает любой OpenAI-совместимый сервер как собственного провайдера в opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"ollama": {
"npm": "@ai-sdk/openai-compatible",
"name": "Ollama (local)",
"options": { "baseURL": "http://localhost:11434/v1" },
"models": { "qwen3": { "name": "Qwen3 (local)" } }
}
}
}
Для LM Studio используйте http://127.0.0.1:1234/v1 как базовый URL и идентификатор модели, показанный в LM Studio. В документации opencode есть полезный совет: если вызовы инструментов не работают, увеличьте num_ctx в Ollama, начиная примерно с 16k–32k.
Aider
Aider работает с Ollama напрямую. В его документации рекомендуется префикс ollama_chat/:
export OLLAMA_API_BASE=http://127.0.0.1:11434
aider --model ollama_chat/<model>
Для LM Studio или любого другого OpenAI-совместимого сервера задайте OPENAI_API_BASE и OPENAI_API_KEY, затем используйте aider --model openai/<model-name>. Фиксированный размер контекста записывается в .aider.model.settings.yml как num_ctx в разделе extra_params.
Goose
Goose называет Ollama и LM Studio среди провайдеров. Выполните goose configure, выберите Ollama и введите имя модели. Он использует localhost:11434, если OLLAMA_HOST не указывает иное; LM Studio по умолчанию — localhost:1234 без API-ключа. В документации Goose главное ограничение названо прямо: он активно использует вызов инструментов, поэтому модель без него может только вести чат.
Qwen Code
Qwen Code поддерживает любой OpenAI-совместимый эндпоинт, а в его README локальные модели упомянуты через Ollama или vLLM. Направьте стандартные переменные на свой сервер:
export OPENAI_BASE_URL=http://localhost:11434/v1
export OPENAI_API_KEY=ollama # any placeholder for a local server
export OPENAI_MODEL=<model>
qwen
То же можно хранить в ~/.qwen/settings.json в разделе modelProviders или настроить интерактивно командой /auth.
Crush
Crush поддерживает ollama и lmstudio как типы провайдеров. В его README Ollama добавляется с базовым URL http://localhost:11434/v1. Модель выбирается внутри Crush по Ctrl+L.
Если локальный агент ведёт себя странно
Большинство проблем с локальным кодинг-агентом сводится к нескольким причинам. Проверяйте их по порядку:
- Он забывает файлы или инструкции посреди задачи. Контекст слишком мал, и сервер его обрезает. Увеличьте
OLLAMA_CONTEXT_LENGTH(илиnum_ctx) и убедитесь черезollama ps. - Вызовы инструментов падают или приходят обычным текстом. Возможно, модель не поддерживает вызов инструментов или контекста не хватает на описания инструментов. Попробуйте модель с поддержкой инструментов и окно побольше; в документации opencode советуют начинать примерно с 16k–32k.
- CLI пишет, что модели не существует. Имя в CLI должно точно совпадать с идентификатором сервера: тег из
ollama listили идентификатор на панели сервера в LM Studio. - Connection refused. Сервер не запущен, или CLI ждёт другой адрес. У Ollama это
11434, у LM Studio1234, и некоторым CLI нужен суффикс/v1, а уOLLAMA_API_BASEв Aider его нет. - Всё очень медленно. Модель или контекст не помещаются на GPU.
ollama psпоказывает долю CPU; выберите модель поменьше или более короткий контекст.
Реалии железа
Здесь ожидания обычно и разбиваются. Локальный кодинг-агент — задача тяжелее, чем локальный чат:
- Модель должна помещаться в память. VRAM видеокарты на ПК, унифицированная память на Apple Silicon. Если не помещается, слои уходят на CPU, и генерация резко замедляется.
- Контекст тоже занимает память. Окно в 64k поверх весов модели требует гораздо больше места, чем чат на 4k. Поэтому Ollama и привязывает длину контекста по умолчанию к VRAM.
- Маленьким моделям тяжело с инструментами. Агентам нужны надёжные вызовы инструментов и умение следовать длинному системному промпту. Маленькие модели часто выдают некорректные вызовы, зацикливаются или останавливаются раньше времени. В Goose отмечают, что некоторые модели, например нативная DeepSeek-R1, вообще не поддерживают вызов инструментов.
- Скорость накапливается. Агент делает на задачу много запросов, каждый с большим промптом. Модель, которая в чате кажется нормальной, может растянуть десятишаговую задачу надолго.
Практичный способ начать: возьмите самую большую кодинговую модель с поддержкой инструментов, которая целиком помещается на ваш GPU при контексте от 32k до 64k, проверьте через ollama ps и испытайте на небольшой реальной задаче, прежде чем доверять ей что-то серьёзнее.
Зачем идти в локальный режим: приватность и контроль
Главная причина в том, что инференс остаётся на вашей машине:
- Ваши промпты и код не отправляются провайдеру модели.
- Всё работает офлайн и в изолированных (air-gapped) средах.
- Нет счетов за токены и лимитов использования, о которые можно удариться.
- Модель не меняется у вас под руками; вы сами решаете, когда обновляться.
Две оговорки, чтобы не лукавить. Во-первых, CLI всё равно может ходить в сеть: у Codex с профилем запуска от Ollama есть веб-поиск, а у некоторых CLI есть телеметрия. Если ничто не должно покидать машину, проверьте настройки каждого инструмента. Во-вторых, локальный запуск не делает самого агента безопаснее. Он по-прежнему запускает команды и правит файлы, поэтому действуют обычные практики безопасности кодинг-агентов.
Компромиссы по сравнению с облачными моделями
| Локальная модель | Облачная топ-модель | |
|---|---|---|
| Код покидает машину | Нет | Да, уходит провайдеру |
| Стоимость | Железо и электричество | За токены или по подписке |
| Лимиты использования | Нет | Зависят от тарифа |
| Качество на сложных задачах из нескольких файлов | Ниже, зависит от размера модели | Лучшее из доступного |
| Надёжность вызовов инструментов | Зависит от модели | Высокая |
| Контекстное окно | Ограничено вашей памятью | Очень большое |
| Скорость | Зависит от вашего железа | Быстро и стабильно |
Разрыв меньше всего на ограниченных задачах: написать тест, объяснить функцию, небольшой рефакторинг, сообщение коммита. Больше всего он на длинной многошаговой работе с множеством файлов, где агент должен держать план и исправлять собственные ошибки.
Гибридная схема, которая работает
Разделение обычно работает лучше, чем «всё или ничего»:
- Чувствительная или офлайн-работа идёт локально. Код, который не должен покидать машину, клиентские репозитории со строгими условиями, работа в самолёте.
- Рутинные ограниченные задачи идут локально. Тесты, документация, мелкие исправления и объяснения.
- Сложные задачи идут облачной модели. Архитектурные изменения, хитрые баги, крупные рефакторинги.
- Ревью в свежем контексте. Пусть второй агент проверяет дифф первого, какая бы модель его ни написала.
Проще всего это организовать, запустив одновременно двух и более агентов: один на локальном эндпоинте, другой на облачной модели, каждый в своей папке или git worktree, чтобы они не правили одни и те же файлы.
Локальные и облачные агенты рядом в AgentVera
AgentVera — десктопное приложение, которое запускает много CLI-агентов рядом в одном рабочем пространстве, что подходит для описанной гибридной схемы. Чтобы не было недопонимания, что оно делает, а что нет:
- Встроенной интеграции с Ollama или LM Studio нет. Каждый агент использует собственную настройку провайдера:
goose configureдля Goose, собственный конфиг и/connectу opencode, переменные окружения или.aider.conf.ymlу Aider, вход или API-ключ у Qwen Code, настройки Crush (Ctrl+L). - Поле «Model» передаётся в CLI. Для таких агентов, как Qwen Code, Goose и Aider, то, что вы там вводите, уходит в CLI как
--model. Для Goose подсказка гласит: «If left empty, the model chosen withgoose configureis used.» - У агентов могут быть переменные окружения. В Settings → Accounts → Accounts of other agents аккаунт, добавленный «With an API key», хранит «Variable name» и его значение. Для Qwen Code
OPENAI_BASE_URL— одно из предлагаемых имён, а любое другое можно ввести вручную. Это часть переключения аккаунтов в тарифах Pro и Team. - Инструменты контекста работают не только с Claude Code. Размер контекста измеряется по собственной истории каждого CLI, а автокомпактинг использует собственную команду compact у того CLI, где она есть. При маленьком локальном окне это важно ещё сильнее.
Так что реалистичная картина такая: вы настраиваете локальную модель в CLI так, как описано в его документации, а AgentVera позволяет запустить этого агента рядом с облачным, следить за обоими и не смешивать их работу.