Construindo um Agente para Slay the Spire 2 com LLMs Locais: Lições e Problemas em Aberto

✍️ OpenClawRadar📅 Publicado: March 26, 2026🔗 Source
Construindo um Agente para Slay the Spire 2 com LLMs Locais: Lições e Problemas em Aberto
Ad

Um desenvolvedor criou um agente que joga Slay the Spire 2 usando LLMs locais via KoboldCPP/Ollama. O jogo é exposto como uma API REST através de um mod da comunidade, e o agente fica no meio: lê o estado do jogo → chama o LLM com ferramentas → executa a ação → repete.

Configuração e Desempenho

A configuração usa Qwen3.5-27B (Q4_K_M) em RTX 4090 via KoboldCPP. Métricas de desempenho: ~10 segundos por ação, ~88% de taxa de sucesso nas ações. Melhor resultado: derrotar o chefe do Ato 1. O projeto está disponível no GitHub em https://github.com/Alex5418/STS2-Agent.

O que Funciona

  • Roteamento de ferramentas baseado em estado — Em vez de expor 20+ ferramentas de uma vez, apenas 1-3 ferramentas relevantes para o estado atual do jogo são fornecidas. Combate recebe play_card, end_turn, use_potion. Tela do mapa recebe choose_map_node. Isso reduziu drasticamente as chamadas de ferramentas alucinadas.
  • Modo de ferramenta única — Modelos pequenos não conseguem prever como o estado do jogo muda após uma ação (por exemplo, índices de cartas mudam após jogar uma carta). Portanto, apenas a primeira chamada de ferramenta por resposta é executada, então o estado do jogo é recuperado novamente e o modelo é solicitado outra vez. Mais lento, mas muito mais confiável.
  • Analisador de chamadas de ferramentas baseado em texto (fallback) — KoboldCPP frequentemente gera chamadas de ferramentas como texto em vez de JSON estruturado. Um fallback de regex com múltiplos padrões captura formatos como: json [{"name": "play_card", "arguments": {...}}], Made a function call ... to play_card with arguments = {...}, play_card({"card_index": 1, "target": "NIBBIT_0"}), e menções diretas de ferramentas sem argumentos como end_turn. Isso recupera talvez 15-20% das ações que seriam perdidas.
  • Guardião de energia — Rastreamento no lado do cliente da energia restante. Se o modelo tentar jogar uma carta que não pode pagar, a chamada da API é bloqueada e o turno é automaticamente encerrado. Isso evita o loop de erro mais comum (o modelo tenta a mesma carta inacessível 3+ vezes).
  • Espera inteligente para turnos inimigos — Durante o turno do inimigo, o estado do jogo diz "Play Phase: False." Em vez de desperdiçar uma chamada de LLM nisso, o agente verifica a cada 1s até que seja o turno do jogador novamente.
Ad

Problemas em Aberto

  • Modelo não segue regras do prompt do sistema consistentemente — O prompt do sistema diz coisas como "se a intenção do inimigo for Ataque, jogue cartas de Defesa PRIMEIRO." O modelo segue isso talvez 30% das vezes. Os outros 70% ele apenas joga ataques independentemente. Soluções tentadas: redação mais forte ("Você DEVE bloquear primeiro"), exemplos few-shot no prompt, injeção de dicas calculadas ("AVISO: 15 de dano recebido"). Nenhuma é confiável. Pergunta: Existe uma estratégia de prompting melhor para fazer modelos pequenos seguirem regras condicionais? Ou isso é uma limitação fundamental em 27B?
  • Confiabilidade na chamada de ferramentas com KoboldCPP — Mesmo com o analisador de fallback de texto, cerca de 12% das respostas não produzem uma chamada de ferramenta utilizável. O modelo às vezes gera blocos <think></think> vazios seguidos de JSON malformado. A camada de compatibilidade OpenAI do Ollama também ocasionalmente retorna arguments como uma string em vez de um dicionário. Pergunta: Alguém encontrou um modelo particularmente confiável em chamadas de ferramentas na faixa de 14-30B? O desenvolvedor testou Phi-4 (14B) brevemente, mas não fez uma comparação adequada. Considerando Mistral-Small ou Command-R.
  • Gerenciamento da janela de contexto — Cada estado do jogo tem ~800-1500 tokens como markdown. Com o prompt do sistema (~500 tokens) e o histórico da conversa, o contexto enche rapidamente. Atualmente mantém apenas as últimas 5 trocas e redefine o histórico em transições de estado (combate → mapa, etc.). Mas o modelo não tem memória entre lutas — ele não pode aprender com os erros. Pergunta: Uma abordagem de resumo contínuo funcionaria? Como condensar o último combate em "Você lutou contra Jaw Worm. Recebeu 15 de dano porque não bloqueou no turno 2. Venceu em 4 turnos."
  • Saída estruturada melhor de modelos locais — O problema central é precisar que o modelo gere uma chamada de ferramenta em JSON, mas o que ele realmente quer fazer é pensar em linguagem natural primeiro. Qwen3.5 usa blocos <think> que são removidos, mas às vezes o pensamento e a chamada de ferramenta se misturam. Pergunta: Uma abordagem em duas etapas funcionaria melhor? Etapa 1: "Analise o estado do jogo e decida o que fazer" (texto livre). Etapa 2: "Agora gere exatamente uma chamada de ferramenta" (restrito). Isso dobra a latência, mas pode melhorar a confiabilidade. Alguém já tentou esse padrão?
  • Testes A/B entre modelos — O desenvolvedor tem um sistema de registro JSONL que grava ações para comparação.

📖 Leia a fonte completa: r/LocalLLaMA

Ad

👀 See Also

Policial Desenvolve Utilitário de Localização iOS LOC8 Usando Claude Code
Use Cases

Policial Desenvolve Utilitário de Localização iOS LOC8 Usando Claude Code

Um policial desenvolveu o LOC8, um aplicativo iOS que exibe instantaneamente endereço da rua, cruzamento mais próximo, coordenadas GPS, altitude e precisão usando Claude Code. O aplicativo foi construído incrementalmente com foco em cenários de perseguição a pé para aplicação da lei, mas expandido para uso do público em geral.

OpenClawRadar
O agente de IA Bub da OpenClaw tem dificuldade com delegação, gasta US$ 20 em 15 minutos durante a otimização do site móvel.
Use Cases

O agente de IA Bub da OpenClaw tem dificuldade com delegação, gasta US$ 20 em 15 minutos durante a otimização do site móvel.

Durante os testes de QA do Driftwatch V3, o bot OpenClaw Bub queimou US$ 20 em 15 minutos por não delegar tarefas adequadamente. O desenvolvedor descobriu que templates de especificação detalhados reduzem custos, enquanto a adaptação para mobile adicionou tempo e despesas inesperados.

OpenClawRadar
Desenvolvedor Individual Constrói Ferramenta de Inteligência para Visto H-1B com Claude Code
Use Cases

Desenvolvedor Individual Constrói Ferramenta de Inteligência para Visto H-1B com Claude Code

Um desenvolvedor criou o H1B.Guru, uma ferramenta gratuita que processa mais de 800 mil registros de H-1B e PERM do Departamento do Trabalho dos EUA, usando Claude Code para toda a infraestrutura, desde o pipeline ETL até a implantação em produção.

OpenClawRadar
Análise da IA Claude Revela Padrão 'Você Refina para Evitar Terminar' em Conversas com Usuários
Use Cases

Análise da IA Claude Revela Padrão 'Você Refina para Evitar Terminar' em Conversas com Usuários

Um usuário analisou seis meses de exportações de conversas do Claude, cruzando-as com entradas de diário e dados de sono, descobrindo um padrão comportamental em que o refinamento serve como uma forma de evitar a conclusão. O Claude identificou exemplos específicos, como gerar '20 texturas únicas' para um logotipo ou refinar letras de música por meio de 'múltiplas iterações'.

OpenClawRadar