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フィールドからターゲットを選択します。REQUEST インターセプターは、ゲートウェイがルーティングを評価するmodel前に書き換えることができます。これにより、仮想モデル ID をサポートできます。これは、設定された単一のモデルにマッピングされない安定したエイリアスです。インターセプターは、エイリアスを 形式の具体的なターゲット修飾 ID に解決するため{targetName}/{modelId}、発信者はモデルの選択を一元的に制御しながら 1 つの名前を使用します。

HTTP インターセプターペイロード

推論ターゲットはインターhttpセプターペイロードを使用します。この場合、リクエスト本文は base64 でエンコードされた文字列です。詳細については、「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エイリアスを使用するリクエストを送信します。インターセプターは、入力サイズに基づいて具体的な Anthropic モデルmodelに書き換え、ゲートウェイは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}'