跳转到内容

代理式AI地牢游戏

故事代理是一个 Strands 代理,它基于给定的 GameAction 列表作为上下文来推进故事情节。我们将配置该代理与库存管理服务器(MCP Server)交互,管理玩家可用物品。

让我们实现代理。更新 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)

此配置实现了以下功能:

  • 从代理负载中提取玩家信息、故事类型和动作
  • 构建使用 SigV4 认证调用 MCP 服务器的客户端
  • 通过系统提示和 MCP 服务器工具构建代理

首先构建代码库:

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

运行以下命令部署应用:

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

部署过程约需 2 分钟。

部署完成后将看到类似输出(部分值已脱敏):

Terminal window
dungeon-adventure-infra-sandbox-Application
dungeon-adventure-infra-sandbox-Application: deploying... [2/2]
dungeon-adventure-infra-sandbox-Application
部署时间: 354s
输出:
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

可通过以下方式测试 API:

  • 启动代理服务器本地实例并使用 curl 调用
  • 使用带 JWT 令牌的 curl 调用已部署 API

运行以下命令启动本地代理服务器:

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

代理服务器启动后(无输出显示),运行以下命令调用:

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"

成功执行命令后,将看到类似事件流:

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

恭喜!您已成功在 Bedrock AgentCore Runtime 上构建并部署首个 Strands 代理!🎉🎉🎉