Gestione agentes asíncronos y de larga ejecución con Amazon Bedrock Runtime AgentCore
Amazon Bedrock AgentCore Runtime puede gestionar el procesamiento asíncrono y los agentes de larga ejecución. Las tareas asincrónicas permiten a su agente continuar procesando después de responder al cliente y gestionar las operaciones de larga duración sin bloquear las respuestas. Con el procesamiento asíncrono, su agente puede:
-
Iniciar una tarea que puede tardar minutos u horas
-
Responda inmediatamente al usuario diciendo: «He empezado a trabajar en esto»
-
Continúe procesando en segundo plano
-
Permita que el usuario consulte los resultados más tarde
Conceptos clave
Modelo de procesamiento asíncrono
El AgentCore SDK de Amazon Bedrock admite el procesamiento sincrónico y asíncrono a través de una API unificada. Esto crea un patrón de implementación flexible tanto para los clientes como para los agentes desarrolladores. Los clientes agentes pueden trabajar con la misma API sin diferenciar entre síncronos y asíncronos en el lado del cliente. Gracias a la posibilidad de invocar la misma sesión en todas las invocaciones, los desarrolladores de agentes pueden reutilizar el contexto y aprovechar este contexto de forma incremental sin necesidad de implementar una lógica compleja de administración de tareas.
Administración del ciclo de vida de las sesiones en
El código del agente comunica su estado de procesamiento mediante el estado del punto final «/ping». El /ping punto final debe devolver una respuesta HTTP 200 con la siguiente carga útil JSON:
{"status": "HealthyBusy"}
La respuesta contiene un campo obligatorio y un campo opcional:
-
status(obligatorio): ya sea"Healthy"(inactivo, esperando solicitudes) o"HealthyBusy"(procesando tareas en segundo plano). La plataforma utiliza este campo para determinar si la sesión sigue activa. -
time_of_last_update(opcional): marca de tiempo de Unix en segundos de la última modificación.statusConfigúrala solo en caso de cambio de estado real, no en todos los ping.
Una sesión en estado inactivo ("Healthy") durante 15 minutos finaliza automáticamente. Una sesión que regresa "HealthyBusy" permanece activa después del tiempo de espera de inactividad.
aviso
Si lo incluyestime_of_last_update, no lo pongas en la hora actual en cada ping. Una marca de tiempo que avanza en cada ping indica un cambio de estado continuo, lo que evita que se agote el tiempo de espera de la sesión inactiva. De este modo, las sesiones persisten hasta MaxLifetime agotar la cuota de sesión. Omite el campo (la plataforma registra los cambios de estado por sí misma) o actualízalo solo cuando el estado realmente cambie. Si utilizas el AgentCore SDK de Bedrock, esto se gestiona por ti.
Implementación de tareas asíncronas
Para empezar, instale el paquete: bedrock-agentcore
pip install bedrock-agentcore
AgentCore El SDK proporciona las siguientes opciones para el procesamiento asíncrono de integración.
ejemplo
importante
Asegúrese de que el @app.entrypoint controlador no realice operaciones de bloqueo, ya que esto también podría bloquear el punto final de comprobación de estado /ping. Utilice subprocesos separados o métodos asíncronos para bloquear las operaciones.
Ejemplo completo
Primero, instale el paquete requerido:
pip install strands-agents
A continuación, cree un archivo Python con el siguiente código:
import threading import time from strands import Agent, tool from bedrock_agentcore.runtime import BedrockAgentCoreApp # Initialize app with debug mode for task management app = BedrockAgentCoreApp() @tool def start_background_task(duration: int = 5) -> str: """Start a simple background task that runs for specified duration.""" # Start tracking the async task task_id = app.add_async_task("background_processing", {"duration": duration}) # Run task in background thread def background_work(): time.sleep(duration) # Simulate work app.complete_async_task(task_id) # Mark as complete threading.Thread(target=background_work, daemon=True).start() return f"Started background task (ID: {task_id}) for {duration} seconds. Agent status is now BUSY." # Create agent with the tool agent = Agent(tools=[start_background_task]) @app.entrypoint def main(payload): """Main entrypoint - handles user messages.""" user_message = payload.get("prompt", "Try: start_background_task(3)") return {"message": agent(user_message).message} if __name__ == "__main__": print("🚀 Simple Async Strands Example") print("Test: curl -X POST http://localhost:8080/invocations -H 'Content-Type: application/json' -d '{\"prompt\": \"start a 3 second task\"}'") app.run()
Este ejemplo demuestra lo siguiente:
-
Crear una tarea en segundo plano que se ejecute de forma asíncrona
-
Realizar un seguimiento del estado de la tarea con y
add_async_taskcomplete_async_task -
Responder inmediatamente al usuario mientras continúa el procesamiento
-
Gestionar automáticamente el estado de salud del agente
Problemas y soluciones comunes de
Long-running el agente es despedido después de 15 minutos
Esto puede ocurrir cuando la aplicación tiene un solo subproceso y el subproceso de ping está bloqueado.
-
Compruebe que las llamadas bloqueadas en la ruta de invocación estén en un hilo separado o que no bloqueen de forma asíncrona
-
Ejecute el servidor agente asíncrono localmente y simule los escenarios mientras comprueba el estado del ping.