View a markdown version of this page

예제 - Amazon Bedrock AgentCore

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

예제

다음 예제에서는 일반적인 인터셉터 사용 사례에 대한 Python AWS Lambda 함수를 보여줍니다.

패스스루 인터셉터

이 예제는 REQUEST 인터셉터에 대한 MCP 메서드를 로깅하고 모든 요청 및 응답을 변경되지 않은 상태로 전달하는 간단한 인터셉터를 보여줍니다.

import json import logging # Configure logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): """ Lambda function that handles both REQUEST and RESPONSE interceptor types. For REQUEST interceptors: logs the MCP method and passes request through unchanged For RESPONSE interceptors: passes response through unchanged """ # Extract the MCP data from the event mcp_data = event.get('mcp', {}) # Check if this is a REQUEST or RESPONSE interceptor based on presence of gatewayResponse if 'gatewayResponse' in mcp_data and mcp_data['gatewayResponse'] != None: # This is a RESPONSE interceptor logger.info("Processing RESPONSE interceptor - passing through unchanged") # Pass through the original request and response unchanged response = { "interceptorOutputVersion": "1.0", "mcp": { "transformedGatewayResponse": { "body": mcp_data.get('gatewayResponse', {}).get('body', {}), "statusCode": mcp_data.get('gatewayResponse', {}).get('statusCode', 200) } } } else: # This is a REQUEST interceptor gateway_request = mcp_data.get('gatewayRequest', {}) request_body = gateway_request.get('body', {}) mcp_method = request_body.get('method', 'unknown') # Log the MCP method logger.info(f"Processing REQUEST interceptor - MCP method: {mcp_method}") # Pass through the original request unchanged response = { "interceptorOutputVersion": "1.0", "mcp": { "transformedGatewayRequest": { "body": request_body, } } } return response

이 Lambda 함수는 REQUEST 및 RESPONSE 인터셉터로 구성할 수 있습니다. REQUEST 인터셉터로 구성된 경우 수신 요청에서 MCP 메서드를 로깅합니다. RESPONSE 인터셉터로 구성된 경우 변경되지 않은 상태로 응답을 전달하기만 하면 됩니다. 두 인터셉터 유형 모두 수정 없이 원본 데이터를 반환하므로 "패스-스루" 인터셉터가 됩니다.

요청 인터셉터를 사용하여 모델 라우팅 사용자 지정

추론 대상의 경우 게이트웨이는 모델 기반 라우팅을 사용하여 model 필드에서 대상을 선택합니다. 게이트웨이가 라우팅을 평가하기 model 전에 REQUEST 인터셉터를 다시 작성할 수 있습니다. 그러면 구성된 단일 모델에 매핑되지 않는 안정적인 별칭인 가상 모델 ID를 지원할 수 있습니다. 인터셉터는 별칭을 형식의 구체적인 대상 한정 ID로 확인{targetName}/{modelId}하므로 호출자는 모델 선택을 중앙에서 제어하는 동안 하나의 이름을 사용합니다.

HTTP 인터셉터 페이로드

추론 대상은 요청 본문이 base64로 인코딩된 문자열인 http 인터셉터 페이로드를 사용합니다. 자세한 내용은 HTTP 대상에 대한 인터셉터를 참조하세요.

다음 REQUEST 인터셉터는 요청 입력의 크기를 기반으로 가상 모델 ID를 특정 Anthropic 모델auto-claude로 확인합니다. 작은 요청의 anthropic/claude-haiku-4-5 경우 , 중간 요청의 anthropic/claude-sonnet-4-6 경우 , 큰 요청anthropic/claude-opus-4-7의 경우 . 호출자는를 전송auto-claude하고 게이트웨이는 각 요청을 anthropic 대상의 확인된 모델로 라우팅합니다. 다른 모델 ID를 사용하는 요청은 변경되지 않고 일반 모델 기반 라우팅을 따릅니다.

import base64 import json import logging logger = logging.getLogger() logger.setLevel(logging.INFO) # The virtual model ID that this interceptor resolves to a concrete # target-qualified ID in the form "{targetName}/{modelId}". VIRTUAL_MODEL = "auto-claude" # Approximate input-size thresholds (in characters) used to choose a model. SONNET_THRESHOLD = 2000 OPUS_THRESHOLD = 8000 def resolve_auto_claude(payload): """Choose an Anthropic model based on the size of the request input.""" input_size = len(json.dumps(payload.get("input", ""))) if input_size >= OPUS_THRESHOLD: return "anthropic/claude-opus-4-7" if input_size >= SONNET_THRESHOLD: return "anthropic/claude-sonnet-4-6" return "anthropic/claude-haiku-4-5" def lambda_handler(event, context): http = event.get("http", {}) request = http.get("gatewayRequest", {}) encoded_body = request.get("body") # Nothing to transform (for example, an empty body) - pass through. if not encoded_body: return {"interceptorOutputVersion": "1.0", "http": {}} try: payload = json.loads(base64.b64decode(encoded_body)) except (ValueError, TypeError) as exc: logger.warning("Passing request through unchanged; could not parse body: %s", exc) return {"interceptorOutputVersion": "1.0", "http": {}} # Only resolve the virtual model ID; let everything else route normally. if not isinstance(payload, dict) or payload.get("model") != VIRTUAL_MODEL: return {"interceptorOutputVersion": "1.0", "http": {}} resolved = resolve_auto_claude(payload) logger.info("Resolved virtual model %s -> %s", VIRTUAL_MODEL, resolved) payload["model"] = resolved encoded = base64.b64encode(json.dumps(payload).encode("utf-8")).decode("utf-8") return { "interceptorOutputVersion": "1.0", "http": { "transformedGatewayRequest": { "body": encoded } }, }

함수를 게이트웨이에 REQUEST 인터셉터로 연결합니다. 지침은 인터셉터 구성을 참조하세요. 게이트웨이 서비스 역할에는 함수를 호출할 수 있는 권한도 있어야 합니다. 자세한 내용은 인터셉터에 대한 권한을 참조하세요.

해결을 보려면 auto-claude별칭을 사용하는 요청을 보냅니다. 인터셉터는 입력 크기를 기반으로 model 구체적인 Anthropic 모델에 다시 쓰고 게이트웨이는 요청을 anthropic 대상의 해당 모델로 라우팅합니다.

awscurl --service bedrock-agentcore --region us-west-2 -X POST \ "https://GATEWAY_ID.gateway.bedrock-agentcore.us-west-2.amazonaws.com/inference/v1/responses" \ -H "Content-Type: application/json" \ -d '{"model": "auto-claude", "input": "Hello!", "max_output_tokens": 50}'