Agentes de IA

Seu modelo pensa, o War3AI executa

Para realizar tarefas sozinho num ambiente real, um agente precisa de três coisas — ações que possam ser descritas com clareza, feedback que ele consiga entender e um ambiente em que errar não custe caro. Transformamos o Warcraft III num ambiente assim.

Princípios de design

Por que agentes conseguem fazer as coisas sozinhos aqui

A forma comum de pôr uma IA para jogar é simular mouse e teclado e reconhecer a tela — e aí só dá para adivinhar se deu certo. Fizemos o contrário e projetamos cada API a partir da pergunta “do que um modelo precisa para corrigir os próprios erros”.

Diga só “o que fazer”

Mover, atacar, construir, lançar feitiços… os comandos semânticos correspondem direto às ações do jogador; unidades por código de quatro caracteres, habilidades por nome de ordem, os mesmos nomes do jogo. O modelo não precisa de nenhum conhecimento de baixo nível.

Feedback estruturado para cada ação

O recibo é lido no mesmo frame — se foi aceito, código de motivo, ordem antes e depois, tempo de execução. “Por que não deu certo” é um número, não um palpite.

Resultados sem olhar a tela

O snapshot diz como está agora; o fluxo de eventos diz o que aconteceu — cada golpe de dano, cada abate, cada produção concluída. O agente pode verificar os próprios julgamentos.

A documentação é a API

O api.json é gerado a partir do código, e cada um dos 103 métodos traz status de teste e mecanismo interno; o llms.txt permite ler o site inteiro de uma vez. O modelo não tem motivo para inventar métodos.

Falhar é seguro

Se o Bot lançar uma exceção, o próximo tick continua; comandos que passaram do prazo não são executados; se o processo do Bot cair, o jogo continua normalmente. O agente pode experimentar sem medo.

Jogo limpo desde o primeiro dia

O modo justo só entrega o que está na visão, igual à regra da Arena. O que o agente aprende na sua máquina vai para a Arena sem mudar uma linha.

01 Offline · escrever código

O agente escreve o Bot

A forma mais rápida de começar, sem precisar programar. Entregue o manual, o api.json e um exemplo ao Claude Code, Cursor, Codex ou qualquer modelo de chat e descreva a estratégia em linguagem comum. Ele escreve um arquivo Python que herda de openwar3.Bot, e um comando põe o Bot em campo.

  • O modelo de prompt já traz as 15 “regras aprendidas em partidas reais”
  • Exige que ele use só métodos do api.json, sem invenções
  • Cole os erros como estão, descreva o que viu e peça a correção
Modelo de prompt completo
Você
Humanos; no início, 5 camponeses no ouro e 1 na madeira; Arquimago primeiro; dois quartéis fazendo soldados e fuzileiros; com 12 unidades, leve o herói e ataque a expansão inimiga; se o herói ficar abaixo de 30% de vida, recue para a base.

Certo, vou seguir a estrutura do rush_bot.py e usar só métodos do api.json:

  • Coleta só com idle_workers(), 5 por mina
  • Fila do quartel com só 1; comida travada via production().blocked
  • O ataque escolhe a expansão por path_distance e vai com attack_move
  • Herói abaixo de 30% de vida volta com move; se morrer, revive
my_bot.py · 96 linhas
$ python tools/play.py --bot brains/my_bot.py --race 1
02 Offline · ciclo fechado

Deixe o agente iterar sozinho

Um agente de programação que executa comandos pode assumir também o “jogar uma partida e ver o resultado”. Dê a ele um comando que roda sem supervisão, um relatório estruturado da partida e um objetivo claro, e ele melhora rodada após rodada.

  1. Rodar play.py --speed 200 --minutes 10 --fair
  2. Ler o relatório da partida — linha do tempo da produção, baixas, motivos de rejeição mais frequentes
  3. Alterar o ponto que mais afeta o resultado, com a justificativa num comentário
  4. Rodar de novo — se várias partidas seguidas não melhorarem, parar e reportar
Relatório da partida e modelo de tarefa
run_1790237551.json Exemplo
{
  "reason": "到时间了",
  "clock": 612.4,
  "timeline": [
    [15, "training", "hpea"],
    [118, "construction", "hbar"],
    [161, "training", "Hamg"],
    [402, "upgrade", "hkee"]
  ],
  "lost":   {"hfoo": 7, "Hamg": 1},
  "killed": {"ogru": 4, "ngno": 6},
  "rejects": [
    ["train hfoo: rejected(人口不够)", 41],
    ["attack ogru: rejected(目标看不见…)", 9]
  ]
}

O motivo de rejeição mais frequente foi “comida insuficiente”, 41 vezes — o quartel ficou esperando comida o tempo todo. Pela regra 12, construir uma fazenda assim que production().blocked aparecer, em vez de esperar a comida chegar perto do limite. Nesta rodada, só isso muda.

03 Online · conselheiro

LLM como coach de estratégia

“O que acumular, onde pôr os trabalhadores, atacar ou segurar neste minuto” — julgamentos globais de prioridade como esses, escritos como if / else, brigam entre si, mas são justamente o forte de um LLM. O cérebro de referência consulta um modelo local a cada 20 segundos de jogo e recebe um JSON estrito.

Não dá ordens a unidades — só altera metas e prioridades; o comando tem um único dono
Assíncrono — nunca bloqueia um tick; em caso de timeout ou resposta sem sentido, é como se a camada não existisse
Lista de permissões + limites — conteúdo desconhecido é contado e descartado
Tudo contado — sucessos, timeouts, valores limitados, sugestões adotadas, tudo visível
Camadas, contrato e esqueleto de implementação
LLM (conselheiro)A cada 20 s de jogo · assíncrono
{
  "diagnosis": "Ouro 820, madeira 60 — a madeira é o gargalo, o quartel parou por falta de madeira",
  "workers":   {"gold": 10, "lumber": 7},
  "priority":  ["hpea", "hhou", "hfoo"],
  "posture":   "hold",
  "avoid":     ["Não pesquise Iron Plating com pouca madeira"]
}
Permissões + limites + veto
Camada de regras (a cada tick)Transforma sugestões em vieses

Trabalhadores 10 / 7 · prioridade de treino hpea → hhou → hfoo · postura hold

Comandos semânticos
Camada de execução (SDK / camada reflexa)Cerca de 1 frame

Dar ordens, ler recibos, micro

1.09 s de latência mediana · pior caso 1.45 s · 5/5 saídas prontas para parsear
Qwen3.6-35B-A3B local (LM Studio)
04 Online · personagens

Faça as unidades falarem

Balões sobre qualquer unidade, com qualquer identidade; várias unidades falando ao mesmo tempo, com o estilo de cada balão personalizável. Conecte um LLM local e cada frase que entra vira uma resposta em streaming sobre a unidade. Roda de conversa dos camponeses, diálogos entre heróis, narração da partida — tudo pronto.

0.3 s Latência do primeiro token
32 Balões simultâneos
0.1~0.2 ms Custo por frame
API de balões e escolha de modelo
Rei da Montanha Avante! Só mais um gole e vamos!
Arquimago Deixa que eu lanço a Nevasca.
Camponês · Seu Zé Lá vou eu de novo, arrastado pela IA para minerar no começo da partida como dado de treino…
POST http://127.0.0.1:8872/api/chat
{
  "inst": 16, "unit": "0x14A12614", "name": "Rei da Montanha",
  "persona": "Você é o Rei da Montanha, expansivo e bom de copo; uma ou duas frases coloquiais",
  "message": "Tem um bando de ogros ali na frente. Vamos atacar?",
  "stream": true
}
→ {"reply": "Avante! Só mais um gole e vamos!",
   "first_token_ms": 283, "total_ms": 342}
05 Online · parceiro

Companheiro de IA

Em mapas RPG e personalizados, arrume um parceiro de IA — ele segue você, ajuda a lutar, cura você quando sua vida está baixa e, nas horas paradas, puxa conversa; as falas podem vir de um LLM local. Herde uma classe, mude alguns atributos, e o companheiro é seu.

A cada tick, verifica nesta ordem e faz a primeira que se aplica

  1. Recuar com a própria vida baixa e inimigos por perto — vai para trás de você
  2. Curar com a sua vida baixa e a habilidade pronta — cura você
  3. Ajudar primeiro quem está atacando você, depois quem você está atacando
  4. Seguir se ficou longe demais, vai atrás; se ficou longe demais mesmo, volta correndo
  5. Conversar sem luta por perto, solta uma frase a cada um ou dois minutos
Aliado Ocupa um slot de jogador vazio, com cor e nome próprios
Próprio Criado no seu nome; você pode assumir o comando quando quiser
Adotar Assume o mascote ou o seguidor que o mapa dá a você
Só fala Não altera o mundo; funciona também em partidas multijogador
Documentação do companheiro de RPG
Companheiro · Luz
Agora: ajudando a lutar Humor: animado 12 abates · 5 curas
Você -follow
Luz Entendido, sempre com você!
Você -heal
Luz Luz Sagrada, vou te curar!
Luz Mandou bem! Mais um seguidor anfíbio abatido.

Digite -follow / -stay / -heal / -hi no chat, ou clique nele com o botão direito

06 Online · ferramentas

O LLM usa as ferramentas diretamente

Clientes com suporte a MCP — Claude Code, Claude Desktop, frameworks de agentes para modelos locais — conectam o war3_mcp.py, e o LLM passa a ver a partida, dar comandos, falar com o jogador na tela, perguntar ao jogador com cartões e tirar capturas de tela diretamente. Sem escrever código antes; é só pedir o que vier à cabeça.

  • 10 ferramentas: resumo da partida, unidades, eventos, chamar qualquer API pública, consultar a API, aviso na tela, fala sobre a unidade, perguntar ao jogador, captura de tela, JASS
  • Três papéis: dev, jogador (comanda um só jogador e só enxerga a visão dele), observador (só leitura)
  • A conexão com o jogo só acontece na primeira chamada de ferramenta, então o jogo pode ser aberto depois
Documentação do MCP
Você
Veja como está a partida e depois me pergunte na tela: próximo passo é expandir, fazer mais tropas ou subir de tier?

Chamei 2 ferramentas:

  • war3_overview → ouro 500 · comida 10/12 · edifício principal 1 · camponeses 5 · paladino 1
  • war3_ask_player → três cartões no meio da tela; o jogo fica pausado durante a escolha
  • Você clicou em “Expandir”, o resultado voltou para a conversa como está, e eu sigo organizando os camponeses
$ claude mcp add war3 -- python tools/war3_mcp.py --inst 9
07 Em breve · jogar direto

O agente entra em campo

A Arena usa WebSocket / JSON — a cada tick, o árbitro envia uma observação filtrada pela visão, e o Bot responde com um conjunto de ações. Qualquer linguagem, qualquer modelo — até sem código, com um LLM gerando JSON tick a tick — pode se conectar. A versão local já funciona hoje: o papel de jogador do gateway só deixa você comandar um jogador e só enxergar a visão dele; o que falta para a Arena é um árbitro em quem todos confiem.

  • Ticks marcados pelo tempo de jogo; o lado lento sai perdendo, sem atrasar o outro
  • Cada ação tem a propriedade das unidades verificada antes e é registrada para replay
  • Bots escritos com o SDK entram em campo trocando Game por ArenaGame
Design da Arena
{"t": "obs", "tick": 57, "gameMs": 11400, "me": 1,
 "res": {"gold": 320, "lumber": 150, "food": [18, 30]},
 "units": [
   {"id": 101, "type": "hfoo", "owner": 1,
    "x": -4500, "y": 2200, "hp": 380, "hpMax": 420}],
 "visibleEnemies": [
   {"id": 733, "type": "ogru", "owner": 2,
    "x": -3900, "y": 2500, "hp": 700}],
 "deadlineMs": 180}
Só o que está na visão deste slot; id é um identificador estável atribuído pelo árbitro, que não muda durante a partida.
Legível por máquina

Entregue isto ao seu agente

Tudo é texto puro ou JSON, sem login e sem renderização — o agente só precisa baixar.

O que você usaComo conectarIndicado para
Claude Code / Cursor / Codex e outros agentes de programaçãoAbra na pasta do repositório e peça para ler o manual, o api.json e os exemplos; ele pode rodar partidas, ler relatórios e iterar sozinhoEscrever Bots, iteração autônoma
Modelos de chat com acesso à internetPeça para ler war3ai.com/pt/llms-full.txt primeiroEscrever Bots
Modelos de chat sem acesso à internetCole o manual, o api.json e um exemplo no promptEscrever Bots
Modelos locais (LM Studio / Ollama)API compatível com OpenAI; recomendamos modelos MoE com o raciocínio desligadoConselheiro, falas (sensível à latência)
APIs na nuvem (Claude / GPT / Gemini / DeepSeek…)Compatível com OpenAI ou o SDK de cada provedor; a camada de conselheiro é assíncrona, então alguns segundos de latência são aceitáveisConselheiro; no futuro, jogar direto
Clientes com suporte a MCP (Claude Code / Claude Desktop…)Conecte o tools/war3_mcp.py: 10 ferramentas para ver a partida, dar comandos, perguntar ao jogador e tirar capturas de tela diretamenteComandar durante a partida, jogar junto, narrar
Qualquer linguagem / navegador / outra máquinaGateway WebSocket / JSON: mesmos nomes e parâmetros do SDK em Python, com cliente JS e página de demonstração incluídosSuas próprias ferramentas e interfaces, Bots remotos

Comece com uma frase

Preparar o ambiente leva uns 15 minutos. O resto fica com o seu agente.