Aller au contenu

Implémenter et configurer l'agent Story

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 d’un joueur.

Pour implémenter notre agent, mettez à jour les fichiers suivants dans packages/story/dungeon_adventure_story/agent :

import uuid
import uvicorn
from bedrock_agentcore.runtime.models import PingStatus
from fastapi.responses import PlainTextResponse, StreamingResponse
from pydantic import BaseModel
from .agent import get_agent
from .init import app
class Action(BaseModel):
role: str
content: str
class InvokeInput(BaseModel):
playerName: str
genre: str
actions: list[Action]
async def handle_invoke(input: InvokeInput):
"""Streaming handler for agent invocation"""
messages = [{"role": "user", "content": [{"text": "Continue or create a new story..."}]}]
for action in input.actions:
messages.append({"role": action.role, "content": [{"text": action.content}]})
with get_agent(input.playerName, input.genre, session_id=str(uuid.uuid4())) as agent:
stream = agent.stream_async(messages)
async for event in stream:
print(event)
content = event.get("event", {}).get("contentBlockDelta", {}).get("delta", {}).get("text")
if content is not None:
yield content
elif event.get("event", {}).get("messageStop") is not None:
yield "\n"
@app.post("/invocations", openapi_extra={"x-streaming": True}, response_class=PlainTextResponse)
async def invoke(input: InvokeInput) -> str:
"""Entry point for agent invocation"""
return StreamingResponse(handle_invoke(input), media_type="text/event-stream")
@app.get("/ping")
def ping() -> str:
# TODO: if running an async task, return PingStatus.HEALTHY_BUSY
return PingStatus.HEALTHY
if __name__ == "__main__":
uvicorn.run("dungeon_adventure_story.agent.main:app", port=8080)

Cela permettra de configurer les éléments suivants :

  • 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, et
  • La construction de l’agent avec un prompt système et les outils du serveur MCP.

Pour compiler le code :

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

Pour déployer votre application, exécutez la commande suivante :

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

Ce déploiement prendra environ 2 minutes.

Une fois le déploiement terminé, vous verrez des sorties similaires à ceci (certaines valeurs ont été masquées) :

Fenêtre de terminal
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

Vous pouvez tester votre API via :

  • Le démarrage d’une instance locale du serveur Agent et son invocation à l’aide de curl, ou
  • L’appel de l’API déployée en utilisant curl avec un token JWT.

Démarrez votre serveur Agent local en exécutant la commande suivante :

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

Une fois le serveur Agent démarré et en cours d’exécution (vous ne verrez aucune sortie), invoquez-le en exécutant la commande suivante :

Fenêtre de terminal
curl -N -X POST http://127.0.0.1:8081/invocations \
-d '{"genre":"superhero", "actions":[], "playerName":"UnnamedHero"}' \
-H "Content-Type: application/json"

Si la commande s’exécute avec succès, vous devriez voir 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 construit et déployé votre premier agent Strands sur Bedrock AgentCore Runtime ! 🎉🎉🎉