AWS的最新功能充分利用,讓我們來製作一個全棧的AI代理Web應用程式吧。

看膩了Streamlit的畫面,該畢業了!
完成的應用程式示範可以從以下連結試用,任何人都能使用。

AWS Amplify Gen2的優點在於「無伺服器且便宜」、「可管理且輕鬆」。
為了幫助那些不擅長前端的人,我們刪除了不必要的檔案和代碼,大幅減少了步驟數,並大幅降低了認知負擔。
創建AWS帳號
創建GitHub帳號
之後的AWS CLI認證將使用此帳號,因此請保持在AWS管理控制台中的登入狀態。
訪問Amplify的快速入門
從範本創建GitHub儲存庫
amplify-agentcore啟動開發環境

# 下載
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# 解壓
unzip awscliv2.zip
# 安裝
sudo ./aws/install
# 清理
rm -rf aws awscliv2.zip
aws login --remote
ap-northeast-1
前端會生成大量檔案,因此可能不易上手。
我們將削減不必要的檔案和代碼,並對此進行各種減少認知負擔的努力。
# 刪除根目錄的不必要檔案
rm -rf .eslintrc.cjs CODE_OF_CONDUCT.md CONTRIBUTING.md LICENSE README.md
# 刪除不必要的目錄以及各層的檔案
rm -rf public amplify/data src/assets
在amplify目錄內,定義我們想要在Amplify中創建的雲功能。這次我們只啟用使用Cognito的認證功能。
amplify/auth/resource.ts
import { defineAuth } from '@aws-amplify/backend';
export const auth = defineAuth({
loginWith: {
email: true,
},
});
amplify/backend.ts
import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
defineBackend({
auth,
});
在src目錄內,放置前端的主代碼。
src/index.css
/* 全域樣式 */
* {
box-sizing: border-box;
}
body {
margin: 0;
background: #fafbfc;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
-webkit-font-smoothing: antialiased;
}
#root {
height: 100vh;
width: 100vw;
}
main.tsx
// 載入所需的包
import React from "react";
import ReactDOM from "react-dom/client";
import { Amplify } from "aws-amplify";
import { Authenticator } from '@aws-amplify/ui-react';
import App from "./App.tsx";
import outputs from "../amplify_outputs.json";
import '@aws-amplify/ui-react/styles.css';
import "./index.css";
// 初始化Amplify
Amplify.configure(outputs);
// 應用程式的入口(帶認證的渲染)
ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
<Authenticator>
<App />
</Authenticator>
</React.StrictMode>
);
npm install react-markdown
mkdir agent
cd agent
touch main.py
touch requirements.txt
agent/main.py
# 載入所需的庫
from strands import Agent
from strands_tools.rss import rss
from bedrock_agentcore.runtime import BedrockAgentCoreApp
# 創建AgentCore運行時的API伺服器
app = BedrockAgentCoreApp()
def convert_event(event) -> dict | None:
"""將Strands的事件轉換為前端JSON格式"""
try:
if not hasattr(event, 'get'):
return None
inner_event = event.get('event')
if not inner_event:
return None
# 偵測文本差分
content_block_delta = inner_event.get('contentBlockDelta')
if content_block_delta:
delta = content_block_delta.get('delta', {})
text = delta.get('text')
if text:
return {'type': 'text', 'data': text}
# 偵測工具使用開始
content_block_start = inner_event.get('contentBlockStart')
if content_block_start:
start = content_block_start.get('start', {})
tool_use = start.get('toolUse')
if tool_use:
tool_name = tool_use.get('name', 'unknown')
return {'type': 'tool_use', 'tool_name': tool_name}
return None
except Exception:
return None
# 將代理呼叫函數設置為API伺服器的入口點
@app.entrypoint
async def invoke_agent(payload, context):
# 獲取前端輸入的提示
prompt = payload.get("prompt")
# 創建AI代理
agent = Agent(
model="jp.anthropic.claude-haiku-4-5-20251001-v1:0",
system_prompt="aws.amazon.com/about-aws/whats-new/recent/feed 取得RSS",
tools=[rss]
)
# 以串流形式獲取代理的回應
async for event in agent.stream_async(prompt):
converted = convert_event(event)
if converted:
yield converted
# 啟動API伺服器
if __name__ == "__main__":
app.run()
Strands Agents中內建了RSS工具,可以從AWS的「What's New」RSS中獲取資訊。
agent/requirements.txt
botocore
bedrock-agentcore
strands-agents
strands-agents[otel]
strands-agents-tools[rss]
將代碼放在GitHub儲存庫中,後續步驟只需指定該儲存庫即可輕鬆部署至Amplify,這真的非常方便!
amplify-agentcore 和 main 分支,然後點擊「下一步」
React將自動部署到無伺服器環境中,並自動創建作為認證功能所新增的Cognito用戶池等。真方便!
個人建議在Mac的本地環境中創建容器並推送至ECR,然後從管理控制台創建運行時,這樣更加直觀。
但是,由於此次為了統一環境進行操作,而使用了GitHub Codespaces(x86),因此ARM架構的容器建構需要花費大量時間,所以無奈之下只能使用AgentCore啟動工具包。
# 切換到後端目錄
cd /workspaces/amplify-agentcore/agent
# 安裝AgentCore啟動工具包
pip install bedrock-agentcore-starter-toolkit "boto3[crt]"
# 創建AgentCore部署用的配置檔案
agentcore configure
main.pyupdate_checkeryeshttps://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_XXXXXXXXX/.well-known/openid-configurationap-northeast-1_XXXXXXXXX部分填入記下的用戶池IDs(不建立記憶體而跳過)在創建AgentCore運行時時,設置為只能接受用Cognito授權的用戶發出的請求。
認證方式可以選擇IAM或JWT,但如果選擇IAM,就需要在前端攜帶AWS認證資訊,安全性顯得有些微妙,因此這裡採用了JWT。
執行agentcore configure命令後會生成 .bedrock_agentcore.yaml。
因為這裡面包含Cognito的敏感資訊,因此若稍後要重新推送至儲存庫的人,請務必將其加入到 .gitignore 中。
(因為此步驟中前端已部署完成,所以不會進行重新推送)
agentcore deploy
部署後,會根據精靈中的設定自動創建以下內容。
VITE_AGENT_ARNAgentCore運行時的ARN將會編譯到前端,因此使用者在瀏覽器中利用開發者工具查看時可能會看到ARN。
ARN中包含AWS帳號ID,因此不算是機密資訊,但請在使用時留意。


AI代理能夠自動執行多次工具使用,並能在推理過程中動作,因此將進度即時顯示給使用者是很重要的。
我們用簡單的代碼來支持工具使用情況的顯示和文本的流式傳輸!
此次的範例代碼在此
Amplify與AgentCore均具備許多方便的功能,適合用於開發中的本地測試。
雖然我們以最短的步驟進行了正式部署,但希望在本地開發的人也能參考以下資訊。
若希望將AgentCore的記憶體與可觀察性等功能與Strands結合使用的人,請參考這裡!
如果想要真的深入了解AI代理的構建,請參考這裡!

原文出處:https://qiita.com/minorun365/items/11be2c3565923b96ab54