Gateway
Локальные модели
Локальные модели работают, но предъявляют более высокие требования к оборудованию, размеру контекста и защите от внедрения промптов: небольшие или сильно квантованные модели обрезают контекст и обходятся без фильтров безопасности на стороне провайдера. На этой странице рассматриваются высокопроизводительные локальные стеки и пользовательские серверы, совместимые с OpenAI. Чтобы начать с минимальными усилиями, используйте LM Studio или Ollama и openclaw onboard.
Сведения о локальных серверах, которые должны запускаться только тогда, когда они нужны выбранной модели, см. в разделе Сервисы локальных моделей.
Минимальные требования к оборудованию
Для комфортного цикла работы агента ориентируйтесь на 2 или более Mac Studio в максимальной конфигурации либо эквивалентную систему с GPU (~$30k+). Один GPU с 24 GB справляется только с более простыми промптами и с большей задержкой. Всегда запускайте самый крупный / полноразмерный вариант, который позволяет ваше оборудование — небольшие или сильно квантованные контрольные точки повышают риск внедрения промптов (см. раздел Безопасность).
Выбор бэкенда
| Бэкенд | Когда использовать |
|---|---|
| ds4 | Локальный DeepSeek V4 Flash на macOS Metal с совместимыми с OpenAI вызовами инструментов |
| LM Studio | Первоначальная локальная настройка, загрузчик с GUI, нативный Responses API |
| LiteLLM / OAI-proxy / пользовательский прокси, совместимый с OpenAI | Когда перед другим API модели нужен прокси, чтобы OpenClaw воспринимал его как OpenAI |
| MLX / vLLM / SGLang | Самостоятельный высокопроизводительный хостинг с HTTP-эндпоинтом, совместимым с OpenAI |
| Ollama | Рабочий процесс через CLI, библиотека моделей, автономный сервис systemd |
Используйте api: "openai-responses", если бэкенд это поддерживает (LM Studio поддерживает). В противном случае используйте api: "openai-completions". Если api не указан для пользовательского провайдера с baseUrl, OpenClaw по умолчанию использует 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
- Загрузите самую крупную доступную сборку модели (избегайте «малых»/сильно квантованных вариантов), запустите сервер и убедитесь, что
http://127.0.0.1:1234/v1/modelsвыводит ее в списке. - Замените
my-local-modelфактическим идентификатором модели, отображаемым в 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, }, ], }, }, },}Чтобы локальная модель использовалась первой, а размещенная у провайдера служила подстраховкой, поменяйте порядок primary/fallbacks и сохраните тот же блок providers и models.mode: "merge".
Региональный хостинг / маршрутизация данных
Размещенные варианты MiniMax/Kimi/GLM также доступны в OpenRouter с привязанными к регионам эндпоинтами (например, размещенными в США). Выберите региональный вариант, чтобы трафик оставался в выбранной вами юрисдикции, сохранив models.mode: "merge" для резервных моделей Anthropic/OpenAI. Полностью локальное развертывание по-прежнему обеспечивает максимальную конфиденциальность; региональная маршрутизация через размещенного провайдера — это компромиссный вариант, когда нужны возможности провайдера, но также требуется контроль над потоком данных.
Другие локальные прокси, совместимые с OpenAI
MLX (mlx_lm.server), vLLM, SGLang, LiteLLM, OAI-proxy или любой пользовательский Gateway подойдет, если он предоставляет эндпоинт /v1/chat/completions в стиле OpenAI. Используйте openai-completions, если в документации бэкенда явно не указана поддержка /v1/responses.
{ 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, }, ], }, }, },}Записи пользовательских/локальных провайдеров доверяют точно заданному источнику baseUrl для защищенных запросов к моделям, включая loopback, LAN, tailnet и хосты частной DNS. Источники метаданных/link-local всегда блокируются независимо от настроек. Для запросов к другим частным источникам по-прежнему требуется models.providers.<id>.request.allowPrivateNetwork: true; установите флаг доверия в false, чтобы отключить доверие к точно заданному источнику.
models.providers.<id>.models[].id относится только к провайдеру — не включайте префикс провайдера. Для сервера MLX, запущенного с mlx_lm.server --model mlx-community/Qwen3-30B-A3B-6bit:
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"] для локальных или проксируемых моделей с поддержкой зрения, чтобы вложения изображений добавлялись в ходы агента. Интерактивная настройка пользовательского провайдера распознает распространенные идентификаторы моделей с поддержкой зрения и запрашивает сведения только для неизвестных имен; неинтерактивная настройка использует то же распознавание, а --custom-image-input / --custom-text-input позволяют его переопределить.
Используйте models.providers.<id>.timeoutSeconds для медленных локальных/удаленных серверов моделей, прежде чем увеличивать agents.defaults.timeoutSeconds. Тайм-аут провайдера охватывает подключение, заголовки, потоковую передачу тела и общее прерывание защищенной загрузки только для HTTP-запросов к модели — если тайм-аут агента/запуска меньше, увеличьте и его, поскольку тайм-аут провайдера не может продлить весь запуск.
Примечания о поведении локальных/проксируемых бэкендов /v1:
- OpenClaw рассматривает их как прокси-маршруты, совместимые с OpenAI, а не как нативные эндпоинты OpenAI.
- Формирование запросов, предназначенное только для нативного OpenAI, не применяется: без
service_tier, без Responsesstore, без формирования полезной нагрузки для совместимости рассуждений OpenAI, без подсказок для кэша промптов. - Скрытые заголовки атрибуции OpenClaw (
originator,version,User-Agent) не добавляются для пользовательских URL прокси.
Переопределения совместимости для более строгих бэкендов, совместимых с OpenAI:
-
Содержимое только в виде строки: некоторые серверы принимают в
messages[].contentтолько строки, а не структурированные массивы частей содержимого. Установитеmodels.providers.<provider>.models[].compat.requiresStringContent: true. -
Строгий набор ключей сообщения: если сервер отклоняет элементы сообщения, содержащие не только
role/content, установитеcompat.strictMessageKeys: true. -
Текст вызова инструмента в скобках: некоторые локальные модели выводят отдельные запросы инструментов в скобках как текст, например
[tool_name], затем JSON и[END_TOOL_REQUEST]. OpenClaw преобразует их в настоящие вызовы инструментов только в том случае, если имя точно соответствует инструменту, зарегистрированному для этого хода; в противном случае это остается скрытым неподдерживаемым текстом. -
Неструктурированный текст, похожий на вызов инструмента: если модель выводит текст в формате JSON/XML/ReAct, который выглядит как вызов инструмента, но не является структурированным вызовом, OpenClaw оставляет его текстом и записывает предупреждение с идентификатором запуска, провайдером/моделью, обнаруженным шаблоном и именем инструмента, если оно доступно. Это несовместимость провайдера/модели, а не выполненный запуск инструмента.
-
Принудительное использование инструментов: если инструменты отображаются как текст ассистента (необработанный JSON/XML/ReAct или пустой массив
tool_calls), сначала убедитесь, что шаблон/парсер чата сервера поддерживает вызовы инструментов. Если парсер работает только при принудительном использовании инструментов, переопределите для каждой модели стандартное прокси-значениеtool_choice: "auto":json5 { agents: { defaults: { models: { "local/my-local-model": { params: { extra_body: { tool_choice: "required", }, }, }, }, }, },}Используйте это только там, где каждый обычный ход должен вызывать инструмент. Замените
local/my-local-modelточной ссылкой изopenclaw models listили задайте ее через CLI:bash openclaw config set agents.defaults.models '{"local/my-local-model":{"params":{"extra_body":{"tool_choice":"required"}}}}' --strict-json --merge -
Дополнительные уровни глубины рассуждений: если пользовательская модель, совместимая с OpenAI, принимает уровни глубины рассуждений OpenAI сверх встроенного профиля, объявите их в блоке совместимости модели. Добавление
"xhigh"делает его доступным для этой ссылки на модель в/think xhigh, средствах выбора сеанса, проверке Gateway и проверкеllm-task: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. Он исключает ресурсоёмкие инструменты браузера, cron, сообщений, генерации мультимедиа, голосовых функций и PDF, если они не требуются явно, а более крупные каталоги инструментов по умолчанию скрывает за структурированными элементами управления поиском инструментов, сохраняяexecнепосредственно видимым. Подробности и инструкции по проверке его активации см. в разделе Экспериментальные функции -> Облегчённый режим локальной модели. -
В крайнем случае полностью отключите инструменты, задав
models.providers.<provider>.models[].compat.supportsTools: falseдля этой модели, — после этого агент будет работать без вызовов инструментов. -
Если это не помогло, узкое место находится на стороне вышестоящей системы. Если после включения облегчённого режима и
supportsTools: falseбэкенд по-прежнему даёт сбои только при более крупных запусках OpenClaw, оставшаяся проблема обычно связана с самой моделью или сервером — окном контекста, памятью GPU, вытеснением kv-кэша или ошибкой бэкенда, — а не с транспортным уровнем OpenClaw.
Устранение неполадок
- Gateway не может подключиться к прокси?
curl http://127.0.0.1:1234/v1/models. - Модель выгружена из LM Studio? Загрузите её снова; холодный запуск часто воспринимается как «зависание».
- Локальный сервер сообщает
terminated,ECONNRESETили закрывает поток в середине обращения? OpenClaw записывает в диагностические данные низкокардинальную меткуmodel.call.error.failureKind, а также снимок RSS/кучи процесса OpenClaw. При нехватке памяти в LM Studio/Ollama сопоставьте эту временную метку с журналом сервера или журналом сбоя/jetsam в macOS, чтобы подтвердить, был ли процесс сервера модели завершён. - Ошибки контекста? OpenClaw вычисляет пороговые значения предварительной проверки окна контекста на основе обнаруженного окна модели (или ограниченного окна, если
agents.defaults.contextTokensуменьшает его): предупреждение выдаётся при значении ниже 20% с минимальным порогом 8k, а жёсткая блокировка — ниже 10% с минимальным порогом 4k (порог ограничивается эффективным окном контекста, чтобы завышенные метаданные модели не приводили к отклонению допустимого пользовательского ограничения). УменьшитеcontextWindowили увеличьте ограничение контекста сервера/модели. messages[].content ... expected a string? Добавьтеcompat.requiresStringContent: trueв запись этой модели.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? Не добавляйте прокси, который вслепую преобразует текст ответа ассистента в выполнение инструментов, — сначала исправьте шаблон чата или парсер сервера. Если модель работает только при принудительном использовании инструментов, добавьте указанное выше переопределениеparams.extra_body.tool_choice: "required"и используйте эту запись модели только для сеансов, в которых вызов инструмента ожидается при каждом обращении. - Безопасность: локальные модели не используют фильтры на стороне провайдера. Ограничивайте область действий агентов и не отключайте Compaction, чтобы уменьшить потенциальный ущерб от внедрения инструкций в запрос.