Salta ai contenuti

Gioco di Dungeon con IA Agentiva

Lo Story Agent è un agente Strands che, dato un Game e una lista di Action come contesto, farà progredire una storia. Configureremo l’agente per interagire con il nostro server MCP dell’inventario per gestire gli oggetti disponibili del giocatore.

Implementiamo il nostro agente. Aggiorna i seguenti file in 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)

Questa configurazione implementa:

  • L’estrazione del giocatore, genere e azioni dal payload dell’agente
  • La costruzione di un client che l’Agente può utilizzare per invocare il nostro server MCP con Autenticazione SigV4
  • La costruzione dell’agente con un prompt di sistema e gli strumenti del server MCP

Prima, compiliamo il codice:

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

Ora puoi effettuare il deploy dell’applicazione con:

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

Il deployment richiederà circa 2 minuti.

Al completamento, dovresti vedere output simili a questi (alcuni valori sono stati oscurati):

Terminal window
dungeon-adventure-infra-sandbox-Application
dungeon-adventure-infra-sandbox-Application: deploying... [2/2]
dungeon-adventure-infra-sandbox-Application
Deployment time: 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

Possiamo testare l’API in due modi:

  • Avviando un’istanza locale del server Agent e invocandola con curl
  • Chiamando l’API deployata usando curl con un token JWT

Avvia il server Agent locale con:

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

Quando il server è attivo (nessun output visibile!), invocalo con:

Terminal window
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"

Se il comando ha successo, vedrai eventi in streaming simili a:

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}}}
...

Complimenti. Hai creato e deployato il tuo primo Strands Agent su Bedrock AgentCore Runtime! 🎉🎉🎉