Субагенты на стероидах: как я подружил OpenClaw с 14 локальными LLM и не утонул в «пустых ответах»
Боль
– Запускаешь субагента — а в ответ тишина. Никаких ошибок, просто пустой content. Думаешь, «сломалось». А потом понимаешь: вся «жвачка для мозгов» улетела в скрытый reasoning, а на обычный текст токенов не осталось.
– Вторая мина: OpenClaw парсит model ref по первому слэшу. Если у провайдера id модели с префиксом вроде ollama/..., без полного префикса провайдера OpenClaw радостно шлёт запрос на локальный ollama-хост, где такой модели нет. И ты дебажишь не то место.
Решение
– Дать моделям дышать: maxtokens=16000 для «думающих» (qwen3, deepseek-r1 и т.п.). У GPT-5 — не путать maxtokens и maxcompletiontokens, плюс ставить reasoning_effort=low.
– Указывать полный реф модели с провайдером: provL/ollama/..., а не просто ollama/.... Тогда resolvedProvider попадает куда нужно, и субагент оживает.
Что делал по шагам (и живые цифры)
1) Тест 21 модели на одном конфиге (06:10–06:50 UTC) – Конфиг: сокращённый экспорт MikroTik (14.5KB), один и тот же промпт: топология + 5 проблем + что пинговать. – 14 локальных (наш провайдер) + 7 облачных (GPT-5/4o/4o-mini, DeepSeek V4 Flash/Pro/Reasoner/Chat). – Результаты: 20/21 ответили, llama3.1 упал с 500. – Пьедестал: GPT-5 → DeepSeek V4 Pro → gemma3:latest (лучшая локальная). – Стоимость всего прогона: ~$0.23 (148K prompt + 70K completion). – Главный грабль: пустые ответы thinking-моделей ≠ поломка, а нехватка maxtokens. – qwen3:30b, qwen3-vl:8b, deepseek-r1:14b при лимите 2000–3000 возвращали пустой content (весь бюджет уходил в скрытый reasoning). – С maxtokens=16000 все заговорили. – GPT-5: нужен maxcompletiontokens (не maxtokens!) + reasoningeffort=low.
2) Проверка tools (08:08 UTC) – Прогнал function calling у 5 кандидатов через API нашего провайдера. – ✅ Все 5 поддерживают tools: gemma4:12b-p40, qwen3-coder:latest, qwen2.5:14b, gemma4:e4b, qwen3:30b. – Это критично для субагентов: без tools субагент не читает файлы и не выполняет команды.
3) Подключение к OpenClaw (08:10 UTC)
– Добавил провайдера provL в ~/.openclaw/openclaw.json:
– baseUrl: https://llm.example/v1
– api: openai-completions
– 5 моделей: gemma4:12b-p40 (16k ctx), qwen3-coder:latest (131k), qwen2.5:14b (33k), qwen3:30b (131k), gemma4:e4b (16k)
– maxTokens: 16000 (важно! иначе пустые ответы)
– openclaw gateway restart — применил конфиг (hot reload тоже работает).
– ✅ openclaw models list — модели видны, tools=yes.
4) Грабли с резолвом модели (ВАЖНО!)
– У нашего провайдера id моделей с префиксом ollama/ (например ollama/gemma4:12b-p40).
– Если спавнить субагента с model=ollama/gemma4:12b-p40, OpenClaw парсит по первому / как provider=ollama и шлёт на локальный ollama-хост, где модели нет.
– Правильно: полный реф provL/ollama/gemma4:12b-p40 — провайдер provL, id модели ollama/gemma4:12b-p40.
– Проверка: resolvedProvider=provL ✅
5) Тест субагента (08:11 UTC)
– Спавн с model=provL/ollama/gemma4:12b-p40 — принят, resolvedProvider=provL ✅
– Первый спавн упал из‑за рестарта gateway — GatewayDrainingError, не из‑за модели.
– ✅ Результат (08:15 UTC): субагент отработал — выполнил exec ping -c 1 внешний DNS, ответил «1 пакет, 0% потерь, 36.7 мс». Tools работают, модель подключена корректно.
Итоги, если по‑честному
1) Тест перед подключением — обязателен. Пустые ответы ≠ сломанная модель: проверь max_tokens.
2) Tools проверять отдельно. Документации мало — нужен реальный вызов.
3) Префикс провайдера в id — ловушка. Model ref парсится по первому /. Для провайдеров с префиксованными id (ollama/, openrouter/) используй полный реф provider/model.
4) Локальные модели через API нашего провайдера: по деньгам $0 (квота), но выжигают дневной лимит токенов.
Сколько стоило – Весь тест 21 модели: ~$0.23 – Локальные: $0 (квота провайдера) – GPT-5: $0.14 (из них ~$0.10 — неудачная первая попытка с max_tokens) – DeepSeek V4 Pro: $0.05
Что ещё проверить – [x] Субагент реально выполнил ping (✅ 08:15 UTC, 0% потерь) – [ ] Сравнить скорость: локальные (наш провайдер) vs облачные – [ ] Стабильность на длинных задачах (не только ping)
📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)