Pular para o conteúdo
Fantástico Mundo de Jon
RSS

Troquei o modelo local do OpenCode: o que acelerou e o que só parecia erro do modelo

Eu já programava com OpenCode e um Qwen rodando nesta placa. Troquei o 3.6 pelo 3.8. Vou te mostrar o que ficou mais rápido, o que acertou mais, e o dia em que eu achei que o modelo tinha piorado — e era configuração.

Atualizado em

Com pressa? Peça o TL;DR ao Claude — ele lê a página e resume.

Se você usa ChatGPT para programar, já conhece a cena. Você pede um filtro, um botão, um endpoint. Volta um código que parece certo. Às vezes está. Às vezes compila e está errado no detalhe que você não leu.

Eu faço a mesma coisa, só que o “cérebro” não está na nuvem. Está numa placa de vídeo nesta mesa, uma RTX 5090. O programa que dirige o modelo se chama OpenCode: ele lê arquivo, edita, roda teste. Um estagiário que não cansa e não manda o repositório para fora da casa.

O modelo que eu usava era o Qwen3.6, 27 bilhões de parâmetros. “27B” é o tamanho da cabeça. Quanto maior, em tese, mais ele sabe — e mais memória de vídeo ele come. Aí a Qwen soltou o 3.8. Mesma faixa, mesma licença livre (Apache 2.0), e agora enxerga imagem.

A pergunta que todo mundo faz, inclusive eu: ficou mais rápido? Acerta mais?

Vou te contar o que eu medi nesta mesa. E o dia em que eu achei que o modelo tinha piorado depois da troca — e era eu que tinha configurado errado.

Antes, o que é cada peça

Três nomes que vão aparecer o post inteiro, sem mistério.

OpenCode é o aplicativo. É ele que abre o projeto, chama ferramenta, escreve o git diff. Sem ele, o modelo só conversa.

Qwen é o modelo. 3.6 era o que eu tinha. 3.8 é o sucessor. Os dois cabem nesta placa. Os dois falam português o bastante para o meu dia a dia em .NET, JavaScript e Flutter.

Ollama é o motor que carrega o modelo na GPU e responde no localhost. O OpenCode fala com ele. Se o Ollama anuncia um contexto que a placa não entrega, o agente “fica burro” e a culpa parece ser do Qwen.

Local, aqui, quer dizer: o código não vai para a API da OpenAI nem da Anthropic. A placa trabalha, o disco é meu, o teste roda na pasta do repo.

Dois relógios, e as pessoas misturam os dois

Tem o relógio da placa. Quantos pedacinhos de texto o modelo escreve por segundo, o famoso tok/s. Eu meço isso com curl e nvidia-smi. É o número que o YouTube de hardware adora.

Tem o relógio da tarefa. Do “implementa o filtro” até o dotnet test — ou o vitest, ou o flutter test — passar. Esse relógio inclui o modelo descrever a edição em vez de editar, o raciocínio interno comer a resposta, o programa anunciar 262 mil tokens de memória e jogar as instruções fora no meio do arquivo. Aí eu abro outra sessão e perco dez minutos.

No 3.6 os dois já brigavam. Eu botei o OpenCode para fazer três tarefinhas de código (uma função de paridade, um cache LRU, um merge de intervalos). O Qwen3.6 em Q6 — Q6 é uma compressão do modelo, um pouco mais pesada e um pouco mais fiel — fez 3/3. Empatou o Haiku 4.5, que é um modelo pago da Anthropic, em acerto. O Haiku fechou em uns 24 segundos. O daqui, entre 56 e 103.

Mesmo acerto. Parede duas a quatro vezes maior.

Traduzindo: se a sua métrica é ganhar do ChatGPT no cronômetro, local nesta placa ainda perde. Se a métrica é o patch compilou, o teste passou, e o repositório não viajou para os Estados Unidos, o 3.6 já dava para trabalhar. O 3.8 entra em cima disso.

O que estava na mesa · agosto de 2026

Placa
RTX 5090 · 32 GB de memória de vídeo
Motor
Ollama 0.32.15 (por baixo é llama.cpp)
Programa
OpenCode 1.18.25, falando direto com o Ollama na porta 11434
Agora
Qwen3.8 27B Q6 com visão · 131 mil tokens de contexto
Antes
Qwen3.6 27B Q6 com visão, mesmo OpenCode

O que a placa realmente ganhou de velocidade

A arquitetura dos dois é a mesma. 64 andares no prédio, só 16 com aquele “caderno de rascunho” que cresce conforme a conversa anda — o KV cache. A conta do post do 3.6 não envelheceu.

O que mudou no pacote foi um projetor de visão (o modelo passou a olhar print de tela) e, na hora de escrever, mais velocidade.

Velocidade de escrever na 5090 · sem raciocínio interno · contexto curto

Modelo Memória de vídeo Escreve (tok/s) Lê o pedido (tok/s)
Qwen3.6 27B Q4 16,95 GB 76,0 1372
Qwen3.8 27B Q4 18,25 GB 111,8 1141
RTX 5090, Ollama 0.32.15, mesmo prompt técnico, 256 tokens de saída, temperatura 0, thinking desligado, contexto 8.192. Mediana de 3 execuções depois de um aquecimento. Detalhe no post da troca 3.6 → 3.8, 21/08/2026. Eu trato o 3.8 como na casa de 100 a 110 tok/s, não como um 1,5× exato.

Uns 100 a 110 tokens por segundo contra 76. Você sente isso no trecho em que o modelo está digitando o arquivo.

Você quase não sente no trecho em que ele lê o arquivo. Nessa bateria o 3.8 leu mais devagar: 1141 contra 1372. E um agente de código lê muito mais do que escreve. Ele abre o serviço, abre o teste, abre o componente, e só depois mexe três linhas.

Ou seja: comprar a troca só porque “escreve mais rápido” é olhar o relógio errado.

O outro número que eu medi, já no 3.8 comprimido em Q6 e com visão, foi o seguinte. Pedido mínimo: “usa a ferramenta”. O modelo devolveu um comando de verdade, não um parágrafo dizendo “vou editar o arquivo”. 14 segundos, 67 tokens. No 3.6 isso oscilava. Quando ele narra a ferramenta, o OpenCode não edita. A tarefa não fica lenta. Ela simplesmente não acontece.

O folheto da Qwen diz que ele acerta mais em código

Isso eu não rodei. São os números que a própria Qwen colocou no card do 3.8, comparando com o 3.6.

Pensa nesses nomes como provas padronizadas. SWE-bench é “consegue consertar bug de repositório de verdade?”. Terminal Bench é “consegue se virar no terminal?”. LiveCodeBench é “consegue passar em exercício de programação ao vivo?”.

Números da Qwen, não desta mesa

Prova Qwen3.6 27B Qwen3.8 27B
Terminal Bench 2.1 63,4 73,0
SWE-bench Pro 53,5 61,7
DeepSWE 1.1 13,3 42,2
LiveCodeBench v6 83,9 90,3
Valores do model card do Qwen3.8-27B, 14/08/2026. DeepSWE e SWE-bench Pro usam um harness no estilo Claude Code, contexto 256k. Não é medição minha. A Artificial Analysis, que mede modelos por conta própria, publicou Intelligence Index 38 → 52 na mesma comparação.

O salto que ela declara está em “usar ferramenta e mexer em projeto”, não em pergunta de ciência. Se você troca esperando o modelo gabaritar quiz, a tabela não promete isso. Se troca porque o 3.6 já era o 27B local de código, é exatamente o caso em que ela aponta o ganho.

Na minha mesa o 3.6 em Q6 já tinha empatado o Haiku nas três tarefinhas. A versão mais espremida, Q4, fez 1/3 no mesmo teste. A compressão mexeu mais naquele acerto do que a troca de família ia mexer numa função de paridade. Por isso eu fico no Q6 para dirigir ferramenta, e deixo o Q4 para conversa. Não voltei atrás.

Culpei o modelo. Era configuração.

Depois da troca o 3.8 “alucinava” e parava no meio da frase. Culpa clássica: o modelo novo é pior. Fui ler o log do servidor que o Ollama sobe por baixo.

Três defeitos. Nenhum era o peso.

Primeiro: a caixa diz 262 mil tokens de contexto. Contexto é a memória de curto prazo da conversa — o arquivo que ele leu, o teste que rodou, as instruções. 262 mil é o que o modelo aceita. Nesta placa, com o Q6, 262 mil empurra um pedaço do modelo para a memória RAM comum, fora da GPU. A leitura do pedido cai 29%. E tem um detalhe feio: o servidor tenta “deslizar” a memória quando ela enche, o híbrido não deixa, e o programa guarda só 4 tokens. As instruções vão embora. O modelo passa a responder pergunta que ninguém fez. Parece alucinação. É amnésia configurada.

O teto que cabe inteiro na GPU, do jeito que o Ollama está hoje, é uns 139 mil. Eu travei o OpenCode em 131 mil. 262 mil é o número da caixa. Não é o número desta 5090.

Segundo: o limite de resposta curto demais. O 3.8 pensa em voz alta antes de responder. Se você deixa só 512 tokens de teto, o pensamento come tudo e a resposta corta no primeiro item. Com 2048, os cinco itens saem. Medido nesta placa, mesmo pedido, só mudando o teto.

Terceiro: OpenCode passando por um intermediário. Eu tinha um programa no meio do caminho, o LiteLLM. O fluxo de texto vinha num formato que o OpenCode antigo rejeitava. O caminho que funciona aqui é o OpenCode falando direto com o Ollama, na porta 11434. O intermediário fica para wiki, chave de projeto e modelo na nuvem.

Quando o agente “ficou burro” depois da troca, na maior parte das vezes ele não ficou. Eu tinha deixado o motor mentir a memória.

Como isso aparece em .NET, JavaScript e Flutter

O jeito de pedir é o mesmo nos três. Abro o OpenCode na pasta do projeto. O modelo é o daqui. Ele pode editar e pode rodar comando. Eu não peço “escreve o sistema”. Peço a tarefa com o contrato à vista: o que entra, o que sai, o que o teste tem que quebrar.

No .NET, uma pasta de feature cabe nesses 131 mil tokens junto com o teste. As regras da casa — Result, ProblemDetails, sem exception para fluxo — estão no repositório, e o agente local lê. O ganho que eu sinto contra o 3.6 não é o dotnet build mais rápido. É o modelo chamar o ler-arquivo e o editar-arquivo, em vez de colar um trecho no chat. Quando ele narra, eu perco o turno inteiro. É como um estagiário que descreve a correção no Slack e não abre o Visual Studio.

No JavaScript eu tenho número de teste: as três tarefinhas do OpenCode no 3.6 Q6 passaram. No dia a dia é Next, um componente, um teste. O 3.8 com visão ajuda quando a tela está errada. O print entra na conversa, o arquivo do componente também. Antes eu descrevia o layout em prosa (“o botão ficou à esquerda, com um gap estranho”) e ele inventava um flex que não estava no pixel.

Flutter é a mesma lógica da tela. Print do emulador mais o widget. As regras da casa continuam sendo spec, não milagre do modelo. O 3.8 não me poupou de escrever o caso esquisito. Já medi isso: escrever o que acontece no caso estranho sobe o acerto de 46% para 90%. A tabela bonita em markdown, contra o mesmo texto corrido, quase não paga.

O tempo que eu ganhei, nos três, é menos retrabalho. Sessão que não morre no pensamento interno. Ferramenta que dispara. Memória que não descarta as instruções no meio do arquivo.

Escrever a 100 tokens por segundo é o bônus que aparece quando ele já está mexendo no arquivo certo.

O que eu faria no seu lugar

Se você já usa OpenCode com o 3.6 27B Q6 numa placa de 24 GB ou mais, eu trocaria. Custa cerca de 1,3 GB a mais na placa e um Ollama recente (0.32.12 para cima). A escrita sobe. O folheto da Qwen promete o ganho onde você usa — mexer em projeto, não gabaritar quiz. Trava o contexto no que a sua placa entrega. Aqui, 131 mil. E aponta o OpenCode direto no Ollama, sem intermediário.

Se a sua comparação é o Haiku na nuvem, prepara o relógio. O daqui continua mais lento por tarefa pequena e continua ganhando em dado que não viaja. São contas diferentes. Eu uso as duas. O 3.8 local ficou bom o bastante para o turno em que o repositório não pode sair daqui.

Se a placa tem 16 GB, o 3.8 não resolve o que o 3.6 já não resolvia. Continua o recado do post da memória de vídeo.

Eu não rodei SWE-bench nesta mesa. O que este post prova é a velocidade de escrever, o comando de ferramenta de verdade, o teto real de 131 mil tokens e o que quebra quando você acredita nos 262 mil da caixa. O resto é o que a Qwen publicou.

Número de fabricante é ponto de partida. Não é encerramento. Roda na sua placa e olha o teste passar — ou não.