Gérez les agents asynchrones et de longue durée avec Amazon Bedrock Runtime AgentCore
Amazon Bedrock AgentCore Runtime peut gérer le traitement asynchrone et les agents de longue durée. Les tâches asynchrones permettent à votre agent de poursuivre le traitement après avoir répondu au client et de gérer les opérations de longue durée sans bloquer les réponses. Grâce au traitement asynchrone, votre agent peut :
-
Démarrez une tâche qui peut prendre des minutes ou des heures
-
Répondez immédiatement à l'utilisateur en disant « J'ai commencé à travailler là-dessus »
-
Poursuivre le traitement en arrière-plan
-
Permettre à l'utilisateur de consulter les résultats ultérieurement
Concepts clés
Modèle de traitement asynchrone
Le AgentCore SDK Amazon Bedrock prend en charge le traitement synchrone et asynchrone via une API unifiée. Cela crée un modèle d'implémentation flexible à la fois pour les clients et les développeurs d'agents. Les clients agents peuvent travailler avec la même API sans faire la différence entre synchrone et asynchrone côté client. Grâce à la possibilité d'invoquer la même session entre les invocations, les développeurs d'agents peuvent réutiliser le contexte et s'appuyer sur ce contexte de manière incrémentielle sans mettre en œuvre une logique de gestion des tâches complexe.
Gestion du cycle de vie des sessions d'exécution
Le code de l'agent communique son état de traitement à l'aide de l'état de santé du point de terminaison « /ping ». Le /ping point de terminaison doit renvoyer une réponse HTTP 200 avec la charge utile JSON suivante :
{"status": "HealthyBusy"}
La réponse contient un champ obligatoire et un champ facultatif :
-
status(obligatoire) : soit"Healthy"(inactif, en attente de demandes), soit"HealthyBusy"(traitement des tâches en arrière-plan). La plateforme utilise ce champ pour déterminer si la session est toujours active. -
time_of_last_update(facultatif) — Horodatage Unix en secondes à compter de lastatusdate de dernière modification. Réglez-le uniquement lors d'un changement de statut réel, pas à chaque ping.
Une session inactive ("Healthy") pendant 15 minutes est automatiquement interrompue. Une session qui revient "HealthyBusy" reste active au-delà du délai d'inactivité.
Avertissement
Si vous l'inclueztime_of_last_update, ne le réglez pas à l'heure actuelle à chaque ping. Un horodatage qui avance à chaque ping indique un changement d'état continu, ce qui empêche le délai d'inactivité de se déclencher. Les sessions persistent alors jusqu'à ce que votre quota de sessions soit épuisé MaxLifetime et peuvent être épuisées. Omettez le champ (la plateforme suit elle-même les changements de statut) ou mettez-le à jour uniquement lorsque le statut change réellement. Si vous utilisez le AgentCore SDK Bedrock, cela est géré pour vous.
Implémentation de tâches asynchrones
Pour commencer, installez le bedrock-agentcore package :
pip install bedrock-agentcore
AgentCore Le SDK fournit les options suivantes pour le traitement asynchrone d'intégration.
Exemple
Important
Assurez-vous que le @app.entrypoint gestionnaire n'effectue pas d'opérations de blocage, car cela pourrait également bloquer le point de terminaison /ping health check. Utilisez des threads séparés ou des méthodes asynchrones pour bloquer les opérations.
Exemple complet
Tout d'abord, installez le package requis :
pip install strands-agents
Créez ensuite un fichier Python avec le code suivant :
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()
Cet exemple montre :
-
Création d'une tâche en arrière-plan qui s'exécute de manière asynchrone
-
Suivi de l'état de la tâche avec
add_async_tasketcomplete_async_task -
Répondre immédiatement à l'utilisateur pendant que le traitement se poursuit
-
Gestion automatique de l'état de santé de l'agent
Problèmes courants et solutions correspondantes
Long-running l'agent est résilié au bout de 15 minutes
Cela peut se produire lorsque l'application est mono-thread et que le thread ping est bloqué.
-
Vérifiez que les appels bloquants dans le chemin d'invocation se trouvent dans un thread distinct ou qu'ils sont asynchrones non bloquants
-
Exécutez le serveur d'agent asynchrone localement et simulez des scénarios tout en vérifiant l'état du ping.