Aller au contenu

Jeu de Donjon d'IA Agentique

Le Story Agent est un agent Strands qui, étant donné un Game et une liste d’Actions comme contexte, fait progresser une histoire. Nous configurerons l’agent pour interagir avec notre Inventory MCP Server afin de gérer les objets disponibles du joueur.

Implémentons notre agent. Mettez à jour les fichiers suivants dans packages/story/dungeon_adventure_story/agent :

import os
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from .agent import get_agent
app = BedrockAgentCoreApp()
PORT = int(os.environ.get("PORT", "8080"))
@app.entrypoint
async def invoke(payload, context):
"""Handler for agent invocation"""
player_name = payload.get("playerName")
genre = payload.get("genre")
actions = payload.get("actions")
messages = [{"role": "user", "content": [{"text": "Continue or create a new story..."}]}]
for action in actions:
messages.append({"role": action["role"], "content": [{"text": action["content"]}]})
with get_agent(player_name, genre, session_id=context.session_id) as agent:
stream = agent.stream_async(messages)
async for event in stream:
print(event)
yield (event)
if __name__ == "__main__":
app.run(port=PORT)

Cette configuration permet :

  • L’extraction du joueur, du genre et des actions depuis le payload de l’agent
  • La construction d’un client que l’agent peut utiliser pour invoquer notre serveur MCP avec une authentification SigV4
  • La construction de l’agent avec un prompt système et les outils du serveur MCP

D’abord, compilons le codebase :

Terminal window
pnpm nx run-many --target build --all

Déployez maintenant l’application avec :

Terminal window
pnpm nx deploy infra dungeon-adventure-infra-sandbox/*

Ce déploiement prendra environ 2 minutes.

Une fois terminé, vous verrez des sorties similaires à ceci (valeurs masquées) :

Fenêtre de terminal
dungeon-adventure-infra-sandbox-Application
dungeon-adventure-infra-sandbox-Application: deploying... [2/2]
dungeon-adventure-infra-sandbox-Application
Temps de déploiement : 354s
Outputs:
dungeon-adventure-infra-sandbox-Application.ElectroDbTableTableNameXXX = dungeon-adventure-infra-sandbox-Application-ElectroDbTableXXX-YYY
dungeon-adventure-infra-sandbox-Application.GameApiEndpointXXX = https://xxx.execute-api.region.amazonaws.com/prod/
dungeon-adventure-infra-sandbox-Application.GameUIDistributionDomainNameXXX = xxx.cloudfront.net
dungeon-adventure-infra-sandbox-Application.InventoryMcpArn = arn:aws:bedrock-agentcore:region:xxxxxxx:runtime/dungeonadventureventoryMcpServerXXXX-YYYY
dungeon-adventure-infra-sandbox-Application.StoryAgentArn = arn:aws:bedrock-agentcore:region:xxxxxxx:runtime/dungeonadventurecationStoryAgentXXXX-YYYY
dungeon-adventure-infra-sandbox-Application.UserIdentityUserIdentityIdentityPoolIdXXX = region:xxx
dungeon-adventure-infra-sandbox-Application.UserIdentityUserIdentityUserPoolIdXXX = region_xxx

Testez l’API via :

  • Un serveur Agent local avec curl
  • L’API déployée avec un token JWT

Démarrez le serveur local avec :

Terminal window
PORT=9999 INVENTORY_MCP_ARN=arn:aws:bedrock-agentcore:region:xxxxxxx:runtime/dungeonadventureventoryMcpServerXXXX-YYYY AWS_REGION=<region> pnpm nx run dungeon_adventure.story:agent-serve

Invoquez le serveur avec :

Fenêtre de terminal
curl -N -X POST http://127.0.0.1:9999/invocations \
-d '{"genre":"superhero", "actions":[], "playerName":"UnnamedHero"}' \
-H "Content-Type: application/json" \
-H "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id: abcdefghijklmnopqrstuvwxyz-123456789"

En cas de succès, vous verrez un flux d’événements similaire à :

data: {"init_event_loop": true}
data: {"start": true}
data: {"start_event_loop": true}
data: {"event": {"messageStart": {"role": "assistant"}}}
data: {"event": {"contentBlockDelta": {"delta": {"text": "Welcome"}, "contentBlockIndex": 0}}}
...

Félicitations. Vous avez déployé votre premier agent Strands sur Bedrock AgentCore Runtime ! 🎉🎉🎉