From 065b152ba1b2dfe1527d2fdbfde4725608c412dc Mon Sep 17 00:00:00 2001 From: Vinod Singh Date: Mon, 17 Nov 2025 17:36:24 -0600 Subject: [PATCH 1/5] litellm with agentcore gw is working --- .../04-litellm-gateway.ipynb | 712 ++++++++++++++++++ .../lambda_function_code.zip | Bin 0 -> 659 bytes .../01-runtime-gateway/requirements.txt | 3 +- 3 files changed, 714 insertions(+), 1 deletion(-) create mode 100644 01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb create mode 100644 01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/lambda_function_code.zip diff --git a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb new file mode 100644 index 000000000..612a11497 --- /dev/null +++ b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb @@ -0,0 +1,712 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "4ba51a29-a566-4b5a-97f0-10e634567e40", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "source": [ + "# MCPify your AWS Lambda with Gateway OAuth Inbound\n", + "## Transform AWS Lambda functions into secure MCP tools with Bedrock AgentCore Gateway\n", + "\n", + "## Overview\n", + "Bedrock AgentCore Gateway provides customers a way to turn their existing AWS Lambda functions into fully-managed MCP servers without needing to manage infra or hosting. Gateway will provide a uniform Model Context Protocol (MCP) interface across all these tools. Gateway employs a dual authentication model to ensure secure access control for both incoming requests and outbound connections to target resources. The framework consists of two key components: Inbound Auth, which validates and authorizes users attempting to access gateway targets, and Outbound Auth, which enables the gateway to securely connect to backend resources on behalf of authenticated users. Gateways uses IAM role to authorize the calls to AWS Lambda functions for outbound authorization.\n", + "\n", + "In this example, we will demonstrate OAuth for inbound authorization and IAM roles for outbound authorization.\n", + "\n", + "![How does it work](images/lambda-iam-gateway.png)\n", + "\n", + "### Tutorial Details\n", + "\n", + "\n", + "| Information | Details |\n", + "|:---------------------|:----------------------------------------------------------|\n", + "| Tutorial type | Interactive |\n", + "| AgentCore components | AgentCore Gateway, AgentCore Identity |\n", + "| Agentic Framework | Strands Agents |\n", + "| Gateway Target type | AWS Lambda |\n", + "| Inbound Auth IdP | Amazon Cognito |\n", + "| Outbound Auth | AWS IAM |\n", + "| LLM model | Anthropic Claude Sonnet 3.7, Amazon Nova Pro |\n", + "| Tutorial components | Creating AgentCore Gateway and Invoking AgentCore Gateway |\n", + "| Tutorial vertical | Cross-vertical |\n", + "| Example complexity | Easy |\n", + "| SDK used | boto3 |\n", + "\n", + "In the first part of the tutorial we will create some AmazonCore Gateway targets\n", + "\n", + "### Tutorial Architecture\n", + "In this tutorial we will transform operations defined in AWS lambda function into MCP tools and host it in Bedrock AgentCore Gateway.\n", + "For demonstration purposes, we will use a Strands Agent using Amazon Bedrock models\n", + "In our example we will use a very simple agent with two tools: get_order and update_order." + ] + }, + { + "cell_type": "markdown", + "id": "5362e1ad-f027-4452-a8d9-0b861c0115c2", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "To execute this tutorial you will need:\n", + "* Jupyter notebook (Python kernel)\n", + "* uv\n", + "* AWS credentials\n", + "* Amazon Cognito" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "e93da982-0d11-427c-9958-fff3c80b32f1", + "metadata": {}, + "source": [ + "## Configuring Authentication for Incoming AgentCore Gateway Requests\n", + "AgentCore Gateway provides secure connections via inbound and outbound authentication. For the inbound authentication, the AgentCore Gateway analyzes the OAuth token passed during invocation to decide allow or deny the access to a tool in the gateway. If a tool needs access to external resources, the AgentCore Gateway can use outbound authentication via API Key, IAM or OAuth Token to allow or deny the access to the external resource.\n", + "\n", + "\n", + "\n", + "During the inbound authorization flow, an agent or the MCP client calls an MCP tool in the AgentCore Gateway adding an OAuth access token (generated from the user’s IdP). AgentCore Gateway then validates the OAuth access token and performs inbound authorization.\n", + "\n", + "If the tool running in AgentCore Gateway needs to access external resources, OAuth will retrieve credentials of downstream resources using the resource credential provider for the Gateway target. AgentCore Gateway pass the authorization credentials to the caller to get access to the downstream API. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e326677b-11b5-4488-b01b-573ad275a764", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "opentelemetry-instrumentation-aiopg 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-urllib3 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-urllib3 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-dbapi 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-dbapi 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-urllib 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-urllib 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "aws-opentelemetry-distro 0.12.2 requires opentelemetry-api==1.33.1, but you have opentelemetry-api 1.38.0 which is incompatible.\n", + "aws-opentelemetry-distro 0.12.2 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "aws-opentelemetry-distro 0.12.2 requires opentelemetry-sdk==1.33.1, but you have opentelemetry-sdk 1.38.0 which is incompatible.\n", + "opentelemetry-instrumentation-requests 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-requests 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-flask 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-flask 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-sqlite3 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-exporter-otlp-proto-grpc 1.33.1 requires opentelemetry-sdk~=1.33.1, but you have opentelemetry-sdk 1.38.0 which is incompatible.\n", + "opentelemetry-instrumentation-aio-pika 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-tortoiseorm 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-tortoiseorm 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-remoulade 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-remoulade 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-jinja2 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-django 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-django 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-httpx 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-httpx 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-tornado 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-tornado 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-aiohttp-client 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-aiohttp-client 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-mysqlclient 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-pymongo 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-pymongo 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-botocore 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-botocore 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-elasticsearch 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-elasticsearch 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-logging 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-boto 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-boto 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-asgi 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-asgi 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-starlette 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-starlette 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-distro 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-mysql 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-wsgi 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-wsgi 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-pymemcache 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-pymemcache 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-system-metrics 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-celery 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-celery 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-pika 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-asyncpg 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-asyncpg 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-boto3sqs 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-boto3sqs 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-pymysql 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-kafka-python 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-kafka-python 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-cassandra 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-cassandra 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-redis 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-redis 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-grpc 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-grpc 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-falcon 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-falcon 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-psycopg2 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-exporter-otlp-proto-http 1.33.1 requires opentelemetry-sdk~=1.33.1, but you have opentelemetry-sdk 1.38.0 which is incompatible.\n", + "opentelemetry-instrumentation-fastapi 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-fastapi 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-pyramid 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-pyramid 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-aws-lambda 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-aws-lambda 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-sqlalchemy 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-sqlalchemy 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", + "opentelemetry-instrumentation-confluent-kafka 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "!pip install --force-reinstall -U -r requirements.txt --quiet" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a4e6248d-b740-418b-ae0d-c0a9623e43e1", + "metadata": {}, + "outputs": [], + "source": [ + "# Set AWS credentials if not using Amazon SageMaker notebook\n", + "import os\n", + "# os.environ['AWS_ACCESS_KEY_ID'] = '' # Set the access key\n", + "# os.environ['AWS_SECRET_ACCESS_KEY'] = '' # Set the secret key\n", + "os.environ['AWS_DEFAULT_REGION'] = os.environ.get('AWS_REGION', 'us-east-1') # set the AWS region" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cd5f3851-d0ca-484f-bb41-68f66ddbea44", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "\n", + "# Get the directory of the current script\n", + "if '__file__' in globals():\n", + " current_dir = os.path.dirname(os.path.abspath(__file__))\n", + "else:\n", + " current_dir = os.getcwd() # Fallback if __file__ is not defined (e.g., Jupyter)\n", + "\n", + "# Navigate to the directory containing utils.py (one level up)\n", + "utils_dir = os.path.abspath(os.path.join(current_dir, '../..'))\n", + "\n", + "# Add to sys.path\n", + "sys.path.insert(0, utils_dir)\n", + "\n", + "# Now you can import utils\n", + "import utils" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ddf8bfe9-8435-44cc-9e8a-ed8ece48f6a6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading code from zip file\n", + "Creating IAM role for lambda function\n", + "IAM role gateway_lambda_iamrole already exists. Using the same ARN arn:aws:iam::757120839849:role/gateway_lambda_iamrole\n", + "Creating lambda function\n", + "AWS Lambda function gateway_lambda already exists. Using the same ARN arn:aws:lambda:us-east-1:757120839849:function:gateway_lambda\n", + "Lambda function creation failed with message: arn:aws:lambda:us-east-1:757120839849:function:gateway_lambda\n" + ] + } + ], + "source": [ + "#### Create a sample AWS Lambda function that you want to convert into MCP tools\n", + "lambda_resp = utils.create_gateway_lambda(\"lambda_function_code.zip\")\n", + "\n", + "if lambda_resp is not None:\n", + " if lambda_resp['exit_code'] == 0:\n", + " print(\"Lambda function created with ARN: \", lambda_resp['lambda_function_arn'])\n", + " else:\n", + " print(\"Lambda function creation failed with message: \", lambda_resp['lambda_function_arn'])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9ef17018-d2be-40e3-a892-55dd420297f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Role already exists -- deleting and creating it again\n", + "policies: {'PolicyNames': ['AgentCorePolicy'], 'IsTruncated': False, 'ResponseMetadata': {'RequestId': 'a2aaf3fc-6c03-4099-9274-c1ab3daf6ef5', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Mon, 17 Nov 2025 23:26:21 GMT', 'x-amzn-requestid': 'a2aaf3fc-6c03-4099-9274-c1ab3daf6ef5', 'content-type': 'text/xml', 'content-length': '380'}, 'RetryAttempts': 0}}\n", + "deleting agentcore-sample-lambdagateway-role\n", + "recreating agentcore-sample-lambdagateway-role\n", + "attaching role policy agentcore-sample-lambdagateway-role\n", + "Agentcore gateway role ARN: arn:aws:iam::757120839849:role/agentcore-sample-lambdagateway-role\n" + ] + } + ], + "source": [ + "#### Create an IAM role for the Gateway to assume\n", + "import utils\n", + "agentcore_gateway_iam_role = utils.create_agentcore_gateway_role(\"sample-lambdagateway\")\n", + "print(\"Agentcore gateway role ARN: \", agentcore_gateway_iam_role['Role']['Arn'])" + ] + }, + { + "cell_type": "markdown", + "id": "65120594-c3ec-4d51-810b-8d478851d8d2", + "metadata": {}, + "source": [ + "# Create Amazon Cognito Pool for Inbound authorization to Gateway" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0bbbc736-6f5e-4a60-a598-ead43a0c1f90", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating or retrieving Cognito resources...\n", + "Found domain for user pool us-east-1_mVE1eCmoL: us-east-1mve1ecmol (https://us-east-1mve1ecmol.auth.us-east-1.amazoncognito.com)\n", + "User Pool ID: us-east-1_mVE1eCmoL\n", + "Resource server ensured.\n", + "Client ID: 594pc7cfc0jra2kapmps2em61f\n", + "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_mVE1eCmoL/.well-known/openid-configuration\n" + ] + } + ], + "source": [ + "# Creating Cognito User Pool \n", + "import os\n", + "import boto3\n", + "import requests\n", + "import time\n", + "from botocore.exceptions import ClientError\n", + "\n", + "REGION = os.environ['AWS_DEFAULT_REGION']\n", + "USER_POOL_NAME = \"sample-agentcore-gateway-pool\"\n", + "RESOURCE_SERVER_ID = \"sample-agentcore-gateway-id\"\n", + "RESOURCE_SERVER_NAME = \"sample-agentcore-gateway-name\"\n", + "CLIENT_NAME = \"sample-agentcore-gateway-client\"\n", + "SCOPES = [\n", + " {\"ScopeName\": \"gateway:read\", \"ScopeDescription\": \"Read access\"},\n", + " {\"ScopeName\": \"gateway:write\", \"ScopeDescription\": \"Write access\"}\n", + "]\n", + "scopeString = f\"{RESOURCE_SERVER_ID}/gateway:read {RESOURCE_SERVER_ID}/gateway:write\"\n", + "\n", + "cognito = boto3.client(\"cognito-idp\", region_name=REGION)\n", + "\n", + "print(\"Creating or retrieving Cognito resources...\")\n", + "user_pool_id = utils.get_or_create_user_pool(cognito, USER_POOL_NAME)\n", + "print(f\"User Pool ID: {user_pool_id}\")\n", + "\n", + "utils.get_or_create_resource_server(cognito, user_pool_id, RESOURCE_SERVER_ID, RESOURCE_SERVER_NAME, SCOPES)\n", + "print(\"Resource server ensured.\")\n", + "\n", + "client_id, client_secret = utils.get_or_create_m2m_client(cognito, user_pool_id, CLIENT_NAME, RESOURCE_SERVER_ID)\n", + "print(f\"Client ID: {client_id}\")\n", + "\n", + "# Get discovery URL \n", + "cognito_discovery_url = f'https://cognito-idp.{REGION}.amazonaws.com/{user_pool_id}/.well-known/openid-configuration'\n", + "print(cognito_discovery_url)" + ] + }, + { + "cell_type": "markdown", + "id": "f1a63450-7fb9-42fc-ab4f-3d86c27bb2f8", + "metadata": {}, + "source": [ + "# Create the Gateway with Amazon Cognito Authorizer for inbound authorization" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "72f2cd57-7777-42d3-b6f3-c45ed0a935c4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'ResponseMetadata': {'RequestId': 'fff10c64-587e-4b13-afea-3daf1f5d35b4', 'HTTPStatusCode': 202, 'HTTPHeaders': {'date': 'Mon, 17 Nov 2025 23:26:31 GMT', 'content-type': 'application/json', 'content-length': '815', 'connection': 'keep-alive', 'x-amzn-requestid': 'fff10c64-587e-4b13-afea-3daf1f5d35b4', 'x-amzn-remapped-x-amzn-requestid': '28d95a26-da80-4bde-bc8b-03e8f5a8928c', 'x-amzn-remapped-content-length': '815', 'x-amzn-remapped-connection': 'keep-alive', 'x-amz-apigw-id': 'UNhOLGHNIAMEptA=', 'x-amzn-trace-id': 'Root=1-691baf27-5cbbb8946ee4713471292cef', 'x-amzn-remapped-date': 'Mon, 17 Nov 2025 23:26:31 GMT'}, 'RetryAttempts': 0}, 'gatewayArn': 'arn:aws:bedrock-agentcore:us-east-1:757120839849:gateway/testgwforlambda-pcb4kgki0t', 'gatewayId': 'testgwforlambda-pcb4kgki0t', 'gatewayUrl': 'https://testgwforlambda-pcb4kgki0t.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp', 'createdAt': datetime.datetime(2025, 11, 17, 23, 26, 31, 304180, tzinfo=tzutc()), 'updatedAt': datetime.datetime(2025, 11, 17, 23, 26, 31, 304189, tzinfo=tzutc()), 'status': 'CREATING', 'name': 'TestGWforLambda', 'description': 'AgentCore Gateway with AWS Lambda target type', 'roleArn': 'arn:aws:iam::757120839849:role/agentcore-sample-lambdagateway-role', 'protocolType': 'MCP', 'authorizerType': 'CUSTOM_JWT', 'authorizerConfiguration': {'customJWTAuthorizer': {'discoveryUrl': 'https://cognito-idp.us-east-1.amazonaws.com/us-east-1_mVE1eCmoL/.well-known/openid-configuration', 'allowedClients': ['594pc7cfc0jra2kapmps2em61f']}}, 'workloadIdentityDetails': {}}\n", + "testgwforlambda-pcb4kgki0t\n" + ] + } + ], + "source": [ + "# CreateGateway with Cognito authorizer without CMK. Use the Cognito user pool created in the previous step\n", + "gateway_client = boto3.client('bedrock-agentcore-control', region_name = os.environ['AWS_DEFAULT_REGION'])\n", + "auth_config = {\n", + " \"customJWTAuthorizer\": { \n", + " \"allowedClients\": [client_id], # Client MUST match with the ClientId configured in Cognito. Example: 7rfbikfsm51j2fpaggacgng84g\n", + " \"discoveryUrl\": cognito_discovery_url\n", + " }\n", + "}\n", + "create_response = gateway_client.create_gateway(name='TestGWforLambda',\n", + " roleArn = agentcore_gateway_iam_role['Role']['Arn'], # The IAM Role must have permissions to create/list/get/delete Gateway \n", + " protocolType='MCP',\n", + " authorizerType='CUSTOM_JWT',\n", + " authorizerConfiguration=auth_config, \n", + " description='AgentCore Gateway with AWS Lambda target type'\n", + ")\n", + "print(create_response)\n", + "# Retrieve the GatewayID used for GatewayTarget creation\n", + "gatewayID = create_response[\"gatewayId\"]\n", + "gatewayURL = create_response[\"gatewayUrl\"]\n", + "print(gatewayID)\n", + "time.sleep(10)" + ] + }, + { + "cell_type": "markdown", + "id": "94dc57be-e50e-4997-a440-3bcf582d09bc", + "metadata": {}, + "source": [ + "# Create an AWS Lambda target and transform into MCP tools" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8c1474da-cdd6-4dbd-84e7-3fdad018647d", + "metadata": {}, + "outputs": [], + "source": [ + "# Replace the AWS Lambda function ARN below\n", + "lambda_target_config = {\n", + " \"mcp\": {\n", + " \"lambda\": {\n", + " \"lambdaArn\": lambda_resp['lambda_function_arn'], # Replace this with your AWS Lambda function ARN\n", + " \"toolSchema\": {\n", + " \"inlinePayload\": [\n", + " {\n", + " \"name\": \"get_order_tool\",\n", + " \"description\": \"tool to get the order\",\n", + " \"inputSchema\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"orderId\": {\n", + " \"type\": \"string\"\n", + " }\n", + " },\n", + " \"required\": [\"orderId\"]\n", + " }\n", + " }, \n", + " {\n", + " \"name\": \"update_order_tool\",\n", + " \"description\": \"tool to update the orderId\",\n", + " \"inputSchema\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"orderId\": {\n", + " \"type\": \"string\"\n", + " }\n", + " },\n", + " \"required\": [\"orderId\"]\n", + " }\n", + " }\n", + " ]\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "credential_config = [ \n", + " {\n", + " \"credentialProviderType\" : \"GATEWAY_IAM_ROLE\"\n", + " }\n", + "]\n", + "targetname='LambdaUsingSDK'\n", + "response = gateway_client.create_gateway_target(\n", + " gatewayIdentifier=gatewayID,\n", + " name=targetname,\n", + " description='Lambda Target using SDK',\n", + " targetConfiguration=lambda_target_config,\n", + " credentialProviderConfigurations=credential_config)" + ] + }, + { + "cell_type": "markdown", + "id": "d3ac6532-5299-4024-917d-bcd60caea6ed", + "metadata": {}, + "source": [ + "# Calling Bedrock AgentCore Gateway from a Strands Agent\n", + "\n", + "The Strands agent seamlessly integrates with AWS tools through the Bedrock AgentCore Gateway, which implements the Model Context Protocol (MCP) specification. This integration enables secure, standardized communication between AI agents and AWS services.\n", + "\n", + "At its core, the Bedrock AgentCore Gateway serves as a protocol-compliant Gateway that exposes fundamental MCP APIs: ListTools and InvokeTools. These APIs allow any MCP-compliant client or SDK to discover and interact with available tools in a secure, standardized way. When the Strands agent needs to access AWS services, it communicates with the Gateway using these MCP-standardized endpoints.\n", + "\n", + "The Gateway's implementation adheres strictly to the (MCP Authorization specification)[https://modelcontextprotocol.org/specification/draft/basic/authorization], ensuring robust security and access control. This means that every tool invocation by the Strands agent goes through authorization step, maintaining security while enabling powerful functionality.\n", + "\n", + "For example, when the Strands agent needs to access MCP tools, it first calls ListTools to discover available tools, then uses InvokeTools to execute specific actions. The Gateway handles all the necessary security validations, protocol translations, and service interactions, making the entire process seamless and secure.\n", + "\n", + "This architectural approach means that any client or SDK that implements the MCP specification can interact with AWS services through the Gateway, making it a versatile and future-proof solution for AI agent integrations.\n", + "\n", + "![Strands agent calling Gateway](images/strands-lambda-gateway.png)" + ] + }, + { + "cell_type": "markdown", + "id": "873031fe-62b5-4196-91be-500c1f87dfd4", + "metadata": {}, + "source": [ + "# Request the access token from Amazon Cognito for inbound authorization" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "efbc389b", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "time.sleep(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3ed1d1d6-e84c-4286-bf25-3ad6a49723b9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requesting the access token from Amazon Cognito authorizer...May fail for some time till the domain name propogation completes\n", + "594pc7cfc0jra2kapmps2em61f\n", + "Token response: eyJraWQiOiJNUnNEWmhabU1MYVhUYTl5bFFmZTQ4b2lYUUpzSjBVSjZyRWJ1aDVcL0R4ND0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI1OTRwYzdjZmMwanJhMmthcG1wczJlbTYxZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoic2FtcGxlLWFnZW50Y29yZS1nYXRld2F5LWlkXC9nYXRld2F5OndyaXRlIHNhbXBsZS1hZ2VudGNvcmUtZ2F0ZXdheS1pZFwvZ2F0ZXdheTpyZWFkIiwiYXV0aF90aW1lIjoxNzYzNDIyMDEyLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAudXMtZWFzdC0xLmFtYXpvbmF3cy5jb21cL3VzLWVhc3QtMV9tVkUxZUNtb0wiLCJleHAiOjE3NjM0MjU2MTIsImlhdCI6MTc2MzQyMjAxMiwidmVyc2lvbiI6MiwianRpIjoiZTgyNDdlMjYtNjgyYi00MTlkLTgxZGUtZTJlOGYwNTBmYmI4IiwiY2xpZW50X2lkIjoiNTk0cGM3Y2ZjMGpyYTJrYXBtcHMyZW02MWYifQ.LjOjemEPaqGxblJK0qJsK7BvPK1cZv_kXgUkkOBq5U-xFRBW5AtBWkn_T7FEvZdqA6Gd5B9xK0P25xL-w62aIdlJNGgrQW53OXmzLLapvM1qI0eu2uAgruagFOrns4TfirtqqLwMY641_F95b7Els_E-Sg-fT1ttWgH0d_EGzSYtqlb9npSUm_ojwWdS_ydJ0KAKOCo1JP42BU_BNjeYoVkI818Pl2qKTC8Ixu3uffGDCfZo4CQIvqx--Tq-ks0FAJgrDJDNfhtw9BWrcVRv6I7zhD6mc9iDR9UDs2OV0w2Xum7h6_vOl5mAHhVTat1Xf1uLgRCqeEPFG6kIKkf_TA\n" + ] + } + ], + "source": [ + "print(\"Requesting the access token from Amazon Cognito authorizer...May fail for some time till the domain name propogation completes\")\n", + "token_response = utils.get_token(user_pool_id, client_id, client_secret,scopeString,REGION)\n", + "token = token_response[\"access_token\"]\n", + "print(\"Token response:\", token)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "6fd0379d-9576-43cb-aa9b-72b86c43b472", + "metadata": {}, + "source": [ + "# LiteLLM calling MCP tools of AWS Lambda using Bedrock AgentCore Gateway" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be4b39c4-7387-4ce8-b728-f2347fbdaa36", + "metadata": {}, + "outputs": [], + "source": [ + "import asyncio\n", + "import os\n", + "from litellm.experimental_mcp_client.client import MCPClient\n", + "from mcp.types import CallToolRequestParams" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e64794e7-4e5f-4fc5-824a-61c901e356c4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO | strands.telemetry.metrics | Creating Strands MetricsClient\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tools loaded in the agent are ['LambdaUsingSDK___get_order_tool', 'LambdaUsingSDK___update_order_tool']\n", + " The user has requested a list of all available tools. I should provide this information directly as it is part of the system's capabilities. \n", + "\n", + "Here are the tools available to me:\n", + "\n", + "1. **LambdaUsingSDK___get_order_tool**\n", + " - Description: Tool to get the order.\n", + " - Parameters:\n", + " - `orderId` (string): Property orderId.\n", + " - Required: `orderId`.\n", + "\n", + "2. **LambdaUsingSDK___update_order_tool**\n", + " - Description: Tool to update the orderId.\n", + " - Parameters:\n", + " - `orderId` (string): Property orderId.\n", + " - Required: `orderId`. The user has requested to check the order status for a specific order ID. I should use the `LambdaUsingSDK___get_order_tool` to retrieve the order status. \n", + "\n", + "\n", + "Tool #1: LambdaUsingSDK___get_order_tool\n", + " The tool has returned the order status for order ID 123. I should present this information to the user. \n", + "\n", + "The exact response from the tool is:\n", + "```\n", + "{\n", + " \"statusCode\": 200,\n", + " \"body\": \"Order Id 123 is in shipped status\"\n", + "}\n", + "```\n", + "\n", + "This indicates that the order with ID 123 is currently in the \"shipped\" status.Tool Call result: {\"statusCode\":200,\"body\":\"Order Id 123 is in shipped status\"}\n" + ] + } + ], + "source": [ + "# Initialize LiteLLM MCP client with HTTP transport and Bearer token auth\n", + "client = MCPClient(\n", + " server_url=gatewayURL,\n", + " transport_type=\"http\",\n", + " auth_type=\"bearer_token\",\n", + " auth_value=token,\n", + ")\n", + "\n", + "print(\"MCP Client initialized successfully!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90133bfd", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Connecting to AgentCore Gateway MCP server...\")\n", + "await client.connect()\n", + "print(\"\\n✓ Connected successfully!\")\n", + "print(\"\\nAvailable Tools:\")\n", + "print(\"-\" * 50)\n", + "\n", + "# List all available tools\n", + "tools = await client.list_tools()\n", + "\n", + "if tools:\n", + " for i, tool in enumerate(tools, 1):\n", + " print(f\"\\n{i}. {tool.name}\")\n", + " print(f\" Description: {tool.description}\")\n", + " if hasattr(tool, 'inputSchema'):\n", + " print(f\" Input Schema: {tool.inputSchema}\")\n", + "else:\n", + " print(\"No tools available.\")\n", + "\n", + "print(\"\\n\" + \"-\" * 50)\n", + "print(f\"Total tools: {len(tools)}\")\n", + "\n", + "\n", + "# Call the __get_order_tool with orderId argument\n", + "tool_name = targetname + \"___get_order_tool\"\n", + "\n", + "print(\"\\n\" + \"=\" * 50)\n", + "print(f\"Calling {tool_name} with orderId=123...\")\n", + "print(\"=\" * 50)\n", + "\n", + "# Create the CallToolRequestParams object\n", + "call_params = CallToolRequestParams(\n", + " name=tool_name,\n", + " arguments={\"orderId\": \"123\"}\n", + ")\n", + "\n", + "tool_result = await client.call_tool(call_params)\n", + "\n", + "print(f\"\\nTool Result:\")\n", + "print(f\"{tool_result}\")" + ] + }, + { + "cell_type": "markdown", + "id": "73169486-2fa0-42b5-8a8f-d6bdcc532159", + "metadata": {}, + "source": [ + "**Issue: if you get below error while executing below cell, it indicates incompatibily between pydantic and pydantic-core versions.**\n", + "\n", + "```\n", + "TypeError: model_schema() got an unexpected keyword argument 'generic_origin'\n", + "```\n", + "**How to resolve?**\n", + "\n", + "You will need to make sure you have pydantic==2.7.2 and pydantic-core 2.27.2 that are both compatible. Restart the kernel once done." + ] + }, + { + "cell_type": "markdown", + "id": "fa8dd91d-15a6-45b2-b539-bb3eaf0e0e08", + "metadata": {}, + "source": [ + "# Clean up\n", + "\n", + "Additional resources are also created like IAM role, IAM Policies, Credentials provider, AWS Lambda functions, Cognito user pools, s3 buckets that you might need to manually delete as part of the clean up. This depends on the example you run." + ] + }, + { + "cell_type": "markdown", + "id": "a22f158d-83b6-4d65-892f-9a208af3d742", + "metadata": {}, + "source": [ + "## Delete the gateway (Optional)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c3edc5b6-e5f0-47b9-994f-378415bad50d", + "metadata": {}, + "outputs": [], + "source": [ + "import utils\n", + "#utils.delete_gateway(gateway_client,gatewayID)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/lambda_function_code.zip b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/lambda_function_code.zip new file mode 100644 index 0000000000000000000000000000000000000000..26ac9a2b85dd18cbb71f98e0a42a87f83216e66e GIT binary patch literal 659 zcmWIWW@Zs#U|`^2$Ow8L^|SJE&Ur=#hKtM$4B`wj3^|FpNhyi(X{C9|C7Jno@yYoq zsd@#Kp&^_M%%|^`W}E}!(h6<{MwTByU0{Qz2K#2;b`aS6JDlg0qnW5%VIGsL&~_8e zD@zNbIF5DnmZjwGz9qVQwZ*X?`^&dX%GqAZeKphW-oDDuih);eS^UV`D%EQtrV#n{ zOk|kRQPo+7`xX=lK8dodDV?0c@?|fhyx)V3N6xX#o*rSiVQHR9d)LlAEx9LUQh7N- z>+5mhEC(r7YsKkk=xq;7ra1-|AQULYTb6u5Nn%zPMQP#LV)Jk6QU_E{E>opFdH0 z?*AP(f2=vkA5w9;?7NMRLQPltd-=S1dGGTMbNp+t`}Iin)5FtucOU(F++tp=Q=L=x zO}70DH#)5rt2gb{56aRNUvo%oldGHVtTTacgvvaZ9JzLtpI>m*^pb_5Zaed@-hSPg zfB);234F%0$`-tN@vCypKfR2%omt9Lq~o8>n4|dT$$4hi4>vn{1AOF;st6pcE8uf% zf2QH8DwAv1s&IPK0e9EJX#%fY9&X-WYB6K=!5LgfKbF>{%s3D|VZ}M7lfT4QmZ+9g z^Znevb<(Qfn<7qDZ9dX=Yu>1wTaew;RGT4N+&ee>o?eC6@wZ{7_a{0(Uf5o6{$W-b z@1bq6w}P&icD{&XWk273>Cu0~`n8sy_g?t_=;=irS>a1fxu53rt;kq%NARzIfHxzP t95b#IA^}V}3=F`iXIRn*V&P0LtdR7AmR171S=m6^7=bVrNGmXbcmM=m8d?AV literal 0 HcmV?d00001 diff --git a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/requirements.txt b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/requirements.txt index cf48f7d57..043d67238 100644 --- a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/requirements.txt +++ b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/requirements.txt @@ -4,4 +4,5 @@ uv boto3 bedrock-agentcore bedrock-agentcore-starter-toolkit -mcp \ No newline at end of file +mcp +litellm \ No newline at end of file From 3f582bd3fe1d40eba84bd15cc1133c8c67aeb231 Mon Sep 17 00:00:00 2001 From: Vinod Singh Date: Tue, 18 Nov 2025 14:11:31 -0600 Subject: [PATCH 2/5] ready for review --- .../04-litellm-gateway.ipynb | 284 +++--------------- .../images/litellm-lambda-gateway.png | Bin 0 -> 75863 bytes .../images/litellm-oauth-gateway.png | Bin 0 -> 141152 bytes 3 files changed, 49 insertions(+), 235 deletions(-) create mode 100644 01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/images/litellm-lambda-gateway.png create mode 100644 01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/images/litellm-oauth-gateway.png diff --git a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb index 612a11497..ceb46bd71 100644 --- a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb +++ b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb @@ -11,15 +11,20 @@ } }, "source": [ - "# MCPify your AWS Lambda with Gateway OAuth Inbound\n", - "## Transform AWS Lambda functions into secure MCP tools with Bedrock AgentCore Gateway\n", + "# LiteLLM connecting to Bedrock AgentCore Gateway\n", + "## Calling Bedrock AgentCore Gateway MCP Tools from LiteLLM \n", "\n", "## Overview\n", - "Bedrock AgentCore Gateway provides customers a way to turn their existing AWS Lambda functions into fully-managed MCP servers without needing to manage infra or hosting. Gateway will provide a uniform Model Context Protocol (MCP) interface across all these tools. Gateway employs a dual authentication model to ensure secure access control for both incoming requests and outbound connections to target resources. The framework consists of two key components: Inbound Auth, which validates and authorizes users attempting to access gateway targets, and Outbound Auth, which enables the gateway to securely connect to backend resources on behalf of authenticated users. Gateways uses IAM role to authorize the calls to AWS Lambda functions for outbound authorization.\n", "\n", - "In this example, we will demonstrate OAuth for inbound authorization and IAM roles for outbound authorization.\n", + "[LiteLLM](https://docs.litellm.ai/)is a proxy server and an open-source Python library that acts as a universal API gateway for accessing 100+ large language models from different providers (Bedrock, OpenAI, Anthropic, Azure, Cohere, Mistral, Gemini, Ollama, etc.). It eliminates the need to learn multiple APIs by translating inputs to match each provider's specific requirements.Beyond API unification, LiteLLM provides production-ready features including cost tracking, guardrails, load balancing, failover, rate limiting, caching, logging, and real-time monitoring.This makes it ideal for maintaining provider-agnostic infrastructure while implementing enterprise-grade operational controls in AI applications.\n", "\n", - "![How does it work](images/lambda-iam-gateway.png)\n", + "LiteLLM proxy also serves as a centralized [MCP gateway](https://docs.litellm.ai/docs/mcp) offering unified management of 100+ AI providers through a single interface. Key benefits include enhanced security by addressing MCP's decentralized vulnerabilities, simplified authentication/authorization eliminating duplicate OAuth/RBAC setups, improved scalability preventing configuration drift, and multi-server aggregation for easy administration. Technical advantages include LLM-agnostic support, seamless function calling integration, and protocol bridging capabilities. This creates a robust, secure, and scalable solution that standardizes MCP connections while providing enterprise-grade operational controls for AI integration across multiple servers and clients.\n", + "\n", + "Bedrock AgentCore Gateway provides customers a way to turn their existing AWS Lambda functions into fully-managed MCP servers without needing to manage infra or hosting. Gateway will provide a uniform Model Context Protocol (MCP) interface across all these tools. \n", + "\n", + "In this example, we will demonstrate how to connect LiteLLM proxy with Bedrock AgentCore Gateway using Python SDK. This will use OAuth for Inbound Authentication to connect with Gateway. This tutorial will show MCP List Tools and Call Tool.\n", + "\n", + "![How does it work](images/litellm-oauth-gateway.png)\n", "\n", "### Tutorial Details\n", "\n", @@ -28,22 +33,22 @@ "|:---------------------|:----------------------------------------------------------|\n", "| Tutorial type | Interactive |\n", "| AgentCore components | AgentCore Gateway, AgentCore Identity |\n", - "| Agentic Framework | Strands Agents |\n", + "| MCP components | LiteLLM |\n", "| Gateway Target type | AWS Lambda |\n", "| Inbound Auth IdP | Amazon Cognito |\n", "| Outbound Auth | AWS IAM |\n", "| LLM model | Anthropic Claude Sonnet 3.7, Amazon Nova Pro |\n", - "| Tutorial components | Creating AgentCore Gateway and Invoking AgentCore Gateway |\n", + "| Tutorial components | Creating AgentCore Gateway and Connecting with LiteLLM |\n", "| Tutorial vertical | Cross-vertical |\n", "| Example complexity | Easy |\n", - "| SDK used | boto3 |\n", + "| SDK used | boto3, LiteLLM Python SDK |\n", "\n", "In the first part of the tutorial we will create some AmazonCore Gateway targets\n", "\n", "### Tutorial Architecture\n", "In this tutorial we will transform operations defined in AWS lambda function into MCP tools and host it in Bedrock AgentCore Gateway.\n", - "For demonstration purposes, we will use a Strands Agent using Amazon Bedrock models\n", - "In our example we will use a very simple agent with two tools: get_order and update_order." + "For demonstration purposes, we will use LiteLLM proxy to connect to AgentCore Gateway.\n", + "In our example LiteLLM will call two tools: get_order and update_order." ] }, { @@ -57,7 +62,8 @@ "* Jupyter notebook (Python kernel)\n", "* uv\n", "* AWS credentials\n", - "* Amazon Cognito" + "* Amazon Cognito\n", + "* LiteLLM Python SDK" ] }, { @@ -78,106 +84,17 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "e326677b-11b5-4488-b01b-573ad275a764", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "opentelemetry-instrumentation-aiopg 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-urllib3 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-urllib3 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-dbapi 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-dbapi 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-urllib 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-urllib 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "aws-opentelemetry-distro 0.12.2 requires opentelemetry-api==1.33.1, but you have opentelemetry-api 1.38.0 which is incompatible.\n", - "aws-opentelemetry-distro 0.12.2 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "aws-opentelemetry-distro 0.12.2 requires opentelemetry-sdk==1.33.1, but you have opentelemetry-sdk 1.38.0 which is incompatible.\n", - "opentelemetry-instrumentation-requests 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-requests 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-flask 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-flask 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-sqlite3 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-exporter-otlp-proto-grpc 1.33.1 requires opentelemetry-sdk~=1.33.1, but you have opentelemetry-sdk 1.38.0 which is incompatible.\n", - "opentelemetry-instrumentation-aio-pika 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-tortoiseorm 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-tortoiseorm 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-remoulade 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-remoulade 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-jinja2 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-django 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-django 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-httpx 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-httpx 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-tornado 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-tornado 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-aiohttp-client 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-aiohttp-client 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-mysqlclient 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-pymongo 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-pymongo 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-botocore 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-botocore 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-elasticsearch 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-elasticsearch 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-logging 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-boto 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-boto 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-asgi 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-asgi 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-starlette 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-starlette 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-distro 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-mysql 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-wsgi 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-wsgi 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-pymemcache 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-pymemcache 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-system-metrics 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-celery 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-celery 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-pika 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-asyncpg 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-asyncpg 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-boto3sqs 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-boto3sqs 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-pymysql 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-kafka-python 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-kafka-python 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-cassandra 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-cassandra 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-redis 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-redis 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-grpc 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-grpc 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-falcon 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-falcon 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-psycopg2 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-exporter-otlp-proto-http 1.33.1 requires opentelemetry-sdk~=1.33.1, but you have opentelemetry-sdk 1.38.0 which is incompatible.\n", - "opentelemetry-instrumentation-fastapi 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-fastapi 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-pyramid 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-pyramid 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-aws-lambda 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-aws-lambda 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-sqlalchemy 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-sqlalchemy 0.54b1 requires opentelemetry-semantic-conventions==0.54b1, but you have opentelemetry-semantic-conventions 0.59b0 which is incompatible.\n", - "opentelemetry-instrumentation-confluent-kafka 0.54b1 requires opentelemetry-instrumentation==0.54b1, but you have opentelemetry-instrumentation 0.59b0 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0m" - ] - } - ], + "outputs": [], "source": [ "!pip install --force-reinstall -U -r requirements.txt --quiet" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "a4e6248d-b740-418b-ae0d-c0a9623e43e1", "metadata": {}, "outputs": [], @@ -191,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "cd5f3851-d0ca-484f-bb41-68f66ddbea44", "metadata": {}, "outputs": [], @@ -217,23 +134,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "ddf8bfe9-8435-44cc-9e8a-ed8ece48f6a6", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading code from zip file\n", - "Creating IAM role for lambda function\n", - "IAM role gateway_lambda_iamrole already exists. Using the same ARN arn:aws:iam::757120839849:role/gateway_lambda_iamrole\n", - "Creating lambda function\n", - "AWS Lambda function gateway_lambda already exists. Using the same ARN arn:aws:lambda:us-east-1:757120839849:function:gateway_lambda\n", - "Lambda function creation failed with message: arn:aws:lambda:us-east-1:757120839849:function:gateway_lambda\n" - ] - } - ], + "outputs": [], "source": [ "#### Create a sample AWS Lambda function that you want to convert into MCP tools\n", "lambda_resp = utils.create_gateway_lambda(\"lambda_function_code.zip\")\n", @@ -247,23 +151,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "9ef17018-d2be-40e3-a892-55dd420297f9", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Role already exists -- deleting and creating it again\n", - "policies: {'PolicyNames': ['AgentCorePolicy'], 'IsTruncated': False, 'ResponseMetadata': {'RequestId': 'a2aaf3fc-6c03-4099-9274-c1ab3daf6ef5', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Mon, 17 Nov 2025 23:26:21 GMT', 'x-amzn-requestid': 'a2aaf3fc-6c03-4099-9274-c1ab3daf6ef5', 'content-type': 'text/xml', 'content-length': '380'}, 'RetryAttempts': 0}}\n", - "deleting agentcore-sample-lambdagateway-role\n", - "recreating agentcore-sample-lambdagateway-role\n", - "attaching role policy agentcore-sample-lambdagateway-role\n", - "Agentcore gateway role ARN: arn:aws:iam::757120839849:role/agentcore-sample-lambdagateway-role\n" - ] - } - ], + "outputs": [], "source": [ "#### Create an IAM role for the Gateway to assume\n", "import utils\n", @@ -281,23 +172,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "0bbbc736-6f5e-4a60-a598-ead43a0c1f90", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Creating or retrieving Cognito resources...\n", - "Found domain for user pool us-east-1_mVE1eCmoL: us-east-1mve1ecmol (https://us-east-1mve1ecmol.auth.us-east-1.amazoncognito.com)\n", - "User Pool ID: us-east-1_mVE1eCmoL\n", - "Resource server ensured.\n", - "Client ID: 594pc7cfc0jra2kapmps2em61f\n", - "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_mVE1eCmoL/.well-known/openid-configuration\n" - ] - } - ], + "outputs": [], "source": [ "# Creating Cognito User Pool \n", "import os\n", @@ -344,19 +222,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "72f2cd57-7777-42d3-b6f3-c45ed0a935c4", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'ResponseMetadata': {'RequestId': 'fff10c64-587e-4b13-afea-3daf1f5d35b4', 'HTTPStatusCode': 202, 'HTTPHeaders': {'date': 'Mon, 17 Nov 2025 23:26:31 GMT', 'content-type': 'application/json', 'content-length': '815', 'connection': 'keep-alive', 'x-amzn-requestid': 'fff10c64-587e-4b13-afea-3daf1f5d35b4', 'x-amzn-remapped-x-amzn-requestid': '28d95a26-da80-4bde-bc8b-03e8f5a8928c', 'x-amzn-remapped-content-length': '815', 'x-amzn-remapped-connection': 'keep-alive', 'x-amz-apigw-id': 'UNhOLGHNIAMEptA=', 'x-amzn-trace-id': 'Root=1-691baf27-5cbbb8946ee4713471292cef', 'x-amzn-remapped-date': 'Mon, 17 Nov 2025 23:26:31 GMT'}, 'RetryAttempts': 0}, 'gatewayArn': 'arn:aws:bedrock-agentcore:us-east-1:757120839849:gateway/testgwforlambda-pcb4kgki0t', 'gatewayId': 'testgwforlambda-pcb4kgki0t', 'gatewayUrl': 'https://testgwforlambda-pcb4kgki0t.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp', 'createdAt': datetime.datetime(2025, 11, 17, 23, 26, 31, 304180, tzinfo=tzutc()), 'updatedAt': datetime.datetime(2025, 11, 17, 23, 26, 31, 304189, tzinfo=tzutc()), 'status': 'CREATING', 'name': 'TestGWforLambda', 'description': 'AgentCore Gateway with AWS Lambda target type', 'roleArn': 'arn:aws:iam::757120839849:role/agentcore-sample-lambdagateway-role', 'protocolType': 'MCP', 'authorizerType': 'CUSTOM_JWT', 'authorizerConfiguration': {'customJWTAuthorizer': {'discoveryUrl': 'https://cognito-idp.us-east-1.amazonaws.com/us-east-1_mVE1eCmoL/.well-known/openid-configuration', 'allowedClients': ['594pc7cfc0jra2kapmps2em61f']}}, 'workloadIdentityDetails': {}}\n", - "testgwforlambda-pcb4kgki0t\n" - ] - } - ], + "outputs": [], "source": [ "# CreateGateway with Cognito authorizer without CMK. Use the Cognito user pool created in the previous step\n", "gateway_client = boto3.client('bedrock-agentcore-control', region_name = os.environ['AWS_DEFAULT_REGION'])\n", @@ -366,7 +235,7 @@ " \"discoveryUrl\": cognito_discovery_url\n", " }\n", "}\n", - "create_response = gateway_client.create_gateway(name='TestGWforLambda',\n", + "create_response = gateway_client.create_gateway(name='2TestGWforLambda',\n", " roleArn = agentcore_gateway_iam_role['Role']['Arn'], # The IAM Role must have permissions to create/list/get/delete Gateway \n", " protocolType='MCP',\n", " authorizerType='CUSTOM_JWT',\n", @@ -391,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "8c1474da-cdd6-4dbd-84e7-3fdad018647d", "metadata": {}, "outputs": [], @@ -454,19 +323,19 @@ "id": "d3ac6532-5299-4024-917d-bcd60caea6ed", "metadata": {}, "source": [ - "# Calling Bedrock AgentCore Gateway from a Strands Agent\n", + "# Calling Bedrock AgentCore Gateway from LiteLLM \n", "\n", - "The Strands agent seamlessly integrates with AWS tools through the Bedrock AgentCore Gateway, which implements the Model Context Protocol (MCP) specification. This integration enables secure, standardized communication between AI agents and AWS services.\n", + "The LiteLLM proxy seamlessly integrates with AWS tools through the Bedrock AgentCore Gateway, which implements the Model Context Protocol (MCP) specification. This integration enables secure, standardized communication between LiteLLM (MCP Client)) and Bedrock AgentCore Gateway (MCP Server)\n", "\n", - "At its core, the Bedrock AgentCore Gateway serves as a protocol-compliant Gateway that exposes fundamental MCP APIs: ListTools and InvokeTools. These APIs allow any MCP-compliant client or SDK to discover and interact with available tools in a secure, standardized way. When the Strands agent needs to access AWS services, it communicates with the Gateway using these MCP-standardized endpoints.\n", + "At its core, the Bedrock AgentCore Gateway serves as a protocol-compliant Gateway that exposes fundamental MCP APIs: list_tools and InVokeTool. These APIs allow any MCP-compliant client or SDK to discover and interact with available tools in a secure, standardized way. When the LiteLLM MCP gateway needs to access AWS services, it communicates with the Gateway using these MCP-standardized endpoints.\n", "\n", - "The Gateway's implementation adheres strictly to the (MCP Authorization specification)[https://modelcontextprotocol.org/specification/draft/basic/authorization], ensuring robust security and access control. This means that every tool invocation by the Strands agent goes through authorization step, maintaining security while enabling powerful functionality.\n", + "The Gateway's implementation adheres strictly to the (MCP Authorization specification)[https://modelcontextprotocol.org/specification/draft/basic/authorization], ensuring robust security and access control. This means that every tool invocation by the LiteLLM goes through authorization step, maintaining security while enabling powerful functionality.\n", "\n", - "For example, when the Strands agent needs to access MCP tools, it first calls ListTools to discover available tools, then uses InvokeTools to execute specific actions. The Gateway handles all the necessary security validations, protocol translations, and service interactions, making the entire process seamless and secure.\n", + "For example, when the LiteLLM needs to access MCP tools, it first calls ListTools to discover available tools, then uses CallTool to execute specific actions. The Gateway handles all the necessary security validations, protocol translations, and service interactions, making the entire process seamless and secure.\n", "\n", "This architectural approach means that any client or SDK that implements the MCP specification can interact with AWS services through the Gateway, making it a versatile and future-proof solution for AI agent integrations.\n", "\n", - "![Strands agent calling Gateway](images/strands-lambda-gateway.png)" + "![Strands agent calling Gateway](images/litellm-lambda-gateway.png)" ] }, { @@ -479,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "efbc389b", "metadata": {}, "outputs": [], @@ -490,20 +359,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "3ed1d1d6-e84c-4286-bf25-3ad6a49723b9", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requesting the access token from Amazon Cognito authorizer...May fail for some time till the domain name propogation completes\n", - "594pc7cfc0jra2kapmps2em61f\n", - "Token response: eyJraWQiOiJNUnNEWmhabU1MYVhUYTl5bFFmZTQ4b2lYUUpzSjBVSjZyRWJ1aDVcL0R4ND0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI1OTRwYzdjZmMwanJhMmthcG1wczJlbTYxZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoic2FtcGxlLWFnZW50Y29yZS1nYXRld2F5LWlkXC9nYXRld2F5OndyaXRlIHNhbXBsZS1hZ2VudGNvcmUtZ2F0ZXdheS1pZFwvZ2F0ZXdheTpyZWFkIiwiYXV0aF90aW1lIjoxNzYzNDIyMDEyLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAudXMtZWFzdC0xLmFtYXpvbmF3cy5jb21cL3VzLWVhc3QtMV9tVkUxZUNtb0wiLCJleHAiOjE3NjM0MjU2MTIsImlhdCI6MTc2MzQyMjAxMiwidmVyc2lvbiI6MiwianRpIjoiZTgyNDdlMjYtNjgyYi00MTlkLTgxZGUtZTJlOGYwNTBmYmI4IiwiY2xpZW50X2lkIjoiNTk0cGM3Y2ZjMGpyYTJrYXBtcHMyZW02MWYifQ.LjOjemEPaqGxblJK0qJsK7BvPK1cZv_kXgUkkOBq5U-xFRBW5AtBWkn_T7FEvZdqA6Gd5B9xK0P25xL-w62aIdlJNGgrQW53OXmzLLapvM1qI0eu2uAgruagFOrns4TfirtqqLwMY641_F95b7Els_E-Sg-fT1ttWgH0d_EGzSYtqlb9npSUm_ojwWdS_ydJ0KAKOCo1JP42BU_BNjeYoVkI818Pl2qKTC8Ixu3uffGDCfZo4CQIvqx--Tq-ks0FAJgrDJDNfhtw9BWrcVRv6I7zhD6mc9iDR9UDs2OV0w2Xum7h6_vOl5mAHhVTat1Xf1uLgRCqeEPFG6kIKkf_TA\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Requesting the access token from Amazon Cognito authorizer...May fail for some time till the domain name propogation completes\")\n", "token_response = utils.get_token(user_pool_id, client_id, client_secret,scopeString,REGION)\n", @@ -527,8 +386,6 @@ "metadata": {}, "outputs": [], "source": [ - "import asyncio\n", - "import os\n", "from litellm.experimental_mcp_client.client import MCPClient\n", "from mcp.types import CallToolRequestParams" ] @@ -538,51 +395,7 @@ "execution_count": null, "id": "e64794e7-4e5f-4fc5-824a-61c901e356c4", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO | strands.telemetry.metrics | Creating Strands MetricsClient\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tools loaded in the agent are ['LambdaUsingSDK___get_order_tool', 'LambdaUsingSDK___update_order_tool']\n", - " The user has requested a list of all available tools. I should provide this information directly as it is part of the system's capabilities. \n", - "\n", - "Here are the tools available to me:\n", - "\n", - "1. **LambdaUsingSDK___get_order_tool**\n", - " - Description: Tool to get the order.\n", - " - Parameters:\n", - " - `orderId` (string): Property orderId.\n", - " - Required: `orderId`.\n", - "\n", - "2. **LambdaUsingSDK___update_order_tool**\n", - " - Description: Tool to update the orderId.\n", - " - Parameters:\n", - " - `orderId` (string): Property orderId.\n", - " - Required: `orderId`. The user has requested to check the order status for a specific order ID. I should use the `LambdaUsingSDK___get_order_tool` to retrieve the order status. \n", - "\n", - "\n", - "Tool #1: LambdaUsingSDK___get_order_tool\n", - " The tool has returned the order status for order ID 123. I should present this information to the user. \n", - "\n", - "The exact response from the tool is:\n", - "```\n", - "{\n", - " \"statusCode\": 200,\n", - " \"body\": \"Order Id 123 is in shipped status\"\n", - "}\n", - "```\n", - "\n", - "This indicates that the order with ID 123 is currently in the \"shipped\" status.Tool Call result: {\"statusCode\":200,\"body\":\"Order Id 123 is in shipped status\"}\n" - ] - } - ], + "outputs": [], "source": [ "# Initialize LiteLLM MCP client with HTTP transport and Bearer token auth\n", "client = MCPClient(\n", @@ -590,9 +403,7 @@ " transport_type=\"http\",\n", " auth_type=\"bearer_token\",\n", " auth_value=token,\n", - ")\n", - "\n", - "print(\"MCP Client initialized successfully!\")" + ")" ] }, { @@ -602,7 +413,7 @@ "metadata": {}, "outputs": [], "source": [ - "print(\"Connecting to AgentCore Gateway MCP server...\")\n", + "#Connecting to AgentCore Gateway (MCP Server)\n", "await client.connect()\n", "print(\"\\n✓ Connected successfully!\")\n", "print(\"\\nAvailable Tools:\")\n", @@ -639,8 +450,11 @@ "\n", "tool_result = await client.call_tool(call_params)\n", "\n", - "print(f\"\\nTool Result:\")\n", - "print(f\"{tool_result}\")" + "# Access CallToolResult using dot notation (Pydantic model)\n", + "if tool_result.content and len(tool_result.content) > 0:\n", + " print(f\"Tool Call result: {tool_result.content[0].text}\")\n", + "else:\n", + " print(\"No content in tool result\")" ] }, { @@ -684,7 +498,7 @@ "outputs": [], "source": [ "import utils\n", - "#utils.delete_gateway(gateway_client,gatewayID)" + "utils.delete_gateway(gateway_client,gatewayID)" ] } ], diff --git a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/images/litellm-lambda-gateway.png b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/images/litellm-lambda-gateway.png new file mode 100644 index 0000000000000000000000000000000000000000..baac6f28a414f90570eaf608ce807f7a2e1f1a17 GIT binary patch literal 75863 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 literal 0 HcmV?d00001 diff --git a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/images/litellm-oauth-gateway.png b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/images/litellm-oauth-gateway.png new file mode 100644 index 0000000000000000000000000000000000000000..3d86f99d54db74a7a5aa9b0ac4a07760636a23e9 GIT binary patch literal 141152 zcmeFYbyQSe_Xms!A|O%<3X;+_DBY6MT|){C-JJu9G%84UH$x5GN;gV3(hU+r4e?%{ zUSFSQt@qD&t@r0zv$)=S&bjyOd(Phb^Vy#ps;u}H2a5y?1qB61Mp{A@1qEFe1qF5S z;RE1IZRPnk3JO+%rMS4VjJP53Sw|4W{1CC2}|qK~a=rrp1hySg_wDQOZ48UQvt)`;xgLg@W00AGQ3x2RFT1 z&m$}>l#s#8*4cA16om_2Gc}#t%UeG#J~mMFeUv8w4uU+<(Luj4Ax&!!CBY~e+mUtq zVJu5e++V^d#jqr_Uw4LbT=|BrydD?=B8+q~zXaY!X$u3%-nWxMwgM_}RZ-0d;% zO>J&&nE52T!~;H=RZ@SC=c@z0ax!P}a7tgtUo6M5+HV`btQ|yHJ{Y!{FubSEj8UFp;COO>?E{uXX9j^X^%#jd ze$gY1k5&@Z*$v9I$^>J~WAvOv3gV+b%`E7vK>RNTMa?rNGkCI@f4XiGouHqvo=|!{ zxyBLyUSJ~s>dP}CI;`jr@CU|@7$d7!g9+gYz60!LFTy*SjBqMWwGC}Jxt})@G(K-6 zoedBQ-|KvA)a}5Vf;IGH;}dpAg(J95Ob>mZeg9D@F3%@q2>nv^Z%q$-pGOAohr8pK zaF+yrL(k36G5uLY(|<`nq;bHk4=4$^AK=!8)5dP(&+wL$hM%xKq_+dn;bi>skou77 zkStVUgo-cHU&d#IUzKl*Ve7SJE(BhccW& zmjMxT9Mc^W@tX6w^YgezT4p8kvGU>a=>yhGABvPrRpV8T3rxpW#z@Ds;Ar6cU|ev` zF3B|0bTs@v+{B5KPpREq!JVjQfMFS@;NpQ^v zxA$&exnb`$*wx=L(l9?^exb6d@=PN}t4igQ@_-6VRj`CXMU3$|Lq&{gYz-5cT0{1U zXIhuwy5K^S!ZFDPVi1`D%iGNxP-9cIQ{C6Pfr)7ys>-NLmyQ%2Nk1*I$|8X^h`B~= zOO9(icy-JG0UKAZt0Pf0eo3@n)}8!YLp8d_n&Y zg&(Zrdt+qdqa(UGwX$WR2Q9*)>6z&{t#Yk$w;w-bispQm`l$JFBd9NkrCqT7L3^;& zlb2fAkFrU!XS=jbf*ivR?N*ZM%0o+JqGV!wanz>9hGOg+W~+&6=8 zCFV4P19>%Mw zp;=qPII%EcT`~(>oJyGaZF4#`SDib}2A{W>wM32&Ehs`JEqIK}%qh$bZAHE*ze9V) z&A}${?!_G01b>Rt`KrZ6!kWjxAuc^f{*!!h#bII+wpCWaa)%ypcj8{tFnC$aJ=FQ) zr{r?cUY}cuBXl`$r^~h2)w_$+jE)1B!?01eE_^O|Uc`gf3wFx86MA%V$a1uM7X3CQ8Zud_76BMi9pl*u9NeEVGG3x+xI z2JPf$-9EA7r!|Eip!db)m!&+_DZCWlruHmkU$lJ+GjZ}`??WEaG+4|eM*EHIdF@I(5 zWqv+WVewXuvAL??OFVLxj#Oo+jMpuaYb>ke>^>@YND)GL(wSWeLH#|AEUw7_)6WdSVvb6iOBes zk;9g=FV+l&UQ;2&bxD6caBS~cnri2X@F2Ie=Cq!h%o$VndGg{Z1@zE)ZrJ_H1;viw z5buJA*sX*sM@fAFx>c|3b6W+g*ec0dMB0hK^z{DN!d3VM2t&y-y@Yayx-PDgCtG!%!$z#ak`RYpb+-X^3>A%f}@Ik!WFg2jh^9QI!&MNP{v!UtLp3I+uGo0 z%jjsanh>FRtc=Ke^fV~HPbpDiEKn?X?oqNOZWZU_BwY|C(EU#L$U95p7C<@0MZv2f zc>jI}MO_{B-TO^7lY0-ds2%B1bamyrZEywW%ajr&U!v^dqdohzI3*9djc>T!`W{n+ zbDn=oNT%{o@#1Sv29UaHnrh3KDJY;Y0mlzf?gd+-paDnsfFB9)LqWM86@-ET{3QT> z5*eufyoxTHasQvksEc|F649qUBFP2mg?Fr+6wagCib>$ zMi6^rQ#KDUhYz=ay^}fU6(1iT zi2XI_^=nq31*@~Cor{qNtDW=9zYp@yaU@KgO`I$pTrBPFDDTEKGPZYh5u&EPyV1Y? z{rx#jJuLryCp+hVObeJG= z`#-My`;Pz7Q~TdNUvY48{%6!0{CCa^rZ%|PGav1dL1Acqm9w*sf zFZ`?dd;0gveWCxg^Ie-q-lz|A+i#wr{I5Gu0^RxkzuR4?J?%~Sy}Gjn@A+{p!@V?* zWz4hXa8N^p-_?p;tcIo|b6FF7_T5LExdD#hIb*Ioe!TZ@_)r^yC_H|Bpz%s|op3xJ z;823k55)Ri?-<%$ogd2Je+0X!GBE$e)RZV6xT$|=z<)>~Y_&DUcS}o4gVwZIvl|au zX6Jp8d;7=fw@tbxpSdn+wV;oAf1$W{JvXo08qGfopZwCe-_T#ud^%I_xEt^$`=QVI zQt&?Tysm0_@{ZUn#{Ywx_0%Q zwpBl+23ew-sQ!2#wh9@RM7a@yMUc zbXqM9@+`XW%sG5S_8ZtfYFv$)xL3uiW|(g0K>?vUPQ>2=}v;`?D z!Bh8HTb{|;+2k?LU@|uc!<(b{=)K*(>Pdqgw))j5$QixxA*TDu&$slmpY=R}sm=)_ zccc4`b}NS!C4Ttb9H;MVwO+=mr5bqeRjW7r%zoP_Nd)dNe3@+DQg1lKzXL1ejOB(; zj#?F$to#1{NTJT3W3n8yGz8g4foz%W*3B7-82$j?i zIlI_2m7t&_!vNh#b)UnePx-~lNiUxeDKuu^dULs>=ocY;S&>?fao82MhygRTmkOAwDIz} zM%k_p_57|8j6c=5M(fpO7-Bu1r<*$!J9OZ`ty9UCinX1pvK*cB$7b7vAfC6?wqD!1 z_c7)N49>0D*3QQ9FX zVR!R8Mo07VHs@iXjhY!N=KQ77)~hv;S|?l0l<|Tr*Y23x3z`7o+pFW=Qv8=v=SHV+ zZQ3e~57?llazn{A`%{tIi-=nOePT-iNGjtQu4u;9W_HA!(AnI|gsy#a)2i>HIIhs@ z$#<&94W&isVD;`LY{PT^+M=7w$=3bSy5%t5qV0wb9n}Bk@-{h9KQhH&Ef@upX+|r1 zt$gO;2geZMlrem3Tkoo-nE|a2}=6ks{ zcG|F0x`QX9CavQo-j+Kw+Vnel@v7_kBwu7O{3tGyB#2z;^rdKJl=9_S>us~40l(iO z^h}>;BgOeN99!ThKy{pzIjWB=u;b>bmflZYj{a?p8`)dr;%$S#eqB3AJdNegJqUJ+KAUoxt{e%cW7$MfV|}Zyg9@q>t4&O1SQS^I#EVgj9*M!1hyWMk=+-r#hbmB@%3Cl1%8rIDW< z_}vQ79Lj|@#7d~rM&%xF7nh~+f5G{$&x(omU_MLz$7-$0a+Db+h?piv6AtSqr{5Vp z@I7k`ZGGEWR==LKZ!UsNJiDK$u-Id(P**joD8M&JP43?@{VQBUSbEXtco1)`Gw+>k zQECzk{bLfT>kdMtj>ft3!xc5LQVIP*DFa4}thA}Kt)}Cl9l*Pk&WW!|QJ(jy`%A5X zb_~FyvN42&^#a;}rLKS2)l)IhE4Kb_!w!ANJ1WmnFG;M=S-UX9XsuYU_)yf?U_eVV z^1F_<*spHk(~8Kk=Gz4rQ3_?_hb6TsEq(B#tnngL?f{HyL4(YvGd zdsKvuz zg0)&{Bcj6??9{KSS<3Cw%u@ah^+r#}DDY|14)%rbV351vViIYHpIZCbqnO>on6zncpgowe+hl`HvAvSilFGE4@R_N~{a>PcCo(+z$* zx{F0#n}CZ*VY&r&xtY^|lJ8NpdWyoSI()iajxH=lK1Hsx(-u}GY&Ta&bL+&MpYH3$ zbfE7xovSx80tB{D^_dUr_U+&0^3%MmdL@R`Tc)|8h+;$5#2@2j2I<$k=FuxQQ(nDj z6~2~jj|sz~s`?fKzTvIKZ-*2vQ*UDM;M&5ywH3QT$a+u;ggqd8J z3)}v}zg+-HhuvTEu2TI0;c$%9hz%tS(Cupaelqm9>7 zMX(coP_=~YX|p9{M2C?`-@xZ)A<+tRH^_qn$hZ!pp3h1|ZIQGU>ZY*<)WfEY5Dgrr}xT0>K{ z-h#dDnh_HVR@@*1q|3D>HLE`1wD((|Pjj9yxwZkho8G>Iy?)VaxSjO!eUd?rp=8%Tyx5yYf@hqW z>hC#Ygil8;p7vO!+%v0-I;WvVqG;Cdj$UFMb_FX>Yp#G07hp*7QH$HoPv0tgwmf~KHV3a1{bLKE77{*sTS zd%P?a9RzkjHsEZQx~KoPK&U!E>JXMIKO*)A0Mm(jQz>s!*>21ANcTHSs%pFFV7y5Y z7D<*(mS|L$4{qGRt%2ooM`*9`eQ@97W}ZySr)5j~h#;H!Vw`54{<5f`#v+3yCC`9J zo)h5?OHUx9q3hl{2co&a7sZM3^~lyZAfFnJuGVbL0G2v@){WXQ#KMO_IA9? zcWq@5Wa^~15P51t#&sfqhJ2>t_OMRxRf6AQ6y|p-&-wmcM2yz3Rbqd2SE6~^*8GDQ zIqQ~pgha*`sK!i|r-JN@Z8vkAewl?X_RWYm5$+b>F~2)lAV&gE!vWxrd66E@BrcV1 z9=IFntaw(%+k+Dtnpfzv`uMxgFS_2llwZ9mbSGC$k&iYMmwB6mFhY*oNQ(*Tqhy6P ztV}NV=RU~Ci(J!I6VrTwDOPwzIkQUNi`^7(ACr(ux-JYojAMwm{jCO}td_p(_?RQN ziy#Di{95-+R;)1KQ6-aHtZg)1tj#k!RlDo}RZ_cTCi?SPd8{x^nhCTo1fF+@ihm?KcNQkW%i+-%zGX()Sm=SadUlc>x7MH_C& z^@N!SR>xN5Mh}pwzjzzZ*0>ALVR?m}wF@Nudyv*r+Dd+TvV2^e4;2cK@!^QV%Wrh8 zvLgXiMvSk9g3{tk0UYUT>|T_CMLNAxNS;|Gc3Q}gOvz#y9w0T(Bi0iZSK;t%Bw+2Z zn<9PnB~k4Dy`$$O9+ri;LR66cD*&aw$a0D|V@&Ro6ZR2jFP>DN19l2AaBdpTT+PFC ze-<2SUT-pm`v-Qg&_ccL_L)ug<@jhe`Q`evRR}DUphfy(NAR$NFnXCQXDlEC(l`?4 z^QtRzb9eOc)!M}1^5|a8tX*Mina>)tubIu@msA9fB_S6dPKm9{5BW_wwt7fZiCOc| zaWF%A%u&g+wg;p($`(?`AJ)sB?`!1aaiX0A9@=hdw|4B)GKmaSqCb2PZyTFSWp!0X_+xEwyV@7YlhbVpn!T$cnI!mcl@oOrkjKleo3)rUhdn2sKS61KX^8I>$e|d0~KdyD;4u6Gm zd|haKA?>ybQ@1iyJet$5{yi}GKJ~w3E7a_pVue#vk4_my-kWi4LxpCP7h}pD0cf0$ z79y)x*_MN|R2I{e#~b>DSkFOpTS;uX9am(|{)klJUDY7>>{yK7&kh3NWy}f}y@eb( zGiXBJ2ur`}>>BrjB)AwWty#vU=-UO> zo{vWBU?6r$WVwnU^Api0e_*@}(}#~jm6@yyD6Ti(Vxoc96AcyJFSqjPk(|#}H6`Sz zoi+Uf^+UqUFCQb5>c`}lYZttVInqB2vUKU*bWT`%idhQIHrMkxtm{@dq(Z>j_BY^6 zbyU6T^3AMpz!e@#OV;!R!QxG@l@#8`*uE{Wni%0E(iTrDAKTrg>LF2$e#mISjbJ~F ztTAC$jb#q+!dvz-4IJUUjTAOuYdK%Oxf(~)h&S}DPcN6Ie)nR)Wnp;6cP&<{s}aLi zfBA6QJbmx6;O{pgdjVNVJU zX0E8VY86Wb$y3fTFh{ic#|t+XlB9+?r+&WUuSrQU zu<`F2Sc(_$+)fc_c=ooMR{sD9EZL~RmrtjuNx_EMpq6vvzFNCnD*$aaDpH`Yu5gn= z$oRZYEQo#d7J$bWmcbLLHsYxEHWC)*CXzLUGK6czzD#eWQm>@L*@E}qf&WP@-#{ha zr2rZoJ2Z%A($j`$G#rBpneRGYJ$^5fnGKtPeAk1!XT*ili1+ZtL;5d)f61LcEJ?nT z4qCwIAPCnqgd)llS^O?X)9H33wcuifbg7|%Sy>lV;`|r%W9(aaoU7VI##j}~Of_(q z60Wi2TU9yMSSDFi<7!GH(Bo;rhQ-|?NuAG@7W?p+UytOkB4O47HjNb$!q+to8x#kq9f zWT=Z^KHF;PN0n|E*ph>8tltrU-+?(nkdoF9>=d?XirLY@r!ov9k@FrC$6hd*Si|NE zbIBp|G*78%jYoH@x9z*=!^gAY)dQE$V%MDO`MX^O0j5{K9QA56{bm*Y2kboe1b)@D zm6sePPJ6xx&|ST5yXl;}F@AcX3Ev}fS(HsG6o^81V3mr}29v6BEsoFoAR{?4u4@`Q zq7{g$FR>ykl|%f@u?oNOnZNQ19I7xGh1**YG-w$@xe9ZGruto_G;`wmKYO(UOBM9; z%f~<7qs%+$Kvk+qhn1;(v*vlq;$rCOba$%TjHL{bd5UAuERe3vz3yj;-rb3Ls?d;w zS>ewPTRJ<+CGn>lnDN|5Z8sb2_c|KJ3L>yKg(g;?erC>|o>(ad;#7BXZvzYSom;1$ z6|bN+`VH@AlM9Q>5CjmbFSTYArOsEx8bB`pIx83+GsJk|@Fph9UPH{X$&iA;SoF0L z!}wP?Q}c2dvkx5!oI*lvFVb&*f8UNm>p(=I?(}>mBL6XH`g;JtT5_71JN)pm4`_-?T^3jjBdIV+%K_mnz_TM4wg-rxN<>DtKg%D$ak>@^h2+ z1;A>~$-XQKhGR#0Qcm9eTMn zJWhFG>n-ACct2on#%gBkL=tM+C*8&s9p!i(`6k{?*69UG5m(ZbO#n`Uo9-YFTGJsVGHIMHUI5uAe`>h~@Np;6Pc4Oru&YZ#1B}C^ zLKV*D-P339xS1|edl-!j1HA+-=C)q%CDC1t1AF5n7XpsnH=)(PO1`$TT0*HzkRU;O_D7LpO%qs2C4)?i`oH`6`s-MmVRF; zU#U&%e{Hoct?w!+Z^J6IaaHUjstjwo+%AST00>1mwq~3g@Zs!!peWZvfrF-%;(T2G zyLi6{@++p24*7z9dRKUmxX7hLzbo-v2{Av+Gxi2nhle{}9|y>VV7TeD0{4&7m@?=C z6@{0feP=%z{cYgUB0Uuw5tK%Lt4!w{V5*B~EfYO(3Jq*3I`vpe3!LDm;q>T5wQY!1 z5WW=Z4iMl|pLlQO#$U?hak?1zTCS;Sh}W-V@OO(TyQ!uT8+d%zRbvAnuHAZ~`KkCN zMrGM5kLrz>c;qv^e!Smc^VD%&ly31e+9p};p$C|`;C`{(&=RT2ZdlV%--5rkzvqhy zJ!b`;gQnxI#wb_J%-i#Bkt@UUtG%tQ!!6qKqCtY{N>S)bmBxjP9d;s=;Il z;#RBu(Q2=ZUj0*riM%Fp3-`24vj4(F-=~eVPvicf7yR2pf&b-V&QZj4Xp4+V6+tCu zp&GY^lmlkeeH_F(=uqj#cqPN=9PSZ2JOYz0qUucgWieKu(n|%O7(>%{jC`20!gazQ zl4F&Rmg8jn&gbgQ#F`o>5sqoEmUSZ7@i$OGQe1n!O~0dz`F>hihC#!ycbSuP^|&ey zFR0A=bwOP-6>dE|GS=Mf+%3euOV!x^R8VUkqQVkBNg36r|Ix>@#_1udWkEK~qmsH% z7;SUKAC_Aws#)i0J64S!p5ydUW#1(9)E#S>g`(!qWa~cF4}doTZ9D$xzkTD+a_&E_ z{?&(uyLUuh{BRPeT|lJW7b*y5A+fns=ShOOKV8e>47r6HQ?)kAm7>`?vkG|kfNX=x z>l@&ewG6G}&VWMG&%o)PW2UUk&9@ZLs`Lapc^$%$LWQG7ruc`RqK5zq$xO#Lpf;;_ z@$8*o@;VFd38y<`*cZY`P!;)T{% z5x`x^uW!y;&q`^RcQj3R#6Jj=%mMM_dQLT<;WL@Q1n%f0lvSxfYkJnUHr0E#qPr>i ztAm~!-;`kGS|!e(z)%uZpIflmo@7lErvGv01gP_PzLFF_9^buKPaY1(0m@+#rJFx~ zEhk5%231(|dTmO9VWyJJAD+yGT+u%4!%`N^gW;bM;2Tq{p?6oEdi{5Yc+noA&iB@K}XB>67_kC-GU_`=Yk15gAO7o#y%}3 z(cS=+UPY^7OwX-kbMX0jUcZ6Ym)u1HJ)@g3ryu+g8wl~JPQz@px7HX z93%RlE&g9T24zf*mY<65|5!$EGBDBbWRp>1|BG|}``kaAQomQ8F}Rkr{nM@eqXiw_ z8wOicb@-oL{6BOhGvUBu{Xb*;9Z~+DG5#eXLP7gKWBmWt7@L-2X^`o4w64#j8+Yoe z#W0|ljN5_=&s4%WJ9`6y|m1E zWjyc+FC3a?gEk&OCDEpF-A-}yD^DSLeYC84LdWhqIx&ln%}YW%crV>PkZqlUft2Xh z6;L#MY6MuRxjW+MOopa;HA?R465w=ywOo#uH2?=cpc?{VY606>bgyv&cART z_)5CCEpR*(|Go71-MolcBOqh2bHCGlZKV4xGy_1$?yDrx-z03ex~}6I^YR>nPogyS zwxs@p1l-=`NWW8CN@4__(%|_913p(q2A4TkW0$|PBl9ja$Gmp z?A1e}k^9T-0;iW-{A>@1pnX89$4xpOV|yJGfNZ~`Dcu1n5qEBi4u|df^$Nh-I|IZ{ zX_@NRjUJtyg}$wDVcjYx(xdIXjf~#|Cjbk8TvXNa1-6KWVN3c~qLLy}$L=;_Z!luR(z-a%Z}r+TgxS+3D@|fgebH z5P*YpmaShZcm;x0!fC*$dzHVWaw348qVVrxe#TPU@&VyDgdK#dR}pmm9d9h4uvq zWs||`(@o3>$(KVbPG{TjrzFcEZkITr2YW`)Ys4hz8eq9?_&d*^e-9YRi`S}pZ#FOD z0{ucR#9uE`l;ZZd`pRtb$mXY_d?_Fb9Jy0KoLJTcE$1!|1LVg&u41Bz`%EDp{~5(M zwNY7Dveh-isXBJxU%B zg|o>@>U%5&7Vb&eR3U|`@E_^WMp!}d(;E-HipN@?BSL1Uw_B+^_ipc)iwUqfnLBc? zc0;nVOcAvecZuI0-ojTakuhGz*>;4S@L*ib#G*vv$O60VIM)pX zQ1AQB>Btma$Ihqo(MrNw*Y5L9{j8xP4eHC!NmCv4SF4K`plkaSh;?ELdVC3gcf4Fv z85Zk&fGOdUp`)nVJ`lOyQrf@0Ik=sZp-)|1sk*u2pr-LgXl%7HjlGqWB4+(=ujc{5 z&hGVLuht<@ZlH+5@#w98{Vo8fKLfDjv7nvy%cMvZfvccRUyA+XhG4+2?b`urz~8>( zh!1i%L5S~az7Cl8UsB#Ke|N9+HAK9+0AAoR1%s=SZMX8?48>-pWbtcH0EO(3=HovTg=d;~E0b$ca_EY~>-;i{#Ze5mpMYGf z4iJ^L7a8sY%egm4$?398a3H>rIEhBsQY`fVdf;vMQ<7MLj7OU^i9v$MJZWuvc}ncsDP ztGq1bg!th-j2FK+KiYF|=8EEu-Eo2g^~hA#jm zb?7^~S8{~fT+|7ETD9$u1?m9mdcr(E^ha9<8PzQyq3tnzxjp>u1C01&<%<9t%^@N6 zE)ZXOYc7~w)@O(EdHnJeCj;lSrFW4)3{B7JFCFvNC&MbsE%L4 zxL#;XOfM}^eV5&f))?Ud)HS}HB8V|H#md-o)C&(-E?NZ_! z+BogDNnOHUTW4=KlIZBZBGDD>=-p{%v~oZ$xb_pCu$rASQ5FQ1)R}o|Sg#*44-t8bM5&e2l-3r|O_g)N*X;q78m&f*&Ds_+U-7Xxo5*)XNDB|epHOP%n295s zEM$VO05H&XHZpsE((s~B3oeP=JJ*A`k!_ucpG7+87qdW9Mw=ag0LCJam{Cgq`Q&GP z;mtKbT<)i{p7>-gu33pjJ8vgxhNR;&krC@g?*l}PqU$7A{;_f^KEL6ySo1KBB(h*) zBT2`%664ZFrQhC-bwfdg+w(dT>h%DZ;yL2`E9R&;0k&PxrGNqUPNaKv%@z;Mr-!2w zYCvwMz&i#SXFCo&7~o58jobaeBX_cZf#xV&m@Q}6RW1w3Oh<)|}2S32$MnV_uu zdZ_@y(Lleo>{Yb5oB4`Qk@>FtUpTk=c0GD@Qp`G(tTR2JkTnth8O2F8ygPCg!erT*ft2GN zGB{z%!}$sb;@zA+okKoiCdo8~MhVZLF|-cD>}2V@%y1bK8NR-V=CMp_{zQ9tC-lKy z6koaFD87lR3qI|VL*#-RPm8tO-hM@@`iS5c+ZZNRrwvccfn($odP^dBX~x za{qJ$=uZ78tvMc@2>Qp5qWL_evf|bx|c{XiKpRaxvbVJ>~gWF)PoYFeHGa zoGA0UY!2PYJemI8tK|DyCVO!>Yk1}GpdR{e|Lg{@52#B(qpti8!wm!G|HTqLqx=w8 z!B8FiSv^uR0ru2%p2qJT7ElF^2xp~G@Hr+D_)a286a=@3L1eU`^%u#-$-(2M?kXua z>Qo8~+E#_RO`X{+KOhPa+@pQn#Y;`qqHVIEhn87X;Ik(DSl- zx@W4Mmrf;RhnL%|cCsLBrNgg?#Pc4wLYyy?VI0Nh$J?!d@_(#WK|C5^s^=Q*TD)z# zQI_5#OB93!XX2>%R<@JQVxVr1$Zjd$+3^(0#D`La%a4OaHe ztIgWxIon_4$i%y}+^HLS%N4;Z+dk2;*7X_ATmcH)(=;$my%}s*0t(n}6j==c3qdEP z_T&CGjg7h)cYyEpmPNKRvH7*Q=Uvq7 z74ke{ndRUPLrex6@FC~%elz}4O&%lEXZq>z?J8ndKi{4xHqe-kVoGo+6?&>}Q8Mi9 zS~1_1+1A`w=0LAY>X^}jW9@x1NNz#KV%Tuvcqt2!DHp8OK?HN{u?zS>h*HgNC)6DWB8?4I;quOw(?TeMvfF= zz~Y8%>-2rknrEB#ZuQ4`2HYRM#x*Q%@@R=}#Fl>55&wxyhe5;3H7_J*^UO7_ziiga z_+7F_qz^(8DKI|23uWy?*p#^AqmL^LKd%;yNbcD#QQ?Y`cu54G$bxs_o;?zh3&7WR zOw|tlCk3pCdjE+|KRLPX@wkZ!$?F>8pR3k|LUqCOzLvPJLOb(t!Wk1S62cY%g?N-n zd;G-TTt3{Nor<%<_%%L9h3{+pIvQ;99d3KZEYLwwb`3&nFiV|?mZ}7Ynbnk)4}wF@ zjPA|Hl=wy&9$fi^)VAlc(`@JTqDO}{;2l@ym3T`9x|mI_`XGt4XHUbRL5KLMZy{(W z^XBxu7ChdibKb132>G-S!7(hz5n9%nRfP}D6vlL|F$!*Jk-XKYWT+<2je@0% z-@uDXpZL?lVYrpw$u|j$`D3j?1%))HBdOZwNer4;ns^BEc=wi$$-%qt!!alhc+RgA0Fi3z&TJTD$gx8JH$Iv(lQ#NuTb zc0kX+q444??)H>g=k=?O+v)PlfJUfI7+~IWwUPQV6VsAXyt6`_uk!oVOK%9PWZ_IW zliKABCDkc)`|z%KTEn?k5Y3^#AQDINZbbOO_!2oMaZQO@<$KuaWr^@k7!7AzHu;C%D-yDJo>zLN;o7|-a+PQB&-yZ)ITky z(UT~5t@I^0G}w7Tuk_s9Ke9dz-=@cxz@Ea^Ck7Vr5mCKwNGE^k?Z&Ivk4Z>(K6rkE zpGLggq9qKr9_LNp_42{#DPju%R1eIB<^wv12tl5)nYT>zcGe|leZZPV2tIr|gS1INcf|Wl5Yj!Tk$~qb*e0g|ydOhRG&`nT%3FyBxyzTg|Crxum zXEAvtXlJJywQ`&mC|{tkj6lBqXZ0k*5iKm4eMap~F*>1olk3-QL}mK*fF<=O-VWbp z|A_CrzU&jGfkq&%7KV#JKto%3)j;Q6LG0SfR*d5v%Bn{OHNw5ox=-rPfs>)oV0*)?6z4NHtnR+rmp zl$ywsk@z0_;Z)M*kP*AW%O93w3Vv}T4>=Sz9)Al@(umB}!tYOZTI*+G*BjvJ0DK%$4z-ha1+@m)oW0h+@Pl|pz_eLyx$Yfsask%sN z`ZT58=STPJF(5lCCrvi%_94)WL!!9LX5pm(!lno#rmpIp)fI zJBJInt{f%UoJ_F`byu;iK?`2c4)zfZ2! zosJi2^D(xt)I?}F2oE+`U9tnD=#Cf8pUVav6oRhS`gzeV{AmCARq_vB)GhkOt~CJ$ zzD{u+E(u97wX6KhmL(%!;G^1)s`*V~oN~oMjm(=%GcAz77QW+(vGidE$iHaFrWs#lYy6{D|gmeZ{N=)cb2@XvXM4ZouaG3tJZ`h7&G>YJAf%Jh7FEIba!JV!Lc_^q z5mMdpjq=g>r451KlhA{ElDq+&o|9j<3HR+A4B!-4E-*TuPxHx}XOuUrKe}tOL@DNJ zikLQU@?@;T!gBbf&fN4Du`b^cVL*RjQxtK25~(9AsvWl8%dTTvn>Zfob+TN!2Ha4` z^^@DYZqIIHyFK&;poQcNQ@Co3KbtLViN+USNS8Ra%8WxA_7qRlY@N}|KP--LT$)z0 zV{W@vqfmT81L=c)@h@#;f0euc)QMT0HQ+SBTJ!&5?=7RM?4rJ3MHG-uDd|pW>F(~5 zluqeJX^`&jZrF4yB^{fRmhSHKTw8Cw@8><^9pijFA0EFj9AocmuWPNj)|zXsIe-7r zFDsf7GXWKaDBUbFX2r-?_LYMFS)k^$sHUWCVBMLfg+=cRUwt}$UXPQb4dfCkT|@~K z677*_O8O^0y?Gi+NKv|xe|;@j8El+e#x^|L)-a@`v%aTeN!?2=X3M?`_92;aNHm*&o!;A1YtrQLE-r< zQHQQUflJ6OC@ns#(z#a+Wp=I8*@_xhJ8Gar`f&xrNHCf=sPn{tdf6L9pz3wbTyiGm z>r)YwLws4PHhjyvUTi6s5JB7*l@%2EL((qUYLj%zr4y?vb>p8mcLL1vxJMJYw;WPB;=rJba^RC z^Kw5QS0#z|jHj8L->SQeW-R;CvCpab1LY``J+E|QHb>&8$sK!~viU3(`w5Hkf_%1B zI33q&FlkH&-~w}q^U9_~+yf)}*=E_WGQ#ODB5ul`C5+?!Ly;xv0Z zTyMrwblD}0U3yD})Q$QDV&khI;yWpnK;;DKG6P4@r*UQ^1E@&XWrfOb$nN$^%Vi3- zdfmtmo9dMnyXJi#?n&|zOZ4Ma)B`zT0?wor(R$8&D_)&UOMCq?g~Y^;OY^=A3idG( z1E0h|jXn8ks}xvD4Oru|D9j+bPI7$9?E*f!J}_%=fjjEVpkO``vFxfCzT?AAWkMF$ zi^24<2#asuc2tgts(RFNK4P-w@8V zrjI@ccF&-lR}13{M`?#j30^6M++SR}4HZZbs+J52tnGT$2hXEi8NADEUA}$GXUjX{ zLS)t1txrSh%#S`Wxh`@7E$XfY+chhkBDVNb$oryJc67%8BPnos(47S~AI;-}CnpjL zbUf+J>(bqI=%=7Hde*pvevY57h)$z@W##n_nJ~@i(b6C7&ux%TFPfQUC|IAq5au~A z&v$4X=Gfl6#2U|czJHIQVPp*P6(oz-r^!?UQGn^HAyF1X zgE*Ic{i9G*`0$=?v6j|IkyOUvWj8fM?_&)~PeLGEk*I zQ1~`uuUDcr^TAe~>p~~rqh*z>EJ)#S0TFN%rtLe&`rbyGRB)W~sPVEnG>!;9*lcqs zs%5@J`*;CbM9^CToQ3OwsbkwJZ{by%{wvdcY31ppl~x*H3%EP3*tiehi*C?e&!|{i zWphB7o$-N@3|hjkk_ITZg|>PehRIKo|L&a4#kKAw5+ zl}^BD>Wg!6e{LZ z2-s^`+B(r!rTJNSN?2;#Sby$`I=4>S$^R!g1y?AmJOF%*sp}g_P^86cR#fFLr3v22 zCxWG_o93?7{?_kHUSII}ET%`nRb#?Cp8iBK;%p;Vt_vCnelA@{5$hxh-|M?k>M02R zuolbT-GN73jPQ~QgriMS?C@E~p}Z$$k0*Q~U7-50Dkh!6ub-9L z#r--e-+E~@XzHR%3x#l_srwCnwm^T?_mT~|DJe?(nU1YRE?vAzW)5)%hTK-ZXRPW= zTqH{MXT<)J8mvsJRVK5Bq4Y{!u3aB=>B+yqWICY*pV48z53N)fQD6*RO8h*@GO`C? zGfLcpDGFls^NF737Y+Jq4Hj!fzo0Z*cf(hgoyp=;k-!e;$A!*xv76g>=iSoH_YmN@ zk*qJ%YJfT8Agj>kSxMy^@;@utu92j>>|bqHByKO{2MR8X1N!!l1dBR$6+;`Hj=#cC z68bwK4vd=JBPbQ?oQP9}2%PXT=|&zs+(xO`W(Kii9pp+m5t_Yg8^yBw+3STpL%Brg zy|;GVdLdS=*y8(BJ7jB$FT!LG9CoM2Yd!Hmdmq6MNt}aHP3O2Bd+lj#3*2wF-*O!p z`=eB(9^b!-+ByM-fwTH{+CgRdxncs|{GSjgLYlxJeEx|{Yc)Rwn~t!O&|Bcjtjl7M z;ev!QTS@IzwcmplEs)v@&;3AchHaNr$CDZft)i(-z3szr7ge@$@HNQt@_SV}W#{Gr z{0h%-{WP70Bh65us~qHD5(Uj3(GesetG8G%dG< zNYxzxhv$7=0?YLI#b|CFnt zEAP#0zHV!$$Xk$5+dgQ}lSzzO2F7c+agccr^SN|zXb1F8S zbrxG0B7QkDDwhPu0CiwGv}W1P?*FtLSxaVC*RbY#plpL?pbI>|JP-#}XOTX-RG}NMZ1I_aId{4o8 zVB_;)_UxVE_k_J*l=H8e9j4jsb-#|F*+cG$D|4fF!)h59Jld?Q9Nd+>;YPVQtoz^LOik95{u0$1|8*T*!ZL%1Y?q8!&AoOjIP-W$lt#;sCB1S$=u!R&`ndRpfmIpH5k9gO_#F* zt_(ZY1yvIwN(%kCnZP$iFotkQAb<4bR!M{xT8uyrdGRg(kWAStl#r8M4o%x#`Ghz~ zazkb2ZqBROW5Y^f?Uf#7th5V!Ai83vkut)fX)`b$r#5($? zNZXSjNwmpnecmLOu*)4|e(2YXD|W+dGw1DMP7#2IK?JYZmQ{p!%3mT$=}2JK*KqsJ zuxZW{QUcf6RFP=6*6UWPu^4LfJclSVzgn-p)!nQSR3?dO#Fn4!(u~y!1pH=G$~AnPPinXD+L|x@RxN9i6z4?D_b2qz~bcT;-?cOckvXPV9wIJPluML z=2V%^xDky&(!iaA-oY$T6VoQoV>d0H0|D|ZnO2BQz6EZjJUz?znr(!sz^^XSzHt#w zRb1oXzFArdkwN%v1R4L!OvT&h*Y?UHmC0;*N25q{$;8 z-ciK5OU26@Chba#`FQUdr;n9evqI?TQ)j6<K@LA*iS;gJ}kmPuU*a$IjsiEHW1ytKbj89j6D)7}cM zDEy!|y7bvvB>koLA#4ZEcFcM|nQ8_LZk5HVFn;!^r zSC+6Hu?RA(pqy1F>SZP(A~PmOC8Sd1aYzTpv{mH|RBSc2o{4S=QHe`mn7*Cq^!D(P zk56yNK3mYORdP#?8e=rSd^GSikt`F|)au>X%Rpb18QTHUy^zq;r748SzXhzFB~Sz= z$ZX4i#vds2Y789vAMI(Ik9JZJz9lVp#mE}PTLnFwfXn1!Tx(XPKo!o&ulwp!Fqq%x zZ+rFY2FEt1P^As`+NKgI4`hhjd2}^ z8xjlCtxilF@Qu*gzyfb_paY5&r#7+UY;FiT_#lVL`AU_zCQv#8(ak84!Ypxelz5x7 zY|b_qagQOsXGClOr`z7}bNZ8!o zI($$4u&H3qw*IteYc?lid7orUw%p3_#q5RFe7?g3pFra7!|Tf4=B4@rpy0IMt&q!P z)YL&I=5s?Nm>T1PC-NJP(a~D-DB7RI1v4a{0>rk4L=uk(Dy%qmIl@Xy4ZzjxNstF6 zjL*1ej+lMVqPtopmar=ZrHrXB{Sc=b;g(Bm$S7CWO>xyL-&uQKvp2O%EgcQy7tLu$ z?}U2d8(ok{vuGCgtqNlWt)jqGqXQ6ZhKRd`Exs*Eh3Khh-!ccb+!8uvqwM_FNtoMa zf|;5=_jhsqVC%G#7^Swt=@{8~%C*Lth~cA9WZs_f?Q}Y8^y1etSgLC7_h3;2_gJ(o zDdg{xdie15jG7?z3O^H9bw?U113%GzL?n;LRD}g?!e^)S#DRC(U)^=Z_vF!~IJWJ2 ze)g+yIY_)nIShTt6lrla_SU+UAQAP_v~ucg_%z^j3VCx;=*~F9HjnmwKFW)gle(`7 zXsn83%PETo?rGvFhN3Ry@ViC5h)Pug8ei8XpwDpVMh=EvecP+M6m8qGyVNcB0OHh+ zgvf$3MzCBnM#+U9YPu+-vIQ?OqKq9b9fM_A*6tIid5I?LBOzd%LX=AD8i zHnFrs@0pDm&95T83wIuAx_h@eh=QYn6vxw3Kp;YKq1}~tQgpD2-$PFAZg{#Ha91YJ zQeW?4R&6~)VXS~>I9N|Uy-sF_Ez!CcLA8KJ)cDNg9-ybgBCz22=7ICNJ3i#2vnrq(yz`9Nrg zqA-e(uV;^3i_v*QB>eijv)+uf#4%%Gw)u%))m*^}usbsHd%5FKGcPC#d$JBmc#o`R z_4Ays<|RIUMZ(?0=@x)9!<}1rDcFTT-oA4`+4TURptb@$+vwO>wx25sM@=mYejiDo zT#m;jq4}7#D~*_`^13uYD{_!q@7&%N>-|z9%he=ijPbdLt0ovD%Bbg0J1gv?I>^a_A34*%3VrM;? zl*B-;lEvnZy+=|Xv8y+TmP0SU4Jgm#2EMVR7TbXSVs%rO5X;-1aG-UYvvl^>qjFlo zRR{Srzx1?6p-V4xB&BQ_`KBh0s`9-P?~blIHNpjOk=T%ZjaYm!E8^+2JXsU^4zY(2 zt>&QESo_KhaVFtO2@nG9Ub48^YaEN@Dp;_UrFX&^sujI$o#rcPcog-nS!=a)t1r6X z;ASWUyR&@n^ZIgXGD^RFp1k`?|TXf8h8IRioNsHuN z+-&~GrFst*E1r_Dzam)a@}HKYMvm63;CIgGQ0uwFKfN1+P84*%6eT;TB`Dzib*dV( zfPP^-eWzy0dSR{ub$ZY^Z_{$~av(B3@O?kGe;~X?kr`|Xs)il(@58kK(HC0@A|}s- z^PA(Hy_HF@9}-tz%XKtu#L3#XyMjU4K+p7lS84{Jyk+y0{0bLN0zbZk=H>&~U+y-v z3zE`gm2f%<&2PuE_p23eJmG*|xWCQdBlPy-!`GtgI8E87gTAqi&s37V7yCOinxKyr z=iari>%u(c{Luj^jqbN!Ki5MJ9As!I%j{{JTPJqH=qLXDX2j6fh&xdcW!X6AZirP9 zb6C*75+_X!WcTZVB)67wpj1;sMs6M}U6}mWSY)li5yd%szM2sD6G`~f^?w_H`;@|= zL@fCKR!$}G|LGC_Ut7T9R%Lmfqp=bGd{Q$L?S94}yLh&7qFCuI$ zrw_UMk(5@|wT0K-T!Tn0zvP#f|5h0RyF-+KdcP1%eJF+C@15f%I&7yIiYTfud@kwA z8LKTw6^zb38X`h&Xg!+WowbJqkI}AJGoG51qa?(3LpQB5Yd}f zVDm*fdMvzv?A}}%UxwETJmA3=i1FCCB8uH(7PY~IHqc}_QUdfeX(UNV4J`hbf7|Ob z0${-Ba2_ORf9=>r!db!3i@O!!xL|W}T&;w%UOx5uL`9N9lBD)jlJ#$+KM66k z`L%!!mxSnzJ``-hGck!5zn=En2^5xjlIz+=re9J}?UBHF+G z@C5oL%9otlCuA|d9w4xXTEuETkzwjgNg}&9m4+**?~3|m)x-6Iqx|1G;mWk*|~0oI|Fy2vHb+fFG1l6MD6qUu1%h7#c7s$Yf7_A&>J3MD4?~A6=J4?2;BkF{6e;ldeg~m!CiOD3bz` zJc|(iTG6&EWC>XAVMPIEjDQDPpH?h!OuZ?;k|it#xq^*-Va~T$q<<&V6R2n8z=EXU zi~k$she#R4vChZ6BHaZ~E(|N6-v_s@8Na!R9N3zp@*f{LixlFc8#REbAmel(OEj8- z(UEtsSU5=lB?@`Z(Iw>1>%zEy*A-w^O$q~+N??Ki?AKVxl17>G77#Z9wx{ok($}(d zqRPc{o1ymaVvT>dD403ljJ&FzrsqjlmJ01OSV-z z0++&YYWYmBr~fYaPoRP6lwFIX(*GNPU_lY}+Bvh1qLfn@3HZ&qlrLzdE}VzYtQP}R z{-rC_z6MsH`aNbE1c>FZzyUm-S9;~8EO=6-z|V9-gVge8??hI@B>pqCpZGulmJKgJ z0{6=p5cr-3E+X?eNcjttqDHBj<70ahPU!zf0U~Q0_&Azyu1Rr4k1RMnL~N zivIP(AG7^E=>JE*(gBY)4XHx(S&=64;0Hc^%=^lW^REq>u>-9)L8th=trSTS(R%6& zs$t^55xud3{lJgSt|Ke_w}ZY!p$kyGK4r-IZIn^uQ5Vul;ih=NYQ_f*x_WjWhm_e~ znE!V%*RO)?Q0#UCzd%_&7(S*1RQdJQ1kx+|&!AA=KrOs_`+I%+-SQWHfJNvl6d?RE zMJj25X#=~yThg$#zp1_dnl&qgY*5n|!}#}2J_!iJ8u4ctJ>YWWp)mhDvr(`wfzAth zpazs-fC(Th{bLqp0xKWT0g?hvlv>eGgpahV)r-*oK4_Zj^RfPbjH|+dJ(PEBg3C^C7 zX+0+?K1kA{X)2y5Xz8CQY|=$nyWp^PPu!!w=ufyk`e_1NG+?Zj`<*vu@KLN0z?5-- zJpA{-_4x-Gy7r`nvJQ(nq^ zY;l*tX0rr`w2@yuiYqVpQ!6h7#TKNzoole|%O(X z!d17m*%XY&)ANv*{0;B?AH(p(XA{i~CtGDYeM3~RXTZ6JQB-1{Ggtdp{}R}5U`QR`i{$4MKqmn?bSh)&8X7Sp)n{(em} z=T_Pvd~vRf%4-ATi==>3I?X%#N4>kB>UZsIw7VapEuxT{xbKFHF!|TU+H3EBS-g)k z#RnkyqZvSu@tb!7#9PA-Y6pt>vUT(%6H=~Usx82!9pz0bAT|hyYHTe0DxFUN)H;H+ zQ#`%*|88I;`8!wk4(MJ zp8D|sSFtq}Vsoi!;(Rv5){^>hf8VAexkaY|t`;|^GGff$|8?#f-CnzirRZL}io-Mg z=~5l<#`fK8(5=M^%<+|~Ovs%tKZ8}(uc(xdGkFzo30vq72Gk20M)~e)EgdXM8oEa) zGd;nCq;{@8&#|Z+?*WyEE$3w~7l^(=i{34ybbc11$k2#-T)eBi9df8MfscjXO+c*h}oa_)kG@drkxy6m8x;%gB2yLZ{0~R8tbhsvZ1U}&dZsKdSRNp;g*sY=4I+gQ6s~X!sKvO$E7WOs zZryBUR!)Hg(ZwEtszYbWbjO%jpuhq{Qu#l{;=etC5h9e*0Ke}!Sw8}d^~S+(Cb%+J ze_qWb&iN~Q9G#$3NV2|WnnRGVj%s=RoqNh?Fq-sTrSW+*Ttp<#O@zm7{>*|=&CGs= zlQX(PypA4&9j8}5$79Dp)bpZ!HSy#(+#ruQ^Yn>D5p);I0e9nFqpRKJr4N}JR;UdN zt7nY_mi{>HDH&Xg;nmLPN%5BbfoGObMGCgF(Jy`$bV4BOtS-T|fOc9Hy#jT2QTa>x)l4p~{A>mPoL0B<{)YZFr23eg{001%%WSUQf1 zg)3J8Yu(plJ3D9rxQk1X8hr6T)_5Q)j1aAG%m3pi9^X;}r6;l|wUUX= z;=}9o3~W|QM@KjZ^b%}Ck6!4~nI0Fs9FKJk3#sT7%}a;T74sCDy9d)`Qg(+4t|*SbId2XZ@V7!W?-`$hk@^v91pBDjUD)dG@!Rt-#ofKi_hIA7<+f$Kmbt zGP~W9khWHJnUEEDy+SX0M?<$on#Eg~`KHbJ<-skb+sR@_s0Rl#y#XyUJK)58Bv1W+*u&idp9?!Z~ z5fq8}%U$?)ZQX!uJGkp@3e=2xCN6;z#UI%h7HB`AArvOp?uvus7clTrmP(0tSi50mtc{Npp=4^SEOvzm5%qG40W{Dom~7 zoTBjDO<&q8NKSpC8K3gCXm5vkaJ>4g$y}MDDRJp%U)#xw>(zo)O;hABf28(@!{h~g zlQ*=9g*qmRG*G0n+wo&1UZl-sdq!fVKOS)I!KbTb}?MD9Iy$_^+0JJryuQ~QW zI*tP<0YRu3dJ9}4Z7Ux#jsC!6jLdW2yB}q-rz}@1;zm%}XD4B6 z7*yw_3ob9`mW@KO*(R(iOwWgGa@y|Oj;DhT{ixY*CfA!5NF2iL&%$tw6ACAEB8{1J z5Gds9tkE^ueBwTGBE6eLxUq{z*b5EqXRix4`h7|rCMMF$Bi^s-Lb3rsAua&+Cd&gL zN8gW~0GC4LC3Wkn>N*?Fi%#m4(F{mvqLG}N*nqCtQ4`R$bK*KKi%t+?L2&HN1t2Rj z;036axwrs}e@7$dW>VMPvj>0!k&K4CLCLDoT7opl*wK3T71{d-1bF(>1K*TvXzw=FTOlOc08581$Yval0Bp*B+;zFF%U2`L=`M1k9RxE?*&;5u--K3CXJ+S zn?uB>+La&}oxIj65<69r@=l0E3!@xluIWxDd?~Byr$}vtNELYN{M=nh#UFb4Kh~PD zH&6xjh@weMEuK-QCT3oevbC=-hc&KZN;GX9lP`*7$&TC)Y;!af_%1d@T$W=QTTX1{ zKg5a;Z&F-+->;jn+HMZ-Y7o4&0gw(yJ2)H7vUG@AmP#W;WfGg1>kKuI0BheeQ*;k@ z;;s1X@f}lvhnx$cZ1N^W%KIss(x2P2-%?z;26%rqYc7O+9OON_ggF%Ewkm0msgo=* zlH8@N1-)y#DT@E0^Ag%DM)Km-lR28-8|Ylb7r<#bssNzzdbXMrHVuo;OEeAu!9;!z zEi|xy#B2lL;J5$-Xw4t3B1!f}N(OPEbuv{gxN-oZ7^JMZ;X9xS za4^zO!Qz8fu0X!pBH#+eXp9bkP9XpyD8nk}VS?Djgwg4@ea*EQMA;62?3yD0G)Zi5 z9Uc@`YloOA4z z`#n#V^gwi|jH57hYNwWA#u}X@S+U?1ov^oG-99_2LmXV^DF+wWUuQNp;y9(?Muts# z0#$9Mfb3H5jqf!_o zh36l%`sp~Vz5JQ0#;%qtk>>bqWi6gt;@k%fBvDKn``<9ehbm6I^&0bT;+^PLUgTv- z*5?{-GxJur9%{#{K3=e~S<_#7-ikkGY)?#st4Dj7iu!Qb;?+N+U@|5tho?X4B>Na01A6=t`?DNOoo{&b|LxxEptWe$stS4 zGb{vD;d#f5-Y4+N1)x|aA#-5jcif*QcCc=&1_2t0EefKZFAT%O!*wv~5jZ{oTp_GW zPe8se2?g4*=_7#q9l`+czuBz-e>)JCp3PK8C*7`POXJYB#EM(vIw3`U596t*0ICA? zzkjlR!iELsIEEVIa_}hmzx{H9ldF#g!viJ{;fl$VTrm4|cN@cocse(C0fy~l-9VIp zdcb)RXA-RV&cp87^^-(iNi2$ZXE(bRJT%-&ca_0$DECJqq>ewm(P>gE5@Z33v+C{UzgaWQ>0 zK{fW$7((=Lr;I_V$0L5r4Ytux7Q$T@Kge1RL+(GbCe9~s-6r59E=)b&51FRpE|mX zrSmmNil6E8v-kTkqWmrS(Zrs6e%KBd7 zFdWHj8(}8b%Q`qX_#D57XcC#)UfiS!FpHSD7e<%m=hVi@rgPOP$h!P|#6{;s3=D{_ z9Zx~j)UUjAcSdhRa8daDZc_u`m$?#SKvgb2xE`>hRpeVW9@DcmOjG}!E&og!;E#Yg zv{?5=MjUx@Cq1G|RuwD5E>#TKMs$D@h%G*vBcU?>qVEIaihX0|9XY(v)U)L?i80&B zxN|+1Uh&p=HJPZmP&1W`S)~ z&9S*CT6_{qdjL2ikUbAqD873aknl3J9X#C_gg3@2kVyt_G&8=!@1oE(^c?^E`E$&o z{kg?J61Xm=B)L$6{mNk+%BKO+YO zp-GT?H-|QB0{tD$#LvZ-dESAG+457lIk*>$s3rAkXlk%>@ecAt1>7RgC0Cui5G+o3uUD4`560Fs@B1hv)`8(ZmvLR$=tFf&ld1DiGZnR5Q&cggQK1{ z`OjL=iv=amdlA>T*as2Y90ZVttvwVAcA}DH%^~1bX!&dfv(U#j)y8k8+IUB`h2B6k zZg=N0YUzEMvL&rrSyhjB`b@dDx|v?tD*eJXUE@*99cIJcp?lfN{32hi?tgm2=MY6d z&CNU8)_QX&nS5<_{?1(uTI?AVsZg9R*a4?<--iUY9Y2__ltQ*M{{Em2&uF&9DF$Ah zn3m@||H2h1dofH%xP3A!8i8??h|iQtt|1+3b}27%OdOevd0KvrS;Zo9tNMV<-AHQw zt<8945$e%alvRHkH{}P6ny`YGO0_k-=q%A}8>i`_TrV|r-J>`70=}1t3BrR|pBL}< zPA9ciyT|Ucdx4-^VR=8v$>?mXyi=G@86(HF~_ip}U;@yf{J#fM0a)n)?TI@sRDG(MXk#UwEIa_MEm~wT-G> z?Ch&80eT44-}nyi4!wDu?HBPaubUGpME|Td`jbRo);}LI5>f+H3vqr6fAK~77(IzI zFCpqPUyUSAhk|{;A3+NjlV(G0KhkP;G+!Y==OAz#6AZAVw-WobBoAmysb;SN&bCTU z?WaI2F)s;5VdHxG`fTo6Q)FoO0W z?;DG=D=n<#3=vEr7v`kt7kf#g$?iy2G5gs<38UeSecZIv;+8ePZKG{YOk!(dSL1Zg zGUt25O}-GV$UL{Nfjrmxy@Gh}^0WQ(vExLj;pEmf`|gSmJRHz2^TSRjiM>!OC-DSh zD5+#?aJnsqB`weFZ;riddi=W81o?Zv;J`!4k)BT4`&s3^8Oyn692 z)1wW-zH3C+x-j;!$!VZerD3xB7O)Xi{5Yr4)zEP_arw_reg2|A`ejT25Nz|cnyW1y zR5>4kh%7ZvHZelH@utf;%SBb~xSNdCqTC3y`bG1?^yY;QfZPe_+r4qVfrupK4}Z{k zvk-MbW|%}qv8$pCjp0)+{AC5b!6wZ6sz90-+4G*+Kg-~yBE{F_rv_$doPzYXbAiq~ zpHjWFrzs_kKFWWoP76to+Is!q_Q^J{bW{O|0h80}+y!5ozeqIrX_y zuRgjd-PVv(iht&)S^#>ho|3zkV#Lo?mCdOpSLOmxz}i(7%RdU zPQWDIJfT1o=GERrmNb4#Gc|6H?lBe0s-}w!W+TR;?SeJ(c}k_&|LIM5ep^gm;ClKL zTyCeVLp63`w_1yK(=_cr?h*+!gdA#aZq7t&Xis8d&;dZ!nt79km*#+yCW?L|uwK3ySO7clE6H2q$UMOLwuy4veMX-I{3=)iO`S_fbGpo6DI&CPurDd z#^)R>Hvps6iCB2?;Rq0mwxg9=gf4B-k>3~(ww2$T^7uPgX2PGA7<$O4XIz0Zi`9kF z%}vI~qn-RSKx4w{!c~~<$yCid(n#RYt6x+wZine}@X`mBSc;R{KYN|<>+VU(*>M(@ zQ5Fo@`)4uiZB6&Ql0Sqq`LUxeT@flS_u0-(rl&Z=>0M4M6N1=`N^~Tj;KV~|;PsTd zp=9l-D4~703$3e@Y;M!^3^6(RmP+1DI!iL{NE?AgEzQxtuAoK%Q=_ycD-m8RDOw;& za^enGTlq?_1X1}d&38GZ$)-)7w=oLw1t;*HvmT|!=qYFet%N1YCay|=$v}KIYzNrJ z#Y5mko@9egH5=}A8k<=w8oL33K~leKi4_<>*byeYje^w1QB0e8d9^8490L5<=Tqj{ zxurh{{9X=oEV*_$HCRSVrZ+yGvhu6IIBEZRT@OGUtzbS zEqgE_d`bb9R|EzqBdVZ92^V`qX(29kK6KOAcm&~QC^$?siRsD7X_}`+TFk)SPdw39 zI-yoMKQdZ#_v6bY!JtYKZaghb6FWgGg=T+CvK8*^PWGe^9&dcEAertSSC-HjJ?*p>80rLQi(jnUu(9`aNa3rxRG69I^EU=7`1$W4zQ_5k)lmY*7UhyvO z1bBip?B=L<J7!)sHu$AF*f{Ac}MSfLaa_AoSX7H+XdTOuD%GPHRietwOV=*Z&of zj~g&TUhBQce^>yi*hbTfVQVMPMgUH+E_RAV)H0A98+f0$8@tY8w;>pl#9+~V1X0S~ zQC3wYSAS_*puDj+OEA;WXP4WO&N*dOe$cb+QuYw=U2XKXtqy=uj_0U~IGo2?mH-6!;NnxdS2 z5^L|41G*Qqj<*lxNhYn2(>R>oVusnNYRa<^KXWw^=fMWQGVT>%yTT@oyAn8jArPi^ z4SJi4a2h9$5=3~ad|X^)%HOz}`Y6$Fv|2~<6!U`y9P+?4hUEAN4);t?_S1lCrU>MU zhvT(Gr{Qu?bGER_bUd*L^_G)Li&@E^;eCNZ)GvWaN{Iy_Ok)jcB(^!LnrV%WQ2IOvT0~kHCe{jjaOK$WLw{->r2m?8yp)Zp#M@{co zW}nT}vGwDLJ!^O72OOtA?i(5uLUq>_#dHMEX&=Kn)w22tJopj!z2~X4dT*GE2lyU9 zOCQWAkXb?qZP*Q7XesB0$$)sfB%0G|2xSVRH7zae9b19*&>LBKzMDKZWYay@P29!9 ztL5un4w)f$7ra37)jOg3eB5}w;4?4u4%l`;(9Zqb#KOWN22$^K3YKO}Hc~tPp3GsJ zu`|jzj8p2A1zZkYC10hT`;r*QT3tVX%bUY@Q7oU#cn8B(e{cnKo!+!yl=wV=jvKnu zM_Ui$l;$ZG+B`eFvMuO8Y(0~6$aFp7W$Ssdz|zGVkH&_u?nVe(aSpQY=xDgB_SoQS z(z6_5`7%>i=cE4>+AJ+LWaygbIn>i+KCfncAmSzVY2^}Xjpv~!!Ygpi>5H3t&2Z(X zB`u`Y2Pj30Ug%sHQqz>4p!!}{sU@8jMMH^&xIiIhZ0gtqSF{R8RLO$XzT>63hMk3P zFlb@V6XLs#O!+++7J7N>>v$@tUFx0W_I;AFUCB5)0;Y z0<8K0hw7ew;_;L^-DYIM#r~dvd}H{oFAZG8;C24JKsBIM8#1qx`FX%FmpL97pU$Op zEd;7!m6Scz-8*rhJYF+^Ap?7G7O8Y6ijio0)r{y%AgQWch5HkifcJZ9Nn2{h! zJgS2T!#ADu;%xw0DRsgaBk#_(fCwJcxS8#D#<%L`t*Z$A=e$ut-HWi&^( zB9_$1jBofZr_}X~FVt|hi2B9fTY0$Soxr=fq-nQj7Mwf~E_*chOH4EBwJ+dz`yIV< z1EA{IeP?_M?Y4UT;`1a57f9IkMNUlO+yv)t@_~MU#;xSA`f+ z!zobo_N`F*ofJ{YZYakHh!w*!gT+Y=ii5@Sa!PRhX%78(5QT4do-10!@DR(!G9p7^ zKAieQSy_m5mIQ{OdtjWs{lFP&$OFcw!FGGjJJw4{%fT-77B}wdh)Wyvh5nPrACLU~ zv!~v%yePR`UuhIu_C`7Gcs_@(XRBJAE&)EoyM^v|qY$6`jgM_Xam5coOqi|Bh6fcA zjE^YUDe>aA5GO#!_1x$_A?@&_yu5sKn5ScSYdm(mJVOczclkVqY_nlm##OY3{%$mx zMf`dxCk_bOCENGnm?qsM&}kYjJ&{Z2nj(|_(cZ%1-Et^*{9T9J1qb_`?U6n zq>7h#4ERU>4z=Stf57&u@AJ)vm(}`a1ZZy$U4J}$4bB5N_8!Xy^QXK|mW455^DZAH z(xs#GdMq`o4Ff#aNeP*b&H!+~TI2AQJmKBY@@GswaM4ugI^J{GWS8rzjA1G zC&%{1YtN>7eRX%pKACtc_gFI)M`lhp{gjQ;Ff_1JVrc!F3=t8NEjwZknur+{zHbg& z0J1g?WiD^9q_COq{t$_r87qb_UaLBL`7+VqlDqPBg>C@yd$?Q}L?4}tPYAdhm*UNsqejEO$i(83^xVi#_&B}BYpFMs~~eCu;S@U%pdzF2&NbaB|7 zIVLj9VcF(u@A**xE%w`o?-Fa=_#Ts-e`1$D<)S}qKi+A- z0!OS9gd2oj_f)Wz$lXcD#r$Z!nAY9^{GR%*q%%N>>5*Y(QKuEC2+|RHcq2(RmB3;; zf`JxY*>;&yg*X-VtPbGbE4M!!*bXYo^BNoW&f8t{eQVRh+e*)4d9~j985f@$CbDbA~qzHH?Ud)9ISu1f& zN@2c}2WmSKT?5x~qyQ)J7(Rd#s&griFNsCqbv`bJcn@KTd!CH2ok+W(HZ59PRnqarWI-PcTaUk7uvlm~jNK zW0CWTw#_6r$dHPSULe{N(bfeciA+E}L-5Z-7yv%ECTCT_me< zx#Fh^-A#?ZnVlAroMh)srKLRTp)`Go?9S`-$13#!B(5|UvW9!rT*{mmb-^Zk+EDFLv+o-4LFF+&G5yXJ$O2Rav zn>Hv?A~nrNNrX!ulH!(Bjw&TmRyNza2ojhp$Ro~(Er!)Wd2S~?^d}Zo&kuban83tY zTt#K9qT#)#y-c&P8Wegs86O~~_21~VzCY@RmPH3@o1D0i%A#efg}^LfLW#yk){c7KpnA!C`Qh#xpdFeFiEfFP;ai3>Eo z9X}%rvW8L%RLa^?I^lEoSPH^bzq-9sIz)mm@xz%L#MPrk2$<6GT=dcZHcHrYjkvY< z<#5=G05xaQ&+1_MfG?CpHHQARx#kRZBAMCOuy4pN_Pv|kAK#()_fDmo-miklvOUnf z=wn%GTZuoCkL71b#%V}mnj=|^vSQ@%q0|vaWhKdhiDZlE!iC0DLdg3vQmifsiVWrj zKesoS)YY{0UtuRixF+)zQ4vHb;3Ev4ZY5k3x{*wD&y=^Ypj-)1eGaNq z#p1mQ+vl>a7)s_;S>ZUTNjTIqlD@llC7(qz*LRId)O3$U5yS6iYVo zQ5+kUxm%KPn3M4@_Fh+bE?b2Y2ux%5ey&V^9<57?DxM_Rb6*#P1aCmk^zb_jw4_w89I`PrmMzLly6C6}=oAp7JEW2Bu3;$Y96F>! zknWNYBvndjL1~cp$KLL9_IdxG_`qT@Yo5CA>%QVRJ7Rq{QkcP64D6B#p_^yf{$-X! z04o90^_287iZfBnFDNOw6%}uA{)`W4dXoTse==ID4mzTp)&c$vVB|DXFFH@L}u!PDFAIX2R2$;E?is@RIw z_?Le`q`#YJa{N}nlD@r+A>&gLW_Z={ZJfw49;9V0N^`m8LizFeeF|wZ3a(K8g>K>k z7#G5#UnFu3^iSHLwF6e4~x^n1e46Yo)Rzb}Ulj#&m;R&WqvC%KhE#%Zng`#aGV& zJPjl9Fm8ADW99R#*D-8U^u&L>|;}LLr+^xQ`@n=f| zrZ;8|8tv~n_1@->br!UnAgi{dYTA-4ELvy_c$Oa+uOyrfcr@1@%+6-)_5&z~0qOZq z05Lq6NvZj9k40=9zB>|l?a?M2_ISYe(3TBetQ){*yef<>eWfSp5pMN+ba2Y;c;DQ2d)=c8BA zo+56nZzgjnww(g0Kdm}$lbcWbuMT-<$YMfg@aM8EEw|J&tcp!%;fLr`{IDB7hd^r>e_JH((%kdD7r5P@q}r^w%wCNRvtq|cQ!ilpOZA0257 zPGu0e6>1$+Bb9*6l;f61q2fCrxhRVXUDsKcsma*FS|BM>0qc1^pQ9$-zjgaX932PAlfq(-6}2^X1Gby0{vMbnA`xC5PcY)Ww=Jk7$NR04 zPa!@s9o%vG`7CLc>QCDU9I$R1*`R3u6}##8RY`?(73vT(4{P^TW(~nNgX5pIMY@CXc;^+7>ytX0~ZFgn8hVC)wLbEYOVdcHg%& zZjPPpNp+2RQo>V!u|UA)7ugr}xKDff;^qA)b+io7iL&7Icr}s2&uN8C zgXwOUwQhIbL@@IuIxv)YHWj;2MqiG9fF!&aa*?-I&n5$q9yjquG?L>m@WAM{m(q*2 z8!Je@HiyYqo2E2W=U(%A51Dk{s6Ks{@1UsH7`f+<;Q~bg+ZO=tl=UwKoT}0V`io39 zr!tb6r1{BVP>b@~e5H3ZHAjlsDe?RxqaOB2!?wwdEzOEt-;>*yTzCpfpf?+1<8J_$ zTm*K%9qDI**WFieZOdM!1gX=qP0a`g9GRTmhZ`eJTsPejfJtB0EthyXorw1~p7W0o zmT<$5Vb~^J#h7YHGb9x&^Ud)yDauMYiz14KcvoK%!|u_|`!zU=MC!V=?9inC=gIpE zERB;xjY$^b9(>08_Av!Spyevz)`uP%dyO~GuY-s~9}TToNCZO06hQ}NA~ZhV>B3Hx zNI%j-gxiI9&lnp97Ut)1Z7>hT-l3bAQF>KDK!M|5oE$GtwqEqpTh36EU$-9s$RZEN zRh+He0Zlgz6Jl>Xe!ZgcWOz7wkryYp^hR+^#6FXeCL&CbG&Wlsb0G6EUvZYbZTAKoe^=~DSXYUnvIM8D(+wIeVZT&)%2G$y! z9}JrZ-ZY04Abo*xQp1Yl@Hn5C|5NL-<2w^tQ*J9rTqOY$Is49QlX;Jp&YP35hwEcT5=53DU2WN!*da#%!{w6I z>5(ShNQ1K={DCN1LGUiHdR8DQeV(Qdty$9C1<=QyY`i=5lOB44HeM%;xTipy^d8of z6CHDp`){~dlxFbTr$OQd_Pl>?dq6Bw(ayX3B|PH+4&d|0(#ifSKZ&h*?|`z|9%Q7i znO=MV1S_#BcUV@Jlnh!Fwk(Khg)8|2e0ywNAm}^W_C6^nSJm_|B~5 zBQ|HUrClH+Mey|2f31b&`MG^GmI;&3J9)EH-~lQa^FjA<0RoRacSbp>INCNrUw=ak zv`nwQgyKEAOPodvp}Iaj_vjXvv1KS?;eWrO%EN4BuND$GK7E?wKs_Q^l<7W~2$qE4 z&k%p6yT*vrDy*Mz?^)!2SwN$xSqiZhVdK=t6Fjw`=ODn3k>ZS+_3VE%(78j%1bsG7 zchuRYt-JB~(awVH#;BBTNQyGx2QS8cL?_T!jJb6&UkE+RZ7Gebd_;E%0twQg*%pd1 z=n(TqiNxr*t{585(ApOfNXSc5PP;4jKKRhCIIk`L+`kKNOv(r&jJbHpkbR?Yo3xQw z_7!aN={za45z@>*nEKc=%FLQ<7^cHv+Rqlxy(9_pG7;1XV%BcAjb1ZA{5@v)>khf+ zDE$G|;;2#YL(vLOrX5#Vmx17UQWm2H{IgIo9gVy>kKYad3A0)Ts0F9np``o+o z=?PjrO?S8Wjl3!QUlwOx+1?*kMH8!jwFWJFlb0VXTNsjZONzb0bCE_N7=IvmKJPJR zfl2xUwSGW>p01pYGuaRK^I@?W&ja|0{%na7RRDo@3c8e&S?7)?WZ(rjCums&L;bfI zqz~sax(BndP%y1_VX6llI)tF&R$_><9Ob|IYNzIPX(7P+6cg+*YMMPrbQQ$%P$^r1 z5;+f#?fK0&_S%Y6QDpe`TbhJLQcD5v326{M1M$rJ#!{Ngkx&FWqa;LHRevi%q`2H0imBH9~pb!?oAka z59(3_RPE)?O<{mGB~*S7bYYKJQ|RlIc5Y|X9V|{df&((tqwA!rHS|aO9KkzItzRQJ zxJBCJBM9~CEu!D;kWiw3Y#MNMhECk99dK&2eN;1ehvG|;jHT+<##FA$8;77#w7J*!_-eU=!bRiE|ZP4%~WeR~?b9J&qhRML%HVE&0Gto%FzuY^0P96TOcDm!A63@c3~PA;MFd3dADy z)PO9>hEW;=wHK}!8hX|<@ZNzEWAV{(_$cEy8F}AVFxD*P48Y4ggD%;6Twn;0aUop& zs!@xEJ=Fl{PDqjLd|47SyHpSnuGf^zLe(vFo2w`C=Y0SFKSCqBC4L_#a)f%6GBw4M z;>|gZrAblh$j-MNotGN!pY6Xd>4jM^U`}ZcUc?@f7HB87W0n%C3iaTZBd*dat~Y4z zSO9s7X1e$|)1>#C*4ZTht~X1maM$M~o=xUfAPYPx$#SYUdSu<)^>b1rUZiE>$II4e z3~l2$ z^v~Z8Sc@5=RRt=(I>Xpy{LjGHY(o3|+}paex+iu0S;Xr%qTa6QmM+S_KYy{mjpLpC z?pj+KoBNg)&Cdy70Ls!47&vGn2Y#2KVbeZ;EaJI;w3pAdh)?{bQw*tXU6+Fi_xv0@ z+@;I)n)B&r)Rwb17LuZa8H>?QJNc)S*1lz|6NasY(laZI$^|~y1u=JTI0{n^zrTc) z`UR`&JW}(7mAq`t9YTnHe8N90U`)cA3BpzgkZL zV2Kb!qFdUL-ah-GqE3t73spaolR#Cpd@`3n zYE~7}y`@@)yX8Zwz@M}abK(C8ifxIdageYa6XqIX1vigc)x(D;Y!*!9~TxV(p}q?j)2fRqbO*_DJjF;5-{iIh_hZY zR-(7YB$U>G42L~S(|f{?yZYJK_kiCUNZkwHebL^lmL*WFJ^OTbSgJ~|u6IA)x40r5 zY|4sU-O6j!TRsfN9oXA2c#Y5Lv+rtHQz?YYPAF9UqGb|W#mkRrgxrqdrS>hzn0y4X zt^=K3Spa&r36z1<3X?%*guQ5`OJYrP|_02w8} zs-}=8+7gYD9~9)@WXZgevhbNmN{6yQzv%{d%Z8K;4x&MZ2zhGS(dy(YX{9Hi!f#ys z2#|YcP}X@-&xkjxFfqUMaZ>d2$w`AH;Or1_BznSg+Ls7+f7-aF&|hI3B%e{E`C3Y) zf>cqzW+X*Y2PnPt0b*@UjIc3blOHCi!;lQ`W*1Qd^ykS7KkkF}EGeV;LP&>1)@S1G z;*!r-WURhWWLQ|QM822U!4^TPCz7?LN~xiFBdEb-c5B*AoWP>7FOM$rXp27D2z9?b{+_J#1-C3(b`Ak5(i7k zn8;cHdQdAI?>FcpZ^9~{t;|S)x06!W`kDCsSZEZ(q{(9FchoC{7hAsAsWGxfsn2E~ zJi`k+&5MQg;1!3$H3ta}CT!Tp*QUYH_l%e9}bEd#pc86?iDcdrTE+vvgT z2D>gcH+sKKqm)JuD=x32#%z$xKvQa&Gx&qmIbsC^@&;9a$dLV#7;~IsR7ekCpkL>s zyfy8MkhWS_Tj@gcccoJQH?fmDBq%y|Cr^f8e0d*+(DKq9LzM67Wgva4Z%Jr2x#&ejL zcB^6KKYe|3ERs3B5uitMJ^lDRt4p}^AVr@sL)nC7AIK<%-wz0_YzDb^?N=%b^kNgr z|0&>sv)pYX*UjWcFQH*%BxaB<%r@@EUUwxQ z82={WEv-VQVwJ4dEm8_%hbU@@&!?mTB+umidT}hP_C2H5YCy6!9p>##28LB!0KbPv z2n%98@+z54lfm#I*@$y|zlLpS zq|$uL)EcC09qiJ45B*6g%H>7uG&RPX3p)wZQ%3UYz1g55AE+N`{9-0kDx4GknfYkO zvrJm*gA*o-{Qkg)Nc*BaF+9+W6%`6uWqSFq=0EtycgZjI#@Cr#bV2++)Y-r=w;o8t zebk@ zjxuW9XUNb>tGQnEgcSu;t%8b0wTxnf-5#(QE-Q;H9A3ZNB-KUOPl8pc>Kl(jZIu2T z!Mc!cKsC#DcXW5#)$4k`XiX!Nc?ej_hClQA3Mfp{Dr?%I>&LC{d_Ihh>-|Gh`cGeY zzpeCSO!}iVk>yS%=^!~g<%+u^5K1# zCD{sf*3}|6bGszKuR1%lw^ctw>?(WVJ9?a{1+I_*cofwVS~FMh8-#OUB)eF&Ca6Ri zS#FVWVdFzSm>7~!KiKxolA=swAi0~$s+Rc}Vri>46NQZbNDX!;+9LbX$Fy8|$+V`i z(VY5MwCS3A$!eqZ{IwxRyvr;cGLRpJlkX6%xldu?KwYQw^Ed6VE{mZQlACUgnaQA- z@HM$!;K83Z7+~97j6Q#FCQ8^k4_H%<-D?y}U#*bgRf;e~L%p~vWV{=jn=`r3m+U#| z9#F_i_aBZ|vup`rW0}O?lKQ^;q|q&2u>^&%79 z7|pWC( zwJ_eb=R&Z0hgH@i+Ujw#MYfY3X&#q+b)tDJ0g{qqAfA~fNRGTaeOnb+D`jWT1i|OH zbg@XS#gJp9Qc}|L=Uo!~5^8~s3g#=IRr*OQ?SBD#i2izf%P+{)@UWZ-Vc*q|;3po` zjKRbPac-ufr8)kp1WUnmf&RSY!GBAZ%(auSe3TYbZ?O2bM&sry&yJ*(Z(cgN&M%aL zF+6kc)-~&V8h%hAYKw>+R?E7ASfUCn<6 zIF5wDfWSx!$mXu=-M%M&{)z@ab!TDg08l8VdDao#LGGuP?i*b|bm}HR+I_n69$>h| ziQEBc$&nUe2jN#{g+E8xYg1kUJ%9K$m^ToBnMYc>ZV%u;soci7t!j2=OS8lQDrt*4 zfqi`OK9J0QfDo>I(W2@J;E&Q&G9W*o(cm;(Ms7eX302?25L*DtH92_y4iF(9z=OU5 zOUNx-n=|D9ve71q5?~~j#K^KPjE-0T57zou`NVaC;lNr;8o}?PskFM4gw2Y6eo1-r zS;Y)o6pV@oElfeLam;$6IOI;kri6`;9hR?%Nt^7ijl34r(ew*P|Mt)o)2w5J&<@rJ z0SBFwoZ2I(71-vPjuS{AUla#28FPX}{3?hcnFa%Wq=h@cL_AY{0o-Q6TfZWxgjRE9 zo2_+h^=p8@ey9!Q8*Z8T>wW~)LL7?Ma&=&u3eH|J4rb9zhOVuHUbr(7_jrp2=m1BE zT*C=YI#|FSfIg3(*rLdRl8Te)fNlR}+H{v^gmic|WihZT4-~ZbT@msg?)@-gyY4fC zE&8A9L?fXaP;ct%(WNE>7W4sMeQ3i0_1Q2iay6-#((Pk~jw?W09laO9Xo>#5*pQy_ zoGnoaZ(net;QSl=RP zQeHCgCj(h2zE-fF;CRuM9TO#VOf{CjPh zJasUEMoL8YYSR8MX$ZvYmk`F7Ln|_e`^#e~#7-m}K9a6jVg)JmNvet-XSEYm&$ZCB z1-m?==hl+-Bg^|?z4c9cF0VAs5WfW(y8+5+b`#Jrzz>ZCA`g{r6 zj*TPF;gPt|GWsnwq1qfu?<@^Qh{3Pkku~;U6Ipu8E$7PG-np-;^+~Fis+6-1)T6qv zy0Q5#@Xu|vB+TSJaImcAI!^QyO-L4vyjm*Vu{Nk7s&UtO)cm-MCo72*X?YVy#^Vj;H~dLpPF(O%ad4(7anO~-6b0Hwkcp<3PxCtI^{LMc z2zlO+7kJnH(&_~}Vm+vMT+K}|_^)U58?f4G+2j z1d4WspS}HoI0sUGmLUe0(S8kgb}#1CE5PZTd24I9>XWU5`2ip=B~dbiZz9Og0PS#k zOw1$ilM&{vJ>$D}m%iHC+H}BeSNT(}ITgTAIRSz?`>@^aZqLVngkQ%Ni7z8see7^e`bros?$M7K3zJa;z!L55q}AR0M}bT)&vaup<~qbeEb|iVRt?{q{ZxWrC9=wFdT}7u`0cXb8PDI zR_j*#uKkuj(;tGd7jBWZYrD}oX$GxkN=OYim%rBJ75j=0LK&C9Np^$JU~<&REXpVYAtb-WMGI@oupx@=qn?O!tKe zYCW0V_Hj1gz}|Roo&1RU2TTT++tlK_xEcV_E<9?v`xf|nC}pA6_;WZ5V-Mu{t=V#` zOVJG=2V&DsmUMr2;>HQKg?ySRn*nP;i}pGhq2)*ubZafwV=_wbGY4OPF^ql8nI?Aj zsZW;-QPC*`L_xy9@S~@)Xzh1^$gxE-g=c;jux6kKwDzSrz1ig^TLw1cOFjTs{mp;$ zuz&i^`_L-w~&-m z+VkfjWe({U^H>kd6|vUS5jYNo1Czot9=|9Ho8R#;S)?-MPODaBnSoldxQJ|R-%w`>%YcvEXYMP!Ioob#3T?oTUG|vg&g+Vd&hxG z06)|FPJ;2}l^&jaYB?jch3VZbK=I~Grj5~h3XHe0Aal6U&suU5DQn6dJBoMa?CTPJkCLc>X$c)7DFt_2b)lwDv%FAvVDefKNSy zEvIA4t+DI*P6AMbgUREUY)}81_5KU`2RL5UR1%B35T!!4Nbp`Xsi=jc?H z?CD=E-Z8W8rhJ>qibWLEM$&M&3<|9f9BF;r9YaXA^V|~7$K95|;@HAv)ut6mkJVn} z!w`F7%NyK!Ow_HP1qY-~RP!D@d=i2rS+Mj9MfD}uFmVz~l*zNR%0D2MLo7zC(Lpu4 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%0DQBNm+lE`RdACf`oEBp`i8HZztAX*` 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 Af&c&j literal 0 HcmV?d00001 From f2aba4bc2235a1f25e23dbd999acba5fd5590e3f Mon Sep 17 00:00:00 2001 From: Vinod Singh Date: Wed, 22 Apr 2026 09:51:25 -0500 Subject: [PATCH 3/5] updated cleanup section --- .../04-litellm-gateway.ipynb | 48 +++++++++++++++---- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb index ceb46bd71..a90bffe76 100644 --- a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb +++ b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb @@ -479,15 +479,7 @@ "source": [ "# Clean up\n", "\n", - "Additional resources are also created like IAM role, IAM Policies, Credentials provider, AWS Lambda functions, Cognito user pools, s3 buckets that you might need to manually delete as part of the clean up. This depends on the example you run." - ] - }, - { - "cell_type": "markdown", - "id": "a22f158d-83b6-4d65-892f-9a208af3d742", - "metadata": {}, - "source": [ - "## Delete the gateway (Optional)" + "Run the cell below to delete all resources created by this notebook: AgentCore Gateway (and its targets), Lambda function, IAM roles, and Cognito user pool." ] }, { @@ -498,7 +490,43 @@ "outputs": [], "source": [ "import utils\n", - "utils.delete_gateway(gateway_client,gatewayID)" + "\n", + "# ── Delete AgentCore Gateway (deletes targets automatically) ──────────\n", + "try:\n", + " utils.delete_gateway(gateway_client, gatewayID)\n", + " print(f\"✓ Deleted gateway: {gatewayID}\")\n", + "except Exception as e:\n", + " print(f\" Gateway cleanup: {e}\")\n", + "\n", + "# ── Delete Lambda function ───────────────────────────────────────────\n", + "try:\n", + " utils.delete_lambda_functions(['gateway_lambda'])\n", + " print(\"✓ Deleted Lambda function: gateway_lambda\")\n", + "except Exception as e:\n", + " print(f\" Lambda cleanup: {e}\")\n", + "\n", + "# ── Delete Lambda IAM role ──────────────────────────────────────────\n", + "try:\n", + " utils.delete_iam_role('gateway_lambda_iamrole')\n", + " print(\"✓ Deleted IAM role: gateway_lambda_iamrole\")\n", + "except Exception as e:\n", + " print(f\" Lambda IAM role cleanup: {e}\")\n", + "\n", + "# ── Delete Gateway IAM role ─────────────────────────────────────────\n", + "try:\n", + " utils.delete_iam_role('sample-lambdagateway-agentcore-gateway-role')\n", + " print(\"✓ Deleted IAM role: sample-lambdagateway-agentcore-gateway-role\")\n", + "except Exception as e:\n", + " print(f\" Gateway IAM role cleanup: {e}\")\n", + "\n", + "# ── Delete Cognito User Pool ────────────────────────────────────────\n", + "try:\n", + " utils.delete_cognito_user_pool(user_pool_id, REGION)\n", + " print(f\"✓ Deleted Cognito user pool: {user_pool_id}\")\n", + "except Exception as e:\n", + " print(f\" Cognito cleanup: {e}\")\n", + "\n", + "print(\"\\n✓ Cleanup complete!\")" ] } ], From 4470aaf34b8d201f42c32d7e8410e55eb68df852 Mon Sep 17 00:00:00 2001 From: Vinod Singh Date: Wed, 22 Apr 2026 11:52:13 -0500 Subject: [PATCH 4/5] all working with latest litellm version --- .../04-litellm-gateway.ipynb | 68 +++++++++---------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb index a90bffe76..093276ffa 100644 --- a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb +++ b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb @@ -101,6 +101,7 @@ "source": [ "# Set AWS credentials if not using Amazon SageMaker notebook\n", "import os\n", + "\n", "# os.environ['AWS_ACCESS_KEY_ID'] = '' # Set the access key\n", "# os.environ['AWS_SECRET_ACCESS_KEY'] = '' # Set the secret key\n", "os.environ['AWS_DEFAULT_REGION'] = os.environ.get('AWS_REGION', 'us-east-1') # set the AWS region" @@ -414,47 +415,42 @@ "outputs": [], "source": [ "#Connecting to AgentCore Gateway (MCP Server)\n", - "await client.connect()\n", - "print(\"\\n✓ Connected successfully!\")\n", - "print(\"\\nAvailable Tools:\")\n", - "print(\"-\" * 50)\n", - "\n", - "# List all available tools\n", - "tools = await client.list_tools()\n", - "\n", - "if tools:\n", - " for i, tool in enumerate(tools, 1):\n", - " print(f\"\\n{i}. {tool.name}\")\n", - " print(f\" Description: {tool.description}\")\n", - " if hasattr(tool, 'inputSchema'):\n", - " print(f\" Input Schema: {tool.inputSchema}\")\n", - "else:\n", - " print(\"No tools available.\")\n", + "async def mcp_operations(session):\n", + " print(\"\\n✓ Connected successfully!\")\n", + " print(\"\\nAvailable Tools:\")\n", + " print(\"-\" * 50)\n", + "\n", + " # List all available tools\n", + " tools = await session.list_tools()\n", + " tools = tools.tools\n", + "\n", + " if tools:\n", + " for i, tool in enumerate(tools, 1):\n", + " print(f\"\\n{i}. {tool.name}\")\n", + " print(f\" Description: {tool.description}\")\n", + " if hasattr(tool, 'inputSchema'):\n", + " print(f\" Input Schema: {tool.inputSchema}\")\n", + " else:\n", + " print(\"No tools available.\")\n", "\n", - "print(\"\\n\" + \"-\" * 50)\n", - "print(f\"Total tools: {len(tools)}\")\n", + " print(\"\\n\" + \"-\" * 50)\n", + " print(f\"Total tools: {len(tools)}\")\n", "\n", + " # Call the __get_order_tool with orderId argument\n", + " tool_name = targetname + \"___get_order_tool\"\n", "\n", - "# Call the __get_order_tool with orderId argument\n", - "tool_name = targetname + \"___get_order_tool\"\n", + " print(\"\\n\" + \"=\" * 50)\n", + " print(f\"Calling {tool_name} with orderId=123...\")\n", + " print(\"=\" * 50)\n", "\n", - "print(\"\\n\" + \"=\" * 50)\n", - "print(f\"Calling {tool_name} with orderId=123...\")\n", - "print(\"=\" * 50)\n", + " tool_result = await session.call_tool(tool_name, arguments={\"orderId\": \"123\"})\n", "\n", - "# Create the CallToolRequestParams object\n", - "call_params = CallToolRequestParams(\n", - " name=tool_name,\n", - " arguments={\"orderId\": \"123\"}\n", - ")\n", - "\n", - "tool_result = await client.call_tool(call_params)\n", + " if tool_result.content and len(tool_result.content) > 0:\n", + " print(f\"Tool Call result: {tool_result.content[0].text}\")\n", + " else:\n", + " print(\"No content in tool result\")\n", "\n", - "# Access CallToolResult using dot notation (Pydantic model)\n", - "if tool_result.content and len(tool_result.content) > 0:\n", - " print(f\"Tool Call result: {tool_result.content[0].text}\")\n", - "else:\n", - " print(\"No content in tool result\")" + "await client.run_with_session(mcp_operations)" ] }, { @@ -546,7 +542,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.7" + "version": "3.12.12" } }, "nbformat": 4, From fad1bf06a982fd1c42a71760067b777284ffa09c Mon Sep 17 00:00:00 2001 From: Vinod Singh Date: Wed, 22 Apr 2026 13:34:15 -0500 Subject: [PATCH 5/5] fixed formatting --- .../04-litellm-gateway.ipynb | 55 ++++++++----------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb index 093276ffa..620995ddb 100644 --- a/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb +++ b/01-tutorials/02-AgentCore-gateway/04-integration/01-runtime-gateway/04-litellm-gateway.ipynb @@ -1,7 +1,6 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "id": "4ba51a29-a566-4b5a-97f0-10e634567e40", "metadata": { @@ -12,15 +11,14 @@ }, "source": [ "# LiteLLM connecting to Bedrock AgentCore Gateway\n", - "## Calling Bedrock AgentCore Gateway MCP Tools from LiteLLM \n", "\n", "## Overview\n", "\n", - "[LiteLLM](https://docs.litellm.ai/)is a proxy server and an open-source Python library that acts as a universal API gateway for accessing 100+ large language models from different providers (Bedrock, OpenAI, Anthropic, Azure, Cohere, Mistral, Gemini, Ollama, etc.). It eliminates the need to learn multiple APIs by translating inputs to match each provider's specific requirements.Beyond API unification, LiteLLM provides production-ready features including cost tracking, guardrails, load balancing, failover, rate limiting, caching, logging, and real-time monitoring.This makes it ideal for maintaining provider-agnostic infrastructure while implementing enterprise-grade operational controls in AI applications.\n", + "[LiteLLM](https://docs.litellm.ai/) is a proxy server and an open-source Python library that acts as a universal API gateway for accessing 100+ large language models from different providers (Bedrock, OpenAI, Anthropic, Azure, Cohere, Mistral, Gemini, Ollama, etc.). It eliminates the need to learn multiple APIs by translating inputs to match each provider's specific requirements. Beyond API unification, LiteLLM provides production-ready features including cost tracking, guardrails, load balancing, failover, rate limiting, caching, logging, and real-time monitoring. This makes it ideal for maintaining provider-agnostic infrastructure while implementing enterprise-grade operational controls in AI applications.\n", "\n", "LiteLLM proxy also serves as a centralized [MCP gateway](https://docs.litellm.ai/docs/mcp) offering unified management of 100+ AI providers through a single interface. Key benefits include enhanced security by addressing MCP's decentralized vulnerabilities, simplified authentication/authorization eliminating duplicate OAuth/RBAC setups, improved scalability preventing configuration drift, and multi-server aggregation for easy administration. Technical advantages include LLM-agnostic support, seamless function calling integration, and protocol bridging capabilities. This creates a robust, secure, and scalable solution that standardizes MCP connections while providing enterprise-grade operational controls for AI integration across multiple servers and clients.\n", "\n", - "Bedrock AgentCore Gateway provides customers a way to turn their existing AWS Lambda functions into fully-managed MCP servers without needing to manage infra or hosting. Gateway will provide a uniform Model Context Protocol (MCP) interface across all these tools. \n", + "Bedrock AgentCore Gateway provides customers a way to turn their existing AWS Lambda functions into fully-managed MCP servers without needing to manage infra or hosting. Gateway will provide a uniform Model Context Protocol (MCP) interface across all these tools.\n", "\n", "In this example, we will demonstrate how to connect LiteLLM proxy with Bedrock AgentCore Gateway using Python SDK. This will use OAuth for Inbound Authentication to connect with Gateway. This tutorial will show MCP List Tools and Call Tool.\n", "\n", @@ -28,7 +26,6 @@ "\n", "### Tutorial Details\n", "\n", - "\n", "| Information | Details |\n", "|:---------------------|:----------------------------------------------------------|\n", "| Tutorial type | Interactive |\n", @@ -43,12 +40,9 @@ "| Example complexity | Easy |\n", "| SDK used | boto3, LiteLLM Python SDK |\n", "\n", - "In the first part of the tutorial we will create some AmazonCore Gateway targets\n", - "\n", "### Tutorial Architecture\n", - "In this tutorial we will transform operations defined in AWS lambda function into MCP tools and host it in Bedrock AgentCore Gateway.\n", - "For demonstration purposes, we will use LiteLLM proxy to connect to AgentCore Gateway.\n", - "In our example LiteLLM will call two tools: get_order and update_order." + "\n", + "In this tutorial we will transform operations defined in an AWS Lambda function into MCP tools and host them in Bedrock AgentCore Gateway. For demonstration purposes, we will use LiteLLM proxy to connect to AgentCore Gateway. In our example LiteLLM will call two tools: `get_order` and `update_order`." ] }, { @@ -59,27 +53,26 @@ "## Prerequisites\n", "\n", "To execute this tutorial you will need:\n", - "* Jupyter notebook (Python kernel)\n", - "* uv\n", - "* AWS credentials\n", - "* Amazon Cognito\n", - "* LiteLLM Python SDK" + "\n", + "- Jupyter notebook (Python kernel)\n", + "- uv\n", + "- AWS credentials\n", + "- Amazon Cognito\n", + "- LiteLLM Python SDK" ] }, { - "attachments": {}, "cell_type": "markdown", "id": "e93da982-0d11-427c-9958-fff3c80b32f1", "metadata": {}, "source": [ "## Configuring Authentication for Incoming AgentCore Gateway Requests\n", - "AgentCore Gateway provides secure connections via inbound and outbound authentication. For the inbound authentication, the AgentCore Gateway analyzes the OAuth token passed during invocation to decide allow or deny the access to a tool in the gateway. If a tool needs access to external resources, the AgentCore Gateway can use outbound authentication via API Key, IAM or OAuth Token to allow or deny the access to the external resource.\n", - "\n", "\n", + "AgentCore Gateway provides secure connections via inbound and outbound authentication. For the inbound authentication, the AgentCore Gateway analyzes the OAuth token passed during invocation to decide allow or deny the access to a tool in the gateway. If a tool needs access to external resources, the AgentCore Gateway can use outbound authentication via API Key, IAM or OAuth Token to allow or deny the access to the external resource.\n", "\n", "During the inbound authorization flow, an agent or the MCP client calls an MCP tool in the AgentCore Gateway adding an OAuth access token (generated from the user’s IdP). AgentCore Gateway then validates the OAuth access token and performs inbound authorization.\n", "\n", - "If the tool running in AgentCore Gateway needs to access external resources, OAuth will retrieve credentials of downstream resources using the resource credential provider for the Gateway target. AgentCore Gateway pass the authorization credentials to the caller to get access to the downstream API. " + "If the tool running in AgentCore Gateway needs to access external resources, OAuth will retrieve credentials of downstream resources using the resource credential provider for the Gateway target. AgentCore Gateway passes the authorization credentials to the caller to get access to the downstream API. " ] }, { @@ -168,7 +161,7 @@ "id": "65120594-c3ec-4d51-810b-8d478851d8d2", "metadata": {}, "source": [ - "# Create Amazon Cognito Pool for Inbound authorization to Gateway" + "## Create Amazon Cognito Pool for Inbound authorization to Gateway" ] }, { @@ -218,7 +211,7 @@ "id": "f1a63450-7fb9-42fc-ab4f-3d86c27bb2f8", "metadata": {}, "source": [ - "# Create the Gateway with Amazon Cognito Authorizer for inbound authorization" + "## Create the Gateway with Amazon Cognito Authorizer for inbound authorization" ] }, { @@ -256,7 +249,7 @@ "id": "94dc57be-e50e-4997-a440-3bcf582d09bc", "metadata": {}, "source": [ - "# Create an AWS Lambda target and transform into MCP tools" + "## Create an AWS Lambda target and transform into MCP tools" ] }, { @@ -324,13 +317,13 @@ "id": "d3ac6532-5299-4024-917d-bcd60caea6ed", "metadata": {}, "source": [ - "# Calling Bedrock AgentCore Gateway from LiteLLM \n", + "## Calling Bedrock AgentCore Gateway from LiteLLM \n", "\n", - "The LiteLLM proxy seamlessly integrates with AWS tools through the Bedrock AgentCore Gateway, which implements the Model Context Protocol (MCP) specification. This integration enables secure, standardized communication between LiteLLM (MCP Client)) and Bedrock AgentCore Gateway (MCP Server)\n", + "The LiteLLM proxy seamlessly integrates with AWS tools through the Bedrock AgentCore Gateway, which implements the Model Context Protocol (MCP) specification. This integration enables secure, standardized communication between LiteLLM (MCP Client) and Bedrock AgentCore Gateway (MCP Server)\n", "\n", - "At its core, the Bedrock AgentCore Gateway serves as a protocol-compliant Gateway that exposes fundamental MCP APIs: list_tools and InVokeTool. These APIs allow any MCP-compliant client or SDK to discover and interact with available tools in a secure, standardized way. When the LiteLLM MCP gateway needs to access AWS services, it communicates with the Gateway using these MCP-standardized endpoints.\n", + "At its core, the Bedrock AgentCore Gateway serves as a protocol-compliant Gateway that exposes fundamental MCP APIs: list_tools and InvokeTool. These APIs allow any MCP-compliant client or SDK to discover and interact with available tools in a secure, standardized way. When the LiteLLM MCP gateway needs to access AWS services, it communicates with the Gateway using these MCP-standardized endpoints.\n", "\n", - "The Gateway's implementation adheres strictly to the (MCP Authorization specification)[https://modelcontextprotocol.org/specification/draft/basic/authorization], ensuring robust security and access control. This means that every tool invocation by the LiteLLM goes through authorization step, maintaining security while enabling powerful functionality.\n", + "The Gateway's implementation adheres strictly to the [MCP Authorization specification](https://modelcontextprotocol.org/specification/draft/basic/authorization), ensuring robust security and access control. This means that every tool invocation by the LiteLLM goes through authorization step, maintaining security while enabling powerful functionality.\n", "\n", "For example, when the LiteLLM needs to access MCP tools, it first calls ListTools to discover available tools, then uses CallTool to execute specific actions. The Gateway handles all the necessary security validations, protocol translations, and service interactions, making the entire process seamless and secure.\n", "\n", @@ -344,7 +337,7 @@ "id": "873031fe-62b5-4196-91be-500c1f87dfd4", "metadata": {}, "source": [ - "# Request the access token from Amazon Cognito for inbound authorization" + "## Request the access token from Amazon Cognito for inbound authorization" ] }, { @@ -372,12 +365,11 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "6fd0379d-9576-43cb-aa9b-72b86c43b472", "metadata": {}, "source": [ - "# LiteLLM calling MCP tools of AWS Lambda using Bedrock AgentCore Gateway" + "## LiteLLM calling MCP tools of AWS Lambda using Bedrock AgentCore Gateway\n" ] }, { @@ -387,8 +379,7 @@ "metadata": {}, "outputs": [], "source": [ - "from litellm.experimental_mcp_client.client import MCPClient\n", - "from mcp.types import CallToolRequestParams" + "from litellm.experimental_mcp_client.client import MCPClient\n" ] }, { @@ -473,7 +464,7 @@ "id": "fa8dd91d-15a6-45b2-b539-bb3eaf0e0e08", "metadata": {}, "source": [ - "# Clean up\n", + "## Clean up\n", "\n", "Run the cell below to delete all resources created by this notebook: AgentCore Gateway (and its targets), Lambda function, IAM roles, and Cognito user pool." ]