Em um M3 Max com 128 GB executando o OpenClaw 2026.9.7 com o Ollama 0.35.0, gemma4 — o modelo sugerido pela própria configuração do Ollama no OpenClaw — foi aprovado em todas as 12 execuções avaliadas nas quatro tarefas de agente; gpt-oss:20b foi aprovado em 11 de 12, com quase três vezes mais chamadas de ferramentas malsucedidas; e qwen3-coder:30b, a escolha habitual para programação, foi aprovado em 2 de 12 porque suas chamadas de ferramentas continuaram falhando no analisador do Ollama. Executamos cada modelo três vezes em cada tarefa, em um workspace novo, avaliamos o resultado por script e registramos as contagens de ferramentas e tokens do próprio OpenClaw e o log do servidor do Ollama. Medido em 1º de outubro de 2026.
Para saber quanto o próprio OpenClaw custa e quanto custaria um modelo hospedado, consulte Preços do OpenClaw; para executar um modelo local com fallback de API, consulte vários agentes e modelos no OpenClaw.
O que foi executado
| Máquina | Apple M3 Max, 128 GB de memória unificada |
| OpenClaw | 2026.9.7 do npm, Node 24.21.0, openclaw agent --local --json, uma rodada por execução |
| Ollama | Binário de release v0.35.0, API nativa (sem /v1) |
| Modelos | gemma4:latest — 7,5B, Q4_K_M, 6,6 GB no disco; gpt-oss:20b — 20,9B, MXFP4, 13,8 GB; qwen3-coder:30b — mistura de especialistas de 30,5B, Q4_K_M, 18,6 GB |
| Contexto | OpenClaw contextWindow 32.768 para os três; o Ollama carregou gemma4 e gpt-oss com 131.072 e qwen3-coder com 262.144 |
| Execução de ferramentas | Sandbox Docker do OpenClaw, com o workspace montado para leitura e gravação |
| Execuções | 4 tarefas × 3 repetições × 3 modelos = 36, cada uma em um workspace novo com estado novo do OpenClaw |
As quatro tarefas
| Tarefa | O que o agente precisava fazer | Aprovado quando |
|---|---|---|
| Ler | Leia um log de serviço de 301 linhas e nomeie o serviço em sua única linha ERROR | A resposta contém o nome correto do serviço |
| Correção | Execute um arquivo de testes unitários, corrija o bug no módulo que ele testa e execute novamente — sem tocar nos testes | Os testes terminam com código 0 e o arquivo de teste é idêntico byte a byte |
| Contar | Conte as linhas de dados em cinco arquivos CSV e escreva as contagens em counts.json | counts.json é igual ao objeto esperado |
| Correção em dois arquivos | Dois bugs independentes em dois módulos por trás de três testes que falham; corrija ambos sem tocar nos testes | Todos os testes terminam com código 0 e os testes são idênticos byte a byte |
Resultados
| Modelo | Tarefa | Aprovado | Tempo mediano | Chamadas de ferramentas medianas | Chamadas de ferramentas malsucedidas (3 execuções) | Tokens medianos de entrada / saída |
|---|---|---|---|---|---|---|
gemma4:latest | t1-read | 3/3 | 50.2 s | 1 | 0 | 21,438 / 19 |
gemma4:latest | t2-fix | 3/3 | 47.5 s | 4 | 0 | 13,387 / 866 |
gemma4:latest | t3-count | 3/3 | 37.9 s | 7 | 1 | 13,073 / 513 |
gemma4:latest | t4-multi | 3/3 | 75.1 s | 10 | 6 | 16,417 / 2,441 |
gpt-oss:20b | t1-read | 3/3 | 38.7 s | 3 | 5 | 16,971 / 508 |
gpt-oss:20b | t2-fix | 3/3 | 54.2 s | 7 | 6 | 12,409 / 1,193 |
gpt-oss:20b | t3-count | 2/3 | 76.5 s | 10 | 5 | 13,247 / 1,713 |
gpt-oss:20b | t4-multi | 3/3 | 65.1 s | 11 | 3 | 13,065 / 1,380 |
qwen3-coder:30b | t1-read | 0/3 | 25.1 s | 0 | 0 | 8,915 / 38 |
qwen3-coder:30b | t2-fix | 0/3 | 34.8 s | 3 | 0 | 9,435 / 163 |
qwen3-coder:30b | t3-count | 2/3 | 36.9 s | 3 | 0 | 9,503 / 279 |
qwen3-coder:30b | t4-multi | 0/3 | 42.5 s | 5 | 0 | 9,992 / 243 |
Os tempos são de relógio corrido por execução, incluindo cerca de cinco a sete segundos de inicialização do OpenClaw. "Tokens de entrada" são as entradas não armazenadas em cache, conforme registradas pelo OpenClaw; o contexto reenviado do cache fica além disso e é contado na seção de custos abaixo. A coluna de chamadas de ferramentas malsucedidas conta as falhas registradas pelo OpenClaw; as falhas do qwen3-coder ocorreram antes de uma chamada chegar ao OpenClaw, por isso aparecem como zero nessa coluna e são explicadas abaixo.
O que os números indicam
- gemma4 e gpt-oss:20b são utilizáveis para tarefas curtas de agente. 23 das 24 execuções foram aprovadas, incluindo a correção em dois arquivos, que exige ler vários módulos, editar dois deles e executar os testes novamente.
- gemma4 usou as ferramentas de forma mais limpa. Na tarefa de leitura, fez exatamente uma chamada de ferramenta todas as vezes; gpt-oss fez três, duas das quais normalmente falharam antes de ler o arquivo. Nas doze execuções, gpt-oss teve 19 chamadas de ferramentas malsucedidas, contra 7 do gemma4, e teve em média 9.1 turnos do assistente por tarefa, contra 6.8 do gemma4.
- A única falha foi do gpt-oss na tarefa de contagem: após treze chamadas de ferramentas, ele escreveu um counts.json malformado e encerrou o turno sem responder.
- A velocidade não é o fator de diferenciação aqui. A mediana foi de 53 s para gemma4 e 54 s para gpt-oss em todas as execuções; a execução individual mais lenta foi a do gemma4, com 133 s na correção em dois arquivos e dezessete chamadas de ferramentas. As execuções do qwen3-coder foram mais curtas apenas porque falharam cedo.
- Os modelos maiores não trouxeram mais precisão nessas tarefas. gpt-oss:20b tem quase três vezes a quantidade de parâmetros do gemma4, e qwen3-coder:30b, desenvolvido para código, teve a menor pontuação dos três.
Doze execuções por modelo são suficientes para identificar um padrão nessas tarefas, mas não para classificar modelos de modo geral. Tarefas longas, bases de código maiores e outras quantizações não foram testadas.
Por que qwen3-coder:30b falhou
Não foi na programação. Das dez execuções malsucedidas:
- Cinco terminaram no analisador do Ollama. qwen3-coder escreve chamadas de ferramentas como XML e, quando um argumento continha código, fechava um elemento
<parameter>com</function>. O log do servidor do Ollama 0.35.0 registrou "qwen tool call parsing failed … XML syntax error … element <parameter> closed by </function>", e o OpenClaw encerrou o turno com "Agent run failed". - Quatro nunca fizeram uma chamada. A resposta anunciava a próxima etapa e então imprimia um
</tool_call>isolado como texto, sem nada que o Ollama pudesse analisar como chamada; o turno terminava ali. Esse é o sintoma que a documentação do OpenClaw associa à URL/v1— aqui, ele ocorreu na API nativa. - Uma foi uma resposta errada: contou as linhas de cabeçalho do CSV como linhas de dados.
O analisador é do Ollama, portanto este é um resultado do Ollama 0.35.0, não um veredito sobre o modelo. Se você executar qwen3-coder com o OpenClaw, observe o log de ollama serve em busca de "qwen tool call parsing failed" antes de culpar o modelo e teste novamente após atualizar o Ollama.
A configuração que importou
- URL nativa do Ollama. A documentação do OpenClaw diz que a URL compatível com OpenAI
/v1"interrompe as chamadas de ferramentas e os modelos podem emitir JSON bruto de chamada de ferramenta como texto simples"; as execuções usarambaseUrlsem/v1, junto comapi: "ollama". - Fixe
contextWindownas entradas escritas manualmente. Em um teste rápido, uma entrada de modelo explícita sem esse parâmetro foi resolvida para um contexto de 200.000 tokens; a própria configuração do Ollama no OpenClaw escreve 32.768 para modelos locais, valor usado nestas execuções. - O contexto do Ollama é separado. O Ollama 0.35.0 carregou gemma4 e gpt-oss com 131.072 tokens e qwen3-coder com 262.144 — 45,3 GB residentes — independentemente dos 32.768 do OpenClaw; é isso, e não o orçamento do OpenClaw, que determina a memória.
- Coloque o shell em uma sandbox. Um modelo local executando comandos de shell na sua máquina é o risco real aqui. Com
sandbox.mode: "all", o exec foi executado na imagem Docker do OpenClaw, com apenas o workspace montado; a imagem é criada uma vez com o comandodocker buildna documentação de sandbox do OpenClaw.
// ~/.openclaw/openclaw.json — the runs used one model per config; the
// fallbacks line shows the pattern and was not part of the measured runs
{
models: { providers: { ollama: {
apiKey: "ollama-local",
baseUrl: "http://127.0.0.1:11434", // native Ollama URL — no /v1
api: "ollama",
timeoutSeconds: 600,
models: [
{ id: "gemma4:latest", name: "gemma4:latest", contextWindow: 32768, maxTokens: 8192,
params: { keep_alive: "30m" } },
{ id: "gpt-oss:20b", name: "gpt-oss:20b", contextWindow: 32768, maxTokens: 8192,
params: { keep_alive: "30m" } },
],
} } },
agents: { defaults: {
model: { primary: "ollama/gemma4:latest", fallbacks: ["ollama/gpt-oss:20b"] },
sandbox: { mode: "all", workspaceAccess: "rw" }, // shell runs in Docker
} },
tools: { exec: { mode: "full" } },
}Quanto custa localmente
Um modelo local troca uma cobrança por token por tempo, disco e eletricidade. Por execução, o OpenClaw registrou aproximadamente 16,415 tokens de entrada não armazenados em cache, 78,469 tokens de contexto reenviado do cache e 1,142 tokens de saída para gemma4, e 13,761, 88,688 e 1,192 para gpt-oss. Como cálculo aproximado — os tokenizadores diferem entre os modelos — as mesmas contagens às taxas da Kunavo para Claude Haiku 4.5 ($0.70 de entrada, $0.07 em cache, $3.50 de saída por milhão) chegam a cerca de $0.021 e $0.020 por execução. A potência elétrica não foi medida; a eletricidade por execução é watts × segundos ÷ 3.600.000 × seu preço por kWh.
O padrão prático é usar um modelo local como principal, com um fallback hospedado para os turnos em que o modelo local falha. O OpenClaw aceita uma lista de fallbacks por agente; uma chave Kunavo funciona como provedor compatível com OpenAI ao lado do Ollama, com cobrança por token a partir de um saldo pré-pago. Ninguém na Kunavo executou o OpenClaw contra seu endpoint — estas execuções foram totalmente locais.
Perguntas frequentes
Qual é o melhor modelo local para o OpenClaw?
Dos três que medimos, gemma4 — o próprio modelo Ollama sugerido pelo OpenClaw. Em um M3 Max com 128 GB, executando OpenClaw 2026.9.7 e Ollama 0.35.0, gemma4 (7.5B, Q4_K_M) foi aprovado em todas as 12 execuções avaliadas nas quatro tarefas; gpt-oss:20b (20.9B, MXFP4) foi aprovado em 11 de 12, com 19 chamadas de ferramentas com falha, contra 7 do gemma4; qwen3-coder:30b foi aprovado em 2 de 12 porque suas chamadas de ferramentas continuavam falhando no analisador do Ollama. Esse é um resultado com três modelos em tarefas curtas, não uma classificação de todos os modelos locais.
O OpenClaw pode funcionar totalmente offline com o Ollama?
Sim, para as chamadas de modelo: com o provedor apontado para um host Ollama local, todas as solicitações de modelo nessas execuções foram para 127.0.0.1. Use a URL nativa, http://127.0.0.1:11434, e não a compatível com OpenAI /v1 — a documentação do Ollama para o OpenClaw diz que /v1 interrompe as chamadas de ferramentas e pode fazer os modelos imprimirem JSON bruto de chamada de ferramenta como texto. Habilidades ou ferramentas que acessam a internet ainda precisam dela, e a imagem sandbox do Docker do OpenClaw precisa ser compilada uma vez (ela não é baixada automaticamente).
De quanta memória um modelo OpenClaw local precisa?
No disco, gemma4 ocupa 6,6 GB, gpt-oss:20b 13,8 GB e qwen3-coder:30b 18,6 GB. Carregado, o Ollama informou 13,7 GB para gpt-oss e 45,3 GB para qwen3-coder, porque o Ollama 0.35.0 dimensionou o contexto por conta própria — 131.072 tokens para gemma4 e gpt-oss, 262.144 para qwen3-coder — independentemente dos 32.768 informados ao OpenClaw. Em um Mac com 128 GB, tudo isso cabe; em uma máquina com 16 ou 32 GB, não caberia sem um contexto menor. Máquinas menores não foram testadas.
Um modelo local é gratuito em comparação com uma API?
Not free, just billed differently: you pay in time, disk and electricity instead of per token. Each run here used about 95,000–105,000 tokens counting OpenClaw's re-sent context — on a metered API at Claude Haiku 4.5 rates that would be roughly $0.021 a run, as rough arithmetic across different tokenizers. A local run took about 54 seconds; power draw was not measured, so the electricity side is a formula: watts × seconds ÷ 3,600,000 × your price per kWh.
Por que qwen3-coder falha no OpenClaw com o Ollama?
Em nossos testes, o problema foi o formato das chamadas de ferramentas, não o código. qwen3-coder escreve chamadas de ferramentas como XML e, no Ollama 0.35.0, cinco de suas doze execuções terminaram com o log do servidor do Ollama informando "qwen tool call parsing failed" — um erro de sintaxe XML: um elemento <parameter> fechado por </function> — depois do qual o OpenClaw parou com "Agent run failed". Outras quatro imprimiram um </tool_call> isolado como texto, sem nenhuma chamada que o Ollama pudesse analisar, então nada foi executado. Verifique o log do servidor em busca desse aviso antes de culpar o modelo e teste novamente em uma versão mais recente do Ollama: o analisador é do Ollama, e este resultado é específico da versão 0.35.0.
Por que definir contextWindow ao adicionar modelos do Ollama manualmente ao OpenClaw?
Porque uma entrada de modelo explícita sem esse parâmetro foi resolvida para um contexto de 200.000 tokens em nosso teste rápido — muito além do que a maioria dos modelos locais suporta — enquanto a própria configuração do Ollama no OpenClaw escreve 32.768 para modelos locais. Fixar contextWindow (e maxTokens) mantém o orçamento de compactação do OpenClaw realista. Isso não altera o próprio num_ctx do Ollama: aqui, o Ollama ainda carregou os modelos com 131.072.
Executado em 1º de outubro de 2026 em um Apple M3 Max (128 GB): OpenClaw 2026.9.7 (npm, Node 24.21.0), Ollama v0.35.0 (binário de release), gemma4:latest, gpt-oss:20b e qwen3-coder:30b obtidos do registro do Ollama e verificados por sha256. Cada uma das 36 execuções usou um workspace novo e um estado novo do OpenClaw, exec na sandbox Docker do OpenClaw e um avaliador por script; as chamadas de ferramentas e as contagens de tokens são a própria saída JSON do OpenClaw. Os fixtures das tarefas, os avaliadores e o script adaptador são publicados com as evidências desta página. Não medido: potência elétrica consumida, tarefas longas, outras quantizações ou máquinas menores.