編碼代理現在能夠構建可執行的 Web 應用,例如儀表板、產品頁面或產品團隊想要嘗試的原型。審查這類工作時,最快捷的方式是開啟應用、使用它、要求修改並檢查結果。如果應用在代理編輯它的地方持續執行,這個迴圈就會非常高效,每次更改都能在幾秒鐘內顯示在瀏覽器中。反之,如果應用必須先複製出來再部署到其他地方,那麼每次更改都要等待部署,審查速度就會降到部署的速度。
Amazon Bedrock AgentCore 是一個用於大規模構建、連線和最佳化代理的平臺,支援您選擇的代理框架和基礎模型。AgentCore 執行時是 Amazon Bedrock AgentCore 的一項能力,它在獨立的微虛擬機器中執行每個代理會話。藉助 Session 端點,您可以從自己的瀏覽器開啟在該會話中執行的應用。Session 端點為每個會話提供一個經過身份驗證的 URL,該 URL 將每個請求的 HTTP 方法、路徑、查詢字串和正文以及 WebSocket 連線轉發到您允許的埠。當代理儲存每個檔案時,您可以看到頁面更新。
在本文中,您將部署一個編碼代理,使其在會話中保持 Vite 網站執行,然後開啟一個本地頁面,左側是聊天視窗,右側是即時網站。您要求代理將網站切換為深色主題,跟隨其流式輸出的步驟,並無需重新整理即可看到網站變化。最後,您將瞭解內部機制:同一會話中的第二個埠,以及 Session 端點拒絕的請求。
完整的示例(包括本文遵循的筆記本)位於 agentcore-samples GitHub 倉庫的 14-remote-access 資料夾中。
Session 端點的工作原理
每個會話都有自己的 Session 端點,六個細節決定了您如何使用它。
您選擇它可訪問的埠。在呼叫 CreateAgentRuntime 時設定 allowedPorts:1-5 個條目,每個條目是單個埠或 8000-12000 範圍內的一個範圍,不包括保留的平臺埠。允許埠並不會啟動伺服器,因此您的應用程式必須監聽該埠,並繫結到 0.0.0.0。
URL 隨會話一起提供。InvokeAgentRuntime 響應在 X-Amzn-Bedrock-AgentCore-Runtime-Session-Endpoint-Url 頭中攜帶該 URL,建模了該頭的 SDK 將其公開為 sessionEndpointUrl。
每個請求都經過身份驗證。對於使用 AWS Identity and Access Management (IAM) 的執行時,每個 HTTP 請求、HTTP/2 流和 WebSocket 握手都攜帶 Signature Version 4 (SigV4) 簽名。呼叫方還需要在執行時及其執行時端點上具有 bedrock-agentcore:InvokeAgentRuntimeProxy 許可權。對於具有入站 JSON Web Token (JWT) 授權器的執行時,每個請求攜帶持有者令牌。知道 URL 並不授予訪問許可權。
主機名選擇埠。您的客戶端始終透過埠 443 連線,無論目標埠是什麼,主機名上的字首會選擇會話內的埠:
https://8090--.runtime.bedrock-agentcore..on.aws/index.html https://8081--.runtime.bedrock-agentcore..on.aws/status
它承載您的伺服器支援的協議。HTTP/1.1 和 HTTP/2 請求(包括伺服器傳送事件和 gRPC)以及 WebSocket 連線均可透過。本演練使用 HTTP/1.1 和 WebSocket。
它僅作用於一個會話。該 URL 需要在每個請求上提供憑證,並且僅在會話持續期間有效,因此請使用它來構建、測試和審查代理生成的內容。要將應用提供給使用者,請將其部署到託管服務,例如 AWS Amplify Hosting。
瀏覽器無法自行向頁面發出的請求新增 SigV4 簽名或持有者令牌,因此 bedrock-agentcore SDK 中的 Session 端點客戶端可以在您的機器上開啟一個本地端點。您的瀏覽器開啟 http://localhost:8088,本地端點會在將每個請求和 WebSocket 握手轉發之前新增您的憑證。
Session 端點與 AgentCore 執行時已提供的執行時端點不同。使用執行時端點(例如 DEFAULT)來訪問您的代理,它控制呼叫方將訪問哪個版本。InvokeAgentRuntime 呼叫透過它解析,因此您可以將開發和生產保持在不同的版本上,並在不更改呼叫方的情況下進行升級或回滾。使用 Session 端點檢視代理在其會話中執行的內容,例如 Web 預覽。它是一個經過身份驗證的 URL,僅能訪問您允許的埠,可與會話執行的任何版本配合使用,並在會話結束時停止工作。有關完整文件,請參閱“透過會話端點連線到執行時會話”。
解決方案概述
該示例包含四個部分。一個編碼代理在會話中的埠 8080 上執行,並使用四個工具(list、read、write 和 edit)編輯網站檔案。代理在埠 8090 上啟動 Vite 開發伺服器,該伺服器提供網站服務並透過其熱過載 WebSocket 將每個儲存的更改推送到瀏覽器。在您的機器上,PreviewApp 提供預覽頁面,將您的提示傳送到 InvokeAgentRuntime,併為網站開啟一個本地端點。如圖 1 所示,預覽頁面透過本地端點和 Session 端點從埠 8090 上的 Vite 開發伺服器載入網站,並透過 InvokeAgentRuntime 將您的提示傳送到埠 8080 上的代理。數字顯示了單個請求的步驟順序。
圖 1:解決方案架構
在步驟 1 之前,PreviewApp 已經呼叫過一次 InvokeAgentRuntime 來啟動會話,這會啟動代理和 Vite 開發伺服器。PreviewApp 從該響應中讀取 Session 端點 URL,併為埠 8090 開啟一個本地端點。圖 1 中的編號步驟隨後遵循一個更改請求:
預覽頁面的網站窗格從 localhost:8088 上的本地端點載入網站。本地端點將您的憑證新增到每個請求和 WebSocket 握手,並將它們轉發到 Session 端點。Session 端點根據 allowedPorts 檢查簽名和埠,然後將它們轉發到埠 8090 上的 Vite 開發伺服器。頁面保持 Vite 熱過載 WebSocket 開啟。
您從聊天窗格傳送提示。PreviewApp 將其作為使用您的 AWS 憑證簽名的標準 AWS API 呼叫傳送到 InvokeAgentRuntime,執行時將其傳遞到埠 8080 上的代理。代理的步驟在它們工作時流式傳輸回聊天窗格。
代理呼叫 Amazon Bedrock 中的 Claude Haiku 5.5 來決定要更改什麼。
代理讀取網站的檔案並儲存其更改的檔案。Vite 開發伺服器提供這些檔案並監視它們的更改。
當檔案儲存時,Vite 透過步驟 1 中開啟的 WebSocket 推送更改,經過 Session 端點和本地端點返回,網站窗格無需重新整理即可更新。
從筆記本中,PreviewApp 透過同一個 Session 端點讀取代理在埠 8081 上的 /status 路由。只有埠改變。
埠 8080 不在 allowedPorts 中,因為 InvokeAgentRuntime 無需透過 Session 端點即可訪問代理。
先決條件
要跟隨本演練,您需要:
一個位於 AgentCore 執行時 Session 端點可用的 AWS 區域的 AWS 賬戶,並已配置憑證。
建立 IAM 角色、上傳到 Amazon S3 和建立執行時的許可權,以及在執行時及其 DEFAULT 執行時端點上具有 bedrock-agentcore:InvokeAgentRuntime 和 bedrock-agentcore:InvokeAgentRuntimeProxy 許可權。有關詳細資訊,請參閱 AgentCore 執行時的 IAM 許可權。
Python 3.10 或更高版本,以及 bedrock-agentcore 1.25.2 或更高版本和 boto3 1.43.122 或更高版本。
Git(用於克隆示例倉庫)和 Jupyter 環境(例如 JupyterLab 或帶有 Jupyter 擴充套件的 Visual Studio Code)以執行筆記本。
訪問 Amazon Bedrock 中的 Claude Haiku 5.5。有關按區域劃分的模型可用性,請參閱按模型劃分的區域可用性。
Node.js 22 或更高版本以及 npm,部署指令碼使用它們來打包代理和網站。
該示例將代理作為 zip 檔案部署到 Amazon S3 中,並使用 Node.js 的直接程式碼部署,因此您不需要 Docker 或 Amazon ECR 倉庫。Session 端點適用於微虛擬機器執行時,而不適用於 Instances 計算型別,並且 Session 端點 URL 可透過公共 HTTPS 訪問。入站連線不支援 AWS PrivateLink。
部署代理及其網站
首先,您部署執行時,您在此處選擇的配置決定了 Session 端點可以訪問哪些埠。部署指令碼將代理打包到一個檔案中,新增網站及其依賴項以用於執行時的 Linux on Arm64 系統,將 zip 上傳到 Amazon S3,並建立執行時。
deploy.py 中的以下摘錄顯示了本文關注的兩個設定。protocolConfiguration 指定代理監聽 InvokeAgentRuntime 的位置,allowedPorts 列出 Session 端點可以訪問的埠:8090 用於網站,8081 用於代理的狀態路由。埠 8080 不在列表中,因為 InvokeAgentRuntime 無需透過它即可訪問代理。有關埠和路徑設定,請參閱配置代理的服務埠和呼叫路徑。
agentRuntimeArtifact={"codeConfiguration": { "code": {"s3": {"bucket": code_bucket(), "prefix": S3_PREFIX}}, "runtime": "NODE_22", "entryPoint": ["app.js"], }}, protocolConfiguration={"serverProtocol": "HTTP", "port": 8080, "path": "/invocations"}, allowedPorts=[{"port": 8090}, {"port": 8081}],
網站的 Vite 配置使開發伺服器可從 Session 端點訪問。它監聽 0.0.0.0 的埠 8090,並且不限制 Host 頭(server.allowedHosts 為 true),因為請求到達時使用執行時分配的主機名而不是 localhost。Session 端點在請求到達伺服器之前對每個請求進行身份驗證,因此伺服器不需要自己的主機檢查。
要部署執行時:
- 克隆示例倉庫並切換到示例資料夾:
git clone https://github.com/awslabs/agentcore-samples.git cd agentcore-samples/01-features/02-host-your-agent/01-runtime/03-advanced/16-session-endpoints
- 從示例資料夾中開啟 session_endpoints_preview.ipynb。
- 執行安裝單元格,它會安裝 Python 依賴項。
- 執行 %run deploy.py 單元格。部署需要幾分鐘,主要是等待執行時達到 READY 狀態。
開啟預覽
執行時準備就緒後,您開始預覽。一次呼叫完成三件事:啟動會話(啟動網站),為埠 8090 開啟本地端點,並在 localhost:8087 上提供預覽頁面。
from preview_app import PreviewApp
app = PreviewApp().start() print("Open", app.url)
在 start() 內部,使用 Session 端點的呼叫很簡短。第一次 InvokeAgentRuntime 呼叫在響應頭中返回 URL,session_endpoint_url 讀取它,Session 端點客戶端為埠 8090 開啟一個本地端點:
answer = client.invoke_agent_runtime( agentRuntimeArn=runtime_arn, runtimeSessionId=session_id, payload=json.dumps({"prompt": ""}).encode(), contentType="application/json", ) endpoint = client.session_endpoint_client(session_endpoint_url(answer)) local = endpoint.open_local_endpoint(port=8090, local_port=8088).start()
要開啟預覽:
執行啟動 PreviewApp 的單元格。
在瀏覽器中開啟列印的連結 http://localhost:8087。
頁面右側顯示從會話中埠 8090 提供的網站,左側顯示一個簡短指南和建議請求。
要求代理進行更改
現在您要求進行更改並觀察它到達。每個提示都透過 InvokeAgentRuntime 傳送到代理。代理讀取所需的檔案,寫入更改的檔案,並在每個步驟發生時報告。當檔案儲存時,Vite 開發伺服器透過其 WebSocket 推送更改,經過 Session 端點和本地端點,網站就會就地更新。
要請求更改:
在預覽頁面上