AWS Hong Kong Summit 2026 · Developer Lounge 精华回顾

以 Bedrock AgentCore 打造 Serverless AR 游戏

AWS Hong Kong Summit 2026 · Developer Lounge 精华回顾 · 第 4 / 6 篇

AWS Magazine · 维多利亚港现场报道


现场:中环 swagger 遇上 Serverless 咒术

过去六十年追踪科技变迁,我站过数百个展场,但很少有地方能媲美 AWS Hong Kong Summit 2026 Developer Lounge 那股电流般的脉动。

倚着维多利亚港壮阔天际,Developer Lounge 是香港奢华与 AWS 高科技工艺的正面碰撞。想象一下:风投与创业公司创始人边喝精品手冲咖啡边谈七位数交易,国际讲者交换架构图,私人开发者聚会里高风险风投话题此起彼落。资金进进出出,合作即兴成形;在霓虹闪烁与中环能量之中,工程师围在屏幕前,见证纯粹的 serverless 咒术。

Lounge 最吸睛的展示?Cyrus Wong 把奢华娱乐与云工程合而为一的 demo:咒术回战领域展开 AR 游戏

「唔错喎!反应好似我去抢购减价化妆品噉快!当堂顺眼好多!」 (Not bad! Your reaction is almost as fast as me grabbing a limited-edition bag in Shibuya!)

对着镜头比出五条悟的 Unlimited Void(无量空处)或两面宿傩的 Malevolent Shrine(伏魔御厨子)手势,屏幕立刻爆开 3D 粒子特效,真实(或模拟)人形机器人摆出功夫架式——全程由 AI 评论员以时髦、爱时尚的本地粤语即时解说。

以下是这款同人应用如何以 AWS Bedrock AgentCoreAWS CDK 与 serverless 编排构建的深入实战架构拆解。


全场焦点:AI 评论员钉崎野蔷薇

体验核心是仿 Kugisaki Nobara(钉崎野蔷薇) 打造的 AI 评论员。多模态 AI 视觉驱动,她即时吐槽玩家的手势、穿搭、姿势,甚至凌乱的房间。

多语支持与视觉智慧

  • 语言:本地粤语、台湾华语、日语与英语。

  • 个性:中环高级时尚 × 动画咒术。

  • 模型堆叠moonshotai.kimi-k2.5 在 Bedrock 自定义 ECR 容器内执行,搭配 AWS Polly 高保真神经语音合成。

系统架构总览

接口 / 功能 模型与基础设施实现 关键服务堆叠
AI 评论员(Nobara) 通过 moonshotai.kimi-k2.5 进行视觉感知文字推理 AWS Bedrock AgentCore Runtime
语音合成(TTS) 神经粤语、华语、日语、英语 AWS Polly & Amazon S3
手势追踪 60 FPS 的 21 个 3D 地标点 Google MediaPipe Hands(Client JS)
机器人控制 硬件与 3D 模拟器 MQTT 架式 AWS IoT Core & AWS Lambda
基础设施 100% 基础设施即代码 AWS CDK(TypeScript)

逐步实战执行流程

+-----------------------------------------------------------------------------------+
端到端手势到语音流程

1. [ Browser Client ] -- MediaPipe 60FPS --> [ API Gateway ]
2. [ API Gateway ] -- Cognito JWT --> [ Monolithic Lambda ]
3. [ Monolithic Lambda ] -- XML multimodal payload --> [ AgentCore Runtime ]
4. [ AgentCore Runtime ] --> [ AWS Polly ] neural speech
5. [ AWS Polly ] --> [ S3 Audio Bucket ] --> browser playback
+-----------------------------------------------------------------------------------+

步骤 A:客户端手势检测与 API 信号

浏览器执行 hand_tracker.js,以 Google MediaPipe Hands 分析 21 个 3D 地标点60 FPS。手势(例如 Malevolent Shrine)验证后,battle.js 带 Cognito Bearer JWT 向 Amazon API Gateway 送出 POST 请求:

// battle.js: Dispatching recognized gesture to API Gateway[cite: 1]
async function triggerCursedTechnique(techniqueName) {
    const token = await getCognitoAccessToken(); // High-security Bearer Token[cite: 1]
    try {
        const response = await fetch("/api/trigger-technique", {
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Authorization": `Bearer ${token}`
            },
            body: JSON.stringify({
                technique: techniqueName, // e.g. "malevolent_shrine"[cite: 1]
                robotId: "all",
                sessionId: "mcpserver"
            })
        });
        const result = await response.json();
        playCommentaryAudio(result.audioUrl); // Play resulting neural voice track[cite: 1]
    } catch (err) {
        console.error("Failed to execute server-side technique orchestration:", err); //[cite: 1]
    }
}

步骤 B:Cognito 授权与 XML Base64 绕道

API Gateway 验证 token 后,将请求转发至单体 Flask Lambda(lambda_function.py)。

为避免企业网络代理在传输中剥除二进制 multipart 影像数据,commentary.py 将网络摄像头快照嵌入文字 payload 的自定义 XML 标签:

# commentary.py: Packaging snapshots inside XML text tags[cite: 1]
def generate_ai_commentary(content_block, session_id="mcpserver", image_base64_p1=""):
    if image_base64_p1:
        content_block += f"\n<p1_webcam_base64_jpeg>{image_base64_p1}</p1_webcam_base64_jpeg>" #[cite: 1]

    agent_client = boto3.client("bedrock-agentcore", region_name="us-east-1") #[cite: 1]

    payload_dict = {
        "prompt": content_block,
        "session_id": session_id
    }

    response = agent_client.invoke_agent_runtime(
        agentRuntimeArn=os.environ.get("AGENTCORE_RUNTIME_ARN"),
        runtimeSessionId=session_id,
        payload=json.dumps(payload_dict).encode("utf-8")
    )
    return response.get("response").read().decode("utf-8") #[cite: 1]

步骤 C:Serverless AgentCore Runtime 执行

AWS Bedrock AgentCore Runtime 通过 IAM SigV4 将调用路由至自定义容器(domain_commentator_agentcore)。容器内 FastAPI 服务(commentator_agent.py)以 regex 抓取 base64 XML 区块,重建 Bedrock 的二进制多模态 payload:

# commentator_agent.py: Unwrapping XML image parts inside container[cite: 1]
@app.post("/invocations")
async def invoke_agent(request: Request):
    body = await request.json()
    prompt_text = body.get("prompt", "")

    p1_pattern = re.compile(r"<p1_webcam_base64_jpeg>(.*?)</p1_webcam_base64_jpeg>", re.DOTALL) #[cite: 1]
    p1_match = p1_pattern.search(prompt_text)

    image_b64_p1 = ""
    if p1_match:
        image_b64_p1 = p1_match.group(1).strip()
        prompt_text = p1_pattern.sub("", prompt_text).strip() # Clean text prompt[cite: 1]

    img_bytes_p1 = base64.b64decode(image_b64_p1)
    message_content = [
        {"text": "Player 1 webcam snapshot:"},
        {"image": {"format": "jpeg", "source": {"bytes": img_bytes_p1}}},
        {"text": prompt_text}
    ]

    response = await strands_agent.invoke_async(message_content) #[cite: 1]
    return JSONResponse(content={"response": str(response)}, status_code=200) #[cite: 1]

步骤 D:通过 AgentCore Tool Gateway 派发硬件指令

模型触发实体动作时,runtime 调用 AgentCore Tool Gatewaybedrockagentcore.Gateway),再通过 IAM SigV4 调用 robot_tool_lambda.py,向 AWS IoT Core 发布 MQTT 指令:

# robot_tool_lambda.py: Stripping tool prefix and invoking IoT Core[cite: 1]
def lambda_handler(event, context):
    full_tool_name = event.get("tool_name", "") # e.g., "robot-only-mcp-lambda___robot_wave"[cite: 1]
    local_tool_name = full_tool_name.split("___")[-1] if "___" in full_tool_name else full_tool_name #[cite: 1]

    if local_tool_name == "robot_wave":
        iot_client = boto3.client("iot-data")
        iot_client.publish(
            topic="arn:aws:iot:us-east-1:123456789012:topic/robot_1/topic",
            qos=1,
            payload=json.dumps({"action": "wave_hand", "timestamp": int(time.time())})
        )
        return {"status": "SUCCESS", "message": "Robot hand wave triggered."} #[cite: 1]


基础设施即代码:CDK 核心模式

为让基础设施可重复、现代且干净,整个系统以 AWS CDK 建模。

1. 集中式 Tool Gateway Construct(robot-tool-gateway.ts

// Constructing the Tool Gateway with IAM SigV4 security[cite: 1]
export class RobotToolGatewayConstruct extends Construct {
  public readonly robotToolFunction: PythonFunction;
  public readonly gateway: bedrockagentcore.Gateway;

  constructor(scope: Construct, id: string, props: RobotToolGatewayConstructProps) {
    super(scope, id);

    this.robotToolFunction = new PythonFunction(this, "RobotToolFunction", {
      entry: path.join(__dirname, "../../../mcp_server"),
      runtime: SHARED_PYTHON_RUNTIME,
      index: "robot_tool_lambda.py",
      handler: "lambda_handler",
      timeout: Duration.seconds(30),
    });

    this.gateway = new bedrockagentcore.Gateway(this, "RobotToolGateway", {
      description: "AgentCore gateway fronting the robot Lambda tools",
      authorizerConfiguration: bedrockagentcore.GatewayAuthorizer.usingAwsIam(), // SigV4 Auth[cite: 1]
    });

    this.gateway.addLambdaTarget("RobotToolLambdaTarget", {
      gatewayTargetName: "robot-only-mcp-lambda",
      lambdaFunction: this.robotToolFunction,
      toolSchema: bedrockagentcore.ToolSchema.fromLocalAsset(materializeRobotToolSchemaAsset()),
    });
  }
}

2. Serverless AgentCore 评论员 Runtime(domain-expansion-serverless.ts

// Deploying commentator runtime with cost-aware lifecycles[cite: 1]
const runtime = new agentcore.Runtime(this, "Runtime", {
  runtimeName: "domain_commentator_agentcore",
  agentRuntimeArtifact: agentcore.AgentRuntimeArtifact.fromAsset(
    path.join(__dirname, "../../../domain-expansion-commentator-agentcore"),
    { platform: Platform.LINUX_ARM64 }
  ),
  authorizerConfiguration: agentcore.RuntimeAuthorizerConfiguration.usingIAM(),
  lifecycleConfiguration: {
    idleRuntimeSessionTimeout: Duration.seconds(120), // 2 min idle timeout[cite: 1]
    maxLifetime: Duration.seconds(900),              // 15 min max session[cite: 1]
  },
  tracingEnabled: true,
  environmentVariables: {
    BEDROCK_MODEL_ID: "moonshotai.kimi-k2.5",
  },
});


分流式 API Gateway 安全模型

团队实现分流 REST 模型,解决经典 Web 冲突:标准浏览器元素(<img src="...">)无法带 Bearer header,但写入操作会消耗 LLM 费用。

// Public vs Protected Endpoint Configuration[cite: 1]
const restApi = new apigateway.RestApi(this, "DomainExpansionRestApi", {
  restApiName: "Domain Expansion Serverless REST API",
});

const restAuthorizer = new apigateway.CognitoUserPoolsAuthorizer(this, "DomainExpansionRestApiAuthorizer", {
  cognitoUserPools: [props.userPool],
});

// 🔓 PUBLIC READ-ONLY ENDPOINTS (No Cognito Token required)[cite: 1]
apiResource.addResource("get-snapshot").addMethod("GET", lambdaIntegration, {
  authorizationType: apigateway.AuthorizationType.NONE, //[cite: 1]
});

// 🔒 PROTECTED WRITE ENDPOINTS (Strict Cognito Validation)[cite: 1]
apiResource.addResource("trigger-technique").addMethod("POST", lambdaIntegration, {
  authorizationType: apigateway.AuthorizationType.COGNITO, // Edge validation[cite: 1]
  authorizer: restAuthorizer,
});


可观测性与企业级追踪

可观测性通过 CloudWatch Vended Logs 命名空间与 AWS X-Ray 处理:

// Configuring Vended Logs namespace for AgentCore[cite: 1]
const applicationLogGroup = new logs.LogGroup(scope, `${id}ApplicationLogGroup`, {
  logGroupName: `/aws/vendedlogs/bedrock-agentcore/gateway/APPLICATION_LOGS/${gateway.gatewayId}`, //[cite: 1]
  retention: logs.RetentionDays.THREE_DAYS,
});

这确保在单一 X-Ray 地图上进行端到端分布式追踪:

Browser Gesture → API Gateway → Lambda Router → AgentCore Container → Strands LLM → AWS Polly TTS


智慧客户端防护与角色工程

1. 成本防护会话逻辑(auth-check.js

为避免闲置标签页维持 AgentCore socket 连接造成账单外泄,客户端每 30 秒在设备上检查 Cognito JWT:

Session Expired = currentTime >= jwt.exp

若已过期,立即关闭作用中的 WebSocket:

function checkSessionGuard() {
    const token = getCognitoToken();
    if (isTokenExpired(token)) {
        if (webSocketConnection) webSocketConnection.close(); // Prevent billing leaks[cite: 1]
        triggerLocalLogout();
    }
}
setInterval(checkSessionGuard, 30000); // 0 cloud compute overhead[cite: 1]

2. 语音文字清理(commentary_tts.py

将模型输出交给 AWS Polly 前,以 BeautifulSoup 把 Markdown 符号(**bold**#)转成干净纯文字,避免 Polly 念出语法:

import markdown
from bs4 import BeautifulSoup

def sanitize_text_for_tts(raw_text):
    html_formatted = markdown.markdown(raw_text)
    return BeautifulSoup(html_formatted, "html.parser").get_text() # Clean plain text[cite: 1]

3. Soul as Code 配置

角色身份完全解耦为标准 Markdown 文件,在 runtime 加载:

  • IDENTITY.md:呛辣粤语风格与气质指引。

  • SOUL.md:战斗 lore 规则(例如如何吐槽五条悟玩家)。


架构经济学与按需付费

架构选择 成本与效率影响
零闲置计费 无对战进行时 $0.00;无需持续运行的 EC2/ECS 服务器。
S3 生命周期规则 网络摄像头快照与 Polly MP3 音频串流 7 天后自动删除。
P2P 视频 WebRTC 视频串流点对点直连;API Gateway WebSocket 仅处理轻量遥测。

结语:Developer Lounge 的氛围

Cyrus Wong 与团队在 AWS Hong Kong Summit 2026 Developer Lounge 展示的,不只是一款有趣的同人游戏,更是现代 serverless 设计的实战课:高时尚、高科技、低延迟、零闲置成本。

夕阳照进中环、点亮维多利亚港时,开发者仍围在摊位前扫 CDK 仓库、测试手势。这才是 AWS Developer Lounge 真正的精神——把世界级工程、本地文化活力与 serverless 力量,聚在同一个屋檐下。