Aller au contenu

Implémenter et configurer l'agent Story

L’agent Story est un agent Strands généré avec --protocol=ag-ui dans le Module 1, afin que l’interface utilisateur puisse diffuser depuis celui-ci via le protocole Agent-User Interaction via CopilotKit. Il utilise le serveur MCP Inventory pour gérer les objets du joueur, et persiste déjà l’historique des conversations via le session.py que le générateur a provisionné dans le Module 1 — une fois déployé, c’est le S3SessionManager intégré de Strands qui écrit dans le même bucket S3 que celui depuis lequel le queryActions de l’API Game lit, afin que le navigateur puisse reconstruire les transcriptions lors d’une nouvelle visite.

Mettez à jour agent.py dans packages/story/dungeon_adventure_story/agent :

from contextlib import contextmanager
from dungeon_adventure_agent_connection import InventoryMcpServerClientStrands, log_model_errors, log_tool_errors
from strands import Agent
from strands.hooks import HookCallback, HookProvider
AGENT_HOOKS: list[HookProvider | HookCallback] = [log_model_errors, log_tool_errors]
@contextmanager
def get_agent():
inventory_mcp_server = InventoryMcpServerClientStrands.create()
with (
inventory_mcp_server,
):
yield Agent(
system_prompt="""
You are running a text adventure game for a lone adventurer. When a new story
begins, the first user message will tell you the player's name and the genre
(one of 'medieval', 'zombie', 'superhero'). Greet the player by name, set the
scene in the chosen genre, and populate their inventory with a few starting
items. On subsequent turns, advance the story in response to the player's
actions and keep item state in sync with the narrative.
Use the tools to manage the player's inventory as items are obtained or lost.
Item names in the inventory must be Title Case — match them exactly.
Only use list-inventory-items if you are unsure of the exact item name before modifying it.
IMPORTANT: Only call ONE tool per response turn. Never batch multiple tool calls in a single turn.
Ensure you specify a suitable emoji when adding items if available.
Items should be a key part of the narrative.
Keep responses under 100 words.
""",
tools=[*inventory_mcp_server.list_tools_sync()],
hooks=AGENT_HOOKS,
)

agent.py supprime l’outil d’exemple subtract et remplace le prompt système par un prompt de maître de donjon qui invite le premier message de l’utilisateur à indiquer le nom et le genre du joueur, et utilise les outils du serveur MCP Inventory. main.py n’a besoin d’aucune modification ici — la gestion des sessions était déjà configurée lors de la génération de l’agent.

Pour compiler le code :

Terminal window
pnpm build

La cible agent-chat générée ouvre un REPL interactif contre votre agent. Il s’exécute de manière autonome et se connecte à votre agent s’exécutant localement, donc démarrez d’abord le serveur local de l’agent dans un terminal :

Terminal window
pnpm nx agent-dev story

Ensuite, dans un second terminal, démarrez le chat :

Terminal window
pnpm nx agent-chat story

Votre premier message devrait indiquer à l’agent le nom de votre héros et le genre (par exemple : My name is Alice. Start my zombie adventure.) et l’histoire sera diffusée en retour.

Félicitations. Vous avez construit et testé votre premier agent Strands localement ! 🎉🎉🎉