View a markdown version of this page

Distribuisci AG-UI server in AgentCore Runtime - Amazon Bedrock AgentCore

Distribuisci AG-UI server in AgentCore Runtime

Amazon Bedrock AgentCore Runtime consente di distribuire ed eseguire server Agent User Interface (AG-UI) nel AgentCore Runtime. Questa guida ti guida nella creazione, nel test e nella distribuzione del tuo primo server. AG-UI

In questa sezione, imparerai:

  • In che modo Amazon Bedrock supporta AgentCore AG-UI

  • Come creare un server AG-UI

  • Come testare il server localmente

  • Come installare il server su AWS

  • Come richiamare il server distribuito

Per ulteriori informazioni in merito AG-UI, consulta il contratto di AG-UI protocollo.

In che modo Amazon Bedrock supporta AgentCore AG-UI

Il supporto AgentCore del AG-UI protocollo di Amazon Bedrock consente l'integrazione con i server di interfaccia utente degli agenti fungendo da livello proxy. Una volta configurato per AG-UI, Amazon Bedrock AgentCore prevede che i container eseguano i server sulla porta 8080 /invocations lungo il percorso per HTTP/SSE o /ws per WebSocket le connessioni. Sebbene AG-UI utilizzi la stessa porta e gli stessi percorsi del protocollo HTTP, il runtime li distingue in base al --protocol flag specificato durante la configurazione della distribuzione.

Amazon Bedrock AgentCore funge da proxy tra i client e il AG-UI container. Le richieste provenienti dall'InvokeAgentRuntimeAPI vengono trasferite al contenitore senza modifiche. Amazon Bedrock AgentCore gestisce l'autenticazione (SigV4/OAuth 2.0), l'isolamento delle sessioni e la scalabilità.

Principali differenze rispetto ad altri protocolli:

Porta

AG-UI i server funzionano sulla porta 8080 (come HTTP, rispetto a 8000 per MCP, 9000 per A2A)

Path

AG-UI i server utilizzano /invocations for HTTP/SSE e /ws for WebSocket (come il protocollo HTTP)

Formato del messaggio

Utilizza i flussi di Server-Sent eventi tramite Events (SSE) per lo streaming o WebSocket per la comunicazione bidirezionale

Focus sul protocollo

Agent-to-User interazione (rispetto a MCP per gli strumenti, A2A per gli agenti)

Autenticazione

Supporta schemi di autenticazione SigV4 e OAuth 2.0

Per ulteriori informazioni, consulta https://docs.ag-ui.com/introduction.

AG-UI AgentCore Utilizzo con Runtime

In questo tutorial creerai, testerai e distribuirai un AG-UI server.

Per esempi completi e implementazioni specifiche del framework, consulta Quickstart Documentation e Dojo. AG-UI AG-UI

Prerequisiti

  • Python 3.12 o versioni successive, o Node.js 18+ per TypeScript, installato con una conoscenza di base della lingua scelta

  • Un AWS account con le autorizzazioni appropriate e le credenziali locali configurate

  • Comprensione del AG-UI protocollo e dei concetti di comunicazione tra agenti e utenti basati sugli eventi

Fase 1: Crea il tuo server AG-UI

AG-UI è supportato da più framework di agenti. Scegli il framework più adatto alle tue esigenze. AWS Strands fornisce AG-UI integrazioni di prime parti sia per Python che per. TypeScript

Installazione dei pacchetti obbligatori

Installa pacchetti per Strands con supporto AWS : AG-UI

Esempio
Python
  1. pip install fastapi pip install uvicorn pip install ag-ui-strands
TypeScript
  1. Crea un package.json primo:

    { "name": "my-agui-server", "type": "module", "scripts": { "build": "tsc" }, "dependencies": { "@ag-ui/aws-strands": "^0.1.0", "@strands-agents/sdk": "^1.1.0" }, "devDependencies": { "@types/express": "^5.0.0", "@types/node": "^22.0.0", "tsx": "^4.0.0", "typescript": "^5.0.0" } }

    Quindi installa le dipendenze:

    npm install

Per altri framework, consulta le integrazioni del AG-UI framework.

Crea il tuo primo server AG-UI

Crea il tuo file AG-UI server nella lingua che preferisci. Entrambi gli esempi seguenti producono un server che ascolta sulla porta8080, espone il AG-UI traffico e /invocations /ping i controlli di integrità, il contratto che AgentCore Runtime si aspetta dai container. AG-UI

Esempio
Python
  1. Crea un nuovo file chiamato. my_agui_server.py Questo esempio utilizza AWS Strands con AG-UI:

    # my_agui_server.py import uvicorn from fastapi import FastAPI, Request from fastapi.responses import StreamingResponse, JSONResponse from ag_ui_strands import StrandsAgent from ag_ui.core import RunAgentInput from ag_ui.encoder import EventEncoder from strands import Agent # Create a simple Strands agent strands_agent = Agent( system_prompt="You are a helpful assistant.", ) # Wrap with AG-UI protocol support agui_agent = StrandsAgent( agent=strands_agent, name="my_agent", description="A helpful assistant", ) # FastAPI server app = FastAPI() @app.post("/invocations") async def invocations(input_data: dict, request: Request): """Main AG-UI endpoint that returns event streams.""" accept_header = request.headers.get("accept") encoder = EventEncoder(accept=accept_header) async def event_generator(): run_input = RunAgentInput(**input_data) async for event in agui_agent.run(run_input): yield encoder.encode(event) return StreamingResponse( event_generator(), media_type=encoder.get_content_type() ) @app.get("/ping") async def ping(): return JSONResponse({"status": "Healthy"}) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8080)
TypeScript
  1. Crea un nuovo file chiamatomy-agui-server.ts. Questo esempio utilizza AWS Strands con AG-UI:

    // my-agui-server.ts import { Agent } from "@strands-agents/sdk"; import { StrandsAgent } from "@ag-ui/aws-strands"; import { createStrandsApp } from "@ag-ui/aws-strands/server"; async function main(): Promise<void> { // Create a simple Strands agent const strandsAgent = new Agent({ systemPrompt: "You are a helpful assistant.", }); // Wrap with AG-UI protocol support const aguiAgent = new StrandsAgent({ agent: strandsAgent, name: "my_agent", description: "A helpful assistant", }); // Express app exposing the AgentCore-required paths on port 8080 const app = await createStrandsApp(aguiAgent, { path: "/invocations", pingPath: "/ping", }); app.listen(8080, () => { console.log("AG-UI server running on port 8080"); }); } void main();

Per esempi completi e specifici del framework, vedi:

Comprensione del codice

Stream di eventi

AG-UI utilizza Server-Sent Events (SSE) per trasmettere eventi digitati al client

/invocations Endpoint

Endpoint primario per la HTTP/SSE comunicazione (uguale al protocollo HTTP)

Porta 8080

AG-UI i server vengono eseguiti sulla porta 8080 per impostazione predefinita in Runtime AgentCore

Passaggio 2: verifica il AG-UI server localmente

Esegui e testa il tuo AG-UI server in un ambiente di sviluppo locale.

Avvia il tuo AG-UI server

Esegui il AG-UI server localmente:

Esempio
Python
  1. python my_agui_server.py
TypeScript
  1. npx tsx my-agui-server.ts

Dovresti vedere un output che indica che il server è in esecuzione sulla porta8080.

Testa l’endpoint

Testa l'endpoint SSE con una richiesta AG-UI formattata correttamente:

curl -N -X POST http://localhost:8080/invocations \ -H "Content-Type: application/json" \ -d '{ "threadId": "test-123", "runId": "run-456", "state": {}, "messages": [{"role": "user", "content": "Hello, agent!", "id": "msg-1"}], "tools": [], "context": [], "forwardedProps": {} }'

Dovresti vedere i flussi di AG-UI eventi restituiti in formato SSE, inclusiRUN_STARTED, ed eventi. TEXT_MESSAGE_CONTENT RUN_FINISHED

Fase 3: Implementa il AG-UI server su Bedrock Runtime AgentCore

Implementa il tuo AG-UI server AWS utilizzando lo AgentCore starter toolkit di Amazon Bedrock.

Installa gli strumenti di distribuzione

Installa il toolkit di AgentCore avvio di Amazon Bedrock:

pip install bedrock-agentcore-starter-toolkit

Inizia creando una cartella di progetto con la seguente struttura:

Esempio
Python
  1. ## Project Folder Structure your_project_directory/ ├── my_agui_server.py # Your main agent code ├── requirements.txt # Dependencies for your agent

    Crea un nuovo file chiamato requirements.txt con le tue dipendenze:

    fastapi uvicorn ag-ui-strands
TypeScript
  1. ## Project Folder Structure your_project_directory/ ├── my-agui-server.ts # Your main agent code ├── package.json # Dependencies for your agent └── tsconfig.json # TypeScript compiler configuration

    Crea untsconfig.json:

    { "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "NodeNext", "moduleResolution": "NodeNext", "outDir": "./dist", "strict": true, "esModuleInterop": true }, "include": ["*.ts"] }

Configura il pool di utenti di Cognito per l'autenticazione

Configura l'autenticazione per un accesso sicuro al server distribuito. Per istruzioni dettagliate sulla configurazione di Cognito, consulta Configurare il pool di utenti di Cognito per l'autenticazione. Ciò fornisce i token OAuth necessari per un accesso sicuro al server distribuito.

Configura il tuo server per la distribuzione AG-UI

Dopo aver impostato l'autenticazione, crea la configurazione di distribuzione. Passa il punto di ingresso corrispondente alla lingua che hai usato:

Esempio
Python
  1. agentcore configure -e my_agui_server.py --protocol AGUI
TypeScript
  1. agentcore configure -e my-agui-server.ts --protocol AGUI
  • Seleziona il protocollo come AGUI

  • Configura con la configurazione OAuth come impostato nel passaggio precedente

Esegui la distribuzione su AWS

Implementa il tuo agente:

agentcore deploy

Dopo la distribuzione, riceverai un ARN di runtime dell'agente simile a:

arn:aws:bedrock-agentcore:us-west-2:accountId:runtime/my_agui_server-xyz123

Passaggio 4: richiama il server distribuito AG-UI

Richiama il AgentCore AG-UI server Amazon Bedrock distribuito e interagisci con i flussi di eventi.

Impostazione delle variabili di ambiente

Impostazione delle variabili di ambiente

  1. Esporta il token bearer come variabile di ambiente. Per la configurazione del token bearer, consulta Configurare il pool di utenti di Cognito per l'autenticazione.

    export BEARER_TOKEN="<BEARER_TOKEN>"
  2. Esporta l'ARN dell'agente.

    export AGENT_ARN="arn:aws:bedrock-agentcore:us-west-2:accountId:runtime/my_agui_server-xyz123"

Invoca il server AG-UI

Per richiamare il AG-UI server a livello di codice, scegli la lingua che corrisponde al tuo client:

Esempio
Python
  1. Installa i pacchetti richiesti:

    pip install httpx httpx-sse

    Quindi usa il seguente codice client:

    import asyncio import json import os from urllib.parse import quote from uuid import uuid4 import httpx from httpx_sse import aconnect_sse async def invoke_agui_agent(message: str): agent_arn = os.environ.get('AGENT_ARN') bearer_token = os.environ.get('BEARER_TOKEN') escaped_arn = quote(agent_arn, safe='') url = f"https://bedrock-agentcore.us-west-2.amazonaws.com/runtimes/{escaped_arn}/invocations?qualifier=DEFAULT" headers = { "Authorization": f"Bearer {bearer_token}", "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id": str(uuid4()), } payload = { "threadId": str(uuid4()), "runId": str(uuid4()), "messages": [{"id": str(uuid4()), "role": "user", "content": message}], "state": {}, "tools": [], "context": [], "forwardedProps": {}, } async with httpx.AsyncClient(timeout=300) as client: async with aconnect_sse(client, "POST", url, headers=headers, json=payload) as sse: async for event in sse.aiter_sse(): data = json.loads(event.data) event_type = data.get("type") if event_type == "TEXT_MESSAGE_CONTENT": print(data.get("delta", ""), end="", flush=True) elif event_type == "RUN_ERROR": print(f"Error: {data.get('code')} - {data.get('message')}") asyncio.run(invoke_agui_agent("Hello!"))
TypeScript
  1. Installa i pacchetti richiesti:

    npm install @ag-ui/client

    Quindi usa il seguente codice client:

    import { HttpAgent, AgentSubscriber } from "@ag-ui/client"; import { randomUUID } from "crypto"; async function invokeAguiAgent(message: string): Promise<void> { const agentArn = process.env.AGENT_ARN!; const bearerToken = process.env.BEARER_TOKEN!; const escapedArn = encodeURIComponent(agentArn); const agent = new HttpAgent({ url: `https://bedrock-agentcore.us-west-2.amazonaws.com/runtimes/${escapedArn}/invocations?qualifier=DEFAULT`, headers: { Authorization: `Bearer ${bearerToken}`, "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id": randomUUID(), }, }); agent.messages = [{ id: randomUUID(), role: "user", content: message }]; const subscriber: AgentSubscriber = { onTextMessageContentEvent: ({ event }) => { process.stdout.write(event.delta); }, onRunErrorEvent: ({ event }) => { console.error(`Error: ${event.code ?? "RUN_ERROR"} - ${event.message}`); }, }; await agent.runAgent({}, subscriber); } void invokeAguiAgent("Hello!");

Per creare applicazioni UI complete, consulta CopilotKito l'SDK AG-UI TypeScript del client.

Appendice

Configura il pool di utenti di Cognito per l'autenticazione

Per istruzioni dettagliate sulla configurazione di Cognito, consulta Configurare il pool di utenti Cognito per l'autenticazione nella documentazione MCP. Il processo di configurazione è identico per i server. AG-UI

Risoluzione dei problemi

AG-UI-specific Problemi comuni

Di seguito sono riportati i problemi più comuni che potresti riscontrare:

Conflitti tra porte

AG-UI i server devono essere eseguiti sulla porta 8080 nell'ambiente AgentCore Runtime

Mancata corrispondenza del metodo di autorizzazione

Assicurati che la tua richiesta utilizzi lo stesso metodo di autenticazione (OAuth o SigV4) con cui è stato configurato l'agente

Errori di formato degli eventi

Assicurati che i tuoi eventi seguano le specifiche del AG-UI protocollo. Vedi la documentazione AG-UI sugli eventi