Construire un Agent pour Slay the Spire 2 avec des LLM Locaux : Leçons et Problèmes Ouverts

✍️ OpenClawRadar📅 Publié: March 26, 2026🔗 Source
Construire un Agent pour Slay the Spire 2 avec des LLM Locaux : Leçons et Problèmes Ouverts
Ad

Un développeur a créé un agent qui joue à Slay the Spire 2 en utilisant des LLM locaux via KoboldCPP/Ollama. Le jeu est exposé comme une API REST via un mod communautaire, et l'agent se situe au milieu : il lit l'état du jeu → appelle le LLM avec des outils → exécute l'action → répète.

Configuration et Performances

La configuration utilise Qwen3.5-27B (Q4_K_M) sur RTX 4090 via KoboldCPP. Métriques de performance : environ 10 secondes par action, taux de réussite des actions d'environ 88 %. Meilleur résultat : vaincre le boss de l'Acte 1. Le projet est disponible sur GitHub à https://github.com/Alex5418/STS2-Agent.

Ce qui Fonctionne

  • Routage d'outils basé sur l'état — Au lieu d'exposer 20+ outils à la fois, seuls 1 à 3 outils pertinents pour l'état actuel du jeu sont fournis. Le combat obtient play_card, end_turn, use_potion. L'écran de carte obtient choose_map_node. Cela a considérablement réduit les appels d'outils hallucinés.
  • Mode outil unique — Les petits modèles ne peuvent pas prédire comment l'état du jeu change après une action (par exemple, les indices des cartes changent après avoir joué une carte). Ainsi, seul le premier appel d'outil par réponse est exécuté, puis l'état du jeu est récupéré et le modèle est interrogé à nouveau. Plus lent mais beaucoup plus fiable.
  • Analyseur d'appels d'outils basé sur du texte (solution de secours) — KoboldCPP produit souvent des appels d'outils sous forme de texte plutôt que de JSON structuré. Une solution de secours à motifs multiples capture des formats comme : json [{"name": "play_card", "arguments": {...}}], Made a function call ... to play_card with arguments = {...}, play_card({"card_index": 1, "target": "NIBBIT_0"}), et des mentions simples d'outils sans arguments comme end_turn. Cela récupère peut-être 15 à 20 % des actions qui seraient autrement perdues.
  • Garde d'énergie — Suivi côté client de l'énergie restante. Si le modèle essaie de jouer une carte qu'il ne peut pas se permettre, l'appel API est bloqué et le tour est automatiquement terminé. Cela empêche la boucle d'erreur la plus courante (le modèle réessaie la même carte inabordable 3 fois ou plus).
  • Attente intelligente pour les tours ennemis — Pendant le tour de l'ennemi, l'état du jeu indique "Play Phase: False." Au lieu de gaspiller un appel LLM sur cela, l'agent interroge toutes les 1 seconde jusqu'à ce que ce soit de nouveau le tour du joueur.
Ad

Problèmes Ouverts

  • Le modèle ne suit pas systématiquement les règles du prompt système — Le prompt système dit des choses comme "si l'intention de l'ennemi est Attack, jouez d'abord les cartes Defend." Le modèle suit cela peut-être 30 % du temps. Les 70 % restants, il joue simplement des attaques quoi qu'il arrive. Solutions tentées : formulation plus forte ("Vous DEVEZ bloquer d'abord"), exemples few-shot dans le prompt, injection d'indices calculés ("ATTENTION : 15 dégâts entrants"). Aucune n'est fiable. Question : Existe-t-il une meilleure stratégie de prompting pour amener les petits modèles à suivre des règles conditionnelles ? Ou s'agit-il d'une limitation fondamentale à 27B ?
  • Fiabilité des appels d'outils avec KoboldCPP — Même avec l'analyseur de secours textuel, environ 12 % des réponses ne produisent aucun appel d'outil utilisable. Le modèle produit parfois des blocs <think></think> vides suivis de JSON mal formé. La couche de compatibilité OpenAI d'Ollama renvoie aussi occasionnellement arguments comme une chaîne au lieu d'un dictionnaire. Question : Quelqu'un a-t-il trouvé un modèle particulièrement fiable pour les appels d'outils dans la plage 14-30B ? Le développeur a essayé Phi-4 (14B) brièvement mais n'a pas fait de comparaison approfondie. Il envisage Mistral-Small ou Command-R.
  • Gestion de la fenêtre de contexte — Chaque état de jeu représente environ 800 à 1500 tokens en markdown. Avec le prompt système (~500 tokens) et l'historique de conversation, le contexte se remplit rapidement. Actuellement, il ne conserve que les 5 derniers échanges et réinitialise l'historique lors des transitions d'état (combat → carte, etc.). Mais le modèle n'a pas de mémoire entre les combats — il ne peut pas apprendre de ses erreurs. Question : Une approche de résumé glissant fonctionnerait-elle ? Comme condenser le dernier combat en "Vous avez combattu Jaw Worm. Vous avez subi 15 dégâts parce que vous n'avez pas bloqué au tour 2. Victoire en 4 tours."
  • Meilleure sortie structurée des modèles locaux — Le problème central est que le modèle doit produire un appel d'outil JSON, mais ce qu'il veut vraiment faire, c'est d'abord réfléchir en langage naturel. Qwen3.5 utilise des blocs <think> qui sont supprimés, mais parfois la réflexion et l'appel d'outil s'entremêlent. Question : Une approche en deux étapes fonctionnerait-elle mieux ? Étape 1 : "Analysez l'état du jeu et décidez quoi faire" (texte libre). Étape 2 : "Maintenant, produisez exactement un appel d'outil" (contraint). Cela double la latence mais pourrait améliorer la fiabilité. Quelqu'un a-t-il essayé ce modèle ?
  • Tests A/B entre modèles — Le développeur dispose d'un système de journalisation JSONL qui enregistre les actions pour comparaison.

📖 Lire la source complète : r/LocalLLaMA

Ad

👀 See Also

Professeur crée un jeu de détection des biais de l'IA avec Claude Code
Use Cases

Professeur crée un jeu de détection des biais de l'IA avec Claude Code

Un professeur britannique a créé Flagged, un jeu navigateur qui simule les décisions de détection d'IA dans le milieu universitaire en utilisant Claude Code. Le jeu révèle comment les outils de détection produisent des taux de faux positifs allant jusqu'à 61,3% pour les locuteurs non natifs de l'anglais.

OpenClawRadar
Expérience d'OpenClaw pour un utilisateur non technique : les difficultés de configuration éclipsent les avantages de l'automatisation.
Use Cases

Expérience d'OpenClaw pour un utilisateur non technique : les difficultés de configuration éclipsent les avantages de l'automatisation.

Un consultant indépendant non technique a testé OpenClaw pour automatiser des tâches répétitives, mais a rencontré des difficultés de configuration importantes qui ont éclipsé les avantages de l'automatisation de l'outil.

OpenClawRadar
Le bot OpenClaw connecte n8n, WordPress, Airtable et GHL pour l'automatisation CRM.
Use Cases

Le bot OpenClaw connecte n8n, WordPress, Airtable et GHL pour l'automatisation CRM.

Un non-développeur a utilisé un bot OpenClaw pour connecter les environnements n8n, WordPress, Airtable et GoHighLevel via des discussions Telegram, construisant un système de CRM et de flux de travail en une semaine. Le bot a consommé beaucoup de tokens mais s'est avéré moins cher que d'embaucher une aide technique.

OpenClawRadar
Exécuter OpenClaw 24h/24 et 7j/7 : Architecture pratique pour des agents autonomes persistants
Use Cases

Exécuter OpenClaw 24h/24 et 7j/7 : Architecture pratique pour des agents autonomes persistants

Un développeur partage des solutions testées pour exécuter OpenClaw en tant que serveur 24h/24 et 7j/7 avec des tâches cron, incluant des fichiers mémoire divisés par sujet, une gestion agressive du cycle de vie des sessions, un élagage du contexte avec des marqueurs de récupération, et des outils d'encapsulation pour le stockage structuré et la récupération après plantage.

OpenClawRadar