Amazon Bedrock AgentCore 런타임을 사용하여 비동기식 및 장기 실행 에이전트 처리
Amazon Bedrock AgentCore 런타임은 비동기 처리 및 장기 실행 에이전트를 처리할 수 있습니다. 비동기 작업을 사용하면 에이전트가 클라이언트에 응답한 후 계속 처리하고 응답을 차단하지 않고 장기 실행 작업을 처리할 수 있습니다. 비동기 처리를 통해 에이전트는 다음을 수행할 수 있습니다.
-
몇 분 또는 몇 시간이 걸릴 수 있는 작업 시작
-
사용자에게 "이 작업을 시작했습니다"라고 즉시 응답합니다.
-
백그라운드에서 계속 처리
-
사용자가 나중에 결과를 다시 확인하도록 허용
주요 개념
비동기 처리 모델
Amazon Bedrock AgentCore SDK는 통합 API를 통한 동기 및 비동기 처리를 모두 지원합니다. 이렇게 하면 클라이언트와 에이전트 개발자 모두에게 유연한 구현 패턴이 생성됩니다. 에이전트 클라이언트는 클라이언트 측에서 동기식과 비동기식 간에 구분하지 않고 동일한 API로 작업할 수 있습니다. 에이전트 개발자는 호출 간에 동일한 세션을 호출할 수 있으므로 복잡한 작업 관리 로직을 구현하지 않고도 컨텍스트를 재사용하고이 컨텍스트를 점진적으로 구축할 수 있습니다.
런타임 세션 수명 주기 관리
에이전트 코드는 "/ping" 엔드포인트 상태를 사용하여 처리 상태를 전달합니다. /ping 엔드포인트는 다음 JSON 페이로드와 함께 HTTP 200 응답을 반환해야 합니다.
{"status": "HealthyBusy"}
응답에는 필수 필드와 선택적 필드가 포함됩니다.
-
status(필수) -"Healthy"(유휴, 요청 대기 중) 또는"HealthyBusy"(백그라운드 작업 처리 중). 플랫폼은이 필드를 사용하여 세션이 여전히 활성 상태인지 확인합니다. -
time_of_last_update(선택 사항) -status마지막 변경 시간의 초 단위 Unix 타임스탬프입니다. 모든 ping이 아닌 실제 상태 변경에만 설정합니다.
15분 동안 유휴 상태("Healthy")인 세션은 자동으로 종료됩니다. 세션 반환은 유휴 제한 시간 이후에"HealthyBusy"도 유지됩니다.
주의
를 포함하는 경우 모든 ping에서 현재 시간으로 설정하지 time_of_last_update마십시오. 모든 ping에서 진행되는 타임스탬프는 지속적인 상태 변경 신호를 보내 유휴 세션 제한 시간이 실행되지 않도록 합니다. 그러면 세션은 MaxLifetime가 세션 할당량을 소진할 수 있을 때까지 지속됩니다. 필드를 생략하거나(플랫폼은 상태 변경을 자체적으로 추적함) 실제로 상태가 변경될 때만 업데이트합니다. Bedrock AgentCore SDK를 사용하는 경우이 작업이 처리됩니다.
비동기 작업 구현
시작하려면 bedrock-agentcore 패키지를 설치합니다.
pip install bedrock-agentcore
AgentCore SDK는 통합 비동기 처리를 위한 다음 옵션을 제공합니다.
예
중요
/ping 상태 확인 엔드포인트도 차단할 수 있으므로 @app.entrypoint 핸들러가 차단 작업을 수행하지 않는지 확인합니다. 별도의 스레드 또는 비동기 메서드를 사용하여 작업을 차단합니다.
전체 예제
먼저 필요한 패키지를 설치합니다.
pip install strands-agents
그런 다음 다음 코드를 사용하여 Python 파일을 생성합니다.
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()
이 예제는 다음을 보여줍니다.
-
비동기적으로 실행되는 백그라운드 작업 생성
-
add_async_task및를 사용하여 작업 상태 추적complete_async_task -
처리가 계속되는 동안 사용자에게 즉시 응답
-
에이전트 상태 자동 관리
일반적인 문제 및 해결 방법
장기 실행 에이전트는 15분 후에 종료됩니다.
이는 애플리케이션이 단일 스레드이고 ping 스레드가 차단될 때 발생할 수 있습니다.
-
호출 경로의 호출 차단이 별도의 스레드 또는 비차단 비동기화에 있는지 확인
-
ping 상태를 확인하면서 로컬에서 비동기 에이전트 서버를 실행하고 시나리오를 시뮬레이션합니다.