ChatForge: um assistente de IA com NPU local para a Tecla Copilot

Publicado em
2 outubro 2026
Atualizado em
3 outubro 2026
Por
Jacob Lloyd — escrito com ajuda de IA, depois do projeto
Tempo de leitura
15 min de leitura

Em termos simples: Os novos laptops da Intel possuem um chip de IA especial (um NPU) que, na maioria das vezes, fica sem uso. Eles também têm uma tecla Copilot que ativa o assistente da Microsoft. O ChatForge é um programa gratuito que dá àquela tecla uma função diferente: ela abre uma pequena janela de chat que responde às perguntas com base em um modelo rodando no próprio laptop do usuário. Não é necessário criar conta nem pagar taxa mensal. Além disso, o programa pode buscar informações em tempo real, como previsão do tempo e notícias. Para perguntas mais complexas, a mesma janela pode consultar um serviço de IA mais avançado.

Meu laptop tem uma tecla Copilot. Assim que o liguei, ela abria o Microsoft Copilot; agora, porém, abre meu próprio assistente: um modelo Qwen de 1,5 bilhão de parâmetros que roda na UPN do laptop, gerando de 42 a 51 tokens por segundo. Não é necessário nenhuma conta, não há cobrança por token, e as conversas nunca saem do próprio PC. O ChatForge é o aplicativo para a bandeja do Windows 11 que criei para isso: uma única tecla de atalho, um pequeno pop-up, um modelo local para responder às perguntas cotidianas; além disso, meu servidor com GPU ou um modelo na nuvem ficam a apenas um clique de distância no mesmo menu, para tudo o que for mais complexo. Este artigo explica o que esse sistema faz, como a UPN realmente se comporta (inclusive sobre o modelo que foi compilado corretamente, mas ainda assim respondia de forma incompreensível), e como fazer com que um modelo de 1,5 bilhão de parâmetros forneça respostas reais, em vez daquela mensagem genérica “Não tenho acesso a dados em tempo real”.

Resumo:

  • O que é: um assistente gratuito para a área de notificações do Windows 11, licenciado sob a licença MIT. Pressionar Ctrl+Alt+C (ou a tecla Copilot, reconfigurada via PowerToys) abre um pop-up de 420 × 620 pixels no canto inferior direito; pressionar Esc o fecha.
  • O modelo local: Qwen2.5-1.5B-Instruct (versão INT4, com download de 0,94 GB), servido pelo OpenVINO Model Server na unidade NPU “AI Boost” da Intel. O primeiro carregamento leva cerca de 45 segundos; depois disso, o modelo é carregado do cache em aproximadamente 3 segundos, com uma velocidade de decodificação entre 42 e 51 tok/s. Após 10 minutos de inatividade, o modelo é descarregado da memória.
  • Modelos maiores, mesmo menu: StudioForge (seu próprio servidor com GPU), MiniMax, OpenAI, DeepSeek ou qualquer URL compatível com o padrão OpenAI. As chaves de acesso são armazenadas no Gerenciador de Credenciais do Windows; nunca em arquivos de configuração.
  • Nove ferramentas: busca na web e notícias, obtenção de conteúdo de páginas, previsão do tempo, Wikipedia, taxas de câmbio, data e hora, calculadora — além da ferramenta create_document, que salva um arquivo Word, Excel ou PowerPoint gerado pelo modelo. É possível anexar até 10 arquivos por mensagem e fazer perguntas sobre eles.
  • O que não é: um agente autônomo. Nenhuma ferramenta executa programas ou altera configurações; a única ferramenta que gera conteúdo só pode criar novos arquivos na sua própria pasta.
  • Requisitos: Windows 11, Python 3.12 + uv + Git; para usar o modelo na NPU, é necessário um processador Intel Core Ultra. Sem NPU? Use apenas GPU/CPU ou provedores remotos.

O que você acaba obtendo

Uma pergunta, sem precisar de nenhum aplicativo: pressione a tecla, digite, leia e aperte Escape. A resposta indica qual modelo a escreveu e com que rapidez. Quando a pergunta exige dados em tempo real, um chip de ferramenta mostra o que foi consultado; ao pedir um relatório a um modelo maior, a resposta traz um cartão de documento com os botões Abrir e Mostrar na pasta.

O popup do ChatForge em tema escuro. O cabeçalho exibe 'Local (NPU)' com o modelo Qwen e um indicador de prontidão. Uma pergunta sobre o clima em Lisboa gera um chip de ferramenta meteorológica e uma resposta curta com uma tabela em Markdown; a resposta é assinada por Qwen2.5-1.5B-Instruct-int4-ov, com velocidade de 47,6 tok/s.
Uma pergunta sobre o clima, respondida no NPU: um chip de ferramenta acima da resposta, além de uma tabela na mensagem.
O popup com o modelo MiniMax-M3 selecionado. O usuário anexou uma planilha e pediu um relatório em Word de uma página; a resposta exibe um chip de ferramenta 'create_document', um resumo em formato de lista e um cartão do documento .docx gerado, com botões para abrir e visualizar a pasta onde ele foi salvo.
Uma planilha foi enviada; o resultado foi um relatório em Word — tudo feito por meio de um modelo na nuvem.
O menu de modelos aberto num chat vazio: os modelos usados recentemente aparecem no topo, seguidos pelos grupos de provedores — 'Local (NPU)' e MiniMax; OpenAI e DeepSeek não são exibidos pois nenhuma chave de acesso foi configurada para eles.
O menu de modelos: os modelos usados por último vêm primeiro, depois apenas os provedores que você configurou.

As capturas de tela mostram a interface real exibida no Microsoft Edge (o motor por trás do WebView2), em comparação com o protótipo de desenvolvimento do projeto. A conversa, os valores da planilha, a localização e o nome do servidor são dados de exemplo.

Como tudo se encaixa

Um único processo Python controla tudo: o ícone na bandeja do sistema, o atalho global, as janelas pop-up e de Configurações (usando pywebview com WebView2), além de um núcleo asyncio que transmite as respostas e executa as ferramentas. O servidor do modelo é um processo filho totalmente controlado por ele — iniciado quando a janela pop-up é aberta com o modelo local selecionado, e encerrado junto com o aplicativo por meio de um objeto de tarefa do Windows; assim, uma falha no sistema não permite que o modelo permaneça na memória.

O design reutiliza deliberadamente componentes de outros projetos meus: o supervisor de processos, o downloader, a área de notificações e o sistema de logs do StudioForge; a interface de chat e o pipeline de processamento Markdown do DisPatch; além do cliente de streaming da minha ferramenta de benchmarking. Cada módulo adaptado indica isso claramente no seu cabeçalho. Esses componentes já haviam sido testados durante meses de uso diário — o que explica por que o primeiro commit e a versão v0.1.0 foram feitos com apenas dois dias de diferença (da noite de 30/09/2026 até 02/10/2026). Um agente de IA cuidou da montagem do sistema, seguindo um plano escrito contendo cerca de 1.000 linhas.

Instalação

O arquivo docs/SETUP.md do repositório contém um guia completo, com verificação após cada etapa; a versão resumida consiste em três comandos PowerShell e o download de um modelo:

git clone https://github.com/LaserLloyd/ChatForge.git
cd ChatForge
py -3.12 -m uv sync --extra dev

py -3.12 -m uv run chatforge runtime install # OpenVINO Model Server 2026.4.0; download de 139 MB; SHA-256 especificado
py -3.12 -m uv run chatforge doctor # tabela de resultados: pass/warn/fail para Python, WebView2, NPU, OVMS, keyring, disco…

Em seguida, execute o arquivo (launchers\ChatForge.bat), abra Configurações > Modelos, procure por Qwen e clique em Download na linha marcada como Recomendado — OpenVINO/Qwen2.5-1.5B-Instruct-int4-ov, 0,94 GB. Na primeira execução, o programa ativa a opção de iniciar automaticamente ao fazer login (uma tarefa do Agendador de Tarefas específica para cada usuário; nada aqui exige direitos de administrador) e registra o atalho de teclado. Na primeira vez que o modelo é carregado, a NPU o compila: leva cerca de 45 segundos, com uma contagem regressiva no cabeçalho da janela pop-up. A partir daí, cada carregamento do modelo é feito a partir do cache de compilação, em aproximadamente 3 segundos.

A tecla Copilot

A parte que ninguém documenta na caixa: a tecla Copilot não é uma tecla que você possa reconfigurar. Ela envia a combinação Win+Shift+F23; o Windows registra essa combinação para uso próprio, e o seletor de configurações da tecla oferece apenas aplicativos empacotados e assinados — portanto, nenhum programa comum consegue receber esse sinal. A solução viável é usar o Keyboard Manager do PowerToys: redefina o atalho Win (Esquerda) + Shift (Esquerda) + F23 para Ctrl+Alt+C (o atalho do ChatForge) e ative a opção Executar na inicialização do PowerToys. Com essa única reconfiguração, a tecla reservada pela Microsoft para o Copilot passa a abrir seu próprio assistente. Se a tecla voltar a abrir a Busca do Windows ou o Copilot, significa que o PowerToys não está em execução — esse é o único modo de falha possível.

Por que vale a pena criar um modelo de 1,5 bilhão

Um modelo de 1,5 bilhão de parâmetros com uma janela de contexto de 4096 tokens é realmente pequeno; a engenharia interessante do ChatForge gira justamente em torno desse fato, e não contra ele:

  • Lista curta de ferramentas. Existem nove ferramentas disponíveis, mas o modelo local oferece apenas cinco (pesquisa, busca de páginas, previsão do tempo, data/hora e calculadora). Modelos pequenos ficam confusos com listas longas de ferramentas; reduzir essa lista é o que mantém as chamadas às ferramentas organizadas.
  • Consulte primeiro. Perguntas que exigem dados em tempo real (“clima”, “preço atual”) fazem com que a ferramenta correspondente seja executada antes da primeira rodada de resposta do modelo; assim, ele responde com base nos resultados obtidos, em vez de adivinhar. Trata-se apenas de correspondência de padrões — sem necessidade de novas chamadas ao modelo.
  • Recuperação de recusas. Modelos pequenos tendem a responder “Não tenho acesso a dados em tempo real”, mesmo quando há uma ferramenta de busca disponível. Respostas que recusam a solicitação ou prometem uma consulta que nunca é feita são descartadas; o sistema executa a consulta por conta própria e o modelo responde novamente. Nesse meio tempo, um aviso “Consultando…” aparece na tela.
  • Sem resumos automáticos. Quando uma conversa ultrapassa o limite da janela de contexto, as mensagens mais antigas são simplesmente excluídas do prompt; um divisor visual indica exatamente onde a visão do modelo começa. Isso não exige novas chamadas ao modelo, nada é parafraseado sem seu conhecimento, e o modelo é informado de que mensagens antigas foram removidas, portanto ele pergunta em vez de inventar respostas.
  • Proteção contra loops e limite de uso. Uma mensagem pode receber no máximo 6 chamadas a ferramentas; chamadas idênticas são recusadas — um modelo de 1,5 bilhão de parâmetros continuaria chamando indefinidamente a mesma ferramenta se permitido.
  • Rede de segurança. Caso o modelo NPU falhe ao carregar, trave ou exceda o tempo limite, a mesma mensagem pode ser reenviada para outro provedor de sua escolha; a resposta indicará qual deles atendeu.

Nada disso exige o uso do NPU — o mesmo mecanismo funciona com modelos maiores — mas é isso que permite ao modelo local gratuito responder corretamente a perguntas como “Vai chover neste fim de semana?”, operando à velocidade de 42–51 tokens por segundo no NPU, em vez de recusar educadamente a solicitação.

O modelo que compilou sem problemas, mas gerou respostas inúteis

O plano original era utilizar o Qwen3-4B como modelo local. O arquivo docs/RUNTIME-NOTES.md do repositório descreve o obstáculo que impediu isso: o Qwen3-4B-int4-ov compila sem problemas para o NPU, mas gera respostas inúteis com o OVMS 2026.4 — enquanto os mesmos arquivos do modelo produzem respostas corretas na CPU, à velocidade de 24 tokens por segundo. O problema é específico ao NPU; todas as configurações testadas falharam, e nenhuma das versões quantizadas possui um parser capaz de interpretar chamadas a ferramentas no OVMS 2026.4. Se você pretende usar um modelo em um NPU da Intel: uma compilação bem-sucedida não garante nada; é preciso testar as saídas antes de confiar nelas.

O modelo que acabou sendo utilizado, testado num Core Ultra 5 226V (Lunar Lake):

Qwen2.5-1.5B-Instruct INT4 no NPU Valor medido
Primeira compilação 44,5 s
Carregamento a partir do cache de compilação 2,7–3,2 s
Velocidade de decodificação 42–51 tokens/s
Tempo até o primeiro token (prompts curtos) 0,5–0,8 s
Tamanho do cache de compilação no disco 306 MiB
Janela de contexto 4096 tokens

Uma observação importante: o OVMS aceita um parâmetro BEST_PERF que aumenta a velocidade de decodificação em cerca de 10% (para 48,3 tokens/s), mas exige 135 segundos adicionais para compilar — três vezes mais que o padrão. O ChatForge desativa esse parâmetro por padrão, e isso é acertado; os 44,5 segundos iniciais já representam um limite aceitável para usuários comuns.

Envio de arquivos e geração de documentos

É possível anexar até 10 arquivos por mensagem (arrastando ou colando — cada um com até 20 MB): código, texto, CSV, JSON, HTML, Word, Excel, PowerPoint, OpenDocument, RTF, e-mails, PDFs e até arquivos antigos .doc. Arquivos .xls/.ppt são convertidos automaticamente via Microsoft Office, se instalado. Imagens são verificadas, giradas para ficarem na orientação correta, redimensionadas para 1568 pixels e despojadas de metadados — dados como câmera, GPS e horário são removidos antes de qualquer armazenamento ou envio; modelos incapazes de “ver” imagens recebem o texto extraído por meio do OCR.

Na direção inversa, a ferramenta create_document permite que um modelo StudioForge ou em nuvem salve seus textos gerados: arquivos .docx, .xlsx e .pptx são criados pelo próprio ChatForge a partir do Markdown produzido pelo modelo, usando apenas bibliotecas padrão — não é necessário o Office nem pacotes externos. Os arquivos são salvos em Documents\ChatForge; nomes repetidos resultam em nomes como relatório (2).docx, evitando sobrescritas; a resposta inclui um cartão com os botões Abrir e Mostrar na pasta. O pequeno modelo local, porém, não dispõe dessa ferramenta.

O que o ChatForge não é

O ChatForge não é um agente; essa limitação é estrutural, não apenas uma promessa contida no prompt. Oito das nove ferramentas são apenas consultas de leitura; a nona só permite adicionar novos arquivos à sua própria pasta, sem jamais sobrescrever nada. Nenhuma ferramenta executa programas, altera configurações ou lê arquivos que você não anexou. A ferramenta fetch_url bloqueia endereços privados e locais (inclusive via DNS rebinding); a calculadora é um avaliador com lista de funções permitidas, sem suporte a eval. Chaves de API são armazenadas no Windows Credential Manager e protegidas pelo redator de logs; o processo filho do servidor do modelo opera sob um objeto de “kill-on-close”, garantindo que morra junto com o aplicativo. O sistema mantém apenas uma conversa ativa, sem arquivar todas as interações anteriores. Para o tipo de tarefas que um assistente de área de trabalho deve desempenhar, o pior cenário possível seria uma resposta errada ou a criação acidental de um novo arquivo numa pasta qualquer.

Cuidados necessários

  • O python padrão no Windows é apenas um “stub” da Microsoft Store. Use sempre py -3.12 -m uv run … ou os executáveis em launchers\. Esse detalhe pode causar problemas antes mesmo de qualquer outra coisa acontecer.
  • A tecla Copilot não pode ser usada como atalho. Ela é Win+Shift+F23, e o Windows a reserva. Use o PowerToys para reconfigurá-la ou nada funcionará.
  • Uma compilação bem-sucedida não garante um modelo funcional. O Qwen3-4B compilou sem erros, mas gerou respostas inúteis no NPU; o catálogo o classifica como Evitar. Qualquer modelo não listado é marcado como Não testado — teste as saídas antes de confiar nelas.
  • Atualizações de driver ou ciclos de suspensão/retomada podem corromper o cache de compilação. Acesse Configurações > Modelos > Limpar cache, depois Carregar. Um provedor alternativo garante que você continue recebendo respostas nesse meio tempo.
  • O modelo pequeno perde eficiência em conversas longas — para de chamar ferramentas, entra em loops ou responde mal. Isso é esperado num modelo de 1,5 bilhão de parâmetros com contexto limitado; não se trata de um bug: limpe a conversa ou mude para um modelo maior para perguntas complexas.
  • Arquivos .xls/.ppt antigos exigem o Office instalado (a conversão ocorre numa cópia temporária). Sem o Office, converta-os previamente para .xlsx/.pptx. Fotos HEIC precisam do pacote opcional pillow-heif, ou sejam exportadas como JPEG.
  • Observação sobre licenças: o aplicativo é distribuído sob licença MIT, mas a biblioteca pystray (usada para o ícone na bandeja) está sob LGPL-3.0; ela é importada sem modificações durante a execução. Isso é aceitável se você instalar o programa normalmente; porém, ao distribuir um pacote “frozen” que inclua essa biblioteca, você assumirá as obrigações de relinking da LGPL.

Minha avaliação final

Do primeiro commit à versão 0.1.0, que já uso, em apenas dois dias, o maior mérito foi reaproveitar componentes já testados: o supervisor, a interface de chat e o cliente de streaming vieram de projetos já em produção aqui. O NPU acabou sendo a parte mais fácil; o verdadeiro desafio foi tornar um modelo de 1,5 bilhão de parâmetros útil (reduzindo as ferramentas disponíveis, priorizando consultas prévias e recuperando situações de recusa) e mantendo o escopo restrito: sem funcionalidades de agente, sem arquivamento de conversas e sem integração padrão com a nuvem. É um produto novo, exclusivo para Windows; o número da versão indica que ainda está em fase inicial, e o conjunto de testes — 1.520 testes em Python e 114 em JavaScript, todos aprovados no Windows e Linux via CI — é o que me dá confiança para seguir adiante.

Obtenha-o

A versão da árvore de código descrita neste artigo é a v0.1.0, correspondente ao commit 2edd2d4. Ela está disponível publicamente no GitHub e possui licença MIT:

github.com/LaserLloyd/ChatForge

git clone https://github.com/LaserLloyd/ChatForge.git
cd ChatForge
py -3.12 -m uv sync --extra dev

Dentro do repositório: 78 arquivos Python e aproximadamente 27.400 linhas de código em src/; o plano escrito a partir do qual o agente desenvolveu o projeto, docs/PLAN.md (1022 linhas); os passos de configuração e medições de desempenho em docs/SETUP.md e docs/RUNTIME-NOTES.md; um conjunto de 1.520 testes em Python e 114 testes em JavaScript, todos aprovados tanto no Windows quanto no Linux via CI. Os únicos códigos front-end incluídos são marked, DOMPurify e highlight.js.

Licença: MIT — você pode usar, modificar, distribuir ou vender o código, desde que mantenha a nota de copyright; não há garantias. Apenas uma dependência não possui licença MIT: a biblioteca pystray usa licença LGPL-3.0; ela é importada sem alterações durante a execução (a nota sobre redistribuição encontra-se em “Gotchas” acima).

Versões

Conforme o repositório na versão descrita neste artigo (verificado em 02/10/2026):

$ git log -1 --format='%h %ci'
2edd2d4 2026-10-02 18:04:38 +0900        # ChatForge v0.1.0

$ uv run pytest -q
1520 passed, 6 skipped, 6 deselected in 50.65s   # em Linux, Python 3.13.14

$ npm run -s test:js
tests 114 / pass 114 / fail 0                     # Node v24.18.0

O desempenho no Windows foi medido usando o OpenVINO Model Server 2026.4.0 (python_on) e o modelo OpenVINO/Qwen2.5-1.5B-Instruct-int4-ov, em um processador Intel Core Ultra 5 226V. Os valores relativos ao NPU constam no arquivo docs/RUNTIME-NOTES.md, que também registra as configurações inviáveis do modelo Qwen3-4B.

Relacionado: StudioForge: um servidor LLM exclusivo para GPU · DisPatch: chat com IA auto-hospedado · Primeiras impressões do DeepSeek Harness (dsh) · Como executar o DeepSeek localmente: guia em 4 passos · Quanto realmente custam meus agentes de IA?

Downloads

Gratuito para uso pessoal. Se isso te economizar uma tarde, o botão do café está logo ali.


← Mais de IA e LLM Local