OpenClaw может работать полностью на локальной модели: установите Ollama, скачайте модель с поддержкой вызова инструментов (tool calling) и укажите OpenClaw на нативную конечную точку Ollama на порту 11434 с настройкой провайдера api: "ollama". Правило, на котором спотыкается большинство, записано в официальной документации: не используйте для Ollama OpenAI-совместимый URL /v1, потому что он ломает вызов инструментов, и модель начинает печатать сырой JSON вызова инструмента как текст. Модель класса 9B, например qwen3.5:9b или gemma4, помещается в GPU на 12-16 ГБ и даёт вам приватного ассистента с нулевой стоимостью каждого сообщения; на машине только с CPU она тоже работает, но придётся подождать.
Зачем запускать OpenClaw на локальной модели
OpenClaw является шлюзом персонального AI-агента: он стоит между мессенджером (в нашей конфигурации Telegram) и LLM и от имени модели запускает инструменты, например команды оболочки, браузер или MCP-серверы. Укажите его на Ollama, и каждый промпт, файл и результат инструмента остаётся на оборудовании, которое контролируете вы, без платы за токены и без лимитов провайдера. Цена вопроса состоит в возможностях: модель, помещающаяся в один GPU, слабее всего именно в том, что делает агента агентом, то есть в выборе инструмента и формировании корректного вызова.
Шаг 1: установите Ollama и скачайте модель с поддержкой инструментов
На Linux официальный установщик настраивает Ollama как сервис systemd на 127.0.0.1:11434:
curl -fsSL https://ollama.com/install.sh | sh
ollama pull qwen3.5:9b
curl http://localhost:11434/api/tags
Последняя команда выводит список моделей на диске; если она отвечает, демон работает. Ollama также поставляется как Docker-образ: docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama, для карт NVIDIA добавьте --gpus=all, а для AMD используйте тег ollama/ollama:rocm вместе с --device /dev/kfd --device /dev/dri.
Выбор модели важнее всего. Страница настройки OpenClaw задаёт минимум: поддержка инструментов и контекст не менее 16K токенов. Собственная страница интеграции Ollama с OpenClaw рекомендует для локальных моделей не менее 64K. Каждая страница библиотеки Ollama показывает значки возможностей; ищите "tools" (на ollama.com/search есть фильтр по нему). По состоянию на сентябрь 2026 года подходят и qwen3.5 (зрение, инструменты, рассуждение), и gemma4 (зрение, инструменты, рассуждение, аудио); gemma4 является вариантом по умолчанию, который предлагает страница настройки OpenClaw. Модель без значка tools прекрасно общается и молча отказывает в тот момент, когда OpenClaw просит её что-то выполнить.
Шаг 2: укажите OpenClaw на Ollama (нативный API, а не /v1)
Когда Ollama и шлюз находятся на одной машине, самый быстрый путь состоит в автообнаружении (discovery):
export OLLAMA_API_KEY="ollama-local"
openclaw models list --provider ollama
openclaw models set ollama/qwen3.5:9b
openclaw models status
Согласно документации по обнаружению моделей, когда задан OLLAMA_API_KEY и нет явного блока провайдера, OpenClaw опрашивает http://127.0.0.1:11434, читает каталог из /api/tags и через /api/show запрашивает у каждой модели размер контекстного окна и её флаги зрения, инструментов и рассуждения. Значение ollama-local служит заполнителем для локальных хостов и хостов в LAN; документация говорит, что там подойдёт любое значение.
Для всего, что выходит за рамки умолчаний (другой хост, зафиксированный контекст, таймауты), объявите провайдера явно в файле ~/.openclaw/openclaw.json. Документация читает этот файл как JSON5, поэтому обычный JSON, как в блоке ниже, принимается всегда. Этот блок повторяет официальный рецепт:
{
"models": {
"providers": {
"ollama": {
"baseUrl": "http://127.0.0.1:11434",
"apiKey": "ollama-local",
"api": "ollama",
"timeoutSeconds": 300,
"maxTokens": 8192,
"models": [
{
"id": "qwen3.5:9b",
"name": "qwen3.5:9b",
"reasoning": true,
"input": ["text"],
"contextTokens": 32768,
"params": { "num_ctx": 32768, "thinking": false, "keep_alive": "15m" }
}
]
}
}
},
"agents": {
"defaults": {
"model": { "primary": "ollama/qwen3.5:9b" }
}
}
}
Важны три детали. Во-первых, у baseUrl нет суффикса /v1. Ollama действительно предоставляет OpenAI-совместимую конечную точку, и большинство сторонних руководств её используют, но документация OpenClaw однозначна: /v1 включает OpenAI-совместимый режим, в котором вызов инструментов ненадёжен, а модели могут выдавать сырой JSON вызова инструмента как текст. Нативный режим общается с /api/chat Ollama, который обрабатывает стриминг и вызов инструментов вместе. Во-вторых, непустой список models отключает автообнаружение, поэтому перечислите каждую нужную модель. В-третьих, ссылки на модели имеют вид provider/model: ollama/qwen3.5:9b.
Шлюз применяет многие изменения конфигурации на лету, но документация говорит, что некоторые требуют перезапуска, поэтому после смены провайдера перезапустите его (в наших развёртываниях он работает как контейнер ghcr.io/openclaw/openclaw). Затем проверьте всю цепочку пробной командой из документации по локальным моделям:
openclaw infer model run --gateway --model ollama/qwen3.5:9b --prompt "Reply with exactly: pong" --json
Какие модели помещаются в какую RAM и VRAM
Размеры загрузки и приведённые цифры VRAM взяты из библиотеки Ollama и страницы интеграции Ollama с OpenClaw, сентябрь 2026; колонка "реальный домашний ПК" является нашей оценкой по этим числам. Размер загрузки равен размеру квантованного файла весов; вам нужно столько памяти плюс место под контекст, а контекст 32K-64K у модели 9B добавляет несколько гигабайт.
| Тег модели | Загрузка | Реальный домашний ПК | Примечания |
|---|---|---|---|
| qwen3.5:4b | 3.4 ГБ | 8 ГБ RAM, CPU или небольшой GPU | Значок tools; чат и простые команды |
| qwen3.5:9b | 6.6 ГБ | 12-16 ГБ VRAM (Ollama указывает около 11 ГБ) | Наш выбор по умолчанию для локальных агентов; инструменты, рассуждение, зрение |
| gemma4 (e4b) | 9.6 ГБ | 16 ГБ VRAM (Ollama указывает около 16 ГБ) | Вариант по умолчанию, предлагаемый OpenClaw; инструменты, рассуждение, зрение, аудио |
| gemma4:12b | 7.6 ГБ | 16 ГБ VRAM | Нативный контекст 256K |
| qwen3.5:27b | 17 ГБ | 24 ГБ VRAM или больше | Лучшая дисциплина инструментов; нужна настоящая GPU-машина |
| qwen3.5:35b / gemma4:31b | 20-24 ГБ | 32 ГБ VRAM или два GPU | Рабочая станция или выделенный AI-сервер |
Две проверки. ollama ps показывает колонку PROCESSOR: "100% GPU" означает, что вся модель находится в VRAM, смешанное значение означает, что она разделена с системной RAM и скорость резко падает. А документация OpenClaw по локальным моделям предупреждает, что модель, отвечающая на короткий промпт, всё равно может провалить агентский ход; тестируйте на реальной задаче.
Где работает Ollama: та же VM или отдельная GPU-машина
Та же VM, только CPU. Самый дешёвый вариант; модель 4B-9B с небольшим контекстом работает, но рассчитывайте на ответы за десятки секунд и на ходы с множеством инструментов за минуты, в зависимости от CPU. Подходит, чтобы освоить стек до оплаты GPU-времени. Одна ловушка, когда шлюз работает в Docker, как у нас: внутри контейнера 127.0.0.1 означает сам контейнер, а не VM, поэтому http://127.0.0.1:11434 получает "connection refused"; страница устранения неполадок Ollama в документации OpenClaw перечисляет ровно этот случай, baseUrl, указывающий на localhost, пока шлюз работает в Docker или на другом хосте. Либо запустите Ollama вторым контейнером в той же сети Docker и обращайтесь к ней по имени, либо привяжите Ollama к адресу, отличному от loopback, как описывает FAQ Ollama для systemd:
sudo systemctl edit ollama.service
# add under [Service]:
Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl daemon-reload && sudo systemctl restart ollama
У локального демона Ollama нет встроенной аутентификации (поэтому ключ-заполнитель OpenClaw никогда не проверяется), так что если вы привязываете его ко всем интерфейсам, откройте порт 11434 в файрволе только для хоста шлюза. Никогда не выставляйте его, как и порт шлюза OpenClaw, в интернет: у шлюза уже была уязвимость удалённого выполнения кода в один клик (CVE-2026-25253).
Отдельная GPU-машина в локальной сети. Именно такую схему показывают рецепты OpenClaw: шлюз на небольшой постоянно включённой VM, инференс на машине с нормальным GPU. Укажите в baseUrl этот хост, поднимите timeoutSeconds, чтобы холодная загрузка не упёрлась в таймаут, и зафиксируйте keep_alive, чтобы модель оставалась в памяти (по умолчанию Ollama выгружает её через 5 минут). Документация даже показывает два провайдера Ollama одновременно, ollama-fast на небольшой машине и ollama-large на GPU-машине в качестве резерва. Если своего GPU у вас нет, арендованный с 16-24 ГБ VRAM закрывает диапазон 9B-27B; смотрите наши AI-серверы и статью какой сервер выбрать для локальной AI-модели.
Контекстное окно: настройка, которую все упускают
Длина контекста Ollama по умолчанию равна 4096 токенам. Этого хватает для чата и не хватает для агента: системный промпт OpenClaw, определения инструментов и история сами по себе могут её превысить, и тогда модель теряет начало хода, а работа с инструментами деградирует. Нижняя граница OpenClaw равна 16K; страница Ollama про OpenClaw рекомендует 64K. Поднимите её глобально через OLLAMA_CONTEXT_LENGTH=32768 в окружении сервиса Ollama или для каждой модели в openclaw.json, как выше, где contextTokens ограничивает то, что отправляет OpenClaw, а params.num_ctx сообщает Ollama, сколько выделить (если num_ctx не задан, OpenClaw выводит его из contextTokens, согласно странице расширенных настроек). Контекст стоит памяти, так что именно этот параметр вы размениваете на размер модели при фиксированном GPU.
Задержка и качество в сравнении с облачными API
Облачные модели выигрывают в чистых возможностях и во времени до первого токена. Локальная модель 9B выигрывает в приватности, стоимости при больших объёмах и предсказуемости: нет лимитов, нет снятия моделей с поддержки, нет счёта за ушедший вразнос цикл. Проигрывает она в самой агентской нагрузке; страница OpenClaw по локальным моделям предупреждает о некорректных вызовах инструментов и слишком больших промптах на полных агентских ходах. Два задокументированных способа смягчить проблему: включите Tool Search (tools.toolSearch: { "mode": "tools" }), чтобы модель видела схемы инструментов по запросу, и в крайнем случае задайте провайдеру compat.supportsTools: false, превратив эту модель в обычного чат-бота.
Легко упустить и то, что у локальных моделей нет фильтров безопасности облачных провайдеров. Документация советует держать права на инструменты и защиту от инъекций промптов на уровне, подходящем для модели: allowFrom ограничен владельцем, инструменты ограничены по отправителю, а всё, что выполняет код, работает в песочнице.
Сочетание локальной модели с облачной
OpenClaw поддерживает провайдеров на уровне отдельных агентов, поэтому схема "дешёвая локальная модель для чата, облачная модель для сложных задач" достижима как ручное разделение, а не как автоматический маршрутизатор по сложности. Три задокументированных способа:
Цепочка резервов. agents.defaults.model.fallbacks перебираются по порядку, когда основная модель не отвечает. Локальная основная, облачная в резерве: облачный ключ тратится только тогда, когда локальная машина недоступна. Это устойчивость, а не маршрутизация.
Модели на уровне агентов. Под agents.entries каждый агент несёт собственный model, а привязки (bindings) сопоставляют каналы, аккаунты или конкретных собеседников с агентами. Минимальное разделение (идентификаторы моделей как в документации OpenClaw; используйте то, что предлагает ваш облачный аккаунт):
{
"agents": {
"entries": {
"chat": { "default": true, "model": "ollama/qwen3.5:9b" },
"work": { "model": "anthropic/claude-sonnet-4-6",
"tools": { "allow": ["exec", "read", "write"] } }
}
},
"bindings": [
{ "agentId": "work", "match": { "channel": "telegram", "accountId": "work-bot" } }
]
}
Страница про мультиагентность документирует поля match и их приоритет (сначала точный собеседник, затем аккаунт и канал, вплоть до агента по умолчанию) и показывает ровно эту схему для Telegram: один бот на агента, сопоставляемый по channel: "telegram" плюс accountId, определённому под channels.telegram.accounts. Итого: один бот на локальном агенте для повседневных вопросов, второй на облачном агенте с включённым exec.
Переключение в разговоре. Чат-команда /model меняет модель на лету: /model ollama/qwen3.5:9b -s фиксирует её для текущей сессии, -a обновляет умолчание агента, а -g глобальное умолчание (оба варианта только для владельца). Псевдонимы под agents.defaults.models позволяют писать /model local или /model big.
Чек-лист по устранению неполадок
- Connection refused:
ollama serve, затемcurl http://localhost:11434/api/tags; с удалённого шлюзаopenclaw gateway status --deep. Проверьте файрволы и ловушку loopback в Docker. - Вызовы инструментов приходят обычным текстом: вы на
/v1. Уберите суффикс и задайте"api": "ollama". - Нет доступных моделей: скачайте модель или перечислите её под
models.providers.ollama.models. - Медленный первый ответ:
timeoutSeconds300 иkeep_alive15m. - Странные ответы в длинных чатах:
maxTokens8192,contextTokensиnum_ctx32768, и убедитесь черезollama ps, что модель целиком на GPU. - Общее состояние:
openclaw doctor --fix.
Если вы предпочитаете пропустить установку шлюза и начать сразу с шага 1 этой статьи, наш готовый сервер OpenClaw (от 9.35 EUR в месяц) поставляется со шлюзом, предустановленным в Docker, привязанным к вашему аккаунту Telegram, с инструментами в песочнице; добавление Ollama сводится тогда к блоку конфигурации выше. Более широкую картину затрат смотрите в статье стоимость собственного AI против API.
Вопросы
Можно ли использовать с OpenClaw OpenAI-совместимую конечную точку /v1 у Ollama?
Документация OpenClaw говорит, что не стоит. Путь /v1 переводит провайдера в OpenAI-совместимый режим, где вызов инструментов ненадёжен и модель может печатать JSON вызова инструмента как текст. Используйте baseUrl без /v1 и "api": "ollama".
С какой локальной модели начать?
Для GPU на 12-16 ГБ подойдут qwen3.5:9b или gemma4; у обеих есть значок tools, и обе названы в документации OpenClaw и Ollama. На машине только с CPU начните с qwen3.5:4b и контекста 16K, чтобы понять, приемлема ли задержка, прежде чем платить за GPU-время.
Направляет ли OpenClaw простые вопросы локальной модели, а сложные облачному API автоматически?
Нет. Задокументированные механизмы состоят из цепочки резервов (облачная модель используется только при отказе локальной), моделей на уровне агентов с привязками по каналу или собеседнику и команды /model для переключения внутри сессии. Более умную маршрутизацию вы строите поверх, например второго бота, привязанного к облачному агенту.
Почему модель, которая нормально общается, ломается, когда OpenClaw использует инструменты?
Обычно по одной из трёх причин: у модели нет поддержки инструментов, контекст остался на умолчании Ollama в 4096, и схемы инструментов вытесняют разговор из памяти, или провайдер сидит на пути /v1. Исправляйте по порядку; если небольшая модель всё ещё формирует некорректные вызовы, включите Tool Search или задайте compat.supportsTools: false.