Gateway
Локальные модели
Локальные модели вполне возможны. Но они также повышают требования к оборудованию, размеру контекста и защите от prompt injection — небольшие или агрессивно квантизованные карты обрезают контекст и ослабляют безопасность. Эта страница — практическое руководство для локальных стеков высокого уровня и пользовательских локальных серверов, совместимых с OpenAI. Для самого простого онбординга начните с LM Studio или Ollama и openclaw onboard.
Для локальных серверов, которые должны запускаться только тогда, когда они нужны выбранной модели, см. Сервисы локальных моделей.
Минимальный уровень оборудования
Ориентируйтесь на мощную конфигурацию: ≥2 Mac Studio в максимальной комплектации или эквивалентный GPU-стенд (~$30k+) для комфортного агентного цикла. Один GPU на 24 GB подходит только для более легких промптов с большей задержкой. Всегда запускайте самый крупный / полноразмерный вариант, который можете разместить; небольшие или сильно квантизованные контрольные точки повышают риск prompt injection (см. Безопасность).
Выберите бэкенд
| Бэкенд | Когда использовать |
|---|---|
| ds4 | Локальный DeepSeek V4 Flash на macOS Metal с совместимыми с OpenAI вызовами инструментов |
| LM Studio | Первая локальная настройка, GUI-загрузчик, нативный Responses API |
| LiteLLM / OAI-proxy / пользовательский OpenAI-совместимый прокси | Вы проксируете API другой модели и хотите, чтобы OpenClaw обрабатывал его как OpenAI |
| MLX / vLLM / SGLang | Высокопроизводительная самостоятельная подача моделей через OpenAI-совместимую HTTP-точку доступа |
| Ollama | CLI-процесс, библиотека моделей, автономный сервис systemd |
Используйте Responses API (api: "openai-responses"), когда бэкенд его поддерживает (LM Studio поддерживает). В остальных случаях используйте Chat Completions (api: "openai-completions").
Рекомендуется: LM Studio + крупная локальная модель (Responses API)
Лучший актуальный локальный стек. Загрузите крупную модель в LM Studio (например, полноразмерную сборку Qwen, DeepSeek или Llama), включите локальный сервер (по умолчанию http://127.0.0.1:1234) и используйте Responses API, чтобы отделять рассуждения от финального текста.
{ agents: { defaults: { model: { primary: "lmstudio/my-local-model" }, models: { "anthropic/claude-opus-4-6": { alias: "Opus" }, "lmstudio/my-local-model": { alias: "Local" }, }, }, }, models: { mode: "merge", providers: { lmstudio: { baseUrl: "http://127.0.0.1:1234/v1", apiKey: "lmstudio", api: "openai-responses", models: [ { id: "my-local-model", name: "Local Model", reasoning: false, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 196608, maxTokens: 8192, }, ], }, }, },}Контрольный список настройки
- Установите LM Studio: https://lmstudio.ai
- В LM Studio скачайте самую крупную доступную сборку модели (избегайте "small"/сильно квантизованных вариантов), запустите сервер и убедитесь, что
http://127.0.0.1:1234/v1/modelsпоказывает ее в списке. - Замените
my-local-modelна фактический ID модели, показанный в LM Studio. - Держите модель загруженной; холодная загрузка добавляет задержку запуска.
- Скорректируйте
contextWindow/maxTokens, если ваша сборка LM Studio отличается. - Для WhatsApp используйте Responses API, чтобы отправлялся только финальный текст.
Оставляйте размещенные модели настроенными даже при локальном запуске; используйте models.mode: "merge", чтобы резервные варианты оставались доступными.
Гибридная конфигурация: размещенная основная модель, локальный резерв
{ agents: { defaults: { model: { primary: "anthropic/claude-sonnet-4-6", fallbacks: ["lmstudio/my-local-model", "anthropic/claude-opus-4-6"], }, models: { "anthropic/claude-sonnet-4-6": { alias: "Sonnet" }, "lmstudio/my-local-model": { alias: "Local" }, "anthropic/claude-opus-4-6": { alias: "Opus" }, }, }, }, models: { mode: "merge", providers: { lmstudio: { baseUrl: "http://127.0.0.1:1234/v1", apiKey: "lmstudio", api: "openai-responses", models: [ { id: "my-local-model", name: "Local Model", reasoning: false, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 196608, maxTokens: 8192, }, ], }, }, },}Сначала локальная модель, с размещенной страховкой
Поменяйте местами порядок основной модели и резервов; оставьте тот же блок providers и models.mode: "merge", чтобы можно было переключиться на Sonnet или Opus, когда локальная машина недоступна.
Региональный хостинг / маршрутизация данных
- Размещенные варианты MiniMax/Kimi/GLM также доступны в OpenRouter с привязанными к региону точками доступа (например, размещенными в США). Выберите там региональный вариант, чтобы удерживать трафик в выбранной юрисдикции и при этом использовать
models.mode: "merge"для резервов Anthropic/OpenAI. - Только локальный режим остается самым сильным вариантом для приватности; размещенная региональная маршрутизация — промежуточный вариант, когда нужны функции провайдера, но требуется контроль над потоком данных.
Другие OpenAI-совместимые локальные прокси
MLX (mlx_lm.server), vLLM, SGLang, LiteLLM, OAI-proxy или пользовательские
Gateway работают, если они предоставляют точку доступа OpenAI-стиля
/v1/chat/completions. Используйте адаптер Chat Completions, если бэкенд явно
не документирует поддержку /v1/responses. Замените блок provider выше на вашу
точку доступа и ID модели:
{ agents: { defaults: { model: { primary: "local/my-local-model" }, }, }, models: { mode: "merge", providers: { local: { baseUrl: "http://127.0.0.1:8000/v1", apiKey: "sk-local", api: "openai-completions", timeoutSeconds: 300, models: [ { id: "my-local-model", name: "Local Model", reasoning: false, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 120000, maxTokens: 8192, }, ], }, }, },}Если api опущен у пользовательского provider с baseUrl, OpenClaw по умолчанию использует
openai-completions. Пользовательские/локальные записи provider доверяют своему точно настроенному
источнику baseUrl для защищенных запросов к моделям, включая loopback, LAN, tailnet
и private DNS hosts. Запросам к другим частным источникам по-прежнему нужен
request.allowPrivateNetwork: true; источники metadata/link-local остаются заблокированными
без явного включения. Установите false, чтобы отказаться от доверия точному источнику.
Значение models.providers.<id>.models[].id является локальным для provider. Не
включайте туда префикс provider. Например, сервер MLX, запущенный с
mlx_lm.server --model mlx-community/Qwen3-30B-A3B-6bit, должен использовать этот
ID каталога и ссылку на модель:
models.providers.mlx.models[].id: "mlx-community/Qwen3-30B-A3B-6bit"agents.defaults.model.primary: "mlx/mlx-community/Qwen3-30B-A3B-6bit"
Задайте input: ["text", "image"] для локальных или проксируемых vision-моделей, чтобы вложения
изображений включались в ходы агента. Интерактивный онбординг пользовательского provider
распознает распространенные ID vision-моделей и спрашивает только о неизвестных именах.
Неинтерактивный онбординг использует то же распознавание; используйте --custom-image-input
для неизвестных vision ID или --custom-text-input, когда модель с похожим на vision именем
на вашей точке доступа работает только с текстом.
Оставьте models.mode: "merge", чтобы размещенные модели оставались доступными как резервы.
Используйте models.providers.<id>.timeoutSeconds для медленных локальных или удаленных серверов
моделей, прежде чем увеличивать agents.defaults.timeoutSeconds. Тайм-аут provider
применяется только к HTTP-запросам модели, включая подключение, заголовки, потоковую передачу тела
и общий защищенный fetch abort. Если тайм-аут агента или запуска ниже, увеличьте
и этот предел, потому что тайм-ауты provider не могут продлить весь запуск агента.
Примечание о поведении для локальных/проксируемых бэкендов /v1:
- OpenClaw обрабатывает их как proxy-style OpenAI-совместимые маршруты, а не как нативные точки доступа OpenAI
- формирование запросов, предназначенное только для нативного OpenAI, здесь не применяется: нет
service_tier, нет Responsesstore, нет формирования payload для совместимости с OpenAI reasoning и нет подсказок prompt cache - скрытые заголовки атрибуции OpenClaw (
originator,version,User-Agent) не добавляются в эти пользовательские proxy URLs
Примечания о совместимости для более строгих OpenAI-совместимых бэкендов:
-
Некоторые серверы принимают в Chat Completions только строковый
messages[].content, а не структурированные массивы частей содержимого. Для таких точек доступа задайтеmodels.providers.<provider>.models[].compat.requiresStringContent: true. -
Некоторые локальные модели выводят отдельные заключенные в скобки текстовые запросы инструментов, например
[tool_name], за которым следует JSON и[END_TOOL_REQUEST]. OpenClaw преобразует их в реальные вызовы инструментов только когда имя точно совпадает с зарегистрированным инструментом для хода; иначе блок считается неподдерживаемым текстом и скрывается из видимых пользователю ответов. -
Если модель выводит JSON, XML или текст в стиле ReAct, похожий на вызов инструмента, но provider не выдал структурированный вызов, OpenClaw оставляет это как текст и пишет предупреждение с run id, provider/model, обнаруженным паттерном и именем инструмента, когда оно доступно. Считайте это несовместимостью provider/model с вызовами инструментов, а не завершенным запуском инструмента.
-
Если инструменты появляются как текст ассистента вместо запуска, например raw JSON, XML, синтаксис ReAct или пустой массив
tool_callsв ответе provider, сначала проверьте, что сервер использует chat template/parser с поддержкой вызовов инструментов. Для OpenAI-совместимых бэкендов Chat Completions, у которых parser работает только при принудительном использовании инструментов, задайте переопределение запроса для отдельной модели вместо зависимости от текстового парсинга:json5 { agents: { defaults: { models: { "local/my-local-model": { params: { extra_body: { tool_choice: "required", }, }, }, }, }, },}Используйте это только для моделей/сессий, где каждый обычный ход должен вызывать инструмент. Это переопределяет стандартное proxy-значение OpenClaw
tool_choice: "auto". Заменитеlocal/my-local-modelна точную ссылку provider/model, показаннуюopenclaw models list.bash openclaw config set agents.defaults.models '{"local/my-local-model":{"params":{"extra_body":{"tool_choice":"required"}}}}' --strict-json --merge -
Если пользовательская OpenAI-совместимая модель принимает OpenAI reasoning efforts за пределами встроенного профиля, объявите их в блоке compat модели. Добавление
"xhigh"здесь делает уровень доступным для/think xhigh, селекторов сессий, проверки Gateway и проверкиllm-taskдля этой настроенной ссылки provider/model:json5 { models: { providers: { local: { baseUrl: "http://127.0.0.1:8000/v1", apiKey: "sk-local", api: "openai-responses", models: [ { id: "gpt-5.4", name: "GPT 5.4 via local proxy", reasoning: true, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 196608, maxTokens: 8192, compat: { supportedReasoningEfforts: ["low", "medium", "high", "xhigh"], reasoningEffortMap: { xhigh: "xhigh" }, }, }, ], }, }, },}
Меньшие или более строгие бэкенды
Если модель загружается без ошибок, но полные ходы агента работают неправильно, двигайтесь сверху вниз: сначала подтвердите транспорт, затем сужайте поверхность.
-
Подтвердите, что сама локальная модель отвечает. Без инструментов, без контекста агента:
bash openclaw infer model run --local --model <provider/model> --prompt "Reply with exactly: pong" --json -
Подтвердите маршрутизацию Gateway. Отправляет только переданный промпт: пропускает транскрипт, начальную загрузку AGENTS, сборку контекстного движка, инструменты и встроенные MCP-серверы, но по-прежнему проверяет маршрутизацию Gateway, аутентификацию и выбор провайдера:
bash openclaw infer model run --gateway --model <provider/model> --prompt "Reply with exactly: pong" --json -
Попробуйте экономный режим. Если обе проверки проходят, но реальные обращения агента завершаются ошибками из-за некорректных вызовов инструментов или слишком больших промптов, включите
agents.defaults.experimental.localModelLean: true. Он убирает три самых тяжелых инструмента по умолчанию (browser,cron,message) и по умолчанию скрывает более крупные каталоги инструментов за структурированными элементами управления поиском инструментов, кроме запусков, которым нужно сохранить семантику прямой доставкиmessage. Полное объяснение, когда это использовать и как подтвердить, что режим включен, см. в Экспериментальные функции → Экономный режим локальной модели. -
Полностью отключите инструменты как крайнее средство. Если экономного режима недостаточно, задайте
models.providers.<provider>.models[].compat.supportsTools: falseдля этой записи модели. После этого агент будет работать на этой модели без вызовов инструментов. -
После этого узкое место находится выше по стеку. Если бэкенд по-прежнему падает только на более крупных запусках OpenClaw после экономного режима и
supportsTools: false, оставшаяся проблема обычно связана с вышестоящей моделью или емкостью сервера: контекстным окном, памятью GPU, вытеснением kv-cache или ошибкой бэкенда. На этом этапе это уже не транспортный слой OpenClaw.
Устранение неполадок
- Gateway может подключиться к прокси?
curl http://127.0.0.1:1234/v1/models. - Модель LM Studio выгружена? Перезагрузите ее; холодный запуск часто приводит к «зависанию».
- Локальный сервер сообщает
terminated,ECONNRESETили закрывает поток в середине обращения? OpenClaw записывает низкокардинальныйmodel.call.error.failureKind, а также снимок RSS/heap процесса OpenClaw в диагностике. При нехватке памяти в LM Studio/Ollama сопоставьте эту временную метку с журналом сервера или журналом сбоев macOS / журналом jetsam, чтобы подтвердить, был ли сервер модели завершен. - OpenClaw выводит пороги предварительной проверки контекстного окна из обнаруженного окна модели или из неограниченного окна модели, когда
agents.defaults.contextTokensуменьшает эффективное окно. Он предупреждает ниже 20% с минимальным порогом 8k. Жесткая блокировка использует порог 10% с минимальным порогом 4k, ограниченный эффективным контекстным окном, чтобы завышенные метаданные модели не могли отклонить в остальном допустимое пользовательское ограничение. Если вы столкнулись с такой предварительной проверкой, увеличьте лимит контекста сервера/модели или выберите модель большего размера. - Ошибки контекста? Уменьшите
contextWindowили увеличьте лимит сервера. - OpenAI-совместимый сервер возвращает
messages[].content ... expected a string? Добавьтеcompat.requiresStringContent: trueв эту запись модели. - OpenAI-совместимый сервер возвращает
validation.keysили сообщает, что записи сообщений допускают толькоroleиcontent? Добавьтеcompat.strictMessageKeys: trueв эту запись модели. - Прямые маленькие вызовы
/v1/chat/completionsработают, ноopenclaw infer model run --localзавершается ошибкой на Gemma или другой локальной модели? Сначала проверьте URL провайдера, ссылку на модель, маркер аутентификации и журналы сервера; локальныйmodel runне включает инструменты агента. Если локальныйmodel runуспешно выполняется, но более крупные обращения агента завершаются ошибкой, уменьшите набор инструментов агента с помощьюlocalModelLeanилиcompat.supportsTools: false. - Вызовы инструментов отображаются как сырой текст JSON/XML/ReAct или провайдер возвращает
пустой массив
tool_calls? Не добавляйте прокси, который слепо преобразует текст ассистента в выполнение инструментов. Сначала исправьте chat template/parser сервера. Если модель работает только при принудительном использовании инструментов, добавьте приведенное выше переопределениеparams.extra_body.tool_choice: "required"для отдельной модели и используйте эту запись модели только для сессий, где вызов инструмента ожидается на каждом обращении. - Безопасность: локальные модели пропускают фильтры на стороне провайдера; держите агентов узко ограниченными и включайте Compaction, чтобы ограничить радиус поражения prompt injection.