Bỏ qua để đến nội dung

Triển khai và cấu hình Story agent

Story Agent là một agent Strands mà khi được cung cấp một Game và danh sách các Action làm ngữ cảnh, sẽ phát triển câu chuyện. Chúng ta sẽ cấu hình agent để tương tác với Inventory MCP Server của chúng ta nhằm quản lý các vật phẩm khả dụng của người chơi.

Để triển khai agent của chúng ta, cập nhật các file sau trong 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)

Điều này sẽ cấu hình những thứ sau:

  • Trích xuất player, genre và actions từ agent payload,
  • Xây dựng một client mà Agent có thể sử dụng để gọi MCP server của chúng ta với SigV4 Authentication, và
  • Xây dựng agent với system prompt và các công cụ của MCP server.

Để build code:

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

Để triển khai ứng dụng của bạn, chạy lệnh sau:

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

Quá trình triển khai này sẽ mất khoảng 2 phút để hoàn thành.

Khi quá trình triển khai hoàn tất, bạn sẽ thấy các output tương tự như sau (một số giá trị đã được ẩn):

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

Bạn có thể kiểm thử Agent của mình bằng một trong hai cách:

  • Khởi động một instance cục bộ của Agent server và gọi nó bằng curl, hoặc
  • Gọi API đã triển khai bằng curl với JWT token.

Khởi động Agent server cục bộ của bạn bằng cách chạy lệnh sau:

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

Khi Agent server đã chạy (bạn sẽ không thấy bất kỳ output nào), gọi nó bằng cách chạy lệnh sau:

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

Nếu lệnh chạy thành công, bạn sẽ thấy các events được streaming tương tự như:

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

Chúc mừng. Bạn đã xây dựng và triển khai Strands Agent đầu tiên của mình trên Bedrock AgentCore Runtime! 🎉🎉🎉