From 782ed120241780b3071fb6d5b1622cab15a52c66 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Fri, 29 May 2026 23:33:35 -0400 Subject: [PATCH 01/21] initial commit --- .../03-web-search/01-setup-gateway/README.md | 133 +++++++ .../01-setup-gateway/setup_gateway.py | 351 ++++++++++++++++++ .../03-web-search/02-raw-mcp/README.md | 90 +++++ .../03-web-search/02-raw-mcp/raw_mcp_call.py | 124 +++++++ .../03-web-search/03-strands-agent/README.md | 97 +++++ .../03-strands-agent/web_search_strands.py | 109 ++++++ .../04-langchain-agent/README.md | 99 +++++ .../web_search_langchain.py | 131 +++++++ .../03-web-search/05-cleanup/README.md | 22 ++ .../03-web-search/05-cleanup/cleanup.py | 132 +++++++ .../03-web-search/README.md | 188 ++++++++++ .../images/inbound-and-outbound-auth.png | Bin 0 -> 19563 bytes .../images/tutorial-architecture.png | Bin 0 -> 31128 bytes .../03-web-search/requirements.txt | 8 + .../03-web-search/utils/__init__.py | 0 .../03-web-search/utils/gateway_auth.py | 104 ++++++ .../03-web-search/utils/web_search_agent.py | 80 ++++ .../README.md | 30 +- 18 files changed, 1696 insertions(+), 2 deletions(-) create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/README.md create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/README.md create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/images/inbound-and-outbound-auth.png create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/images/tutorial-architecture.png create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/utils/__init__.py create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md new file mode 100644 index 000000000..7fa5208a8 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md @@ -0,0 +1,133 @@ +# Set Up AgentCore Gateway with Web Search Tool + +## Overview + +This script creates all the infrastructure needed to expose the Web Search Tool through an AgentCore Gateway. After running it, you'll have a fully functional MCP endpoint that any agent framework can connect to. + +``` +┌──────────────────┐ ┌─────────────────────────────────────┐ +│ setup_gateway │────────▶│ AWS Resources Created: │ +│ │ │ │ +│ 1. IAM Role │ │ • IAM Role (InvokeWebSearch) │ +│ 2. Cognito │ │ • Cognito User Pool + M2M Client │ +│ 3. Gateway │ │ • AgentCore Gateway (MCP) │ +│ 4. Target │ │ • Web Search Connector Target │ +└──────────────────┘ └─────────────────────────────────────┘ +``` + +## How It Works + +### Gateway Service Role + +The Gateway needs an IAM role that allows the AgentCore service to perform actions on your behalf. For the Web Search Tool, the role needs two permissions: + +- `bedrock-agentcore:InvokeGateway` — to invoke the Gateway itself +- `bedrock-agentcore:InvokeWebSearch` — to authorize web search invocations against `arn:aws:bedrock-agentcore::aws:tool/web-search.v1` + +### Cognito Authentication + +The script creates a Cognito User Pool with: +- A resource server defining an `invoke` scope +- A machine-to-machine (M2M) client using the `client_credentials` OAuth flow + +This provides JWT-based authentication for incoming requests to the Gateway. + +### Gateway Creation + +The Gateway is created with: +- **Protocol**: MCP (Model Context Protocol) +- **MCP version**: 2025-03-26 +- **Search type**: SEMANTIC (enables tool discovery across multiple targets) +- **Authorizer**: Custom JWT backed by the Cognito User Pool + +### Web Search Connector Target + +The Web Search Tool uses the `connector` target type — a fully AWS-managed integration. You specify `connectorId: "web-search"` and the Gateway handles schema management, endpoint resolution, and service authentication automatically. + +Outbound authentication uses `GATEWAY_IAM_ROLE` — the Gateway's own service role authenticates to the Web Search backend. No additional credentials needed. + +## Prerequisites + +```bash +pip install -r ../requirements.txt +``` + +Your AWS credentials must have permissions to create IAM roles, Cognito pools, and AgentCore Gateways. Your account must be allowlisted for the Web Search Tool private beta. + +> **Region**: The Web Search Tool connector is currently available in **us-east-1** only. + +## Usage + +```bash +# Default setup +python setup_gateway.py + +# Custom gateway name +python setup_gateway.py --gateway-name my-web-search-gw + +# Explicit region +python setup_gateway.py --region us-east-1 +``` + +After completion, the script prints environment variables to export: + +```bash +export AGENTCORE_GATEWAY_URL="https://..." +export COGNITO_DOMAIN="..." +export COGNITO_CLIENT_ID="..." +export COGNITO_CLIENT_SECRET="..." +export COGNITO_SCOPE="agentcore-websearch/invoke" +export AWS_DEFAULT_REGION="us-east-1" +``` + +Export these before running the other demos. + +## IAM Permissions + +### Caller (you) + +```json +{ + "Effect": "Allow", + "Action": [ + "iam:CreateRole", + "iam:PutRolePolicy", + "iam:GetRole", + "cognito-idp:CreateUserPool", + "cognito-idp:CreateUserPoolDomain", + "cognito-idp:CreateResourceServer", + "cognito-idp:CreateUserPoolClient", + "cognito-idp:ListUserPools", + "cognito-idp:ListUserPoolClients", + "cognito-idp:DescribeUserPoolClient", + "cognito-idp:DescribeResourceServer", + "bedrock-agentcore:CreateGateway", + "bedrock-agentcore:GetGateway", + "bedrock-agentcore:CreateGatewayTarget", + "bedrock-agentcore:ListGatewayTargets" + ], + "Resource": "*" +} +``` + +### Gateway Service Role (created by this script) + +```json +{ + "Effect": "Allow", + "Action": [ + "bedrock-agentcore:InvokeGateway", + "bedrock-agentcore:InvokeWebSearch" + ], + "Resource": [ + "arn:aws:bedrock-agentcore:us-east-1::gateway/*", + "arn:aws:bedrock-agentcore:us-east-1:aws:tool/web-search.v1" + ] +} +``` + +## Files + +| File | Description | +|:-----|:------------| +| `setup_gateway.py` | Main setup script — creates all resources | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py new file mode 100644 index 000000000..3ca062cd2 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py @@ -0,0 +1,351 @@ +""" +Set up AgentCore Gateway with Web Search Tool Target. + +Creates all required infrastructure for the Web Search Tool: + 1. IAM service role for the Gateway (with InvokeWebSearch permission) + 2. Cognito User Pool with client_credentials OAuth flow + 3. AgentCore Gateway with MCP protocol and JWT authorization + 4. Web Search Tool connector target + +After running this script, export the printed environment variables to use +with the other demos in this folder. + +Prerequisites: + pip install -r ../requirements.txt + AWS credentials with permissions to create IAM roles, Cognito pools, + and AgentCore Gateways. + +IAM permissions required: + iam:CreateRole, iam:PutRolePolicy, iam:GetRole + cognito-idp:CreateUserPool, cognito-idp:CreateUserPoolDomain + cognito-idp:CreateResourceServer, cognito-idp:CreateUserPoolClient + cognito-idp:ListUserPools, cognito-idp:ListUserPoolClients + cognito-idp:DescribeUserPoolClient, cognito-idp:DescribeResourceServer + bedrock-agentcore:CreateGateway, bedrock-agentcore:GetGateway + bedrock-agentcore:CreateGatewayTarget, bedrock-agentcore:ListGatewayTargets + +Usage: + python setup_gateway.py + python setup_gateway.py --gateway-name my-gateway + python setup_gateway.py --region us-east-1 +""" + +import argparse +import json +import os +import time + +import boto3 + +# ── Configuration ───────────────────────────────────────────────────────────── + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") + + +# ── Helpers ─────────────────────────────────────────────────────────────────── + + +def wait_for_status(client, gateway_id, target_status="READY", max_wait=150): + """Poll gateway status until it reaches target_status.""" + for _ in range(max_wait // 5): + status = client.get_gateway(gatewayIdentifier=gateway_id)["status"] + if status == target_status: + return status + time.sleep(5) + return status + + +def wait_for_targets(client, gateway_id, max_wait=150): + """Poll until all gateway targets are READY.""" + for _ in range(max_wait // 5): + targets = client.list_gateway_targets(gatewayIdentifier=gateway_id) + if all(item["status"] == "READY" for item in targets["items"]): + return True + time.sleep(5) + return False + + +# ── Setup Steps ─────────────────────────────────────────────────────────────── + + +def create_gateway_role(iam_client, role_name, account_id, region): + """Create the IAM service role for the Gateway.""" + assume_role_policy = { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": {"Service": "bedrock-agentcore.amazonaws.com"}, + "Action": "sts:AssumeRole", + "Condition": { + "StringEquals": {"aws:SourceAccount": account_id}, + "ArnLike": { + "aws:SourceArn": f"arn:aws:bedrock-agentcore:{region}:{account_id}:*" + }, + }, + } + ], + } + + try: + role_response = iam_client.create_role( + RoleName=role_name, + AssumeRolePolicyDocument=json.dumps(assume_role_policy), + ) + print(f" Created role: {role_name}") + time.sleep(10) # Wait for IAM propagation + except iam_client.exceptions.EntityAlreadyExistsException: + role_response = iam_client.get_role(RoleName=role_name) + print(f" Role already exists: {role_name}") + + role_arn = role_response["Role"]["Arn"] + + # Attach permissions + iam_client.put_role_policy( + RoleName=role_name, + PolicyName="WebSearchGatewayPolicy", + PolicyDocument=json.dumps( + { + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "InvokeGateway", + "Effect": "Allow", + "Action": "bedrock-agentcore:InvokeGateway", + "Resource": f"arn:aws:bedrock-agentcore:{region}:{account_id}:gateway/*", + }, + { + "Sid": "InvokeWebSearch", + "Effect": "Allow", + "Action": "bedrock-agentcore:InvokeWebSearch", + "Resource": f"arn:aws:bedrock-agentcore:{region}:aws:tool/web-search.v1", + }, + ], + } + ), + ) + print(" Permissions attached ✓") + return role_arn + + +def create_cognito_resources(cognito_client, region): + """Create Cognito User Pool, resource server, and M2M client.""" + pool_name = "agentcore-websearch-pool" + resource_server_id = "agentcore-websearch" + scopes = [{"ScopeName": "invoke", "ScopeDescription": "Invoke gateway"}] + scope_names = [f"{resource_server_id}/{s['ScopeName']}" for s in scopes] + + # Find or create user pool + user_pool_id = None + for pool in cognito_client.list_user_pools(MaxResults=60)["UserPools"]: + if pool["Name"] == pool_name: + user_pool_id = pool["Id"] + break + + if user_pool_id is None: + create_resp = cognito_client.create_user_pool(PoolName=pool_name) + user_pool_id = create_resp["UserPool"]["Id"] + domain = user_pool_id.replace("_", "").lower() + cognito_client.create_user_pool_domain( + Domain=domain, UserPoolId=user_pool_id + ) + print(f" Created user pool: {user_pool_id}") + else: + print(f" User pool exists: {user_pool_id}") + + # Create resource server + try: + cognito_client.describe_resource_server( + UserPoolId=user_pool_id, Identifier=resource_server_id + ) + except cognito_client.exceptions.ResourceNotFoundException: + cognito_client.create_resource_server( + UserPoolId=user_pool_id, + Identifier=resource_server_id, + Name="WebSearch Gateway Resource Server", + Scopes=scopes, + ) + print(" Resource server ensured ✓") + + # Find or create M2M client + client_id, client_secret = None, None + for client in cognito_client.list_user_pool_clients( + UserPoolId=user_pool_id, MaxResults=60 + )["UserPoolClients"]: + if client["ClientName"] == "agentcore-websearch-client": + desc = cognito_client.describe_user_pool_client( + UserPoolId=user_pool_id, ClientId=client["ClientId"] + ) + client_id = client["ClientId"] + client_secret = desc["UserPoolClient"]["ClientSecret"] + break + + if client_id is None: + created = cognito_client.create_user_pool_client( + UserPoolId=user_pool_id, + ClientName="agentcore-websearch-client", + GenerateSecret=True, + AllowedOAuthFlows=["client_credentials"], + AllowedOAuthScopes=scope_names, + AllowedOAuthFlowsUserPoolClient=True, + SupportedIdentityProviders=["COGNITO"], + ExplicitAuthFlows=["ALLOW_REFRESH_TOKEN_AUTH"], + ) + client_id = created["UserPoolClient"]["ClientId"] + client_secret = created["UserPoolClient"]["ClientSecret"] + print(f" Created client: {client_id}") + else: + print(f" Client exists: {client_id}") + + domain = user_pool_id.replace("_", "").lower() + discovery_url = ( + f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}" + f"/.well-known/openid-configuration" + ) + scope_string = " ".join(scope_names) + + return { + "user_pool_id": user_pool_id, + "client_id": client_id, + "client_secret": client_secret, + "discovery_url": discovery_url, + "domain": domain, + "scope": scope_string, + } + + +def create_gateway(gateway_client, name, role_arn, cognito_config): + """Create the AgentCore Gateway with MCP protocol.""" + create_response = gateway_client.create_gateway( + name=name, + roleArn=role_arn, + protocolType="MCP", + protocolConfiguration={ + "mcp": {"supportedVersions": ["2025-03-26"], "searchType": "SEMANTIC"} + }, + authorizerType="CUSTOM_JWT", + authorizerConfiguration={ + "customJWTAuthorizer": { + "allowedClients": [cognito_config["client_id"]], + "discoveryUrl": cognito_config["discovery_url"], + } + }, + description="AgentCore Gateway with Web Search Tool", + ) + + gateway_id = create_response["gatewayId"] + gateway_url = create_response["gatewayUrl"] + print(f" Gateway ID: {gateway_id}") + print(f" Gateway URL: {gateway_url}") + + status = wait_for_status(gateway_client, gateway_id) + print(f" Gateway status: {status}") + + return gateway_id, gateway_url + + +def create_web_search_target(gateway_client, gateway_id): + """Create the Web Search Tool connector target.""" + target_response = gateway_client.create_gateway_target( + name="web-search-tool", + gatewayIdentifier=gateway_id, + targetConfiguration={ + "mcp": { + "connector": { + "source": {"connectorId": "web-search"}, + "configurations": [ + {"name": "WebSearch", "parameterValues": {}} + ], + } + } + }, + credentialProviderConfigurations=[ + {"credentialProviderType": "GATEWAY_IAM_ROLE"} + ], + ) + + target_id = target_response["targetId"] + print(f" Target ID: {target_id}") + + if wait_for_targets(gateway_client, gateway_id): + print(" Target status: READY ✓") + else: + print(" WARNING: Target did not reach READY state within timeout") + + return target_id + + +# ── Main ────────────────────────────────────────────────────────────────────── + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Set up AgentCore Gateway with Web Search Tool target" + ) + parser.add_argument( + "--gateway-name", + default="web-search-gateway", + help="Name for the Gateway (default: web-search-gateway)", + ) + parser.add_argument( + "--region", + default=REGION, + help="AWS region (default: us-east-1)", + ) + return parser.parse_args() + + +def main(): + args = parse_args() + region = args.region + + print("=" * 60) + print("AgentCore Web Search Tool — Gateway Setup") + print("=" * 60) + + # Get account ID + sts_client = boto3.client("sts", region_name=region) + account_id = sts_client.get_caller_identity()["Account"] + print(f"\nAccount: {account_id}") + print(f"Region: {region}") + + # Step 1: IAM Role + print("\n[1/4] Creating Gateway service role...") + iam_client = boto3.client("iam") + role_name = f"agentcore-{args.gateway_name}-role" + role_arn = create_gateway_role(iam_client, role_name, account_id, region) + + # Step 2: Cognito + print("\n[2/4] Setting up Cognito authentication...") + cognito_client = boto3.client("cognito-idp", region_name=region) + cognito_config = create_cognito_resources(cognito_client, region) + + # Step 3: Gateway + print("\n[3/4] Creating AgentCore Gateway...") + gateway_client = boto3.client("bedrock-agentcore-control", region_name=region) + gateway_id, gateway_url = create_gateway( + gateway_client, args.gateway_name, role_arn, cognito_config + ) + + # Step 4: Web Search Target + print("\n[4/4] Creating Web Search Tool target...") + create_web_search_target(gateway_client, gateway_id) + + # Print environment variables for other demos + print("\n" + "=" * 60) + print("SETUP COMPLETE") + print("=" * 60) + print("\nExport these environment variables to use with other demos:\n") + print(f"export AGENTCORE_GATEWAY_URL=\"{gateway_url}\"") + print(f"export COGNITO_DOMAIN=\"{cognito_config['domain']}\"") + print(f"export COGNITO_CLIENT_ID=\"{cognito_config['client_id']}\"") + print(f"export COGNITO_CLIENT_SECRET=\"{cognito_config['client_secret']}\"") + print(f"export COGNITO_SCOPE=\"{cognito_config['scope']}\"") + print(f"export AWS_DEFAULT_REGION=\"{region}\"") + print(f"\n# Gateway ID (for cleanup): {gateway_id}") + print(f"# IAM Role: {role_name}") + print(f"# Cognito Pool: {cognito_config['user_pool_id']}") + + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md new file mode 100644 index 000000000..8d84d79d2 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md @@ -0,0 +1,90 @@ +# Raw MCP Tool Discovery and Invocation + +## Overview + +This demo calls the AgentCore Gateway directly using the MCP protocol — no agent framework involved. It's the simplest way to verify your Gateway and Web Search Tool target are working correctly. + +``` +┌──────────────────┐ tools/list ┌─────────────────────────────────┐ +│ raw_mcp_call.py │ ──────────────▶ │ AgentCore Gateway │ +│ │ │ │ +│ MCPClient │ tools/call │ Target: web-search (connector) │ +│ (Streamable │ ──────────────▶ │ │ +│ HTTP) │◀────────────── │ → WebSearch results │ +└──────────────────┘ results └─────────────────────────────────┘ +``` + +## How It Works + +### Tool Discovery (`tools/list`) + +The MCP `tools/list` call returns all tools available on the Gateway. For a Gateway with only the Web Search connector target, you'll see one tool: + +```json +{ + "name": "WebSearch", + "description": "Search the web for current information", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Search query (max 200 characters)" + } + }, + "required": ["query"] + } +} +``` + +### Tool Invocation (`tools/call`) + +Calling the tool with a query returns structured results: + +```json +{ + "results": [ + { + "text": "Snippet from the web page...", + "url": "https://example.com/article", + "title": "Article Title", + "publishedDate": "2026-05-28" + } + ] +} +``` + +### Authentication Flow + +1. The script obtains an OAuth token from Cognito (`client_credentials` flow) +2. The token is passed as a `Bearer` header on the MCP Streamable HTTP transport +3. The Gateway validates the JWT and authorizes the request + +## Prerequisites + +```bash +pip install -r ../requirements.txt +``` + +Run `01-setup-gateway/setup_gateway.py` first and export the environment variables it prints. + +## Usage + +```bash +# Default query +python raw_mcp_call.py + +# Custom query +python raw_mcp_call.py --query "Latest Python release" +python raw_mcp_call.py --query "AWS re:Invent 2026 announcements" +``` + +## IAM Permissions + +No direct IAM permissions needed — authentication is handled via the Cognito OAuth token. The Gateway's service role provides the `bedrock-agentcore:InvokeWebSearch` permission. + +## Files + +| File | Description | +|:-----|:------------| +| `raw_mcp_call.py` | Main demo script — tool discovery and invocation | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py new file mode 100644 index 000000000..ff8c879b9 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py @@ -0,0 +1,124 @@ +""" +Raw MCP Tool Discovery and Invocation against AgentCore Gateway. + +Demonstrates direct MCP protocol calls without an agent framework: + 1. Connect to the Gateway using MCP Streamable HTTP transport + 2. Call tools/list to discover the WebSearch tool and its schema + 3. Call tools/call to invoke WebSearch with a test query + 4. Display the structured results + +This is useful for verifying your Gateway setup before integrating +with an agent framework. + +Prerequisites: + pip install -r ../requirements.txt + Export environment variables from 01-setup-gateway/setup_gateway.py + +Environment variables required: + AGENTCORE_GATEWAY_URL — Gateway MCP endpoint + COGNITO_DOMAIN — Cognito domain prefix + COGNITO_CLIENT_ID — Cognito app client ID + COGNITO_CLIENT_SECRET — Cognito app client secret + COGNITO_SCOPE — OAuth scope string + +IAM permissions required: + bedrock-agentcore:InvokeGateway (via OAuth token) + +Usage: + python raw_mcp_call.py + python raw_mcp_call.py --query "Latest Python release" +""" + +import argparse +import json +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +from utils.gateway_auth import create_streamable_http_transport + +from strands.tools.mcp.mcp_client import MCPClient + +# ── Configuration ───────────────────────────────────────────────────────────── + +DEFAULT_QUERY = "What is today's news around the world?" + + +# ── Main ────────────────────────────────────────────────────────────────────── + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Raw MCP tool discovery and invocation against AgentCore Gateway" + ) + parser.add_argument( + "--query", + default=DEFAULT_QUERY, + help=f"Search query (default: '{DEFAULT_QUERY}')", + ) + return parser.parse_args() + + +def main(): + args = parse_args() + + print("=" * 60) + print("AgentCore Web Search Tool — Raw MCP Calls") + print("=" * 60) + + # Create MCP client + transport_factory = create_streamable_http_transport() + mcp_client = MCPClient(transport_factory) + + with mcp_client: + # Step 1: Discover tools + print("\n[1] Discovering tools (tools/list)...\n") + tools = mcp_client.list_tools_sync() + print(f" Found {len(tools)} tool(s):\n") + + for tool in tools: + spec = tool.tool_spec + print(f" Name: {spec['name']}") + print(f" Description: {spec.get('description', 'N/A')}") + schema_str = json.dumps(spec.get("inputSchema", {}), indent=2) + # Truncate long schemas for readability + if len(schema_str) > 200: + schema_str = schema_str[:200] + "..." + print(f" Input: {schema_str}") + print() + + # Step 2: Invoke WebSearch + print("=" * 60) + print(f"[2] Calling WebSearch: '{args.query}'") + print("=" * 60 + "\n") + + # Find the WebSearch tool + ws_tools = [t for t in tools if "WebSearch" in t.tool_name] + if not ws_tools: + print(" ERROR: WebSearch tool not found. Check your Gateway target.") + return + + ws_tool_name = ws_tools[0].tool_name + result = mcp_client.call_tool_sync( + "raw-mcp-demo", ws_tool_name, {"query": args.query} + ) + + # Step 3: Display results + print("[3] Results:\n") + for content in result.get("content", result if isinstance(result, list) else [result]): + if isinstance(content, dict) and "text" in content: + try: + parsed = json.loads(content["text"]) + print(json.dumps(parsed, indent=2)) + except (ValueError, TypeError): + print(content["text"][:2000]) + else: + print(content) + + print("\n" + "=" * 60) + print("Demo complete!") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md new file mode 100644 index 000000000..40a829661 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md @@ -0,0 +1,97 @@ +# Web Search with a Strands AI Agent + +## Overview + +This demo shows the complete agent integration: a Strands agent automatically discovers and invokes the Web Search Tool to answer real-time questions with cited sources. + +``` +┌────────────┐ "What's the latest AI news?" ┌──────────────────────────┐ +│ User │ ─────────────────────────────▶ │ Strands Agent │ +│ │◀───────────────────────────── │ (Claude Sonnet 4) │ +│ │ "Here's what I found: [...]" │ │ +└────────────┘ │ tools: [WebSearch] │ + │ │ │ + └───────┼──────────────────┘ + │ MCP tools/call + ▼ + ┌──────────────────────────┐ + │ AgentCore Gateway │ + │ → Web Search Connector │ + │ → Structured results │ + └──────────────────────────┘ +``` + +## How It Works + +### Tool Discovery + +The agent connects to the Gateway via MCP Streamable HTTP and calls `tools/list`. The Gateway returns the `WebSearch` tool with its input schema. Strands automatically registers it as an available tool for the LLM. + +### Agent Loop + +When you ask a question: + +1. Strands sends the query + tool schema to Claude Sonnet 4 +2. Claude decides to call `WebSearch` with a concise search query +3. Strands invokes the tool via MCP `tools/call` on the Gateway +4. The Gateway routes to the Web Search connector and returns results +5. Results are fed back to Claude as a tool result +6. Claude synthesizes a final answer with cited sources + +### Shared Agent (`utils/web_search_agent.py`) + +The agent factory handles MCP client setup and tool discovery: + +```python +from utils.web_search_agent import create_agent, create_mcp_client + +mcp_client = create_mcp_client() + +with mcp_client: + agent = create_agent(mcp_client) + result = agent("What is the latest version of Python?") + print(result.message) +``` + +The `create_mcp_client()` function handles OAuth token retrieval and transport creation. The `create_agent()` function discovers tools and configures the Strands agent with an appropriate system prompt. + +## Prerequisites + +```bash +pip install -r ../requirements.txt +``` + +Run `01-setup-gateway/setup_gateway.py` first and export the environment variables it prints. + +Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) in us-east-1. + +## Usage + +```bash +# Run default demo queries +python web_search_strands.py + +# Custom query +python web_search_strands.py --query "What are the latest AI announcements?" +python web_search_strands.py --query "Current price of Bitcoin" +``` + +## IAM Permissions + +```json +{ + "Effect": "Allow", + "Action": "bedrock:InvokeModel", + "Resource": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-20250514-v1:0" +} +``` + +Gateway invocation is authorized via the Cognito OAuth token — no additional IAM permissions needed for the caller. + +## Files + +| File | Description | +|:-----|:------------| +| `web_search_strands.py` | Main demo script — Strands agent with web search | +| `../utils/web_search_agent.py` | Shared agent factory with MCP client setup | +| `../utils/gateway_auth.py` | OAuth token retrieval and transport creation | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py new file mode 100644 index 000000000..a382e930a --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py @@ -0,0 +1,109 @@ +""" +Web Search with a Strands AI Agent. + +Demonstrates a Strands agent that uses the Web Search Tool via AgentCore +Gateway to answer real-time questions: + 1. Connect to the Gateway using MCP Streamable HTTP transport + 2. Discover the WebSearch tool via tools/list + 3. Create a Strands agent with the discovered tools + 4. Ask a question — the agent invokes WebSearch automatically + 5. Get a grounded response with cited sources + +Prerequisites: + pip install -r ../requirements.txt + Export environment variables from 01-setup-gateway/setup_gateway.py + Access to Claude Sonnet 4 in us-east-1 + +Environment variables required: + AGENTCORE_GATEWAY_URL — Gateway MCP endpoint + COGNITO_DOMAIN — Cognito domain prefix + COGNITO_CLIENT_ID — Cognito app client ID + COGNITO_CLIENT_SECRET — Cognito app client secret + COGNITO_SCOPE — OAuth scope string + +IAM permissions required: + bedrock:InvokeModel (for Claude Sonnet 4) + +Usage: + python web_search_strands.py + python web_search_strands.py --query "What are the latest AI announcements?" +""" + +import argparse +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +from utils.web_search_agent import create_agent, create_mcp_client + +# ── Configuration ───────────────────────────────────────────────────────────── + +DEFAULT_QUERIES = [ + "What is today's news around the world?", + "What are the latest developments in quantum computing?", +] + + +# ── Main ────────────────────────────────────────────────────────────────────── + + +def run_query(agent, query: str): + """Run a single query through the agent and print the response.""" + print(f"\n{'=' * 60}") + print(f"Query: {query}") + print("=" * 60) + + response = agent(query) + + print("\n[Agent Response]") + print("-" * 60) + if hasattr(response, "message"): + content = response.message.get("content", []) + for block in content: + if block.get("text"): + print(block["text"]) + else: + print(str(response)) + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Strands agent with Web Search Tool via AgentCore Gateway" + ) + parser.add_argument( + "--query", + default=None, + help="Custom query (runs default queries if omitted)", + ) + return parser.parse_args() + + +def main(): + args = parse_args() + + print("=" * 60) + print("AgentCore Web Search Tool — Strands Agent") + print("=" * 60) + + mcp_client = create_mcp_client() + + with mcp_client: + # Discover tools + tools = mcp_client.list_tools_sync() + print(f"\nDiscovered {len(tools)} tool(s) from Gateway") + + # Create agent + agent = create_agent(mcp_client) + + # Run queries + queries = [args.query] if args.query else DEFAULT_QUERIES + for q in queries: + run_query(agent, q) + + print("\n" + "=" * 60) + print("Demo complete!") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md new file mode 100644 index 000000000..e289f69b5 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md @@ -0,0 +1,99 @@ +# Web Search with a LangChain Agent + +## Overview + +This demo shows the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore Gateway and `create_react_agent` from LangGraph for the agent loop. + +``` +┌────────────┐ "Latest AWS announcements?" ┌──────────────────────────┐ +│ User │ ─────────────────────────────▶ │ LangChain Agent │ +│ │◀───────────────────────────── │ (ChatBedrockConverse) │ +│ │ "Here's what I found: [...]" │ │ +└────────────┘ │ tools from MCP client │ + │ │ │ + └───────┼──────────────────┘ + │ MultiServerMCPClient + ▼ + ┌──────────────────────────┐ + │ AgentCore Gateway │ + │ → Web Search Connector │ + └──────────────────────────┘ +``` + +## How It Works + +### MCP Client Setup + +`langchain-mcp-adapters` provides `MultiServerMCPClient` which connects to one or more MCP servers and converts their tools into LangChain-compatible tool objects: + +```python +from langchain_mcp_adapters.client import MultiServerMCPClient + +async with MultiServerMCPClient({ + "web-search": { + "transport": "streamable_http", + "url": gateway_url, + "headers": {"Authorization": f"Bearer {token}"}, + } +}) as client: + tools = client.get_tools() + # tools is a list of LangChain Tool objects +``` + +### Agent Creation + +The agent uses LangGraph's `create_react_agent` with `ChatBedrockConverse` as the LLM: + +```python +from langchain_aws import ChatBedrockConverse +from langgraph.prebuilt import create_react_agent + +model = ChatBedrockConverse( + model="us.anthropic.claude-sonnet-4-20250514-v1:0", + region_name="us-east-1", +) +agent = create_react_agent(model, tools=tools) +result = await agent.ainvoke({"messages": [{"role": "user", "content": query}]}) +``` + +### Async Execution + +LangChain's MCP adapter uses async I/O. The demo wraps the agent call in `asyncio.run()` for CLI usage. + +## Prerequisites + +```bash +pip install -r ../requirements.txt +``` + +Run `01-setup-gateway/setup_gateway.py` first and export the environment variables it prints. + +Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) in us-east-1. + +## Usage + +```bash +# Default query +python web_search_langchain.py + +# Custom query +python web_search_langchain.py --query "Latest AWS announcements" +python web_search_langchain.py --query "Python 3.13 new features" +``` + +## IAM Permissions + +```json +{ + "Effect": "Allow", + "Action": "bedrock:InvokeModel", + "Resource": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-20250514-v1:0" +} +``` + +## Files + +| File | Description | +|:-----|:------------| +| `web_search_langchain.py` | Main demo script — LangChain agent with web search | +| `../utils/gateway_auth.py` | OAuth token retrieval (shared with other demos) | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py new file mode 100644 index 000000000..4a18bd4cb --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py @@ -0,0 +1,131 @@ +""" +Web Search with a LangChain Agent. + +Demonstrates a LangChain agent that uses the Web Search Tool via AgentCore +Gateway to answer real-time questions: + 1. Connect to the Gateway using langchain-mcp-adapters MultiServerMCPClient + 2. Discover tools from the Gateway + 3. Create a LangChain agent with ChatBedrockConverse + 4. Ask a question — the agent invokes WebSearch automatically + 5. Get a grounded response with cited sources + +Prerequisites: + pip install -r ../requirements.txt + Export environment variables from 01-setup-gateway/setup_gateway.py + Access to Claude Sonnet 4 in us-east-1 + +Environment variables required: + AGENTCORE_GATEWAY_URL — Gateway MCP endpoint + COGNITO_DOMAIN — Cognito domain prefix + COGNITO_CLIENT_ID — Cognito app client ID + COGNITO_CLIENT_SECRET — Cognito app client secret + COGNITO_SCOPE — OAuth scope string + +IAM permissions required: + bedrock:InvokeModel (for Claude Sonnet 4) + +Usage: + python web_search_langchain.py + python web_search_langchain.py --query "Latest AWS announcements" +""" + +import argparse +import asyncio +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +from utils.gateway_auth import get_oauth_token + +from langchain_aws import ChatBedrockConverse +from langchain_mcp_adapters.client import MultiServerMCPClient +from langgraph.prebuilt import create_react_agent + +# ── Configuration ───────────────────────────────────────────────────────────── + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") +MODEL_ID = os.getenv( + "BEDROCK_MODEL_ID", "us.anthropic.claude-sonnet-4-20250514-v1:0" +) +GATEWAY_URL = os.getenv("AGENTCORE_GATEWAY_URL", "") + +DEFAULT_QUERY = "What is today's news around the world?" + + +# ── Agent ───────────────────────────────────────────────────────────────────── + + +async def run_agent(query: str): + """Create and run a LangChain agent with Web Search tools.""" + # Get OAuth token for Gateway authentication + token = get_oauth_token() + + # Configure the LLM + model = ChatBedrockConverse( + model=MODEL_ID, + region_name=REGION, + temperature=0.7, + max_tokens=1024, + ) + + # Connect to the Gateway as an MCP client + async with MultiServerMCPClient( + { + "web-search": { + "transport": "streamable_http", + "url": GATEWAY_URL, + "headers": {"Authorization": f"Bearer {token}"}, + } + } + ) as client: + tools = client.get_tools() + print(f" Discovered {len(tools)} tool(s)") + + # Create and run the agent + agent = create_react_agent(model, tools=tools) + result = await agent.ainvoke( + {"messages": [{"role": "user", "content": query}]} + ) + + # Print the final response + print("\n[Agent Response]") + print("-" * 60) + final_message = result["messages"][-1] + if hasattr(final_message, "content"): + print(final_message.content) + else: + print(str(final_message)) + + +# ── Main ────────────────────────────────────────────────────────────────────── + + +def parse_args(): + parser = argparse.ArgumentParser( + description="LangChain agent with Web Search Tool via AgentCore Gateway" + ) + parser.add_argument( + "--query", + default=DEFAULT_QUERY, + help=f"Search query (default: '{DEFAULT_QUERY}')", + ) + return parser.parse_args() + + +def main(): + args = parse_args() + + print("=" * 60) + print("AgentCore Web Search Tool — LangChain Agent") + print("=" * 60) + print(f"\nQuery: {args.query}\n") + + asyncio.run(run_agent(args.query)) + + print("\n" + "=" * 60) + print("Demo complete!") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/README.md new file mode 100644 index 000000000..5d3ad7ae8 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/README.md @@ -0,0 +1,22 @@ +# Resource Cleanup + +## Overview + +Deletes all AWS resources created by the setup script: Gateway targets, Gateway, Cognito User Pool, and IAM role. + +## Usage + +Use the resource IDs printed by `01-setup-gateway/setup_gateway.py`: + +```bash +python cleanup.py \ + --gateway-id gw-abc123def456 \ + --user-pool-id us-east-1_AbCdEfGh \ + --role-name agentcore-web-search-gateway-role +``` + +## Files + +| File | Description | +|:-----|:------------| +| `cleanup.py` | Deletes Gateway, Cognito, and IAM resources | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py new file mode 100644 index 000000000..82119344a --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py @@ -0,0 +1,132 @@ +""" +Clean up all resources created by the Web Search Tool setup. + +Deletes in order: + 1. Gateway targets and Gateway + 2. Cognito User Pool (domain, clients, pool) + 3. IAM Role and inline policies + +Prerequisites: + pip install -r ../requirements.txt + AWS credentials with permissions to delete the resources. + +Usage: + python cleanup.py --gateway-id --user-pool-id --role-name + python cleanup.py --gateway-id gw-abc123 --user-pool-id us-east-1_AbCdEf --role-name agentcore-web-search-gateway-role +""" + +import argparse +import os +import time + +import boto3 + +# ── Configuration ───────────────────────────────────────────────────────────── + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") + + +# ── Cleanup Steps ───────────────────────────────────────────────────────────── + + +def delete_gateway(gateway_client, gateway_id): + """Delete all targets and the gateway itself.""" + print("\n[1/3] Deleting Gateway resources...") + try: + targets = gateway_client.list_gateway_targets( + gatewayIdentifier=gateway_id, maxResults=100 + ) + for item in targets["items"]: + gateway_client.delete_gateway_target( + gatewayIdentifier=gateway_id, targetId=item["targetId"] + ) + print(f" Deleted target: {item['name']}") + + time.sleep(10) + gateway_client.delete_gateway(gatewayIdentifier=gateway_id) + print(f" Deleted gateway: {gateway_id}") + except Exception as e: + print(f" Error deleting gateway: {e}") + + +def delete_cognito(cognito_client, user_pool_id): + """Delete the Cognito User Pool and its domain.""" + print("\n[2/3] Deleting Cognito resources...") + try: + domain = user_pool_id.replace("_", "").lower() + cognito_client.delete_user_pool_domain( + Domain=domain, UserPoolId=user_pool_id + ) + cognito_client.delete_user_pool(UserPoolId=user_pool_id) + print(f" Deleted user pool: {user_pool_id}") + except Exception as e: + print(f" Error deleting Cognito: {e}") + + +def delete_iam_role(iam_client, role_name): + """Delete the IAM role and its inline policies.""" + print("\n[3/3] Deleting IAM resources...") + try: + # Delete inline policies + policies = iam_client.list_role_policies(RoleName=role_name) + for policy_name in policies["PolicyNames"]: + iam_client.delete_role_policy( + RoleName=role_name, PolicyName=policy_name + ) + print(f" Deleted policy: {policy_name}") + + iam_client.delete_role(RoleName=role_name) + print(f" Deleted role: {role_name}") + except Exception as e: + print(f" Error deleting IAM role: {e}") + + +# ── Main ────────────────────────────────────────────────────────────────────── + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Clean up Web Search Tool Gateway resources" + ) + parser.add_argument( + "--gateway-id", required=True, help="Gateway ID to delete" + ) + parser.add_argument( + "--user-pool-id", required=True, help="Cognito User Pool ID to delete" + ) + parser.add_argument( + "--role-name", required=True, help="IAM role name to delete" + ) + parser.add_argument( + "--region", default=REGION, help="AWS region (default: us-east-1)" + ) + return parser.parse_args() + + +def main(): + args = parse_args() + region = args.region + + print("=" * 60) + print("AgentCore Web Search Tool — Resource Cleanup") + print("=" * 60) + print(f"\nRegion: {region}") + print(f"Gateway ID: {args.gateway_id}") + print(f"User Pool ID: {args.user_pool_id}") + print(f"Role Name: {args.role_name}") + + gateway_client = boto3.client("bedrock-agentcore-control", region_name=region) + cognito_client = boto3.client("cognito-idp", region_name=region) + iam_client = boto3.client("iam") + + delete_gateway(gateway_client, args.gateway_id) + delete_cognito(cognito_client, args.user_pool_id) + delete_iam_role(iam_client, args.role_name) + + print("\n" + "=" * 60) + print("✅ All resources cleaned up successfully!") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md new file mode 100644 index 000000000..5eb7e691e --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md @@ -0,0 +1,188 @@ +# AgentCore Web Search Tool + +## Overview + +[Amazon Bedrock AgentCore Web Search Tool](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) exposes web search as a fully managed, MCP-compliant tool through Amazon Bedrock AgentCore Gateway. Your agents discover and invoke it using the standard Model Context Protocol — no custom integrations, no infrastructure to manage. + +![Web Search Tool Architecture](images/tutorial-architecture.png) + +## How the Web Search Tool Works + +### Gateway + Connector Architecture + +The Web Search Tool uses the **connector** target type — a fully AWS-managed integration that requires no schema, no endpoint configuration, and no outbound credential setup. You specify `connectorId: "web-search"` and the Gateway handles everything else. + +``` +┌─────────────┐ OAuth Token ┌──────────────────────────────────┐ +│ Your Agent │ ───────────────▶ │ AgentCore Gateway (MCP) │ +│ (Strands, │ │ │ +│ LangChain, │ tools/list │ ┌────────────────────────────┐ │ +│ or any MCP │ ───────────────▶ │ │ Web Search Connector │ │ +│ client) │ │ │ connectorId: "web-search" │ │ +│ │ tools/call │ │ │ │ +│ │ ───────────────▶ │ │ → Real-time web results │ │ +│ │◀─────────────── │ └────────────────────────────┘ │ +└─────────────┘ results └──────────────────────────────────┘ +``` + +### Key Capabilities + +- **Real-time information access** — Retrieve current web results with titles, URLs, snippets, and publication dates +- **Zero infrastructure management** — No search APIs to provision or scaling to configure +- **Framework agnostic** — Works with Strands Agents, LangChain, LangGraph, CrewAI, or any MCP-compatible client +- **Structured results** — Results returned in both MCP `content` (text) and `structuredContent` (typed JSON) formats + +### How It Works + +1. **Gateway setup** — Create an AgentCore Gateway and add a Web Search Tool target using `connectorId: "web-search"` +2. **Tool discovery** — Your agent calls `tools/list` on the Gateway endpoint and discovers `WebSearch` with its input schema +3. **Search invocation** — Your agent calls `tools/call` with a natural language query (up to 200 characters) +4. **Structured results** — The tool returns results with text snippets, URLs, titles, and publication dates +5. **Grounded response** — Your agent uses the results to compose a response with cited sources + +### Response Format + +```json +{ + "results": [ + { + "text": "Snippet from the web page...", + "url": "https://example.com/article", + "title": "Article Title", + "publishedDate": "2026-05-28" + } + ] +} +``` + +| Field | Type | Required | Description | +|:------|:-----|:---------|:------------| +| `text` | string | Yes | Text content or snippet of the search result | +| `url` | string | No | URL of the source webpage | +| `title` | string | No | Title of the source webpage | +| `publishedDate` | string | No | Publication date of the result | + +> **Note:** Queries longer than 200 characters may not return results. Keep queries concise. + +### Authentication + +- **Inbound**: Amazon Cognito with `client_credentials` OAuth flow (can use other OAuth providers) +- **Outbound**: Automatic — the Gateway uses its own IAM role to authenticate to the Web Search backend + +## Demos + +| Folder | Framework | What You'll Learn | +|:-------|:----------|:------------------| +| [01-setup-gateway/](01-setup-gateway/) | boto3 (SDK) | Create IAM role, Cognito, Gateway, and Web Search target | +| [02-raw-mcp/](02-raw-mcp/) | MCP protocol | Direct tool discovery and invocation without an agent | +| [03-strands-agent/](03-strands-agent/) | Strands Agents | Full agent loop with automatic tool selection and cited responses | +| [04-langchain-agent/](04-langchain-agent/) | LangChain + LangGraph | Same integration using LangChain's MCP adapter | +| [05-cleanup/](05-cleanup/) | boto3 (SDK) | Delete all resources created by the setup | + +## Quick Start + +```bash +pip install -r requirements.txt + +# Step 1: Create Gateway and Web Search target +python 01-setup-gateway/setup_gateway.py + +# Step 2: Export the environment variables printed by setup +export AGENTCORE_GATEWAY_URL="..." +export COGNITO_DOMAIN="..." +export COGNITO_CLIENT_ID="..." +export COGNITO_CLIENT_SECRET="..." +export COGNITO_SCOPE="agentcore-websearch/invoke" +export AWS_DEFAULT_REGION="us-east-1" + +# Step 3: Verify with raw MCP calls +python 02-raw-mcp/raw_mcp_call.py + +# Step 4: Run with Strands agent +python 03-strands-agent/web_search_strands.py + +# Step 5: Run with LangChain agent +python 04-langchain-agent/web_search_langchain.py + +# Cleanup when done +python 05-cleanup/cleanup.py --gateway-id --user-pool-id --role-name +``` + +## Shared Utilities + +Demos 02–04 share authentication and agent utilities in `utils/`: + +```python +from utils.gateway_auth import get_oauth_token, create_streamable_http_transport +from utils.web_search_agent import create_agent, create_mcp_client +``` + +- `gateway_auth.py` — OAuth token retrieval from Cognito and MCP transport factory +- `web_search_agent.py` — Strands agent factory with Web Search tools + +## IAM Permissions + +### Caller (setup script) + +```json +{ + "Effect": "Allow", + "Action": [ + "iam:CreateRole", + "iam:PutRolePolicy", + "iam:GetRole", + "cognito-idp:CreateUserPool", + "cognito-idp:CreateUserPoolDomain", + "cognito-idp:CreateResourceServer", + "cognito-idp:CreateUserPoolClient", + "bedrock-agentcore:CreateGateway", + "bedrock-agentcore:GetGateway", + "bedrock-agentcore:CreateGatewayTarget", + "bedrock-agentcore:ListGatewayTargets" + ], + "Resource": "*" +} +``` + +### Caller (agent demos) + +```json +{ + "Effect": "Allow", + "Action": "bedrock:InvokeModel", + "Resource": "*" +} +``` + +### Gateway Service Role (created by setup) + +```json +{ + "Effect": "Allow", + "Action": [ + "bedrock-agentcore:InvokeGateway", + "bedrock-agentcore:InvokeWebSearch" + ], + "Resource": [ + "arn:aws:bedrock-agentcore:us-east-1::gateway/*", + "arn:aws:bedrock-agentcore:us-east-1:aws:tool/web-search.v1" + ] +} +``` + +## Region Availability + +The Web Search Tool connector is currently available in **us-east-1** only. + +## Files + +| File | Description | +|:-----|:------------| +| `requirements.txt` | Python dependencies for all sub-demos | +| `utils/gateway_auth.py` | Shared OAuth and MCP transport utilities | +| `utils/web_search_agent.py` | Shared Strands agent factory | +| `01-setup-gateway/` | Gateway and target creation script | +| `02-raw-mcp/` | Direct MCP protocol demo | +| `03-strands-agent/` | Strands agent demo | +| `04-langchain-agent/` | LangChain agent demo | +| `05-cleanup/` | Resource deletion script | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/images/inbound-and-outbound-auth.png b/01-features/03-connect-your-agent-to-anything/03-web-search/images/inbound-and-outbound-auth.png new file mode 100644 index 0000000000000000000000000000000000000000..c833f09a5e1594a712121aa6a0760ca83904ab54 GIT binary patch literal 19563 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 literal 0 HcmV?d00001 diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/images/tutorial-architecture.png b/01-features/03-connect-your-agent-to-anything/03-web-search/images/tutorial-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d044ca4ec974212f19d4e0613c01ef01750c75 GIT binary patch literal 31128 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.1.8 +mcp +requests +langchain +langchain-mcp-adapters +langchain-aws +langgraph diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/__init__.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py new file mode 100644 index 000000000..214b2ef0f --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py @@ -0,0 +1,104 @@ +""" +Shared Gateway authentication utilities for Web Search Tool demos. + +Provides helpers for: + - Obtaining OAuth tokens from Cognito (client_credentials flow) + - Creating MCP Streamable HTTP transports authenticated against the Gateway + +All demos in this folder share these utilities to avoid duplicating +auth boilerplate. +""" + +import os + +import requests +from mcp.client.streamable_http import streamablehttp_client + + +# ── Configuration ───────────────────────────────────────────────────────────── + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") +GATEWAY_URL = os.getenv("AGENTCORE_GATEWAY_URL", "") +COGNITO_DOMAIN = os.getenv("COGNITO_DOMAIN", "") +COGNITO_CLIENT_ID = os.getenv("COGNITO_CLIENT_ID", "") +COGNITO_CLIENT_SECRET = os.getenv("COGNITO_CLIENT_SECRET", "") +COGNITO_SCOPE = os.getenv("COGNITO_SCOPE", "") + + +# ── Token retrieval ─────────────────────────────────────────────────────────── + + +def get_oauth_token( + domain: str = "", + client_id: str = "", + client_secret: str = "", + scope: str = "", + region: str = "", +) -> str: + """Retrieve a fresh OAuth token from Cognito using client_credentials flow. + + Args: + domain: Cognito domain prefix (e.g., "us-east-1abcdef12"). + client_id: Cognito app client ID. + client_secret: Cognito app client secret. + scope: OAuth scope string (e.g., "agentcore-websearch/invoke"). + region: AWS region for the Cognito endpoint. + + Returns: + Access token string. + """ + domain = domain or COGNITO_DOMAIN + client_id = client_id or COGNITO_CLIENT_ID + client_secret = client_secret or COGNITO_CLIENT_SECRET + scope = scope or COGNITO_SCOPE + region = region or REGION + + if not all([domain, client_id, client_secret]): + raise ValueError( + "Cognito credentials not configured. Set COGNITO_DOMAIN, " + "COGNITO_CLIENT_ID, and COGNITO_CLIENT_SECRET environment variables." + ) + + url = f"https://{domain}.auth.{region}.amazoncognito.com/oauth2/token" + response = requests.post( + url, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + data={ + "grant_type": "client_credentials", + "client_id": client_id, + "client_secret": client_secret, + "scope": scope, + }, + ) + response.raise_for_status() + return response.json()["access_token"] + + +# ── MCP transport factory ───────────────────────────────────────────────────── + + +def create_streamable_http_transport(gateway_url: str = "", **token_kwargs): + """Create an MCP Streamable HTTP transport authenticated with a Bearer token. + + Args: + gateway_url: The AgentCore Gateway MCP endpoint URL. + **token_kwargs: Passed to get_oauth_token() for credential overrides. + + Returns: + A callable suitable for MCPClient initialization. + """ + gateway_url = gateway_url or GATEWAY_URL + if not gateway_url: + raise ValueError( + "Gateway URL not configured. Set AGENTCORE_GATEWAY_URL environment variable." + ) + + token = get_oauth_token(**token_kwargs) + + def _transport(): + return streamablehttp_client( + gateway_url, + headers={"Authorization": f"Bearer {token}"}, + ) + + return _transport diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py new file mode 100644 index 000000000..f656cd315 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py @@ -0,0 +1,80 @@ +""" +Shared Strands agent using AgentCore Web Search Tool via Gateway. + +Used as the common demo agent across web search sub-demos: + - 02-strands-agent/web_search_strands.py + +The agent connects to an AgentCore Gateway that exposes the Web Search Tool +as an MCP-compliant connector target. Tools are discovered dynamically via +the MCP tools/list endpoint. +""" + +import os + +from strands import Agent +from strands.models import BedrockModel +from strands.tools.mcp.mcp_client import MCPClient + +from utils.gateway_auth import create_streamable_http_transport + +# ── Configuration ───────────────────────────────────────────────────────────── + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") +MODEL_ID = os.getenv( + "BEDROCK_MODEL_ID", "us.anthropic.claude-sonnet-4-20250514-v1:0" +) + +SYSTEM_PROMPT = """You are a helpful research assistant with access to real-time web search. + +PRINCIPLES: +- Use the WebSearch tool to find current information when answering questions +- Always cite your sources with URLs when providing information from search results +- If search results are insufficient, say so rather than guessing +- Keep queries concise (under 200 characters) for best results +- Synthesize information from multiple results when possible + +RESPONSE FORMAT: +- Provide clear, well-structured answers +- Include source URLs for verification +- Note the publication date of sources when available +""" + + +# ── Factory ──────────────────────────────────────────────────────────────────── + + +def create_mcp_client(gateway_url: str = "", **token_kwargs) -> MCPClient: + """Create an MCPClient connected to the AgentCore Gateway. + + Args: + gateway_url: The Gateway MCP endpoint URL. + **token_kwargs: Passed to gateway_auth for credential overrides. + + Returns: + MCPClient instance (must be used as a context manager). + """ + transport_factory = create_streamable_http_transport( + gateway_url=gateway_url, **token_kwargs + ) + return MCPClient(transport_factory) + + +def create_agent(mcp_client: MCPClient) -> Agent: + """Create a Strands agent with Web Search tools from the Gateway. + + The mcp_client must already be entered as a context manager (i.e., + call this inside a `with mcp_client:` block). + + Args: + mcp_client: An active MCPClient connected to the Gateway. + + Returns: + Strands Agent configured with discovered tools. + """ + tools = mcp_client.list_tools_sync() + model = BedrockModel(model_id=MODEL_ID, region_name=REGION) + return Agent( + model=model, + tools=tools, + system_prompt=SYSTEM_PROMPT, + ) diff --git a/01-features/03-connect-your-agent-to-anything/README.md b/01-features/03-connect-your-agent-to-anything/README.md index ac9a9f94f..2a5db4e85 100644 --- a/01-features/03-connect-your-agent-to-anything/README.md +++ b/01-features/03-connect-your-agent-to-anything/README.md @@ -1,6 +1,6 @@ # Connect Your Agent to Anything -Give your agents access to powerful built-in tool environments — sandboxed code execution and headless browser automation — managed and scaled by Amazon Bedrock AgentCore. +Give your agents access to powerful built-in tool environments — sandboxed code execution, headless browser automation, and real-time web search — managed and scaled by Amazon Bedrock AgentCore. ## Top-level layout @@ -8,10 +8,11 @@ Give your agents access to powerful built-in tool environments — sandboxed cod |:-------|:--------------| | [`01-code-interpreter/`](./01-code-interpreter/) | Sandboxed Python execution environment — run code, execute shell commands, upload and read files, use the AWS CLI, all in an isolated per-session sandbox | | [`02-browser/`](./02-browser/) | Fully managed headless Chromium browser — drive it with Nova Act, Browser-Use, Strands, or raw Playwright via the Chrome DevTools Protocol | +| [`03-web-search/`](./03-web-search/) | Real-time web search as an MCP-compliant tool — ground your agents in current information via AgentCore Gateway with zero infrastructure to manage | ## How these tools work -Both tools follow the same pattern: AgentCore provisions an isolated sandbox session on demand, your agent calls tool APIs within that session, and the session terminates when you stop it. No infrastructure to manage. +Code Interpreter and Browser follow the same pattern: AgentCore provisions an isolated sandbox session on demand, your agent calls tool APIs within that session, and the session terminates when you stop it. Web Search uses a different pattern — it's exposed as an MCP-compliant connector through AgentCore Gateway, so your agent discovers and invokes it via standard MCP protocol calls. All three require no infrastructure to manage. ### Code Interpreter @@ -44,6 +45,24 @@ with browser_session("us-west-2") as client: # Pass ws_url + headers to Nova Act, Browser-Use, Playwright, or Strands ``` +### Web Search Tool + +- **What it is**: A fully managed web search connector exposed through AgentCore Gateway via MCP +- **Use it for**: Agents that need real-time information — current events, latest releases, fact-checking, competitive intelligence +- **Entry point**: Create a Gateway with `connectorId: "web-search"`, then connect any MCP client + +```python +from strands.tools.mcp.mcp_client import MCPClient +from mcp.client.streamable_http import streamablehttp_client + +transport = lambda: streamablehttp_client(gateway_url, headers={"Authorization": f"Bearer {token}"}) +mcp_client = MCPClient(transport) + +with mcp_client: + tools = mcp_client.list_tools_sync() # Discovers WebSearch + result = mcp_client.call_tool_sync("demo", "WebSearch", {"query": "latest AI news"}) +``` + ## Quick Start ```bash @@ -57,10 +76,17 @@ playwright install chromium python 02-browser/01-nova-act/getting_started.py \ --nova-act-key $NOVA_ACT_API_KEY \ --prompt "Search Amazon for MacBooks" + +# Web Search Tool +pip install -r 03-web-search/requirements.txt +python 03-web-search/01-setup-gateway/setup_gateway.py +# Export the printed env vars, then: +python 03-web-search/03-strands-agent/web_search_strands.py ``` ## Resources - [Code Interpreter — Developer Guide](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-overview.html) - [Browser Tool — Developer Guide](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/browser-tool-overview.html) +- [AgentCore Gateway — Developer Guide](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) - [boto3 Data Plane Reference (`bedrock-agentcore`)](https://docs.aws.amazon.com/boto3/latest/reference/services/bedrock-agentcore.html) From 943136dd040b92235a87cc2db7f72cf76d3e8340 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Wed, 3 Jun 2026 00:34:26 -0400 Subject: [PATCH 02/21] Add AgentCore Web Search Tool samples and workshop content - 01-features: new 03-web-search folder with setup, raw MCP, Strands, and LangChain samples; updated requirements.txt with pinned versions - 06-workshops: new 03-Agent-Core-web-search workshop with 6 notebooks covering gateway setup, Strands agent, LangChain agent, CVE scanner, earnings brief, and iterative research pattern - 06-workshops/05-AgentCore-tools/README.md: added Web Search Tool section --- .../03-web-search/01-setup-gateway/README.md | 10 + .../03-web-search/02-raw-mcp/README.md | 2 +- .../03-web-search/02-raw-mcp/raw_mcp_call.py | 2 +- .../03-strands-agent/web_search_strands.py | 2 +- .../web_search_langchain.py | 46 +- .../03-web-search/README.md | 24 +- .../03-web-search/requirements.txt | 9 +- .../03-web-search/utils/web_search_agent.py | 12 +- .../01-web-search-gateway-setup.ipynb | 603 ++++++++++++++++++ .../01-gateway-setup-and-raw-mcp/README.md | 61 ++ .../images/.gitkeep | 0 .../requirements.txt | 4 + .../02-web-search-strands-agent.ipynb | 305 +++++++++ .../02-web-search-with-strands/README.md | 51 ++ .../images/.gitkeep | 0 .../requirements.txt | 4 + .../03-web-search-langchain-agent.ipynb | 279 ++++++++ .../03-web-search-with-langchain/README.md | 51 ++ .../images/.gitkeep | 0 .../requirements.txt | 7 + .../01-cve-scanner/01-cve-scanner.ipynb | 303 +++++++++ .../01-cve-scanner/README.md | 62 ++ .../01-cve-scanner/images/.gitkeep | 0 .../01-cve-scanner/requirements.txt | 4 + .../02-earnings-brief/02-earnings-brief.ipynb | 318 +++++++++ .../02-earnings-brief/README.md | 63 ++ .../02-earnings-brief/images/.gitkeep | 0 .../02-earnings-brief/requirements.txt | 4 + .../03-iterative-research.ipynb | 324 ++++++++++ .../03-iterative-research/README.md | 73 +++ .../03-iterative-research/images/.gitkeep | 0 .../03-iterative-research/requirements.txt | 4 + .../04-advanced-examples/README.md | 29 + .../03-Agent-Core-web-search/README.md | 127 ++++ .../images/inbound-and-outbound-auth.png | Bin 0 -> 19563 bytes .../images/tutorial-architecture.png | Bin 0 -> 31128 bytes .../03-Agent-Core-web-search/requirements.txt | 8 + 06-workshops/05-AgentCore-tools/README.md | 30 +- 38 files changed, 2787 insertions(+), 34 deletions(-) create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/README.md create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/images/.gitkeep create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/requirements.txt create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/02-web-search-strands-agent.ipynb create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/README.md create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/images/.gitkeep create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/requirements.txt create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/03-web-search-langchain-agent.ipynb create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/README.md create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/images/.gitkeep create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/requirements.txt create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/README.md create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/images/.gitkeep create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/requirements.txt create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/README.md create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/images/.gitkeep create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/requirements.txt create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/03-iterative-research.ipynb create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/README.md create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/images/.gitkeep create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/requirements.txt create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/README.md create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/README.md create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/inbound-and-outbound-auth.png create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/tutorial-architecture.png create mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/requirements.txt diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md index 7fa5208a8..3196208d0 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md @@ -80,6 +80,16 @@ export COGNITO_SCOPE="agentcore-websearch/invoke" export AWS_DEFAULT_REGION="us-east-1" ``` +```bash +#export AGENTCORE_GATEWAY_URL="https://naga-web-search-gw-jpeyqm6nni.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp" +#export COGNITO_DOMAIN="us-east-16ay8pbcw2" +#export COGNITO_CLIENT_ID="n0gmrlojshfmc059dck71583f" +#export COGNITO_CLIENT_SECRET="s9bt641phqs1t7bie4lvg80sah9st50f6c3ooeksf0ri6d7f5po" +#export COGNITO_SCOPE="agentcore-websearch/invoke" +#export AWS_DEFAULT_REGION="us-east-1" +``` + + Export these before running the other demos. ## IAM Permissions diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md index 8d84d79d2..aad3b9048 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md @@ -2,7 +2,7 @@ ## Overview -This demo calls the AgentCore Gateway directly using the MCP protocol — no agent framework involved. It's the simplest way to verify your Gateway and Web Search Tool target are working correctly. +This demo calls the AgentCore Gateway directly over the MCP protocol — no agent framework involved. It's the simplest way to verify your Gateway and Web Search Tool target infrastructure are working correctly. ``` ┌──────────────────┐ tools/list ┌─────────────────────────────────┐ diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py index ff8c879b9..3d66b2479 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py @@ -41,7 +41,7 @@ # ── Configuration ───────────────────────────────────────────────────────────── -DEFAULT_QUERY = "What is today's news around the world?" +DEFAULT_QUERY = "what is tesla stock price right now?" # ── Main ────────────────────────────────────────────────────────────────────── diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py index a382e930a..87d6bddc0 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py @@ -101,7 +101,7 @@ def main(): run_query(agent, q) print("\n" + "=" * 60) - print("Demo complete!") + print("Web Search with a Strands AI Agent Demo complete!") print("=" * 60) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py index 4a18bd4cb..096d84619 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py @@ -20,6 +20,8 @@ COGNITO_CLIENT_ID — Cognito app client ID COGNITO_CLIENT_SECRET — Cognito app client secret COGNITO_SCOPE — OAuth scope string + BEDROCK_MODEL_ID — (optional) Bedrock inference profile ID or ARN; + defaults to us.anthropic.claude-sonnet-4-5-20250514-v1:0 IAM permissions required: bedrock:InvokeModel (for Claude Sonnet 4) @@ -39,13 +41,13 @@ from langchain_aws import ChatBedrockConverse from langchain_mcp_adapters.client import MultiServerMCPClient -from langgraph.prebuilt import create_react_agent +from langgraph.prebuilt import create_react_agent # noqa: E402 — stable in langgraph>=1.0 # ── Configuration ───────────────────────────────────────────────────────────── REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") MODEL_ID = os.getenv( - "BEDROCK_MODEL_ID", "us.anthropic.claude-sonnet-4-20250514-v1:0" + "BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6" ) GATEWAY_URL = os.getenv("AGENTCORE_GATEWAY_URL", "") @@ -69,7 +71,7 @@ async def run_agent(query: str): ) # Connect to the Gateway as an MCP client - async with MultiServerMCPClient( + client = MultiServerMCPClient( { "web-search": { "transport": "streamable_http", @@ -77,24 +79,24 @@ async def run_agent(query: str): "headers": {"Authorization": f"Bearer {token}"}, } } - ) as client: - tools = client.get_tools() - print(f" Discovered {len(tools)} tool(s)") - - # Create and run the agent - agent = create_react_agent(model, tools=tools) - result = await agent.ainvoke( - {"messages": [{"role": "user", "content": query}]} - ) - - # Print the final response - print("\n[Agent Response]") - print("-" * 60) - final_message = result["messages"][-1] - if hasattr(final_message, "content"): - print(final_message.content) - else: - print(str(final_message)) + ) + tools = await client.get_tools() + print(f" Discovered {len(tools)} tool(s)") + + # Create and run the agent + agent = create_react_agent(model, tools=tools) + result = await agent.ainvoke( + {"messages": [{"role": "user", "content": query}]} + ) + + # Print the final response + print("\n[Agent Response]") + print("-" * 60) + final_message = result["messages"][-1] + if hasattr(final_message, "content"): + print(final_message.content) + else: + print(str(final_message)) # ── Main ────────────────────────────────────────────────────────────────────── @@ -123,7 +125,7 @@ def main(): asyncio.run(run_agent(args.query)) print("\n" + "=" * 60) - print("Demo complete!") + print("Web Search with a LangChain Agent Demo Complete.!") print("=" * 60) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md index 5eb7e691e..3256feaf8 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md @@ -76,9 +76,28 @@ The Web Search Tool uses the **connector** target type — a fully AWS-managed i | [01-setup-gateway/](01-setup-gateway/) | boto3 (SDK) | Create IAM role, Cognito, Gateway, and Web Search target | | [02-raw-mcp/](02-raw-mcp/) | MCP protocol | Direct tool discovery and invocation without an agent | | [03-strands-agent/](03-strands-agent/) | Strands Agents | Full agent loop with automatic tool selection and cited responses | -| [04-langchain-agent/](04-langchain-agent/) | LangChain + LangGraph | Same integration using LangChain's MCP adapter | +| [04-langchain-agent/](04-langchain-agent/) | LangChain + LangGraph | Full agent loop integration using LangChain's MCP adapter | | [05-cleanup/](05-cleanup/) | boto3 (SDK) | Delete all resources created by the setup | +## Prerequisites + +Before running the agent demos (steps 3–4 in Quick Start), your AWS account must have model access enabled for the Bedrock model you intend to use. + +**Default model**: `us.anthropic.claude-sonnet-4-5-20250514-v1:0` (cross-region inference profile) + +To use a different model, export `BEDROCK_MODEL_ID` before running any agent demo: + +```bash +export BEDROCK_MODEL_ID="us.anthropic.claude-3-5-sonnet-20241022-v2:0" +``` + +> **Note:** On-demand model IDs (e.g. `anthropic.claude-sonnet-4-5-20250929-v1:0`) are not supported directly — you must use a cross-region inference profile ID (prefixed with `us.`, `eu.`, or `ap.`) or an inference profile ARN. See [Supported models and Regions for cross-Region inference](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html) for the full list. + +To enable model access in your account: +1. Open the [Amazon Bedrock console](https://console.aws.amazon.com/bedrock/) +2. Go to **Model access** in the left navigation +3. Request access for the model you want to use + ## Quick Start ```bash @@ -95,6 +114,9 @@ export COGNITO_CLIENT_SECRET="..." export COGNITO_SCOPE="agentcore-websearch/invoke" export AWS_DEFAULT_REGION="us-east-1" +# Optional: override the default Bedrock model +export BEDROCK_MODEL_ID="us.anthropic.claude-3-5-sonnet-20241022-v2:0" + # Step 3: Verify with raw MCP calls python 02-raw-mcp/raw_mcp_call.py diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt b/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt index a27d9618d..f7769b56a 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt @@ -2,7 +2,8 @@ boto3 strands-agents>=0.1.8 mcp requests -langchain -langchain-mcp-adapters -langchain-aws -langgraph +langchain>=1.3.4 +langchain-core>=1.4.0 +langchain-mcp-adapters>=0.2.2 +langchain-aws>=1.5.0 +langgraph>=1.2.4 diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py index f656cd315..5fb37f322 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py @@ -2,11 +2,18 @@ Shared Strands agent using AgentCore Web Search Tool via Gateway. Used as the common demo agent across web search sub-demos: - - 02-strands-agent/web_search_strands.py + - 03-strands-agent/web_search_strands.py The agent connects to an AgentCore Gateway that exposes the Web Search Tool as an MCP-compliant connector target. Tools are discovered dynamically via the MCP tools/list endpoint. + +Environment variables: + BEDROCK_MODEL_ID — (optional) Bedrock inference profile ID or ARN; + must be a cross-region inference profile (e.g. us.*, eu.*, ap.*) + or an inference profile ARN — on-demand model IDs are not supported. + Defaults to us.anthropic.claude-sonnet-4-5-20250514-v1:0 + AWS_DEFAULT_REGION — AWS region (default: us-east-1) """ import os @@ -21,7 +28,8 @@ REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") MODEL_ID = os.getenv( - "BEDROCK_MODEL_ID", "us.anthropic.claude-sonnet-4-20250514-v1:0" + "BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6" + ) SYSTEM_PROMPT = """You are a helpful research assistant with access to real-time web search. diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb new file mode 100644 index 000000000..f6a7f293e --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb @@ -0,0 +1,603 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4015a0a7", + "metadata": {}, + "source": [ + "# AgentCore Web Search Tool — Gateway Setup and Raw MCP Calls\n", + "\n", + "## Overview\n", + "\n", + "The **Amazon Bedrock AgentCore Web Search Tool** eliminates a core limitation of AI agents: knowledge frozen at training time. This notebook creates all the infrastructure needed and verifies it with direct MCP protocol calls — no agent framework yet, just raw tool discovery and invocation.\n", + "\n", + "You will:\n", + "1. Create the IAM service role for the Gateway\n", + "2. Set up Amazon Cognito for inbound authentication\n", + "3. Create an AgentCore Gateway with MCP protocol\n", + "4. Add a Web Search Tool connector target\n", + "5. Verify with direct `tools/list` and `tools/call` MCP calls\n", + "\n", + "The environment variables printed at the end are used by notebooks 02 and 03.\n", + "\n", + "![Tutorial Architecture](../images/tutorial-architecture.png)\n", + "\n", + "### Tutorial Details\n", + "\n", + "| Information | Details |\n", + "|:------------|:--------|\n", + "| Tutorial type | Interactive (Jupyter Notebook) |\n", + "| AgentCore components | AgentCore Gateway |\n", + "| Gateway target type | Connector (`web-search`) |\n", + "| Inbound Auth IdP | Amazon Cognito (`client_credentials` flow) |\n", + "| Outbound Auth | Automatic (Gateway IAM Role) |\n", + "| Tutorial vertical | Genral Purpose - applicable in any industry |\n", + "| Example complexity | Easy |\n", + "| SDK used | boto3 |\n", + "\n", + "### Authentication Architecture\n", + "\n", + "![Inbound and Outbound Auth](../images/inbound-and-outbound-auth.png)\n", + "\n", + "- **Inbound**: Cognito validates the OAuth token your agent passes to the Gateway\n", + "- **Outbound**: The Gateway IAM role authenticates to the Web Search backend automatically" + ] + }, + { + "cell_type": "markdown", + "id": "d5fd60fd", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "- Jupyter notebook (Python kernel)\n", + "- Python 3.10+ or later\n", + "- AWS credentials - choode one \n", + " - **Account ID + Role Name** — the notebook will call `sts:AssumeRole` to get temporary credentials (recommended for cross-account or Isengard access)\n", + " - **Pre-configured credentials** — via AWS CLI profile, environment variables, or instance role\n", + "- AWS account with access to Bedrock AgentCore Gateway, Cognito, and IAM\n", + "- Access to Bedrock inference models in us-east-1\n", + "\n", + "> **Region**: The Web Search Tool connector is available in **us-east-1** only.\n", + "\n", + "### Required IAM permissions\n", + "\n", + "~~~json\n", + "{\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": [\n", + " \"iam:CreateRole\", \"iam:PutRolePolicy\", \"iam:GetRole\",\n", + " \"cognito-idp:CreateUserPool\", \"cognito-idp:CreateUserPoolDomain\",\n", + " \"cognito-idp:CreateResourceServer\", \"cognito-idp:CreateUserPoolClient\",\n", + " \"cognito-idp:ListUserPools\", \"cognito-idp:ListUserPoolClients\",\n", + " \"cognito-idp:DescribeUserPoolClient\", \"cognito-idp:DescribeResourceServer\",\n", + " \"bedrock-agentcore:CreateGateway\", \"bedrock-agentcore:GetGateway\",\n", + " \"bedrock-agentcore:CreateGatewayTarget\", \"bedrock-agentcore:ListGatewayTargets\"\n", + " ],\n", + " \"Resource\": \"*\"\n", + "}\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "id": "ebf78fad", + "metadata": {}, + "source": [ + "## 1. Install Dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c228fe71", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --upgrade -r requirements.txt --quiet" + ] + }, + { + "cell_type": "markdown", + "id": "d420a08e", + "metadata": {}, + "source": [ + "## 2. Configure AWS Region and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "822151f1", + "metadata": {}, + "outputs": [], + "source": [ + "import boto3\n", + "import json\n", + "import os\n", + "import time\n", + "import requests\n", + "\n", + "# Web Search connector is only available in us-east-1\n", + "REGION = \"us-east-1\"\n", + "os.environ[\"AWS_DEFAULT_REGION\"] = REGION\n", + "\n", + "# Verify credentials\n", + "sts_client = boto3.client(\"sts\", region_name=REGION)\n", + "identity = sts_client.get_caller_identity()\n", + "ACCOUNT_ID = identity[\"Account\"]\n", + "print(f\"Account ID : {ACCOUNT_ID}\")\n", + "print(f\"Identity : {identity['Arn']}\")\n", + "print(f\"Region : {REGION}\")" + ] + }, + { + "cell_type": "markdown", + "id": "d53c4327", + "metadata": {}, + "source": [ + "## 3. Create the Gateway Service Role\n", + "\n", + "The Gateway needs an IAM role allowing the AgentCore service to perform actions on your behalf. Two permissions are required:\n", + "- `bedrock-agentcore:InvokeGateway` — invoke the Gateway itself\n", + "- `bedrock-agentcore:InvokeWebSearch` — authorize web search calls to `arn:aws:bedrock-agentcore::aws:tool/web-search.v1`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab8c7616", + "metadata": {}, + "outputs": [], + "source": [ + "GATEWAY_NAME = \"web-search-gateway\"\n", + "GATEWAY_ROLE_NAME = f\"agentcore-{GATEWAY_NAME}-role\"\n", + "\n", + "iam_client = boto3.client(\"iam\")\n", + "\n", + "assume_role_policy = {\n", + " \"Version\": \"2012-10-17\",\n", + " \"Statement\": [{\n", + " \"Effect\": \"Allow\",\n", + " \"Principal\": {\"Service\": \"bedrock-agentcore.amazonaws.com\"},\n", + " \"Action\": \"sts:AssumeRole\",\n", + " \"Condition\": {\n", + " \"StringEquals\": {\"aws:SourceAccount\": ACCOUNT_ID},\n", + " \"ArnLike\": {\"aws:SourceArn\": f\"arn:aws:bedrock-agentcore:{REGION}:{ACCOUNT_ID}:*\"}\n", + " }\n", + " }]\n", + "}\n", + "\n", + "try:\n", + " role_resp = iam_client.create_role(\n", + " RoleName=GATEWAY_ROLE_NAME,\n", + " AssumeRolePolicyDocument=json.dumps(assume_role_policy)\n", + " )\n", + " print(f\"Created role: {GATEWAY_ROLE_NAME}\")\n", + " time.sleep(10) # Allow IAM to propagate\n", + "except iam_client.exceptions.EntityAlreadyExistsException:\n", + " role_resp = iam_client.get_role(RoleName=GATEWAY_ROLE_NAME)\n", + " print(f\"Role already exists: {GATEWAY_ROLE_NAME}\")\n", + "\n", + "GATEWAY_ROLE_ARN = role_resp[\"Role\"][\"Arn\"]\n", + "\n", + "iam_client.put_role_policy(\n", + " RoleName=GATEWAY_ROLE_NAME,\n", + " PolicyName=\"WebSearchGatewayPolicy\",\n", + " PolicyDocument=json.dumps({\n", + " \"Version\": \"2012-10-17\",\n", + " \"Statement\": [\n", + " {\n", + " \"Sid\": \"InvokeGateway\",\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": \"bedrock-agentcore:InvokeGateway\",\n", + " \"Resource\": f\"arn:aws:bedrock-agentcore:{REGION}:{ACCOUNT_ID}:gateway/*\"\n", + " },\n", + " {\n", + " \"Sid\": \"InvokeWebSearch\",\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": \"bedrock-agentcore:InvokeWebSearch\",\n", + " \"Resource\": f\"arn:aws:bedrock-agentcore:{REGION}:aws:tool/web-search.v1\"\n", + " }\n", + " ]\n", + " })\n", + ")\n", + "print(f\"Gateway Role ARN: {GATEWAY_ROLE_ARN}\")\n", + "print(\"Permissions attached ✓\")" + ] + }, + { + "cell_type": "markdown", + "id": "3acd6c11", + "metadata": {}, + "source": [ + "## 4. Configure Inbound Authentication with Amazon Cognito\n", + "\n", + "We create a Cognito User Pool with a machine-to-machine (M2M) client using the `client_credentials` OAuth flow. The Gateway will validate JWT tokens issued by this pool." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c74df02d", + "metadata": {}, + "outputs": [], + "source": [ + "cognito = boto3.client(\"cognito-idp\", region_name=REGION)\n", + "\n", + "USER_POOL_NAME = \"agentcore-websearch-pool\"\n", + "RESOURCE_SERVER_ID = \"agentcore-websearch\"\n", + "SCOPES = [{\"ScopeName\": \"invoke\", \"ScopeDescription\": \"Invoke gateway\"}]\n", + "SCOPE_NAMES = [f\"{RESOURCE_SERVER_ID}/{s['ScopeName']}\" for s in SCOPES]\n", + "SCOPE_STRING = \" \".join(SCOPE_NAMES)\n", + "\n", + "# Find or create user pool\n", + "USER_POOL_ID = None\n", + "for pool in cognito.list_user_pools(MaxResults=60)[\"UserPools\"]:\n", + " if pool[\"Name\"] == USER_POOL_NAME:\n", + " USER_POOL_ID = pool[\"Id\"]\n", + " break\n", + "\n", + "if USER_POOL_ID is None:\n", + " resp = cognito.create_user_pool(PoolName=USER_POOL_NAME)\n", + " USER_POOL_ID = resp[\"UserPool\"][\"Id\"]\n", + " domain = USER_POOL_ID.replace(\"_\", \"\").lower()\n", + " cognito.create_user_pool_domain(Domain=domain, UserPoolId=USER_POOL_ID)\n", + " print(f\"Created user pool: {USER_POOL_ID}\")\n", + "else:\n", + " print(f\"User pool exists: {USER_POOL_ID}\")\n", + "\n", + "# Create resource server\n", + "try:\n", + " cognito.describe_resource_server(UserPoolId=USER_POOL_ID, Identifier=RESOURCE_SERVER_ID)\n", + "except cognito.exceptions.ResourceNotFoundException:\n", + " cognito.create_resource_server(\n", + " UserPoolId=USER_POOL_ID, Identifier=RESOURCE_SERVER_ID,\n", + " Name=\"WebSearch Gateway Resource Server\", Scopes=SCOPES\n", + " )\n", + "print(\"Resource server ensured ✓\")\n", + "\n", + "# Find or create M2M client\n", + "CLIENT_ID, CLIENT_SECRET = None, None\n", + "for c in cognito.list_user_pool_clients(UserPoolId=USER_POOL_ID, MaxResults=60)[\"UserPoolClients\"]:\n", + " if c[\"ClientName\"] == \"agentcore-websearch-client\":\n", + " desc = cognito.describe_user_pool_client(UserPoolId=USER_POOL_ID, ClientId=c[\"ClientId\"])\n", + " CLIENT_ID = c[\"ClientId\"]\n", + " CLIENT_SECRET = desc[\"UserPoolClient\"][\"ClientSecret\"]\n", + " break\n", + "\n", + "if CLIENT_ID is None:\n", + " created = cognito.create_user_pool_client(\n", + " UserPoolId=USER_POOL_ID, ClientName=\"agentcore-websearch-client\",\n", + " GenerateSecret=True, AllowedOAuthFlows=[\"client_credentials\"],\n", + " AllowedOAuthScopes=SCOPE_NAMES, AllowedOAuthFlowsUserPoolClient=True,\n", + " SupportedIdentityProviders=[\"COGNITO\"],\n", + " ExplicitAuthFlows=[\"ALLOW_REFRESH_TOKEN_AUTH\"]\n", + " )\n", + " CLIENT_ID = created[\"UserPoolClient\"][\"ClientId\"]\n", + " CLIENT_SECRET = created[\"UserPoolClient\"][\"ClientSecret\"]\n", + " print(f\"Created client: {CLIENT_ID}\")\n", + "else:\n", + " print(f\"Client exists: {CLIENT_ID}\")\n", + "\n", + "COGNITO_DOMAIN = USER_POOL_ID.replace(\"_\", \"\").lower()\n", + "DISCOVERY_URL = f\"https://cognito-idp.{REGION}.amazonaws.com/{USER_POOL_ID}/.well-known/openid-configuration\"\n", + "print(f\"Discovery URL: {DISCOVERY_URL}\")" + ] + }, + { + "cell_type": "markdown", + "id": "eed44e04", + "metadata": {}, + "source": [ + "## 5. Create the AgentCore Gateway" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "542cb13c", + "metadata": {}, + "outputs": [], + "source": [ + "gateway_client = boto3.client(\"bedrock-agentcore-control\", region_name=REGION)\n", + "\n", + "create_resp = gateway_client.create_gateway(\n", + " name=GATEWAY_NAME,\n", + " roleArn=GATEWAY_ROLE_ARN,\n", + " protocolType=\"MCP\",\n", + " protocolConfiguration={\n", + " \"mcp\": {\"supportedVersions\": [\"2025-03-26\"], \"searchType\": \"SEMANTIC\"}\n", + " },\n", + " authorizerType=\"CUSTOM_JWT\",\n", + " authorizerConfiguration={\n", + " \"customJWTAuthorizer\": {\n", + " \"allowedClients\": [CLIENT_ID],\n", + " \"discoveryUrl\": DISCOVERY_URL\n", + " }\n", + " },\n", + " description=\"AgentCore Gateway with Web Search Tool\"\n", + ")\n", + "\n", + "GATEWAY_ID = create_resp[\"gatewayId\"]\n", + "GATEWAY_URL = create_resp[\"gatewayUrl\"]\n", + "print(f\"Gateway ID : {GATEWAY_ID}\")\n", + "print(f\"Gateway URL : {GATEWAY_URL}\")\n", + "\n", + "# Wait for READY\n", + "for _ in range(30):\n", + " status = gateway_client.get_gateway(gatewayIdentifier=GATEWAY_ID)[\"status\"]\n", + " if status == \"READY\":\n", + " break\n", + " time.sleep(5)\n", + "print(f\"Gateway status: {status}\")" + ] + }, + { + "cell_type": "markdown", + "id": "64b4bad3", + "metadata": {}, + "source": [ + "## 6. Add the Web Search Connector Target\n", + "\n", + "The Web Search Tool uses the `connector` target type. Specify `connectorId: \"web-search\"` and the Gateway handles schema management, endpoint resolution, and outbound auth automatically." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e2d8208", + "metadata": {}, + "outputs": [], + "source": [ + "target_resp = gateway_client.create_gateway_target(\n", + " name=\"web-search-tool\",\n", + " gatewayIdentifier=GATEWAY_ID,\n", + " targetConfiguration={\n", + " \"mcp\": {\n", + " \"connector\": {\n", + " \"source\": {\"connectorId\": \"web-search\"},\n", + " \"configurations\": [{\"name\": \"WebSearch\", \"parameterValues\": {}}]\n", + " }\n", + " }\n", + " },\n", + " credentialProviderConfigurations=[\n", + " {\"credentialProviderType\": \"GATEWAY_IAM_ROLE\"}\n", + " ]\n", + ")\n", + "\n", + "TARGET_ID = target_resp[\"targetId\"]\n", + "print(f\"Target ID: {TARGET_ID}\")\n", + "\n", + "# Wait for target READY\n", + "for _ in range(30):\n", + " targets = gateway_client.list_gateway_targets(gatewayIdentifier=GATEWAY_ID)\n", + " statuses = [t[\"status\"] for t in targets[\"items\"]]\n", + " print(f\" Target statuses: {statuses}\")\n", + " if all(s == \"READY\" for s in statuses):\n", + " print(\"\\n✅ All targets READY\")\n", + " break\n", + " time.sleep(5)" + ] + }, + { + "cell_type": "markdown", + "id": "6c104338", + "metadata": {}, + "source": [ + "## 7. Get an OAuth Token\n", + "\n", + "Retrieve a Cognito access token using the `client_credentials` flow. This token is passed as a Bearer header on every MCP call." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dde14821", + "metadata": {}, + "outputs": [], + "source": [ + "def get_token():\n", + " \"\"\"Retrieve a fresh OAuth access token from Cognito.\"\"\"\n", + " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", + " resp = requests.post(\n", + " url,\n", + " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", + " data={\n", + " \"grant_type\": \"client_credentials\",\n", + " \"client_id\": CLIENT_ID,\n", + " \"client_secret\": CLIENT_SECRET,\n", + " \"scope\": SCOPE_STRING\n", + " }\n", + " )\n", + " resp.raise_for_status()\n", + " return resp.json()[\"access_token\"]\n", + "\n", + "# Allow time for Cognito domain propagation\n", + "print(\"Waiting for Cognito domain propagation...\")\n", + "time.sleep(15)\n", + "\n", + "token = get_token()\n", + "print(f\"Token obtained ✓ (first 20 chars: {token[:20]}...)\")" + ] + }, + { + "cell_type": "markdown", + "id": "6ba40bc7", + "metadata": {}, + "source": [ + "## 8. Verify: Raw MCP Tool Discovery (`tools/list`)\n", + "\n", + "Call the Gateway directly using MCP — no agent framework. This confirms the WebSearch tool is available and shows its input schema." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b06ea7f3", + "metadata": {}, + "outputs": [], + "source": [ + "from mcp.client.streamable_http import streamablehttp_client\n", + "from strands.tools.mcp.mcp_client import MCPClient\n", + "\n", + "\n", + "def create_transport():\n", + " return streamablehttp_client(\n", + " GATEWAY_URL,\n", + " headers={\"Authorization\": f\"Bearer {token}\"}\n", + " )\n", + "\n", + "\n", + "mcp_client = MCPClient(create_transport)\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " print(f\"Discovered {len(tools)} tool(s):\\n\")\n", + " for tool in tools:\n", + " spec = tool.tool_spec\n", + " print(f\" Name : {spec['name']}\")\n", + " print(f\" Description : {spec.get('description', 'N/A')}\")\n", + " schema = json.dumps(spec.get('inputSchema', {}), indent=4)\n", + " print(f\" Input schema: {schema[:300]}\")\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "id": "6032a124", + "metadata": {}, + "source": [ + "## 9. Verify: Raw MCP Tool Invocation (`tools/call`)\n", + "\n", + "Invoke the WebSearch tool directly and inspect the structured response." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "817679e6", + "metadata": {}, + "outputs": [], + "source": [ + "TEST_QUERY = \"What is today's news around the world?\"\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " ws_tool_name = next(t.tool_name for t in tools if \"WebSearch\" in t.tool_name)\n", + "\n", + " print(f\"Invoking: {ws_tool_name}\")\n", + " print(f\"Query : {TEST_QUERY}\\n\")\n", + "\n", + " result = mcp_client.call_tool_sync(\"verify-call\", ws_tool_name, {\"query\": TEST_QUERY})\n", + "\n", + " for content in result.get(\"content\", [result] if not isinstance(result, list) else result):\n", + " if isinstance(content, dict) and \"text\" in content:\n", + " try:\n", + " parsed = json.loads(content[\"text\"])\n", + " print(json.dumps(parsed, indent=2))\n", + " except (ValueError, TypeError):\n", + " print(content[\"text\"][:2000])\n", + " else:\n", + " print(content)" + ] + }, + { + "cell_type": "markdown", + "id": "22a08536", + "metadata": {}, + "source": [ + "## 10. Save Environment Variables for Notebooks 02 and 03\n", + "\n", + "Export these before running the next notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63754959", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"# Copy and export these environment variables:\\n\")\n", + "print(f'export AGENTCORE_GATEWAY_URL=\"{GATEWAY_URL}\"')\n", + "print(f'export COGNITO_DOMAIN=\"{COGNITO_DOMAIN}\"')\n", + "print(f'export COGNITO_CLIENT_ID=\"{CLIENT_ID}\"')\n", + "print(f'export COGNITO_CLIENT_SECRET=\"{CLIENT_SECRET}\"')\n", + "print(f'export COGNITO_SCOPE=\"{SCOPE_STRING}\"')\n", + "print(f'export AWS_DEFAULT_REGION=\"{REGION}\"')\n", + "print(f'\\n# For cleanup:')\n", + "print(f'# Gateway ID : {GATEWAY_ID}')\n", + "print(f'# User Pool ID : {USER_POOL_ID}')\n", + "print(f'# IAM Role : {GATEWAY_ROLE_NAME}')" + ] + }, + { + "cell_type": "markdown", + "id": "da25e94b", + "metadata": {}, + "source": [ + "## Cleanup (Optional)\n", + "\n", + "Run this cell only when you are done with **all** tutorials in this workshop. The Gateway and Cognito pool are reused by notebooks 02 and 03." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90d7f934", + "metadata": {}, + "outputs": [], + "source": [ + "# Uncomment to delete all resources\n", + "\n", + "# # Delete Gateway targets and Gateway\n", + "# for item in gateway_client.list_gateway_targets(gatewayIdentifier=GATEWAY_ID, maxResults=100)[\"items\"]:\n", + "# gateway_client.delete_gateway_target(gatewayIdentifier=GATEWAY_ID, targetId=item[\"targetId\"])\n", + "# print(f\"Deleted target: {item['name']}\")\n", + "# time.sleep(10)\n", + "# gateway_client.delete_gateway(gatewayIdentifier=GATEWAY_ID)\n", + "# print(f\"Deleted gateway: {GATEWAY_ID}\")\n", + "\n", + "# # Delete Cognito\n", + "# cognito.delete_user_pool_domain(Domain=COGNITO_DOMAIN, UserPoolId=USER_POOL_ID)\n", + "# cognito.delete_user_pool(UserPoolId=USER_POOL_ID)\n", + "# print(f\"Deleted user pool: {USER_POOL_ID}\")\n", + "\n", + "# # Delete IAM role\n", + "# iam_client.delete_role_policy(RoleName=GATEWAY_ROLE_NAME, PolicyName=\"WebSearchGatewayPolicy\")\n", + "# iam_client.delete_role(RoleName=GATEWAY_ROLE_NAME)\n", + "# print(f\"Deleted role: {GATEWAY_ROLE_NAME}\")\n", + "\n", + "print(\"Uncomment the lines above to delete resources.\")" + ] + }, + { + "cell_type": "markdown", + "id": "a912b8ec", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook you:\n", + "- Created an AgentCore Gateway with MCP protocol and Cognito JWT authentication\n", + "- Added a Web Search connector target — no schema or endpoint configuration needed\n", + "- Verified the setup with raw `tools/list` and `tools/call` MCP invocations\n", + "\n", + "**Next**: Run notebook `02-web-search-strands-agent.ipynb` to use this Gateway with a Strands AI agent." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/README.md new file mode 100644 index 000000000..98f8bb52b --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/README.md @@ -0,0 +1,61 @@ +# Web Search Tool — Gateway Setup and Raw MCP Calls + +## Overview + +In this tutorial you will learn how to: + +1. Create the IAM service role for the Gateway +2. Configure Amazon Cognito for inbound authentication +3. Create an AgentCore Gateway with MCP protocol +4. Add a Web Search Tool connector target +5. Verify the setup with direct MCP `tools/list` and `tools/call` invocations + +### Tutorial Details + +| Information | Details | +|:------------|:--------| +| Tutorial type | Interactive (Jupyter Notebook) | +| AgentCore components | AgentCore Gateway | +| Gateway target type | Connector (`web-search`) | +| Tutorial vertical | Cross-vertical | +| Example complexity | Easy | +| SDK used | boto3 | + +### Tutorial Architecture + +
+ +
+ +### Inbound and Outbound Authentication + +
+ +
+ +The Gateway uses two authentication layers: +- **Inbound**: Amazon Cognito validates the OAuth token passed by your agent +- **Outbound**: The Gateway's IAM role authenticates automatically to the Web Search backend — no additional credentials needed + +## Notebook + +→ [`01-web-search-gateway-setup.ipynb`](01-web-search-gateway-setup.ipynb) + +## Prerequisites + +- AWS account allowlisted for the Web Search Tool private beta +- Python 3.10+ and Jupyter +- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions + +```bash +pip install -r requirements.txt +``` + +> **Region**: The Web Search Tool connector is currently available in **us-east-1** only. + +## What You'll Build + +After completing this tutorial you'll have: +- An AgentCore Gateway with MCP protocol +- A Web Search connector target in READY state +- Environment variables ready for tutorials 02 and 03 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/requirements.txt new file mode 100644 index 000000000..1d8cae582 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/requirements.txt @@ -0,0 +1,4 @@ +boto3 +mcp +requests +strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/02-web-search-strands-agent.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/02-web-search-strands-agent.ipynb new file mode 100644 index 000000000..13093a9c0 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/02-web-search-strands-agent.ipynb @@ -0,0 +1,305 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Web Search Tool with Strands Agent\n", + "\n", + "## Overview\n", + "\n", + "This notebook connects a Strands AI agent to the AgentCore Gateway created in notebook 01. The agent automatically discovers the Web Search tool via MCP `tools/list`, then invokes it when answering questions that require current information.\n", + "\n", + "You will:\n", + "1. Connect to the Gateway using MCP Streamable HTTP transport\n", + "2. Discover the WebSearch tool at runtime\n", + "3. Create a Strands agent and ask real-time questions\n", + "4. Inspect the agent's tool calls and grounded responses\n", + "\n", + "### Tutorial Details\n", + "\n", + "| Information | Details |\n", + "|:------------|:--------|\n", + "| Tutorial type | Interactive (Jupyter Notebook) |\n", + "| AgentCore components | AgentCore Gateway |\n", + "| Agentic framework | Strands Agents |\n", + "| LLM model | Anthropic Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) |\n", + "| Tutorial vertical | Cross-vertical |\n", + "| Example complexity | Easy |\n", + "| SDK used | boto3, strands-agents |\n", + "\n", + "### How It Works\n", + "\n", + "```\n", + "User question\n", + " │\n", + " ▼\n", + "Strands Agent (Claude Sonnet 4)\n", + " │ decides to call WebSearch\n", + " ▼\n", + "MCP tools/call → AgentCore Gateway → Web Search Backend\n", + " │\n", + " ▼\n", + "Structured results { text, url, title, publishedDate }\n", + " │\n", + " ▼\n", + "Final answer with cited sources\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "Complete notebook `01-web-search-gateway-setup.ipynb` first and set the following environment variables:\n", + "\n", + "```bash\n", + "export AGENTCORE_GATEWAY_URL=\"...\"\n", + "export COGNITO_DOMAIN=\"...\"\n", + "export COGNITO_CLIENT_ID=\"...\"\n", + "export COGNITO_CLIENT_SECRET=\"...\"\n", + "export COGNITO_SCOPE=\"agentcore-websearch/invoke\"\n", + "export AWS_DEFAULT_REGION=\"us-east-1\"\n", + "```\n", + "\n", + "### Required IAM permissions\n", + "\n", + "~~~json\n", + "{\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": \"bedrock:InvokeModel\",\n", + " \"Resource\": \"*\"\n", + "}\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Install Dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --upgrade -r requirements.txt --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from mcp.client.streamable_http import streamablehttp_client\n", + "from strands import Agent\n", + "from strands.models import BedrockModel\n", + "from strands.tools.mcp.mcp_client import MCPClient\n", + "\n", + "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", + "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", + "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", + "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", + "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", + "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", + "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", + "\n", + "print(f\"Gateway URL : {GATEWAY_URL}\")\n", + "print(f\"Region : {REGION}\")\n", + "print(f\"Model : {MODEL_ID}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Create OAuth Token and MCP Transport" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_token():\n", + " \"\"\"Retrieve a fresh OAuth access token from Cognito.\"\"\"\n", + " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", + " resp = requests.post(\n", + " url,\n", + " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", + " data={\n", + " \"grant_type\": \"client_credentials\",\n", + " \"client_id\": CLIENT_ID,\n", + " \"client_secret\": CLIENT_SECRET,\n", + " \"scope\": SCOPE_STRING\n", + " }\n", + " )\n", + " resp.raise_for_status()\n", + " return resp.json()[\"access_token\"]\n", + "\n", + "\n", + "def create_transport():\n", + " \"\"\"Create a fresh MCP Streamable HTTP transport with a valid token.\"\"\"\n", + " token = get_token()\n", + " return streamablehttp_client(\n", + " GATEWAY_URL,\n", + " headers={\"Authorization\": f\"Bearer {token}\"}\n", + " )\n", + "\n", + "\n", + "mcp_client = MCPClient(create_transport)\n", + "print(\"MCP client created ✓\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Discover Tools and Create the Agent\n", + "\n", + "The agent discovers tools dynamically at runtime via `tools/list`. Strands registers them automatically — no manual tool definitions needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "SYSTEM_PROMPT = \"\"\"You are a helpful research assistant with access to real-time web search.\n", + "\n", + "PRINCIPLES:\n", + "- Use WebSearch to find current information before answering\n", + "- Always cite your sources with URLs\n", + "- Keep queries concise (under 200 characters)\n", + "- Synthesize information from multiple results when possible\n", + "\"\"\"\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " print(f\"Discovered {len(tools)} tool(s): {[t.tool_name for t in tools]}\")\n", + "\n", + " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.7, max_tokens=1024)\n", + " agent = Agent(model=model, tools=tools, system_prompt=SYSTEM_PROMPT)\n", + " print(f\"Agent ready with tools: {agent.tool_names}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Test the Agent on a Current Events Question\n", + "\n", + "The agent will automatically invoke WebSearch and return a grounded answer." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "QUERY = \"What is today's news around the world?\"\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.7, max_tokens=1024)\n", + " agent = Agent(model=model, tools=tools, system_prompt=SYSTEM_PROMPT)\n", + "\n", + " print(f\"Query: {QUERY}\")\n", + " print(\"-\" * 60)\n", + " response = agent(QUERY)\n", + "\n", + "print(\"\\n\" + \"=\" * 60)\n", + "print(\"AGENT RESPONSE\")\n", + "print(\"=\" * 60)\n", + "if hasattr(response, \"message\"):\n", + " for block in response.message.get(\"content\", []):\n", + " if block.get(\"text\"):\n", + " print(block[\"text\"])\n", + "else:\n", + " print(str(response))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Try More Queries\n", + "\n", + "The WebSearch tool handles queries up to 200 characters. Here are a few more examples showing different query types." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "demo_queries = [\n", + " \"What are the latest developments in quantum computing in 2026?\",\n", + " \"What is the current price of gold?\",\n", + " \"What new AWS services were announced recently?\"\n", + "]\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.7, max_tokens=1024)\n", + " agent = Agent(model=model, tools=tools, system_prompt=SYSTEM_PROMPT)\n", + "\n", + " for query in demo_queries:\n", + " print(f\"\\n{'=' * 60}\")\n", + " print(f\"Query: {query}\")\n", + " print(\"=\" * 60)\n", + " response = agent(query)\n", + " if hasattr(response, \"message\"):\n", + " for block in response.message.get(\"content\", []):\n", + " if block.get(\"text\"):\n", + " print(block[\"text\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook you:\n", + "- Connected a Strands agent to the AgentCore Gateway via MCP Streamable HTTP\n", + "- Discovered the WebSearch tool dynamically at runtime\n", + "- Got grounded, cited answers to real-time questions\n", + "\n", + "**Next**: Run notebook `03-web-search-langchain-agent.ipynb` for the same integration using LangChain and LangGraph." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/README.md new file mode 100644 index 000000000..d51a409ba --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/README.md @@ -0,0 +1,51 @@ +# Web Search Tool with Strands Agent + +## Overview + +In this tutorial you will learn how to: + +1. Connect a Strands agent to an AgentCore Gateway via MCP Streamable HTTP +2. Discover the Web Search tool dynamically at runtime +3. Ask real-time questions — the agent invokes WebSearch automatically +4. Receive grounded responses with cited source URLs + +### Tutorial Details + +| Information | Details | +|:------------|:--------| +| Tutorial type | Interactive (Jupyter Notebook) | +| AgentCore components | AgentCore Gateway | +| Agentic framework | Strands Agents | +| LLM model | Anthropic Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) | +| Tutorial vertical | Cross-vertical | +| Example complexity | Easy | +| SDK used | boto3, strands-agents | + +### Tutorial Architecture + +``` +┌────────────┐ "What's the latest AI news?" ┌──────────────────────────┐ +│ User │ ─────────────────────────────▶ │ Strands Agent │ +│ │◀───────────────────────────── │ Claude Sonnet 4 │ +│ │ Grounded answer + citations │ │ +└────────────┘ │ tools: [WebSearch] │ + │ │ MCP tools/call │ + └───────┼──────────────────┘ + ▼ + ┌──────────────────────────┐ + │ AgentCore Gateway │ + │ Web Search Connector │ + └──────────────────────────┘ +``` + +## Notebook + +→ [`02-web-search-strands-agent.ipynb`](02-web-search-strands-agent.ipynb) + +## Prerequisites + +Complete tutorial `01-gateway-setup-and-raw-mcp` first and export the environment variables it produces. + +```bash +pip install -r requirements.txt +``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/requirements.txt new file mode 100644 index 000000000..1d8cae582 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/requirements.txt @@ -0,0 +1,4 @@ +boto3 +mcp +requests +strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/03-web-search-langchain-agent.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/03-web-search-langchain-agent.ipynb new file mode 100644 index 000000000..704725da1 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/03-web-search-langchain-agent.ipynb @@ -0,0 +1,279 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Web Search Tool with LangChain Agent\n", + "\n", + "## Overview\n", + "\n", + "This notebook demonstrates the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore Gateway and `create_react_agent` from LangGraph for the ReAct agent loop.\n", + "\n", + "You will:\n", + "1. Connect to the Gateway using `MultiServerMCPClient` from `langchain-mcp-adapters`\n", + "2. Discover Web Search tools via MCP\n", + "3. Build a ReAct agent with `ChatBedrockConverse`\n", + "4. Run web-grounded Q&A\n", + "\n", + "### Tutorial Details\n", + "\n", + "| Information | Details |\n", + "|:------------|:--------|\n", + "| Tutorial type | Interactive (Jupyter Notebook) |\n", + "| AgentCore components | AgentCore Gateway |\n", + "| Agentic framework | LangChain + LangGraph |\n", + "| LLM model | Anthropic Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) |\n", + "| Tutorial vertical | Cross-vertical |\n", + "| Example complexity | Easy |\n", + "| SDK used | boto3, langchain-aws, langchain-mcp-adapters |\n", + "\n", + "### How It Works\n", + "\n", + "```\n", + "User question\n", + " │\n", + " ▼\n", + "LangGraph ReAct Agent (ChatBedrockConverse)\n", + " │ calls WebSearch tool\n", + " ▼\n", + "MultiServerMCPClient → AgentCore Gateway → Web Search Backend\n", + " │\n", + " ▼\n", + "Structured results → Final answer with citations\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "Complete notebook `01-web-search-gateway-setup.ipynb` first and set the environment variables it prints.\n", + "\n", + "### Required IAM permissions\n", + "\n", + "~~~json\n", + "{\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": \"bedrock:InvokeModel\",\n", + " \"Resource\": \"*\"\n", + "}\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Install Dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --upgrade -r requirements.txt --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import asyncio\n", + "import os\n", + "import requests\n", + "\n", + "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", + "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", + "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", + "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", + "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", + "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", + "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", + "\n", + "print(f\"Gateway URL : {GATEWAY_URL}\")\n", + "print(f\"Region : {REGION}\")\n", + "print(f\"Model : {MODEL_ID}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Token Helper" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_token():\n", + " \"\"\"Retrieve a fresh OAuth access token from Cognito.\"\"\"\n", + " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", + " resp = requests.post(\n", + " url,\n", + " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", + " data={\n", + " \"grant_type\": \"client_credentials\",\n", + " \"client_id\": CLIENT_ID,\n", + " \"client_secret\": CLIENT_SECRET,\n", + " \"scope\": SCOPE_STRING\n", + " }\n", + " )\n", + " resp.raise_for_status()\n", + " return resp.json()[\"access_token\"]\n", + "\n", + "token = get_token()\n", + "print(\"Token obtained ✓\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Create LangChain Agent with MCP Tools\n", + "\n", + "`MultiServerMCPClient` connects to one or more MCP servers and converts their tools into LangChain-compatible tool objects. `create_react_agent` builds a LangGraph ReAct agent with those tools." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_aws import ChatBedrockConverse\n", + "from langchain_mcp_adapters.client import MultiServerMCPClient\n", + "from langgraph.prebuilt import create_react_agent\n", + "\n", + "\n", + "async def run_agent(query: str) -> str:\n", + " \"\"\"Run the LangChain agent with a web search query.\"\"\"\n", + " model = ChatBedrockConverse(\n", + " model=MODEL_ID,\n", + " region_name=REGION,\n", + " temperature=0.7,\n", + " max_tokens=1024\n", + " )\n", + "\n", + " async with MultiServerMCPClient({\n", + " \"web-search\": {\n", + " \"transport\": \"streamable_http\",\n", + " \"url\": GATEWAY_URL,\n", + " \"headers\": {\"Authorization\": f\"Bearer {get_token()}\"}\n", + " }\n", + " }) as client:\n", + " tools = client.get_tools()\n", + " print(f\"Discovered {len(tools)} tool(s): {[t.name for t in tools]}\")\n", + "\n", + " agent = create_react_agent(model, tools=tools)\n", + " result = await agent.ainvoke({\n", + " \"messages\": [{\"role\": \"user\", \"content\": query}]\n", + " })\n", + "\n", + " final_message = result[\"messages\"][-1]\n", + " return final_message.content if hasattr(final_message, \"content\") else str(final_message)\n", + "\n", + "\n", + "print(\"Agent function defined ✓\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Ask a Real-Time Question" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "QUERY = \"What is today's news around the world?\"\n", + "\n", + "print(f\"Query: {QUERY}\")\n", + "print(\"-\" * 60)\n", + "\n", + "answer = await run_agent(QUERY)\n", + "\n", + "print(\"\\n\" + \"=\" * 60)\n", + "print(\"LANGCHAIN AGENT RESPONSE\")\n", + "print(\"=\" * 60)\n", + "print(answer)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Try More Queries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "demo_queries = [\n", + " \"What are the latest AI model releases in 2026?\",\n", + " \"What is the current EUR/USD exchange rate?\",\n", + " \"What new features were announced in Python 3.14?\"\n", + "]\n", + "\n", + "for query in demo_queries:\n", + " print(f\"\\n{'=' * 60}\")\n", + " print(f\"Query: {query}\")\n", + " print(\"=\" * 60)\n", + " answer = await run_agent(query)\n", + " print(answer)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook you:\n", + "- Used `langchain-mcp-adapters` to connect to the AgentCore Gateway\n", + "- Built a LangGraph ReAct agent with `ChatBedrockConverse`\n", + "- Got grounded, cited answers using the same Gateway from notebook 01\n", + "\n", + "The Gateway is framework-agnostic — Strands, LangChain, or any MCP client works the same way.\n", + "\n", + "**Next**: Explore the advanced examples in `04-advanced-examples/` for multi-turn search patterns." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/README.md new file mode 100644 index 000000000..3ce70c848 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/README.md @@ -0,0 +1,51 @@ +# Web Search Tool with LangChain Agent + +## Overview + +In this tutorial you will learn how to: + +1. Connect a LangChain agent to an AgentCore Gateway using `langchain-mcp-adapters` +2. Discover Web Search tools via the MCP protocol +3. Build a ReAct agent with `ChatBedrockConverse` and LangGraph +4. Run web-grounded Q&A with the same Gateway set up in tutorial 01 + +### Tutorial Details + +| Information | Details | +|:------------|:--------| +| Tutorial type | Interactive (Jupyter Notebook) | +| AgentCore components | AgentCore Gateway | +| Agentic framework | LangChain + LangGraph | +| LLM model | Anthropic Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) | +| Tutorial vertical | Cross-vertical | +| Example complexity | Easy | +| SDK used | boto3, langchain-aws, langchain-mcp-adapters | + +### Tutorial Architecture + +``` +┌────────────┐ question ┌─────────────────────────────────────────┐ +│ User │ ───────────▶ │ LangGraph ReAct Agent │ +│ │◀─────────── │ ChatBedrockConverse (Claude Sonnet 4) │ +│ │ answer │ │ +└────────────┘ │ MultiServerMCPClient │ + │ │ streamable_http │ + └───────┼─────────────────────────────────┘ + ▼ + ┌──────────────────────┐ + │ AgentCore Gateway │ + │ Web Search │ + └──────────────────────┘ +``` + +## Notebook + +→ [`03-web-search-langchain-agent.ipynb`](03-web-search-langchain-agent.ipynb) + +## Prerequisites + +Complete tutorial `01-gateway-setup-and-raw-mcp` first and export the environment variables it produces. + +```bash +pip install -r requirements.txt +``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/requirements.txt new file mode 100644 index 000000000..9b6ebd50e --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/requirements.txt @@ -0,0 +1,7 @@ +boto3 +mcp +requests +langchain +langchain-mcp-adapters +langchain-aws +langgraph diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb new file mode 100644 index 000000000..8c043f202 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb @@ -0,0 +1,303 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CVE Scanner — Multi-turn Security Vulnerability Search\n", + "\n", + "## Overview\n", + "\n", + "This notebook builds a security agent that scans a dependency list for recent CVEs using live web search. The agent issues one focused search per package, then synthesizes severity across all results into a prioritized remediation report.\n", + "\n", + "**Why live search is critical here**: CVE databases update daily. A newly published exploit or patch changes the risk profile of a dependency within hours — training data is always stale for this.\n", + "\n", + "### Tutorial Details\n", + "\n", + "| Information | Details |\n", + "|:------------|:--------|\n", + "| Tutorial type | Interactive (Jupyter Notebook) |\n", + "| AgentCore components | AgentCore Gateway |\n", + "| Agentic framework | Strands Agents |\n", + "| LLM model | Anthropic Claude Sonnet 4 |\n", + "| Tutorial vertical | Security / DevOps |\n", + "| Example complexity | Intermediate |\n", + "| SDK used | boto3, strands-agents |\n", + "\n", + "### Multi-turn Search Pattern\n", + "\n", + "```\n", + "Input: requirements.txt\n", + " │\n", + " ▼\n", + "Parse packages + versions\n", + " │\n", + " ▼\n", + "For each package:\n", + " Search 1: \"CVE vulnerability\"\n", + " Search 2: \" latest version security patch\"\n", + " │\n", + " ▼\n", + "Aggregate + score by CVSS severity\n", + " │\n", + " ▼\n", + "Output: Prioritized remediation report\n", + " CRITICAL requests 2.28.0 → CVE-XXXX, upgrade to 2.32.3\n", + " HIGH urllib3 1.26.5 → CVE-YYYY, upgrade to 2.2.2\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "Complete `01-gateway-setup-and-raw-mcp` first and export the environment variables it prints.\n", + "\n", + "### Required IAM permissions\n", + "\n", + "~~~json\n", + "{\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": \"bedrock:InvokeModel\",\n", + " \"Resource\": \"*\"\n", + "}\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Install Dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --upgrade -r requirements.txt --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Configuration and Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from mcp.client.streamable_http import streamablehttp_client\n", + "from strands import Agent\n", + "from strands.models import BedrockModel\n", + "from strands.tools.mcp.mcp_client import MCPClient\n", + "\n", + "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", + "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", + "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", + "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", + "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", + "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", + "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", + "\n", + "\n", + "def get_token():\n", + " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", + " resp = requests.post(\n", + " url,\n", + " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", + " data={\"grant_type\": \"client_credentials\", \"client_id\": CLIENT_ID,\n", + " \"client_secret\": CLIENT_SECRET, \"scope\": SCOPE_STRING}\n", + " )\n", + " resp.raise_for_status()\n", + " return resp.json()[\"access_token\"]\n", + "\n", + "\n", + "def create_transport():\n", + " return streamablehttp_client(GATEWAY_URL, headers={\"Authorization\": f\"Bearer {get_token()}\"})\n", + "\n", + "\n", + "print(\"Configuration loaded ✓\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Define the Dependency List\n", + "\n", + "This is the list of packages to scan. Update it with your actual dependencies." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Sample dependency list — replace with your actual requirements\n", + "DEPENDENCIES = [\n", + " \"requests==2.28.0\",\n", + " \"urllib3==1.26.5\",\n", + " \"cryptography==3.4.8\",\n", + " \"pillow==9.0.0\",\n", + " \"django==3.2.0\"\n", + "]\n", + "\n", + "print(f\"Packages to scan ({len(DEPENDENCIES)}):\")\n", + "for dep in DEPENDENCIES:\n", + " print(f\" {dep}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. CVE Scanner Agent\n", + "\n", + "The agent uses the CVE Scanner system prompt, which instructs it to search for each dependency separately and return a structured severity report." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "CVE_SYSTEM_PROMPT = \"\"\"You are a security analyst agent with access to real-time web search.\n", + "\n", + "When given a list of Python dependencies, you will:\n", + "1. For each package and version, search for known CVEs and security advisories\n", + "2. Search for the latest patched version of each package\n", + "3. Assign a severity level: CRITICAL, HIGH, MEDIUM, LOW, or NONE\n", + "4. Produce a remediation report sorted by severity\n", + "\n", + "SEARCH STRATEGY:\n", + "- Use queries like \"CVE \" and \" security vulnerability 2025 2026\"\n", + "- Keep each query under 200 characters\n", + "- Search each package independently before synthesizing\n", + "\n", + "OUTPUT FORMAT:\n", + "For each package, output a row:\n", + " | == | | Upgrade to: | \n", + "\n", + "End with a summary of total findings by severity level.\n", + "\"\"\"\n", + "\n", + "mcp_client = MCPClient(create_transport)\n", + "print(\"CVE scanner agent ready ✓\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Run the CVE Scan\n", + "\n", + "The agent will issue multiple searches — one per package — and synthesize a prioritized report." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dep_list = \"\\n\".join(f\" - {d}\" for d in DEPENDENCIES)\n", + "scan_prompt = f\"\"\"Scan the following Python dependencies for security vulnerabilities and CVEs.\n", + "Search for each package individually, then produce a prioritized remediation report.\n", + "\n", + "Dependencies:\n", + "{dep_list}\n", + "\"\"\"\n", + "\n", + "print(\"Starting CVE scan...\")\n", + "print(\"-\" * 60)\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.3, max_tokens=2048)\n", + " agent = Agent(model=model, tools=tools, system_prompt=CVE_SYSTEM_PROMPT)\n", + " response = agent(scan_prompt)\n", + "\n", + "print(\"\\n\" + \"=\" * 60)\n", + "print(\"CVE SCAN REPORT\")\n", + "print(\"=\" * 60)\n", + "if hasattr(response, \"message\"):\n", + " for block in response.message.get(\"content\", []):\n", + " if block.get(\"text\"):\n", + " print(block[\"text\"])\n", + "else:\n", + " print(str(response))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Scan a Custom requirements.txt\n", + "\n", + "Pass the content of your actual `requirements.txt` file to scan your real dependencies." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# To scan your own requirements.txt:\n", + "# with open(\"path/to/your/requirements.txt\") as f:\n", + "# requirements_content = f.read()\n", + "\n", + "# custom_prompt = f\"\"\"Scan these Python dependencies for CVEs:\\n\\n{requirements_content}\"\"\"\n", + "# with mcp_client:\n", + "# tools = mcp_client.list_tools_sync()\n", + "# model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.3, max_tokens=2048)\n", + "# agent = Agent(model=model, tools=tools, system_prompt=CVE_SYSTEM_PROMPT)\n", + "# response = agent(custom_prompt)\n", + "\n", + "print(\"Uncomment the cells above to scan your own requirements.txt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook you built a security scanning agent that:\n", + "- Issues one targeted search per dependency (multi-turn pattern)\n", + "- Finds CVEs that postdate any model training cutoff\n", + "- Produces a prioritized remediation report\n", + "\n", + "The key insight: **each search is informed by the dependency from the parsed list** — this is the \"search for each item\" multi-turn pattern.\n", + "\n", + "**Next**: See `02-earnings-brief.ipynb` for the chained search pattern where each result informs the next query." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/README.md new file mode 100644 index 000000000..72c4f815d --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/README.md @@ -0,0 +1,62 @@ +# CVE Scanner — Multi-turn Security Vulnerability Search + +## Overview + +In this example you will build a security agent that scans a list of Python dependencies for known vulnerabilities using live web search. The agent issues one search per package, synthesizes severity across all results, and produces a prioritized remediation report. + +**Why live search is critical here**: CVE databases update daily. A newly published exploit or patch changes the risk profile of a dependency within hours. Training data is always stale for this. + +### Tutorial Details + +| Information | Details | +|:------------|:--------| +| Tutorial type | Interactive (Jupyter Notebook) | +| AgentCore components | AgentCore Gateway | +| Agentic framework | Strands Agents | +| LLM model | Anthropic Claude Sonnet 4 | +| Tutorial vertical | Security / DevOps | +| Example complexity | Intermediate | +| SDK used | boto3, strands-agents | + +### What the Agent Does + +``` +Input: requirements.txt contents + │ + ▼ +┌────────────────────────────────┐ +│ For each dependency: │ +│ 1. Search "CVE " │ +│ 2. Search " latest │ +│ version security patch" │ +│ 3. Extract severity + fix │ +└────────────────────────────────┘ + │ + ▼ +Output: Prioritized table + CRITICAL requests 2.28.0 → CVE-2024-XXXX, upgrade to 2.32.3 + HIGH urllib3 1.26.5 → CVE-2024-YYYY, upgrade to 2.2.2 + ... +``` + +### Multi-turn Search Pattern + +The agent runs a search loop driven by the dependency list: +1. Parse the dependency list into packages and versions +2. For each package: search for CVEs, then search for the current patched version +3. Aggregate results and score by CVSS severity +4. Generate a remediation report sorted by risk + +Each search query is informed by the package name and version from the previous parse step — this is the core multi-turn pattern. + +## Notebook + +→ [`01-cve-scanner.ipynb`](01-cve-scanner.ipynb) + +## Prerequisites + +Complete `01-gateway-setup-and-raw-mcp` and export the environment variables. + +```bash +pip install -r requirements.txt +``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/requirements.txt new file mode 100644 index 000000000..1d8cae582 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/requirements.txt @@ -0,0 +1,4 @@ +boto3 +mcp +requests +strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb new file mode 100644 index 000000000..40a08e675 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb @@ -0,0 +1,318 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Earnings Brief Agent — Chained Multi-turn Research\n", + "\n", + "## Overview\n", + "\n", + "This notebook builds a financial research agent that, given a stock ticker, automatically searches for analyst estimates, recent competitor results, and sector news — then generates a structured pre-earnings call brief.\n", + "\n", + "**Why live search is critical here**: Analyst consensus, guidance revisions, and competitor earnings are filed days before the call. This information does not exist in any model's training data.\n", + "\n", + "### Tutorial Details\n", + "\n", + "| Information | Details |\n", + "|:------------|:--------|\n", + "| Tutorial type | Interactive (Jupyter Notebook) |\n", + "| AgentCore components | AgentCore Gateway |\n", + "| Agentic framework | Strands Agents |\n", + "| LLM model | Anthropic Claude Sonnet 4 |\n", + "| Tutorial vertical | Finance |\n", + "| Example complexity | Intermediate |\n", + "| SDK used | boto3, strands-agents |\n", + "\n", + "### Chained Search Pattern\n", + "\n", + "```\n", + "Input: Ticker (e.g., \"AMZN\")\n", + " │\n", + " ▼\n", + "Search 1: Analyst EPS + revenue estimates\n", + " │ results inform → what consensus expects\n", + " ▼\n", + "Search 2: Guidance revisions since last quarter\n", + " │ results inform → any surprise risk\n", + " ▼\n", + "Search 3: Top competitors' recent earnings\n", + " │ results inform → sector context\n", + " ▼\n", + "Search 4: Macro / sector news this quarter\n", + " │\n", + " ▼\n", + "Output: Structured pre-earnings brief\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "Complete `01-gateway-setup-and-raw-mcp` first and export the environment variables it prints.\n", + "\n", + "### Required IAM permissions\n", + "\n", + "~~~json\n", + "{\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": \"bedrock:InvokeModel\",\n", + " \"Resource\": \"*\"\n", + "}\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Install Dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --upgrade -r requirements.txt --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Configuration and Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from mcp.client.streamable_http import streamablehttp_client\n", + "from strands import Agent\n", + "from strands.models import BedrockModel\n", + "from strands.tools.mcp.mcp_client import MCPClient\n", + "\n", + "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", + "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", + "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", + "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", + "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", + "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", + "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", + "\n", + "\n", + "def get_token():\n", + " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", + " resp = requests.post(\n", + " url,\n", + " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", + " data={\"grant_type\": \"client_credentials\", \"client_id\": CLIENT_ID,\n", + " \"client_secret\": CLIENT_SECRET, \"scope\": SCOPE_STRING}\n", + " )\n", + " resp.raise_for_status()\n", + " return resp.json()[\"access_token\"]\n", + "\n", + "\n", + "def create_transport():\n", + " return streamablehttp_client(GATEWAY_URL, headers={\"Authorization\": f\"Bearer {get_token()}\"})\n", + "\n", + "\n", + "print(\"Configuration loaded ✓\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Choose a Ticker" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Change this to any US-listed company ticker\n", + "TICKER = \"AMZN\"\n", + "COMPANY_NAME = \"Amazon\" # Used in search queries for better results\n", + "\n", + "print(f\"Generating pre-earnings brief for: {TICKER} ({COMPANY_NAME})\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Define the Earnings Brief Agent\n", + "\n", + "The system prompt instructs the agent to follow the four-search research sequence and produce a structured output." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "EARNINGS_SYSTEM_PROMPT = \"\"\"You are a financial research analyst with access to real-time web search.\n", + "\n", + "When given a stock ticker and company name, produce a pre-earnings call brief by:\n", + "\n", + "RESEARCH SEQUENCE (do these searches in order):\n", + "1. Search: \" earnings estimate analyst consensus Q 2026\"\n", + "2. Search: \" guidance revision outlook 2026\"\n", + "3. Search: \" competitors earnings results recent\"\n", + "4. Search: \" sector macro headwinds tailwinds 2026\"\n", + "\n", + "CRITICAL RULES:\n", + "- Keep each search query under 200 characters\n", + "- Each search informs the next — note what you learned before issuing the next query\n", + "- Cite URLs for every claim\n", + "\n", + "OUTPUT FORMAT (use markdown):\n", + "\n", + "## Pre-Earnings Brief: \n", + "\n", + "### Analyst Consensus\n", + "\n", + "\n", + "### Guidance and Surprise Risk\n", + "\n", + "\n", + "### Competitor Context\n", + "\n", + "\n", + "### Macro and Sector Factors\n", + "\n", + "\n", + "### What to Watch\n", + "<3 key metrics or statements to monitor during the call>\n", + "\n", + "### Sources\n", + "\n", + "\"\"\"\n", + "\n", + "mcp_client = MCPClient(create_transport)\n", + "print(\"Earnings brief agent ready ✓\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Generate the Pre-Earnings Brief\n", + "\n", + "The agent will run 4 chained searches — each one informed by the previous result — then synthesize the brief." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "brief_prompt = f\"\"\"Generate a pre-earnings call brief for {TICKER} ({COMPANY_NAME}).\n", + "\n", + "Follow the research sequence: analyst estimates → guidance revisions → competitor context → macro factors.\n", + "Produce the full structured brief with cited sources.\n", + "\"\"\"\n", + "\n", + "print(f\"Researching {TICKER}...\")\n", + "print(\"-\" * 60)\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.5, max_tokens=3000)\n", + " agent = Agent(model=model, tools=tools, system_prompt=EARNINGS_SYSTEM_PROMPT)\n", + " response = agent(brief_prompt)\n", + "\n", + "print(\"\\n\" + \"=\" * 60)\n", + "print(f\"PRE-EARNINGS BRIEF: {TICKER}\")\n", + "print(\"=\" * 60)\n", + "if hasattr(response, \"message\"):\n", + " for block in response.message.get(\"content\", []):\n", + " if block.get(\"text\"):\n", + " print(block[\"text\"])\n", + "else:\n", + " print(str(response))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Try Another Ticker" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Change these to generate a brief for a different company\n", + "TICKER_2 = \"TSLA\"\n", + "COMPANY_2 = \"Tesla\"\n", + "\n", + "brief_prompt_2 = f\"\"\"Generate a pre-earnings call brief for {TICKER_2} ({COMPANY_2}).\n", + "Follow the research sequence and produce the full structured brief with cited sources.\n", + "\"\"\"\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.5, max_tokens=3000)\n", + " agent = Agent(model=model, tools=tools, system_prompt=EARNINGS_SYSTEM_PROMPT)\n", + " response = agent(brief_prompt_2)\n", + "\n", + "print(f\"\\n{'=' * 60}\")\n", + "print(f\"PRE-EARNINGS BRIEF: {TICKER_2}\")\n", + "print(\"=\" * 60)\n", + "if hasattr(response, \"message\"):\n", + " for block in response.message.get(\"content\", []):\n", + " if block.get(\"text\"):\n", + " print(block[\"text\"])\n", + "else:\n", + " print(str(response))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook you built a financial research agent that:\n", + "- Runs 4 chained searches where each result shapes the next query\n", + "- Synthesizes analyst data, competitive context, and macro factors\n", + "- Produces a structured brief with cited sources\n", + "\n", + "The key insight: **the output of each search is used to form a better next query** — this is the chained multi-turn pattern.\n", + "\n", + "**Next**: See `03-iterative-research.ipynb` for the generalized search → reflect → search loop that underpins both this example and the CVE scanner." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/README.md new file mode 100644 index 000000000..c7ae55b5f --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/README.md @@ -0,0 +1,63 @@ +# Earnings Brief Agent — Chained Multi-turn Research + +## Overview + +In this example you will build a financial research agent that, given a company ticker, automatically searches for analyst estimates, recent competitor results, and sector news — then generates a structured pre-earnings call brief. + +**Why live search is critical here**: Analyst consensus, guidance revisions, and competitor earnings are filed days before the call. This information does not exist in any model's training data. + +### Tutorial Details + +| Information | Details | +|:------------|:--------| +| Tutorial type | Interactive (Jupyter Notebook) | +| AgentCore components | AgentCore Gateway | +| Agentic framework | Strands Agents | +| LLM model | Anthropic Claude Sonnet 4 | +| Tutorial vertical | Finance | +| Example complexity | Intermediate | +| SDK used | boto3, strands-agents | + +### What the Agent Does + +``` +Input: Ticker symbol (e.g., "AMZN") + earnings date + │ + ▼ +┌─────────────────────────────────────────────┐ +│ Search 1: Analyst EPS and revenue estimates │ +│ Search 2: Guidance revisions since last Q │ +│ Search 3: Top 2 competitors' recent results │ +│ Search 4: Macro / sector news this quarter │ +└─────────────────────────────────────────────┘ + │ + ▼ +Output: Structured brief + ## Pre-Earnings Brief: AMZN — Q2 2026 + ### Analyst Consensus + ### Key Risks and Tailwinds + ### Competitor Context + ### What to Watch +``` + +### Chained Search Pattern + +Each search is informed by the results of the previous one: +1. Analyst consensus → identifies what the market expects +2. Guidance revision search → narrows to surprises vs. prior guidance +3. Competitor search → adds comparative context +4. Macro/sector search → explains external factors the model might miss + +The agent reflects after each search and decides what to look for next — this is the chained multi-turn pattern. + +## Notebook + +→ [`02-earnings-brief.ipynb`](02-earnings-brief.ipynb) + +## Prerequisites + +Complete `01-gateway-setup-and-raw-mcp` and export the environment variables. + +```bash +pip install -r requirements.txt +``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/requirements.txt new file mode 100644 index 000000000..1d8cae582 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/requirements.txt @@ -0,0 +1,4 @@ +boto3 +mcp +requests +strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/03-iterative-research.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/03-iterative-research.ipynb new file mode 100644 index 000000000..34cf5092a --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/03-iterative-research.ipynb @@ -0,0 +1,324 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Iterative Research Agent — Search → Reflect → Search Loop\n", + "\n", + "## Overview\n", + "\n", + "This notebook builds a research agent that answers complex questions through an explicit multi-turn loop: plan, search, reflect on gaps, search again — repeating until confident. This is the foundational pattern behind the CVE scanner and earnings brief examples.\n", + "\n", + "By making the loop explicit with a configurable max-iterations and confidence threshold, you can tune it for depth vs. cost.\n", + "\n", + "### Tutorial Details\n", + "\n", + "| Information | Details |\n", + "|:------------|:--------|\n", + "| Tutorial type | Interactive (Jupyter Notebook) |\n", + "| AgentCore components | AgentCore Gateway |\n", + "| Agentic framework | Strands Agents |\n", + "| LLM model | Anthropic Claude Sonnet 4 |\n", + "| Tutorial vertical | Cross-vertical |\n", + "| Example complexity | Advanced |\n", + "| SDK used | boto3, strands-agents |\n", + "\n", + "### The Research Loop\n", + "\n", + "```\n", + "Question\n", + " │\n", + " ▼\n", + "PLAN: Break into sub-questions\n", + " │\n", + " ▼\n", + "SEARCH: Execute highest-priority query ◀──────────────┐\n", + " │ │\n", + " ▼ │\n", + "REFLECT: What gaps remain? │\n", + " ├── Gaps found → refine query, iterate (max N) ────┘\n", + " └── Confident → synthesize final answer\n", + "```\n", + "\n", + "### When Single-Shot Search Isn't Enough\n", + "\n", + "Use this pattern when:\n", + "- The question requires comparing multiple sources\n", + "- Initial results reveal follow-up questions\n", + "- You need to reconcile conflicting information\n", + "- The topic has multiple dimensions that all matter" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "Complete `01-gateway-setup-and-raw-mcp` first and export the environment variables it prints.\n", + "\n", + "### Required IAM permissions\n", + "\n", + "~~~json\n", + "{\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": \"bedrock:InvokeModel\",\n", + " \"Resource\": \"*\"\n", + "}\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Install Dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --upgrade -r requirements.txt --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Configuration and Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from mcp.client.streamable_http import streamablehttp_client\n", + "from strands import Agent\n", + "from strands.models import BedrockModel\n", + "from strands.tools.mcp.mcp_client import MCPClient\n", + "\n", + "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", + "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", + "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", + "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", + "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", + "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", + "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", + "\n", + "\n", + "def get_token():\n", + " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", + " resp = requests.post(\n", + " url,\n", + " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", + " data={\"grant_type\": \"client_credentials\", \"client_id\": CLIENT_ID,\n", + " \"client_secret\": CLIENT_SECRET, \"scope\": SCOPE_STRING}\n", + " )\n", + " resp.raise_for_status()\n", + " return resp.json()[\"access_token\"]\n", + "\n", + "\n", + "def create_transport():\n", + " return streamablehttp_client(GATEWAY_URL, headers={\"Authorization\": f\"Bearer {get_token()}\"})\n", + "\n", + "\n", + "# Tunable parameters\n", + "MAX_SEARCH_ITERATIONS = 4 # Maximum number of search rounds before forcing synthesis\n", + "CONFIDENCE_THRESHOLD = 0.8 # The agent uses this conceptually — expressed in the prompt\n", + "\n", + "print(f\"Max iterations : {MAX_SEARCH_ITERATIONS}\")\n", + "print(f\"Configuration : ✓\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Define the Iterative Research Agent\n", + "\n", + "The system prompt explicitly encodes the plan → search → reflect → search loop with a stopping condition." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ITERATIVE_RESEARCH_PROMPT = f\"\"\"You are a thorough research analyst with access to real-time web search.\n", + "\n", + "RESEARCH LOOP (repeat up to {MAX_SEARCH_ITERATIONS} iterations):\n", + "\n", + "STEP 1 — PLAN:\n", + " Break the question into sub-questions. List them in priority order.\n", + " Identify what you can answer confidently vs. what requires search.\n", + "\n", + "STEP 2 — SEARCH:\n", + " Execute the highest-priority unanswered sub-question as a web search.\n", + " Keep queries under 200 characters.\n", + " After each search, note: \"Learned: . Remaining gaps: .\"\n", + "\n", + "STEP 3 — REFLECT:\n", + " Ask yourself: \"Do I have enough to answer the original question confidently?\"\n", + " - If NO and iterations remain: formulate the next search based on gaps, go to STEP 2\n", + " - If YES or iterations exhausted: go to STEP 4\n", + "\n", + "STEP 4 — SYNTHESIZE:\n", + " Write a comprehensive answer that:\n", + " - Directly addresses the original question\n", + " - Integrates findings from all search rounds\n", + " - Cites URLs for all factual claims\n", + " - Notes any remaining uncertainties\n", + "\n", + "SHOW YOUR WORK: Make the plan, search queries, and reflections visible in your response.\n", + "This helps users understand the research process and verify the results.\n", + "\"\"\"\n", + "\n", + "mcp_client = MCPClient(create_transport)\n", + "print(\"Iterative research agent ready ✓\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Research a Complex Question\n", + "\n", + "This question requires multiple search angles — a single query can't answer it reliably." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "RESEARCH_QUESTION = \"\"\"\n", + "What are the key differences between Claude Sonnet 4 and GPT-4.5 for enterprise code generation use cases,\n", + "and which one has better community adoption among developers as of 2026?\n", + "\"\"\"\n", + "\n", + "print(f\"Research question: {RESEARCH_QUESTION.strip()}\")\n", + "print(\"-\" * 60)\n", + "print(\"Running iterative research loop...\")\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.5, max_tokens=3000)\n", + " agent = Agent(model=model, tools=tools, system_prompt=ITERATIVE_RESEARCH_PROMPT)\n", + " response = agent(RESEARCH_QUESTION.strip())\n", + "\n", + "print(\"\\n\" + \"=\" * 60)\n", + "print(\"RESEARCH REPORT\")\n", + "print(\"=\" * 60)\n", + "if hasattr(response, \"message\"):\n", + " for block in response.message.get(\"content\", []):\n", + " if block.get(\"text\"):\n", + " print(block[\"text\"])\n", + "else:\n", + " print(str(response))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Try Questions That Require Multiple Search Angles" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "multi_angle_questions = [\n", + " \"What regulatory changes in the EU in 2026 affect AI startup compliance, and what are the key deadlines?\",\n", + " \"How has the adoption of Model Context Protocol changed agent development practices in 2025-2026?\",\n", + " \"What are the current best practices for deploying LLM agents in production, based on recent industry reports?\"\n", + "]\n", + "\n", + "# Run one example (uncomment others as needed)\n", + "selected_question = multi_angle_questions[0]\n", + "\n", + "print(f\"Question: {selected_question}\")\n", + "print(\"-\" * 60)\n", + "\n", + "with mcp_client:\n", + " tools = mcp_client.list_tools_sync()\n", + " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.5, max_tokens=3000)\n", + " agent = Agent(model=model, tools=tools, system_prompt=ITERATIVE_RESEARCH_PROMPT)\n", + " response = agent(selected_question)\n", + "\n", + "print(\"\\n\" + \"=\" * 60)\n", + "if hasattr(response, \"message\"):\n", + " for block in response.message.get(\"content\", []):\n", + " if block.get(\"text\"):\n", + " print(block[\"text\"])\n", + "else:\n", + " print(str(response))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Tuning the Loop\n", + "\n", + "Adjust `MAX_SEARCH_ITERATIONS` at the top of this notebook to control depth vs. latency/cost:\n", + "\n", + "| Setting | Effect | Use when |\n", + "|:--------|:-------|:---------|\n", + "| 2 | Fast, shallow | Simple factual questions |\n", + "| 4 (default) | Balanced | Most research tasks |\n", + "| 6+ | Deep, thorough | Complex comparative analysis |\n", + "\n", + "Each additional iteration costs one WebSearch call and one LLM call." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook you built a research agent that:\n", + "- Plans its research before searching\n", + "- Reflects after each search to identify gaps\n", + "- Issues targeted follow-up queries until confident\n", + "- Synthesizes findings with cited sources\n", + "\n", + "This is the foundational multi-turn pattern. Both the CVE scanner (search per item) and earnings brief (chained search) are specializations of this loop, tuned for their specific data structures.\n", + "\n", + "### Summary: Three Multi-turn Patterns\n", + "\n", + "| Pattern | Trigger | Example |\n", + "|:--------|:--------|:--------|\n", + "| Search per item | Fixed list of inputs | CVE scanner |\n", + "| Chained search | Each result shapes next query | Earnings brief |\n", + "| Iterative (this) | Reflect on gaps, search until confident | General deep research |" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/README.md new file mode 100644 index 000000000..e187e650f --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/README.md @@ -0,0 +1,73 @@ +# Iterative Research Agent — Search → Reflect → Search Loop + +## Overview + +In this example you will build a research agent that answers complex questions by planning its research, executing searches, reflecting on what it still doesn't know, and issuing follow-up queries — repeating until it can answer with confidence. + +This is a technique demonstration. The CVE Scanner and Earnings Brief examples both use this underlying pattern; this notebook makes it explicit and reusable. + +### Tutorial Details + +| Information | Details | +|:------------|:--------| +| Tutorial type | Interactive (Jupyter Notebook) | +| AgentCore components | AgentCore Gateway | +| Agentic framework | Strands Agents | +| LLM model | Anthropic Claude Sonnet 4 | +| Tutorial vertical | Cross-vertical | +| Example complexity | Advanced | +| SDK used | boto3, strands-agents | + +### The Research Loop + +``` +Question + │ + ▼ +┌──────────────────────────────────────────┐ +│ Plan: What do I need to know? │ +│ → Break question into sub-questions │ +└──────────────┬───────────────────────────┘ + │ + ▼ +┌──────────────────────────────────────────┐ +│ Search: Execute highest-priority query │◀──┐ +└──────────────┬───────────────────────────┘ │ + │ │ + ▼ │ +┌──────────────────────────────────────────┐ │ +│ Reflect: What gaps remain? │ │ +│ → If gaps exist: refine query, repeat ──┼───┘ +│ → If confident: synthesize │ +└──────────────┬───────────────────────────┘ + │ + ▼ + Final answer with citations +``` + +### Why This Pattern Matters + +Single-shot search works for simple factual queries. For questions that require: +- Comparing multiple sources +- Reconciling conflicting information +- Drilling into details from a high-level result + +...you need the reflect-and-refine loop. This notebook teaches that loop explicitly with configurable max iterations and a confidence threshold. + +### Example Questions + +- "What are the key differences between Claude 4 and GPT-4.5 for code generation?" +- "What regulatory changes in 2026 affect EU-based AI startups?" +- "What happened to Silicon Valley Bank and what changed in US banking regulation after?" + +## Notebook + +→ [`03-iterative-research.ipynb`](03-iterative-research.ipynb) + +## Prerequisites + +Complete `01-gateway-setup-and-raw-mcp` and export the environment variables. + +```bash +pip install -r requirements.txt +``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/requirements.txt new file mode 100644 index 000000000..1d8cae582 --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/requirements.txt @@ -0,0 +1,4 @@ +boto3 +mcp +requests +strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/README.md new file mode 100644 index 000000000..f902c4fef --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/README.md @@ -0,0 +1,29 @@ +# Advanced Web Search Examples + +## Overview + +These examples go beyond single-shot search to demonstrate patterns where live web data is genuinely critical — not optional. Each example shows a realistic use case where stale training data would break the outcome. + +## Examples + +| Folder | Use Case | Key Pattern | +|:-------|:---------|:------------| +| [`01-cve-scanner/`](01-cve-scanner/) | Security vulnerability scan across a dependency list | Multi-turn: one search per package, chained reasoning | +| [`02-earnings-brief/`](02-earnings-brief/) | Pre-earnings call research brief | Multi-turn: analyst estimates → competitors → sector news → synthesis | +| [`03-iterative-research/`](03-iterative-research/) | Deep Q&A via search → reflect → search loop | Technique demo: explicit multi-turn research pattern | + +## When to Use Each Pattern + +### CVE Scanner — "search for each item in a list" +The agent receives a list of dependencies, searches for CVEs for each one, and produces a prioritized remediation report. The loop is driven by the input list, and each search result is independent. + +### Earnings Brief — "chained research where each search informs the next" +The agent starts with analyst consensus, finds gaps, searches competitors, then searches for macro context. The queries are generated dynamically — each result shapes what to search for next. + +### Iterative Research — "search until confident" +The agent explicitly plans its research, executes searches, reflects on gaps, and issues follow-up queries until it can answer with confidence. This is the foundational pattern the other two use cases build on. + +## Prerequisites + +All examples require a running AgentCore Gateway with Web Search connector target. +Complete `01-gateway-setup-and-raw-mcp` first and export the environment variables it produces. diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/README.md new file mode 100644 index 000000000..00f6d3dca --- /dev/null +++ b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/README.md @@ -0,0 +1,127 @@ +# Amazon Bedrock AgentCore Web Search Tool + +## Overview + +Amazon Bedrock AgentCore Web Search Tool exposes live web search as a fully managed, MCP-compliant tool through AgentCore Gateway. Your agents discover and invoke it using the standard Model Context Protocol — no custom integrations, no search APIs to provision, no infrastructure to manage. + +This tutorial series covers setup, basic agent integration, and advanced multi-turn patterns where real-time web data is genuinely critical to the outcome. + +
+ +
+ +## How It Works + +The Web Search Tool uses the **connector** target type in AgentCore Gateway. You specify `connectorId: "web-search"` and the Gateway handles schema management, endpoint resolution, and outbound authentication automatically. + +``` +Your Agent (Strands / LangChain / any MCP client) + │ + │ OAuth Bearer token (inbound auth) + ▼ +AgentCore Gateway (MCP endpoint) + │ + │ IAM role (outbound auth — automatic) + ▼ +Web Search Backend + │ + ▼ +Structured results: { text, url, title, publishedDate } +``` + +**Inbound auth**: Amazon Cognito with `client_credentials` flow — your agent gets a token and passes it to the Gateway. + +**Outbound auth**: Fully automatic — the Gateway's IAM role authenticates to the Web Search backend. Nothing to configure. + +
+ +
+ +## Key Capabilities + +- **Real-time information** — live web results with titles, URLs, snippets, and publication dates +- **Zero infrastructure** — no search APIs, no hosting, no scaling configuration +- **Framework agnostic** — Strands Agents, LangChain, LangGraph, or any MCP client +- **MCP-native** — tool discovery and invocation via standard `tools/list` and `tools/call` + +## Tutorial Details + +| Information | Details | +|:------------|:--------| +| Tutorial type | Interactive (Jupyter Notebooks) | +| AgentCore components | AgentCore Gateway | +| Gateway target type | Connector (`web-search`) | +| Agentic frameworks | Strands Agents, LangChain + LangGraph | +| Inbound auth | Amazon Cognito (`client_credentials` flow) | +| Outbound auth | Automatic (Gateway IAM role) | +| LLM model | Anthropic Claude Sonnet 4 | +| Region | us-east-1 (Web Search connector availability) | +| SDK used | boto3 | + +## Tutorials Overview + +### Foundation Tutorials + +Run these in order — each tutorial builds on the previous one. + +| Tutorial | What You'll Learn | +|:---------|:-----------------| +| [01 — Gateway Setup and Raw MCP](01-gateway-setup-and-raw-mcp/) | Create IAM role, Cognito, Gateway, and Web Search target. Verify with direct MCP calls. | +| [02 — Web Search with Strands](02-web-search-with-strands/) | Full agent loop using Strands Agents and Claude Sonnet 4. | +| [03 — Web Search with LangChain](03-web-search-with-langchain/) | Same integration using LangChain + LangGraph. | + +### Advanced Examples + +These examples require the Gateway from tutorial 01. They demonstrate patterns where live web search is genuinely critical — not optional. + +| Example | Use Case | Pattern | +|:--------|:---------|:--------| +| [CVE Scanner](04-advanced-examples/01-cve-scanner/) | Scan dependencies for recent security vulnerabilities | Multi-turn: one search per package | +| [Earnings Brief](04-advanced-examples/02-earnings-brief/) | Pre-earnings call research brief for any ticker | Chained: each search informs the next | +| [Iterative Research](04-advanced-examples/03-iterative-research/) | Deep Q&A via search → reflect → search loop | Technique: explicit multi-turn pattern | + +## Prerequisites + +- AWS account allowlisted for the Web Search Tool private beta +- Python 3.10+ and Jupyter Notebook (or JupyterLab) +- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions +- Access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) in us-east-1 + +```bash +pip install -r requirements.txt +``` + +> **Region**: The Web Search Tool connector is currently available in **us-east-1** only. + +## Quick Start + +```bash +# Step 1: Set up Gateway (run once — reused by all other tutorials) +jupyter notebook 01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb + +# Step 2: Try with Strands +jupyter notebook 02-web-search-with-strands/02-web-search-strands-agent.ipynb + +# Step 3: Try with LangChain +jupyter notebook 03-web-search-with-langchain/03-web-search-langchain-agent.ipynb + +# Advanced: CVE Scanner +jupyter notebook 04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb + +# Advanced: Earnings Brief +jupyter notebook 04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb + +# Advanced: Iterative Research Pattern +jupyter notebook 04-advanced-examples/03-iterative-research/03-iterative-research.ipynb +``` + +## Files + +| Path | Description | +|:-----|:------------| +| `requirements.txt` | Shared Python dependencies | +| `images/` | Architecture diagrams | +| `01-gateway-setup-and-raw-mcp/` | Infrastructure setup + MCP verification | +| `02-web-search-with-strands/` | Strands agent integration | +| `03-web-search-with-langchain/` | LangChain + LangGraph integration | +| `04-advanced-examples/` | Multi-turn and real-world use cases | diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/inbound-and-outbound-auth.png b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/inbound-and-outbound-auth.png new file mode 100644 index 0000000000000000000000000000000000000000..c833f09a5e1594a712121aa6a0760ca83904ab54 GIT binary patch literal 19563 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 literal 0 HcmV?d00001 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/tutorial-architecture.png b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/tutorial-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d044ca4ec974212f19d4e0613c01ef01750c75 GIT binary patch literal 31128 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.1.8 +mcp +requests +langchain +langchain-mcp-adapters +langchain-aws +langgraph diff --git a/06-workshops/05-AgentCore-tools/README.md b/06-workshops/05-AgentCore-tools/README.md index d30e601fc..cd0ee00fc 100644 --- a/06-workshops/05-AgentCore-tools/README.md +++ b/06-workshops/05-AgentCore-tools/README.md @@ -2,10 +2,11 @@ ## Overview Amazon Bedrock AgentCore Tools provide enterprise-grade capabilities that enhance AI agents' ability to perform complex -tasks securely and efficiently. This suite includes two primary tools: +tasks securely and efficiently. This suite includes three tools: -- Amazon Bedrock AgentCore Code Interpreter and +- Amazon Bedrock AgentCore Code Interpreter - Amazon Bedrock AgentCore Browser Tool +- Amazon Bedrock AgentCore Web Search Tool ## Amazon Bedrock AgentCore Code Interpreter @@ -48,7 +49,32 @@ tasks securely and efficiently. This suite includes two primary tools: - Large-scale data processing and monitoring - Secure code execution for AI agents in enterprise settings +## Amazon Bedrock AgentCore Web Search Tool + +### Key Features + +1. **Real-time Information Access**: Retrieve current web results with titles, URLs, snippets, and publication dates — no frozen training data. + +2. **Zero Infrastructure Management**: No search APIs to provision, no scaling to configure. Expose web search through AgentCore Gateway as a fully managed MCP connector. + +3. **Framework Agnostic**: Works with Strands Agents, LangChain, LangGraph, CrewAI, or any MCP-compatible client. + +### Benefits + +- **Grounded Responses**: Agents cite live sources rather than hallucinating outdated facts. +- **Critical for Time-Sensitive Use Cases**: CVE scanning, earnings research, regulatory monitoring — all require data that doesn't exist in training sets. +- **MCP-Native Discovery**: Agents discover and invoke the tool via standard `tools/list` and `tools/call` — no custom integration code. + +## Use Cases + +- Complex data analysis and visualization in secure environments +- Automated web interactions for form filling, data extraction, and multi-step processes +- Large-scale data processing and monitoring +- Secure code execution for AI agents in enterprise settings +- Real-time web grounding for agents that need current information + ## Tutorials Overview 1. [Amazon Bedrock AgentCore Code Interpreter](01-Agent-Core-code-interpreter) 2. [Amazon Bedrock AgentCore Browser Tool](02-Agent-Core-browser-tool) +3. [Amazon Bedrock AgentCore Web Search Tool](03-Agent-Core-web-search) From cf286d243d0ef8ac98183880b7d1b3f5376ad101 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Fri, 5 Jun 2026 17:41:03 -0400 Subject: [PATCH 03/21] feat: add deep-research-agent with auto-provisioning and search privacy notices - Add deep-research-agent use case with iterative Plan/Search/Reflect/Synthesize loop - Add gateway_setup.py with auto-detect/prompt/provision flow (no hard prerequisites) - Add search privacy callout to all 03-web-search README files - Fix model ID default to use cross-region inference profile - Add user-friendly error handling for auth failures --- .../03-web-search/01-setup-gateway/README.md | 2 + .../03-web-search/02-raw-mcp/README.md | 2 + .../03-web-search/03-strands-agent/README.md | 6 +- .../04-langchain-agent/README.md | 7 +- .../03-web-search/README.md | 4 +- 02-use-cases/deep-research-agent/README.md | 258 ++++++++ .../deep_research_agent.py | 381 ++++++++++++ .../deep-research-agent/gateway_setup.py | 583 ++++++++++++++++++ .../deep-research-agent/requirements.txt | 6 + 9 files changed, 1243 insertions(+), 6 deletions(-) create mode 100644 02-use-cases/deep-research-agent/README.md create mode 100644 02-use-cases/deep-research-agent/deep_research_agent.py create mode 100644 02-use-cases/deep-research-agent/gateway_setup.py create mode 100644 02-use-cases/deep-research-agent/requirements.txt diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md index 3196208d0..0c97c7185 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md @@ -4,6 +4,8 @@ This script creates all the infrastructure needed to expose the Web Search Tool through an AgentCore Gateway. After running it, you'll have a fully functional MCP endpoint that any agent framework can connect to. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. + ``` ┌──────────────────┐ ┌─────────────────────────────────────┐ │ setup_gateway │────────▶│ AWS Resources Created: │ diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md index aad3b9048..73182422b 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md @@ -4,6 +4,8 @@ This demo calls the AgentCore Gateway directly over the MCP protocol — no agent framework involved. It's the simplest way to verify your Gateway and Web Search Tool target infrastructure are working correctly. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. + ``` ┌──────────────────┐ tools/list ┌─────────────────────────────────┐ │ raw_mcp_call.py │ ──────────────▶ │ AgentCore Gateway │ diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md index 40a829661..28060b839 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md @@ -4,6 +4,8 @@ This demo shows the complete agent integration: a Strands agent automatically discovers and invokes the Web Search Tool to answer real-time questions with cited sources. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. + ``` ┌────────────┐ "What's the latest AI news?" ┌──────────────────────────┐ │ User │ ─────────────────────────────▶ │ Strands Agent │ @@ -63,7 +65,7 @@ pip install -r ../requirements.txt Run `01-setup-gateway/setup_gateway.py` first and export the environment variables it prints. -Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) in us-east-1. +Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-6`) in us-east-1. ## Usage @@ -82,7 +84,7 @@ python web_search_strands.py --query "Current price of Bitcoin" { "Effect": "Allow", "Action": "bedrock:InvokeModel", - "Resource": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-20250514-v1:0" + "Resource": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-6" } ``` diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md index e289f69b5..cb69c8ef6 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md @@ -4,6 +4,7 @@ This demo shows the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore Gateway and `create_react_agent` from LangGraph for the agent loop. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. ``` ┌────────────┐ "Latest AWS announcements?" ┌──────────────────────────┐ │ User │ ─────────────────────────────▶ │ LangChain Agent │ @@ -49,7 +50,7 @@ from langchain_aws import ChatBedrockConverse from langgraph.prebuilt import create_react_agent model = ChatBedrockConverse( - model="us.anthropic.claude-sonnet-4-20250514-v1:0", + model="us.anthropic.claude-sonnet-4-6", region_name="us-east-1", ) agent = create_react_agent(model, tools=tools) @@ -68,7 +69,7 @@ pip install -r ../requirements.txt Run `01-setup-gateway/setup_gateway.py` first and export the environment variables it prints. -Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) in us-east-1. +Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-6`) in us-east-1. ## Usage @@ -87,7 +88,7 @@ python web_search_langchain.py --query "Python 3.13 new features" { "Effect": "Allow", "Action": "bedrock:InvokeModel", - "Resource": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-20250514-v1:0" + "Resource": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-6" } ``` diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md index 3256feaf8..ff094209a 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md @@ -4,6 +4,8 @@ [Amazon Bedrock AgentCore Web Search Tool](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) exposes web search as a fully managed, MCP-compliant tool through Amazon Bedrock AgentCore Gateway. Your agents discover and invoke it using the standard Model Context Protocol — no custom integrations, no infrastructure to manage. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. + ![Web Search Tool Architecture](images/tutorial-architecture.png) ## How the Web Search Tool Works @@ -132,7 +134,7 @@ python 05-cleanup/cleanup.py --gateway-id --user-pool-id --role-name < ## Shared Utilities -Demos 02–04 share authentication and agent utilities in `utils/`: +Demos 02–04 share utilities in `utils/`: ```python from utils.gateway_auth import get_oauth_token, create_streamable_http_transport diff --git a/02-use-cases/deep-research-agent/README.md b/02-use-cases/deep-research-agent/README.md new file mode 100644 index 000000000..2839b0c05 --- /dev/null +++ b/02-use-cases/deep-research-agent/README.md @@ -0,0 +1,258 @@ +# Deep Research Agent + +An intelligent research agent powered by Amazon Bedrock AgentCore and Claude Sonnet 4 that answers complex, multi-faceted questions through an iterative Plan → Search → Reflect → Synthesize loop. + +## Overview + +Single-shot web search works for simple factual queries. For questions that require comparing multiple sources, reconciling conflicting information, or drilling into details revealed by earlier results, you need a reflect-and-refine loop. The Deep Research Agent makes that loop explicit and configurable. + +``` +Question + │ + ▼ +┌──────────────────────────────────────────┐ +│ PLAN: Break into prioritised │ +│ sub-questions │ +└──────────────┬───────────────────────────┘ + │ + ▼ +┌──────────────────────────────────────────┐ +│ SEARCH: Execute highest-priority query │◀──┐ +└──────────────┬───────────────────────────┘ │ + │ │ + ▼ │ +┌──────────────────────────────────────────┐ │ +│ REFLECT: What gaps remain? │ │ +│ → Gaps found: refine query, repeat ─────┼───┘ +│ → Confident: synthesize │ +└──────────────┬───────────────────────────┘ + │ + ▼ + Comprehensive answer with citations +``` + +| Information | Details | +|:------------|:--------| +| Use case type | Research / Question answering | +| Agent type | Single agent | +| AgentCore components | AgentCore Gateway, AgentCore Runtime | +| Agentic framework | Strands Agents | +| LLM model | Anthropic Claude Sonnet 4 | +| Use case vertical | Cross-vertical | +| Example complexity | Intermediate | +| SDK used | bedrock-agentcore, strands-agents, mcp | + +## When to Use This Pattern + +| Scenario | Single-shot search | Deep Research Agent | +|:---------|:-------------------|:--------------------| +| Simple factual lookup | ✅ Sufficient | Overkill | +| Multi-source comparison | ❌ Incomplete | ✅ Ideal | +| Conflicting information | ❌ Misses nuance | ✅ Reconciles | +| Follow-up questions emerge | ❌ Single pass | ✅ Iterates | +| Complex regulatory / technical topics | ❌ Shallow | ✅ Deep | + +## Example Questions + +- "What are the key differences between Claude Sonnet 4 and GPT-4.5 for enterprise code generation, and which has stronger developer community adoption?" +- "What regulatory changes in the EU in 2026 affect AI startup compliance, and what are the key deadlines?" +- "How has the adoption of Model Context Protocol changed agent development practices in 2025–2026?" +- "What are the current best practices for deploying LLM agents in production, based on recent industry reports?" +- "What are the trade-offs between RAG and fine-tuning for enterprise LLM applications?" + +## Architecture + +``` +┌─────────────┐ Research question ┌──────────────────────────────────┐ +│ User / │ ───────────────────▶ │ Deep Research Agent │ +│ Client │ │ (Claude Sonnet 4 via Strands) │ +│ │◀─────────────────── │ │ +│ │ Cited research │ Plan → Search → Reflect loop │ +└─────────────┘ report │ │ │ + └───────┼──────────────────────────┘ + │ MCP tools/call + ▼ + ┌──────────────────────────────────┐ + │ AgentCore Gateway │ + │ → Web Search Connector │ + │ → Real-time web results │ + └──────────────────────────────────┘ +``` + +## Features + +- **Configurable depth** — set `--max-iter` (or `DEEP_RESEARCH_MAX_ITER`) to tune depth vs. cost +- **Transparent reasoning** — plan, search queries, and reflections are visible in the output +- **Cited answers** — every factual claim is backed by a source URL +- **AgentCore Runtime** — production-ready hosting via `BedrockAgentCoreApp` +- **CLI + runtime modes** — run locally with `--query` or deploy to AgentCore Runtime + +## Tuning the Loop + +| `--max-iter` | Effect | Use when | +|:-------------|:-------|:---------| +| 2 | Fast, shallow | Simple factual questions | +| 4 (default) | Balanced | Most research tasks | +| 6+ | Deep, thorough | Complex comparative analysis | + +Each additional iteration costs one WebSearch call and one LLM call. + +## Prerequisites + +- AWS account with Amazon Bedrock enabled in **us-east-1** +- **Claude Sonnet 4** model access enabled in Bedrock (Bedrock Console → Model Access) +- AWS credentials with `bedrock:InvokeModel` permission +- **No Gateway pre-setup required** — the agent auto-detects or provisions one for you + +### IAM permissions for auto-provisioning (first run only) + +If no existing Gateway is found, the agent will offer to create one. This requires: + +``` +iam:CreateRole, iam:PutRolePolicy, iam:GetRole +cognito-idp:CreateUserPool, cognito-idp:CreateUserPoolDomain +cognito-idp:CreateResourceServer, cognito-idp:CreateUserPoolClient +cognito-idp:ListUserPools, cognito-idp:ListUserPoolClients +cognito-idp:DescribeUserPoolClient, cognito-idp:DescribeResourceServer +bedrock-agentcore:CreateGateway, bedrock-agentcore:GetGateway +bedrock-agentcore:CreateGatewayTarget, bedrock-agentcore:ListGatewayTargets +bedrock-agentcore:ListGateways +``` + +On subsequent runs, if you export the printed variables, only `bedrock:InvokeModel` is needed. + +## Quick Start + +### 1. Install dependencies + +```bash +cd 02-use-cases/deep-research-agent +pip install -r requirements.txt +``` + +### 2. Run locally + +```bash +# Interactive mode — auto-detects or provisions Gateway, then prompts for a question +python deep_research_agent.py + +# Direct question +python deep_research_agent.py --query "What are the trade-offs between RAG and fine-tuning for enterprise LLMs?" + +# Deep mode — 6 iterations for complex comparative questions +python deep_research_agent.py --query "Compare Claude Sonnet 4 and GPT-4.5 for code generation" --max-iter 6 +``` + +On first run without environment variables, the agent will: +1. Scan your account for an existing Gateway with a Web Search target +2. If found, reuse it automatically +3. If not found, prompt you to create one (~60 seconds) +4. Print `export` commands to skip this step on future runs + +### 3. (Optional) Pre-configure environment variables + +If you already have a Gateway or want to skip auto-detection: + +```bash +export AGENTCORE_GATEWAY_URL="https://..." +export COGNITO_DOMAIN="us-east-1xxxxxxxx" +export COGNITO_CLIENT_ID="..." +export COGNITO_CLIENT_SECRET="..." +export COGNITO_SCOPE="agentcore-websearch/invoke" +export AWS_DEFAULT_REGION="us-east-1" +``` + +### 4. Deploy to AgentCore Runtime + +For runtime deployments, environment variables **must** be pre-configured in the +container environment (no interactive provisioning in runtime mode): + +```bash +# The BedrockAgentCoreApp entrypoint makes this deployment-ready +python deep_research_agent.py # starts the runtime server when deployed +``` + +When deployed, invoke via the AgentCore Runtime API: + +```json +{ + "prompt": "What are the current best practices for deploying LLM agents in production?", + "max_iter": 4 +} +``` + +## Cleanup + +When you're done, remove all provisioned resources using the shared cleanup script: + +```bash +python ../../01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py \ + --gateway-id \ + --user-pool-id \ + --role-name +``` + +The gateway ID, role name, and user pool ID are printed during provisioning. After cleanup, unset environment variables: + +```bash +unset AGENTCORE_GATEWAY_URL COGNITO_DOMAIN COGNITO_CLIENT_ID COGNITO_CLIENT_SECRET COGNITO_SCOPE +``` + +## IAM Permissions + +### Caller (agent runtime) + +```json +{ + "Effect": "Allow", + "Action": "bedrock:InvokeModel", + "Resource": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-20250514-v1:0" +} +``` + +### Gateway authentication + +Gateway invocation is authorised via the Cognito OAuth token — no additional IAM permissions needed for the caller beyond `bedrock:InvokeModel`. + +### Auto-provisioning (first run only) + +See the Prerequisites section above for the full list of permissions needed to create Gateway infrastructure. These are only required once — after provisioning, the agent only needs `bedrock:InvokeModel`. + +## Files + +| File | Description | +|:-----|:------------| +| `deep_research_agent.py` | Main agent — Plan/Search/Reflect loop, AgentCore Runtime entrypoint, and CLI | +| `gateway_setup.py` | Auto-detection and provisioning of Gateway + Web Search infrastructure | +| `requirements.txt` | Python dependencies | +| `README.md` | This file | + +## How It Works + +### The Research Loop + +The system prompt encodes the loop directly. Claude: + +1. **Plans** — decomposes the question into ordered sub-questions and identifies what needs searching +2. **Searches** — calls the `WebSearch` tool with the highest-priority unanswered sub-question (queries kept under 200 characters for best results) +3. **Reflects** — after each result, explicitly notes what was learned and what gaps remain; decides whether to search again or synthesize +4. **Synthesizes** — once confident (or when `max_iter` is reached), writes a comprehensive answer with cited URLs and noted uncertainties + +### Gateway Integration + +The agent connects to AgentCore Gateway via MCP Streamable HTTP. The Gateway exposes the Web Search connector as a standard MCP `WebSearch` tool. Tool discovery (`tools/list`) and invocation (`tools/call`) happen automatically through the Strands `MCPClient`. + +### Auth Flow + +``` +deep_research_agent.py + └── get_oauth_token() + └── POST /oauth2/token → Cognito (client_credentials) + └── Bearer token attached to every MCP request → Gateway +``` + +## Related Resources + +- [`01-features/03-connect-your-agent-to-anything/03-web-search/`](../../01-features/03-connect-your-agent-to-anything/03-web-search/) — Gateway setup, raw MCP, and basic agent demos +- [`06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/`](../../06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/) — Jupyter Notebook version of this pattern (workshop format) +- [AgentCore Gateway documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) diff --git a/02-use-cases/deep-research-agent/deep_research_agent.py b/02-use-cases/deep-research-agent/deep_research_agent.py new file mode 100644 index 000000000..a8cd0a1a5 --- /dev/null +++ b/02-use-cases/deep-research-agent/deep_research_agent.py @@ -0,0 +1,381 @@ +""" +Deep Research Agent — Plan → Search → Reflect → Synthesize Loop. + +An intelligent research agent powered by Amazon Bedrock AgentCore and Claude Sonnet 4 +that answers complex, multi-faceted questions through an iterative research loop: + + 1. PLAN — break the question into prioritised sub-questions + 2. SEARCH — execute the highest-priority unanswered sub-question via WebSearch + 3. REFLECT — assess gaps; if unresolved and iterations remain, go back to SEARCH + 4. SYNTHESIZE — write a comprehensive, cited answer once confident + +Single-shot search fails for questions that require comparing multiple sources, +reconciling conflicting information, or drilling into details revealed by earlier +results. This agent makes the reflect-and-refine loop explicit and configurable. + +Prerequisites: + pip install -r requirements.txt + + Gateway + Web Search configuration is handled automatically: + - If environment variables are set, they are used directly + - If not, the agent scans for an existing Gateway in your account + - If none found, it offers to create one interactively + +Optional environment variables: + AGENTCORE_GATEWAY_URL — Gateway MCP endpoint (auto-detected if missing) + COGNITO_DOMAIN — Cognito domain prefix (auto-detected if missing) + COGNITO_CLIENT_ID — Cognito app client ID (auto-detected if missing) + COGNITO_CLIENT_SECRET — Cognito app client secret (auto-detected if missing) + COGNITO_SCOPE — OAuth scope string (auto-detected if missing) + BEDROCK_MODEL_ID — Bedrock inference profile ID or ARN + (defaults to us.anthropic.claude-sonnet-4-6) + DEEP_RESEARCH_MAX_ITER — Maximum search iterations per question (default: 4) + AWS_DEFAULT_REGION — AWS region (default: us-east-1) + +IAM permissions required: + bedrock:InvokeModel (for Claude Sonnet 4) + + provisioning permissions if auto-creating Gateway (see gateway_setup.py) + +Usage: + # Run interactively (auto-detects or provisions gateway, prompts for question) + python deep_research_agent.py + + # Pass a question directly + python deep_research_agent.py --query "What are the trade-offs between RAG and fine-tuning for enterprise LLMs?" + + # Increase depth for complex comparative questions + python deep_research_agent.py --query "..." --max-iter 6 +""" + +import argparse +import logging +import os + +import requests +from bedrock_agentcore.runtime import BedrockAgentCoreApp +from mcp.client.streamable_http import streamablehttp_client +from strands import Agent +from strands.models import BedrockModel +from strands.tools.mcp.mcp_client import MCPClient + +from gateway_setup import ensure_gateway + +# ── Configuration ────────────────────────────────────────────────────────────── + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") +MODEL_ID = os.getenv( + "BEDROCK_MODEL_ID", "us.anthropic.claude-sonnet-4-6" +) +MAX_SEARCH_ITERATIONS = int(os.getenv("DEEP_RESEARCH_MAX_ITER", "4")) + +# Configure logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Initialize the AgentCore Runtime app +app = BedrockAgentCoreApp() + + +# ── Auth helpers ─────────────────────────────────────────────────────────────── + + +def get_oauth_token() -> str: + """Retrieve a fresh OAuth token from Cognito using client_credentials flow.""" + cognito_domain = os.environ.get("COGNITO_DOMAIN", "") + cognito_client_id = os.environ.get("COGNITO_CLIENT_ID", "") + cognito_client_secret = os.environ.get("COGNITO_CLIENT_SECRET", "") + cognito_scope = os.environ.get("COGNITO_SCOPE", "") + region = os.environ.get("AWS_DEFAULT_REGION", REGION) + + if not all([cognito_domain, cognito_client_id, cognito_client_secret]): + raise ValueError( + "Cognito credentials not configured. Run the agent interactively " + "to auto-provision, or set COGNITO_DOMAIN, COGNITO_CLIENT_ID, " + "and COGNITO_CLIENT_SECRET environment variables." + ) + url = f"https://{cognito_domain}.auth.{region}.amazoncognito.com/oauth2/token" + resp = requests.post( + url, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + data={ + "grant_type": "client_credentials", + "client_id": cognito_client_id, + "client_secret": cognito_client_secret, + "scope": cognito_scope, + }, + ) + if resp.status_code != 200: + error_detail = resp.text + raise RuntimeError( + f"Authentication failed (HTTP {resp.status_code}). " + f"Cognito returned: {error_detail}\n" + f" Check your COGNITO_CLIENT_ID and COGNITO_CLIENT_SECRET are correct.\n" + f" Token URL: {url}" + ) + return resp.json()["access_token"] + + +def create_mcp_transport(): + """Create an authenticated MCP Streamable HTTP transport for the Gateway.""" + gateway_url = os.environ.get("AGENTCORE_GATEWAY_URL", "") + if not gateway_url: + raise ValueError( + "Gateway URL not configured. Run the agent interactively to " + "auto-provision, or set AGENTCORE_GATEWAY_URL environment variable." + ) + token = get_oauth_token() + return streamablehttp_client( + gateway_url, + headers={"Authorization": f"Bearer {token}"}, + ) + + +# ── System prompt ────────────────────────────────────────────────────────────── + + +def build_system_prompt(max_iterations: int) -> str: + """Build the deep-research system prompt with the configured iteration cap. + + Args: + max_iterations: Maximum number of search-reflect cycles before forcing synthesis. + + Returns: + System prompt string for the Strands agent. + """ + return f"""You are a thorough research analyst with access to real-time web search. + +RESEARCH LOOP (repeat up to {max_iterations} iterations): + +STEP 1 — PLAN: + Break the question into sub-questions. List them in priority order. + Identify what you can answer confidently vs. what requires search. + +STEP 2 — SEARCH: + Execute the highest-priority unanswered sub-question as a web search. + Keep queries under 200 characters. + After each search, note: "Learned: . Remaining gaps: ." + +STEP 3 — REFLECT: + Ask yourself: "Do I have enough to answer the original question confidently?" + - If NO and iterations remain: formulate the next search based on gaps, go to STEP 2 + - If YES or iterations exhausted: go to STEP 4 + +STEP 4 — SYNTHESIZE: + Write a comprehensive answer that: + - Directly addresses the original question + - Integrates findings from all search rounds + - Cites URLs for all factual claims + - Notes any remaining uncertainties + +SHOW YOUR WORK: Make the plan, search queries, and reflections visible in your +response. This helps users understand the research process and verify the results. +""" + + +# ── Agent factory ────────────────────────────────────────────────────────────── + + +def create_deep_research_agent(max_iterations: int = MAX_SEARCH_ITERATIONS) -> tuple: + """Create an MCPClient and a Strands deep-research agent. + + Returns the (mcp_client, agent) pair. The caller is responsible for using + mcp_client as a context manager. + + Args: + max_iterations: Maximum search-reflect cycles before forcing synthesis. + + Returns: + Tuple of (MCPClient, Agent). + """ + mcp_client = MCPClient(create_mcp_transport) + + with mcp_client: + tools = mcp_client.list_tools_sync() + logger.info("Discovered %d tool(s) from Gateway", len(tools)) + + model = BedrockModel( + model_id=MODEL_ID, + region_name=REGION, + temperature=0.5, + max_tokens=4096, + ) + agent = Agent( + model=model, + tools=tools, + system_prompt=build_system_prompt(max_iterations), + ) + + return mcp_client, agent + + +# ── Response extraction ──────────────────────────────────────────────────────── + + +def extract_text(response) -> str: + """Extract the text content from a Strands agent response.""" + if hasattr(response, "message"): + parts = [] + for block in response.message.get("content", []): + if block.get("text"): + parts.append(block["text"]) + return "\n".join(parts) + return str(response) + + +# ── AgentCore Runtime entrypoint ─────────────────────────────────────────────── + + +@app.entrypoint +def deep_research_runtime(payload): + """AgentCore Runtime handler — receives a payload and returns the research report. + + In runtime mode, environment variables MUST be pre-configured (no interactive + provisioning). The runtime expects AGENTCORE_GATEWAY_URL and Cognito vars to + be set in the container environment. + + Args: + payload: Dict containing the research question under any of: + 'prompt', 'query', 'message', or 'inputText'. + + Returns: + str: The full research report with citations. + """ + query = ( + payload.get("prompt") + or payload.get("query") + or payload.get("message") + or payload.get("inputText") + or payload.get("input") + ) + + if not query: + return "No research question provided. Include your question under the 'prompt' key." + + max_iter = int(payload.get("max_iter", MAX_SEARCH_ITERATIONS)) + logger.info("Deep research request: %s (max_iter=%d)", query, max_iter) + + # In runtime mode, ensure gateway config is available (non-interactive) + ensure_gateway(interactive=False) + + mcp_client = MCPClient(create_mcp_transport) + + with mcp_client: + tools = mcp_client.list_tools_sync() + model = BedrockModel( + model_id=MODEL_ID, + region_name=REGION, + temperature=0.5, + max_tokens=4096, + ) + agent = Agent( + model=model, + tools=tools, + system_prompt=build_system_prompt(max_iter), + ) + response = agent(query) + + return extract_text(response) + + +# ── CLI entrypoint ───────────────────────────────────────────────────────────── + + +def parse_args(): + parser = argparse.ArgumentParser( + description=( + "Deep Research Agent — iterative Plan/Search/Reflect/Synthesize " + "loop via AgentCore Gateway Web Search Tool" + ) + ) + parser.add_argument( + "--query", + default=None, + help="Research question. If omitted, the agent prompts interactively.", + ) + parser.add_argument( + "--max-iter", + type=int, + default=MAX_SEARCH_ITERATIONS, + help=( + f"Maximum search iterations per question (default: {MAX_SEARCH_ITERATIONS}). " + "Higher values give deeper results at the cost of more WebSearch + LLM calls. " + "Recommended: 2 (fast), 4 (balanced), 6+ (deep comparative analysis)." + ), + ) + return parser.parse_args() + + +def main(): + args = parse_args() + + print("=" * 60) + print("AgentCore Web Search Tool — Deep Research Agent") + print("=" * 60) + print(f"Max search iterations : {args.max_iter}") + print(f"Model : {MODEL_ID}") + + # ── Ensure Gateway is configured (detect / reuse / provision) ────────── + ensure_gateway(interactive=True) + + print() + query = args.query + if not query: + query = input("Enter your research question: ").strip() + if not query: + print("No question provided. Exiting.") + return + + print(f"\nResearch question: {query}") + print("-" * 60) + print("Running iterative research loop...\n") + + mcp_client = MCPClient(create_mcp_transport) + + try: + with mcp_client: + tools = mcp_client.list_tools_sync() + print(f"Discovered {len(tools)} tool(s) from Gateway\n") + + model = BedrockModel( + model_id=MODEL_ID, + region_name=REGION, + temperature=0.5, + max_tokens=4096, + ) + agent = Agent( + model=model, + tools=tools, + system_prompt=build_system_prompt(args.max_iter), + ) + response = agent(query) + except Exception as e: + error_msg = str(e) + if "authentication" in error_msg.lower() or "401" in error_msg or "400" in error_msg: + print(f"\n❌ Authentication error: {error_msg}") + print("\n Possible causes:") + print(" • COGNITO_CLIENT_SECRET is incorrect or expired") + print(" • COGNITO_CLIENT_ID does not match the User Pool client") + print(" • COGNITO_DOMAIN is wrong") + print("\n To fix: re-run the Gateway setup or correct your environment variables.") + elif "initialization" in error_msg.lower(): + print(f"\n❌ Failed to connect to the Gateway: {error_msg}") + print("\n Possible causes:") + print(" • Invalid Cognito credentials (check COGNITO_CLIENT_SECRET)") + print(" • Gateway URL is unreachable (check AGENTCORE_GATEWAY_URL)") + print(" • Gateway is not in READY state") + print("\n To fix: verify your environment variables and Gateway status.") + else: + print(f"\n❌ Error: {error_msg}") + raise SystemExit(1) + + print("\n" + "=" * 60) + print("RESEARCH REPORT") + print("=" * 60) + print(extract_text(response)) + print("\n" + "=" * 60) + print("Deep Research Agent demo complete.") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/02-use-cases/deep-research-agent/gateway_setup.py b/02-use-cases/deep-research-agent/gateway_setup.py new file mode 100644 index 000000000..7ad94b587 --- /dev/null +++ b/02-use-cases/deep-research-agent/gateway_setup.py @@ -0,0 +1,583 @@ +""" +Gateway auto-detection and provisioning for the Deep Research Agent. + +Implements a Detect → Prompt → Auto-provision flow: + 1. Check if AGENTCORE_GATEWAY_URL is already set (use it directly) + 2. If not, scan the account for an existing Gateway with a web-search target + 3. If found, auto-configure from the existing Gateway + 4. If not found, prompt the user and create one on the fly + +This removes the hard prerequisite of running a separate setup script before +using the Deep Research Agent. + +Environment variables (all optional — auto-provisioned if missing): + AGENTCORE_GATEWAY_URL — Gateway MCP endpoint + COGNITO_DOMAIN — Cognito domain prefix + COGNITO_CLIENT_ID — Cognito app client ID + COGNITO_CLIENT_SECRET — Cognito app client secret + COGNITO_SCOPE — OAuth scope string + AWS_DEFAULT_REGION — AWS region (default: us-east-1) + +IAM permissions required for auto-provisioning: + iam:CreateRole, iam:PutRolePolicy, iam:GetRole + cognito-idp:CreateUserPool, cognito-idp:CreateUserPoolDomain + cognito-idp:CreateResourceServer, cognito-idp:CreateUserPoolClient + cognito-idp:ListUserPools, cognito-idp:ListUserPoolClients + cognito-idp:DescribeUserPoolClient, cognito-idp:DescribeResourceServer + bedrock-agentcore:CreateGateway, bedrock-agentcore:GetGateway + bedrock-agentcore:CreateGatewayTarget, bedrock-agentcore:ListGatewayTargets + bedrock-agentcore:ListGateways +""" + +import json +import logging +import os +import time + +import boto3 + +logger = logging.getLogger(__name__) + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") +GATEWAY_NAME_PREFIX = "deep-research" + + +# ── Data class for gateway config ────────────────────────────────────────────── + + +class GatewayConfig: + """Holds all connection details for an AgentCore Gateway with Web Search.""" + + def __init__( + self, + gateway_url: str, + cognito_domain: str, + cognito_client_id: str, + cognito_client_secret: str, + cognito_scope: str, + region: str = REGION, + gateway_id: str = "", + role_name: str = "", + user_pool_id: str = "", + ): + self.gateway_url = gateway_url + self.cognito_domain = cognito_domain + self.cognito_client_id = cognito_client_id + self.cognito_client_secret = cognito_client_secret + self.cognito_scope = cognito_scope + self.region = region + self.gateway_id = gateway_id + self.role_name = role_name + self.user_pool_id = user_pool_id + + def export_to_env(self): + """Set environment variables so downstream code can use them.""" + os.environ["AGENTCORE_GATEWAY_URL"] = self.gateway_url + os.environ["COGNITO_DOMAIN"] = self.cognito_domain + os.environ["COGNITO_CLIENT_ID"] = self.cognito_client_id + os.environ["COGNITO_CLIENT_SECRET"] = self.cognito_client_secret + os.environ["COGNITO_SCOPE"] = self.cognito_scope + os.environ["AWS_DEFAULT_REGION"] = self.region + + def print_env_vars(self): + """Print export commands for the user to save.""" + print("\n To reuse this gateway in future sessions, export these variables:\n") + print(f' export AGENTCORE_GATEWAY_URL="{self.gateway_url}"') + print(f' export COGNITO_DOMAIN="{self.cognito_domain}"') + print(f' export COGNITO_CLIENT_ID="{self.cognito_client_id}"') + print(f' export COGNITO_CLIENT_SECRET="{self.cognito_client_secret}"') + print(f' export COGNITO_SCOPE="{self.cognito_scope}"') + print(f' export AWS_DEFAULT_REGION="{self.region}"') + if self.gateway_id: + print(f"\n # Gateway ID (for cleanup): {self.gateway_id}") + if self.role_name: + print(f" # IAM Role: {self.role_name}") + if self.user_pool_id: + print(f" # Cognito Pool: {self.user_pool_id}") + + +# ── Detection: check env vars ───────────────────────────────────────────────── + + +def _config_from_env() -> GatewayConfig | None: + """Return a GatewayConfig from environment variables, or None if incomplete.""" + gateway_url = os.getenv("AGENTCORE_GATEWAY_URL", "") + cognito_domain = os.getenv("COGNITO_DOMAIN", "") + cognito_client_id = os.getenv("COGNITO_CLIENT_ID", "") + cognito_client_secret = os.getenv("COGNITO_CLIENT_SECRET", "") + cognito_scope = os.getenv("COGNITO_SCOPE", "") + + if all([gateway_url, cognito_domain, cognito_client_id, cognito_client_secret]): + return GatewayConfig( + gateway_url=gateway_url, + cognito_domain=cognito_domain, + cognito_client_id=cognito_client_id, + cognito_client_secret=cognito_client_secret, + cognito_scope=cognito_scope or "agentcore-websearch/invoke", + region=REGION, + ) + return None + + +# ── Detection: scan account for existing gateway ────────────────────────────── + + +def _find_existing_gateway() -> dict | None: + """Scan the account for an existing Gateway with a web-search connector target. + + Returns a dict with gateway_id and gateway_url if found, else None. + """ + try: + client = boto3.client("bedrock-agentcore-control", region_name=REGION) + + # List all gateways + paginator_kwargs = {} + while True: + response = client.list_gateways( + maxResults=50, **paginator_kwargs + ) + for gw in response.get("items", []): + gw_id = gw["gatewayId"] + # Check if this gateway has a web-search target + try: + targets = client.list_gateway_targets( + gatewayIdentifier=gw_id + ) + for target in targets.get("items", []): + target_name = target.get("name", "").lower() + if "web-search" in target_name or "websearch" in target_name: + # Get the full gateway details for the URL + gw_detail = client.get_gateway( + gatewayIdentifier=gw_id + ) + return { + "gateway_id": gw_id, + "gateway_url": gw_detail["gatewayUrl"], + "gateway_name": gw.get("name", ""), + } + except Exception: + continue + + next_token = response.get("nextToken") + if not next_token: + break + paginator_kwargs = {"nextToken": next_token} + + except Exception as e: + logger.debug("Could not scan for existing gateways: %s", e) + + return None + + +def _find_cognito_for_gateway(gateway_id: str) -> dict | None: + """Try to find Cognito credentials associated with a gateway. + + Looks for the standard Cognito pool/client created by our setup pattern. + Returns dict with domain, client_id, client_secret, scope or None. + """ + try: + cognito_client = boto3.client("cognito-idp", region_name=REGION) + pools = cognito_client.list_user_pools(MaxResults=60)["UserPools"] + + for pool in pools: + pool_name = pool["Name"] + # Look for pools matching our naming conventions + if "agentcore" in pool_name.lower() and "websearch" in pool_name.lower(): + pool_id = pool["Id"] + clients = cognito_client.list_user_pool_clients( + UserPoolId=pool_id, MaxResults=60 + )["UserPoolClients"] + + for client_info in clients: + if "websearch" in client_info["ClientName"].lower(): + desc = cognito_client.describe_user_pool_client( + UserPoolId=pool_id, + ClientId=client_info["ClientId"], + ) + client_detail = desc["UserPoolClient"] + domain = pool_id.replace("_", "").lower() + return { + "domain": domain, + "client_id": client_detail["ClientId"], + "client_secret": client_detail.get("ClientSecret", ""), + "scope": "agentcore-websearch/invoke", + "user_pool_id": pool_id, + } + except Exception as e: + logger.debug("Could not find Cognito credentials: %s", e) + + return None + + +# ── Provisioning ────────────────────────────────────────────────────────────── + + +def _wait_for_gateway_status(client, gateway_id, target_status="READY", max_wait=150): + """Poll gateway status until it reaches target_status.""" + for _ in range(max_wait // 5): + status = client.get_gateway(gatewayIdentifier=gateway_id)["status"] + if status == target_status: + return status + time.sleep(5) + return status + + +def _wait_for_targets_ready(client, gateway_id, max_wait=150): + """Poll until all gateway targets are READY.""" + for _ in range(max_wait // 5): + targets = client.list_gateway_targets(gatewayIdentifier=gateway_id) + if all(item["status"] == "READY" for item in targets["items"]): + return True + time.sleep(5) + return False + + +def _create_gateway_role(iam_client, role_name, account_id, region): + """Create the IAM service role for the Gateway.""" + assume_role_policy = { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": {"Service": "bedrock-agentcore.amazonaws.com"}, + "Action": "sts:AssumeRole", + "Condition": { + "StringEquals": {"aws:SourceAccount": account_id}, + "ArnLike": { + "aws:SourceArn": f"arn:aws:bedrock-agentcore:{region}:{account_id}:*" + }, + }, + } + ], + } + + try: + role_response = iam_client.create_role( + RoleName=role_name, + AssumeRolePolicyDocument=json.dumps(assume_role_policy), + ) + print(f" Created role: {role_name}") + time.sleep(10) # Wait for IAM propagation + except iam_client.exceptions.EntityAlreadyExistsException: + role_response = iam_client.get_role(RoleName=role_name) + print(f" Role already exists: {role_name}") + + role_arn = role_response["Role"]["Arn"] + + iam_client.put_role_policy( + RoleName=role_name, + PolicyName="WebSearchGatewayPolicy", + PolicyDocument=json.dumps( + { + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "InvokeGateway", + "Effect": "Allow", + "Action": "bedrock-agentcore:InvokeGateway", + "Resource": f"arn:aws:bedrock-agentcore:{region}:{account_id}:gateway/*", + }, + { + "Sid": "InvokeWebSearch", + "Effect": "Allow", + "Action": "bedrock-agentcore:InvokeWebSearch", + "Resource": f"arn:aws:bedrock-agentcore:{region}:aws:tool/web-search.v1", + }, + ], + } + ), + ) + print(" Permissions attached ✓") + return role_arn + + +def _create_cognito_resources(cognito_client, region): + """Create Cognito User Pool, resource server, and M2M client.""" + pool_name = "agentcore-websearch-pool" + resource_server_id = "agentcore-websearch" + scopes = [{"ScopeName": "invoke", "ScopeDescription": "Invoke gateway"}] + scope_names = [f"{resource_server_id}/{s['ScopeName']}" for s in scopes] + + # Find or create user pool + user_pool_id = None + for pool in cognito_client.list_user_pools(MaxResults=60)["UserPools"]: + if pool["Name"] == pool_name: + user_pool_id = pool["Id"] + break + + if user_pool_id is None: + create_resp = cognito_client.create_user_pool(PoolName=pool_name) + user_pool_id = create_resp["UserPool"]["Id"] + domain = user_pool_id.replace("_", "").lower() + cognito_client.create_user_pool_domain( + Domain=domain, UserPoolId=user_pool_id + ) + print(f" Created user pool: {user_pool_id}") + else: + print(f" User pool exists: {user_pool_id}") + + # Create resource server + try: + cognito_client.describe_resource_server( + UserPoolId=user_pool_id, Identifier=resource_server_id + ) + except cognito_client.exceptions.ResourceNotFoundException: + cognito_client.create_resource_server( + UserPoolId=user_pool_id, + Identifier=resource_server_id, + Name="WebSearch Gateway Resource Server", + Scopes=scopes, + ) + print(" Resource server ensured ✓") + + # Find or create M2M client + client_id, client_secret = None, None + for client in cognito_client.list_user_pool_clients( + UserPoolId=user_pool_id, MaxResults=60 + )["UserPoolClients"]: + if client["ClientName"] == "agentcore-websearch-client": + desc = cognito_client.describe_user_pool_client( + UserPoolId=user_pool_id, ClientId=client["ClientId"] + ) + client_id = client["ClientId"] + client_secret = desc["UserPoolClient"]["ClientSecret"] + break + + if client_id is None: + created = cognito_client.create_user_pool_client( + UserPoolId=user_pool_id, + ClientName="agentcore-websearch-client", + GenerateSecret=True, + AllowedOAuthFlows=["client_credentials"], + AllowedOAuthScopes=scope_names, + AllowedOAuthFlowsUserPoolClient=True, + SupportedIdentityProviders=["COGNITO"], + ExplicitAuthFlows=["ALLOW_REFRESH_TOKEN_AUTH"], + ) + client_id = created["UserPoolClient"]["ClientId"] + client_secret = created["UserPoolClient"]["ClientSecret"] + print(f" Created client: {client_id}") + else: + print(f" Client exists: {client_id}") + + domain = user_pool_id.replace("_", "").lower() + discovery_url = ( + f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}" + f"/.well-known/openid-configuration" + ) + scope_string = " ".join(scope_names) + + return { + "user_pool_id": user_pool_id, + "client_id": client_id, + "client_secret": client_secret, + "discovery_url": discovery_url, + "domain": domain, + "scope": scope_string, + } + + +def _create_gateway_and_target(gateway_client, name, role_arn, cognito_config): + """Create the AgentCore Gateway and Web Search target.""" + create_response = gateway_client.create_gateway( + name=name, + roleArn=role_arn, + protocolType="MCP", + protocolConfiguration={ + "mcp": {"supportedVersions": ["2025-03-26"], "searchType": "SEMANTIC"} + }, + authorizerType="CUSTOM_JWT", + authorizerConfiguration={ + "customJWTAuthorizer": { + "allowedClients": [cognito_config["client_id"]], + "discoveryUrl": cognito_config["discovery_url"], + } + }, + description="AgentCore Gateway with Web Search Tool (auto-provisioned by Deep Research Agent)", + ) + + gateway_id = create_response["gatewayId"] + gateway_url = create_response["gatewayUrl"] + print(f" Gateway ID: {gateway_id}") + print(f" Gateway URL: {gateway_url}") + + status = _wait_for_gateway_status(gateway_client, gateway_id) + print(f" Gateway status: {status}") + + # Create Web Search connector target + gateway_client.create_gateway_target( + name="web-search-tool", + gatewayIdentifier=gateway_id, + targetConfiguration={ + "mcp": { + "connector": { + "source": {"connectorId": "web-search"}, + "configurations": [ + {"name": "WebSearch", "parameterValues": {}} + ], + } + } + }, + credentialProviderConfigurations=[ + {"credentialProviderType": "GATEWAY_IAM_ROLE"} + ], + ) + + if _wait_for_targets_ready(gateway_client, gateway_id): + print(" Web Search target: READY ✓") + else: + print(" WARNING: Target did not reach READY state within timeout") + + return gateway_id, gateway_url + + +def provision_gateway(gateway_name: str | None = None) -> GatewayConfig: + """Create a new Gateway with Web Search from scratch. + + Args: + gateway_name: Optional custom name. Defaults to 'deep-research-web-search-gw'. + + Returns: + GatewayConfig with all connection details. + """ + name = gateway_name or "deep-research-web-search-gw" + region = REGION + + sts_client = boto3.client("sts", region_name=region) + account_id = sts_client.get_caller_identity()["Account"] + + print(f"\n Account: {account_id}") + print(f" Region: {region}") + + # Step 1: IAM Role + print("\n [1/4] Creating Gateway service role...") + iam_client = boto3.client("iam") + role_name = f"agentcore-{name}-role" + role_arn = _create_gateway_role(iam_client, role_name, account_id, region) + + # Step 2: Cognito + print("\n [2/4] Setting up Cognito authentication...") + cognito_client = boto3.client("cognito-idp", region_name=region) + cognito_config = _create_cognito_resources(cognito_client, region) + + # Step 3: Gateway + Target + print("\n [3/4] Creating AgentCore Gateway...") + gateway_client = boto3.client("bedrock-agentcore-control", region_name=region) + gateway_id, gateway_url = _create_gateway_and_target( + gateway_client, name, role_arn, cognito_config + ) + + print("\n [4/4] Setup complete ✓") + + return GatewayConfig( + gateway_url=gateway_url, + cognito_domain=cognito_config["domain"], + cognito_client_id=cognito_config["client_id"], + cognito_client_secret=cognito_config["client_secret"], + cognito_scope=cognito_config["scope"], + region=region, + gateway_id=gateway_id, + role_name=role_name, + user_pool_id=cognito_config["user_pool_id"], + ) + + +# ── Main entry point: Detect → Prompt → Provision ───────────────────────────── + + +def ensure_gateway(interactive: bool = True) -> GatewayConfig: + """Ensure a working Gateway + Web Search configuration is available. + + Resolution order: + 1. Environment variables already set → use them + 2. Existing Gateway with web-search target in the account → reuse it + 3. Prompt user (if interactive) → provision a new one + + Args: + interactive: If True, prompt the user before creating resources. + If False (e.g. runtime mode), raise an error instead. + + Returns: + GatewayConfig ready to use. + + Raises: + SystemExit: If no gateway is available and user declines to create one. + ValueError: If non-interactive and no gateway is available. + """ + # ── Step 1: Check environment variables ──────────────────────────────── + config = _config_from_env() + if config: + logger.info("Using gateway configuration from environment variables.") + return config + + print("\n⚙️ No gateway configuration found in environment variables.") + print(" Scanning your account for an existing Gateway with Web Search...") + + # ── Step 2: Scan for existing gateway ────────────────────────────────── + existing = _find_existing_gateway() + if existing: + print(f"\n✅ Found existing Gateway: {existing['gateway_name']} ({existing['gateway_id']})") + print(" Checking for associated Cognito credentials...") + + cognito = _find_cognito_for_gateway(existing["gateway_id"]) + if cognito: + print(" ✅ Found Cognito credentials.") + config = GatewayConfig( + gateway_url=existing["gateway_url"], + cognito_domain=cognito["domain"], + cognito_client_id=cognito["client_id"], + cognito_client_secret=cognito["client_secret"], + cognito_scope=cognito["scope"], + region=REGION, + gateway_id=existing["gateway_id"], + user_pool_id=cognito["user_pool_id"], + ) + config.export_to_env() + config.print_env_vars() + return config + else: + print(" ⚠️ Could not find Cognito credentials for this Gateway.") + print(" Will need to provision a new setup.") + + # ── Step 3: Prompt and provision ─────────────────────────────────────── + if not interactive: + raise ValueError( + "No gateway configuration available. Set AGENTCORE_GATEWAY_URL and " + "Cognito environment variables, or run in interactive mode to auto-provision." + ) + + print("\n" + "-" * 60) + print(" No usable Gateway + Web Search setup found.") + print(" I can create one for you. This will provision:") + print(" • IAM service role (bedrock-agentcore trust)") + print(" • Cognito User Pool + M2M client") + print(" • AgentCore Gateway (MCP protocol)") + print(" • Web Search connector target") + print() + print(" Region: us-east-1 (only supported region for Web Search)") + print(" Estimated time: ~60 seconds") + print("-" * 60) + + response = input("\n Create Gateway + Web Search now? [y/N]: ").strip().lower() + if response not in ("y", "yes"): + print("\n Aborted. To set up manually, you can either:") + print() + print(" Option 1 — Use the bundled setup module:") + print(" python -c \"from gateway_setup import provision_gateway; cfg = provision_gateway(); cfg.print_env_vars()\"") + print() + print(" Option 2 — Use the standalone setup script:") + print(" python ../../01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py") + print() + print(" Then export the printed environment variables and re-run the agent.") + raise SystemExit(1) + + # Optional: let user name the gateway + custom_name = input(" Gateway name [deep-research-web-search-gw]: ").strip() + + print("\n🚀 Provisioning Gateway + Web Search Tool...\n") + config = provision_gateway(gateway_name=custom_name or None) + config.export_to_env() + config.print_env_vars() + print() + + return config diff --git a/02-use-cases/deep-research-agent/requirements.txt b/02-use-cases/deep-research-agent/requirements.txt new file mode 100644 index 000000000..449dc1750 --- /dev/null +++ b/02-use-cases/deep-research-agent/requirements.txt @@ -0,0 +1,6 @@ +bedrock-agentcore>=0.2.0 +strands-agents>=0.1.8 +boto3>=1.34.0 +botocore>=1.34.0 +mcp +requests From d07fea8ffa70d2bbccea2184a18b05fbfb164b4e Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Tue, 9 Jun 2026 09:33:45 -0400 Subject: [PATCH 04/21] Adding nagagaddamu to the contributors.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 01ab0ecf5..1ae314e3a 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -22,6 +22,7 @@ - Grace Lang - Hari Tripathi - Joshua Samuel +- Naga Gaddamu(nagagaddamu) - khastation - manchandakp - madhurprash From 03663590db10022b33c09ffdc1e8698a33ad86ec Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Tue, 9 Jun 2026 11:52:26 -0400 Subject: [PATCH 05/21] security: remove hardcoded Cognito credentials from setup README --- .../03-web-search/01-setup-gateway/README.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md index 0c97c7185..9a940cdb1 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md @@ -82,16 +82,6 @@ export COGNITO_SCOPE="agentcore-websearch/invoke" export AWS_DEFAULT_REGION="us-east-1" ``` -```bash -#export AGENTCORE_GATEWAY_URL="https://naga-web-search-gw-jpeyqm6nni.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp" -#export COGNITO_DOMAIN="us-east-16ay8pbcw2" -#export COGNITO_CLIENT_ID="n0gmrlojshfmc059dck71583f" -#export COGNITO_CLIENT_SECRET="s9bt641phqs1t7bie4lvg80sah9st50f6c3ooeksf0ri6d7f5po" -#export COGNITO_SCOPE="agentcore-websearch/invoke" -#export AWS_DEFAULT_REGION="us-east-1" -``` - - Export these before running the other demos. ## IAM Permissions From f51901a19065583ee94392639cd29e325150ac6b Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Tue, 9 Jun 2026 12:32:00 -0400 Subject: [PATCH 06/21] chore: remove 03-Agent-Core-web-search workshop (to be added in separate PR) --- .../01-web-search-gateway-setup.ipynb | 603 ------------------ .../01-gateway-setup-and-raw-mcp/README.md | 61 -- .../images/.gitkeep | 0 .../requirements.txt | 4 - .../02-web-search-strands-agent.ipynb | 305 --------- .../02-web-search-with-strands/README.md | 51 -- .../images/.gitkeep | 0 .../requirements.txt | 4 - .../03-web-search-langchain-agent.ipynb | 279 -------- .../03-web-search-with-langchain/README.md | 51 -- .../images/.gitkeep | 0 .../requirements.txt | 7 - .../01-cve-scanner/01-cve-scanner.ipynb | 303 --------- .../01-cve-scanner/README.md | 62 -- .../01-cve-scanner/images/.gitkeep | 0 .../01-cve-scanner/requirements.txt | 4 - .../02-earnings-brief/02-earnings-brief.ipynb | 318 --------- .../02-earnings-brief/README.md | 63 -- .../02-earnings-brief/images/.gitkeep | 0 .../02-earnings-brief/requirements.txt | 4 - .../03-iterative-research.ipynb | 324 ---------- .../03-iterative-research/README.md | 73 --- .../03-iterative-research/images/.gitkeep | 0 .../03-iterative-research/requirements.txt | 4 - .../04-advanced-examples/README.md | 29 - .../03-Agent-Core-web-search/README.md | 127 ---- .../images/inbound-and-outbound-auth.png | Bin 19563 -> 0 bytes .../images/tutorial-architecture.png | Bin 31128 -> 0 bytes .../03-Agent-Core-web-search/requirements.txt | 8 - 29 files changed, 2684 deletions(-) delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/README.md delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/images/.gitkeep delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/requirements.txt delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/02-web-search-strands-agent.ipynb delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/README.md delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/images/.gitkeep delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/requirements.txt delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/03-web-search-langchain-agent.ipynb delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/README.md delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/images/.gitkeep delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/requirements.txt delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/README.md delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/images/.gitkeep delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/requirements.txt delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/README.md delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/images/.gitkeep delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/requirements.txt delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/03-iterative-research.ipynb delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/README.md delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/images/.gitkeep delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/requirements.txt delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/README.md delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/README.md delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/inbound-and-outbound-auth.png delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/tutorial-architecture.png delete mode 100644 06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/requirements.txt diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb deleted file mode 100644 index f6a7f293e..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb +++ /dev/null @@ -1,603 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "4015a0a7", - "metadata": {}, - "source": [ - "# AgentCore Web Search Tool — Gateway Setup and Raw MCP Calls\n", - "\n", - "## Overview\n", - "\n", - "The **Amazon Bedrock AgentCore Web Search Tool** eliminates a core limitation of AI agents: knowledge frozen at training time. This notebook creates all the infrastructure needed and verifies it with direct MCP protocol calls — no agent framework yet, just raw tool discovery and invocation.\n", - "\n", - "You will:\n", - "1. Create the IAM service role for the Gateway\n", - "2. Set up Amazon Cognito for inbound authentication\n", - "3. Create an AgentCore Gateway with MCP protocol\n", - "4. Add a Web Search Tool connector target\n", - "5. Verify with direct `tools/list` and `tools/call` MCP calls\n", - "\n", - "The environment variables printed at the end are used by notebooks 02 and 03.\n", - "\n", - "![Tutorial Architecture](../images/tutorial-architecture.png)\n", - "\n", - "### Tutorial Details\n", - "\n", - "| Information | Details |\n", - "|:------------|:--------|\n", - "| Tutorial type | Interactive (Jupyter Notebook) |\n", - "| AgentCore components | AgentCore Gateway |\n", - "| Gateway target type | Connector (`web-search`) |\n", - "| Inbound Auth IdP | Amazon Cognito (`client_credentials` flow) |\n", - "| Outbound Auth | Automatic (Gateway IAM Role) |\n", - "| Tutorial vertical | Genral Purpose - applicable in any industry |\n", - "| Example complexity | Easy |\n", - "| SDK used | boto3 |\n", - "\n", - "### Authentication Architecture\n", - "\n", - "![Inbound and Outbound Auth](../images/inbound-and-outbound-auth.png)\n", - "\n", - "- **Inbound**: Cognito validates the OAuth token your agent passes to the Gateway\n", - "- **Outbound**: The Gateway IAM role authenticates to the Web Search backend automatically" - ] - }, - { - "cell_type": "markdown", - "id": "d5fd60fd", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "- Jupyter notebook (Python kernel)\n", - "- Python 3.10+ or later\n", - "- AWS credentials - choode one \n", - " - **Account ID + Role Name** — the notebook will call `sts:AssumeRole` to get temporary credentials (recommended for cross-account or Isengard access)\n", - " - **Pre-configured credentials** — via AWS CLI profile, environment variables, or instance role\n", - "- AWS account with access to Bedrock AgentCore Gateway, Cognito, and IAM\n", - "- Access to Bedrock inference models in us-east-1\n", - "\n", - "> **Region**: The Web Search Tool connector is available in **us-east-1** only.\n", - "\n", - "### Required IAM permissions\n", - "\n", - "~~~json\n", - "{\n", - " \"Effect\": \"Allow\",\n", - " \"Action\": [\n", - " \"iam:CreateRole\", \"iam:PutRolePolicy\", \"iam:GetRole\",\n", - " \"cognito-idp:CreateUserPool\", \"cognito-idp:CreateUserPoolDomain\",\n", - " \"cognito-idp:CreateResourceServer\", \"cognito-idp:CreateUserPoolClient\",\n", - " \"cognito-idp:ListUserPools\", \"cognito-idp:ListUserPoolClients\",\n", - " \"cognito-idp:DescribeUserPoolClient\", \"cognito-idp:DescribeResourceServer\",\n", - " \"bedrock-agentcore:CreateGateway\", \"bedrock-agentcore:GetGateway\",\n", - " \"bedrock-agentcore:CreateGatewayTarget\", \"bedrock-agentcore:ListGatewayTargets\"\n", - " ],\n", - " \"Resource\": \"*\"\n", - "}\n", - "~~~" - ] - }, - { - "cell_type": "markdown", - "id": "ebf78fad", - "metadata": {}, - "source": [ - "## 1. Install Dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c228fe71", - "metadata": {}, - "outputs": [], - "source": [ - "!pip install --upgrade -r requirements.txt --quiet" - ] - }, - { - "cell_type": "markdown", - "id": "d420a08e", - "metadata": {}, - "source": [ - "## 2. Configure AWS Region and Imports" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "822151f1", - "metadata": {}, - "outputs": [], - "source": [ - "import boto3\n", - "import json\n", - "import os\n", - "import time\n", - "import requests\n", - "\n", - "# Web Search connector is only available in us-east-1\n", - "REGION = \"us-east-1\"\n", - "os.environ[\"AWS_DEFAULT_REGION\"] = REGION\n", - "\n", - "# Verify credentials\n", - "sts_client = boto3.client(\"sts\", region_name=REGION)\n", - "identity = sts_client.get_caller_identity()\n", - "ACCOUNT_ID = identity[\"Account\"]\n", - "print(f\"Account ID : {ACCOUNT_ID}\")\n", - "print(f\"Identity : {identity['Arn']}\")\n", - "print(f\"Region : {REGION}\")" - ] - }, - { - "cell_type": "markdown", - "id": "d53c4327", - "metadata": {}, - "source": [ - "## 3. Create the Gateway Service Role\n", - "\n", - "The Gateway needs an IAM role allowing the AgentCore service to perform actions on your behalf. Two permissions are required:\n", - "- `bedrock-agentcore:InvokeGateway` — invoke the Gateway itself\n", - "- `bedrock-agentcore:InvokeWebSearch` — authorize web search calls to `arn:aws:bedrock-agentcore::aws:tool/web-search.v1`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ab8c7616", - "metadata": {}, - "outputs": [], - "source": [ - "GATEWAY_NAME = \"web-search-gateway\"\n", - "GATEWAY_ROLE_NAME = f\"agentcore-{GATEWAY_NAME}-role\"\n", - "\n", - "iam_client = boto3.client(\"iam\")\n", - "\n", - "assume_role_policy = {\n", - " \"Version\": \"2012-10-17\",\n", - " \"Statement\": [{\n", - " \"Effect\": \"Allow\",\n", - " \"Principal\": {\"Service\": \"bedrock-agentcore.amazonaws.com\"},\n", - " \"Action\": \"sts:AssumeRole\",\n", - " \"Condition\": {\n", - " \"StringEquals\": {\"aws:SourceAccount\": ACCOUNT_ID},\n", - " \"ArnLike\": {\"aws:SourceArn\": f\"arn:aws:bedrock-agentcore:{REGION}:{ACCOUNT_ID}:*\"}\n", - " }\n", - " }]\n", - "}\n", - "\n", - "try:\n", - " role_resp = iam_client.create_role(\n", - " RoleName=GATEWAY_ROLE_NAME,\n", - " AssumeRolePolicyDocument=json.dumps(assume_role_policy)\n", - " )\n", - " print(f\"Created role: {GATEWAY_ROLE_NAME}\")\n", - " time.sleep(10) # Allow IAM to propagate\n", - "except iam_client.exceptions.EntityAlreadyExistsException:\n", - " role_resp = iam_client.get_role(RoleName=GATEWAY_ROLE_NAME)\n", - " print(f\"Role already exists: {GATEWAY_ROLE_NAME}\")\n", - "\n", - "GATEWAY_ROLE_ARN = role_resp[\"Role\"][\"Arn\"]\n", - "\n", - "iam_client.put_role_policy(\n", - " RoleName=GATEWAY_ROLE_NAME,\n", - " PolicyName=\"WebSearchGatewayPolicy\",\n", - " PolicyDocument=json.dumps({\n", - " \"Version\": \"2012-10-17\",\n", - " \"Statement\": [\n", - " {\n", - " \"Sid\": \"InvokeGateway\",\n", - " \"Effect\": \"Allow\",\n", - " \"Action\": \"bedrock-agentcore:InvokeGateway\",\n", - " \"Resource\": f\"arn:aws:bedrock-agentcore:{REGION}:{ACCOUNT_ID}:gateway/*\"\n", - " },\n", - " {\n", - " \"Sid\": \"InvokeWebSearch\",\n", - " \"Effect\": \"Allow\",\n", - " \"Action\": \"bedrock-agentcore:InvokeWebSearch\",\n", - " \"Resource\": f\"arn:aws:bedrock-agentcore:{REGION}:aws:tool/web-search.v1\"\n", - " }\n", - " ]\n", - " })\n", - ")\n", - "print(f\"Gateway Role ARN: {GATEWAY_ROLE_ARN}\")\n", - "print(\"Permissions attached ✓\")" - ] - }, - { - "cell_type": "markdown", - "id": "3acd6c11", - "metadata": {}, - "source": [ - "## 4. Configure Inbound Authentication with Amazon Cognito\n", - "\n", - "We create a Cognito User Pool with a machine-to-machine (M2M) client using the `client_credentials` OAuth flow. The Gateway will validate JWT tokens issued by this pool." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c74df02d", - "metadata": {}, - "outputs": [], - "source": [ - "cognito = boto3.client(\"cognito-idp\", region_name=REGION)\n", - "\n", - "USER_POOL_NAME = \"agentcore-websearch-pool\"\n", - "RESOURCE_SERVER_ID = \"agentcore-websearch\"\n", - "SCOPES = [{\"ScopeName\": \"invoke\", \"ScopeDescription\": \"Invoke gateway\"}]\n", - "SCOPE_NAMES = [f\"{RESOURCE_SERVER_ID}/{s['ScopeName']}\" for s in SCOPES]\n", - "SCOPE_STRING = \" \".join(SCOPE_NAMES)\n", - "\n", - "# Find or create user pool\n", - "USER_POOL_ID = None\n", - "for pool in cognito.list_user_pools(MaxResults=60)[\"UserPools\"]:\n", - " if pool[\"Name\"] == USER_POOL_NAME:\n", - " USER_POOL_ID = pool[\"Id\"]\n", - " break\n", - "\n", - "if USER_POOL_ID is None:\n", - " resp = cognito.create_user_pool(PoolName=USER_POOL_NAME)\n", - " USER_POOL_ID = resp[\"UserPool\"][\"Id\"]\n", - " domain = USER_POOL_ID.replace(\"_\", \"\").lower()\n", - " cognito.create_user_pool_domain(Domain=domain, UserPoolId=USER_POOL_ID)\n", - " print(f\"Created user pool: {USER_POOL_ID}\")\n", - "else:\n", - " print(f\"User pool exists: {USER_POOL_ID}\")\n", - "\n", - "# Create resource server\n", - "try:\n", - " cognito.describe_resource_server(UserPoolId=USER_POOL_ID, Identifier=RESOURCE_SERVER_ID)\n", - "except cognito.exceptions.ResourceNotFoundException:\n", - " cognito.create_resource_server(\n", - " UserPoolId=USER_POOL_ID, Identifier=RESOURCE_SERVER_ID,\n", - " Name=\"WebSearch Gateway Resource Server\", Scopes=SCOPES\n", - " )\n", - "print(\"Resource server ensured ✓\")\n", - "\n", - "# Find or create M2M client\n", - "CLIENT_ID, CLIENT_SECRET = None, None\n", - "for c in cognito.list_user_pool_clients(UserPoolId=USER_POOL_ID, MaxResults=60)[\"UserPoolClients\"]:\n", - " if c[\"ClientName\"] == \"agentcore-websearch-client\":\n", - " desc = cognito.describe_user_pool_client(UserPoolId=USER_POOL_ID, ClientId=c[\"ClientId\"])\n", - " CLIENT_ID = c[\"ClientId\"]\n", - " CLIENT_SECRET = desc[\"UserPoolClient\"][\"ClientSecret\"]\n", - " break\n", - "\n", - "if CLIENT_ID is None:\n", - " created = cognito.create_user_pool_client(\n", - " UserPoolId=USER_POOL_ID, ClientName=\"agentcore-websearch-client\",\n", - " GenerateSecret=True, AllowedOAuthFlows=[\"client_credentials\"],\n", - " AllowedOAuthScopes=SCOPE_NAMES, AllowedOAuthFlowsUserPoolClient=True,\n", - " SupportedIdentityProviders=[\"COGNITO\"],\n", - " ExplicitAuthFlows=[\"ALLOW_REFRESH_TOKEN_AUTH\"]\n", - " )\n", - " CLIENT_ID = created[\"UserPoolClient\"][\"ClientId\"]\n", - " CLIENT_SECRET = created[\"UserPoolClient\"][\"ClientSecret\"]\n", - " print(f\"Created client: {CLIENT_ID}\")\n", - "else:\n", - " print(f\"Client exists: {CLIENT_ID}\")\n", - "\n", - "COGNITO_DOMAIN = USER_POOL_ID.replace(\"_\", \"\").lower()\n", - "DISCOVERY_URL = f\"https://cognito-idp.{REGION}.amazonaws.com/{USER_POOL_ID}/.well-known/openid-configuration\"\n", - "print(f\"Discovery URL: {DISCOVERY_URL}\")" - ] - }, - { - "cell_type": "markdown", - "id": "eed44e04", - "metadata": {}, - "source": [ - "## 5. Create the AgentCore Gateway" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "542cb13c", - "metadata": {}, - "outputs": [], - "source": [ - "gateway_client = boto3.client(\"bedrock-agentcore-control\", region_name=REGION)\n", - "\n", - "create_resp = gateway_client.create_gateway(\n", - " name=GATEWAY_NAME,\n", - " roleArn=GATEWAY_ROLE_ARN,\n", - " protocolType=\"MCP\",\n", - " protocolConfiguration={\n", - " \"mcp\": {\"supportedVersions\": [\"2025-03-26\"], \"searchType\": \"SEMANTIC\"}\n", - " },\n", - " authorizerType=\"CUSTOM_JWT\",\n", - " authorizerConfiguration={\n", - " \"customJWTAuthorizer\": {\n", - " \"allowedClients\": [CLIENT_ID],\n", - " \"discoveryUrl\": DISCOVERY_URL\n", - " }\n", - " },\n", - " description=\"AgentCore Gateway with Web Search Tool\"\n", - ")\n", - "\n", - "GATEWAY_ID = create_resp[\"gatewayId\"]\n", - "GATEWAY_URL = create_resp[\"gatewayUrl\"]\n", - "print(f\"Gateway ID : {GATEWAY_ID}\")\n", - "print(f\"Gateway URL : {GATEWAY_URL}\")\n", - "\n", - "# Wait for READY\n", - "for _ in range(30):\n", - " status = gateway_client.get_gateway(gatewayIdentifier=GATEWAY_ID)[\"status\"]\n", - " if status == \"READY\":\n", - " break\n", - " time.sleep(5)\n", - "print(f\"Gateway status: {status}\")" - ] - }, - { - "cell_type": "markdown", - "id": "64b4bad3", - "metadata": {}, - "source": [ - "## 6. Add the Web Search Connector Target\n", - "\n", - "The Web Search Tool uses the `connector` target type. Specify `connectorId: \"web-search\"` and the Gateway handles schema management, endpoint resolution, and outbound auth automatically." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1e2d8208", - "metadata": {}, - "outputs": [], - "source": [ - "target_resp = gateway_client.create_gateway_target(\n", - " name=\"web-search-tool\",\n", - " gatewayIdentifier=GATEWAY_ID,\n", - " targetConfiguration={\n", - " \"mcp\": {\n", - " \"connector\": {\n", - " \"source\": {\"connectorId\": \"web-search\"},\n", - " \"configurations\": [{\"name\": \"WebSearch\", \"parameterValues\": {}}]\n", - " }\n", - " }\n", - " },\n", - " credentialProviderConfigurations=[\n", - " {\"credentialProviderType\": \"GATEWAY_IAM_ROLE\"}\n", - " ]\n", - ")\n", - "\n", - "TARGET_ID = target_resp[\"targetId\"]\n", - "print(f\"Target ID: {TARGET_ID}\")\n", - "\n", - "# Wait for target READY\n", - "for _ in range(30):\n", - " targets = gateway_client.list_gateway_targets(gatewayIdentifier=GATEWAY_ID)\n", - " statuses = [t[\"status\"] for t in targets[\"items\"]]\n", - " print(f\" Target statuses: {statuses}\")\n", - " if all(s == \"READY\" for s in statuses):\n", - " print(\"\\n✅ All targets READY\")\n", - " break\n", - " time.sleep(5)" - ] - }, - { - "cell_type": "markdown", - "id": "6c104338", - "metadata": {}, - "source": [ - "## 7. Get an OAuth Token\n", - "\n", - "Retrieve a Cognito access token using the `client_credentials` flow. This token is passed as a Bearer header on every MCP call." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dde14821", - "metadata": {}, - "outputs": [], - "source": [ - "def get_token():\n", - " \"\"\"Retrieve a fresh OAuth access token from Cognito.\"\"\"\n", - " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", - " resp = requests.post(\n", - " url,\n", - " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", - " data={\n", - " \"grant_type\": \"client_credentials\",\n", - " \"client_id\": CLIENT_ID,\n", - " \"client_secret\": CLIENT_SECRET,\n", - " \"scope\": SCOPE_STRING\n", - " }\n", - " )\n", - " resp.raise_for_status()\n", - " return resp.json()[\"access_token\"]\n", - "\n", - "# Allow time for Cognito domain propagation\n", - "print(\"Waiting for Cognito domain propagation...\")\n", - "time.sleep(15)\n", - "\n", - "token = get_token()\n", - "print(f\"Token obtained ✓ (first 20 chars: {token[:20]}...)\")" - ] - }, - { - "cell_type": "markdown", - "id": "6ba40bc7", - "metadata": {}, - "source": [ - "## 8. Verify: Raw MCP Tool Discovery (`tools/list`)\n", - "\n", - "Call the Gateway directly using MCP — no agent framework. This confirms the WebSearch tool is available and shows its input schema." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b06ea7f3", - "metadata": {}, - "outputs": [], - "source": [ - "from mcp.client.streamable_http import streamablehttp_client\n", - "from strands.tools.mcp.mcp_client import MCPClient\n", - "\n", - "\n", - "def create_transport():\n", - " return streamablehttp_client(\n", - " GATEWAY_URL,\n", - " headers={\"Authorization\": f\"Bearer {token}\"}\n", - " )\n", - "\n", - "\n", - "mcp_client = MCPClient(create_transport)\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " print(f\"Discovered {len(tools)} tool(s):\\n\")\n", - " for tool in tools:\n", - " spec = tool.tool_spec\n", - " print(f\" Name : {spec['name']}\")\n", - " print(f\" Description : {spec.get('description', 'N/A')}\")\n", - " schema = json.dumps(spec.get('inputSchema', {}), indent=4)\n", - " print(f\" Input schema: {schema[:300]}\")\n", - " print()" - ] - }, - { - "cell_type": "markdown", - "id": "6032a124", - "metadata": {}, - "source": [ - "## 9. Verify: Raw MCP Tool Invocation (`tools/call`)\n", - "\n", - "Invoke the WebSearch tool directly and inspect the structured response." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "817679e6", - "metadata": {}, - "outputs": [], - "source": [ - "TEST_QUERY = \"What is today's news around the world?\"\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " ws_tool_name = next(t.tool_name for t in tools if \"WebSearch\" in t.tool_name)\n", - "\n", - " print(f\"Invoking: {ws_tool_name}\")\n", - " print(f\"Query : {TEST_QUERY}\\n\")\n", - "\n", - " result = mcp_client.call_tool_sync(\"verify-call\", ws_tool_name, {\"query\": TEST_QUERY})\n", - "\n", - " for content in result.get(\"content\", [result] if not isinstance(result, list) else result):\n", - " if isinstance(content, dict) and \"text\" in content:\n", - " try:\n", - " parsed = json.loads(content[\"text\"])\n", - " print(json.dumps(parsed, indent=2))\n", - " except (ValueError, TypeError):\n", - " print(content[\"text\"][:2000])\n", - " else:\n", - " print(content)" - ] - }, - { - "cell_type": "markdown", - "id": "22a08536", - "metadata": {}, - "source": [ - "## 10. Save Environment Variables for Notebooks 02 and 03\n", - "\n", - "Export these before running the next notebooks." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "63754959", - "metadata": {}, - "outputs": [], - "source": [ - "print(\"# Copy and export these environment variables:\\n\")\n", - "print(f'export AGENTCORE_GATEWAY_URL=\"{GATEWAY_URL}\"')\n", - "print(f'export COGNITO_DOMAIN=\"{COGNITO_DOMAIN}\"')\n", - "print(f'export COGNITO_CLIENT_ID=\"{CLIENT_ID}\"')\n", - "print(f'export COGNITO_CLIENT_SECRET=\"{CLIENT_SECRET}\"')\n", - "print(f'export COGNITO_SCOPE=\"{SCOPE_STRING}\"')\n", - "print(f'export AWS_DEFAULT_REGION=\"{REGION}\"')\n", - "print(f'\\n# For cleanup:')\n", - "print(f'# Gateway ID : {GATEWAY_ID}')\n", - "print(f'# User Pool ID : {USER_POOL_ID}')\n", - "print(f'# IAM Role : {GATEWAY_ROLE_NAME}')" - ] - }, - { - "cell_type": "markdown", - "id": "da25e94b", - "metadata": {}, - "source": [ - "## Cleanup (Optional)\n", - "\n", - "Run this cell only when you are done with **all** tutorials in this workshop. The Gateway and Cognito pool are reused by notebooks 02 and 03." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "90d7f934", - "metadata": {}, - "outputs": [], - "source": [ - "# Uncomment to delete all resources\n", - "\n", - "# # Delete Gateway targets and Gateway\n", - "# for item in gateway_client.list_gateway_targets(gatewayIdentifier=GATEWAY_ID, maxResults=100)[\"items\"]:\n", - "# gateway_client.delete_gateway_target(gatewayIdentifier=GATEWAY_ID, targetId=item[\"targetId\"])\n", - "# print(f\"Deleted target: {item['name']}\")\n", - "# time.sleep(10)\n", - "# gateway_client.delete_gateway(gatewayIdentifier=GATEWAY_ID)\n", - "# print(f\"Deleted gateway: {GATEWAY_ID}\")\n", - "\n", - "# # Delete Cognito\n", - "# cognito.delete_user_pool_domain(Domain=COGNITO_DOMAIN, UserPoolId=USER_POOL_ID)\n", - "# cognito.delete_user_pool(UserPoolId=USER_POOL_ID)\n", - "# print(f\"Deleted user pool: {USER_POOL_ID}\")\n", - "\n", - "# # Delete IAM role\n", - "# iam_client.delete_role_policy(RoleName=GATEWAY_ROLE_NAME, PolicyName=\"WebSearchGatewayPolicy\")\n", - "# iam_client.delete_role(RoleName=GATEWAY_ROLE_NAME)\n", - "# print(f\"Deleted role: {GATEWAY_ROLE_NAME}\")\n", - "\n", - "print(\"Uncomment the lines above to delete resources.\")" - ] - }, - { - "cell_type": "markdown", - "id": "a912b8ec", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "In this notebook you:\n", - "- Created an AgentCore Gateway with MCP protocol and Cognito JWT authentication\n", - "- Added a Web Search connector target — no schema or endpoint configuration needed\n", - "- Verified the setup with raw `tools/list` and `tools/call` MCP invocations\n", - "\n", - "**Next**: Run notebook `02-web-search-strands-agent.ipynb` to use this Gateway with a Strands AI agent." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/README.md deleted file mode 100644 index 98f8bb52b..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# Web Search Tool — Gateway Setup and Raw MCP Calls - -## Overview - -In this tutorial you will learn how to: - -1. Create the IAM service role for the Gateway -2. Configure Amazon Cognito for inbound authentication -3. Create an AgentCore Gateway with MCP protocol -4. Add a Web Search Tool connector target -5. Verify the setup with direct MCP `tools/list` and `tools/call` invocations - -### Tutorial Details - -| Information | Details | -|:------------|:--------| -| Tutorial type | Interactive (Jupyter Notebook) | -| AgentCore components | AgentCore Gateway | -| Gateway target type | Connector (`web-search`) | -| Tutorial vertical | Cross-vertical | -| Example complexity | Easy | -| SDK used | boto3 | - -### Tutorial Architecture - -
- -
- -### Inbound and Outbound Authentication - -
- -
- -The Gateway uses two authentication layers: -- **Inbound**: Amazon Cognito validates the OAuth token passed by your agent -- **Outbound**: The Gateway's IAM role authenticates automatically to the Web Search backend — no additional credentials needed - -## Notebook - -→ [`01-web-search-gateway-setup.ipynb`](01-web-search-gateway-setup.ipynb) - -## Prerequisites - -- AWS account allowlisted for the Web Search Tool private beta -- Python 3.10+ and Jupyter -- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions - -```bash -pip install -r requirements.txt -``` - -> **Region**: The Web Search Tool connector is currently available in **us-east-1** only. - -## What You'll Build - -After completing this tutorial you'll have: -- An AgentCore Gateway with MCP protocol -- A Web Search connector target in READY state -- Environment variables ready for tutorials 02 and 03 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/images/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/requirements.txt deleted file mode 100644 index 1d8cae582..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/01-gateway-setup-and-raw-mcp/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -boto3 -mcp -requests -strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/02-web-search-strands-agent.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/02-web-search-strands-agent.ipynb deleted file mode 100644 index 13093a9c0..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/02-web-search-strands-agent.ipynb +++ /dev/null @@ -1,305 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Web Search Tool with Strands Agent\n", - "\n", - "## Overview\n", - "\n", - "This notebook connects a Strands AI agent to the AgentCore Gateway created in notebook 01. The agent automatically discovers the Web Search tool via MCP `tools/list`, then invokes it when answering questions that require current information.\n", - "\n", - "You will:\n", - "1. Connect to the Gateway using MCP Streamable HTTP transport\n", - "2. Discover the WebSearch tool at runtime\n", - "3. Create a Strands agent and ask real-time questions\n", - "4. Inspect the agent's tool calls and grounded responses\n", - "\n", - "### Tutorial Details\n", - "\n", - "| Information | Details |\n", - "|:------------|:--------|\n", - "| Tutorial type | Interactive (Jupyter Notebook) |\n", - "| AgentCore components | AgentCore Gateway |\n", - "| Agentic framework | Strands Agents |\n", - "| LLM model | Anthropic Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) |\n", - "| Tutorial vertical | Cross-vertical |\n", - "| Example complexity | Easy |\n", - "| SDK used | boto3, strands-agents |\n", - "\n", - "### How It Works\n", - "\n", - "```\n", - "User question\n", - " │\n", - " ▼\n", - "Strands Agent (Claude Sonnet 4)\n", - " │ decides to call WebSearch\n", - " ▼\n", - "MCP tools/call → AgentCore Gateway → Web Search Backend\n", - " │\n", - " ▼\n", - "Structured results { text, url, title, publishedDate }\n", - " │\n", - " ▼\n", - "Final answer with cited sources\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "\n", - "Complete notebook `01-web-search-gateway-setup.ipynb` first and set the following environment variables:\n", - "\n", - "```bash\n", - "export AGENTCORE_GATEWAY_URL=\"...\"\n", - "export COGNITO_DOMAIN=\"...\"\n", - "export COGNITO_CLIENT_ID=\"...\"\n", - "export COGNITO_CLIENT_SECRET=\"...\"\n", - "export COGNITO_SCOPE=\"agentcore-websearch/invoke\"\n", - "export AWS_DEFAULT_REGION=\"us-east-1\"\n", - "```\n", - "\n", - "### Required IAM permissions\n", - "\n", - "~~~json\n", - "{\n", - " \"Effect\": \"Allow\",\n", - " \"Action\": \"bedrock:InvokeModel\",\n", - " \"Resource\": \"*\"\n", - "}\n", - "~~~" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Install Dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install --upgrade -r requirements.txt --quiet" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Configuration" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import requests\n", - "from mcp.client.streamable_http import streamablehttp_client\n", - "from strands import Agent\n", - "from strands.models import BedrockModel\n", - "from strands.tools.mcp.mcp_client import MCPClient\n", - "\n", - "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", - "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", - "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", - "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", - "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", - "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", - "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", - "\n", - "print(f\"Gateway URL : {GATEWAY_URL}\")\n", - "print(f\"Region : {REGION}\")\n", - "print(f\"Model : {MODEL_ID}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Create OAuth Token and MCP Transport" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_token():\n", - " \"\"\"Retrieve a fresh OAuth access token from Cognito.\"\"\"\n", - " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", - " resp = requests.post(\n", - " url,\n", - " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", - " data={\n", - " \"grant_type\": \"client_credentials\",\n", - " \"client_id\": CLIENT_ID,\n", - " \"client_secret\": CLIENT_SECRET,\n", - " \"scope\": SCOPE_STRING\n", - " }\n", - " )\n", - " resp.raise_for_status()\n", - " return resp.json()[\"access_token\"]\n", - "\n", - "\n", - "def create_transport():\n", - " \"\"\"Create a fresh MCP Streamable HTTP transport with a valid token.\"\"\"\n", - " token = get_token()\n", - " return streamablehttp_client(\n", - " GATEWAY_URL,\n", - " headers={\"Authorization\": f\"Bearer {token}\"}\n", - " )\n", - "\n", - "\n", - "mcp_client = MCPClient(create_transport)\n", - "print(\"MCP client created ✓\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 4. Discover Tools and Create the Agent\n", - "\n", - "The agent discovers tools dynamically at runtime via `tools/list`. Strands registers them automatically — no manual tool definitions needed." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "SYSTEM_PROMPT = \"\"\"You are a helpful research assistant with access to real-time web search.\n", - "\n", - "PRINCIPLES:\n", - "- Use WebSearch to find current information before answering\n", - "- Always cite your sources with URLs\n", - "- Keep queries concise (under 200 characters)\n", - "- Synthesize information from multiple results when possible\n", - "\"\"\"\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " print(f\"Discovered {len(tools)} tool(s): {[t.tool_name for t in tools]}\")\n", - "\n", - " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.7, max_tokens=1024)\n", - " agent = Agent(model=model, tools=tools, system_prompt=SYSTEM_PROMPT)\n", - " print(f\"Agent ready with tools: {agent.tool_names}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 5. Test the Agent on a Current Events Question\n", - "\n", - "The agent will automatically invoke WebSearch and return a grounded answer." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "QUERY = \"What is today's news around the world?\"\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.7, max_tokens=1024)\n", - " agent = Agent(model=model, tools=tools, system_prompt=SYSTEM_PROMPT)\n", - "\n", - " print(f\"Query: {QUERY}\")\n", - " print(\"-\" * 60)\n", - " response = agent(QUERY)\n", - "\n", - "print(\"\\n\" + \"=\" * 60)\n", - "print(\"AGENT RESPONSE\")\n", - "print(\"=\" * 60)\n", - "if hasattr(response, \"message\"):\n", - " for block in response.message.get(\"content\", []):\n", - " if block.get(\"text\"):\n", - " print(block[\"text\"])\n", - "else:\n", - " print(str(response))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6. Try More Queries\n", - "\n", - "The WebSearch tool handles queries up to 200 characters. Here are a few more examples showing different query types." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "demo_queries = [\n", - " \"What are the latest developments in quantum computing in 2026?\",\n", - " \"What is the current price of gold?\",\n", - " \"What new AWS services were announced recently?\"\n", - "]\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.7, max_tokens=1024)\n", - " agent = Agent(model=model, tools=tools, system_prompt=SYSTEM_PROMPT)\n", - "\n", - " for query in demo_queries:\n", - " print(f\"\\n{'=' * 60}\")\n", - " print(f\"Query: {query}\")\n", - " print(\"=\" * 60)\n", - " response = agent(query)\n", - " if hasattr(response, \"message\"):\n", - " for block in response.message.get(\"content\", []):\n", - " if block.get(\"text\"):\n", - " print(block[\"text\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "In this notebook you:\n", - "- Connected a Strands agent to the AgentCore Gateway via MCP Streamable HTTP\n", - "- Discovered the WebSearch tool dynamically at runtime\n", - "- Got grounded, cited answers to real-time questions\n", - "\n", - "**Next**: Run notebook `03-web-search-langchain-agent.ipynb` for the same integration using LangChain and LangGraph." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/README.md deleted file mode 100644 index d51a409ba..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Web Search Tool with Strands Agent - -## Overview - -In this tutorial you will learn how to: - -1. Connect a Strands agent to an AgentCore Gateway via MCP Streamable HTTP -2. Discover the Web Search tool dynamically at runtime -3. Ask real-time questions — the agent invokes WebSearch automatically -4. Receive grounded responses with cited source URLs - -### Tutorial Details - -| Information | Details | -|:------------|:--------| -| Tutorial type | Interactive (Jupyter Notebook) | -| AgentCore components | AgentCore Gateway | -| Agentic framework | Strands Agents | -| LLM model | Anthropic Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) | -| Tutorial vertical | Cross-vertical | -| Example complexity | Easy | -| SDK used | boto3, strands-agents | - -### Tutorial Architecture - -``` -┌────────────┐ "What's the latest AI news?" ┌──────────────────────────┐ -│ User │ ─────────────────────────────▶ │ Strands Agent │ -│ │◀───────────────────────────── │ Claude Sonnet 4 │ -│ │ Grounded answer + citations │ │ -└────────────┘ │ tools: [WebSearch] │ - │ │ MCP tools/call │ - └───────┼──────────────────┘ - ▼ - ┌──────────────────────────┐ - │ AgentCore Gateway │ - │ Web Search Connector │ - └──────────────────────────┘ -``` - -## Notebook - -→ [`02-web-search-strands-agent.ipynb`](02-web-search-strands-agent.ipynb) - -## Prerequisites - -Complete tutorial `01-gateway-setup-and-raw-mcp` first and export the environment variables it produces. - -```bash -pip install -r requirements.txt -``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/images/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/requirements.txt deleted file mode 100644 index 1d8cae582..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/02-web-search-with-strands/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -boto3 -mcp -requests -strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/03-web-search-langchain-agent.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/03-web-search-langchain-agent.ipynb deleted file mode 100644 index 704725da1..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/03-web-search-langchain-agent.ipynb +++ /dev/null @@ -1,279 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Web Search Tool with LangChain Agent\n", - "\n", - "## Overview\n", - "\n", - "This notebook demonstrates the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore Gateway and `create_react_agent` from LangGraph for the ReAct agent loop.\n", - "\n", - "You will:\n", - "1. Connect to the Gateway using `MultiServerMCPClient` from `langchain-mcp-adapters`\n", - "2. Discover Web Search tools via MCP\n", - "3. Build a ReAct agent with `ChatBedrockConverse`\n", - "4. Run web-grounded Q&A\n", - "\n", - "### Tutorial Details\n", - "\n", - "| Information | Details |\n", - "|:------------|:--------|\n", - "| Tutorial type | Interactive (Jupyter Notebook) |\n", - "| AgentCore components | AgentCore Gateway |\n", - "| Agentic framework | LangChain + LangGraph |\n", - "| LLM model | Anthropic Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) |\n", - "| Tutorial vertical | Cross-vertical |\n", - "| Example complexity | Easy |\n", - "| SDK used | boto3, langchain-aws, langchain-mcp-adapters |\n", - "\n", - "### How It Works\n", - "\n", - "```\n", - "User question\n", - " │\n", - " ▼\n", - "LangGraph ReAct Agent (ChatBedrockConverse)\n", - " │ calls WebSearch tool\n", - " ▼\n", - "MultiServerMCPClient → AgentCore Gateway → Web Search Backend\n", - " │\n", - " ▼\n", - "Structured results → Final answer with citations\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "\n", - "Complete notebook `01-web-search-gateway-setup.ipynb` first and set the environment variables it prints.\n", - "\n", - "### Required IAM permissions\n", - "\n", - "~~~json\n", - "{\n", - " \"Effect\": \"Allow\",\n", - " \"Action\": \"bedrock:InvokeModel\",\n", - " \"Resource\": \"*\"\n", - "}\n", - "~~~" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Install Dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install --upgrade -r requirements.txt --quiet" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Configuration" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import asyncio\n", - "import os\n", - "import requests\n", - "\n", - "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", - "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", - "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", - "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", - "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", - "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", - "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", - "\n", - "print(f\"Gateway URL : {GATEWAY_URL}\")\n", - "print(f\"Region : {REGION}\")\n", - "print(f\"Model : {MODEL_ID}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Token Helper" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_token():\n", - " \"\"\"Retrieve a fresh OAuth access token from Cognito.\"\"\"\n", - " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", - " resp = requests.post(\n", - " url,\n", - " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", - " data={\n", - " \"grant_type\": \"client_credentials\",\n", - " \"client_id\": CLIENT_ID,\n", - " \"client_secret\": CLIENT_SECRET,\n", - " \"scope\": SCOPE_STRING\n", - " }\n", - " )\n", - " resp.raise_for_status()\n", - " return resp.json()[\"access_token\"]\n", - "\n", - "token = get_token()\n", - "print(\"Token obtained ✓\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 4. Create LangChain Agent with MCP Tools\n", - "\n", - "`MultiServerMCPClient` connects to one or more MCP servers and converts their tools into LangChain-compatible tool objects. `create_react_agent` builds a LangGraph ReAct agent with those tools." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_aws import ChatBedrockConverse\n", - "from langchain_mcp_adapters.client import MultiServerMCPClient\n", - "from langgraph.prebuilt import create_react_agent\n", - "\n", - "\n", - "async def run_agent(query: str) -> str:\n", - " \"\"\"Run the LangChain agent with a web search query.\"\"\"\n", - " model = ChatBedrockConverse(\n", - " model=MODEL_ID,\n", - " region_name=REGION,\n", - " temperature=0.7,\n", - " max_tokens=1024\n", - " )\n", - "\n", - " async with MultiServerMCPClient({\n", - " \"web-search\": {\n", - " \"transport\": \"streamable_http\",\n", - " \"url\": GATEWAY_URL,\n", - " \"headers\": {\"Authorization\": f\"Bearer {get_token()}\"}\n", - " }\n", - " }) as client:\n", - " tools = client.get_tools()\n", - " print(f\"Discovered {len(tools)} tool(s): {[t.name for t in tools]}\")\n", - "\n", - " agent = create_react_agent(model, tools=tools)\n", - " result = await agent.ainvoke({\n", - " \"messages\": [{\"role\": \"user\", \"content\": query}]\n", - " })\n", - "\n", - " final_message = result[\"messages\"][-1]\n", - " return final_message.content if hasattr(final_message, \"content\") else str(final_message)\n", - "\n", - "\n", - "print(\"Agent function defined ✓\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 5. Ask a Real-Time Question" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "QUERY = \"What is today's news around the world?\"\n", - "\n", - "print(f\"Query: {QUERY}\")\n", - "print(\"-\" * 60)\n", - "\n", - "answer = await run_agent(QUERY)\n", - "\n", - "print(\"\\n\" + \"=\" * 60)\n", - "print(\"LANGCHAIN AGENT RESPONSE\")\n", - "print(\"=\" * 60)\n", - "print(answer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6. Try More Queries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "demo_queries = [\n", - " \"What are the latest AI model releases in 2026?\",\n", - " \"What is the current EUR/USD exchange rate?\",\n", - " \"What new features were announced in Python 3.14?\"\n", - "]\n", - "\n", - "for query in demo_queries:\n", - " print(f\"\\n{'=' * 60}\")\n", - " print(f\"Query: {query}\")\n", - " print(\"=\" * 60)\n", - " answer = await run_agent(query)\n", - " print(answer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "In this notebook you:\n", - "- Used `langchain-mcp-adapters` to connect to the AgentCore Gateway\n", - "- Built a LangGraph ReAct agent with `ChatBedrockConverse`\n", - "- Got grounded, cited answers using the same Gateway from notebook 01\n", - "\n", - "The Gateway is framework-agnostic — Strands, LangChain, or any MCP client works the same way.\n", - "\n", - "**Next**: Explore the advanced examples in `04-advanced-examples/` for multi-turn search patterns." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/README.md deleted file mode 100644 index 3ce70c848..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Web Search Tool with LangChain Agent - -## Overview - -In this tutorial you will learn how to: - -1. Connect a LangChain agent to an AgentCore Gateway using `langchain-mcp-adapters` -2. Discover Web Search tools via the MCP protocol -3. Build a ReAct agent with `ChatBedrockConverse` and LangGraph -4. Run web-grounded Q&A with the same Gateway set up in tutorial 01 - -### Tutorial Details - -| Information | Details | -|:------------|:--------| -| Tutorial type | Interactive (Jupyter Notebook) | -| AgentCore components | AgentCore Gateway | -| Agentic framework | LangChain + LangGraph | -| LLM model | Anthropic Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) | -| Tutorial vertical | Cross-vertical | -| Example complexity | Easy | -| SDK used | boto3, langchain-aws, langchain-mcp-adapters | - -### Tutorial Architecture - -``` -┌────────────┐ question ┌─────────────────────────────────────────┐ -│ User │ ───────────▶ │ LangGraph ReAct Agent │ -│ │◀─────────── │ ChatBedrockConverse (Claude Sonnet 4) │ -│ │ answer │ │ -└────────────┘ │ MultiServerMCPClient │ - │ │ streamable_http │ - └───────┼─────────────────────────────────┘ - ▼ - ┌──────────────────────┐ - │ AgentCore Gateway │ - │ Web Search │ - └──────────────────────┘ -``` - -## Notebook - -→ [`03-web-search-langchain-agent.ipynb`](03-web-search-langchain-agent.ipynb) - -## Prerequisites - -Complete tutorial `01-gateway-setup-and-raw-mcp` first and export the environment variables it produces. - -```bash -pip install -r requirements.txt -``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/images/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/requirements.txt deleted file mode 100644 index 9b6ebd50e..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/03-web-search-with-langchain/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -boto3 -mcp -requests -langchain -langchain-mcp-adapters -langchain-aws -langgraph diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb deleted file mode 100644 index 8c043f202..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb +++ /dev/null @@ -1,303 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# CVE Scanner — Multi-turn Security Vulnerability Search\n", - "\n", - "## Overview\n", - "\n", - "This notebook builds a security agent that scans a dependency list for recent CVEs using live web search. The agent issues one focused search per package, then synthesizes severity across all results into a prioritized remediation report.\n", - "\n", - "**Why live search is critical here**: CVE databases update daily. A newly published exploit or patch changes the risk profile of a dependency within hours — training data is always stale for this.\n", - "\n", - "### Tutorial Details\n", - "\n", - "| Information | Details |\n", - "|:------------|:--------|\n", - "| Tutorial type | Interactive (Jupyter Notebook) |\n", - "| AgentCore components | AgentCore Gateway |\n", - "| Agentic framework | Strands Agents |\n", - "| LLM model | Anthropic Claude Sonnet 4 |\n", - "| Tutorial vertical | Security / DevOps |\n", - "| Example complexity | Intermediate |\n", - "| SDK used | boto3, strands-agents |\n", - "\n", - "### Multi-turn Search Pattern\n", - "\n", - "```\n", - "Input: requirements.txt\n", - " │\n", - " ▼\n", - "Parse packages + versions\n", - " │\n", - " ▼\n", - "For each package:\n", - " Search 1: \"CVE vulnerability\"\n", - " Search 2: \" latest version security patch\"\n", - " │\n", - " ▼\n", - "Aggregate + score by CVSS severity\n", - " │\n", - " ▼\n", - "Output: Prioritized remediation report\n", - " CRITICAL requests 2.28.0 → CVE-XXXX, upgrade to 2.32.3\n", - " HIGH urllib3 1.26.5 → CVE-YYYY, upgrade to 2.2.2\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "\n", - "Complete `01-gateway-setup-and-raw-mcp` first and export the environment variables it prints.\n", - "\n", - "### Required IAM permissions\n", - "\n", - "~~~json\n", - "{\n", - " \"Effect\": \"Allow\",\n", - " \"Action\": \"bedrock:InvokeModel\",\n", - " \"Resource\": \"*\"\n", - "}\n", - "~~~" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Install Dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install --upgrade -r requirements.txt --quiet" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Configuration and Setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import requests\n", - "from mcp.client.streamable_http import streamablehttp_client\n", - "from strands import Agent\n", - "from strands.models import BedrockModel\n", - "from strands.tools.mcp.mcp_client import MCPClient\n", - "\n", - "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", - "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", - "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", - "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", - "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", - "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", - "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", - "\n", - "\n", - "def get_token():\n", - " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", - " resp = requests.post(\n", - " url,\n", - " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", - " data={\"grant_type\": \"client_credentials\", \"client_id\": CLIENT_ID,\n", - " \"client_secret\": CLIENT_SECRET, \"scope\": SCOPE_STRING}\n", - " )\n", - " resp.raise_for_status()\n", - " return resp.json()[\"access_token\"]\n", - "\n", - "\n", - "def create_transport():\n", - " return streamablehttp_client(GATEWAY_URL, headers={\"Authorization\": f\"Bearer {get_token()}\"})\n", - "\n", - "\n", - "print(\"Configuration loaded ✓\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Define the Dependency List\n", - "\n", - "This is the list of packages to scan. Update it with your actual dependencies." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Sample dependency list — replace with your actual requirements\n", - "DEPENDENCIES = [\n", - " \"requests==2.28.0\",\n", - " \"urllib3==1.26.5\",\n", - " \"cryptography==3.4.8\",\n", - " \"pillow==9.0.0\",\n", - " \"django==3.2.0\"\n", - "]\n", - "\n", - "print(f\"Packages to scan ({len(DEPENDENCIES)}):\")\n", - "for dep in DEPENDENCIES:\n", - " print(f\" {dep}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 4. CVE Scanner Agent\n", - "\n", - "The agent uses the CVE Scanner system prompt, which instructs it to search for each dependency separately and return a structured severity report." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CVE_SYSTEM_PROMPT = \"\"\"You are a security analyst agent with access to real-time web search.\n", - "\n", - "When given a list of Python dependencies, you will:\n", - "1. For each package and version, search for known CVEs and security advisories\n", - "2. Search for the latest patched version of each package\n", - "3. Assign a severity level: CRITICAL, HIGH, MEDIUM, LOW, or NONE\n", - "4. Produce a remediation report sorted by severity\n", - "\n", - "SEARCH STRATEGY:\n", - "- Use queries like \"CVE \" and \" security vulnerability 2025 2026\"\n", - "- Keep each query under 200 characters\n", - "- Search each package independently before synthesizing\n", - "\n", - "OUTPUT FORMAT:\n", - "For each package, output a row:\n", - " | == | | Upgrade to: | \n", - "\n", - "End with a summary of total findings by severity level.\n", - "\"\"\"\n", - "\n", - "mcp_client = MCPClient(create_transport)\n", - "print(\"CVE scanner agent ready ✓\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 5. Run the CVE Scan\n", - "\n", - "The agent will issue multiple searches — one per package — and synthesize a prioritized report." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dep_list = \"\\n\".join(f\" - {d}\" for d in DEPENDENCIES)\n", - "scan_prompt = f\"\"\"Scan the following Python dependencies for security vulnerabilities and CVEs.\n", - "Search for each package individually, then produce a prioritized remediation report.\n", - "\n", - "Dependencies:\n", - "{dep_list}\n", - "\"\"\"\n", - "\n", - "print(\"Starting CVE scan...\")\n", - "print(\"-\" * 60)\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.3, max_tokens=2048)\n", - " agent = Agent(model=model, tools=tools, system_prompt=CVE_SYSTEM_PROMPT)\n", - " response = agent(scan_prompt)\n", - "\n", - "print(\"\\n\" + \"=\" * 60)\n", - "print(\"CVE SCAN REPORT\")\n", - "print(\"=\" * 60)\n", - "if hasattr(response, \"message\"):\n", - " for block in response.message.get(\"content\", []):\n", - " if block.get(\"text\"):\n", - " print(block[\"text\"])\n", - "else:\n", - " print(str(response))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6. Scan a Custom requirements.txt\n", - "\n", - "Pass the content of your actual `requirements.txt` file to scan your real dependencies." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# To scan your own requirements.txt:\n", - "# with open(\"path/to/your/requirements.txt\") as f:\n", - "# requirements_content = f.read()\n", - "\n", - "# custom_prompt = f\"\"\"Scan these Python dependencies for CVEs:\\n\\n{requirements_content}\"\"\"\n", - "# with mcp_client:\n", - "# tools = mcp_client.list_tools_sync()\n", - "# model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.3, max_tokens=2048)\n", - "# agent = Agent(model=model, tools=tools, system_prompt=CVE_SYSTEM_PROMPT)\n", - "# response = agent(custom_prompt)\n", - "\n", - "print(\"Uncomment the cells above to scan your own requirements.txt\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "In this notebook you built a security scanning agent that:\n", - "- Issues one targeted search per dependency (multi-turn pattern)\n", - "- Finds CVEs that postdate any model training cutoff\n", - "- Produces a prioritized remediation report\n", - "\n", - "The key insight: **each search is informed by the dependency from the parsed list** — this is the \"search for each item\" multi-turn pattern.\n", - "\n", - "**Next**: See `02-earnings-brief.ipynb` for the chained search pattern where each result informs the next query." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/README.md deleted file mode 100644 index 72c4f815d..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# CVE Scanner — Multi-turn Security Vulnerability Search - -## Overview - -In this example you will build a security agent that scans a list of Python dependencies for known vulnerabilities using live web search. The agent issues one search per package, synthesizes severity across all results, and produces a prioritized remediation report. - -**Why live search is critical here**: CVE databases update daily. A newly published exploit or patch changes the risk profile of a dependency within hours. Training data is always stale for this. - -### Tutorial Details - -| Information | Details | -|:------------|:--------| -| Tutorial type | Interactive (Jupyter Notebook) | -| AgentCore components | AgentCore Gateway | -| Agentic framework | Strands Agents | -| LLM model | Anthropic Claude Sonnet 4 | -| Tutorial vertical | Security / DevOps | -| Example complexity | Intermediate | -| SDK used | boto3, strands-agents | - -### What the Agent Does - -``` -Input: requirements.txt contents - │ - ▼ -┌────────────────────────────────┐ -│ For each dependency: │ -│ 1. Search "CVE " │ -│ 2. Search " latest │ -│ version security patch" │ -│ 3. Extract severity + fix │ -└────────────────────────────────┘ - │ - ▼ -Output: Prioritized table - CRITICAL requests 2.28.0 → CVE-2024-XXXX, upgrade to 2.32.3 - HIGH urllib3 1.26.5 → CVE-2024-YYYY, upgrade to 2.2.2 - ... -``` - -### Multi-turn Search Pattern - -The agent runs a search loop driven by the dependency list: -1. Parse the dependency list into packages and versions -2. For each package: search for CVEs, then search for the current patched version -3. Aggregate results and score by CVSS severity -4. Generate a remediation report sorted by risk - -Each search query is informed by the package name and version from the previous parse step — this is the core multi-turn pattern. - -## Notebook - -→ [`01-cve-scanner.ipynb`](01-cve-scanner.ipynb) - -## Prerequisites - -Complete `01-gateway-setup-and-raw-mcp` and export the environment variables. - -```bash -pip install -r requirements.txt -``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/images/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/requirements.txt deleted file mode 100644 index 1d8cae582..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/01-cve-scanner/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -boto3 -mcp -requests -strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb deleted file mode 100644 index 40a08e675..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb +++ /dev/null @@ -1,318 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Earnings Brief Agent — Chained Multi-turn Research\n", - "\n", - "## Overview\n", - "\n", - "This notebook builds a financial research agent that, given a stock ticker, automatically searches for analyst estimates, recent competitor results, and sector news — then generates a structured pre-earnings call brief.\n", - "\n", - "**Why live search is critical here**: Analyst consensus, guidance revisions, and competitor earnings are filed days before the call. This information does not exist in any model's training data.\n", - "\n", - "### Tutorial Details\n", - "\n", - "| Information | Details |\n", - "|:------------|:--------|\n", - "| Tutorial type | Interactive (Jupyter Notebook) |\n", - "| AgentCore components | AgentCore Gateway |\n", - "| Agentic framework | Strands Agents |\n", - "| LLM model | Anthropic Claude Sonnet 4 |\n", - "| Tutorial vertical | Finance |\n", - "| Example complexity | Intermediate |\n", - "| SDK used | boto3, strands-agents |\n", - "\n", - "### Chained Search Pattern\n", - "\n", - "```\n", - "Input: Ticker (e.g., \"AMZN\")\n", - " │\n", - " ▼\n", - "Search 1: Analyst EPS + revenue estimates\n", - " │ results inform → what consensus expects\n", - " ▼\n", - "Search 2: Guidance revisions since last quarter\n", - " │ results inform → any surprise risk\n", - " ▼\n", - "Search 3: Top competitors' recent earnings\n", - " │ results inform → sector context\n", - " ▼\n", - "Search 4: Macro / sector news this quarter\n", - " │\n", - " ▼\n", - "Output: Structured pre-earnings brief\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "\n", - "Complete `01-gateway-setup-and-raw-mcp` first and export the environment variables it prints.\n", - "\n", - "### Required IAM permissions\n", - "\n", - "~~~json\n", - "{\n", - " \"Effect\": \"Allow\",\n", - " \"Action\": \"bedrock:InvokeModel\",\n", - " \"Resource\": \"*\"\n", - "}\n", - "~~~" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Install Dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install --upgrade -r requirements.txt --quiet" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Configuration and Setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import requests\n", - "from mcp.client.streamable_http import streamablehttp_client\n", - "from strands import Agent\n", - "from strands.models import BedrockModel\n", - "from strands.tools.mcp.mcp_client import MCPClient\n", - "\n", - "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", - "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", - "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", - "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", - "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", - "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", - "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", - "\n", - "\n", - "def get_token():\n", - " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", - " resp = requests.post(\n", - " url,\n", - " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", - " data={\"grant_type\": \"client_credentials\", \"client_id\": CLIENT_ID,\n", - " \"client_secret\": CLIENT_SECRET, \"scope\": SCOPE_STRING}\n", - " )\n", - " resp.raise_for_status()\n", - " return resp.json()[\"access_token\"]\n", - "\n", - "\n", - "def create_transport():\n", - " return streamablehttp_client(GATEWAY_URL, headers={\"Authorization\": f\"Bearer {get_token()}\"})\n", - "\n", - "\n", - "print(\"Configuration loaded ✓\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Choose a Ticker" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Change this to any US-listed company ticker\n", - "TICKER = \"AMZN\"\n", - "COMPANY_NAME = \"Amazon\" # Used in search queries for better results\n", - "\n", - "print(f\"Generating pre-earnings brief for: {TICKER} ({COMPANY_NAME})\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 4. Define the Earnings Brief Agent\n", - "\n", - "The system prompt instructs the agent to follow the four-search research sequence and produce a structured output." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "EARNINGS_SYSTEM_PROMPT = \"\"\"You are a financial research analyst with access to real-time web search.\n", - "\n", - "When given a stock ticker and company name, produce a pre-earnings call brief by:\n", - "\n", - "RESEARCH SEQUENCE (do these searches in order):\n", - "1. Search: \" earnings estimate analyst consensus Q 2026\"\n", - "2. Search: \" guidance revision outlook 2026\"\n", - "3. Search: \" competitors earnings results recent\"\n", - "4. Search: \" sector macro headwinds tailwinds 2026\"\n", - "\n", - "CRITICAL RULES:\n", - "- Keep each search query under 200 characters\n", - "- Each search informs the next — note what you learned before issuing the next query\n", - "- Cite URLs for every claim\n", - "\n", - "OUTPUT FORMAT (use markdown):\n", - "\n", - "## Pre-Earnings Brief: \n", - "\n", - "### Analyst Consensus\n", - "\n", - "\n", - "### Guidance and Surprise Risk\n", - "\n", - "\n", - "### Competitor Context\n", - "\n", - "\n", - "### Macro and Sector Factors\n", - "\n", - "\n", - "### What to Watch\n", - "<3 key metrics or statements to monitor during the call>\n", - "\n", - "### Sources\n", - "\n", - "\"\"\"\n", - "\n", - "mcp_client = MCPClient(create_transport)\n", - "print(\"Earnings brief agent ready ✓\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 5. Generate the Pre-Earnings Brief\n", - "\n", - "The agent will run 4 chained searches — each one informed by the previous result — then synthesize the brief." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "brief_prompt = f\"\"\"Generate a pre-earnings call brief for {TICKER} ({COMPANY_NAME}).\n", - "\n", - "Follow the research sequence: analyst estimates → guidance revisions → competitor context → macro factors.\n", - "Produce the full structured brief with cited sources.\n", - "\"\"\"\n", - "\n", - "print(f\"Researching {TICKER}...\")\n", - "print(\"-\" * 60)\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.5, max_tokens=3000)\n", - " agent = Agent(model=model, tools=tools, system_prompt=EARNINGS_SYSTEM_PROMPT)\n", - " response = agent(brief_prompt)\n", - "\n", - "print(\"\\n\" + \"=\" * 60)\n", - "print(f\"PRE-EARNINGS BRIEF: {TICKER}\")\n", - "print(\"=\" * 60)\n", - "if hasattr(response, \"message\"):\n", - " for block in response.message.get(\"content\", []):\n", - " if block.get(\"text\"):\n", - " print(block[\"text\"])\n", - "else:\n", - " print(str(response))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6. Try Another Ticker" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Change these to generate a brief for a different company\n", - "TICKER_2 = \"TSLA\"\n", - "COMPANY_2 = \"Tesla\"\n", - "\n", - "brief_prompt_2 = f\"\"\"Generate a pre-earnings call brief for {TICKER_2} ({COMPANY_2}).\n", - "Follow the research sequence and produce the full structured brief with cited sources.\n", - "\"\"\"\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.5, max_tokens=3000)\n", - " agent = Agent(model=model, tools=tools, system_prompt=EARNINGS_SYSTEM_PROMPT)\n", - " response = agent(brief_prompt_2)\n", - "\n", - "print(f\"\\n{'=' * 60}\")\n", - "print(f\"PRE-EARNINGS BRIEF: {TICKER_2}\")\n", - "print(\"=\" * 60)\n", - "if hasattr(response, \"message\"):\n", - " for block in response.message.get(\"content\", []):\n", - " if block.get(\"text\"):\n", - " print(block[\"text\"])\n", - "else:\n", - " print(str(response))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "In this notebook you built a financial research agent that:\n", - "- Runs 4 chained searches where each result shapes the next query\n", - "- Synthesizes analyst data, competitive context, and macro factors\n", - "- Produces a structured brief with cited sources\n", - "\n", - "The key insight: **the output of each search is used to form a better next query** — this is the chained multi-turn pattern.\n", - "\n", - "**Next**: See `03-iterative-research.ipynb` for the generalized search → reflect → search loop that underpins both this example and the CVE scanner." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/README.md deleted file mode 100644 index c7ae55b5f..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Earnings Brief Agent — Chained Multi-turn Research - -## Overview - -In this example you will build a financial research agent that, given a company ticker, automatically searches for analyst estimates, recent competitor results, and sector news — then generates a structured pre-earnings call brief. - -**Why live search is critical here**: Analyst consensus, guidance revisions, and competitor earnings are filed days before the call. This information does not exist in any model's training data. - -### Tutorial Details - -| Information | Details | -|:------------|:--------| -| Tutorial type | Interactive (Jupyter Notebook) | -| AgentCore components | AgentCore Gateway | -| Agentic framework | Strands Agents | -| LLM model | Anthropic Claude Sonnet 4 | -| Tutorial vertical | Finance | -| Example complexity | Intermediate | -| SDK used | boto3, strands-agents | - -### What the Agent Does - -``` -Input: Ticker symbol (e.g., "AMZN") + earnings date - │ - ▼ -┌─────────────────────────────────────────────┐ -│ Search 1: Analyst EPS and revenue estimates │ -│ Search 2: Guidance revisions since last Q │ -│ Search 3: Top 2 competitors' recent results │ -│ Search 4: Macro / sector news this quarter │ -└─────────────────────────────────────────────┘ - │ - ▼ -Output: Structured brief - ## Pre-Earnings Brief: AMZN — Q2 2026 - ### Analyst Consensus - ### Key Risks and Tailwinds - ### Competitor Context - ### What to Watch -``` - -### Chained Search Pattern - -Each search is informed by the results of the previous one: -1. Analyst consensus → identifies what the market expects -2. Guidance revision search → narrows to surprises vs. prior guidance -3. Competitor search → adds comparative context -4. Macro/sector search → explains external factors the model might miss - -The agent reflects after each search and decides what to look for next — this is the chained multi-turn pattern. - -## Notebook - -→ [`02-earnings-brief.ipynb`](02-earnings-brief.ipynb) - -## Prerequisites - -Complete `01-gateway-setup-and-raw-mcp` and export the environment variables. - -```bash -pip install -r requirements.txt -``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/images/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/requirements.txt deleted file mode 100644 index 1d8cae582..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/02-earnings-brief/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -boto3 -mcp -requests -strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/03-iterative-research.ipynb b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/03-iterative-research.ipynb deleted file mode 100644 index 34cf5092a..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/03-iterative-research.ipynb +++ /dev/null @@ -1,324 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Iterative Research Agent — Search → Reflect → Search Loop\n", - "\n", - "## Overview\n", - "\n", - "This notebook builds a research agent that answers complex questions through an explicit multi-turn loop: plan, search, reflect on gaps, search again — repeating until confident. This is the foundational pattern behind the CVE scanner and earnings brief examples.\n", - "\n", - "By making the loop explicit with a configurable max-iterations and confidence threshold, you can tune it for depth vs. cost.\n", - "\n", - "### Tutorial Details\n", - "\n", - "| Information | Details |\n", - "|:------------|:--------|\n", - "| Tutorial type | Interactive (Jupyter Notebook) |\n", - "| AgentCore components | AgentCore Gateway |\n", - "| Agentic framework | Strands Agents |\n", - "| LLM model | Anthropic Claude Sonnet 4 |\n", - "| Tutorial vertical | Cross-vertical |\n", - "| Example complexity | Advanced |\n", - "| SDK used | boto3, strands-agents |\n", - "\n", - "### The Research Loop\n", - "\n", - "```\n", - "Question\n", - " │\n", - " ▼\n", - "PLAN: Break into sub-questions\n", - " │\n", - " ▼\n", - "SEARCH: Execute highest-priority query ◀──────────────┐\n", - " │ │\n", - " ▼ │\n", - "REFLECT: What gaps remain? │\n", - " ├── Gaps found → refine query, iterate (max N) ────┘\n", - " └── Confident → synthesize final answer\n", - "```\n", - "\n", - "### When Single-Shot Search Isn't Enough\n", - "\n", - "Use this pattern when:\n", - "- The question requires comparing multiple sources\n", - "- Initial results reveal follow-up questions\n", - "- You need to reconcile conflicting information\n", - "- The topic has multiple dimensions that all matter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "\n", - "Complete `01-gateway-setup-and-raw-mcp` first and export the environment variables it prints.\n", - "\n", - "### Required IAM permissions\n", - "\n", - "~~~json\n", - "{\n", - " \"Effect\": \"Allow\",\n", - " \"Action\": \"bedrock:InvokeModel\",\n", - " \"Resource\": \"*\"\n", - "}\n", - "~~~" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Install Dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install --upgrade -r requirements.txt --quiet" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Configuration and Setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import requests\n", - "from mcp.client.streamable_http import streamablehttp_client\n", - "from strands import Agent\n", - "from strands.models import BedrockModel\n", - "from strands.tools.mcp.mcp_client import MCPClient\n", - "\n", - "REGION = os.environ.get(\"AWS_DEFAULT_REGION\", \"us-east-1\")\n", - "GATEWAY_URL = os.environ[\"AGENTCORE_GATEWAY_URL\"]\n", - "COGNITO_DOMAIN = os.environ[\"COGNITO_DOMAIN\"]\n", - "CLIENT_ID = os.environ[\"COGNITO_CLIENT_ID\"]\n", - "CLIENT_SECRET = os.environ[\"COGNITO_CLIENT_SECRET\"]\n", - "SCOPE_STRING = os.environ[\"COGNITO_SCOPE\"]\n", - "MODEL_ID = \"us.anthropic.claude-sonnet-4-20250514-v1:0\"\n", - "\n", - "\n", - "def get_token():\n", - " url = f\"https://{COGNITO_DOMAIN}.auth.{REGION}.amazoncognito.com/oauth2/token\"\n", - " resp = requests.post(\n", - " url,\n", - " headers={\"Content-Type\": \"application/x-www-form-urlencoded\"},\n", - " data={\"grant_type\": \"client_credentials\", \"client_id\": CLIENT_ID,\n", - " \"client_secret\": CLIENT_SECRET, \"scope\": SCOPE_STRING}\n", - " )\n", - " resp.raise_for_status()\n", - " return resp.json()[\"access_token\"]\n", - "\n", - "\n", - "def create_transport():\n", - " return streamablehttp_client(GATEWAY_URL, headers={\"Authorization\": f\"Bearer {get_token()}\"})\n", - "\n", - "\n", - "# Tunable parameters\n", - "MAX_SEARCH_ITERATIONS = 4 # Maximum number of search rounds before forcing synthesis\n", - "CONFIDENCE_THRESHOLD = 0.8 # The agent uses this conceptually — expressed in the prompt\n", - "\n", - "print(f\"Max iterations : {MAX_SEARCH_ITERATIONS}\")\n", - "print(f\"Configuration : ✓\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Define the Iterative Research Agent\n", - "\n", - "The system prompt explicitly encodes the plan → search → reflect → search loop with a stopping condition." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ITERATIVE_RESEARCH_PROMPT = f\"\"\"You are a thorough research analyst with access to real-time web search.\n", - "\n", - "RESEARCH LOOP (repeat up to {MAX_SEARCH_ITERATIONS} iterations):\n", - "\n", - "STEP 1 — PLAN:\n", - " Break the question into sub-questions. List them in priority order.\n", - " Identify what you can answer confidently vs. what requires search.\n", - "\n", - "STEP 2 — SEARCH:\n", - " Execute the highest-priority unanswered sub-question as a web search.\n", - " Keep queries under 200 characters.\n", - " After each search, note: \"Learned: . Remaining gaps: .\"\n", - "\n", - "STEP 3 — REFLECT:\n", - " Ask yourself: \"Do I have enough to answer the original question confidently?\"\n", - " - If NO and iterations remain: formulate the next search based on gaps, go to STEP 2\n", - " - If YES or iterations exhausted: go to STEP 4\n", - "\n", - "STEP 4 — SYNTHESIZE:\n", - " Write a comprehensive answer that:\n", - " - Directly addresses the original question\n", - " - Integrates findings from all search rounds\n", - " - Cites URLs for all factual claims\n", - " - Notes any remaining uncertainties\n", - "\n", - "SHOW YOUR WORK: Make the plan, search queries, and reflections visible in your response.\n", - "This helps users understand the research process and verify the results.\n", - "\"\"\"\n", - "\n", - "mcp_client = MCPClient(create_transport)\n", - "print(\"Iterative research agent ready ✓\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 4. Research a Complex Question\n", - "\n", - "This question requires multiple search angles — a single query can't answer it reliably." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "RESEARCH_QUESTION = \"\"\"\n", - "What are the key differences between Claude Sonnet 4 and GPT-4.5 for enterprise code generation use cases,\n", - "and which one has better community adoption among developers as of 2026?\n", - "\"\"\"\n", - "\n", - "print(f\"Research question: {RESEARCH_QUESTION.strip()}\")\n", - "print(\"-\" * 60)\n", - "print(\"Running iterative research loop...\")\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.5, max_tokens=3000)\n", - " agent = Agent(model=model, tools=tools, system_prompt=ITERATIVE_RESEARCH_PROMPT)\n", - " response = agent(RESEARCH_QUESTION.strip())\n", - "\n", - "print(\"\\n\" + \"=\" * 60)\n", - "print(\"RESEARCH REPORT\")\n", - "print(\"=\" * 60)\n", - "if hasattr(response, \"message\"):\n", - " for block in response.message.get(\"content\", []):\n", - " if block.get(\"text\"):\n", - " print(block[\"text\"])\n", - "else:\n", - " print(str(response))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 5. Try Questions That Require Multiple Search Angles" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "multi_angle_questions = [\n", - " \"What regulatory changes in the EU in 2026 affect AI startup compliance, and what are the key deadlines?\",\n", - " \"How has the adoption of Model Context Protocol changed agent development practices in 2025-2026?\",\n", - " \"What are the current best practices for deploying LLM agents in production, based on recent industry reports?\"\n", - "]\n", - "\n", - "# Run one example (uncomment others as needed)\n", - "selected_question = multi_angle_questions[0]\n", - "\n", - "print(f\"Question: {selected_question}\")\n", - "print(\"-\" * 60)\n", - "\n", - "with mcp_client:\n", - " tools = mcp_client.list_tools_sync()\n", - " model = BedrockModel(model_id=MODEL_ID, region_name=REGION, temperature=0.5, max_tokens=3000)\n", - " agent = Agent(model=model, tools=tools, system_prompt=ITERATIVE_RESEARCH_PROMPT)\n", - " response = agent(selected_question)\n", - "\n", - "print(\"\\n\" + \"=\" * 60)\n", - "if hasattr(response, \"message\"):\n", - " for block in response.message.get(\"content\", []):\n", - " if block.get(\"text\"):\n", - " print(block[\"text\"])\n", - "else:\n", - " print(str(response))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6. Tuning the Loop\n", - "\n", - "Adjust `MAX_SEARCH_ITERATIONS` at the top of this notebook to control depth vs. latency/cost:\n", - "\n", - "| Setting | Effect | Use when |\n", - "|:--------|:-------|:---------|\n", - "| 2 | Fast, shallow | Simple factual questions |\n", - "| 4 (default) | Balanced | Most research tasks |\n", - "| 6+ | Deep, thorough | Complex comparative analysis |\n", - "\n", - "Each additional iteration costs one WebSearch call and one LLM call." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "In this notebook you built a research agent that:\n", - "- Plans its research before searching\n", - "- Reflects after each search to identify gaps\n", - "- Issues targeted follow-up queries until confident\n", - "- Synthesizes findings with cited sources\n", - "\n", - "This is the foundational multi-turn pattern. Both the CVE scanner (search per item) and earnings brief (chained search) are specializations of this loop, tuned for their specific data structures.\n", - "\n", - "### Summary: Three Multi-turn Patterns\n", - "\n", - "| Pattern | Trigger | Example |\n", - "|:--------|:--------|:--------|\n", - "| Search per item | Fixed list of inputs | CVE scanner |\n", - "| Chained search | Each result shapes next query | Earnings brief |\n", - "| Iterative (this) | Reflect on gaps, search until confident | General deep research |" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/README.md deleted file mode 100644 index e187e650f..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# Iterative Research Agent — Search → Reflect → Search Loop - -## Overview - -In this example you will build a research agent that answers complex questions by planning its research, executing searches, reflecting on what it still doesn't know, and issuing follow-up queries — repeating until it can answer with confidence. - -This is a technique demonstration. The CVE Scanner and Earnings Brief examples both use this underlying pattern; this notebook makes it explicit and reusable. - -### Tutorial Details - -| Information | Details | -|:------------|:--------| -| Tutorial type | Interactive (Jupyter Notebook) | -| AgentCore components | AgentCore Gateway | -| Agentic framework | Strands Agents | -| LLM model | Anthropic Claude Sonnet 4 | -| Tutorial vertical | Cross-vertical | -| Example complexity | Advanced | -| SDK used | boto3, strands-agents | - -### The Research Loop - -``` -Question - │ - ▼ -┌──────────────────────────────────────────┐ -│ Plan: What do I need to know? │ -│ → Break question into sub-questions │ -└──────────────┬───────────────────────────┘ - │ - ▼ -┌──────────────────────────────────────────┐ -│ Search: Execute highest-priority query │◀──┐ -└──────────────┬───────────────────────────┘ │ - │ │ - ▼ │ -┌──────────────────────────────────────────┐ │ -│ Reflect: What gaps remain? │ │ -│ → If gaps exist: refine query, repeat ──┼───┘ -│ → If confident: synthesize │ -└──────────────┬───────────────────────────┘ - │ - ▼ - Final answer with citations -``` - -### Why This Pattern Matters - -Single-shot search works for simple factual queries. For questions that require: -- Comparing multiple sources -- Reconciling conflicting information -- Drilling into details from a high-level result - -...you need the reflect-and-refine loop. This notebook teaches that loop explicitly with configurable max iterations and a confidence threshold. - -### Example Questions - -- "What are the key differences between Claude 4 and GPT-4.5 for code generation?" -- "What regulatory changes in 2026 affect EU-based AI startups?" -- "What happened to Silicon Valley Bank and what changed in US banking regulation after?" - -## Notebook - -→ [`03-iterative-research.ipynb`](03-iterative-research.ipynb) - -## Prerequisites - -Complete `01-gateway-setup-and-raw-mcp` and export the environment variables. - -```bash -pip install -r requirements.txt -``` diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/images/.gitkeep b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/images/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/requirements.txt b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/requirements.txt deleted file mode 100644 index 1d8cae582..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -boto3 -mcp -requests -strands-agents>=0.1.8 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/README.md deleted file mode 100644 index f902c4fef..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Advanced Web Search Examples - -## Overview - -These examples go beyond single-shot search to demonstrate patterns where live web data is genuinely critical — not optional. Each example shows a realistic use case where stale training data would break the outcome. - -## Examples - -| Folder | Use Case | Key Pattern | -|:-------|:---------|:------------| -| [`01-cve-scanner/`](01-cve-scanner/) | Security vulnerability scan across a dependency list | Multi-turn: one search per package, chained reasoning | -| [`02-earnings-brief/`](02-earnings-brief/) | Pre-earnings call research brief | Multi-turn: analyst estimates → competitors → sector news → synthesis | -| [`03-iterative-research/`](03-iterative-research/) | Deep Q&A via search → reflect → search loop | Technique demo: explicit multi-turn research pattern | - -## When to Use Each Pattern - -### CVE Scanner — "search for each item in a list" -The agent receives a list of dependencies, searches for CVEs for each one, and produces a prioritized remediation report. The loop is driven by the input list, and each search result is independent. - -### Earnings Brief — "chained research where each search informs the next" -The agent starts with analyst consensus, finds gaps, searches competitors, then searches for macro context. The queries are generated dynamically — each result shapes what to search for next. - -### Iterative Research — "search until confident" -The agent explicitly plans its research, executes searches, reflects on gaps, and issues follow-up queries until it can answer with confidence. This is the foundational pattern the other two use cases build on. - -## Prerequisites - -All examples require a running AgentCore Gateway with Web Search connector target. -Complete `01-gateway-setup-and-raw-mcp` first and export the environment variables it produces. diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/README.md b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/README.md deleted file mode 100644 index 00f6d3dca..000000000 --- a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/README.md +++ /dev/null @@ -1,127 +0,0 @@ -# Amazon Bedrock AgentCore Web Search Tool - -## Overview - -Amazon Bedrock AgentCore Web Search Tool exposes live web search as a fully managed, MCP-compliant tool through AgentCore Gateway. Your agents discover and invoke it using the standard Model Context Protocol — no custom integrations, no search APIs to provision, no infrastructure to manage. - -This tutorial series covers setup, basic agent integration, and advanced multi-turn patterns where real-time web data is genuinely critical to the outcome. - -
- -
- -## How It Works - -The Web Search Tool uses the **connector** target type in AgentCore Gateway. You specify `connectorId: "web-search"` and the Gateway handles schema management, endpoint resolution, and outbound authentication automatically. - -``` -Your Agent (Strands / LangChain / any MCP client) - │ - │ OAuth Bearer token (inbound auth) - ▼ -AgentCore Gateway (MCP endpoint) - │ - │ IAM role (outbound auth — automatic) - ▼ -Web Search Backend - │ - ▼ -Structured results: { text, url, title, publishedDate } -``` - -**Inbound auth**: Amazon Cognito with `client_credentials` flow — your agent gets a token and passes it to the Gateway. - -**Outbound auth**: Fully automatic — the Gateway's IAM role authenticates to the Web Search backend. Nothing to configure. - -
- -
- -## Key Capabilities - -- **Real-time information** — live web results with titles, URLs, snippets, and publication dates -- **Zero infrastructure** — no search APIs, no hosting, no scaling configuration -- **Framework agnostic** — Strands Agents, LangChain, LangGraph, or any MCP client -- **MCP-native** — tool discovery and invocation via standard `tools/list` and `tools/call` - -## Tutorial Details - -| Information | Details | -|:------------|:--------| -| Tutorial type | Interactive (Jupyter Notebooks) | -| AgentCore components | AgentCore Gateway | -| Gateway target type | Connector (`web-search`) | -| Agentic frameworks | Strands Agents, LangChain + LangGraph | -| Inbound auth | Amazon Cognito (`client_credentials` flow) | -| Outbound auth | Automatic (Gateway IAM role) | -| LLM model | Anthropic Claude Sonnet 4 | -| Region | us-east-1 (Web Search connector availability) | -| SDK used | boto3 | - -## Tutorials Overview - -### Foundation Tutorials - -Run these in order — each tutorial builds on the previous one. - -| Tutorial | What You'll Learn | -|:---------|:-----------------| -| [01 — Gateway Setup and Raw MCP](01-gateway-setup-and-raw-mcp/) | Create IAM role, Cognito, Gateway, and Web Search target. Verify with direct MCP calls. | -| [02 — Web Search with Strands](02-web-search-with-strands/) | Full agent loop using Strands Agents and Claude Sonnet 4. | -| [03 — Web Search with LangChain](03-web-search-with-langchain/) | Same integration using LangChain + LangGraph. | - -### Advanced Examples - -These examples require the Gateway from tutorial 01. They demonstrate patterns where live web search is genuinely critical — not optional. - -| Example | Use Case | Pattern | -|:--------|:---------|:--------| -| [CVE Scanner](04-advanced-examples/01-cve-scanner/) | Scan dependencies for recent security vulnerabilities | Multi-turn: one search per package | -| [Earnings Brief](04-advanced-examples/02-earnings-brief/) | Pre-earnings call research brief for any ticker | Chained: each search informs the next | -| [Iterative Research](04-advanced-examples/03-iterative-research/) | Deep Q&A via search → reflect → search loop | Technique: explicit multi-turn pattern | - -## Prerequisites - -- AWS account allowlisted for the Web Search Tool private beta -- Python 3.10+ and Jupyter Notebook (or JupyterLab) -- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions -- Access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-20250514-v1:0`) in us-east-1 - -```bash -pip install -r requirements.txt -``` - -> **Region**: The Web Search Tool connector is currently available in **us-east-1** only. - -## Quick Start - -```bash -# Step 1: Set up Gateway (run once — reused by all other tutorials) -jupyter notebook 01-gateway-setup-and-raw-mcp/01-web-search-gateway-setup.ipynb - -# Step 2: Try with Strands -jupyter notebook 02-web-search-with-strands/02-web-search-strands-agent.ipynb - -# Step 3: Try with LangChain -jupyter notebook 03-web-search-with-langchain/03-web-search-langchain-agent.ipynb - -# Advanced: CVE Scanner -jupyter notebook 04-advanced-examples/01-cve-scanner/01-cve-scanner.ipynb - -# Advanced: Earnings Brief -jupyter notebook 04-advanced-examples/02-earnings-brief/02-earnings-brief.ipynb - -# Advanced: Iterative Research Pattern -jupyter notebook 04-advanced-examples/03-iterative-research/03-iterative-research.ipynb -``` - -## Files - -| Path | Description | -|:-----|:------------| -| `requirements.txt` | Shared Python dependencies | -| `images/` | Architecture diagrams | -| `01-gateway-setup-and-raw-mcp/` | Infrastructure setup + MCP verification | -| `02-web-search-with-strands/` | Strands agent integration | -| `03-web-search-with-langchain/` | LangChain + LangGraph integration | -| `04-advanced-examples/` | Multi-turn and real-world use cases | diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/inbound-and-outbound-auth.png b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/inbound-and-outbound-auth.png deleted file mode 100644 index c833f09a5e1594a712121aa6a0760ca83904ab54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19563 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 diff --git a/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/tutorial-architecture.png b/06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/images/tutorial-architecture.png deleted file mode 100644 index d7d044ca4ec974212f19d4e0613c01ef01750c75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31128 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.1.8 -mcp -requests -langchain -langchain-mcp-adapters -langchain-aws -langgraph From 2cb91d38a781ec73d27c7996b19837bbbdcf356e Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Tue, 9 Jun 2026 12:40:39 -0400 Subject: [PATCH 07/21] workshop read me clean up --- 06-workshops/05-AgentCore-tools/README.md | 28 +---------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/06-workshops/05-AgentCore-tools/README.md b/06-workshops/05-AgentCore-tools/README.md index cd0ee00fc..e7f322724 100644 --- a/06-workshops/05-AgentCore-tools/README.md +++ b/06-workshops/05-AgentCore-tools/README.md @@ -2,11 +2,10 @@ ## Overview Amazon Bedrock AgentCore Tools provide enterprise-grade capabilities that enhance AI agents' ability to perform complex -tasks securely and efficiently. This suite includes three tools: +tasks securely and efficiently. This suite includes tools such as: - Amazon Bedrock AgentCore Code Interpreter - Amazon Bedrock AgentCore Browser Tool -- Amazon Bedrock AgentCore Web Search Tool ## Amazon Bedrock AgentCore Code Interpreter @@ -49,32 +48,7 @@ tasks securely and efficiently. This suite includes three tools: - Large-scale data processing and monitoring - Secure code execution for AI agents in enterprise settings -## Amazon Bedrock AgentCore Web Search Tool - -### Key Features - -1. **Real-time Information Access**: Retrieve current web results with titles, URLs, snippets, and publication dates — no frozen training data. - -2. **Zero Infrastructure Management**: No search APIs to provision, no scaling to configure. Expose web search through AgentCore Gateway as a fully managed MCP connector. - -3. **Framework Agnostic**: Works with Strands Agents, LangChain, LangGraph, CrewAI, or any MCP-compatible client. - -### Benefits - -- **Grounded Responses**: Agents cite live sources rather than hallucinating outdated facts. -- **Critical for Time-Sensitive Use Cases**: CVE scanning, earnings research, regulatory monitoring — all require data that doesn't exist in training sets. -- **MCP-Native Discovery**: Agents discover and invoke the tool via standard `tools/list` and `tools/call` — no custom integration code. - -## Use Cases - -- Complex data analysis and visualization in secure environments -- Automated web interactions for form filling, data extraction, and multi-step processes -- Large-scale data processing and monitoring -- Secure code execution for AI agents in enterprise settings -- Real-time web grounding for agents that need current information - ## Tutorials Overview 1. [Amazon Bedrock AgentCore Code Interpreter](01-Agent-Core-code-interpreter) 2. [Amazon Bedrock AgentCore Browser Tool](02-Agent-Core-browser-tool) -3. [Amazon Bedrock AgentCore Web Search Tool](03-Agent-Core-web-search) From 32c52ecee46cf9d073a762cabb4568ab486542bb Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Tue, 9 Jun 2026 13:00:41 -0400 Subject: [PATCH 08/21] docs: remove web-search workshop references and add deep-research-agent to use-cases README --- 02-use-cases/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/02-use-cases/README.md b/02-use-cases/README.md index f97b0ea25..d98224370 100644 --- a/02-use-cases/README.md +++ b/02-use-cases/README.md @@ -9,6 +9,7 @@ This folder contains end-to-end applications that demonstrate how to apply Amazo * **[AWS Operations Agent](./AWS-operations-agent/)**: Intelligent AWS operations assistant with Okta authentication and comprehensive monitoring capabilities * **[Customer Support Assistant](./customer-support-assistant/)**: Production-ready customer service agent with memory, knowledge base integration, and Google OAuth * **[DB Performance Analyzer](./DB-performance-analyzer/)**: Database performance monitoring and analysis agent with PostgreSQL integration +* **[Deep Research Agent](./deep-research-agent/)**: Iterative web research agent using AgentCore Web Search Tool with auto-provisioning Gateway setup and configurable search depth * **[Device Management Agent](./device-management-agent/)**: IoT device management system with Cognito authentication and real-time monitoring * **[Enterprise Web Intelligence Agent](./enterprise-web-intelligence-agent/)**: Web research and analysis agent using browser tools for competitive intelligence * **[Farm Management Advisor](./farm-management-advisor/)**: Agricultural advisory system with plant detection, weather forecasting, and care recommendations From 7ea8c5b96467d6633fd338394cd55909e111a116 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Fri, 12 Jun 2026 15:23:22 -0400 Subject: [PATCH 09/21] security: write credentials to .env file instead of logging to stdout Resolves CodeQL finding: clear-text logging of sensitive information. Setup scripts now write credentials to .env.web-search (gitignored) instead of printing secrets to stdout. All READMEs updated to reference 'source .env.web-search' instead of manual export. --- .gitignore | 1 + .../03-web-search/01-setup-gateway/README.md | 24 +++++++++----- .../01-setup-gateway/setup_gateway.py | 31 ++++++++++++------- .../03-web-search/02-raw-mcp/README.md | 2 +- .../03-web-search/03-strands-agent/README.md | 2 +- .../04-langchain-agent/README.md | 2 +- .../03-web-search/README.md | 9 ++---- .../README.md | 3 +- 02-use-cases/deep-research-agent/README.md | 10 ++++-- .../deep-research-agent/gateway_setup.py | 28 ++++++++++------- 10 files changed, 69 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index 07f1ca5d0..18cf6029f 100644 --- a/.gitignore +++ b/.gitignore @@ -163,6 +163,7 @@ celerybeat.pid # Environments .env +.env.* .venv env/ venv/ diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md index 9a940cdb1..61774ba7f 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md @@ -71,18 +71,26 @@ python setup_gateway.py --gateway-name my-web-search-gw python setup_gateway.py --region us-east-1 ``` -After completion, the script prints environment variables to export: +After completion, the script writes credentials to a local `.env.web-search` file: ```bash -export AGENTCORE_GATEWAY_URL="https://..." -export COGNITO_DOMAIN="..." -export COGNITO_CLIENT_ID="..." -export COGNITO_CLIENT_SECRET="..." -export COGNITO_SCOPE="agentcore-websearch/invoke" -export AWS_DEFAULT_REGION="us-east-1" +source .env.web-search ``` -Export these before running the other demos. +This loads the following variables into your shell: + +```bash +AGENTCORE_GATEWAY_URL="https://..." +COGNITO_DOMAIN="..." +COGNITO_CLIENT_ID="..." +COGNITO_CLIENT_SECRET="..." +COGNITO_SCOPE="agentcore-websearch/invoke" +AWS_DEFAULT_REGION="us-east-1" +``` + +Source this file before running the other demos. + +> **⚠️ Security**: The `.env.web-search` file contains your client secret. Keep it secure and do not commit it to version control (it's already in `.gitignore`). ## IAM Permissions diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py index 3ca062cd2..dc287a505 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py @@ -7,7 +7,7 @@ 3. AgentCore Gateway with MCP protocol and JWT authorization 4. Web Search Tool connector target -After running this script, export the printed environment variables to use +After running this script, load credentials with `source .env.web-search` to use with the other demos in this folder. Prerequisites: @@ -335,16 +335,25 @@ def main(): print("\n" + "=" * 60) print("SETUP COMPLETE") print("=" * 60) - print("\nExport these environment variables to use with other demos:\n") - print(f"export AGENTCORE_GATEWAY_URL=\"{gateway_url}\"") - print(f"export COGNITO_DOMAIN=\"{cognito_config['domain']}\"") - print(f"export COGNITO_CLIENT_ID=\"{cognito_config['client_id']}\"") - print(f"export COGNITO_CLIENT_SECRET=\"{cognito_config['client_secret']}\"") - print(f"export COGNITO_SCOPE=\"{cognito_config['scope']}\"") - print(f"export AWS_DEFAULT_REGION=\"{region}\"") - print(f"\n# Gateway ID (for cleanup): {gateway_id}") - print(f"# IAM Role: {role_name}") - print(f"# Cognito Pool: {cognito_config['user_pool_id']}") + + # Write credentials to a local .env file (avoids logging secrets to stdout) + env_file = ".env.web-search" + with open(env_file, "w") as f: + f.write(f"export AGENTCORE_GATEWAY_URL=\"{gateway_url}\"\n") + f.write(f"export COGNITO_DOMAIN=\"{cognito_config['domain']}\"\n") + f.write(f"export COGNITO_CLIENT_ID=\"{cognito_config['client_id']}\"\n") + f.write(f"export COGNITO_CLIENT_SECRET=\"{cognito_config['client_secret']}\"\n") # noqa: E501 + f.write(f"export COGNITO_SCOPE=\"{cognito_config['scope']}\"\n") + f.write(f"export AWS_DEFAULT_REGION=\"{region}\"\n") + + print(f"\n✅ Credentials written to: {env_file}") + print(" Load them with: source .env.web-search\n") + print(f" Gateway URL: {gateway_url}") + print(f" Gateway ID: {gateway_id} (for cleanup)") + print(f" IAM Role: {role_name}") + print(f" Cognito Pool: {cognito_config['user_pool_id']}") + print(f"\n⚠️ Keep {env_file} secure — it contains your client secret.") + print(f" Add it to .gitignore to avoid committing it.") if __name__ == "__main__": diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md index 73182422b..49e8f4527 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md @@ -68,7 +68,7 @@ Calling the tool with a query returns structured results: pip install -r ../requirements.txt ``` -Run `01-setup-gateway/setup_gateway.py` first and export the environment variables it prints. +Run `01-setup-gateway/setup_gateway.py` first, then load credentials: `source .env.web-search` ## Usage diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md index 28060b839..86c8ba773 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md @@ -63,7 +63,7 @@ The `create_mcp_client()` function handles OAuth token retrieval and transport c pip install -r ../requirements.txt ``` -Run `01-setup-gateway/setup_gateway.py` first and export the environment variables it prints. +Run `01-setup-gateway/setup_gateway.py` first, then load credentials: `source .env.web-search` Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-6`) in us-east-1. diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md index cb69c8ef6..908e7cf0f 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md @@ -67,7 +67,7 @@ LangChain's MCP adapter uses async I/O. The demo wraps the agent call in `asynci pip install -r ../requirements.txt ``` -Run `01-setup-gateway/setup_gateway.py` first and export the environment variables it prints. +Run `01-setup-gateway/setup_gateway.py` first, then load credentials: `source .env.web-search` Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-6`) in us-east-1. diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md index ff094209a..ac1e7551b 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md @@ -108,13 +108,8 @@ pip install -r requirements.txt # Step 1: Create Gateway and Web Search target python 01-setup-gateway/setup_gateway.py -# Step 2: Export the environment variables printed by setup -export AGENTCORE_GATEWAY_URL="..." -export COGNITO_DOMAIN="..." -export COGNITO_CLIENT_ID="..." -export COGNITO_CLIENT_SECRET="..." -export COGNITO_SCOPE="agentcore-websearch/invoke" -export AWS_DEFAULT_REGION="us-east-1" +# Step 2: Load the credentials written by setup +source .env.web-search # Optional: override the default Bedrock model export BEDROCK_MODEL_ID="us.anthropic.claude-3-5-sonnet-20241022-v2:0" diff --git a/01-features/03-connect-your-agent-to-anything/README.md b/01-features/03-connect-your-agent-to-anything/README.md index 2a5db4e85..6fa5e51d9 100644 --- a/01-features/03-connect-your-agent-to-anything/README.md +++ b/01-features/03-connect-your-agent-to-anything/README.md @@ -80,7 +80,8 @@ python 02-browser/01-nova-act/getting_started.py \ # Web Search Tool pip install -r 03-web-search/requirements.txt python 03-web-search/01-setup-gateway/setup_gateway.py -# Export the printed env vars, then: +# Load the credentials written by setup: +source .env.web-search python 03-web-search/03-strands-agent/web_search_strands.py ``` diff --git a/02-use-cases/deep-research-agent/README.md b/02-use-cases/deep-research-agent/README.md index 2839b0c05..e48dd106a 100644 --- a/02-use-cases/deep-research-agent/README.md +++ b/02-use-cases/deep-research-agent/README.md @@ -147,11 +147,17 @@ On first run without environment variables, the agent will: 1. Scan your account for an existing Gateway with a Web Search target 2. If found, reuse it automatically 3. If not found, prompt you to create one (~60 seconds) -4. Print `export` commands to skip this step on future runs +4. Write credentials to `.env.web-search` for future runs ### 3. (Optional) Pre-configure environment variables -If you already have a Gateway or want to skip auto-detection: +If you already have a Gateway from a previous setup, source the credentials file: + +```bash +source .env.web-search +``` + +Or set them manually: ```bash export AGENTCORE_GATEWAY_URL="https://..." diff --git a/02-use-cases/deep-research-agent/gateway_setup.py b/02-use-cases/deep-research-agent/gateway_setup.py index 7ad94b587..1de63f7b7 100644 --- a/02-use-cases/deep-research-agent/gateway_setup.py +++ b/02-use-cases/deep-research-agent/gateway_setup.py @@ -80,20 +80,26 @@ def export_to_env(self): os.environ["AWS_DEFAULT_REGION"] = self.region def print_env_vars(self): - """Print export commands for the user to save.""" - print("\n To reuse this gateway in future sessions, export these variables:\n") - print(f' export AGENTCORE_GATEWAY_URL="{self.gateway_url}"') - print(f' export COGNITO_DOMAIN="{self.cognito_domain}"') - print(f' export COGNITO_CLIENT_ID="{self.cognito_client_id}"') - print(f' export COGNITO_CLIENT_SECRET="{self.cognito_client_secret}"') - print(f' export COGNITO_SCOPE="{self.cognito_scope}"') - print(f' export AWS_DEFAULT_REGION="{self.region}"') + """Write credentials to a local .env file and print non-sensitive info.""" + env_file = ".env.web-search" + with open(env_file, "w") as f: + f.write(f'export AGENTCORE_GATEWAY_URL="{self.gateway_url}"\n') + f.write(f'export COGNITO_DOMAIN="{self.cognito_domain}"\n') + f.write(f'export COGNITO_CLIENT_ID="{self.cognito_client_id}"\n') + f.write(f'export COGNITO_CLIENT_SECRET="{self.cognito_client_secret}"\n') + f.write(f'export COGNITO_SCOPE="{self.cognito_scope}"\n') + f.write(f'export AWS_DEFAULT_REGION="{self.region}"\n') + + print(f"\n ✅ Credentials written to: {env_file}") + print(f" Load them with: source {env_file}\n") + print(f" Gateway URL: {self.gateway_url}") if self.gateway_id: - print(f"\n # Gateway ID (for cleanup): {self.gateway_id}") + print(f" Gateway ID: {self.gateway_id} (for cleanup)") if self.role_name: - print(f" # IAM Role: {self.role_name}") + print(f" IAM Role: {self.role_name}") if self.user_pool_id: - print(f" # Cognito Pool: {self.user_pool_id}") + print(f" Cognito Pool: {self.user_pool_id}") + print(f"\n ⚠️ Keep {env_file} secure — it contains your client secret.") # ── Detection: check env vars ───────────────────────────────────────────────── From 7a5431ff8d1a3e084cc4a636d2c7ef2752502f8f Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Fri, 12 Jun 2026 16:47:45 -0400 Subject: [PATCH 10/21] fix: add request timeout and update search privacy wording - Add timeout=10 to requests.post calls (resolves CodeQL finding) - Simplify search privacy notice (remove 'licensed content' reference) --- .../03-web-search/01-setup-gateway/README.md | 2 +- .../03-web-search/02-raw-mcp/README.md | 2 +- .../03-web-search/03-strands-agent/README.md | 2 +- .../03-web-search/04-langchain-agent/README.md | 2 +- .../03-connect-your-agent-to-anything/03-web-search/README.md | 2 +- .../03-web-search/utils/gateway_auth.py | 1 + 02-use-cases/deep-research-agent/deep_research_agent.py | 1 + 7 files changed, 7 insertions(+), 5 deletions(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md index 61774ba7f..f4a035e1f 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md @@ -4,7 +4,7 @@ This script creates all the infrastructure needed to expose the Web Search Tool through an AgentCore Gateway. After running it, you'll have a fully functional MCP endpoint that any agent framework can connect to. -> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. ``` ┌──────────────────┐ ┌─────────────────────────────────────┐ diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md index 49e8f4527..964472d14 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md @@ -4,7 +4,7 @@ This demo calls the AgentCore Gateway directly over the MCP protocol — no agent framework involved. It's the simplest way to verify your Gateway and Web Search Tool target infrastructure are working correctly. -> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. ``` ┌──────────────────┐ tools/list ┌─────────────────────────────────┐ diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md index 86c8ba773..34c8cd169 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md @@ -4,7 +4,7 @@ This demo shows the complete agent integration: a Strands agent automatically discovers and invokes the Web Search Tool to answer real-time questions with cited sources. -> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. ``` ┌────────────┐ "What's the latest AI news?" ┌──────────────────────────┐ diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md index 908e7cf0f..a839beb26 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md @@ -4,7 +4,7 @@ This demo shows the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore Gateway and `create_react_agent` from LangGraph for the agent loop. -> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. ``` ┌────────────┐ "Latest AWS announcements?" ┌──────────────────────────┐ │ User │ ─────────────────────────────▶ │ LangChain Agent │ diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md index ac1e7551b..fc4923a54 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md @@ -4,7 +4,7 @@ [Amazon Bedrock AgentCore Web Search Tool](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) exposes web search as a fully managed, MCP-compliant tool through Amazon Bedrock AgentCore Gateway. Your agents discover and invoke it using the standard Model Context Protocol — no custom integrations, no infrastructure to manage. -> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained index built from open-source and licensed content providers. No queries are routed to third-party search engines or external providers. +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. ![Web Search Tool Architecture](images/tutorial-architecture.png) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py index 214b2ef0f..00e082f7c 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py @@ -69,6 +69,7 @@ def get_oauth_token( "client_secret": client_secret, "scope": scope, }, + timeout=10, ) response.raise_for_status() return response.json()["access_token"] diff --git a/02-use-cases/deep-research-agent/deep_research_agent.py b/02-use-cases/deep-research-agent/deep_research_agent.py index a8cd0a1a5..3c48102ac 100644 --- a/02-use-cases/deep-research-agent/deep_research_agent.py +++ b/02-use-cases/deep-research-agent/deep_research_agent.py @@ -103,6 +103,7 @@ def get_oauth_token() -> str: "client_secret": cognito_client_secret, "scope": cognito_scope, }, + timeout=10, ) if resp.status_code != 200: error_detail = resp.text From 9475ce923a3723fc32e4874b210f005f48240ed4 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Fri, 12 Jun 2026 17:38:48 -0400 Subject: [PATCH 11/21] Fixed recommendations from vedashreevinay --- .../03-web-search/03-strands-agent/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md index 34c8cd169..c7a90957f 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md @@ -34,7 +34,7 @@ The agent connects to the Gateway via MCP Streamable HTTP and calls `tools/list` When you ask a question: 1. Strands sends the query + tool schema to Claude Sonnet 4 -2. Claude decides to call `WebSearch` with a concise search query +2. Claude(the Strands Agent model) decides to call `WebSearch` with a concise search query 3. Strands invokes the tool via MCP `tools/call` on the Gateway 4. The Gateway routes to the Web Search connector and returns results 5. Results are fed back to Claude as a tool result From 27da7370c1608eef40a0036be2a11269d31fc2f3 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Sun, 14 Jun 2026 21:22:53 -0400 Subject: [PATCH 12/21] deep research agent use cases restructure + updated ascii workflow to architecture png --- .../03-web-search/02-raw-mcp/README.md | 10 +--- .../images/raw-mcp-call-architecture.png | Bin 0 -> 115417 bytes .../03-web-search/03-strands-agent/README.md | 18 +------ .../strands-web-search-architecture.png | Bin 0 -> 141999 bytes .../04-langchain-agent/README.md | 17 +----- .../langchain-web-search-architecture.png | Bin 0 -> 146371 bytes .../03-web-search/README.md | 13 +---- .../agentcore-web-search-architecture.png | Bin 0 -> 202864 bytes .../01-conversational-agents/README.md | 1 + .../deep-research-agent/README.md | 49 ++---------------- .../deep_research_agent.py | 0 .../deep-research-agent/gateway_setup.py | 0 .../deep-research-agent-architecture.png | Bin 0 -> 211659 bytes .../images/deep-research-loop-diagram.png | Bin 0 -> 122187 bytes .../deep-research-agent/requirements.txt | 0 02-use-cases/README.md | 1 + 16 files changed, 13 insertions(+), 96 deletions(-) create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/images/raw-mcp-call-architecture.png create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/images/strands-web-search-architecture.png create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/images/langchain-web-search-architecture.png create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/images/agentcore-web-search-architecture.png rename 02-use-cases/{ => 01-conversational-agents}/deep-research-agent/README.md (70%) rename 02-use-cases/{ => 01-conversational-agents}/deep-research-agent/deep_research_agent.py (100%) rename 02-use-cases/{ => 01-conversational-agents}/deep-research-agent/gateway_setup.py (100%) create mode 100644 02-use-cases/01-conversational-agents/deep-research-agent/images/deep-research-agent-architecture.png create mode 100644 02-use-cases/01-conversational-agents/deep-research-agent/images/deep-research-loop-diagram.png rename 02-use-cases/{ => 01-conversational-agents}/deep-research-agent/requirements.txt (100%) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md index 964472d14..a75306d3e 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md @@ -6,15 +6,7 @@ This demo calls the AgentCore Gateway directly over the MCP protocol — no agen > 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. -``` -┌──────────────────┐ tools/list ┌─────────────────────────────────┐ -│ raw_mcp_call.py │ ──────────────▶ │ AgentCore Gateway │ -│ │ │ │ -│ MCPClient │ tools/call │ Target: web-search (connector) │ -│ (Streamable │ ──────────────▶ │ │ -│ HTTP) │◀────────────── │ → WebSearch results │ -└──────────────────┘ results └─────────────────────────────────┘ -``` +![Raw MCP Client web search Architecture](images/raw-mcp-call-architecture.png) ## How It Works diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/images/raw-mcp-call-architecture.png b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/images/raw-mcp-call-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..0868daf2369936303372931095222252bedfd2fd GIT binary patch literal 115417 zcmeFZ1wd5W+CDCzfHZ>AB`w{cgrtOkfQm>-3?Typ!yrSK64Ho-AV`~}baxC5(%p!3 z_kWLq$8&Cc=iKj}IU|}xw7;v;7@4-Fc|oY1NdLY911c5=H|Wyg}@+25M;Xy$ns=n zbK`GwKn?6UERC!=44_74zn$)MQcL&^sDZVaGQ=2!9K;xY^2FRC{NEnh*x_4?Apc2& zDfD#wlh;BvXqY>mzU$XFR6+hM8Ocy3q(?Wrci~ud919q5%{N zvHx{96A1X^txoz_18e@Pn~)6}f3xPuR!wtbnAu5R9`2LpLtc;vnVXuOOf4XAa>3Hz zwDU=Wt(k!_#Qul5eiYlcbv#{7C!~)7A#R40$q(EzIE*(l8JlcvC4em?aok86M!!76ye_fTST{2omB} z5Gz1DQh+9bf74_DHaE2bdKdu@jMN6HM<6K791xu3$puSuV`JnrQYH{9*a@(Bgig;- z9sxNc^7`rEjJ$lnzjDCZe`}XBurvoFp(|-=;0Un-pe<`@_;tE(Z}-RmYe3&>Xk zovIYF>7Qfc7lhmZK`cSAuj8Bj08+ja+1metXu(rJpG?Dh+UG=XMNV!pIMFB5?;|50 z@b_R2=yL+ufBy7Hd-)q=8-dLMDeD_T;J*h`P>7wCF$k&VNa@;}nZrOD)&@pMG1&t~ z3TXQQZa*Rm5Wd{ke}FE(h9Pi;hhIomO7i=aQ)9r(DFCzqrtt(}!pI({nvR_RZ*cPG zh?Ey81f(c_kSX79WXi*T(&t2`-_L)hP|X3${d=SeEUGn9gqCo?XNV?daFN0Iv#y8i4gRWR!qTU;{%CSjxc2!t^UpPBs6;(%4#nV1S$B zlL1`mUnRR!vHT#q)236U7yOOn1cbk>+0T^RUufjPAQPmU_+2KRAL#hi&{f#2?atnOxbE?RKC-?jmI3QQV*3R&+ zu+AcKl5$dje1ETX=J}0v=J^Y?`c!3q&}!b(wtt}3yxc!it&wv4Y8<~|>(36{{)kQk z5zn8c(?C)r{WZM!bF`V~M4~^S;Ct?HiUOfuYcns;$@x#yW*F4K%GMeJ1yVz#CHfCS zg2)LFPQ5k|mrtnmR1ogiSY z;06FdPr6GYt?LOFU~K*i7r=s~xPXO}1Do5z088|D@B2>PAv*)(nEyZ;aDN{G8LIxH z5xy}NKrCfvgp?c-=79XHAy&4?=QlI3G6tJlnf^H_KaGTbG=!&Zrzk%?KZ$aA0UG72 z#{CqOn;O7C_680=mxPd&5kf`}rvb3$34in7L_!FjrnaZK%jx+~mFi!>LKs+^>z{xK z5a53!3nBO$h2;6EEX1io{)eV4rxB^fKc*qRYx5tZAtaFwNE-6h%iQ>8mi`*N35%wN967eDMY$XXd&L(Gw(2~uW%L0HOj8g~98 zEC}=cM28JCfSQ6}e-$$&1MC?|e|OA3q^IAN{2OO=>au?(GbM16Q2waazY*ncO+7Eb zoPCAWPw~e}bjI{T0KE$lQV39%RU23uLIsO?YmWll^W8^v@zH{+74m zJ&n}9tNX7vC3u0|)t`=k_8Gi{&p*aPfl2n7a2YN=Qxbhxc`qhjGvmUpUU#T z*JFG~!5_>GzG}N5BU0D6H9>|Nrw&8?8@m4_ZU0+m!E+j9oH~osO^s7s7yg;f;uIhM z*S!U>#qkTbr>LQ-^37*_t-9is1|VVw1*k*h!O3Pm^3dAO5a1mF+FJ(5Eq^2*d6BhA z-_j1i4Z)BssDKos08r1!{cS{U69^Qjd;4=h#`||bc4}n4yOdu?Bz&jI=}&PeK>4Bm zS0Yy*N#lN76p-=XlpFqSdED2M7N7(LxaGH%Pd}8-A%{8*If1P@Gl(g~$^b0;ORLnc z3!#4La}xpqs-V7BM?D0=U=AmxOTab{1aLbbxH;_J$z|lR7P1(IlNVX$ggli&t~HW^ z{Ca}a=C3DKK$RKtuJ0#5-iEyR%Y9$ZPH+6?ZX( z#K_{dnK`oR2WXZ9>H~pRWF!upoxIQKPS9!XAM(+V*7S7IPUH5!H~BxO=YEe({+6=< z4+Ti^l$Q8jBJo4n;Ez;45+nb-I1b6a0Pg{m$o){-2L*wFV!=lzb%-ZLmM1E~!Oh7n zbh@R4Ty$WLQ&ar+wBq+n|I0(%`o=eW57;0kCbp-=%>Q#u;ORJDD+9m3&p&?xKEOi# z%XNgmXe4r51i9M0-2b&2`L8MD*Sr3Ief-T{&fn3;Q-u6;IG#fIf2WWCgj@MN)Bo}i z|AqQ^5{mt6%J?^i^)K{~Up?J-{|FRqoVdh)?jOIoD8L_n^N-(d`y=}JJu&#V_(x*{ zWT1EAI*}*0fSLyo6j@jggj?L-H!;3_m+`fH?tgHh-=FW_>q37U2>qb3KOpG$Xv-gP zo`1)8a{NE*JdGfxR^~9s&)oo*k>TU#|AlA&r)>JqD8v7IOo`Bmc|VEB_>txs8F`#U zWBjMZy?-wpL-zfjKj-;hghZ!O{R=k0Po@Iw#UR$puRklOXVnD6$tVm@TszkN^i zgs=XA7v&K?;j~X-BX~kve22}?tmZt0&Hr`Y>m*t*0*cxImde}!Sxm=m0tTpq6SSN# zr2nYU^Bc)^QsxQV`=@}1|J%5K1U!5{)8-(vXJjd`{)(+D>cGkw z7=8P!9jGZpepJH!m(?=%D)qOLi6q6&=OPU9y7q0RcBADe}}q<17mHj45zB<>B5a_^t7@4+|KR6fG?? zFsh^X>m9^r&j#RqAA#i+@~S&tfEwb5@v8jXI|hJr;X>f*?9>G0zR<4+<;INV#EcDb zB}bcmTmdHM`R!HGvnpp%>ncPDSz-j&Xi(@oei{7RbA@07mmAL!KLY_z9b1HX)=M%3 zO9?+%wzsM?-{{k`sK@j7KvQ>uq3c)pcF{fPCEaa(VGJeS^~k3ZM?Tfg*u&&F+Ou%N z(8DXJ9uEW!sSzq6Cg(|MV($jWN9BpYpI zftZidElidj$t@`bGj&ef;2M@4G?bk~*V6M?x?q(6Xt2a_QIB7dO&2kNn0!g!lTG+R zVJ|=a=Fxh5)&mjNWNHFF?LFImD99h_7K z4`ttJ`}E#u>r=jj7e#7D`My>YDj`*e+n#E&LZKq?9pkV39)^4Aj+kBY2^Mqsxz%Pq;!zP zl55`6|JtypE!Qp$=NufZjC3W5THBB`#D>v3mbuVwI{SDybr!*4FOfQ{MvJ}V@TpN* zMY0jGKuLCWf~Gl2jOMWX_+s&+kaJi@j>(FtEX} zP@5>P!!ECoZKInBXN`l83pj6gJxEU54~ZM^B6%@(zOQEH?6Lom#AOZ+s`+`chK3aj zF+uP^fP`F7Q0AVo7uA*RMmY|5jQF{rG`-J$xeG#aoB_rorKVhhmLuNX-LRH=(XjeO zbXGc^^R^`HRW8Bh?h;1_ngcBr9%UFHBS|ZH_yey-$7K2s6k*n|dIPthDqMTffc(+r zcl*^XxU4MKV%)(2q|`5Kj3y&yE??|2)=O?GNVd^oaII(%aaVr4D=e$t)mbyA?KkRu z_yhq$+u4pfFHhoP23L!(r!GKSY_ojgv%H8NWK=Y#V5oI#@{u#~q{$XKS;pw`p3opX zOTe&U^)io(aHnG$Xs)o$^;|*LbHy9?_3z~zfueMLJSgwe6_Q~T$D10shJ~B7wn+`bT%z@gMUotiF%CqacXps@saj<=M?AB7%Dy5a%0u9AqSTMf1J8>V8QOPc_EG=%|}id9Y)W z1FagzwGRr{(zL@KOalJ?<*vB?JblE~plgb2Uo1yS45OUBHwMlF(IsDz$l!IT^nn zkJCux6&_4GKmM|(au_&~&Y#t4YU^l4M9yVw z?-A^8F?&!vYJDci(N=Y%R8Mjtg5zTuB?6~kJ`B~6MLwhEj6pdg)Ah_iFF%mMr zcV(&w+zLdA*OopKoA;A>DtQmlK8Uiz%N5Nbs|zIc<#9U*aPxK!o>8XA!fJ}-@X{|o zL@jq+7a`SaPY;aCAUEY1VezUv8;usaTk|Mqp>}Nu_RLBS2NqY)YWO8BIT_o8jGVrS z82wE;17;)pU4Ci}Io#R?$@_~BR0r(Hxj7JtT?L2kwaN6snw+7`xK{0Q8~^5E{^S&_BTs|tb+_-g zFIu3B+)6*2AmPELoQZ1?hZ5h+(R03OfEX(!Z{=~Fh=ph}JiD!}fSjao0*d3^b|FU&eAjeprgF>BiYS@UUNUa>%&# zvJuy->gnF3@qUue^`%RWJ6bLYYY6mIr#5?=$(O+sPc)qn0xYnsXkok5DKXEOB}d{$ zR@SR-lQSQ#F4tY7sq7}Rg;8_K4T0yeN%6iUam^h&$ICCm2D}Ofl#C;Sc3Rk{f0& z^RQmLbLEblML)69B|)nZ&*9?j`7+z}O63xLK^n<^dEe{VW{S^?YCb%i_F7mP$i*LC za=VZ}vVV4KS+z#B9Jji~UcwvVM$SM{^J?hj&3dPJ=O>7o{fZm&oJD&~C0koQoxL(0 zy%{`CNp1C{0*|t-EJi#T3pV5Gtp{CHAGDR7eY0HMV|i_L3R|pW{OLl+T&$9{UGFv7 zBgjO;ngRt%Li@d)>7`kB8rQDAcqbc@&{c*Vd9~|;amkC<9*sAWI3<<_K$f5^Y_B%Q z=%h=`%?%GyuxyrYxrP*D)^<)RfvaZmD;E5u-d!@C@F*^tN6)t$JzoZS#_nzP7CbcS zyiGLZxI8&`SZSKAwN}l%zVSSNq?!s}G=;`1`l=BpHGG0`c-cLGW1ggN(6uFS`<2at zQpZ-9MaN{|c8%FUM!nZG*lcqEcZ@zPQpfh4>(tz?rlTLT`Ng~Gdf0WnmVGjUIFtv) zR>!ryBa$zgJNWyf_KZgenezwzI#U#VC3SIRYu&A{QWgb)Sm8Q)1&>MhoFy|Q%7YI` zghn>GcV2_`5$V-vs*f-R#|ue9c#@mlHw=yvL5|>E;hE^g^zOKF1r1ZP!$u`><2a)Y z!<5DyLblHl2|@@I5oVEUeDEbYiE;@{#G^!&mizF{!n8307qrf$*~9W1VPnc@Us}ZD z#{?^jd-q+&pW(hyUD5k!EHV;iQ&7;wAv{~vT5!BdvN|haWUPnIuNHq^!=xcf^usLm zXtZNaTUuW+q?}V#wap=DD0Y!D`kGs4T$hfjNt-rHka#R+a34ueTCAzQE5(}$sxOD*Bzsip{p**;Q+f-_#5`w{14>XT zU+_v0(Fa=&ajpB#b3Z{ur{8{4LW}wSeh#&c($<&$;7`1oI-Dfr-S7O3M_A;Qr5(LV z*?A?T?ChR5ctE2tF=to}Lzocv4-YHoczaacgLzb5ieL;I>&1UcpyynMQWTg#OWY3Z zUf20pSck!9S$+5&ho&&auh}nl6g=s5$J2y~P2HD**tOY<_XP72A$;N-$&zZE6o)Ty zX?vJDl|1oJFCz<_rhIt0dw0f(ThiKOH=#B3cIAVWWw&|TnIMdK)LB*Up^z2CK(5Oy zr)bxtves5$+BysfAhA7RGVzuVIvz_>rWt@CarP7pYO0q zLmnIR)%f3&kAI~Dwp%xI*^0I<9=dm#q-CCO_URC@vxN2Q5$BI)J)|}^Suc3*z*KK4 zN_vvAzB8VzXnr*D#xF2XmRCr>GXvJ&Fz=rNCO|bzKFi2J!zxBk^``0>lj!;Le$Aes z{`>h;;kN<9!!IqkK}Th0GZn%ab9bU{Piw)XK@Q|*h-K0moxzniKW*^f?Mk*nUk4qaI#y$p+TjJ#ukG4bBoPouKV82) z$!YY+q>E{#V7RDsnoaXE|BU&-TojKJbp*RUtL+sQiW%BVT)K31Euy9KsR=vVbE~vV zHE*_k;umng9LOrErQT*0>n*1dzPIM+AslMjGjy(CZNO@*81(>N`&M9~CS+H7=Htg4 zSW3{ov4$K-uwi&Ny7MS81p!)0^}K3o_8v76|2mQ9Jq3G)mhdTs5GLCzcV?0Vsn3lb zNgM=djyjTHlW;wAc=42DFwbb}wN1fVk=4Ddhacu55@tWk@E9N2ua{;=$KqMt-$v-n z$SvpX$JIQDrYGa|>BlgC^4UYU(^@rhYi@Po058z!Rxo|ljVuv~<(dYOUeC3-8%cpuY&_|9?P$m1BkB9|zFg{O*K2d2yf|p3lZl@#xV{;o2oCl zt;MDeYSAvXO47q033YH<*9~qQ;H4KUQCQ zsPYLbUm{-s?$H>c+{2-pQM-L8UiG-#wfc2}#Kaq)0wx^s)a43o2T zMKpUdGNBw%>m-4GD6W$RSsakvGMA)k3kj5btFt21RNKL29~iBb3S*s9js~Oi$_TE* zBV+AbhdG(SJ}vCZ{*mm@T3QVYSMVy6&AaTVg=8JkSV%0J{N|W7WvqDlpHW`o&}AZ7 zktG#2Gs`QgVj?-f8OJ(d!N`34_r(--XT*Jh3Bi- zcI_<&d({@eCNf6Lq)P_`>|DF#a967%<0oRuXf6|cY~NmhWSK7O6%H=TEcfbFNJzU? zOn0J3&riR|w`PT#zVx1XokbKC_>Qv}Q^M`=eBI$Lwm5wMVyTGBaaV>+t9ZdM=f?c5 zx_qnbti_QpC7EhDxYaI|(pU0&oxcN)mt%1&-T6Sj%sGj*Lz2W0YnM6!1tRf&u+4j| zIvZSx`vvBRyMfnc(S&%WW?@(jC6^)h+Hhm?5?x{<3i1b)=irS`?lHzlmi65{!gnn7 z^gug1+csi!!OfrWqjJD?!`-!*Wkjqpk?I4Ul8#C9fXH=&hHd?cFPB={bpn|Nyu%R#)Smxk*gaU)!|;UOXF0GVn=vt%p^W{h-0bMnZP_8q+g$zm8^yx z4Ba&~ifTB1)%(s-nuidX+$+ylx_W7h9vqjw)=!HN6m<00 z1TB}zh|%~yxkQR{nbwGu0E~J;J?&LMQpLLkZe?-rZjpd|kT#2MHiQ3l9r#gdqr(gd z*;S3H3r^&Z8XFs5<(qbg(C{2Y9+3(iXb!pTw6=%lYEAO3Y`4>JZ}_n1K+n!Z75)@fC z!q(%1C(8Cs@J-CgcbDO}->H+`Vbkn1Cl58xR$=nnHccEFdoc4nGA^T6VIs$LS-do& zWPQ&+LE!qHOk4vwZ5)$$5yjH_B>s?JIfh$C@9S$;g?ho}K6$fa#jZ3DnqJe9o3=_f z$zLp)Y1U<*l_#3A3u5rs6W2mCs;-@PMTyopL_eUVE)B7AF?N~Q(T%fpxiIW2v=G|o zGqfUqsqD5E!mJ&G-&Hb@XMyx;AOW|o*p;&Z9=5lw$!0vgEB0OXktz20Xx8MERD2Lc z#$teW?d#BKeTe7hPw7vvrkgHni84B~zjb{%5XuSe&n5yXJwF!+1P4($XSDMc!<8o; zW9jusQ;6q0#*H47TvMU8>VXRhGcr<{my9($2_#`5znGxpVD`*jxgN1mXV`jhZs+~+ z8JF1{gTtcNYQyxJaa}SgMK?5{{f!bMse+*u++=GrXW5 z-bGKXl)vMwp2Q#Vx45c@CmzA8TcR7rVQ+1zGg?R#o^3NPOVUu6iSodF2M$>rYyyit#!HGfjx76s`e{)E0Ch+)3uPc85IB zc!HCabjs6+%Mo!V(SD zSq}<~`xOs(r&Mt$MN!dw0?sVY99^BR9~&Nkmvi2E|y=xw4*o>-rw`U>%hs-w)3qWOX?j*aAKMN|t26hSI9c z+8cvxmF&vP->gh+8O$;nb~G6;$@{RGns>YLLN*WN-TF=etC&_SevMCbjldYbr+J+; z{Cp;Rvt;GXF>q!7{6|obF#nC~tzvN`Ljk*{K&p z8r>DE%4f>e?v3hTRdhtoFP@YTTQ3>TdFQ_1-kI|5I^KznO}Ae6d-{&!yRRxMoa5+q zG&twlgB0eE<+N-CAHvIYJ&e|`u)Po5AS}sLU90_S1qEp zC?}<>>EiNk-H&$-3>K$wH>{lya0?@KaW?Mdvb8&^swEY3O@vR}rKg>DuWQ8*@{3Kb z%6N=-U>^N~E2I&vV7g8Q!534#jO}S#oyV?gkPp|s0J73yv3*WPlyStMDnpAu12QLUgFc`Bxx1TiH;2}91q26#YhK@+lJc4Z{i@gbqeVT?yEt$_zKgg zQPXsSmx?Fv@;p2unb)j^PH#jomF#e77h>g)9+S3~e|FUAnKpqrt@vR=o`Un9)fS8~ z#YC@PVz2ucZM#{U_8g4$wvh^Cm2O75nnk@9`>BK#E_pMw1%pelBy%+}?huMc%ypl5 z_T`}W9d6f7VydI%w?U442}FAYZ!ZdFM&&vzJX%3*3?vf*aYmw1=WB4*ahB4JG2uo_ ze6ETtYlGNxS{08wI&Zl`!byyRC~z3BSy)}=)56DEOOJW^iHkx(uR_DvsKymCP^8Rv zJN=#>1U>AWk8z+O6X$G&^S)qnR#8I6i$_Vl)pR5HX$!Mvc-0+WZEw={d8m(ASp8~<_!DaqNYzX`oPmL1;!UJp*TxV6(m<)) z0Zm|EA&k0(Dl8oUo~Q}5dHO)1KNd3d(c7UfU0={F*?sI{NZqt*yylb|Rwf5y+*Ry| z$5-33KN?JixQf(7^<~)#Rh5(Tx>BMAsXfQKXeUTxH&AH7)ssG$+$Cy_r^ejs_mtlx zniaU=5`%xbWWS7(x?lr}vPgXhs4!GLqNjHn=G!ZntZBX)ew7kWOodmmh`gGg$9vbR zgMNFMaW)piS#xH7DPuD3MttRk)xA!%EQ2nSmNsc=o&jIe?11z8k#u^!98kQ>_hGU0 z-Jzf_MEmszDsAV zc8sQ2o}%>n5LZ4yf882_Hrbe{^pv2K_olwHBnB(WTy!dlannZhRhMyx#SKT9Vf9++ zs`_4GeBqw1TC`1tatHwh5l39__OwaeoiQEwY_)3UZ7Xzky&@gN>sw{9dR!tt1#h+y z2e=Kw=R~x_P5daM7^uf_>NKW@($ZNw#aB(E^>H2(H$uAJJ}33T(#~Hd2<{+1#H2^; zrl)kxM~H-8(n5RdSI;b)DIeh)$)dORD)+G*_JW|*J$4Wtn2Zo<5C}W~+$f3&7u=PAtIjXlctN6RQnc@ig$UnU z&3EkR#@<#rHIfTDSA3~J4C>Z zu445%szl1G;tAEj#0xgA`hF;Lh@#u>Fg}z=0ZmBy%^P$0eL)xJ(N``pcj428%+`oa zi~u^lS8&s%W+vr(7yTpHtB1~E+r@G*_7Xwxx%#BNj~QcnaJt{>;qvfgWuI>h`KSu% zLxb{|K3S=aw$Xb{s~P{Umd#)=;aZ(QvX$3WyA54+z1W6&>@rL3F}_j8rzEDAQdQ!g z81ocGWy*MaQOKon#3+QNaP6?ui#<9XhOdod*lb(oPdxSK@{F{fl%=V~ec52wgdViU z(eE54!6tT8Ay(LXkx5(d^@X`|cbx_Y6qU$8iq$LRnliJtU7<`dm9T#2{ps}O9?L;H zSG85F9fp^2p$YZw(R&kIXS5>@wBEXwaVwU8P~JE zOmly*U>Jxmf=Sd+)b~0^nprAk|CDJ1)8nf%Og1Y3idosd*1^IK4VemFd7n)B(0MK~GdH`BT(7@f-&0$5ge9L=E=X?A-s#QqTK2CHONgl-KD89@mCSyN-s4@6c+*8dFM+{e<14E<9h7abuO`oC{JoITp9x>#b zIhRn<#pNu%3a#7?pXh;GrPOk^Qz>ITMi`t5uA(^FNDk)W|L`(l(p~= zpi8zb1l)M!F9=!{pL!N?;*)vi_uP?66<}rDJ9|A?Yn>_3uIFQP4*pozkst&zaMg1u@1^na;w!S=V?cPG#XLrZ5_ulf^7f`F$K-jUV=XK* z?;SfhE{e5%UYtEiCx{J~Z9?JcO0+Mqn-YSH!lvECfP?yk0EKf+_nJOE1rG*5?D^5T z1%#9u5Fj*d*F#gCHX2;)Ur7)4j2Yno_D0h2k};aTMnLe+Wt+ZyH;Fps*hC>T*-3wZ z?0!*o4u@tp7_SXHAftcX!Qc}KY2);{AZ-@)o$L?coh0IAD~J8XrK|l;%dhskROeb) zxl|es`twqRA|pPuYX#6XK$go~;2-R1-fNdjZdY>I%M`9o$|*jzJy3Yp$s$C2pJqN7 z#9HWNUcG2jx%fza2xW#fW$Nl1f}?XF=_cW7u$?a6Drq6XkybaG|b3~3o?D&9m#dd4+uSZwE zQhK|-y5iFaDml+J&#La!JJ_PfHE8g?j{VggFZ;;^rzK>@no6@>xV@!)y(nYwLzsBf zJ-G>8`;mF&=Ygz3^pqA&__@wwQCGaTyQ6bfdiLYznlIG)k7M;$e3l79TfnF>O9?9S z?NfZ=pvX$VHe)Ng^<~)qYOX~>MDyT)l-H8S(Ic^$-B;1JKfNMnvI>HJ`>G6EdY1g%e3Cf;}Ryu>vdq{BfWC9vqPX6ib{|dNC$mN=gK9TV2X@| zfXFykopmcB)vBdoC$$vyb1!EMc1DvVtLa3kRnpJ^;?XE{gYjI>EJt`t5zRs`q}eqH z6Jzrsm!6(dW*oE7-Bd(u2>3BhFivGJX*nJdcz9`t4bn;IGllH zQgl^Ci5Q^uu+#Zur)L_-Ha}Y!c~9O>QD?m5MV+EsyxrhPEYp*le1E#>{&v$vDI-Bh z#|3u%towT;?VG-#&6f}9a7A10Y%sH^b_ClN$X@O>A?e|L1CS?|- zx{zIlxOXUp>9<=qS~>LcPzP%@l*lwpy-Q4|CJPZq7@%~XmZLCcTEY~<2b{0M!@SH` zcZ+n4iTD&yLwKX&k@`=8deJF&Uo@xEevn$JD&QSyfv zO=hmqxC8-(E@WJdFR!L5p!Bn#PhY9@CyIA58991%g-dA+_sdhOnE6M|EUsv}a? zx$JP_<OL-s=W#Ng3cn1X+lrQqD$T@k@4ojt`!-G z1VnR_Y3jLQrxzb`ZorfBNkPQ~7cV|Zqb|f(;kk@DG>7?Us06e4C`pgOH>hDPhy9#3 zPSBp+Lx4e4t{jbV5wCFx7JFhZzIPTV@j53oV#mchm7aqbKQkJ6x$Uih#kqBi)o%Zc zSA%H5W4(0ch=Kv@rXh2uRxRVo_HlZfW1_aP=lPE3%dR{##%mM}kzh&TS5x()J9zfx zR+({oMMCfG#2wc$2z;#3)VjAi7>G73$Ce|~b@?;YFQp&rGn;sfbXnnxdpprMkrOfb zh+@91SqTmd>X~+?3ZgaF}bAs&#w%yRW(Z- zACU+R+r^LV@)nKQaP7#0)7ZEqS$VE#9StGGHbvG}_}X})7by+o2zgfS^IM>jmkv(N z+-!Mxr*d1O6U5nZ=JS<4mXu7##j8Wsvo3ox^%O26&um;Tj2<2MH=|%H&Y*%q!_{wH z7(W<`Dyo6o6~`8&PNv*aH25@-tB&;%(nY>eWbA9|K53>E5m9@K^$GSseA2FYw_VXV zUP;e_OUcS!%)L@8uk^O+AqVW0c8v)&$9>&sQz)Jb@QRiIr6w|`hh2J@7 zyxiW8cbh~JxuNIsPUtn8UC+5_jIC0OS(R5-I_pJZ*N2N{i&|~)Oz%p&*ZDKBXrLaN zp2xd{ABGh+b$$1OfZI7tlqAJU>541xD`bHD|-3knTt)4 zHwv>s(iC?KEBfx5Nk7nz=+=a;KK>H)q{L?vLx)3R~B@BLjQkpfT5X@s0i|4bV zm0bxNo3wYF2-3E?&QoZMv%Bj|Ha6T2IL;(!Etb4eOFM}@>(c`*=y;AL#ZZGxItO^^CnT@}Ok!NNu^d zJyVY=uy*bFI|737JMV5+X>*nP3Lj<{p&qYlIf#1_5m7yP3B}-3UW(HgeR${HSm07y zLNb`tK`1)LO0egxtZm6kchY^%t`0q}k-1e=a(V3tkU?9V*gZP?2}C&SIjgfk+U6;q zVISFIe4bJg9#kwRSNf3n@N$ zGZCtt2TiG=$~LK~n6@5I8p%lVcux;D>VNwDm22Tk`n->Bjk}AicZtL?)%)u0bG8Oi3(TW} zqnG{f-@qeKrChH|!t$T6R}OosD~b-ctgNjEC%{(|_r$Vno-uhHT8mH>OoaKjm)Ti} zaaz=Nl~~r}i5xpSS{h0yd=Y{k$)u|*BJfFA{choO0&F*BFH7`u9%uoX$h96_NvW_~dOjP6_rZ34zQN)p(cP!* zGKCSw4e=`Lug+4;(6oCN0tKSz9@TW#5AKLirm;%2Vv?@jczR}8jx$yei?0r+*Z#Jp zwg<_`h1yA;DW8nh?Xmck9k1<%bL!)6R2dbJ(XDD`myw!^jPeQqNtO7A;?=K~_mXbD z39B+X&l+oILKHxCL?MSu#S&ACcQu&gd9Y)tpMivnf3Qj^+t~d7wZz*fTt~k;kI~3Bd2I?W1_FUN=?d70~FGg-FADOZM^?YZKXfC~WrAH6a z3?RxN)i~hx(100>Or?c)+S~XIZgjZ4dJK*N&--WyvTH3k%JfduK7BCW?Z#~}gb7=M zNB0Cmt8Oa?M01IMc|s?#bt7I#Px4q*q6P!9c~)p~$XVXD2v5Jqb#?v*_w5~Ymu-Qv zy&V@Gcf-n-^YM$v^Y6-bwsP=0_BSI}CnMv}TLm}NU6yO|y0sR(cqc=hY*~Rq+U;|& z>Zl9FsO!=B5r+>LymQKg%V$f)(DvP!c4@|6#$`}4V01#7#(Oti54W%n#8)U_MQiG} zT(1j$L2)BM>A%RP_QF^Ti(??C{FDp8t8AHmRK*6DlP%26f+y20WO9OTMfg5<*yNj0 zIZ&!|#*{l)^9rz(*dWxUDVtT{Df4#^9w8J`g4q>O!k1e#`In0!8}1zI)!FRMm)DnR zqGPzk4@sl)EVU_g@+=d~IxdgxgWPcU@Mtz2(Mt85w1Usu*cIx&Xq&cnmmA59M|Y2R zKl)NS!kZ!fDaO?iduPb)!;4R=>Cc9!cF}zdGH9l^bXKp`ZWxY3k!Bq|0iqqV^k(-z7Dt_8Q zAZwDh!PKkxio)&HYmo8&dg`+@qe{;lCW#=g@7*vw)5m*hnCGai^1>Fu@WmH`SJ9SB zcds0U6t3-Jlz!C9C||*OsF{&Et+71E!bM$tOpUYea7Ntin9BLEV}Iv!lD*nnne)m1 zYIjs{l7sh4JoL-wF@mIzRmHmxn;e3KU*Z7?LN4`kNBJ=-xl`wz4?ZnC5ry)qeGp#z z^5yOGBd*honOrrio{wg$!fXrd5SJXqNZ0E#UUSYe@i6xD3bC{1%LZ|*W(s`-7GvC| zm>%7vkJPZi5gbpo2&=8#nVdb^NnOT(YgqAHTj7S-mJTWljU5#ijW4K5RMnR{O@5k< z@5&a&bFCDhH9`p28_lU6azi@hOPJT2E>r>=W^sd%y7FpQl-`FR)_Y+$_U!wv-`ug_ zwkl5Wr`A?#0(SuKxfFJE=^f5hsimnPatT5T_o8+1M|zy|N8w_foxJTbbq8q~`xA)Zkx+r;jP$k`wh|Q> z0fb~TheK&b)h=3}%kZ_1srNxUO-4frrmy6{9UPnV#xGv#it*SHb8dIn>n<;AIMXla zSS=7aL1#Y*H3^L05Yq$?b{)N6Fivc0XALDTdyMr7u%zrEL=@a*MMau>xYjMI7gezSr3r&&0J$F zm&t-JHnP&$JJ3mxV_m=uW~62`#gvZJpum!yG?FCC8>_-KyhYkCr`3}YjG4~izo+=srgEV?SYihh(l z1Uj5P;5i*bW5}DV*X=gfu$15YQY?7_d9JO=SXjdSmv6+?B{Xx zoLkyB7LGI)cQY>APrqw8u*qT#=?!ze#bm<>SxsCWD|tY{juvhv-vXi~++#h@t|Yrb zOCyvx1}#;1fy`KK4<7cnDBZulY_DH>s#sk zJ1lonu%pfyoD&+m5kP)TZPsoHF5(-gu9#-| zW|AN~#VrDa62|4`sN<)c`}Sh(oCU2A_mxTxN0tsKe z_>~ScbiILzQIS)pq|d=Psm4D_Qf*Yw5TObL|(c$de^JKPbs4p7Fz9}3Z z!$HnaVw>TRIAj=GFr7FTiXEdZ*sQX0*`)uH3?0jnMu`8*6fXDf+QmonxB)=?u+Mqk zuIw@AXL=HW;E-0^Ya8c+uBt;mPhAw#s&l;`eHcNTgR700nKYgPiKR7sl%)w%$68}f zu83DxtoMtt)GFf0o4oiXyT?x61)*Mq+hlW}Fu!y(_kn zYsX1853zW5nvc3e!+6bb@dBkNFLk&y)bA)f^m)8p$>mYDY~f34mm{b1K$UrqW%PTD zTrvXEZos4Q5UZJSQ#obKO4@pj%ryJ2lgm-@*v~&#&o<98#<8UH8Ji+DgfmQa+x6v1 zZ>TGx+{$G5$e|Qjn4+68Hy2S>lyZ#MUr@l%JxMy2*eFI*bD38g3|5)?)Jeg8QxJ@}$qip#i4Hlnf5$4J9yx$Ho?P1aW}g&9YuA9?PI<_~fD%#mFV9(%QU(WQh} zj@mq!&d-GbouRIuCSyhRJk2EayjyrOSvJ+@SFb*rD6)Pa8pNBQ>J~0KXF4%Xti!@* z{PDtiyMv;hy-E2Sw&|wQ%MMk3?pYtW2<0>}HGZA<g+xB4hT0z z^mE0kwNiZ4*3yo;f$$zTkd zOCkv+1m$ecA|1fNG65x?Pa^0Ka7q)sgmRX{7l^@889YRKtqvJ;@4M8j#L&UPds@8Z z3O9>o;vyy=c_u_cQ^ci%o+0LaH=eBZc}s6FiSP|FaBZegQ$AzKLkOnCH)F5Ms-=gA z_Oh*_C1}Jmhby>*@Ik8f~F?Om?) z4Q}SxXkgy1|s6yC}q%O*gODgy&4-7FZo)L~fXU<6%bf1zUqL{pB^#5`7l>t>n z+q%*r-QC?KvFYws=>`Gmlx}I*bayKq($d`}-QA6}yoH`~-@EUhYcH9-#vJjDZv+eI zvs(xluGk9>nGt%ZlW7pZz^v{B>pHl_nhM=)!VH$~fY$91!`e`q&>S&ENRp>>S?^|| zJUCBGvzF*>nhU)xc|a1)ibIYq&cyX+iEm9B&sZ7;8kpzvP;&rJRHtyE!xjzr;UZvM zQGcx24?_qhWPd1vafyueanl)uMnPz63*FNqsw<;aZAJ{DT@DC1 zNBC4s1gqQcdYvOG&8#sts~KQS_xL*$TbB@VRAwki)1cVK9!*}+f)qoB1>| zO#Q%XO^7lXb>dk_dd$~rp|GMwA_ON0e__ppxsEa*`? zcr}P2C_x;>v!zrFbWTYlw++9`?x-X!-Q?0T6X;O6zZ2&=D8Hb;LCdW_cq`NX4fjeg zK=_K%L!R&Ex15kW>b7Txz~)ZeeILi=!S6hAZ{v(+w(QGHCAf?p*}e|OJ@v9k`AC(< z3`gBAaY1Lj*zO6&W{(1IwZ;q^b>-k~AasUd+uVj((R?iSip6VutS3Z=hc?o|nXiyv zbVgJ{iLIotf;07kke@=C9Hw>(+3Ml`p-&*rx@n5i-{+x9#X?Zcu6mA0!;-Atx197K zH@D};YpR=~EJ)cLwmK8*jkMEr!>eX)oHtyMX`e>kPsuO@Q$KjK!1!$5Hhd7ncLco$ zGt8&KTR)Qsif_#$T)J({)K(tFJc)JRNve|{BgPokjdPXWB|DOmZt483*+0zPI}iV3 zC+UG?^a%TYrnlQiHp5L)GR#^wKKZ_k6musLWSbg@A>}D@-{bduV|s}5eQ(S^MCTfV zSTalf!Ac9~4NM`{$XOLUUhp&)L>6_i<(y)}TUJO>I(;u29Tsa8Z=)^A9%@{x5T-xN z9aj_wu@U}l_A(_~jt-l>l%OGGwMc7H7WBAlyrJIZL7XJ%<*Kd!n>)@^qOv9cQD* z$vhKh=Y27m%%4+mhkJ2~Av%X@q$^*F#Z4FAU`Yr#zL@on;y0Bz1scj5_^GU@c*DrE z^B*4|CX!ou}RH4SFQl ziMH0|OH%3#su?KdLD-JC+-JWWns0`&!nhewL>bNqC>Gytq`sCRt{-d$P$hW<%Et}B zl|o-g=G!k5PQgXr+Zb0}-2-p$XCoEyhkcS{VLK=kL^?qmgzHi`W_yq>eNCMeY30~b z$KKi4J?PNT!M-ui2Da&uA+!d*FiJu;@CbWyRs<96*XqrTsgnqDiAcQw)M42f+2lbl z^EBRS;uUIEHT6ZfVmtyj7jF?bMFU*jH(p z3_yN7i+yOev77@I>B5K*=)H-0{3M}1V?8+034CLb;KWkHB7P`p%y(hxU9_Sm%)|;x zvk7^?qIB3ijQyQCMQXf_MqI*LZGv9|OV9UTUjV&1pBX#Y3dc;s{2)Zfv^qmGCgket z!$oG|9;xq}%AeO%i`h$va_1XRYDCgWEd{pasD6V{9l7(=N#FN^y(&P%+F}z z>@?GcGr^#%ppsgh?S(1aAviG(ygm1kHgv*6sZ{IaCz3;!t$pW34rO7qH#VAn~gn>PtZi+V`iijtyA` zBn_Chmdap<1f6mGXmccoB(9|yj|ie-}HDs)_{q~kqV?_ctDPABi zFyuhsJclX7=HMcZJm4>@fjgz)j-II;1$>H(znBO;b+S@N4U@OO)6i~EPlRp?k>lPZ zJ+5}~Gz78SGBvJ9+$z$5WDlT$;35^D^9Bj)&H-kFfT9{}0?JOc&<-C}_DKW-{7Zrw z=<`C-zF8QOPKW{{a0(%g4ztzP(N480_X+GJD*nra_4vcEp%wnH=0f`f)VC^tR#a z$m=Y=?$*RVAdrd=mFQ*3_J1Pe2O<2ty90F*P(~G2Go^?9|Zbj(~ zag>eZ&+MWF1&@0lk{hE@$eW1YZ}`+yra_|)4S%EE;Q+gcQF-G&i=D{m*wU6n?8df% z3L^LX#IN%Nl2nDnfxS8`bpJX|ZTUNOt24&3c)&0nkOrv_a#DH`{Hs$ElmwtQuKw?F9Nr6_wfwu9^}x>>^a3Vw$?~>yf>67uIQQ z1n6yccYO{P!T?RTWjFoK%p`eAY{tT+wcw{{1(Hip5V*PeEPBKXw}1Iy!fB|6$+8<# z{IXi(CX!LK;7Z>uQ zJ`BwonMw>`=nP6K4)!u*X+LZ-Iqbfrr*;_Jf?;M{NP<}ciEMBb1{uHu@;uC%F<#7u zE>RHmGME-gsE0hUaT;o&IAC=&Tl79V5l7q?9e4K*-HZBWAY*MS-_cR5))D&OYFdpX%Gv#;Aj83f zwm}%oJ||bl9gMGO9ZIbn9Ag=d1Ibmh493+b4!nPZm4E@+;o9V11hI}io~qG`967yS z#SB9&!1q${eXK^J%|>f|-r?#r#)pk$FqxxIwhXNTH(DnyHvw{(Szh!TRKhz{U~3T! zLKEWH;>m<(kuO533yDGnES@NKTxB$t;wI_~btQ)q;~Mu3<$>1VM&HU`%G6Vv)yD*V zq$O~1K;CG0!C^5r+#X5?pKS)jPT0%zp zfbxb`wth@Qj(Db7jX|vlYs)BLn{gXZ5U5CVxv6YpnSk9k#-j;xD~JTe6lmVP#|h}E zjqA$wk^83L6U;zZswS6QO)S5eR;H4r#?V!o0Adg_ntPJ_78+TGUYNi#cOvJxp;AL_ zU}pBqp)g^aG9IO;`vwm&B7rf;SB_qmk}xao^+1741?4#?P3Z?UjL>6M=&A1qsJ>(A6?XvQgtj>G&a(SXR^5C}zz6C2A`W5_E`#7`EvtG!|mlTC#lE&qP#14=-_RUR7ab}`l#{0~}(2-9yP%}BKvRKivuPolrXK1ArRbUG9% zNb&ze{DX)KDMzoW8I~;OuaBF|czu_s(-lM8HyH`jXE{M;|AbZ*oozw6 z@P8S2{Nuyk*bo&mX>NYYjqUEA!JBf*PY7VQ{pWL~4;9Jfu~+J3XV-g8*Zs>jB+^Ds z<{If!pg<2(C}wIFd_NnCZu*yf2oVh!7rjWJ(R+6IZB9t3jK9MRCChm~(5NaWd8yFz zx8IELS5|@dL?5PU|3h5_ICYEW|1&0~53gA?-=oV8lK*FRuQ4wZ(T*8*cq~WYt@;4m zM2X$sF8_|`zx+o;BI|Ahyl~p=?Ejk*=^x9GJtP3S9Yc7tz-5HSiw6;J^1mCf7kGVr zA@Xa0>)%ZMO{63O@OivI2&n)1zl#U_9466G_exttMDm(vNJ80d^uL>Z zRMhNf7=hoXi28up(x{O^cgAHNaGbj;JY2Yo4cTnW3hy1^dV!=X3Mgz|x5TdVdP01n&{-3x1A&J8D$6R6r zNMf!f{|eF1>quF)qRzS`)|fVUkRn6As}i`vmTBr@J%@T z`b|)Xx*g-~K3tA=3?eF!p^1bBV8CwN!Xe=!jS#Uptyejbp}`-%qr`%}R*dt~IZ^T! zEee74_Y&>U9fu0hD;;U;Gc?`p$lVj!2a$}l7G>WZ-TQLb*RTX!ai4V0P4lcTpvyZP zDPP%-`tdb-bSNlhwxu#}Fo{DU!Dk;^F9z7gheBP9Qbn7wWXHPm4Tpl?rS&J&x%m)k&cl}bK7Ir(ZI!(4O_4b9G zII{?wFp|9l3C+E^kXb`JIg|U8v_Tvk96jq7!+JS>XlJl6D2o}XNWjLf&!fQ`jC-f= zk-P72&A(`4Q~mrxqXxGUaxF{R*ig8rpJe?W^zjLnzr!SfE}# zInl4h4%MHTsCH*F8F2D1mLewRuzIjkHF~9DDtYEThf;7^F82p6}QY zlQ|T0#a;|E;xwJCuli$Qkk7l?)`~(SJdaqKZ3Vu#{n1mklx{L$6RbpuG~$+i?=$1% zcLY86wt`SsxG~yZ5P_A&w|qH}vE9H=KVO54ogRjs{@do|*aWx|CP4IJAJ0w+j}emq zIvNW?e^_>q(g3}?h@E5i57D>7GH>#{%6mM?EUkb%!Q0${_$&0=4!52a;l7y8ju8k> zxXUc48YTOm6Gy>iq`K0LSwXnCo`Z%Z<2vLA<0Q1(9zGJVD7anT--MRWyLDRyT@^Jo zmgnmPXqMM7pzJ<}FO8Ljrcvinn$Z~ll_kKpT=BOZd%cYZjEc1{zfqRi-4M7>m%-cH z@4eyZD7XB0Xh$^c#q(1|a}3Ekj@;SISTP>;{Oj61B@!I7e<4d|X@}0YNOyUUc~{B* z3QPElM+QCw0_a8`d*Tg`E|;%I@{MhtpY872&my1sxk=}any_uzDq|uxf`8IC9v-FM zncpjo&Nk{2`QW0Cwh$lXDt*JtH2+5)N7jzE-rRNb^$2N>a455t9bqN7qGJ=8KQ<*L zawdUmV&LNOd2wN!|UfIN#XmBsZ+Bp7faG#$^>j zI0g3g)TrY?R50oq>?7=YbVoPOMg<=gmsXjtY;L&<3K#fy_uAXZ!P@?DAi=SbFHqWF ztRwo<^vIN<*HogE9{5*^^6JCeXKr|OyM)-3EhhW-OWSlj*m%aoqy%BHJ9@Q2k&>;a zNeYR-ib_{#H(ThqTeAD3()Bd~W!&cRW?~2M*qgQLN&MZvGMpD$3Hxi~nElU<=58Ur zFRYT+qzxu#v&j8B9$Ce}XkrkTh22zp8k>sE%v#r~g=&%ivh(?42EUmjt`N4iR}4TE zq_OT>{fRK29YZIj#9*;)KgvN$N+t$iIu_8^n>sVLNo}L?c(Urj6c3B6sWx?jcFX_u z1q}SVI@zEbPwk(L0#APqqdnht|EKd{&nPW?cc!Q>Dh59racYsVLC}$1u>M`(H*=&F z;>Uv{#0UHQP7zGuVVkQ;Q&K3xw4+hFZ17i&1fm?KXafNvQwFTkB=TFtGbPd9H3?}Y z|CY}I-u`(5)PrMEujKdc+m|+jai@3ojk4>-Ii68E!}Xo!>+WzLXh%B#4UG!A5ye5! z_zG&S!00qsZ@xhoUv}`Dj6ABh9y8u{@-Hl{=t!hw(RC~-GCG`gyDP7Pm#dmn>TLf# z;`f1XtLgKzPP#3k-4LLQQ%_{pYp^M>q92o%~XG-NCS4PV^E6h z$m9Adoa%U?1@-avO7#cVGlFHdFc}F^T%)5>eNB;fV27-P-<+e`VY{6~-FoJ<%qBcV zaPQyI60t(pR7gwW-VFcifxp_q3bN~E99j66NBw=y8zc5tl?Lk#bR&s_ULFJIZ)hN3 z=yR@@QBYu7P-NDzcSU~967Bvz3J)Lj6aCyK3-{jFcG=v8lN5{hXK~pXA3j{?jG=1N=m0UB2x%Z``{I zj(=LO%GX7E(QM6BJ@>`hdy&q?+_m>YV^jMpg{AzCFy?4KX4K-!$SFwWx!K3XtH&fI z!Djm?C<^exhv%A*e4tbcRuYDG6TD@A{zy@4XZbnEwbSVG#Vwj;4nsgw=W*bKz(cNivW~pEi3Z&o=Q`l|%`+^X31L#}rcm z!u!t+Cxt+C8u9=BQ}ye%-g`$uFdpwQ9d3^qKL);J*^)mXcU_kMXCQt@m~-@pKi(;l zOCn`()*v1eN>|-#oiPIas4~(Dk|vkmFkaPi1-KiGT56hA@NzU5FU1Sp#(f0 zMhqp-Y##W~mxK^w_vc%dA18_u(RLnVTk`?;Qlkjn>~FSUxFV`niEQ z4X{}wyCTP41zM*RS*udvL!z4v$2w-WRQxy`sUWXEnGKO?vjd>p`%l9_IOs!KA~d%Q z5mt&j{UZ;B!S+7~?OfA#?>(N)IoYhAD=DWuiMF4%m}Tux@TR<;)EGuc7z)l-B^b0I zVKfn`U;~-R^bs)9Ir9vw`yN@V2B7$ZyxmB{oQ=dLoF*JI)jpYc>Qk|BI= zV#xJ6%xGl)r^YOEPJ6M>DJ>b~L?f?_0}V{1Y(UjRuz!YZ^TXrevU$IKz*W1!sE}{z zJW2}v{!b{o8nAF-ez9g~fVuIya=jgV3Z?(CJFrBc@5Uga2njgSUIhr&K=y3PJ;?aq z_4bcl6-x%%ZS+s&>nE&4-h78U0KqQzD&lG3AS(2z2EOAV1tAfB&bz`RPfcHt=$x<& z5UFqSje8VuJ)Sq2THi@F5GwL0iUa1W;)cGyDEaWOsg1AQ7Pf$_Ark56dDHs?{jY_W zApmWWLsvM_=Iu#T9xMKbM9>4sN*&^J|H;No_}V9~ze!6LAwb6(oo2ZL%%2wpe!oRH z)v>mZvsS?#L}~covy7f2`Up$f77)3rx-NAi|Ev_ej)U%tvoT1o$w%8W&0osu^ zm9{`4Z3V*c-O315oI@U2-9NlBP?^z#MdR~r8W_j;?(}eF#$c4qU^t> z%{rF2pA_8AEjL7OzFzxpY0 zjPZ~m`$PTM?W56o)kptcGXO^`E(GN$nY|bq{9WwBS$Yn6tk9$M-K>%j`RFGbs*U*H z^N(tlBF=+p*<9x=R9+6L`@d-uI1xX3Nkad&6=8GN_*lP1qWrK!LUsKUt?gaBp=5Fp zwhru{(W@Bl@-_5^Obt@7rk@cP{1e=(-Hdnsv}x0LJdE$=+N1Uy`eE*DZ++#$s*01I z7!_47^3$23MB$v&*7r*D%@(cnI z@e17cV>n|iY-ya$8vV*LvA1kLNNI2vCLyfHL-qtqr-O?PQ`}^`DE6_9bci36dbLOu zro3bid`1@P3>qFU3S8U_&&6guoS3w|dGRTec71T^nOLm`Tv>1h(ymkeY@zl{27gQF zEnlrAYJ(Xn!F^5H3Y|xBN>?z>3)MtzsZFX!Ap2Du-4$P)?*~5P9YdM2+RNhNI0u)q zsd$`M^qt|n%6hn6neP9T0>Dt(raZqKW<460RLAt;PCF=b5c=Hb6H<8yiGhpDg8MRg%ZveWMOgap3D3D=Lb~F_($WHkn$g@Si1~Th{C!S$+v1Wa~k{B*Elp1d`xqv zklv|Py}l6)^|Zh+wtYsfzKu2}(L%c}45!^eKlc71Cv&=&+|lk-$g<^cGhGEwb2_n_ z+*8TVPS|;EO7-k2T*CO6c=sHYH!P%=bQJ^IfGSYDM;cqi%^Rp4Mw_;wGq%MKoqv>~ z{5^(_{yPDk)o^VIxoU4g^Z3XGR!vHv@`nFCsaERc?N2R@xuq8eox28R^yfI}EpD-L z$;xL_@u7CRedoSSVP}v@uSKR3$wP|L-Y=iSAk=pThmAsMV7Sfi{VHsq7AL-effJ3w z*=M|F`0()a&SC76?)@)?r&=%CdYS^G(NohW4m(a`UG6jux`0%|TmQa+(`_WI8<2A* zf|aY)LH@_%nS(VP>t6>jI+)IjmO54C;=b6%ld}>NDu+*_OvmU8UgljwL%qUJfy_!q8>9qs{uo z2!9uT);lAuLu-kf&V??*C;YuxVSsDlkQm|Na(_;}{4RbNRNP38eWZMi0I){hK_xKF$&A=e6leV(0fH&f}NuA88G<2NJf53*L{jkdi};VCQytRF?)`Z=LCEtNx3uBh z=h#gDNHbqbmnTmT%Is?Eg6;cvc80eE6Pm^Wmw3%-y8UDtc@7B->DMA%AL)v5%etip z0xS{IvTe-Eh~5gVCUHMo-8HaI-viPspiVZsgF%hNHT6Lz`$ll8$h&aZk%TVZy`pc9 zV<29w?^=wF5+<6V9BsZGpFZCsT!<1~L0L@STOsp~Jq|{B)@c@GV4oS8Ae`mzC<$fU zI%%@K#4F#BDzrySpB;29>APQN_e(Rgh$jr+{l^*In&wsED4qznqLG&CLNLe%rI-K` z?zSI~7tSQk3Pq3%{G&Xayy0EHp1Fn?<$^?|cLh}6${a?Ztxd4bc-b2dC5tzDnxzFv zqF@9{&K|OJkj;sA4ur(n+bhr=?wNs7Nl z8KYUxr-v(I{9*H~-NkqHbQ`(0^E$Kv|!$Mr#d%Ds#gQfm|a>XD{_qn|Lii?e`n+p+N_ zV+fBGZ``L2S+1|K4%a5xZ5))X`q2rDeTGNL#iq^)*;wU@AQ3UyFYszyzWU`<*wAuB zF}bzz;!5zv)y8=5QS0`hJIxo?r}D6z4KXbB#3?T^#=!eMykETao#k}fNZ)ChQ>>d#Fy%wA zU0rOV(3!>wOt_~T!{#X|9AgpI6fVl(N7{_gebu_WF*)LAoZoF~^kUZv)j9j6{Ae#v z3_YuY7?X3si{qNS*D>A-#8=$w_W6K21kGv5u#rF?x$Q_CHNJLrXMMcgC;0c~T>}$V zH!Wh@kN6biwcwbItuoTh;Zkp7W9(7@P0a+SFv8n!sicKZp6W&_roxWr&N7T6Awp zn-S}7g!$L7w;agieW=o0F$3xpi-T{j|4fu_)G+rn6NA93#2!v~vrOnwNr@4MUL*s< zG22yGP;3Ila_q#UEuWK7u0U0!rC+FzHY*f|j+zxTQv>d!cgZePE-rq;=!l(~d1MS+ z84Or{EwVuGtaWJOeP*E}oy&*Y8wtNyg!6a)HziBDg0%je_mEk_hvC-Z)$hA0D|B#;x{7}ZQ&*wOMoU>qo zv@f&UNxh0oU>A)zDzQcl;z?;GoZ-1hx7yJrc!P|f7js4CZI1Jk2`P~l1|N{uQE}Ma zn`LHOs7GRjg|{z#3sYwdhA*fKZEE&BC*QTahNa0(PE4QoGfEwB$@(?Bo|Lqp%hc=5 z`LsqmQZ$?~xe# zJSki*8M~w>=}IN)B07!eXKk!V4!={n6Jbn0HTO`%erUxb1jV|~XCFeX4L3c`!L0Lh z3Xd?JrE|Qh`xd3-hFc?(S`0M?cS^wKApAiKYBZwa2G*G@ zPQAy5@qWrB8 zk85Slly3U3elBu1yU?z?Eeq)#QG%rX1fFLLZjCM$Mu?^MqN5WgpR*P9PzeZs$Vml) zgD<=@eznBk$e`vrZ|pRU{22(Vna}=|4PoBi@IRF}S2n z=!Vh=jJE&Pt`>4#2i@BeQ*DvL;`H7MYJg_Bfulfqg49EdvMf2%GL+ZKc>-+SyDF#_ zl7*riqJ@Ib;DOG;8l+{$ZEDNL~@sf@>A-%YQO*7_W2#5ysh`P ziNg>!^=blF&+?r(w_aJJqo1KzCFW0ogSW8Vs)dQ%9(OW2hdrpB26ycB-9PM-D;QnU z5Bt~d93bV-H~IE2!2)e!ol-|M%%3%LGQRyZNlw2Y+6TM@U` z!Qcw!)ufWS!hCmuC>L-7L1Kh>6vpJb{O!r35=^^oUuF44H@p%4jK90`QyaAK=t5ak z5a6*v#N8v1)38_Uu4#@mQ1(0>H*?#lG{bB8j2rGIu35H_nI~L-{_8p_jnxaDkjgid zTr6XMW7EWk$yZLm(6fi~YU!!G@np}v@wA0+BzmIqs$utfq)yCFA>%i6Y^-}8HkDyAxqIp_N+CGUZinvCKCw^Hjp1)TmuZ_eX3y@kOL9Q z!If`(i>0Og%&}j}60GFF$|1>$HXvQw+Pflye3DIGJk4LDCkj#nze+go;B^*f#&70k zEn=u%{$K$bJNgEnX^(5CYIV~m*@siuDi%zV$!-R1gw6!P`4=Tj!2Ejigt*w&a2ROt zE`RRp8Onufb&&G7_+<`UOxC@U(!7Z%AD`?T;|DmdU^-TtDOwr)dycpe!Pxi@#e&Rd z0UuhMeKM@qmTqod2IB>;+3y-yW_ASV>{MabahJW0iVjin_9M^9!9t(Gk$8~^2D$+= zlXjFY$NVx68#pJEMjy;~DFdIVe&iqWHhq~}={{Ly6w)26 zq{@G*(sAw2WC-7cQz^Ypg!4RZT0v!u$D#yo0-&J zY$v%L1f(_Q>02Jl-)y|SP`F7}L=uKssn=$YDJowJly6Hx*0Qnc$cv<11v7Zy^9%toOONTfZUT>m#;SRPD=1yL4CB%H;9{9_LJ9da|K?V^ zrzL8?6Z9$s{Gs5_hs&!=0!8kf zGXuHEmf7)qH6G_Dg#sNxk86>;K*$kuzIzI!dpz0f=fET!pBE|GZM4<*(~KRr?*;aR zkj^AmZuohxciqOCG#a6C=^93m zQ%q5Y%X8(0HS&wM4u4!zNG|#6r9)M<_szvq&+;|pv13$BwIh-mtq)S$IEMGiTuwiv z`!f@qvF!td>jJE{{*>Kqg#Wa-uNT=IgK-9yyD7u+s2%JR{)1rpjKf*L*<2&RGwR3c zp>^B|87~9Nmq+Ga#&|?cS8j)<8}`E*p1Qe_1|QhC7dLG}E&Nhi89{1jUMmCm`P}rP z#g15A>0cB14rAJTfq1ewc(lady`N>$s6m6qTegmZrT75PWtCEX8;QC`W_?$5GV4Uo zt#X&xcdV-bu*rqI>2S7f2y1T%*_t3TV~E!IUM92i&&P3u9X*xOASG7cBE9XaiR+>X zs06|b^hWeA8Q+fTD)n`T3;jD?eVVJol&-4o2J6#`9aUN5OEf^RFRM;Te>@1{!NE$z&=wQ5dwG@C;!kf&Rksg%=^h?z-4?$J2tK`7h0F4L)Uu2Kwp#Pb-JXUl!}Z?h zWf;jU9e*IYN#6G8UrchB_#-9VS8S3e9_?ilgyro*yJ@hBNPtsjnfwh*p*$k#1s^)_$L1UldgJnRU*0@bZ%v*Z z&EX3w?KN-eSHR>EeUc}Xm__MXJ|_;p`7PN-C!O1L6YFSVOPcqnD5#l@$DmA9D$-=q z=|JW~g!@TKZ&H4%-$TJlZPsXMkJ3&q@?DFwAUk5MFsRZDP;&rk`7dsAUoP%kE3_}@ zo-h1NY<8N^+&y@QNT zSoT-RqOgBAxB(NR$h~%wa~lL!CXV>d;AG;fqSu6T>F^GlxVb5{HX}GjuZG4jEQG>* zgM7*>EE`rs-_fabsNN!FTl-^yz$L@mtG!w2T~$=ZHnEhG6fwr+-%w#oKg>f-@J3|N z?Uv>Hsg~X|EW?|wIpCbOVac74TInErS6ZepUc{C?9VbX5VR*>PNwqj(1M2_a2Y;s2 zCnheJoh@gr8p_EVPqp)tGQ|gnAFIi8;)M!lAA&k1Uj5LzYXwAibo=h_!Z)T%56S4M ziNVipSU=?4sP#w<#+O6M-!@Q4wlbq4YXyM{^Um+z-CX=a+O?Y`A?%WYGBl*wBpH0xrzh_uLPhrGzpU49) z;s78PXm2KT`6cfc+exPGs}I=m0`8@I%xa7-a5>b#U|9L)_4;)pwF-oo;~DyJ95zF( z0aIftWUqu>eiX>priA;6T>r>mKj+11(uyz{**tv$u!05x-n;}Fgg|cUq9lMFjAw%d z=hF|n?>~g+C^_(a#);@^XLL2*ZC;s=-|VJ-7m;u4VE5?{OF>bgmF4yKc?ePx-cll= zlo|-0=Nh!5FVvQSrt^6=GIF>1>d$J6WS95iBt*01s&522qI%t$%RVAF-#b9)Qpj*W{8uB$^jvCR7-qbu{K0E(?$9R`AcmFsiYYFgQ|vCwesZe}E} zFvqJ$G`y__N^(tZ>Sduge=3z$9D90~ovhVaR=yr?Q$&Pp|)ArQJaJ{MR@ObC{^n9t9e;; zVA1Y~AWBY_K82#)YsfbsvO{r{!EiZEkoWAUsp>r%YPJ@Rc+yE1wlGr{ANH2L{thp+ zmydv}E8kPS8yw4{tq)zh8dHD}>7qthH!Wv_;X@JhGMgJ8%bgE;9N^cg`6MuVs+9Ef z+*tFGo!!=Jv-2WXb&xIr?6MK&JJ(gy(}iIVX*{5?)<}x$(}1Q2$1MIMPrr@HFMQ36 zDv|_v>i8BS0BUvf;$`e7bAAPUnneV!HowXgq^_bMDa+9_mUrQPS8drMf+G z`}n-SP=P_SGKFTI4DLKXIyBZyUc~dU(c?lB|CHipWSoJs7#^DtyD@jRCJ{z!;Wh`0 z=PhpnBwf{>S_GvNBw>huga4Dr{nA*E(srhaIjK~55EA{4?V{+RF;`T!JXqi)_;i50RENSd#YV@CDIwCKJ4rykmGjr;Pq!vLv(P&QaKzNje6%zYad3T|tbUxh z>G?}pjq|h0Qj%HcmZP7$QB%^u$JbmBG4icoC1z*^yT75gjtj94kbXdv?qAO%;Luor zhwfeX!=vKPFt%vyiLnQA;DJ;Rkf}gMze@Zt0`aHIVD}UteX<~HApU%6k$NImTXjN4 zRqmjkXbNS?G2Dx1hj;MIkCW4xohppQsEK9cs!^|5v3LgH_fY{pNq7jK_c`8=zni6z zQa@1;?cx5yGnYXG>Rq+dQB%W|&Xo<*umEMhtmbS&x6MpV4Hv>cXg0dhV_?R2faH_Q zp)Ftj1i>5d)>zHi>h*!j2*-p~H+Y1f05%z0%4=U};^1Fcq=Jw|eZCR^*6{^hMEx}y3LrP$Lnq`V=JdQ#wGUOzMMh~*M?%1D zC25FxOQIZ_g3^!g@e}Uyr~Vh5HWeXv0g8wMWKwp`j49YbYKP=ugybcJhJj-1N)%w0 zcAE7AH*p-p%Uq5HS>5%9IyiL?@PPjc8M^CinGMO;kjz|QS$#KT>mIuTU3_=pRInDG zYwhKUQ0O_Y-PU+|x7=-KROoJR%|Wxy4IhU^3wHKC@8t`y00?bF=TJWQ*Dbrqqp4at+kA0i^?SFEHPt@PC(0>oW(2#e+GX^` z5D8IyoYkU{c{WR5OpBtK=4-!HazkEi(&z)lXxy>Wy#OSqWCy5XD(XBw!tYy8!Hi078!rC}~$Hm-L3`TKE}+m08isMd7hkG+LtB zrb|T}ea>EI$@$5o<5oCdHXnB5Sf=sQ2}mIe1Qi$@EmB()Ro7W#e50+qw)0uneL?c> zAep@JrqAkPIUdzyqG}`bQp&$i<*F#kW%UxfwAyLTwsmz&>wUQz`c{w3(7?H6;Pyd3 zNyl4dVG0|Vi^ovk^Cxw%MH7_o@Tn|Du(j`*_jMDuiUn`A;qdHO9 z-Zq!jk)sbwZ5Jm;dw2;52r=eMs(~~x2mA>AWm_LKbOTu7p5PmXzt)(^OK(fK|D31N z&yWk0AkQ?93;&FEq^*Of;-TqTD@MWFLqilAO?3gC15#REh4WhFRjeg3FR z7X>U}kGtx1<8FiWH6j9=IWNDOoqZF1=nXQcepn%Sx>qD#-hLx0BqhbdJKuQi&vWxj z$f0;_Bkw3-QaMa20A!+~FwE?!SDgM&6w4m+m8?NA0UCn>7crT0M0?CRMeLqSL?$L% z4JSb@XCp762SP@TPB+Aem$foR01kdPnGrI6_O$cEv-!pednp<`>adF4%=Pda$Swdb-jKSG`!s%1+9w?!6df>|0tiMFBllXA+*<^Fu z5`e@lTr!4g6mRX|=Bsu;sDuxEVwB3~Bv=oZXO$=n-vQ8V;d>HZvApLduyH*~7t!yr z#3cvayT)rdE435l(7VIIqaPBTdl7f4+>f|%tn!Y}`8l{s5*X*;Ed>D$Uw2qjaiz zcP1Nv4dpGDbIt7Y+Aj@1sh$;7!NRo<8~lt~!{B#g{WBgvZxQr;AH6dcS`n6Qc>tcW zaO~2LTR>efk?seV&i<}D+tGFt+B~32=(;E8Xj(?@TBrMM_qd@B_n3vIa(nI7sdTng zVE6;TG)lbDKahf=zQzi>p2+iHu~_@XfR|rqUR6NL!1oq&b^qDl2TY?YV>bhr{d?NR zz=<$_lbWCVJK%8j*!uSQKo8$z~qHg+HuUWHSx-8a%7y2KJrxh*6GnUIbs1cv) zV$4e$z6l|402Qe*aZK)>e0pHO+xi-M%rT|a74<&&?yr9~oR0uS=}_NRjdkCy&3)f!ve53uYmIFT@XNS){#KA2$ZhsKYRrx%kg-)-6 zZ6A?0ge&z*NU7zpy2Wo-{gVycFiyq=rH4n$QF*>RlWJ#r(`aY?B5GKkki43-H`SxL z^O=?(7mCIiO=Ghh0Ki7*uZb>Sm$+W>SVRzz(xWx2d!o0@)aMh%v=xNOekko_o%r5+ zIS>5tsuxiXbhn2V3GO=v2|o7*32`l}g~*+TY~NLk?Ok59+_Om4=gxXP<7aa((=jJ@ zLhkR#3T?7l`&)86Z%=dB#Y~EUpbW2eV9-+;DNT`VzmDC|7Z7pIMz@pskIG4SUlqho+2$scm&Rc3v7axlVf6kBuCp-xyU}QQU|a4S|=(p1DP;l9SkDPcpv`h$L!=PgR$Ys!>1D2i1xfxIy?FO!8iF=aTl%2G=Cc%i>ec}~ zw9+v@?*bMl!atNW#_I-muBQ|IN5cp7T}|k;q_EDG6UOzES+fi62#gZkvzhmX*xcd& zfuTnNkt8Ly^&-ANkqxPw_0M)%I84LAHahkf)J6@MBys)JxiQjH7`GlPY^H2U+g>U#w?XgH{&lbw>gPgaMmYI* zht`A0b4*#y!(z9pm~GbGmTe^lKe5UorKR8jJfJ_tNHTGWPbM8O35YITP%>iNvD5lz z_@#E8Lj^*kqQqh;CPTpyQs}w7vP*nz0WMuiQqwU2h5}gML3mBtChzIizfb>%vbT(i zquIWPg9LYX4Z$Hua19XLCAbH7cTI2)mf-I0?(XjH5ZrbCP4YbV-gm9vm-o}GnKfPA zRdxDQol|?C-OmnbvOV5z%VAlsiBzv8)6hh}?bJc*+<=HnAQQ(au*Iv6K!eA2e$GTi zgP|jgKmfb7nc3}gi-(LfTt-5w>%at)ECyMOzL048SMMGGh2MF@)1b@N@o?5g z37zP(ApGdk>x%IZitosX8iCN*Ed|240|eYtdHKzT;B&uKJhbo>lL3R)zT;n+h{T1I?}~PswCp%5)dkuj3OY4MHrMXU_-w zpo%Rl#vIDuKd%~V5@J#%^I|IqG(i@Pyv=&azvKZgTk9hWE z8{(!M{zZ8LFQhMcsK5&@N8rKc;mSb0Q9GUH%MOCaM^A`aifnyZiN-&)puBy8b%Lu!@DH`=aZw^V~n80m}7EXT9(1GsGJ_l-7b?ckpmr;5>V-C-#Wz>T=`P zA0JX|Af^1jBluo%^6Q<_#zkFi(Vvz4^3mNy`u{e}I(Gc2mSCsg#FpLW?&03>7nU&OEsko3bmXP&e5&)BG{wp5YO=%nIpeJ6-RmTb4bxP20NsA_C9xRt$Z8uOjZ)OHo$5jldNT)J3QJioJ{1d0 zag;2~-K><4R%Pw^@-}+v=P<$abW#CXq*q&dD_xg0vsaJLAzBo*@i*xLq`drmCb~#$ zfZf!lO#VI^G_%z3tLNB3d9|OGa_3=yPU#65{_@99{c$Q_FlQ5S=;Klwrky5cKsNwi z3UEwy1AD3d2haSMTuJ2tlWY+l?rUEu+Ft#CFi^Mg!SkAZs~BejEn!XjAXP^j*G3n= z^?_7FzOkmo_kpIi?%U$YN3h3D?fb1E!+8FA`TntDzz`=$dr4qPRLgEs8n1$s1WMV~ewVGT5l~g)b+kh9Epj=+sD;L{B zOUaDf(pxf7amzj1L-}Q{FI;+PW1v=9o^G(<()IPwaE_HOJb@v<W75&4G=l%II4;ki862#1^l9&%XzAcX!iU4SwBek&16x?*}-N-)~R2y1V%ji04W zjJHw!KAC$hbU42nxI=4!(5SPuN{wKahQ)=&1(Ejyhl0XD)5W<{{aXwBZEbO)WqEwi z`Ih72zFdoH?Nf2^G3#mb-B0`1>9+6PSzz!u%=8Y^&hkD{(PwJWsGD=!dpH-VBR9- zVyngWDC#9(JpZoE&?5W$Thl!~0vy5Hn^I8#2@UgG({;MB0nfoNgeC$Y4G=nNDUyOv zsT`n?NP!hVO)2PB_xi+;XQ~yiitL@!+d}MHztdVN%^$ZZ-$a*`I{f<74Icafu&N)P zO^}FPwj+7?*WhpbJnelugWU}_U!N6RHkuFBIFN)FMtx(0U-wb~UN)B>cq!WlMA{eD zY3hHiKsGsOl>}XenLDUAY(?G8#LdrD;oaPtzCuI}?Lf2N#qRPEnX!;Q>$eTPBk*f4 zoe{gM_CHe*y@(2QY_MLLMrm`ALwiUK^t7Iy{@RhPCH8X62Z>fo>bc7JE8&#s9kM4z z@S4MfV<+_5FY!j6-v{Eq*I)@fMdk@xHqGeY%43xMuyj;+f?xZ$sT!bLwmQ6+A}q?1RZ!b?#wzv^hq{4+%XC zTSuSWf1g}cJ1a@)EVkIzV8L~oppl#CacuSOV=f2%4(%OCKmx_ztM|6f(U?Bn-{Jq9 zGWHDZW@Hd7#EE`%Pb0Og4yqPR4)(rCf4ok7=jF=jC(f-V?XF}OfeCL{OSoKz3qbX| z$g;y+ki_|yAzxT$Pe1mx&J~dyJmRB>Est81kHl__kvLA9<8gCnmJhL^q`W_{v*&1l z!H|IHGu23RSzAzjmeQym@TjJv4MVOjEdGIvsO6Uzz&LeUcNWctC)_B2B+tP8#d;v) zu-9Ga^z5lg9~<0ZCMfw#ClIekV9RLgMTwOLKd_3nCrdM#QZw0Dm2DOgkEe?LxT}7q zse+xtn}0CMxGVQBx9IhCq$KkFv84aujp)cFisMKgnv+kfMp`*0zy|=3+=9Tn=9^@V zsf`h@!sp0+spcP|JbCvJ`sH_Q!vb<)VgTCt?OY8^9qN1&7_Q`tk8d40b7>!nMHGgeXB88W7J{kdaN=ui6K- zzTk5drogX-OxP%KLIcSBPPNBP7}+TNl9V~1HD0LgDtSC2Tj z@p+iOjr62rz()b7ZN&{WYG%2fFv7*Y86jbOKnB`%JqtGOSKC8la(IawaisBUWxZn` zL$0YXYu?@JP(oD?W9hP(4N##w#_#&$~9Uocp&e^~dz3fQhqGpmlR zTv$OWqF38)n%TAJx^Ul7C3#O-Si)2y1vfX;WMqbP*`JWxq|Jm|qzlH*sqW0O9dVm! zo_AYqrJa-*!(V;@k>7t?wb4$rI3xDxV ztzWdqh|Luhqo8U<&yg?8TvuSe#Eoo#BC&{}%VmtZD%mwvo&18T5$=Ch9UnoGG*rOP z`8^ZY#7iHZuJ_(YZN^zdKbb;TKu-M-=z{Tx5pqe^|ImQM zW4DsK`Sj5!p(vtCA02#$7|3w3&E&_q1tcq>xenhaT_S@xjirpng~(sBl_uR1BoD&h zdjky0SSpFZe|l#1QMm_;rIbkQj+Al1p-i2n)Tpvl)YxKUvYNeZVZZ9e{X_#hNdz{k9!!HsK*&JVdZ z0*kFCLfZv+w6h$6wxy|h_~MwF3=8b~^IK~TaA2+Q;U}c_ZVLm>eYrZXak-9yMElcx z!``-;b$#!JUyH8jrmB#fLv{`8E|*7&bm6e_16T=iwqI41(RY3T>n0fQCyO*<<)8+G zdKZiUe`4kI4*xJ#VXX;#r=J1pl*hq?A}8`2pOAmJXzvef7}$H9iqSgO`zw@(C_}VC zLf@Y$Mqx)hJgdKoe=wlh!K`Z{q$QF6y7 z1~ZvdNL3R`OeboHvD`f+6~Y53YN-Fi5ge6c2Qe8vD93aVh+wGh zU~mv$x5`sEV8+k18JUv0pe4s>w(C$KvJPhkP5MUC=qSg)e{%r__xwIPe87v-jH3J2EXr}xk&EYk~X9jI20F=yAz(uX%RQ$Moc zS&$zn9<0lH_zq}W-k-2Vimio`v%gy2<9@y?SWGu#rc_U*5Ja~sW$EW z@$7JFsLm{u;N~1*^wr8Wj8S%o7jL!{=|Dh$pNY1ojiY{Q5%c-WLf6j#e z?0J2`gWC)8Fxd0X%YF;rMU%QAgz!|LR78$WrXt0kqcVx+VCg2GdI`&+Wcj8gMKpLO zS~!IIMXE+e?u@EqlkAT2qux&IW4Jm|@a(mIJh#QLX5IQ~+(?Vp(H(4yB)XUUKGy^%yz zY-qRh7SAuJTWSL<4}wfL;9^Of0>+AciB{f0sboh#chaH5pr9(~FMh*yuU@kQG6lqi z;fWevGaS)lA!YfF=hdEJ;vAPaMazr396ifV@FC6hU;tHd;`-hSrO#LOv-7h`vv`ez z*DTx5=vJGc7rUg#Wx1wd7Ke-1Vo3vCtJVKzgI@Qm!Jh?q==J>f)Gv>6rE-l{|3&wZaxgzS8=?c=$@`tlCRJGkf znSh4&f*z=`U>Y1G(B+T{J1(Nrk>f^aV#o!{4zDLTEjK}UOFI(lDz}>Xv*HQXj*u3$ zq?y@^a|vrpB?RdSxDB-(Ns1(0;;%Pe*?z>j{Wg2xOi`+w+b8$(a2KwAb6nf$T6SA|v`QY(z#JGJtUb zz>PVR;~>D1{_umocD#>x*Zgz~XCW&##RHrQfpoQ1R_hrt*M^saTBvcwZr?KL_I{>Y ziHDgb7q=&)ylpJ@R*yM&C0M_Em*o%v&1( zBe1FS$#r0E`)z7oCuNX4kCbaqEabAjmDa?2$v%LxwHhaf%F7=P-wxfhRL;enWi#hM--KIrovKXo*xOV2sl72}X=p0%pcH))V#PAnOU=U3OYT8Ol}&bL-14C7pUR0z~U0EGq#SI7OxD zrOFfAHga&vQ(JK(tJU-y{%1EA^0RGoOQ0G8hBoBqlKJ4WZucs;FU+G4y3AM>tAXD) zCmQzZ-saDl6ALB;C@xY#6~iEFF7K}}A1>Za--B>Uh9O#ANq%iw7zvB`$Pz=H@35FSA5 zLB-tZ;W}Rh4l(f)G+l_S>TmGo2GZ2 z*iA_H(ONfW4Xt|YL5xR{_7|y?b+`ixi*u`P*!XN#`YPY-%-IzZMYHX4;O=ztXeTmV z(SajRp}r(`^X#r6hSoPdA-zX;uE&ceu$Z*5LI46~BbD2_Xa4*L$_vH&_Ze$*Yi1B< z$IkrVkGFsx+*S%QU(Z?F%Y;isn%d*q(Msg`F>>4bJ(2bLEvmPf2)|4mT zei33>g0?5Tp1)Zn&R5Sz#PRtjt~+PXKF8H3k$uL`*!R1m8d1^-X38`MSvU>{l|Lsw zjbyBo>$1{0z_6CdK^m(B2{mxAw;pN|W9n5XA)z4JM-=Fv9 z$8mx7@bUD{YlWM+`C^gJr^fr&-EI%25%aN5d-&@<3hq5n)Sz}g5${@jI-(Jgf4>;) zd&!ms`d#8upoQ7&DUVpM^d{vnu6xaywa-vZe{yFR6CGDy zI49SLM0)nS1C!g+CKFtUV-|)a;3D9Vfa#+!vEJHX&7`#3o~K@zueDeTF7w8Vr;iMl z)~GXh*~G+QdT4h{z7NcrTLWF#(A_KWIStZDCG)W-(H(L*Z!nk3F2F^QR5*KsYkQUv zzu>WOemSve;{#ctIQ5TgYyPY>j7a5xFlV=z<&6Cq^DB3&3Y)Iy<=Z>LG#-0Cr<2uC z>Z;wWQ}#Cf@w6;*_WqATU>sp7Jm^1+hH2mY!tla`3-=Yu%266X!#gi3t;e~`U} zr7rh9c{b;72|u_VIy4mFbeFC)*(%O~HUf^g4SI_k>W_1es+pJ^7p3Yo8R&s1C4nxu zM>4)bEtXyp4|&a-lA-C&k}lDZf4t z%$-9?H@kijiYL}PA(s~DNFY$8l{$Yepkif24zSfx@YN5}(Va;C)HG!#hfO-I13}+gvCpNBgZX zApO9yv%j;gsl9#IFFi1_I z(SPJh&0V_$#q%x2e?L?%+UJ{^H_(YySUjqB8L+F&0LCMT5iM_v6S?~rywRw~kJnm} z7eI9!HF+6)*aENL5)z_?E|R}ugFA;uVCQQYFqP&x+M$ zRDr|$RJa)NjrF&TL|2i)Y^HfvjLT`vuSNq?{qb*WBMY^RZ^6=#sw{eWYRbAMYC4jeb3OFL&Sml z=NB`o<%Vy)h;Hhv4DJuF8^bJzlj~IL&S(1|#*e0~%iT|3f(C_N@Isy2?ufG9e=E&l zHF|jdz@eaBC~P~Oua3IMYW*#Pyzjt?&0;km;n4%>rInZ!y!eM=9R?@A_x&^R)yX40 z7K4V!EX+B9KHnp|PP5SC4W)j2`iL z*;^y-9t*o|y#ou*WVH4ummP+mnqGh(Z&kMcEhz^1mEBTKv|JT7!nLdMV|7JWC7CVL zS^w%N<*|)skqQm6{%F*wBXj4lTKMB-c*ksz}gm9ESH`L#jE}czQMVfbg z-6!@oJ00Cg(8e+1HmtX}m-rofbAW0#yB!9@NXdwvRA(VHLlcJ+E;s6A$|DR%(HYt( zgg}E9PCdYN*mkiq=;vuNpUx1guyCm8MPl;-NF?80i9LGXQ(&h*+RN$!@YKo-@tF(c zE7zhE`?$flZi8Cs1j_{)4yDrkEj46LN7DEl$++P`{Y@Y|5a1)XQGQl98^E&}#b&86 zG$uPSQNnvvWEn37@z~VVH|W7Gw0})s!liKZN-En8xWLCqxa1|=Q;z5hlMcRf?O@~K zHA7syN{d_wpHTWY7htOoqovc9?PBwEXL;_VshLGpoUVgFz+alLhA`5j+GsVdpn10f zPJg*PC^ByU#Kptmfty^5#z%Y@RG}o(ED;H+`g{mA(P~HVFuEFo+2l&eL6szB;x`Kg z6szJOgM2^mxmmm9u>P^vT(04hnhm<=DLtqwhj6rGZ7a8Z51C}~NMvtltWQlEUw>h+ zW*uPPE7NZDnlr?Wl;JNqANMATvy7+9IG*LM`F*8ja@baNXnD|gXlf-toGA>T!5rFH zq-7NTxIhAW8FSIPT}|TNLOw?+M~qwwraW!I?b+O_UR|!gtjHHVZ3f$`GtIahjANj_ zD4nz=>etAU5UDnqe1n*CjBAg5AnjPaY_n2hoQ9*AB;ROw?(cBvwsN8r`o*BT z4ZXtPmPiV_%eUK{H@sCvpEX6k?0pdO&PP)@_^qDypzw%K*ab@&j_|{37;ZFQ$6B9V z@|UhN-BHU=JpG7|6#I;fr+cL5G;?hisfp+g)fLNW)!)VUq=S91f6?C-8TwK(<)Pj1 z({1!;__#u^kIQfDQ%qhBJAMfFTS~Lk*E{*XDY^ zaJU`KReETcBo2B^S2BZfFkn@yEo#oD1px)G@scCuJKKJ-ahME2VS_{$daZ`{_Iyg+ z^jf8F5QmExO(P?)YkHn~hNAJcue2Q-t078{Tu66AP=$FI_}dUiO(#^3D$Q0t*K5iw z(_9S3Gk~q~jB+ALsuT-K#bP_J+I+;DDT*txesB951_KE~^x=y+JWVve8)*RO9+~guH?0SN8n)pg42q2GquiXh zH|SndH~PjIDfV+Rr(AE!NGmPU=sWv;(QNUI-CgP6J>jT`g;X_;x}a1t4?l`?t~J(}#6nuZXQlE=pTu42cM8OZL=_6rj0e56{&JiLq(5 zeU0)pvIZ)! z3gJn}N+tWq6MoxRO`?#d;XIl_buq^NjM$b7rdf)uAiNo7n)U~yu|SyJ?pNtL3oodB z)Qq}Zts$dmGCT($PFQC@&pex`hMn5$+$g`+wuo?%JDkqX46hN7S<4o*)QSu^Aa`~W z3D!SXjW>1J$xX5h?47B!SXoilXWi+RgpY+-+D=aI;PzZ43)c}?9%D^6HGvDIGv0n< z7XiV$C}BexneikQUd0H5fYV+)~+VaY=QS-wj3rCX(3!t>Cc;)gUzU(-MB_kF|KoMrY!I*M7^%bgjaexNu4}R8V*}qf^L@{ z_ITQ=rQZPR5fAV(S;=RqM1X6pEPh)TATVuSqCk=!?Iq0>JUa@KbljXm8 zW7Tl3o>D5;N|)-oNy~W?dAe&uZlHlhN4iuAh!9vF@JKS$1C*rWY6q>QO1bHym}&@# zLCwKVmJ*tD!2uJ`jd=5hV()P~eI6tiEu`{RaJgYx+n&UC@01kMzRE03KGg#9IuUXJ zXF-DcdHxp`%q2Gl`0`l{QjdLOY>m}~YFqk?W952{G}*MIY(I_iHZwE04z^n_|r-umlH_x4YhxAnaty)Tm`V z+ot4v##CayTDI-6ieF!+W{=n5uehRzGSqi29*isq7t$}E(cE|lknlMjFN1xrSFFje zvW&1pnYyLjLwm0UGxq{L*CKWdYe&zko}tzPqL}Mxwu&1L9C8(! zxGl5YJ)eJwOnob`7hr_veOIUDo>Q!h<@9?oYprY}5MiGlkS(X#|4GjFMA8|k^PIic zQ%l%1k?!Pp989k5Xr?s7e90xpew;J-w##jQNfZ>>9|R5QaJpHB>m<)mV6m zWM{Yaw&MG9Z^5Bfq(>qpmTLN0qbItmwn$Dl8=k*f-#fuUt2oW~DQXB5hy{Kx-z(GJ@ zba^sY!_bX~!DU(I9HB{IVc1@rZ{Vkz=mtMXh7;_6SP1Rh-KSJk~Nje#X>;Y8li!zgvz$@q%F|yT`kj z{W{`VoncgKrn(bTs5>g_lult3x@XR@`P}kLoq>H~S+nY7>vkE2Pr>Q)%CCp$(kAOh zD9fIzs2aq&rSD(Tn!gO?7K@(j7cT7qLDZ0Fj)NXU;1QQLq??)r(@Wdo6yaCNxN%KR zNB76?f!E}Ak>YI)YI9OQp*L-ZKnw|9nx%+5R%iE#1YgmUB$_$z+e;qK3sT2;(#^jM zy}xrICcZVFE9A863g+pPVExR)MD-zj_utGqT#_0t-4io)N*L&_>Vsc75fFyVXfC@sDQEEQ1?Jq$~7!Yq@~> zv-YShunBNE$yl--lTJB*5?X0@{aFwJ`vL)M-}Bu&i+Y2H5?ABUSIbR5__ZrW@{uH= zIluFyi~jYo@SusQPhk#_fgr#Hcc2wGpxM|us6H^br5~Df{%Fck&nv^}t@ZPrEfaII zb{!6`OoQGwmQWY<=`tnjn3LHXUNdprQ&o;_UrwboIzWTX8!`=6w5IIRgEc7-`oSa@Q*c8cxk4wAWy;xb}8`zsXN zy{49;YksS4N>HC^Wg8R>HHb(dE3=#HxJ+%-ZDh40OC+!5iqtv*VbV^8Hv-}gGPug$ zBDk+{hM*uxKCwZR|I_!)=6*=&M z#e&;Nkd*)bVmLHkdUByW4tiCAFx?_%RF&N9c{-KuOU_A{q?2ikHaL~M;_BX~4=$n0 z)yxSio$|tde2|(|lAbKi+qoi0$Z4^i+~rV;uPqWwBK?(qIq#$bcfcgW_S-;SrT5qY zzp86wsOWKQ@G?22(Tj04sanP+)rWz9xDT4z@^bs*+rQ^PN}mD7YTm{EuhtX`NU6ua zKW3AxVZVtY_$}bEfPutA}STb{7ME zXvN%2d$k6>?oCQK)9p!aqO+{xa9bTN*7Dr49G{*5k9c={H^)K$2evJnY7W#TM()|c z%UDy@W&gTS>hM*|p^Ps{lO`c?CL3u9lx@_1A&z-8uO~^$qO(^+B!Ju^$~fbfOOOF9 zz+`}aNy8~H#TAp57B%}NXGWD869Xl5@9*2Iaz-(mZL_$Z#DBNj9etOZb6=UVfEdy+ zk!331JpGP{ku5~Xkx`CCVt_zaltg#6V*pA;PXb5l^<*3L?G=3*;*ty!7gYRTjT#6T zR(f=Q=cO<0OC>{_HCPmKjH?9)Z~D%IsjZ*RQ7y7x7ZN~bLSS7?HL}Uq{+$E?_1Nn3 zBa`baofN8sn8cupXFx z(SWlQnP>*g2P@V1w?mbBOIUXz3|>2-X@oatEPW3{S~4F_X42j{b$x^K?_`7K@E$8b zi}d<3Eifc;&Qaxouxtgr>=t1>dP)^hB)MBBISQ@3KW0Alm+E3e2N0$d4h*NovA1@{ zm<;5aP2`nI<-mkQBf49MM;-!3k}9mG-qY!{aLLX9OxP7JEg7|^Hb@7uKE3;2A33Vz z$%zZI-v65mxO?^*)+{FxHGO#p?j>N*THtkuVQf0m4r-|js zjhmwVz|rrmLkv@7LDDe=DLOD`Kl>VC&13|Gb!N=2q z-FIpSaKdA6o}OkTGK5+HeVp}4vjj_>%mAvEix7U@z^a$vs~ zpyrTRW!(jO#x5u*NdK(|dV-i8S$uy@azgM0ulQr7)PQ()+4^hoH?d zlh!sX!XNY?d8zoG9KY5A>}cD9U69AC4S~3{FCJ$%S+>}Gf18{nuk1yZo=`>u1fsV} zP&~1M4~Fi0rO7nd2;<-s!|}+lu4eVf<>{dl6Z>a=Iv2_8aM9F^#W~a7>hS$TX936} zDtZSTh{2g6A;Q!2Sj1(BFn9#Z#Z|*Q4rXOY#Kds!#P#xyO`7@gH8h7a#lc)NMdrBD zc&zQ;_fkWzH}5BKe?qt6d|)*)N$l?FJq%}K@5da9^H<#d(Iyj)XQG;iB!R^kfvAvX zsZ6DTgWBOQklu^s@j=oWwHw~$j zfDbM7S?bT*N_Bd0o)@YYpv4DMMnEaLG8vjiRfgLnv3evUL33%lkeVr#BH*=7rv&Kc zT;1;VrM}bxZGoe^B$1YJ9<1q5T}(GbAgWdgLR zS0a)^v5RFUMdUr8!5QDf0=}Ct27_Y@EExhFqU|(yGy$yJxiOJ%zblMKX2+pLj)r_R z*IlZ;>82V2=f&BEwW;e8!`l4JA*mp0Ny`mcYmvHCV-Y+w#x09aRcQ=P4J7gW)oTQV z0suPfw&7U?UA%l$9Ccu1t?T!MhsmMXny~X^VXq~)16_@HFV+a2--<4m(y7VJ145I> zMhE6rjnRyh6aK zVfZ0D(i({NAGjM)tMs!8RyWyQdhKH3vdt~iSoP0g89lTr zCSJLhWUC!}SxWD$$}NW`Q~g{e<8{vmKi@3%?*==2*J<d}A4!IFv)i}bB-gwOQo=@ta#jCmjfBVHp?N4~ScycPXQj5J&&jJ}5sL4k zUuAZz?g?8>e~{-A8W2f@$cHDonk;;ZO-xN5arF?(sDb5vbJ7#UWYFH%Q+Z)*S?6?p zs7fk(vhd$Rcn zydy=wCj@KmQ;VGQ?aR@{%%i;X^Wh27b$qQ{vOaxJMtzgy)d|SUzQG0-7O#`SHK{pe zA)4LVi-nuTdi7*gPgnrUzx?pNw2G;5pF4~`Q-t^(cyD65!h3_HEw0Rc4*dyR`tx7- z+(=sl5WE;*A_Ax!D3DLw?1W;qL4%5B7zCNKYFN+4$u60m&HLGWp6gslGTbK|-F>~x zizn-8-iHP0e)hevl=FQ>44juzI0gddV?Sf+#QmW-1dCb3GYvmXH9S8~4Uq4?&LhJ& z+>S`3tHWj76>f(&*lS@~ZQgBO>1f@3@pocaQy20y7pKdmgoi_&Ts#ry@8)c6Myc~u z?_H$dhGU_shc|0mr+R4h=#S@$!2b@WytJ{E;mh``Y>;`W%!eeJs-Z3XQs4(h<~=5p zg3_5@66>fLNwiN^S(Pd!nMyBWYQT%WxmEHt)G9Y*x6E**muW4fHHdoW2bWmtl z@T7JzIdPGJM-bd>_=c2F>J>H}izY+w53``m9-9ZDZZ?=2+m4&8xP6BMVvp*G$dAlp z1APSkR(|YVTs5Ztemk?V%t7$PmXeavBXenqI^w8ukQlxYpVr^73{)Fo5*mc1Y=tp3 z%talgf3gk}v?Y=OR10d$Xl3FDC4s+^A%LxJHP4Yt6+dI;DN%D2ryOxqD%RYt%>tH1 z<$`0s?$3*Txr_;aP8a4)6~VBEp3y|fY?Q#`z9q`{*!klCZtLrCX=NDfL&KD@)cBZ3 z_8Hej;|DnEw;3Gz=oi=y;R`)&9~wR#+^W?1ePv#oJzna#&B=E;bCVUu?K;}!il74z zdnVJN($Ty4o-lN0L)81bP$MX?F~o-~9VQmA8yxQVIN_hEjat!FPDpm~Z~3DX(Y~7D z?%;!!cn*-YyC>apoLqiaN5nq(#oz|C!7P}f^V+>>t~ zNa=EgRf+B1<_Y$w4y!e_2-7IKkm41>P=QDLz3BswfQ=@L9LxZ|K1TQiO9(65O95OPTuzzDN~S1+HX?*3`dO&GozxswoR?-muaf|D1Y7}TOq+&%FQxT#zw zOsuXR0R#t@jTBXfehn4ybX1=qJw#K&@8J1FMhi{nA3p0?cowkKw%CWn=%;(8$KHUg zb~Pus%3iMS@@j_(_39Zo_G2a^)x=DcXu}cVauH8`vE;VEobkg16InkaZFf&I`190( zvS{>bsPoQ{tY0@^Y`|hYKxo}5mwY_eO`Y9e6ciAukz*(M+T9axnNLkum%guE=P+JH z(QUp={`=Bq8!=MPBXu)nx#-i|mUgZ=-6-VA0x|kLXojOvqrV zgC2*TDNouP2qzKZd*jQz0PPZaslCTL_P5&YG#z`Vrzb0KPLpTA zPt&Fp#F@tV2JeSu#ma*Nnv%OJfYA~I+5;ettx*8aq!{Isn)A?O6m_&4KOQpP>WaB z(EWKnBua4gS~58V7`nB3m^v>v)Kbuy1;WdbLGfxO9KN%K+#dt11Pn0Y_QUDd)v4yX zP`#ia7%ZT>!YuhH|Bju&HhKHoaYW*jK+dAvtwKKMtrYWs&5o+oZV2OMl|%8PbW7FM zzmM_dx}op29oIOs|C#+&Znz)pAr4@-3n zb7i%<_V-e3g){~1Y&e+$b7oA{e=ntSg}h6C*%mRd)lN8)r!0{lfKR8O0S{>>74o^g za@Bf4Ztim}Bd+w52&$mrpn$B#f)Eh=$Be0JV5AcH!Otgx^&1X!%#PCiXu(4SCSb0x zis)X=Pb80qkg0GzHo{4P8nB=AF!J;nMMyG2UkZGz%+C@nV%Um1ih#%W7kGVFuKjgU zQPq??f`g3YNdL?yRSS&aW7YX{>{z+Wvj-$NOqS0bMf#PBGzGGd?qx){4Iw*Sc6YOS z)T_Hi0dMZJf8wN2TFjvRjF~JHSYoI0I>qUlBvElG!Ny*#$cph&DBpV{Icf8@n%ekL zz2zFt9}9rgEUb0{yj*q6Uo(UOR~OTR$@f#lp~1_2eJcbwKar3aC9F{AM{Oe;;{?M= za_sm~cvM!|e{dVMzH^%l>>s^>-)TR+)zGJDqv8H0_-7phJQm8U5tBmJu~w+4z4rf! zBr3HAeXnH}`ZUrDH=)&$%%~(WWWwINE1WnjuuA8^SGKps3Nr?^%DY3vnjrLr(V^Wv zOQ$pU82_D)byzY>x4LnuE9k1ZT9}ctFS6qDrTrG<5fGPzwY6FIsMmX8TJJp$+StZk zlu)D88;OsLXU7C;qzPY)6-)fb=qgC%GT}x?Q@AU1Ct`RuSeRKVJbDV7kHpSAt`_E8 zHWxs8eGw_qBr<%se0STDhDJs^@S(Ax*GKHSGlw7VyMdO?XG@3RhXw~blfCzV%2WW} z&XPOP_$JwvEzB0ljic?~T!1Sqd3#su!}*?$sLwl^Pmm;XyTa*q6&_pq!m18FC{KC{>x8DM3bDe_|mE3=Mw4o^w>aq7s{Iu|Svrp#|})qbj0n8Mbc%m)+~ z6BI8t6X1&+WXuGR$afT^*}aR%pC%}hjR*igx4~ccM67RM;1tTg4CW1DA>`y-2-FDsGz2o(#(BDp&J)augMISiC-OXe z`}B15L0etqrlT*d#~M(w>K*1x>)A`4b3cD?43+c5m_5glg-?bHzL2*14YfWDk z4IMr2m4^#w+3wgL^yr__rbV$oevsd~#VbqYPa6(Ccf!zcX`_dlSkv)DU{g=bjOTC4 z?`s0!Mwb0g&F`Pst=Ig*uB4jOe$c~3q(v4Bu8oj-<^1^LgQ?76EF{+y4vUmB;gBZG zmKrhnp7qP=rk`Qbrt+_Bq95DIW%Y*ZgQb3nUhXnt^z6$oU$R4&@(pvL*N*qU07;ef)z_mz6s?wDn&EqKN@amG}) z6HEYK@C9oNF=ltBZnaM+GyjRzFh3lb|6{%mHvh{-6Cxg;9bKVHfyFaV%k9J-$L+A< zx%U^HkSZDex1x3CBf8a`g%qP)$A-yngXcKZA;E~lyuA0zL$wyQk6--T>M~-Vk8k-a zJoRRiy)B7q$(d5yY*2A-X4Z+%Iw*D4(GQIAMRpT(yyt2s_H;aH;VXS|%G&NH0$Lt7 zjBjjz`pqwO+R1v$JPi#-yB9=|$w8rfs73OsNHq+xQ=qTl({HxrXy_4fackdmxy!zl zCoRM)?4Ikn%tP#ro>^S);@3fYOPL?^RAmURVy*t&!u$U*brx<-hVA=T5NQEvDG})w zrBh0glD>fHMr#YIn~KjK_OqGI z?M)`ElzA_bknh7Cxr)0Z6=V1%i80=iEg?*oPaii?-uru5D-7@K-OP(<^@LM>=)j4V z+*((gsx&5q-D_il5o=|Ml5TG^Vy|FHTXWy#Jg(vVRMgb&-45e9j=l@N{aWaAFe1$V zC{3`$K$N!80!sT?+`}mq7B?gnl0WQ!5z_atPH&xYkZRJ<;E7zDzPLKJ6$pV@JU`moXP>FhN$Cm^~h_A@te(F9(AXBg<8Tn zH4qOc*W$nbSY!UqpE6SxgPta$Z|@{LuOGQ`mYBEFZCtnB0)N>}x>7Euytw5+6zyNeH;@V z`+Aa~pM!|N3{6=O3X+y__y|2(8(d}ztwWPiB79TgXn2J0r4_1_R zjPGbX!(%7Chj({&R!ZbH{bpVJy$?4K!p-)1VhPABo2z(bXRR`-hm-BJ=SwfguS!g2 zVN*|jVEsLYYZOI*_smuF8Rwk$L+<%}_i|S34oaf>%@y3qxKyGH*>o%wRR`uW@WB(C21}eG8e^R{qxeWwcqj0eh>BXQrIi&{RDn1RMfEb zZk+utJ>45Ux9Q1r%{%t9^V-*?aCxWQo*?T}7q+%*9LLPVSTk?p*Sd+ROzDW)>dLTK zEAP|-@DLXsX9a??4;19r9X<#h4ui-EcM>O}JPpb}Me^ur{xHz)?&^Kz#;jxTdMRL& zqYb-bKJz#&VPr&eBvXdX0L*|oy4bSW*lVsa$$3O3egjem1PXL zn#*EC480PrTE~2T>V|cisHx+&d+?Q9&%#0=UexKWO31`>IuhX#_c<(4);oYiFBFMy z@Uv?f86lGne7vU^vAsl?r#OC)Bgk4XV50XhJ+2-YMdZ`yHcP^%Z{X4T){Tv1%onMu zJ?-aau0IP>0l1W;?36op7DYjZdJgS$MZK@mO|vt(R3=r~Wouq4^DCsX;R3R4mM#al z9$8o6bcFG6loWP`%|68w#VxUl-_;-X(Z?-&~N)HALa`$`EazM2e`)=O1d-5uO zCp6;M-JmjQ^fOHIb2BQpZY$?Ibr|gI$Le* zf;gEzzUzF^qvwNTM~s-XRcJ;@)0M6F!0#Xn;RA&$+U&)1GqOC493*wwoP%YErrpwJ?pKH9xV@_~Y zN$(o3BVC2m>lgZSfAbmkl+E7E#dy!3<`dUzmw%p`^SXMLK3H*`;KU_^VrN~c5KYwl zagENGyATtrMV~Y(n7RJqZpDW;>n^@Cp!x*NCZ#kf?8voVfy<-6s^~Qf>K#DO_pNAhLMT!2RKt2>CZu zUG?wEADFa&IcrVlm`-~*UeS4pSLXui678lUmB^*Yxs8ea=SyM=!44yFSgyqMi1l zUKam5##ua(u0TeinX>Mn?P6DXrpC939J;-UE34nUUwt8ahO`_QxaV=Pg!vVSJx7iI ztfEkpr*X_H8& z&LgJE^9=q<<)@(S$7H$aiuSg%+F`e#sSrfEG4hjfkS)S^y2QS}u!#E+0{vF9#Jl_M zJ7al+(?RazZvAn1n0hYw_Wm4e>iBa#W4Z=t`~%Rkt!bm}hlTiC%fQ$gT?z#ZbCcIP zUVC6I7otcP?74oPzFc)pdE+(Bod#H)N@vbojVjDoSPe_^w!fFP@uU@aLb1JR)=phj ziU$`GCDw#6xvRqZ0CbX&nlCV_jg8Ql4$opwV%V_DNza5omSvffk&iC(!19ovXyld4 zY#VQ)+*kU41!6Ugz1Y_KXcRF0h0xQ4v=U-f9gY_KAB#8~wDq2?Vk%5mH!0GXpHQBxdT57iVdFZu6=oKf=}jl=KNy0_c!ikIH1&2yV;GrgEQDtrTt>8jG9 z+_n74c59h*wI~t=#`2o-^Wxd#-3Asv)u;JCuk2O&dU*8I3JcqS{wi?{)4FmB`I!m- zcVim5JlM6!VbIZPMtaYso}MOke31el-_{v1MJ45VkQ}Rwwqyl$is~9KHA3w*r$HLN zn$5z(vglf#uzwM7RwAHq+4rKpki`W5at-p24Enc8Rg+fimN?Q9Dzp*_=~wD5|J`Ud z>gPB(T)CH+FC<%@%G1&N!+U`op{cP^B>iq&_qnC#dmV8)c^ZOnsvM@1R9sId3tOHi zo1u9NME-+dh{$T7L3C+!mQDckWSZvB5>q9DvLFphi@BqB*^}E3s^pV5VKv+5iQ|ri zCHn(2i5fA6y+$+qsd)+x zU`Mtr*T)(R`d3fZUkO;lDI23LLf>2OoQs!~VC0ID=PVvhl`!c_HMcC5IE09MSogcl zw1MOT_RltFb|-kHglG*vxy}t+jcThUKTwZZsI*nzc=sI#BC>nq)|N|i``cr7gp7!> zhDDCPcQ8hz%ZIVI1^>wYv!|`S~KspPg|nb{y+$hm8}~MX+*~B>pVxXS_+zXF!|0W zOc%PO4xN7HmhXCt^fR7_Q{hDpMxkmUxjane+~8#-$qFOuxX;1WxRz!lN7hq3LFP6| zoic;Q7+GU$NI?iH+BV(ttx!eFF<#IkIg>&|<}2_yyKIyyM4m_g(*o*UydPhqc7_$nU?tYmhXH$?t==d0^zWZM$qp@evi)rx znJeQ#qd88nJSgfgt?1LjBVs8{;9r@M_NT?r*W&F`=5ZJa{&Ho|$vL;zru+1V?Ux}z zcjvpg_|{a)Og8N4b3h=OcTQRT$+sQzme}0XSCw|Dx=X5LrO~X}L5G+U)1n6ltw#=& z)8=1pbYtQ^MKI$QStP8ZNXO;ym!4Ni^dSb-50oYJp1w@Ce#`owH|0*~E#~S%Gz2{$ zX-E5!hhj@D#!i_N@MLQAW%1~}3omS2J&Rf9_Ap==tmjdw{v<9gEn!gs+G-R+7P)mi z^h60k>!!`(Es~TyBs!lx{Bjek_~v1iRtlBbLz34H@4i}o^j)#meU1OYp?)q5Rw8I3 zMq1C$8v6Aw?33yZ-iVcaFW0wX&`_cGz{ptD)ZMQMhkYi!JzO94vw{{Uv}lT~)N|ug zv(m!S^3&>NR%4FjRZ68fO-LU=QenCtkUForvX(U=!wW&L{F`;aUr20|dgB-Zm>2Pci|cM*#)N%R#qPnX@teY`=!~tcs?w07AbX7FT;rdQ z1Zsaexa1ITMMZxhaH?f+(N?b~eS7-nD<-H)N-LqSUj)xMt&3xMed*AU7-6w&XeI80K`_cp|e z{#ac-km^xs_CN?-OX8ru6*zE6yN*Y|AinUikj7=}fa7`3i+}(~-Z%%cov^Jj-rFWV zlr>iI%R?{CxJfUE{?d0v(y56*?b{C&;c4IK`CNRfC(35)7Wf3ne=x^z{1A__E~D@M z3XMv^YLw)@Ru{N8e|UI^sh~E`BNduD!t<50(n&c1_A-}6Gg>A@#q~IH#doP1=9iEI z3~?!HuS*oU9mo=*BK+1J%v|z*@$^?S)?pQw(d>4}nkPG31Hx}(%`@~FaD)zW`#{i8 zj)`hpHk=ZHS;+uMeM8*bf5;H-qn|yua$lD{@Uo3UxBj_S+wsv=fIn7DGwA1A)5;sf z!q{}oZ;2uKjfQu_L--rTjKg$z+Ro);dV*PlV^`1eRqZ{E-YXmT{~l~MjB{XkIF;}s zJ(n)eX_h$gt(2j>YW~wliXmOmb}IvYRH^ZlfwDqvg=@fep{EGEOlwIxDa`kgFO;An z?I&WDoP$VWDrB$lWd=9wajyOAyF;%Zh#F)LvjMq+Ap{q61q+l38_(wBo>2Wf=1iW* z*U&Hhqg%a#;}~_hE6Cx#;}?+>4AUTByD5BD9LA$CqGQ(NApQchc^S)KE#UIy4}Q74 zK0U1eliv{%MK5&{CUD^}0Px50w%91eaOBbOU^=ciGj<=a_3JAa5nK2uO~Ry-?t zKSA+A9uYNeB-s@;uRuqub z)a1Wc>Abk|Yim+QJLO?(D^N8B{w$m~2DNzinJBn4E+`xcXD5M8QOkRyz& zg|#sx;9keYk=9#xz_!)cnlb3@k-oe4?Yk%BMiVCroc@vTQJrY-if?c@J_RJCJj7sx zOK9y+i-#lg{EjAi9dgJfv)TCk^}bw*hL2Y10NMHGE8rBSxiZTMoug&4Ll_&+Q*eQw z?hpu2uW$eAl$e3Bxy^NG?|3DJfGdJ0sYM-o6#`Z^gUf2D`Sy8|5{&ZFqb{fK`Z-O! zDzow1C%g~2!0GD^Ep_{O=8^U3d&|~1m}hD0#J=}!VxMWV=XV&-OovTXSi;Bc$eBbR zkkSbWJ&}WcNy;Nxs`5@2EE)*sWbTA9p$VT-)XlX2%>oZX&tp?hRf8bJ9@Zj613NG_ zD#Y~SfHLrG{t~@_UOR59Xqp~!dt9vHUDm#p#k&pHy#gGf zUcJlf7R?Zw&sk4*ejBS9swVE|t8~Z*VUJuV`qi@aa&CFs%2o-v(DXEI7hid+mNz0+ z9eXlu!TTa!-b*EBq*(_YlUAL$8wqAlt1JFQ`NBpmC}f%mJyx%b>FTvcmX|`iPx|F~ zrgHNAiu@LZ09)Y3zQ0wKMoITbZ+^6lQt6}xBe zPmXBT6RO!b0+2&_yLi3 zI--hSl1UYV4c>VRKI$IFq9=uwZek5fPn&H^7Q9xh3?hqPrO#LTWAuMtwx<^UPJN5z zwkEsFRtst#Z$FmKxhib`8;nb2!Q%3qPj^9JYhG?{rr<6Fpu2WXmCxJ6SLc;oW701b zdRnZzob6N*A{-)~-3B8TQjGrO9c2FCKv9pYy+?pXDqBTwLKdB=;;dDi2Q~OBTBFh`)0okn~@} zVI@>Ow=2V&+TFyKo9~JL;!X5b%Avw!*tq+l|Le4vXB_Q@;MxVbAXpH*1y27=V6o$cD7)Q(y6KXvo zfl=mm4$OlBq-kYBgnu`D^Zev&h2fclEGu+_GoD3Z5aQ=?XniA+`RS3a3#Ca`EhYcE zv2Maz*3P3M)K6u&Mb!2%_jsjwr;wxDk9G_ts?| zw$1mSwzV!R6^|Z)Bx zT7^X&z^T(Mycz_8YILjifVh3TKQoxLaY?;fiEeX5-I1{8{ip8U%Q=nj;oix~$bMky z@1x4l)I&xunZ$%7#@~p*+CKtlE0Z2O?@RE{-p!nt*zeyN0#N%UW}M^^f2*rRvP`ut zs

TdvlgD!>GlPV?YYf7)HucPVn7Gti85FL!=_Ej0?v(o#0Z5qn%aXz}C$TH2RK zA9JLry~p6u-d25V=1aY2{MKEog0-2j<8Fax?n|DHiq+`+Fx9?4Wl|rMV2D=;miJQX(4|T4V!-svXGK4Y_Li@NX|rMo)oShO&pHV6 z0K8_>ail@vc&kN;hlD>1Ufk8+_-=28xbMi{2v9{yI|z?{mwK8nWo9x?x$}{vir%ev zG3sw{pYK%fr4z7tGh9WymXewS1R3ymT;4!Td1%X!ml1JiCZ0gF0q~M79DS_s`iT5( z&reBBEf}j$0^E+f4#T;9Ea@$thDUveyRqvUxgasmXbBt-7 z-`x|G#AUZngfrSv4GoMuH+q*CuMerN`ADJ_q!>B`9k1e*5AIV3{R1ww6xPL|fy_mieS zoGr4GsFKxga%`MmmU?zdGl33Q`Cf)#8CdY+y%l>SA^qOERf+YkM)QJYHtjm{1#GNs zH}}9tSK~98xrqvDiAv)hIfFGX_%iw>)z*mYdizm)U%${~8gtNuzIbk&L&^=A(P{7dT^TwU7Jg>s!OB~{t;5Kil%D$Dzwae)cB}o7BHEM zPX1xkWAmq;F3_H%=9~7=VQBG18SEEp&_rk8o^76Xm`lIv!PqQ?L0RhiW8_Z`QNn zAzIZgYs_r@1Ox;OJR#l(fCl!HkPRC1xsdF<$L`rV>bui&gI|f{Qx6li%Mv9X8(>ls z(ReqTi2L+cTC0F_EzOKe2|6LOu%Hu{s86M(L@6Y90w@|ZcH$;omLqY}kVq@PvFD2< zqlbgJ9HefEw2wUm?v%twTaCBP+Kt)hbqSKNd|{~QE$|4LS#=Keaa3Af-by6);HZ$nE&jR;BdOVda^HJ88?Z`8+cgi zC3~^liZ}_{d!}=;^QUWgT%PN^vJ-@lQUipMUmGQKO{<@d_KWPMEdxa>I`$rA`>a++ zAD(;dk{crvvnsm*yu5Rdr)=*_&mHjLK`8?1qN!rP4=5Eq>-2e~9loIWPC)e-aU5J( z`<-u<(RYDG4F zFfY=(k3lb}?f5{A6-M~$mmZNq+tQ^oDZh+t$be3q&H&rN@7Kp8uPQ^?UJ_AIoXfB* z-YYkMMqwFi*gts01R^QtupfH$m=zRuBHs5_?-)jLTp$oQ`A|(3;GOrl#`S( zJ};%>K@Yy#=Q0eosxJu`|5o9L_TJpO(5X8H$kAivtN);5`Iqd76gXeHX2Ll;o_r$x z#f(ztYZlXRT3Ta~{c8*3N+ViYzQ-t?G_Z4m=xI&?I5bG_6OofCVf6dAmQ9KHuxZtJ zH=CY*RStG}x|o>i7aFnD6517@H)0Qm_(TlEOa3r{5KW0Z5<-P4nb9#Ab|G;RZ*NT| z!Gqivzh9Vb*jiPl><`)fQM?YX6kUzYv;Fs-4X?vUtJ!(wZSriEZP;wBsovVeXTKEr zT{#Ll88_KZuCD%Na}&w>Um!{OPPUJUV|mR#$Vur=d=fzc4?U}%Pm^vu9VfSt(1RFa z;7i3T`_$;ZZnNkQ9nwh|Cxw{=0R^$%U~j&01>;z+16gWL$iuJptQ(vZAm(VEK%z;{ z$MN2pz>8RP`GInuOtzTK<%m}h}^oAHmcd}84oXZS-io&K8;oV}zxqSR{MVsm1~3|^quKlvx;fJSn{!w%qfJwGWgL#4RsSHepO-04 z-hF)@EWI(3t6o{G*WGX0h;WAPWaZ|D?$5uYc~h-39r2exMKpYVFVk1lZ-|VEnFQxM z@>rAkrjeXKQQ!7b{v5$y)rLOo9-d3yTiM>St_>3Gz^*X?V3I95T>&v)3GG^#J=&)h zj2DhKd1t%wfKG}?GU?&ar{ZDJ;4#@Ui+Zj+$(u3j=x46e>!dQw^p^#rR7FP=PcMHn z*b6xaa$TLk+KDOZ7AO?1G`y@r6leVp7GhuuH$kvK<1&kgGlgqAm@@<87=O61Xvl6m zjIsO+(Vhfe=q;ODt*-mhiF*OTlq~x|m_&-9)BRP@#}pd=v}_YEe;JKc*$Vt9ew#t( zH&lBs+c}RvSR8T1p z;g-nRUEA>PU8H^~J)QKlSp~vwbsWV*v$6KoH)lb%qAB>%%T4J|TFPvFO+FWe0?UHwLMsk z7vz$@__DlAeziuwstS#MZmaDfJv}&zj5R0H^Zr&t$dFPG+AATRX|dsZPIuoN$CZY(hpda2u{kU z<=-58&{$0`K6>`hjxw5vU~`c|p?d~HjT!drM#HCBv0Jf&_4yuya%|)_m(Mi|zYsBt z;3a|(W#pp@;Y#%e2?^f1*s}; zP;#xoH|PBylwMICB{IoTSwpYomY_JXHx6$|ZkqE`5$SA@bgllv&9$(@*U`T?`jPRz z+DfTEoF%WxS!V4H@2_0Ip7a1(yWWGmgzVhjt3OnWp%*nGWB)@*oO+__feMS`C&-Jf&NWMiO%t zm{x8=%xCkjh%EVXwYe099zBEGoGt{Oel~sb7nt3(i)G#>s^ zf1)6SNx-CuK}YT^HZ=<}^&w+P4DBsoRTDo*THK&sf2Z6aLd_-rQI!JGfZZ%=fy?ZVw_AVij+#B~WU6fQq%V8s zYOFqL_SgIOdq|04Yh;eOaPy(;Q>hxN29H^XBQK%FW)2qqw92m2@_FyhV#fk4oYB^w zdO4@t`JXyjz>tb8MoIYOq7YMA$c3NsxV)w4yW=}gU4AQ;b?Ifu?OKzaJM#!NuUaq% z+p*0mVnhQA40Nry3d2%9QtDK4UQAcc+gz2;J?-y1$x>YJxjV2OXGd%0@?+JAZk-aY_D%FtNnFJ)l(L*0RBQ5R|HT^xS}w!uCa)}fxu}>v_hZuG*5zA zVk%-c8(pQlx?X5gZdR{0SIAB$WD?(1#@B=08guu?tZ$kWC+|jw?W;jX&Bc4A=(F!8 z&Vr9&wqJD5ON}a&$hQeYU?_WB2oTwrsIbkDEsHQ2$&hCvurIKC-n&^-Dy*39p`QHL zBgIUVz%Bh$y|KZ0AkUr6YWgMh*N5Wbch$u`<1t9C{XS*7|1DZ_J%#ZFz1dd2lJji`6x&o{JFea55rTJ znOm^SGa=nj(<&!#t7|U`!Y)Dch8fHBRA9Q~-lR@vyZ=)BaulqG>SWh;=nrF;a6ca) z%lzqEfYO`n-Z`Ht*Qe%C2}I;G3HgI91nw>c%doNpNbng~gfrGUAXksZRC@myFj>`W zd|vOooi8F4qwiqERnfMFm+h+tjX(E&-ZYROmXc;feA%RgYfxW_zs-$Y5F?~vH>c~k z*_QZ+6rR5FvIbv;$XnGl`Jv|YRz2(TmK+}ME;Q-ktDJ+e*drxLa=D{VQ^c61+Qk}gTP6==o8Tgnb>TLPp-tt(5-)$&0^Bf zqPe=C35}KsnRdl1tDk@SB4HJv02ouy{-v8-Gq+G=^RJ{}=bZO)ggUopqscDbZ1(!f8R>07sEhew!ke0& z=CpXeQOZ`V8Eon#Rd8{rR}~&E`6ta!wGz}aC(D{71%E&D0lB!XET#{JtmtI8m5UH<4|3!0Ob?$TRM6$WQy+oX7|EXf~SM~RFjC{@oWflG1 zytfGKF&E&U2X2(oSncVHdL~6x%>J}|*H^8q@^zu`;F1bWdTJ)}Da?p3VR%g`(`}+V z!TQ9+&xeP%s*$2w^LeoXN#kZUlbn(J9wMUfduiDz;en)dgO8vbRzWB3@l;lOZbzJD z4ks=~aSn4K>`RK^g*Xj-`ZYrpb~9ie_Sf<31faDYF51V3C+09V%ip@SKi=T(Cxx9-D;6YFjMT|6GDP@2TS>z3v+Z*U9<1z2d=3?5@C(8 zFFh(%VE$J|Mjd;mv!t9&tV+*qtitKU*eK%DJc)S%p<&G4s~dAlw)jEXztSXvPwg z)ZITMboItBGALjaY ze#ahnS7J_g*;cmIt-G4(b8|g4H7Y*dF%xLYeTW3IVI#CzpAnUMHsY}&5Eh7DclI{_!PTR{UsZY`x~yqz z8m&IPeEg)t(l5&t$Y4~il*=%nkA2*BuaaLdlypO|<|KzV?NJ}U>fL|)B$|*vEA~+F zm4@D5HbA!iEa9Gwa-h%|?iFAD+jRYT*lRaodWLOx4dz+FQ?={4_Vo~lzhYXhKyx5@ z?^E*qYL2t@pMJYjMPCKBoZU@?Sh8czyTFUm^;?UcJGSMosC!B3$^QcNo!m;dssdvK zmM$d=mRD}s$|_+ErJZZ=82l3U0YrN@nChK0C17tUwoO2DGl4W&m%HAS8rHVde-_bNw-0CwUcFePj^%%(=(j-Q&D8SziCx>Pc_ zZsI$lS9P5#SGKQyLQ7k@@_!n`I{j_F2b-2}rN`t^2H8OyFX^HyP0TAq3L zw@b{3*Sy$!>% z1+3j;0C{a2ZgRXa-43?U$>y}reK++If!EG13|@UPP3MWO zdv|SLEO`YECi~=uTz_xc4bA#hXUgHwo4I+aUcX~l1`nrUc3XfHXU9I z*Z{`VGISM(ig$iQ0;-l0b=xu9X1Bo^>0qEy%3znbc`DOEFVu4Bb}aohi=2PPqoHHk z!l_#RW>w7nGe~DE;re$&!J&-*?t7%p&WF-U_#G=ftLG;+=9nZEP`o?tqkzS?s++0= z;g&r&+>D(CSb#Nn17hK`-fUyi-FM<{x@qmhHS@Kn$OiuM<;%NlzB0}~y|)${TeT{` z4JZP#WcFOW%X>IE_4SMiQKZE3IZ@;C(L*&@*86L27J8DU(e;G+dH~@2aJ~n&%8eESM$HOQCQRtF(L-{@gw;L6!97 z(U!ijNuaiLhcGtVOEE>QBTG3RTk#wF5<1H!unuyxlx`U3?*Qbb)xk}xJ~82rNKU&e z+eIsy()mV(OS@g#F@9!iI}5l~j;#ES-v1ngT~vs!S^9NS3OxFsLnI_rnd#{wP7FFxcpX78wGtd``(Clc(aAy zE6(J##k4BGU85JM@u@sUojFMU(xzv7=Cy(kS8#4txmM6^UgT#`O2ztdI+41 zUJrh5SZdI)vf^_j+RV+`LJw%E#H_(+)^M86R*zPzLo3n^Tkt27T#{rlW^S_~kERVD zbG0p%OnMg~OQwv)Te zvtOvx;vW!pP}B0o)yM`cv*eSJ?@ZUrR4xU2Xqc9qhzdc-R!jb@XPxSaRxtqx=Hi^IT!+!h}F-Xy8q77iQ4dbXF(y$LKq zWWbC8AHZrfUlJxuid1!r7ZsP&>DxQ(S5coo3jw@gV+xyZCp5aBvOnpYS$;%pDF%qH z(;1d+@uCAGBXuN6{2H9dv$&_#|5b4TN3{kOqW`X>grno;dq_vJ`GTPojclB`+WI#l z8hSi!Z_(HC#rUB>gl!mI{%T5^24lG-;czmW8lqK!a9I85pBEEy=U9V^hk^(V!t-?) zA1>Xw@MFUCqlykI&g-9C-y0i0ZFH>>!49(tXysycminx%R`JnQZC8VI8t{<$d$L~B zAcSWh+TV}01@#gaxawuaH04PKUno-Ok&va@9f7gX(9!35K(Bg7J)y(X$FYifL@ME7 zwQsh4Msmf*uit5yF56;#SFKNXT~wdFcpQORXr^X^Ui(!?_l(6p&s+^!5a?;Fs(J3c!-p3|9U86ch2_XZa%tkx-<&C2KE^(Qc!zaSP%x9h zKa8?joxaxFz-Gy>*e30K%e>5U7K>AD+ZNlLS$?_-gLup|4IZvJwup&|m0JUx$$y{Y z&yGhwb?|_##TtD92%BYA^>mluTHztr-Thbc(cA=r1GObtaoFe?k4w_^GpZG&}T?wZT#8t1&uO^~%WOwRZHRpIm(_;qL7IjQ#< zK5SK}08mr$E=4N|*@DwvVy07^Pf4BIfRdLvlAKMelGE(NKmGt`|Fom(`hNAndQhIj@pzU>b|p#F_Nc*uJb*mkjjLsUb$)fW72I0AN>jnU(E2*d!I zQZ#%0$ltCB3q2`6!%QH@SHH0>0w{3Ue$DU+%* z!gw@#7O>^HuCJyqXCz+!vmI*Y$PW*lt@#R*-fW_g!tf8MahjCrCnItg{c%tD4ezxt zN*TL>vv%VVwUs&}12e~^3)DWrl)f`C=$_Qdl*SiG_o*~(9oryRz|_vHV5_ei7v(6k zdVVW2FN4oGszzs7Kfp<~@2{Nyt^C*b0d|ZI$_%NHd;he00rQrw77KI~$Io#Bom@$R zx}|I{A9!0y0+TqqC@(weGb?|wSPLE92H+RMGFxM z*sA1k|IA`%D0SK+kJ!v~)XXD?h)Z*F&hqK)s%DyS?nZE_i`Qw~hQ9UH*)Adl&koa3 zzS{v*mYqN45l9{RyUD;DZTPu5{~xS(@s2Bu!b=MKT4A=%ZE@tf zfsD4z9nk35%HCM=8GjFFoOEF4kn6rqn}|ryb-xnWJ+9Sh(6EM62O%?%L3UH|&8PZv z?YMX9t*7dtBp_S+YFSRzhxaM}kI)EMNo{;nAm`iI0%MS)vkp1J=ejweFl%(X2jRp1 z3iU^d0*%?wTOX0*oxlX0vQIykEe6NN`g#WS0e{<-ECkfAa|dd21ho0;hJOG55QTv# z!HtkfxUWjmDtDno+!N}WhvApX>hWsze5sfLC<+f+_e2)@m(Q6<=#MG`ujm$`xaX{$ z0?T<%_t}cI-pJ!2h~UWPk?nPtYChguP1Hft)rRY@FBq!$F?D{Ua<$1m^3LTLMsYBW zbc1Ic4p`flcisi5aeciMWAR^xa8$G(+LeBs=<=IY-3+q^;nw0h)20Di-kqqsMhAc^ z&#tquw&#)^z!urasO%c^qZfRSrKdNe$j1KFrM5i zZ&Z#1@@%Cu^a}7f63$1Sp9ebey}S%Rnf;dcNqBJ{1q}mEan_X9=RU8a?Q@44-dL>~ zf4BQ_<-+2f!52FdZ|du2iGuIaJ(Vt$#||E}#s9D1;z=h$OMtL4lFwX>@E5~-E;UFM zUi*$z%jw-jw-7;@ORYXgo3uHZ%8&e*E+G**KF{JdEHxa98%_zF_VX8nHBEVCBc5%R zwS}*G%dyTZ%Tq$P6!>KbvvsId8~!6a*yd3R354)0=Pn?A;1AF(iB|u5h!PuTv8iPM zeauNs*vn=PZvUp=P?oi@Kyf~?{%rCHr2e*>*T8Ywd+#eRtz5@u3Om-z_la!z1#RdH z<%a?NX&(&$4{`5*^@c@%B+?Gl$u_h1`#U}$AiYVAlvp|^67IO56JO_hv~Sjkm&#(M zB3cY1cKA%KSat<*H#fB`MdXhNvK)3=rrIr1QJvwF!I8?;p= z0KwDi6;6y~%hCJZxDCWHCWCqGxKXoDN_Y5!HmQY4r&fu z&lTpjPl7VbUXX-@j;1B2Mo9T?7C{yfsFkV?Rfj)Bs`+m@@_z#b#?RXiy?(84(qxu; zPjXDutM`L3z-!r!E-1qE4Wp3d#tJHG4r(1(be!~w%S-Ur5CQjvjF_$2Z=~`!P9H6x ziDUVUrNjTz0v4sixkooEEuN9HwVx626&DYE{nk12iyFN-^YZ+6xOMpNqmXGdI_x^- z4^5eQE$cE=?2h|fV^>&UoZ{}NW;HVg)0C3(CL1!wi{0y15_gS8C9=ru`(eMo%lZ87 z=m>cR?`eb57X}W0UHKJ!+#hSFx=VKyasS|ZneGFiN8SA&y5Mq=@ml`Xvb@~8Qde_5 zD=dyjxi_qn0Eg;UD^zNiKCSJnD-pq`&GtrehtfqmXfYw9@}T(VqCzUpseG#ixa$uN zS`Uz|d5}~BI7skz0oE(Mm3q5*yyLD92Nv|@ReI$}dzZ&K>F|fDBEVypPrG{IDn!jc zmXM$QotIW+kob^{W?_eT_?0m9VO^z3aK=q1?x1Rjpj?Y$2};;;e(k7hbv?s1xiR38 zu*`NVH7v-_)tn${rOpEg$B$cDjE=nd zS-g9RndgarAb+paxT5;TwdjO|>S@`Cp>H>rapOIio5%h3#yPN(5}voT_En(tckx4;6zkv3;o@VI z1V8kr@7XK?-;M>Goxn)KAGe|r`*Y>Lhz|vT_{gCM1xSr@C6F=wC%xaS!5;v-HWH=> z+LIC66?dz0xh*KOJMGz%l)zL7X>Z98522fDbkBi}0&Xn)WmQInZDHVnSd8>o8I+m< zBG*^M@Kw2)IR3J6Akadtwo}!;y*=A524Rw3_{t{l4^)D{{02ERT3_-!yd#bFsQRFcn{Bi3lRXDX_Sex2`#`7^R%U|4D5H&_X07%3 zyzTVN!wP)jo^(V%FLZuC+%ns5ZV*sZ)X`Wm;m{{yJJEMf6bWL4#SdF}cBamq^gJ%} zi=8if;Pw(_Dy=ShcFs-zhoA7O{oFkn=v%K?wwc#Alr1y~Uri7tg5QgvfBStTysJbu z{8F`9lZ_)SY1gBLY}EXj>ZC)0_um`KcoMr*;&D*?Ah*9QiB&+*Avs)V>ukuvO2o~& zqWLaQhKHv;t!CwPZ}|I~Sq?m^Y8No#z`XO!oX0sY*V22vc(Z6!PtXem_2?U&wvI5) z4Q75B)4A!E7kCLrfZQr}5g!_@@Yu*f9h59UPeQ1Di+Le%mt3;uB?r^UnW9H4#>~t6 zYOVWhRwNfdY9GL4z3BhBsbo(Pa#M3%{nLPfhz=+J0_KsEG18&lbqQR2`&0qQQpTg> z-amKLQouH^3_?VKmW?a%A4LR+erNU`ZKosvqeyt^CvW`6 zGnMw>t}b!gW+Id7SKm&5AM6(0xkbPMW7BpEf94%p{;wv(bj$p!!OzLc01p$^YE*05 z($?PJlAcATuKw^zZdwIXMe{;OI)D_>BX@>{@B~F728WNosC3FQS56mqkih{o%8d!r zp2L5qwea`J_FwXGS@DV06SyO*YU+^l)>1JC>lMlp@%X4m`Roxduij1&>vL?5_s&Z? zwjrHBHV8ty%3~DfHd6S%>)Ac(f1y87-`8p^%aD>UN-coNb;WaMkz1S0CJnCT_4;@2 z3F1)|AZQF#g*pO}^t9Fn0h({?LQs!om;6X8UEaa%$E^)=(U(u90D>?q zUbLoU`6!qtFs7H9o{4`G0T=E2+!nY#plBlcEW+x0k?SIQvSW_{gQ;GSUb7eE@w8H* zVzskSG3cdUrjTGfPlcM)^T94tE@J9`4W z)2HK0$t5AN-^TyOfo{&2GsGD0*i09azob5|-!%?)7=CAfi*`|s!mqZ>|M?n7JynQX z5}L<4wd0uzee~>Wa3_rji7WiO%|@cEN=T6;RQ6?WKmF&Rx1=QZ@rH7UDU4JPlQWD? zRT;1w{pI_*`N3s{^QJzU5!^@=O!o%k-y7w6Sr?@Q+%NpEg@8O;FSWU)-B|LZYy4rjW}6GY9&qqPchD3|1MQJKP0=6f6)nPeB%-No z)++yPVg?sl^tQIX$`WP-`Y*kjBcN9k*jbtm4*v4@ zNsPG@CBB-*nCo)8Uu6DcSxMy({QL)_evE=vyEIt!Fyc(|vU~-Xf9U6qP=BgSOfv8dFeke-b=Z^Aoeu%^(yG+0=?+r1V!4$Ud&OXD> zcFQRhesGU@{G-5sx|xL%H4{lqh_pHe$&7Xv{GLnARfyMNG19DZy(}cOrBHI{dlnNt zN-a_eC=P_v?2%k>&MlmXTvj^N%t}jEa7E5Me3PkbCQ(ztNXW_X>6Co!)YeUtpyn6~ zD@GZ6jI&`Gtt@)9q%j&mQpMY~wh|PS0vK?N5%TY^W4WnF!)LVwcjS7pexKSrWO0r0k82o`un}b$nR~G zq}+n)ND|+Njg>Akp@^#CKGLzcRlB#-vb|b`yv`9lRKyrRNf%mb_Ev*|M)?ib$AA!;uRMOwrA9~0?c=y)a*}u9vUPk|Fv2M(B zzF_MYbaZnLCQ-+UNY-@@Jc@IKt@AKdCG|r@%b>|TaO+)!-?6#WUp6cyC|bcD_k=^y zJ8`-sC-KUaZZ9jy9^GJ`Fe&GIykeXT3}BKbV+-aKJ$f0D(qK(hby5i-4AEyuf<>G} z-MQ}+E^+VBRe!ooOE#U(7qs<5AmnTVa5t?>HmsFozfEEP5wXqb^qYB$ z@WH-^G9cl0r;~E+{PTz6u+B=v!FvbSlRtweC^W5vct_ zjzu;3kQK54&fz+y7Q%b?*8haR8l#V(7vboJgrjQn{EYknb5+m1X1epj>gIAgd8Po% zM}Ovsk~c}+myVt;?fEJV!Iz|xGAOIq?U8CC&^MjsSmmX=6Yv=g52pJUNmU3 zgn)1$s}J3~nSswx-$0nYo6PQM+wxP}-rmPxON&xFj*cLuys1HRC0PvkWAZrk6RS?G z*C^y#td=^V_U37Txw46L(YF^K>;5U;HGV|DVR5i+`-uJ`AXm4G*-!w-GC7{tytGC} z^W;)wy5*?>a-J=^v68?TyyAYK4R}=;kh8~WdwNn776t4MLVijS5!}OVjus{uYS$}0 zWXezbBaXIo;5RxU{&Q_%Z=3($@!}>yio=-vnj=@Q{GgfqUA8b*KSZKGbb3Xeyk^;Q zmJcB?nn7vdw(|aLOW+XM89i|*1I$UP6oqw9Sb5@)`qz)TIW@FBwd##s17O5W9@|Ys zP<{98sq96BN(TV$PLT?6%q%D#G+Q)CHa33fGLiP*U~{>?5ZRnI{3a*oT!53If+0Z! zmnqyzU)Jsa`Q`=J=&6iumn|wA4fXbN$XKn-*G7@ql2b^6?v;7y?khvOH=JO?12RM$ z)FfGGw3+3dF(S{{Z+OI+bi$4UO3KV)CKS+`Ma1f?m({oOB^F}um8j&m@?f0hfC-hi z?)d?8uFSgu#~~pYdr7)fOz&^N642;DgC&S+n%MP6gm0g&+U1SWi(q@dYF^oB5@>@7 z78Vu3ZAwMI#1eD(Kc2U1SltTK2n4=KPXTA#y=O1F&)8kWP2o^#S6KAVvC@DNvzP!C zyhb=btw$(%vr_`A@OvkNNly)@|65Mwd>N+27|hS`?`@|6nmZ3tay=s|o`Qk+CCxr{ z964(Mg(^@}yRdz}*?wE7t=lo$0p?>S7X!8l3_`UB8#4o63LQ=BH6kT0PJU5*iMzen zMgPU#nz4$JfeE6qhK^dXW~;b3)<@U17qvnZneTp!=|16dJ68Rd-a!s6OBX&e@)hOg z*i`N3T%Z7zhVPCWJvFq!!OY$S6aZT?BWEMWLIA@{1Ddj@Z4vaigq`8iZ!B`1OK+YJ z8ttY=x`>S_@xyK2R^G@p%BYDb$fle5`4~NwL5hP`#3sB%PSDQYPOrm&g<(58foiB4 zJ1D==(X-O(lnC=KkFa?q z@HQG*j35OqUP`2kqY8o*Ky-hcGuP?w;_yZ1EFx^h$E*tb>GN zC(+$w3cJ!u7CiwHp?(UfJWiAHY6tqS|HcBMD8E~G7D`dGcwePJb zl&HjqVcBKo6#KHVvoCjZs3V?`=Nku5DGV?kOsym_-Y@#BX|KOCAv?aE375FbCv&;* z3WL2*?mXl;wD1gN05^#mDlQS^23_(cqqP7=q#h7ZeU{C?>lYY9_E9^>EE5nVJIH9r zxx2G~K~;`9@PJX02uAb+3;f?-U>jWC4$>10#v1&;Y))>mZ^F9Xv)^`wJB!mDo(xRN{ZDH+_IpxK^bn3B+!wxx14{HQsly zpZfh6^4^!VpAT^4dLMwG&hCF{uYCIzu7|-_Wi_ z3l4Kqz2K^u?TxidkHH&KuU^r2M_XP2+0DJ~^@HvaW7k2=D4~WQBseAR$sxj6$|LI& zw=HaK%R(Vus|N`2BaE%xVir$~$@feT)Z+&|26(Dk}cz!O5m1KMk?>2~2?RXFxxEvM5kM0}z*d zyFNT8Ykt!8FW&Gc-?y78_c?M>s%ahxKY(&Oe7FFs6cy1_3rEML~61=@)hJQZC$IPHXU0yI!;Y;55dwgLqWG6RFOR2N3= zcty{8VptV*nCPVgtx(}A3qw9={P0?FbQlE1g$OnlYTboG`@Y>SdVz- zP7n3h+}`4hx@!JL>)5e%qGLBmowMGd-<_DGSQSgCj~=<6a042Tu~v<%GW=z6Ux6tl zu})Q5BK~CKN}9$?IQ+MYrI{_dfSL)<7{rom`+9JBViE3f2F=N9f+Y*6nG=(JP8q(X zvsU|un+~or$pL-VM7T{}t9OekCMgLm^F(6jt=qLFWoj3& zJtx#Qbq8X8;Cf+lDR5z~{Z__)_htQcT0?2bfX(O{#9(by=B(lOD<)yWw=ye644YT2 z3B;`L=3|B)QrpP`JZ}7xkY7C#dD2_O{wxFV#lgZZ`1i$puI~PU0dQVLefxGuO;fWW zPG>D{+2mb_(cJ(r2NY`gG}0UgZgUHxs>klBX~ifiv>EvIhS;<$uPCMz4IO@qNsO1z zN%1Pt?d9xc)j6a1oT(Zx?Ei|q&0C{K20Zx&B^0ed`a2CH z=?<<)uG?a9B&TIF+yQf7kLS=96;zx^-Bg^g_NzvP9O^ZV9X;QulX9Y7NTWOsQg0=H1sl8R5~yI>6Sl6gEzY%~MR6?k1j5a%sB9A5n z`=e3KEa=jV8jh(TCnla@?5crC)$(D6Y19FB)eM@J`uP~@{_I_W(jd?b96(%*Hv~~# z_qbc+_DO&CHpdPw{;RPQ!qPjoW?3sN4`B-rFtObs_9V0vZx?-K7{-lg($8ni73^fv z(#g9{Jb>xh@N@xT$gxynYfZCJY-^nc*NVjI*W?b}uPM|jwgDnXg$2rZv%*OnJ(KuzP@LpPQfmz&lje#RvJ8>HgK$y zQo{m+5#dfUN(5n?t5HZ)B9yxJp2`%?G}*P2uJxzFxqSG-nnF7N6yUTxbec3qo>71=UdB}_~}kHf0S@BDf1w`{Yt!3*Vr?o+dwfEj%FL)z#UBXQrYZ8uh7<-o5(WF=LbB1y2aDQTq>g04yd zWyOG;hC@*y_Pt+`wAeF@7zs;(P@|OMn7Jt=olSOGVK)}m&~WJ zg{EvNI7Bxec@$$aq_UKFY+@mfM;X4TXsAwiy`&^bREY=of@pg}Qz9&@_k;|Uw150;?f zZf3%Q<|!WdomnNbNFa;pq%?kdF$Uy(RJVRU;IST{-jG))J+JYhcHy9cUk8AgLTPoeH^b(66B4AhSoGFKZ$*VpQ7D5iGk zX*d&vqaVY3^t7UdvGy6+mbgui2_SMY;l*k44)^rj-6d*;*qbZE6UAXDHW}E$!uo}) zO0m4J|2S1O{1EyvqHXa*X!4Be2P5-}N(`Iw?yy=6yCgXA0F?v^@KH?H@@Z(R!?~#F zI2+lHdJMvgmJBR|OGhpFl$<;~PVEJl(ReAyj|tw|$PG!LV9J{v^g_@%~OoxMGkKDlpJJQlb7Ce;p`1wC!BqE|F}Q4r{PN_*~v-^FGeVcZTGb z50*R}1Rex%RiL_iytSyTNg1xQiRdRoG8Rf?V4G${r**77PN<<2Rg$7$0QRMI1;`lvWC_(V^dL(n%vjgxCDFL|)5GGkPcee7paVxJRPa?;!>; z3XxT_*z$um%SloZ4YVlXIP_K(b%R(gP)p9t&$|yc=4J(j7UJ*Y5@bn2WCw^_mK$t= zs0Ge!#NV?w@&HN^8l%_=d0xisVAToPlUDEyUA!GO%@rIyB@sq~41>}ZmB$;LW=1PN z$7Nb1#>k|DqknN5e%jX%1g!D5VD-5?Q%FKb>6|JRy}m2r4Xst$FG&MUSOas?6)##e zGSW)Kiio7LVnB1m5bZ}{`+N5Idv^(LsPXhXt6>u<`#|Vs%hYX^b+2Ef!Z;G7tg(0o z{iHZ^d#S=H(sye2Si=ib<mOi9A&HG&^50#sTmQ=%g*UlTdP9CwsT?N_4-(~kjh44u9 zVU>u?Qe$`yJh0K56#b7`R$25;GgajrqcjLBBs{lobDj=TTCnq~0(Sa3#>5JBVl33} zdy-AyH9|9^%ocjT&F!Re(ofhlJeM#~7wUJDbR_{hI4oBL-;v`%DrCr8bgu zmBixlO8&kNxF#kLB!dh&6O1iOrUZ`^;Xu)lDhn9-JRiGB$LaIB;S+jb2HsdYzn-~s z2X_}8{p|U#$tm|W#UHhWiy6sNJgg0({lAiQX&!1;MEx@){1oM6X^noEw~0=fQszv~ zJSs7}4;l+iEOq=(rE_0&NRa3oM75DlG!}A<5LOO*i6gBjt|p3nC6O!|PbkuTN}vU> zDB={OuNO*EhT5qDyVyk=(NIN({6SDeCPaZm_TRCT8ZEa(wxJr1H=wM@ii;cvZ*LFB z^VNQ~PYC^kxY;EAZO9kqd`3bZFKv@Q7y_u6rSrD$Cr5*5FKog*LA(`#}nhlhGPwC6jdYUaw zcb}kwCLE)(X&XRsfO+BhZ)9%5#5a>xK1A06CzL{1;Vn}fN!x>fuHRNNJQpx{OTDV?wqL!RBd08a7^}M2drfcB6OU#0ZXY>{2)n zZO;?HXFBB-Oh!Z_O-Mw(yH;feOcVV0!wGG)paVccUR;Hgf?|NZOt{WXv*#1UcDKqPU3dK!g08)&k2|sdvTn7&I;~MwsZT%=?mmfK*}=G(`;^c^HA&UPgsQf# z&hc~jOUB}mqn$Y}4++D}Vd(6ygTU%=j+L zw#+b#7e&>AUs@3KRQ2-OmoHLuj0bUDP$3~M5ZE+b3a0g zq+$NiZ?yoG^}BLKx%XPeTD(QTS+IwP5HQhf&;Y&_S6Pvi=g(tZ^q+d)g(F}@&t}+J zbxsA8fq(rl*Wvla8u-@<9Y+-n9ohMf3Hm&d&&B=~YHDwBoBc=hvdEpjBctpgB#VgD zSLumcz*AY^~+AWZyDh z&XgG(a`Z6pRPQ}0khH5QNJ~%O#=Z;+MnUb6MT`j4?8*&LXCS&bMIz*Q_PQJ7l=Gdy zEa#@BOXR)}ym@Ihsljx<~g&LMDqe$dhn9^Hz9Zi9H=`_w9`QGg( zZA%_`)KDrgVu+HryJ*Mx^U zGV+nyov?IQ=Bx@w2?wcaq^1b=r{L3N>fJXgiZqZ()e`d101cgua)q}U=D_kiFDvG8 zD)4lgAO0SE`$kyBCxE3?QbUK#&|UeVI%usPkO6_#S!pB^@v$#RfaM`=z*2MG1{mg> zO|R&sJafJ@3>!1={(rNk(#S<*mqRa@4am;uur+Et&rtUX7a*%LV;XN z>urZ~&A_JWc=m92DrR^Pomi$?l{q^qZv01#*3+0;B~w79hs==!AP(45qOQjFy7g>@9>HxwNt;`!x$rAg9*a z2kHzcijj-L)bmhu>@cOiXj^6}$ipcZ0*&ejhArK%B?S?S=Gz&Ky}tLYS^S><`seC5 z19xXcem%3}<@GoYC=dLF>A-J(-_P}Gb?y!iw%CMxuDjUduHoxe;`pbzj~{;3MqgTJ z45T&uWGlCnGeHdjvPsGw3^)3q+n#`h|1x5|I{s|*d7YK*&>t3W+MdnX{YVu6TT zR0o|hw2&06LX?S#{YrRXtZucliz*8Ov-Zvv=0_He=eXp`ap!{0>}_f@oL=M{(bfFU zicV>NM3^QZL-_W+HR_Y?-+dhDI~!6xu<$C|JI>m7ue+rOEvt)X5Ig;9{c*Q_WMe-y z~H{hVr2bg=5~ zUWxWjU}Wa>4^~e>sw1g60dLcVVR2dm;1xe$ z+D@HIb>GHRlXy#PH!J#nB64q))n+p)@nKU1ndc;!Huk<&oO_h6a!do8YA5)5xHh{m?Z=`r(bFt_Ta>#M7E z=oYS^G@sY+&5iZcY;9fF!DY4~!VJ6ut>~IMO&HSsSQXNlm_5CQ$;vM8iG-|)@fzY{ zyrg~)M#XH;Q}y0?F!Hpv$9q3r%-Vh5kxCPbjLtm5$?>ko!Yu;4#*OFGcAr~q?rl6Y zovYT~3669m>u)6HwkvxQjIo*LXLvS!XXfIYj~Kn~gerY(M0#@QPE3nXlKo{HQSpO6 zHT+JfMaIL!%#Y2Cp4XdHemH}y3z)f=UIJB8~Yw$ zk~BBWB9zPa42MXaiOSkHP2c*J08S5Dj5l8h7-93U*Hi}HM6cNd^6h8eD_zul-wyL0 zP}BE~upI@gIoWp@-@dnsZTj)5!XV9eYDn$Fg-h%BSoR%a{Sn%N-@M8BQztt!s%?$L zG_k+3wDs4%omZ4F`LCJx)`N6;Fm+f~DxPUhc<*Q3&K6D^#pAfIcKn0Yr!rs5n6^8_ zSv`KRY(XUDH5QI^HKX?YNIzGuRm$yA_N7xzjW7m>59==QI?^YXm+%%_Kd(M|4n|~l zx}c2lFwGN2<&|zp=M9bVr>UM@Z@X#KJ|H}en)WSSE+0aizP`JdzjWg*wcBPDWX@|a z=|>r~ds@}&nRP2g@#6Te_R^qm>{Qp1b9vVI=3><~cqppipRBv9DJ>M%C{6 zL)#}+zTl0wrnX1h$t;b|(!QHtP!=}to{ZzG!K!56$y}p|eK<}vP9oF!6-k@d7QquX zCZ_Lw>;5I3%jZZ<_8@#7%OEO|;txh_?=E)a*>WbS>8vluv!3yL%?e*V={?%u!E?r^ zYb^boI}6AS!@pkpK_y>`&0W3N+hL(FzCX3Rrq=vNK`B11?exGZ?rZMwR8wtq=jhPq za@dLl*1q8Ts8owSvu7pm zD~4!jcBy`aP>m*PXvaWQgMBYT5guS27?r(l%)V{b zj8x1+FSd3Q=EXl(v!P?QU-^kyQgVp|nqJL71~pJO^MZPK@YL6H!@%(;Tmz4ioyWkv z=iWe52Onc@VV~Wivr)1&Ms005om8_rE{?+ff0J1MJH5}qMCrH2XPKV$-0Om-#g);(tshnC< zJ1KS7>pR9gcf~a+1UFL+r_$EkqXsR8vNjfK32AO!E1xaga(G4A*=VCWi|E#IEunxU z@0i2$UDG}HUlhY0VMH8(dO~(Bc)34Kv%3nmNc+si z#{0#hlmt%Y+i%cc+jlG<V~3|U=woXBlz9=*>Evk?BuvBr9zx2lympqG0i$FO&~TG9L0OAGc$ zeD4p~-4VhSFDJh7_IW!K4+g%!`u2W{B`b^W1FIrF4rN}LOi`a*?}-`$@S6oiT}l9; zrS^!_u6{eDX6pW^MZ#9Y=5~>3B^Sn$hSI)rY0)TS-gaj8s7O|Nm42XGs&-#!?E(J1 z0EaP)I-Yx~Cb>;IX0ByiWTaW5-$kRo1FsO&J7uHW+$NzEIUz%`!I{(mC7O zTXb+Unf)6Jpfr8%Poc)D$&Y5VpWa9In6T^^qh=Wb(f3S1O}GHjUM4gWHx{|5a1!~t zEGp1h^S+Jo4HY{$AyW_@A+|I1!)V{#7sJ}}>`~K^ zkHija zi!pw=mFDAE2d@4I9rMOkdiC#P)#^V>)Tse`G~P=(4F0U<$xTdS*++tJB=|cP@4HaP ztLV!Vy}YgPyTWvKpjPDdNaNPSJGHs(IrAB8yX+@NV;$kQPwpf}koz;Y_}TN_S##fl z+(vyXZiTh_2C$M76U}1ng?$#-_dw9*eRpbQv$NtjeiTx3MvO4XP zf;BSP4~ji40$ZXeWv)ThzeJ(lS(Hqz9f+oj`aR#Fbss#Y`?gy z@;>Ey$j;}V2y~Gu?AQk3{uuiQp70|ZQi(RCGxgmQG%fMi@^A=EKi*f&PpdoH9@|>X zW{p?qAjpuD!x{-8N&S-uEW}v1#(qrBMl_c`dIAgm zy#ssYk9m$TX^&lC-8)>_o-TU?>Vf+A`hucbhhk0c7UT(rbK1D^Ji0!FJqkEPdlYyg zW>DEW$Rm;fmgcS}W(-DBkFGCZkJQgHHU;W!0|vr3+Pofh`pV?znK07PcrV*E9H%7f zoxe}kfAGchjoZ7?TQ{h<>5#uJ3dZ7 z4rDvqOh8QblRhx0U|eu?V~8BKgU-F1Y!?qnJ{Lwk{d)0J`^&{2{x1w?xQJ|8;diG; zn{Td;4c|!LPciQ7p36983cufXZ5ck>5rFfdtncZq9M{<*pK%MWy>K$G0m9MvqNDQa z#_9lu5A-@N1djraWzTg;C`a2f)vxM5tWlEKG6d4*Bj_Ts_XFR*tGdGzH6)kf@P~+7 zvd^Xvi188;A!CI^vLo$`I1uvM<$5{7=i}`aNlM;8IlK091_tNx)_TD)uhf-#i;{t? zLJDejkp4!YR=pS=mKjow|5B|Vv)bREMKJC(-@pJ;1L5KKJmoTv@zuuH{q?jr24r1A z1XeWCa(WRgK0ElswgIs5Fnyr_o2s|>C_mYxa4w*m2klju&8&&KoL>0rw+KYQzX$Sn zzs7&xBovbTV1nP(oou0mfqaGz34^EFMS%EFR_4c7CRJ`_Ca$}#M01H6 z6J5hivcAAkwHm*Mpi3MNC1ty<{$fc=5Zr$f?%iDSFo)pT(QeYZGzVNKH!jn3;gz(w zA%kpy$P;V_#mT%C?C&89f}Mb_pTrN$19HE|2Cvyg`d3FLewb)4J-f?gfu+%6(OX#e zria_?%ay~fq>YYs5RJ@+4VNwR?C#mXJqh&{9hKsh+Kmz28pJQd>b8#?gSk?mJhQDy z%5U(@fI^lB7C^wCgGB^&N{{YFd>}ffMOTC$K2u%RJgSF{&&tKiD_jSykz!SNV6c$1 z+G8gLo|Aj}o*93+9P8O7xT0x$qUeD=0Fe&%#2IDGVN{b+g^oi}lje$hKaQrIieY=_ zzP4lasFgk0EbSi*_yb`=2yQc5t~D^t|VpnY3BxF z^$4&j(^Dw#+svnk94=g6QGc?~!-xV%l6#hZt*;AN#UJ>UHBO0#k`m7rIob%1D!$+us>3R&b<^u*_ zVXYI0BXkNSl|rr1 zL{F}OS1?k65 zwa1A7Ji1bYmxK=tIKA_iZUD zVu`Sxu2J;<&{w5a12wKBKG;dSV*Meim5Nnq$d6K+PK4YwN^y?>JhntBDLoLPETRO0 zY=I%KMUX;v9N65Op=SX{KORLft&GByk8WxGxF)0t@w|_n35YgH4P4%=jz3bwi`1{a zzIwlV;sGf|V&?&LBI&4-)gy|41A1UJJ!IkAD$+0XX{9CKLTnw!^k;t>&1U#ai#%Vu zfaP-=OYs;Vw;y6c{m?6&0x~YNNTx*!ve)u)aTWvN@)*++oC$kSL5-0>jC-NmxS#+>MDg)OyyFv*z zCeri!4^NR@iH(64!n#5?KtVPjlf>`c<{@DtaSsx^msH#U7g*6!N={GZC?(yJ38RCv zO#tD$WXou4P=@VJf|DM>n^diN1dt)bKx}N4QAG)KB^==9!Z12fK>FLQKNT2XE~R&@ znuNwaYzZYn_=WB+n^=E_j6ewK1tH5)zCq9WF*klDEma!mOcLz=65W)2V(;=0_(@j#zI5=+AmXIy?QM8Bk0<2lS(G?x3Q3nXZyp0`!a}` zI>hO;t?$pi>1vPlQN1tBaG%$u_M455mG^(-oly_5iL97u~S$KfemQqUM~dRqt+%i3c;04SfN*y(zJDlR@O`pqncTADFPrf(guuprOpYV z>6&0jq1z`QQleYi0s5Jw3uLhQUdEZ|An^iSMmd(^KrNGbi5V|4a$Zm3yPnygqZwdo zWfrF(TB66pZ>BZ%wb&vS7!36O!DK+hBU(Qb@#|g&-PFT@QBTBW5LCZI;DxAEn7n@p zsI*@JLIvNPTQ1eB?FW(qbzq3ryy~D!m6unmE9d6#7rBk9!j=j)@77%_Z<>t2Ef=h3 zYV0|ia0vV8%QZ_1nUddrzHhf&%#9g-Q0cR!dU+s1xr8goJ8z@3-?rFpoApd++EDN3 zuJ@3(!JAv|hj|G1@e{Emo0g{s-;;&yr=SnRQT|-+tjq|QLH)G^jozdrP?nkWth9il zIQ$QnaGWfD8{31--VMD&kKxA&37l-wEow1{HJg67h*Z*GiHDXXMQ&QZ#**>fiR~fp zSM4lAVbU_VvXcLP9;VOqtW$y6jELq$!ZD6`g1s!f%LY}#!hgx-vL#t|J9T~ zqdj7<#;pA*f3ELwu($lv1w~z?#5v+;w9W3$1*RBZvV3JJQ}Dj+-T4MaF+0&8*9iQ! z!&&LU!NE?T)xF4EGaqm{lB_m1SP#W}Z5t#IWdqnV19pd=nN>T*Hi!iRA#szd_p*rI zpXY!Q(D!KMWN-fZNA+|8d4&Ps?kwaNcR(#d6G4iAOWKMA(Ta#>P}D;%bRGOpk9>sT z`xMCXaLf8z3l%N=**%*dVrR(;Ibe|>Bh^Lm9 zD{mTirJCK!&xb}f(0u0S8W+HH&t& zx{$!1ESuf4?@B6`6{=ipOu$)mi7@j8lTH+hGATlu)i6c>> zcc1d^O(vozsWV%ab8(O((d}rBy3qRjtlz#vOjs&lk`@luQ3|kxCO!HFHA1WPa3`Uo zi@&9F2bX^Cecx8|!ItY8;EMcKErZpZD~ySF^1YFsGd6P#5fr#P5F_j~RWEE;SS0kg z--Uoo^Hbuqb<*dvypUg9d6%fYVGpxAES?p?N7ks-bML+}Ev5QBRT){QyF)xYhRGWb zJIYv@sIz!bTw1#Be*wH^<{QH@4xKxvzOAgI^}-Vqzb0$$NO?QOubdy&N}$Fpbv$?tc!L5W;^J4_Uhu~C`q(|bC&Miu zKn2vDRZd3fA2(xuw0-fZoKLTr*(CGxq<7CdCZbQ|g}W^~GtIZE%75Hx`FVPGA&T(# zQtwKV{JIXkkWNM`;Nr6X*!Z~V&pXZWW_#(6NmLcil{j{<(pMI=lfoX~zcuvMI@FuH zJSmNDCvW?tFMnruy?5x>*Y+k5L;vBgZTNt!Xm-93FNgFIOoUtcXZaKo!L zgb*Ah_uCn!adiYOaat?m>+9q4*;m`@bjUHC#Y9R7U{aLBHf8s{fWGeA(_e>IoN;J= z`dsR{bZO1^B(*xnmM66ro+rsMn*nBkB?$`S6TQ2i$oCC5UPzoialV6(Kwtjz!$eEh zjwW(Qzj`EFEJwkS(qv%Q)0n5U0N%suaxT#vxCjU-d*6xQl6ijQvo(%|q}D=81t0>f z>8PY?o=l7}hH3%6&&#I`@a3Ao&V_V1UQJB3)$`m8{w%1C5ycFrAVr^;BsZzge84L% zY5XmJSuOH+V^@c)KMeu=1f=BU)Tg_-H_#enZa_N2XlPc_4eyiH_u#L-*(JW^$3L`* zP8uvTe^BEh6wvzy4wREN{Fas&U{Zjt7m;n|D{+Z=dMjad&v(4ii}&K}9A}q4LHnhc z#pY1@SUbUo`O(M+why!4GwoU3Q2!kK6s*^;+>9|GsTO>9a7l<2_4^1&Sh)Dsn$_mN;#N`r&~BzMgz}w_oJ>T^%`!mZ4zXhMh_w0kFu+Qkt4S zMqH78-fQROi45S|NlvwgWF+G`6Av@|xW7cxJr}uwHzh2?e;GiLIHh!^4oDfsF9!R4 zSBI!~bGV8FWRjN76)w*XG0uh0r+|8Q#qH!|>dE~&w>`3tg%4Mve9yym_W&O=D1wg> zF~T;g1k^@}ORNK-J6?P6!J|#_{5Z3%?(@?RhpZMcf9p0SkQg#aoLy08b=LefZnV^J zxkr!iKs`FGWzd9QZTJtA(p-16QQ33R!(UUl;N5b{u^nq?Wp1O-(YJ~mEoW?kk4hTR z0@-snnsx&bq0;cFhov*B%?Jt87`*+C)9Xr%g*>Kkzy%opQ4mH=o$LRai@v+25N-2lbK&#z^= zW0gP@J{B>?fBo#qNrz@Bk%YYW+0bs`!DxniGCHGii+V3F+yV>&AM5T(maArrVP|zk`d*`%QAVLFbCv&Da*RCpKlv5sT-jt+ zu1URo?LK!XRg+-Jf3&s&@@e{dM6fB->Jct%?lvpDp0tN*fUMz_4#U?f3)R^_1pXtc zzy36@s95@ZEjgZOD4J_%G-05-yGS7*SRvbcXu0wJvBmrPon4>{>T1az7@sUE!s}-k zySkEf^4%{!&>{7xV=?Dec|)y1iIHW%)!nAuwp(zmsy{e8>n zi86X2br#=yKH{Ai#@gk&Ei1q-TJk&cp;}M0NUFjf_IwoShYDqVKua#9|*U40PE#wmj{m@k$EA~Eej$c8aCS%4gb5WUJpY7Cqo?| z_C&swn{(gzlz$;-pd>l~iA*?kIa#i103o0M{s9SsV?jag-||U~Fpw6V!*SaF@89!R z0gS11wR$S;zrSOWMSFUKLX@jv1y8L}d`IwKw!a&|VQ9Fr+yNsO$Z$yZ!jkR`~a8{&^|%_iX$To7F1NzsGO}FwG=kC@D^|t$p%2| zEcs{^Yrfq_7Vu#(GnFOcq^T$as>x81cu)l8I`R&rw=saucbwcqIVKSYt-SX*b7bWA zwDg9A3&9B3uVhu!$W%bK`yZU45tVX&0_)<#X|k(|xoWT76cKB~idhLkG?s4`-TI!7D{ zwnu-G#2;2_s3!y8?dC+X2&p+f^{M8lV40eFgEio_M2b1!Ww|G9vSd5d5BaAsdX;%` z_4JE}1j)DvWvB=!>gwtPi0mZ2FV|KP(CM!IvYn{!uOk1-ldP(SnEY@w{T`VhhhjL( zh`9psRqBG@5oog}hBk}!cV5N5lznfFw2~hZce(!qz5Xgr4j0rqr((vUn^JM*(i*3D zop{aYD|HlQ(=t2%bzRLNK-J^#t?)Eb z$@h*m0w`C<#f43;M^0}>s%E@ODMY_>)5kc9;9WvOU&@e2Y$DVNIQS+9+vU(I9WR%T zHFv%{Rk9{iRf%hxV)st>jm;We*t7VJkwCt!2I7o~bBCed4cRvQg!V0riNb*`Ospkg z2{bTJjey?=WN)y9C-e({A+}z}!l4)_ZUHq6fAPpSC`vTs=p_Ythgv4MW6iR%r3;jd zY_pe#$79iC}GfxV5rR!D4AZr1hVgtDZ4 zTY`y>3Ce2Vkn=_kQ&sFvp+h z>>nzi3MkwjEa7B4!`Yn!W|FYpfxU@(r*rn(;M?PF&p=pLViU}!N)`qq0l*!+4dqQ( zQTq)Pm;#j2WKgF>#@fps(6YDI)UT#A#VieAhwUu(vI+~MwsA~UW!w|ihf+k>&SIyf zkv(QyzcWUR@1_+KiyL%1G0SE;72e~u7~`Cfz^;IW^{AT^M`NHv<1J1G5}B5P^T`~! zt&U*r?2EPcxkv9NJ_QEV`Vo-v^fbx{4B$7Xx-ESCxq1R8h{eRJPySr)?hZN_@W;2t zJx?nM8C8qy6!(2Cn-l=Eid&e2dnVmY7!=Gpric*o{R|${NF+gs0q`3A0tN|ipp9hg z2|$(t)FMVt+iJ6M`CYY?+O*CDI4E+tx(Xb1FPhc)rgBc4&9%` z-ntaDkJyArG&}TSf{Y*$jWnAz5}Ake#W0MV0Mn;`<=k*V*(RR}AG6Pd9m?jdMLQLB zI9ER`KTv}rVlwK1lT5xd3Ph5|zW4SGdXXX&OgPL^AtO;OFd8*LL2rUpbquQjGNPps zVu!+oC3o5@hZSnI5(dB{Poa1i8Ko?G-pG5l>Px1SNV#qSWat)4Kg26hpCIAp-|#1t zQc7g&6qDp?cqO7O?f7pNuK%@4QG~J}AA)mF)QnUD1BXi!*yX<~Stvk&16(ZRp5s3h zkkx`XAY=W{CHcO{TYcS(1a3z3KWiI6t7MdcF|b9Agnv<6zA*bA5B&RX5Y_Hp{cm&s z_qwUUjvPqC_YDi;8BzbQl~a!j`9{9_!YTQiNvjz9f4chWuqdMFZ4gjt0V(P3mQGPX zq(SM11t|&XSW3EKSz46t?p|V9SOF!LZk8_T=39ULe1FY6bLPg(y)*ZmbI*C-pp*Xz zQT#ykuV5ZjTkC&UYWlhtns)zY&k3p^+sWKJmj4Nh|F2d*NIr>B1EMyEsLl*)P~HBo zr}(eKOHovvFGcf)tFMSO^L{0BsNsJ<@sFDjy&LvLu)`$l2LJk%+V(lhgLb8{;~pgq&wJyCfCZEZ!$iI|H7tDG-R*=W4{H@hOFW z+IZ61aVO%ONC$te|Ilu2PEl%p^1U^8JVe(| zu1jhf+BX(xVvbu9mvu!hU*gQCNO~Z+{Z9_OuK91*BIy23H|*#hil36N!07_}7qD>o zl_F!-cD~wJ^@0Lx%!jnge~+1Uyx(1I?yn0uCz!eGSklWB@w-4@B_5SEdRY^uk{0qA ztM49$LJke*$x`T&<2OFG@YhtIiA(-N!Zzm}9`@P!fM|nHipAp1V>Odfa5RID6DfdE z8m0N+KSZRN@S8#Q%;WF2G&7HHdGu+?@6l)cq}hyiNgPSK7cMvGE$2jj=6+aNVdxII zw2h?eyU(i#ueuz>2j>!W%bMSg>&ZS?4{ias0fqngzjr~&z|OB+$Bgi9wayLF^+*rajox7=(nyWyOv`MalB$j zl85VO8@Cs>xkKvL#H*A&4dP#|Ev{2czW`BNxM()c&l6;= zIwk{Kx!odHZI=THEol;)7?4VRN>P6!8pE zWk!eyi|)w-zRgrkq#v;+8|mmVrfl2%N!kIpdtKwBBHq@HQb| zGVg0v(|dJQP#3w}LFUw-)sp<*O#l_u+|z1yB5`o!J^jvQU@VQTD6_sE_*0FndajV( z;ZNtksoaKoLm?ieXMY4zSXE@Hom?$UfDHk@i3_Lel~TZ+Q!AE{h|s6=ei{C=@f{J~ zW5irV7Gk#|dsZB14z8A0KXN0?W7&mr18zG9Tv7Di7r~z~ z)^6lQvV=Nx%dHz9eAgdzNsfHUj>^Aav6|GKtTe#D1!SB1qcDAeNv_czc?up2W`PFc zMWhrFkpp9W5pZu|YUd%b{s*&~t`xvRi7^L0+vP!wdgc5NkNVA~!wH-Ek?uY{Mz(o> z+Z*+7hpB&cip(|c-IEvkQ2Zc}p~15^5xSMX%dObFjT7`q^^|3)xG!hu{bY|+{OVMj zxc*wv^bU>(zFW1G3_sKx<#{_8TdR*sQkuICzDzTNQV`dIZN>u?%;``j_z=nho1=W!&9Z?wbX|F?n$kxxwP4dR6*F zTZG#Qxau@P19cRIZhtS&GCmu3qpNRE!3~W(4}aC*(yQwiUr6e*s*|H|kDFqmuV%!Q zr>TU?bo=fGRQ{+9Tg>bX(j>H`>z6x<$H$Bw%>C4Dv=_U-T2Eq%`99?^ou?K9{yf{l z(dM-sS+6cZsU++aPgz&9-kSuDKctBVhpqov;q@7dr*U=95=p;4l5(kqxZeYUe-}WA z(itpDhe&H&cHBz)K4duF>+|CFUe~Quf|8>-glvA=BZtMdHc}vi7rGUOOdk|kMNr?E zTsN>pTR`muEymjRmd^l>W^tGOh3Hz}06w{@aM{O!s7}9iI)fFF5|d}e%J(*7SqZ;> zIpR?YJ0W%WL%UvWpI~n5y;(6u=a^c*W-XmB~_Xe?4l}g97)Uqu0H3Rm z-l<7BtI{0Mb9AV9WfC|T)hlK)mq)xiUB(mBfY_dCYi!uU*@*18zrBDTcsca@3S!*1 zUDl*4UHcOsDK)VNQD#_TJ*Oz05coXb!NMA8nVou&Hn1y_749^w@U=vZgX&hS_OoXD zmoAYJ@NMYM%of#TDc8ASblkYv%+af+?MST|b zI)K4g=P*unht0r^FInWv+&8ciZB%`s>?nx}>AYX@S*m8Bb#CE)F%B?izG;A6OKe7o z>V5a#@3O{$FhM=#@^AI(QrHczYBl&s!hFwfJj8AbQhIIyJJF;+@n!fjJ(u(7paw&qj$2Zs|v-{zKx$6^lD-D|w!vhZ!9j;c)tjsF~GJ}!CTDS|Z zXBZG818`k)IM_+Mm_$o}MPVby>Gm#MEz2oK+*1=$u)y4;F@VE?f_Nq zoA)(7?y{-n#7C2A3z$IzE}Sm_qimqy01kQ@9(w&-g<0%KI+TYE1+G+_J#AJVnD`tt zy`L>77V$b|$bD&Tz%pz#gvFeEmP*uFUiD)IH<~%y4Kgp=WmSob(90u`Qk+;8HhOuH zBiR$>*{c7NlbLl0GZTN%)q4CFgwepCJI!B~fQlEK!86ljRg9ki#^Pc#tR8eAA2O(W z9>jeuXniu4h@IY#EoDTe14;n6$zS*cypN1)2K-9DW5UpY*I2GM zxQ2vli8m4p0*G`BKp9w;u0v!jTpSEqWFw~7V^08^yspztH1wyn-vCBkvrRHjr#SV% z3YE*8zB;yJWF6ty-_adOanbk4Nl2M?zOJ;zuO#AkbCcBrEJg+IdlUWLtcgY!HF<+t z_|+p-60xjUb%!m}!Dxo6)a&LWa~^drC1`=_axlKn^4>N$fMDFbv93n~y1-j}nO9Q! zpA+?qx|ZVZv}JDJHNg^DJk(xdF)0lf`)6c`uZ-@w*QVbI`nSMdy%^v&*%H;H4N1?%W;Dk_LM7s?=-6<^B%4S<7eSg=a#i@{W2PXMQT1TN*%=-+1MUV&%~)$+ z4(ux$F~Ur9l(UBb~FvRcy%*1B`7Tw95Oq|1P_u~nimL5NeGg5EGOp9QHo;a|O7`s{W ziFd7I$yhSWX&DlJx~5s$L$+e4E}|0jb-N__6Iei zGniZVo)Jbc8?emiO7l*+!laT_-|GaP{O~fdx3jLDmw>&`4MJ};2fI*8(3rC!^?tm@ znt!*$Wc)%%cAih^BxTG}%e187cP@Com^@lgOS+QNJ5V4SC-9R&EJ^Ng$RKemp&%g5 z9e#Pv#?A%is8^cLH*VOwINX*e%nBEnPKInS>nN_DsHD_4hmhcMA*jp2ea2M zD-?P!?;UGm=>ajlnmW)TB;sUxwFIHx=FdVFBiMT@Ge4YTH9-RZ73=8YZ)IXK_(ste zyx23#5CFC!m>_B2u}qz1##xr9WMiK|*`){J%JyM6O@Z=y@Khsom{ zIp){fV2Lt04C$DdM#I?*_rKR&-;{qUniSHh+Nm;be@dFn+2d-=44;9E*e)Z*k|@&H zJz%3Wem22Y{PT7Zj#2`FO)ER6zH%%P`ntr02_KGL)fRjqh0kc#hCjS^WS?R4ivGl9 zG$+Mo=J%zUtX|U(QK3tN8$+Rz79DneyBrZM{5cy2LSOr&GS2rxWqKhD_qXQZy<;hP zUljW7%Z&#H8=vQ`d!{o=a0|W*saY_;oiMz3JHaCUt%s|ft&5npk-9A(|Y2aBUXF$7W z8kV<$3-S6!HUo*b2%B2Qq!6HYb7Rcqrr!EwBpG{*4_8Hf7-(R!0kaHu+kF2W&%j0P zy9{Zkgs0+ZxSF-=D>QOOpaFBy7N_#BGzQ?I_xMeZf?0(=qc8O$QKzKGK$6mH#Sm`H zQkbjOkjVyVxn6J#nU&N^JTu!PUeedj{qJmSEK&R7+F-hkEDpgK{q4y%p71y-9$bVw zf2^A=Ts{bS3kXhT!g=Q7+T0YOpM%oio^6a_XSe^}sl$c4|4L)Ri}DEv?WDC?UtLF-30lfG8J`s<7bnBa?9&3n}6Ac;;%R? zQzZu4Y;(K?dr>%bPoHu-6mzekLO6QDbiuGB?ihAngk-Z_!n*I7BE6D5LtL*!0WRXj zwGbBh+FMz8v7ic8s71fH3@gC{kaqUJeF3xM;Ggc|A*39Npd}Kltg=*2tCKUkrpGI+ zZu2(B8p4{xeWrC*4aIpI9;d|&*0=oFZ5b;BQsno>XPypTuWyv;Dp9y6XVb6ow*90; zoaZx}{jynFHc(mES=vu|54BTttl#XWoz#aMa8o3E6-}zxb2(AtX(Z(wg`e-nG}h$r zpIlmaINfkx7?qNoPF9&>94Hu+>U4r9#i?e;z2dlA*4Nkgo&U&lDD`6E7Nr{fHhi5W zYR@QnuBQD;9 z!P|`1NS640uKkIA`vd5?HlNm$ceN@>z|q&U+D9IBeP(YevJKYQa=A;Xd<1!wuH>yx zV*JU-hv0RyM;Y->*-Ynv8*eQas{!p_7u$=qxS7I^+*g}H0X%Q#zSMHZiaIStFVVE; zc{aX+f&F!>@b`F%GD4&Q;8nS*dMDH26sGe$?PiO0))=IOa&9u4a}OfwyvUzYTOB;f zq_UgH_yPUswzBSzX0xwag?{HNO2Hzr)+~k!qaqN;A|<7W27$h5Qv>O3tl3TBdCd6O zjT0HyqIxZ+wkPLn5Btd;lvjp`=bY8~WUc7MH7k@YvX{>4_6r{*Wc`Itc+C(0evps; zvU^gfM+tL)_ro{~0tdu&K1#HZ@@*PiX$0{@fg>CUejf-v(UfVU)ZTizQyjM|j5he4 z#E*t)@fW?0H}ROg-KXQD-mpAPn;&ii9}vEy7bvzx7FT-lc2@s%pi1=SD#*TuG?w?JW_Xz^F#YX*&^i8WAgc(j16d!=M3H( zN#YLXel3=Sgjv2xhaUo;q<_iZzuJOrj10wLinsiJ!FIVE$sW&5oG0MEPobJ2{Fc?* zfE&5F+OI}=-<#&|Rv>jlW1wFITRSh74PU$blYd;z&7T3r$<*`A`C9Vs{oHF5059vj zMBVW!0V)POBI=}$#Ev61kqMWYm$lBiHkTy^Z&**52S09?CU|);_9e9-kEikT9$3i7 zt3PJlo-}vTRuaH8lRqd~lbxZ63~?y%dUmbd4$is}dH0D+7g}JaBVfOV8Dm67PS%RF zhV{z3V`s$!M9b#oj$cK|LgR?SR_F|}`xz9-zJx|3Zqc~_Y^97&>JC9EZV{0H09>BY zXxKWF+YYx4;vl>2X+NRJEgkxI(Yf0)OMi#LtXa`XHCKqLZ!lqizZ4gFtU^PnWQhU5 z6%p^vasu-p>1Ka0gvU|@=VA^T)_DU^+`Mj9?cYwe-W#bgExTIP%8|KF_2qIW9m9L!6-p_V=Ch{C4vqqn}*KT5^9(}NkTZmmQPy?m_ zo4>3pLfoYkqf*VY_SK77*_f29^Zh?Afh+WR+yC_O+l;@ngWq^Y(2g%>TsmttJ<+DL zWR3@=V(`-L4L@<(tuVM!yCI$j{WZ|ObS#y0E$Y}XQ39cMU-%#nmJ_v~j8t=^NkW15 zS}v5Fh|t1s@d}1%Y+z;b@q~?K-w0(RLfRADmhBDRfOvCAoj&2=+G)~HzHQMt$uApnfqy3P;+Ks`**}5wTp)HUN|QW z+$R$C9Wd$d=R4*G>7&ii8jO#E66#Q&*~W7l@$uHrL(#bf%{&j2+%rt%(2vKVlJ9W;wdgYg$brt23Sp1u?+od zS<678Lf_h0o$*_Y_)ZP+DuUG7ATm75m11hQZdB^ z=&QTpqvLhD?ofS&n5kmLsWQu<2em4tJfC$|#%42n0_$N4#jgG0$6uM)7s%xept*Mu zdp@XBeI&Dl@f>(m&i6N8-vL}@7|d=4N_8F$xu#&eT+)Szs2o;rd}FSWeoXY6^ysWZ z2Zd<*jT&{pIMWs43LS3+0@eDfwY!M8DE1V?{6igKlP@~N2y_sRrLyybd@VTIA>ybV z;$i70>a9w0=qMm0wBSs^;ESC(QYb8z=W%h)3$qgag{&9Tt@~m8;ekY+!g|p$9P`&u z4vMVABYXT(pL)LX*{C$~V>^9pR5bd;<>4eg6voUeS^AWqtx5WoQnO>|Xr*LOis3C; zrB>$$VHkD1u3FY=q=W|~Ut{abN<6EVSR86c`iC!)b9=f|l6vqTzc@y`_~?yKfa9g< z_IOhc>^F%LJme1>S?szWwG~n|Hiq1wEvYi6r@c|u@D9Df4)H`f{xBqeU{|}`9zTfz zZTPEuxk&O@f+_KIf$7@~m^`~_g=Bz)NArmnx$!r2dw58p$*FE~g0DFm#!U{IjO8aY zvUXLtg3SxIm4%esJ``71T;0}^Zz&r~A9i%mFSdQ=kdEHxn)KwV^X~?Zz&#YbFKMN8=QIQNWT0P-pX3H-& zpKLPVa{n^%X83GqHuBl#`;K+MG(a?WR4u83)r2y&! zn)pR|{D^|B=P5;uZZm?5zKlN-7xK)GDk*mX7kz^fyofZwRbkcsSf`{HWT^9&p;12C zsh*^e&*SAn)KTrCACu8dKgS?7F6S^15``;sF{>Wp<7KCV;CgqE+1%iftd4i_$qLWA zx{(|hzYbfIo?7#?9P8SiZhU4RRaktU#3P4S;F~=1UPftmwP)RRwJkoiRIixVl4lqH z!fW`&ZUV3r1HQ>CE+DCU7>8O3Rcbi_`Y!4`^5IUck}@00XQB= zvhi>lb@IDgL)M*?D^uWUWmcoySblq6N&_}&gyEDu?0!c3>Wv6jUQgGe33oQiZxb^& zZp*GmZYMbmeSpdg|6Th=+o`E^Y`?t5K3RCe;(a02Ce)@(MLkj2eo*}JVFnDeV{7_L zIUb0P;rBa<)4lm<*8_BdVcu1A?z4QWr3THu;4#AW1jZPcttuM~jgcekxoW>3^^l_X)M#N2mBcZjz(epHi8aYwYifhC_<~jl?6GzE8evwh-8uC z5P5?kINyE9hi4N{2fwRZb9sbMYJ8M~1Y2zv+I|l+b<4$nfoqGL{IHVV*R|Lgz?KbM zh&mn?Qi?$ipv9^dW6ymFaNh1Qh z_MgfD0;~7PH2?lFvLD5D!9j?%A4Dz$nW2KH-xAXkL5ORYmo?)iV{{Bz@}8IrwN(@@ zsa0%_ITBCh=`k!1PVpC&CSs1voT3nRr4D}(Cq|9z8<1#AOIqWL&kO?4=iT&X(2(f#qo&uM~bUUj@KY(jirz+T#%k_AmSpVKte z^G?e9mYbCpn6^;WFA1%^3os=_MYIp_eRzjn5s+-A&lE_77QY_35bxBjnI#clYf;7I zKj8e$m?7cp6W`Dt&QoSo+|#$($2LZ~7=TfVIhxXmPsY+#@78$_6Da+Kb6=c*dFBEM ziqJM2kd!vI)#xUst_e-tYy0UC`uqNK>=67Y$y;eSj2enL@xI`W3ZCm4zplTeI8G!R zg*lXTh9Xmlul-xKZaB^4aT>i}MfGdY*RTJGKc|nM$!ELGd|sfEX%$Lg!Nt5I6^~2n z#$p$D>@na`u_xgk`qGh08E`5gBI_gG+ea#HESf$_q0D5#ALL5C3UE`tONJ)#PrHWP znJCo|-#G!vtJWj4za%n`GC95PVojs-rob2!78x0hb&t*DC+JR~!o~)VfQMHg0)ITD zT*9gapwQNMt7?-I7UT&lE8bU@O1O)wPcDT;|HE2w9=%1ptDIu5IyHvURZ{w3s`tf& z)V_(*8oqJTyekdL-*ZYUxBYxZV1fcHkJH0ndCbf=c!TfRSd1|(Ebp$&OFcNmVr9~# z!R~0Q7@oscQlc0${uvJ*Bpoa8=6V1bV1a=mLjhS~X1f_*)|q-#E;GFANnaRx$I6tj z*SmKL3t0*+VXyXR)j#ny*(l8c&Tn(9rxY(4gP+CjWy$I zD6F5Yqf&*Rq0R~_mNKK9V^UbzGnUfRRMBk8MlKz z8CNHY2Nl+$q2cW)zkBmhqqlR3UWT@nRbU~DN?o>(TRDACtb_>>(llZO%fsP6*?Nv@ z!WC0egQC^v!38K&t+cy^Rh47@7;b`+Mvo#rPAQFv5-{S82F@r$7dgdPb|PBzsDvlJM6K>wu$hbY@@C1b)p<{f$0u1DLgIX7mdFZ7|xHgV_};j4XD@Z;uy$J-eq)xv_^ zo!Re~U&gez^#!j-6U%gj@wxZ#<|d16#4Q;k6n0ct&kHJFRB$mDI-X%A^&hW4xM1uW z2-Od&j`AoMxV3;aZVIZzL1rS*ckj-pjr$h$t7P_0xGv}dx6FP$oIBt0JwCb8csS>s znfFHLw{=N08c;h)6nES#)9bFMC_gVt?a**Ym^=M3=5vHj5r}8AdE+=iX7zDDTk9MY z7$UL*@wedD{fdYDQ`A;CQ6({sg=D_pk}93Edy{pg!#CgbmWR;K5s>V@_%C`e79K_&3L zn@MXzLvpmZ=H3CH5m}m!PyY&asIi0@Bh&?V>FCFSu$WnwNQn55?^JF8+uz{3l3aS) z;yc0<#oUYH^C;u5?4GQbZLS*?Eu<-LWDnpM6?!rO!p|;+zH-Zy!i#OoZTzfV^IJj? z(L^Q7w$BmI-RNbWUW)hQ7CQPpJ=_`rhZa^kHKiH!ja)OEk71cCLREfBT@6c(WrPk@9{N*=4$-WO=6fAagbv*~ z!7fqlg$$u`7BGQh({(Pn{yBtp?{Z>gAClql-I~|xE9>J=Mh${Vjr(&-E+FlYgaskg z?qbSnmh}|S{>VEeUD3e=oXQY(E)lhz{$A)nd+Z}BbA(n=-AuV1X_kfl*w{SX?(h_d zhY>{ZViHmw%5qgl+)BVp^O4-$yATjBf2`@Y6*F?|YmqLb7Lm#C(?d$D74hRt;`tsQ zwL!$3^__KP2ITI|d)mJZLozc~HC?AQBn8i=-?Y;QTI;)2`tAzM`VCpoA zJr|uNByMInE^AOsFI#K>?!eBivu3UMBtF~Rw5HoPTU^NLw}@EzEhNd5F+9t1%i%no z>2Q~2CFvaLFgVm@UmoaUv$iDLh{F0pC||R)9i%E{`2WPYpxYouTc*Jj-SX!{hp~A} zlS4WS68HONz0{N~%F+`1Ub69q)RKo+iXqvyx`V|tziz1_rX>KmTy=b6dQF6WluNA+btP)@g`gn_kG~`^`#;OuZFq%EpK~9lc8BQp#@zUlZ1SV%A26 z8tri)w7sQ-&BO2->u%vR_mJ8$^5~z3ARGQAvL(KcPJb&XexCRQ7M9!aE4i^c(4>po zHvy>jDK#z`C`HF8ZVdRaW^I-%GX`f~Kv%d!g~T821zK`lFJ2^&=KDj-s(0C@d$aY_ zD(h{!rhb?iJG09eD7j)GG8#P(0X0YR!=uInd=)S!3ca&I zxS_YP@+V6rimvj3b++S0jr(l+)%Jhro=n%jD7wjdHbl|Yvf-bpoIY;rHmd(aChC_~ ztX4=nmE8gxy_(U=+Bsxwau@Txi(=Q}# zTF~j4u|8@Po6NLwEvX4I?XKV>2obXaMo+&sOLN*Fhv<|#tU=DlScivcT|chk(&`;0 zgEGnW#|Ms%%SzLytSVDFZS5}xGOp$vu0tNY0jyI*d3T}IVzt&q8(1UQEveD{GG^G3qiK~k;I7(Do!A%1Zbyest7$xdmD7NO%~r*emGCF_ zV<$=@0|xqfdvPni5b^1<_JA_%o{u_cVBYSF{0`TRvGqb==LXvmjUT?~K!0WP38Dw{vY!3*CpOXcU3Jd}_o<(LQ0L9gHQu zb#?#Lfj}#1-$|TAC$*aF)*KCR+2LP*gWI!kUt!lV=^P3#rt>-%fl{5;{CFiw!G{Ll z8f%P8gL?(RZ_s-(#}YBTo6!05F}xQa44uM_W=+IBe}%Ca40@xB-8#!ei=H$P237_n z>KqPXuMAs6-MG$S@&v&NxlMcyBTPjUfHG*43s79Nb78_7`zK@L@o>BDw>B%{Wcm)* zo)zxqv%wlF15RjM>V8;Y0{_<7)h)QevCPXyptOd%37W3cd7#r_UAtxM} z{Pb%)Z9bqgm(1-CaFHuj8BH zBCql9NygDKg#hZy49;6Tp_F_*34xfe$SAkWM9)|(7vG8=kOraG1aO$mIG`b)@s>)V zw>b6;w(UMI!{Y9C9~oxZGhF0D6OOU(BH+JpqTpMZaBaW1&Y)6{f0}z>;j;N3BUeLt zT-o6GG&A_953MJ3lcdE9%`=-Oq9CjNw8kxFU4bZQ$BoAHBYO6;!hNb9z_Xf>ZVvS9 z#*(EoKsOr({HZ_Pb?KbftqP6z>^zK|Q?_*FFu5!+?N1;eF>J*+eQ02eKQyy>0? z+gSXgL0=@Go}64x(kWc13)o(M^I*eK{6CQ{F{G?lK#c)+V6gZP$(PY!8AHtZW)^2IYSb zkRN`OHg9xZZ_GvVyrKH>sJ-)VI`cadWCq);BtU{ji|%_%qOzY>2Fo<`4;G`X45(nq zkj`Du^`HgGNJw$U?#bI0Vo{te!Li&yjjKe|`$%DkE`r~cI}Cv+@~=dOun=s(eaTtwaRm13KBr03TBpD^KeQb*+f2>-L7E&p-5Kjb>LRifbk>&?Hu z@!6nC`U?PZe&gL~K5g^ 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. -``` -┌────────────┐ "What's the latest AI news?" ┌──────────────────────────┐ -│ User │ ─────────────────────────────▶ │ Strands Agent │ -│ │◀───────────────────────────── │ (Claude Sonnet 4) │ -│ │ "Here's what I found: [...]" │ │ -└────────────┘ │ tools: [WebSearch] │ - │ │ │ - └───────┼──────────────────┘ - │ MCP tools/call - ▼ - ┌──────────────────────────┐ - │ AgentCore Gateway │ - │ → Web Search Connector │ - │ → Structured results │ - └──────────────────────────┘ -``` + +![Strands Agent web search Architecture](images/strands-web-search-architecture.png) ## How It Works diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/images/strands-web-search-architecture.png b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/images/strands-web-search-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc769924a08c0471c7842f5cb5ff6b5852ce673 GIT binary patch literal 141999 zcmdpe1zc2F|F;& zK;b@j2I!GBK%qTxLirL@Obu!R(>DTxPEfLn99~hfFd0HDp_Htmlq@XTW@Zd}M%o4z z+9s9^rXVQL1>Dy*0GT2N$ble-eU`e~V9?=1%!fTX5DPt!#bFl{yo*(gl1T`79R5G6 z2x3~GVXAF{cv1;!p>3*X3G@jaECC-YjBJTOEI`1uDo6+TTM49Xp=)@!kdfZuB9@0w z)7yY_EDvteBgY(H8M(d*Ou|Cj%up7h2Lb~V>cJ2%&&&>dBK#}$Y!7=lIJpix3@nf< zA-)jap=4x-{Op5|WMML}GSUNCB4#^$5(@D8P4Z9lwM)kqI&h#1Slgm^#r4M~uZfgxgPPUH;}ZRB9YNJ~R) zJ&4V*wSK*i$lbJnK!E9v5%}=N@xS2=CISM(HygQ+h;=Ag#Q*%WN4sHh#Ek#VbWkHG zz`qBCH`D$;C1Mpzs4bGap&%IWrNV|#6ELtd%)lkUcMxNc2m}m)bGs?T6d;c5%z7>k(`*+#qqd`0+u5X1xowXg+dH9W?etO$zQeCJ~hB)1}# zVPQjzK}ahzGor1H5F>-5so_HXM_3IQgW%NPfBoNJXe&#Qg_aHk_D2}W0%B#V2ZGBs zoTN7JtyD78)`io?2GC4E-!UFL&Q1Wu#Si`fLw?D7$9duK4pIXEq!0$QA(E-!%_HfC zFaImvKy>_%3CjIzf-=L20w)cEpvWNzda|(pbb1;An);6r6xdKRIQ2|mfW0&`WYD&; zWMi-ZSwgHVbU{+^Nmzw}=Hb;ZN5T09;8$U=whjm^tgUNoaKIf%8As?8OJfieFnX+_ zfc^ZtD8_~`e#b-**@YBzW{$(%`R7pVU>pAk$^LF-4wt(F<^I1{<|+USAru@7lL*)d zZWRyY>VK`2k@9+sBYu=&z(O1>jo=7YCicVjPtnN$+%bjzT&2v+#wjK&1knBmrOdz% z^nF*$T<{S{%=I^FWtQKtv#dzFijZ%$7xMm3;RhX%o&`kLSj*B%=kGvY+~Pvw!bjqaw9)|j z;u2v4klE24B>H0hLC^t=`nMTy4utMKMoZQoFf{9rnCquvXe2HF2H1sI3LwTm4|uU6 zP}Om|A-a$vh$JHtc)?{BF19~a1ph|t1qSKEUGYEUMkC#3rGJgQj)eD5s^lX_Tli25 z9TMSxt&^F54aAv$u+eO62nIM}h@a^@A?4WQFv13B%)dIa@+TOA8(^Ft!YJ%)?7|#K z)BPt*vItn)N)H~IRDwtJ0MyL{L`OKlaMskZ0Im$+S2PIbK*k$y{54#{@@p>PMlc0Z zYy4oij{+z^MQgw#qn1D2Y#)KKU*hwhX||D6IB_3_D`hb-(a)>cMfEs z4c1Z;l>y}HpJ%v#Lj;jsND)L55}~J$@Yqiz-2Yv(eI&ep(rh279!l1Oj1;>tkXAzE zl-S{kFF=X^9R?gJi1Q^Bmcn z9{?jj+wb9AAW)8o_8-;=AYG2%aY2vf{gbv#>8Nl5j*9*g)dZgu&ilty6EXyh;1mud zHz8pS`_Hsq2HH@NjkfL24g8CVaxw#8@1Gj@XGY5MF`}{}gMUc*=R!~sK~=V&>SZ9Q z`ZxF)+Ga*th~)qR{`33{Wbo%0?T}qasDRA7AxOuLZ2uJ1jU?Sa)YD)^D(in8AUu-h zKdGIC;2B6n`I^L`TKbE0G$P)2j3tiBzK}eD6nP|1AjSQs@`RZM1PalG0JUNN{{l$B zs{qU=V5vdcCfYjiVlyU5Wo4ib{>lGqV25-Hj&Z_~vj10{fHdDfg%c3fkPwT%D;OvW zl+1}7S>|Kd?nugiz;^$v93IOL;EN5Z+mUkpQ^D7FYW@v|8W|8Yf|pgo1MvSuYmE#6 z9ur7p7g8RPg*8YDA~Ux?SswqP_WBPb^o}I?PulAP_Z$)P`DM8|lgMGwHc;vN*Qo7Z zr*D33z*!I1K4KF@`zNyr5WlbjL;p{NfLO)3I9QO0KBPB}bk_ew;_o=00CwH#pb{Dp z%Q@T&CYpl^LlzOh#9LVa@CJT?C|iPGnpx=p!9+ulo+tnd|Du%OZ$JSSq^d!x9`+x2 zitC@jQ)U)M*4ny2Rro&)6>=ebg=46Ji<6t3n*-7RXLv{)sHPW(7t|kwn1xi8=uNau zfv_r^kBoomLNPvm3Gt9_i zP(PKde*>J3y;wa*@YwcOaAp3XaVrV~C9(hq=GKn)=V z5L0ci*!N!HU#1bikGTzj0Eym%6MT3YSv2>v7nE%joxX(J^>=bj0(QK`HooB9N(`5d7FM@Td+LD1uiuG=iTr1G>e5 zGpIl>+*1Zxh*v{mROC@Wq~CLFu_LDc{iMh5YeW#t2nzpnW(KB%7XX@v9}g6=0`CJf zzkfTtf&6s%9R-ku5pW(9eromDSvRP*g#kReBMMOeuA}|g;fo; zfiexau(5IjO+fINpoZ|UD;RLL;1wK9LQ=qArXcuT!I|s#PkzGPCt%-z1I@<{ zu3CVAd5x@p$&qmK0`oC3FmbUWI1>J$Ko>Kj`CHQTM^^v-4hj$;@&&vQawdqrz9sUg z{=Yx(dN|LoXG6UC5!y$*HVX#=IwDs)tWrR{16-uD_{rj-n+06P2T<4G(hwYr$U(-cZnn!o#&d4}eF2is@gJ zN*o-Jf$NuJTIuM0{wu8n|K@+MUVdpQep9PS&NeiZ)qW$5211^OR!*MFjMev0@T*c|T2 z{~_T&NISs=9xlj8OZr`gfg9gVCsO#C4j+Oy;ZGeXkON_dEA{WKe<}J$Wk^4WK4RKG zg*T3Vzv8e6>PWJYcnkhXKS=t~^8byb9}@aFWvpq|3E<J;9BfR zHyu}LhYIMoP{1!$(_v`!Pr5?z*Z3V=0(cHgM^!;TXs_RTqyJu89RnJ7zNgdv8224R z((q#9-}6NPPyd%nh@RzlLiT@Td8FPjf&Hb<2-^=n6dORFUm%=Ab^m|G89_#x4?f}l z4kST>kOOGJz=9O!-xlBlm*dEbIYK1g0m}Es4iL(}#3V<7*uP%zfddtPMDUN^=)V{I z<1hum72h*h$F#yhSP^(T<->U4A2Y{)4xunHu_A;DVV>!MpCJ2%kp0ix2;{{7YN7uG z!TgP8SReS!J7hHBuRingr+zbz``3{AKTS_7APX}O&dL4D62^mg7$>}<0r(#t`aX1h zk8&SONAYm@5ahr+AOrZhn1iXUEa^eomQc87`HRWKfuEiP*+49e4~Hoo9drH|V*T1Pk zX+j=fd{p!o@_`r7p!rhv{u8P$$EW^22c2*U)})wPPUqIM$Hv~jHAap6 z92Z%k_(LmkVw8A~$F$?WeqCj2;6;*V_(ygu&ncfq4fp-kr(8UDQsNzFbc405)j8!W zsCPbHrZDc-GU&gqpmM2c^QB+h&~n_yYonM_l^a??wIA#KJu-ys{5>Xkh!G#J#tMH6 zeKV`O#3<9KPhO|%5Bmy<^B_Nh3$sQ(wFyrIJI{`)%!dPkU9A zqft;#E*a6DanS;X*e=yQ>wcAtq&;W!)Y-eF@;ksUqxP_8)oQJO+g@M|xA=BtV(+s- ztX-S|sPgGb1cLS@Qz8H<+T3E(M=q%uob!s}Lc`Ovy|BhNff{bN7sNFccp;@#Kw`j^ zRb98Vyhf5Dfa03e4zDGy)27KaaWA5>8vKyE+~?K`HZMd=#fmP%_|T-tu(lFwhQ2(u zU#(w%7>|4Q?PLS}Vy_G&CE^XStZSLnqeq~+#Jhc|!_;rJ_Me3Cfw~FiPp#%xik|U2 zdCKjYpQIWe9j4P zbbO{BNSq^0C7w=_$K+dL<1Jd_*$~xv{kA&zvYpcoH$&bOF72tan7a9Q?oy>Dx1IIR zpLeE9jLNXBCGa(03uri7lVQX20^wYR79$ zZeg&!&nsB;sh3~qR#Q_ex17M-S=)YSNHn?Qm(Z|Bv@&ki&V1o-m3 z57@k&9>qs8S$*fhEXI?4uUp!RSogK;dAIgf;xkoZ?AXD1Ql|m~%bCIDl6B$icokxl zYa3S%K@q^`tg7a6N+_}{v&dd<^g($c(l3+>$uh1@2s z|FiIyP95vxcQSni_6aI7bf1M7qQtF9O9!>C;%@*WTt|he(UtS7CdIT z78@!{hxpST&-}^GXroiepJp%yPcY_2 zmCW=P9SK~ie$K+;w#Ky|Zu4I$ex)a!prQ8Ov#WTqBFX-d%~;-ttbVAhF%fj2C}+;Y zQ?bsRGW_}S^NHL<$YXxD7b=~;H+*6#8m~SRHXU`ine6y^l(TEP?PKb&k&?BDpXR-N ztC{ix&9augWF((aVjsEN;%ho`^2oX9jFN|#AAxZ>j>B{xC|TD@0rJ6D0RuCZJs zzoquY((5qpjCb#%qtE%1`JeUkMxFL=c)JC=j7vu!?C!8>qIKEtMMt7iEtNL`KZYID zLEGtitIQ>8EVNnrG{3ir3W0YuJJpP(Cg1EU8}M4up|!T$yp8FL*Wss0bKmb(Qa2e3 zX!|k6ZJhDT+hU`ET6ZJu=B~^*mw$rojdCXJQqf?uuG&>#!M$j@|MU__=4eQ+zH!~W! z_4VvR=W+wB)ht_eaMq1T`<;^x>oxfsW5d~tE$PH&15Wlm9EM&Wy()ZkDO{?^qExgd zeAz4e$coEWVoBpQ?)iam<@OC;WMG`dxcVH$e@i$C1A}BM*gpZCi0|?<>2Wn8KB%kg zGCwBoe8z*220q>*smCM5m;J#a;$PZn9Q5L&qeFCaLO3z8Uuo3ZOwuZEdQF5Xq#C0@ z#LZ?XXJOK5&b3+GIGE=CCT%$9CFAbg#nmpX9#)_hv#$+kdM+)cwU!xoldi2n7<-a( z`)+rO2Jf9k-J+>C;h*@26tw`JJ&*dr+k@F*vzm8CmSZ)SEoGeT#~7}xp@FzvnR z$OK*s=x50)UDbYX{C-wR|6Qk$rz<ln;Pz~o>m%4ZLx|B zD{^w*S)s3C&S$f~L6sCr7Z*j95Ea+&eqdlfdI1dh;HrJaCZOrjP}#a_K0@-XSh1UQ z=rq(`=zWQ9##Jv_MyZPsBqfftJ=yQLpRPi@Gp?00@FmP_Fo;ukt#@;+xx`Xk%a^xD zQ2Obe#}ZLa%}%8A>wra^Nmk4$oGs&;akXsLDUL~D9SvM&7(Wjaq~Jaoydy9np9IzN z?djq7a;B0^rFEzG6^Iy_zs%P(c&~2QBW}fCs$pnCD7mq?!rVaPX&(k3E@!6g3Bgsu zlCKNJYP5HrQEFI)djN(B$KZj*#Wk=MQA6R3IN$mmRheu43911Z6tg$bWu9+qYD}uk zywmk9)emD+z8vMSNKEazi5o189fn%tLX}`b>OizjV$HI~y+X0IckbKVqMwOdQT%H? zV(c#Gbr*T_CGOy!HB#8fq~UroHM7mPf(*tR8M*6<`HxzY_em%A_Na05AFK(Uzh6ID z-?k`9_Bo7rI5CnWH%Mu|XrGxOXNYP-v7c;9Sx-vuDNfbPCdm&4FAU3vrIHLQrQZ7| zXyy4Yg$|VGp=voS7uM(OeepEmvTP^XS*blir>1bOPvZtzd+4>=d8LLz6y7;YR3E|R zI}WYeXEp3*XK^oJIS;<1XkS|PqmIhWZ8Zn=0rdma2hYKZ+Yr&UAlid}E> z9@YeJ)O|(GZZ6nvA_?qGZCLwGx-~+kb5l_tv|w#xAOp~wWhKlv6+XOX z*0ZUFXTsQfFRxC0O&`_>k$uhM;<$bZLtu_BqjOy{9M&E?v1N@pgd^|Ucsb8%ziCar z!{%F+V8DkV44+nY-G8zJj8teVf#$i3sIEm?WnT-As8)L`{@nKPRX!#hw1k(P!-Q@ zb6buLyBlbgE*fZn8$Y4HGB50TtTuJVjlR5Z!#%)UJ%1l-J^hn2R^w;`F10u9ruY>f z!da0|)$BrCc4hD9!cGb}dDsp(&`P3rjEGdU0KEU`UL zQqCU6%BIlnOVAmmiTf{j$43WgQX6dA_A4R!F}b-odLSk z6>F3WTk8CuEcsLUBZhbGPB70>Fw3OTzs5ZmwT8+6dC{KPhi6oSZ)e0ZL=bYamfEC; z)FA-}S_oVDgvXVI1B895%MY53*Qm7K2Lx2&r3D0$6(0(D&wV zjGvaqM%X(qJZ}Zw*Rc3i27s>2yH;(4)$}TZw(fJ?2qcv|!2GvB!q>vll&O5f83D{) zB7HrjUo$^QZVHmSeX?L>OTEd4CG+W(@i_5toSS}?+5Ov>08M3N;)%Mp@5r>Z&x{{> zPA+VZapgf9rk&%HbcQ0_2q}v*7q9wsrH>2w#;*;G+(l(_E7#X{5(uNC^SZm)zqWaD^MdEKQl;`BB0smV`MfC9Y4VS=_hn~lI6S_3C}WUvd(3+D z*zxc!lg&{qw%DBJOwz(^bsr3yFT(7DR%aMBMUjKI8FRO+du``q@OgG1hLqz~PP@RS@>4(+L}rmX}WO4n0rl)s2>! z;+F)j%oVp+S-2U)zFp;==AN_PY_LGJ9UHPs z3uYM}coER3HN|yl4^p`9H|xwDNb#nLEAVz02hNf#W37^A?e3bere0SK>nhxyL3tBydTw*I)v$^YoAIv*;iKFw_#wxuc9&SsZj_G~7)a)7dJgx6b z6w9m@k!817Q+-5k!JtyQ_(k+RORoD`mb}kjo`|2Nv>+X8jg;Yay%dv*CYQ^EsNMSGh&Fr)kbx-2iizgy{JNmxiCKvBUIzkJz zUA*aDr7E5P;{-g1nr;i2s8xmsy#85y1qEsv5z@nd>K!}{6gb;)xvT`*tR_~7La@@I+@gP z=7Ci!f6lz$huMuVJ}UyJjZM{WqEom-m8s#2`weTDgVWy}nRUnL>IS4!l9*plzu&Ui z&~jEMB!`(ur$z~Gj9l1RT{l$M2wB;8ytK7!mt-k9JiTb3mBC3{>Xcagb-MlWlc`|O z#la6+UBR2)B)s1=W4JMDWGp6NWFLs&We^+Y!*zcpEv8P?uFeXG;%*|c7+Z=Dym z^~oS_Z_2)Pq93$neZIxxlsnD4rmxp!IiFv&Yc}?*<5F_}Y>xE8^Wkhqr}9mT_T?OG z%~JDNLbpdzrk|501q@jGiVwhw+6{P+;YLn)nn?80b%hVsvf*YcZ`xBgFW{O54H0XY zZL(`L!*Fr-UZeJ}E2N9FJFKk5cfRksdlwRn%R5jX%rm$;9wo#wdhhKAuN*4t@YHap zrPQ3f)n^~oKXBY9PQlci-=WxY`gSU6-QiT9rqkWHOOso=157W%J-{@IIFYpsTxYcu z=7()G#Z2WGG8|VQXiYRv?d%9oFoR;*P0}dyiud^JoLh)FA2`1DPY5(yiVbRI9s7xQCu}p3)${2SZ?4u-S4!MwQ3t*sotHzr8+q>ZJH64l zJJGy)8cK;P4FK$UW|PX>yq~_N>ZQvPc1rj@Yun6-&-m2(L3bcpyVIm2VsWtNL7?7f zc&mIRVFd5nzS-?~N0ZtjXr4hJ9g{Bfg)V)8s7|+T0*-x2GF})_QpP1@#HfCkoySpy)Dk{M@xs zP(?^1h@ls+>vlGpnX1o_?P<1_?KhtalQ7Pz9P#-WzYVO4Fn5*bqe)_Il30oB67Vqs7{Ib}D(Y*-~R z7DfAp*LhEm*;H$4B1ekG{PA3#{wMK+`8Uy`99QYlCQ&0X#j+ULO~3Bn7;8_ur~9k} zRd9hm*Ulw=g$~7gJ`w^I-&{p{a$pnk5eFR6P7Wc686JCE_ZSW}BU`^DDTgZ7%kg0N-KOlDP5&dO8PF4gRAmhL|1braa`GXwJ} zw5l#b_1DHpTW??JW~QXzn`3KFN_*Iv+|Y5R>{R8^WMhzHIoTbbIs zSp+K%TNUH<7a1x`oc0Hyc#bNQdF_+v$6^b>9pDTuuE|OQ*CO)5;(cnd6q_WMt+S}(;)|Rt0 zbb(unmmt%)?Q`WSr|>X+7Dbn||K;0dl@y$9@uP}3m;5wRqFlY&l5%4cmenFE#EaGkh&ciZ5UgVOtb$-t>Pj;)4Z%RFaV`TGR^u?^A1Kt7Bbn) z34cvc3<$^}GiaKYA0?TQ$r|R6eW1%uhYlhzT-mcN=54hfht~xg&9oKlPLzgNTB3e zynI!y`pVVBS2E`%$<$nNYK8Of$5LMyYgE6r^x*c)u;j~)9t-6=T{}-vS-rprVxn~ z$GBjF$uY_B4O&HcD#;Hoa2^rMto53x`uE|dbq0@C2?f$-HA^Z#Vp^cX;O4fKOle#R zL}>{dznYbdinbN^PLg6Ehs>0ldCj;k$>T}SS`XO!R1P*#Y@d=G*Yg{Lu#H?&_sDY> zdOnr+_G&UB_Z*l$hV$XoZVmi2W(+rRzU!AD(Np<3YP z_1E$*Zl{;*+0Qrd(@EiW5i&mttWoO_~T zoRKa?V4^_fEtAvCldM>L`7mZr+NJ9pXR~{KImgxv#y37H#=JKPa8TuzDmz1{8>U|m zV<4Q#*tM2UV=->vvyc3gSh2#|VE#d+YmU^R^2%3vny9ziXXB}Ov{?KptY2>ct_5gX zvpJJOs4kJr#vsZ9#WZ(LI^3a`xzjXkY@&9tTyG=Nt(K7oFHhjwXv|>cMd7+mgD=4| zsXYv9ThY@N0pjX6(JnyyG}H{O0tyP^xjRblEgXf_jOnmoF*_!9P*vkl#vn@6CHKVqE z7aErptCuynZt#Czi`RlOOm@eyx%&i>7-&s$aWdlhezU=>sxabOEgxnw`U2IIp}u(` z@7qMd^ln+>N7d{kSwdb@vK6Sb0Hg?au{VHtl{*YGe!v=`Laq&{ppb@NfU6MaTeoO0 z7tIfs>tYPYiAwOT-Qt}oZDW5;$8bX&2zU&=yZHo_n(fmHd0;5&B-dxDm%_3N?-*~4 zyb~*b^BDErOB^b!T*7&gI8 z={_xcG&fQUrV(8%RYwo*>%kFCm@a1Q9~9bNf-%G-behNAq6W-`lgp!=Hrv+Rs~d~c zh3N>sCc6putXGtCF|gCxh37pMHCg(4$y4wQW`(!SH&69>rxWu0>;7%-XRt;BX7ExA zWC!GmMvc)^6S~VN)D48Rv8vqeCi_dHaG!8>5#{wSSXInmNR)jl38EO*gBu(J+b6pndU78=q1=1R@^ZFK=TZQ?J} zi_IUhoFS0)Yb^1bJjv%j2FokEWfh6Jp|I3N0Qz?Q>Ey7NPxt@$qTteIulwwc8C{&hj;=8ado zk)+N~V&wQS-H2?cl1~{d^iE;(loak)w5Q(B2e_#L!nt%t)v^Lp$HU3wye zo55E}A3quTbh+v|`t@GuDUq!6wiguzt8Fru0rz9LVa->8q>^}+#hh4G13LF2go>@9 zQ;5JAcz;o`WJ<~csVjD9K5eK~*6t=+0#$v20cFzz?B+ABakT*T-ZTXu~prA&z@4Sjzu)7z;liBlOhrSpHo4_@m9~ z_K;K@u;Q$BuPI?QXCFH40Jm~N*cDJ^9u!*W?~b`kvPHDlLJYSdJTjuhNpM z8Ctpai8xLoiat+@lHWaPKD%%E#P)(S{+jBBz{$pCcM$V=_n@Mu{sXWpBsZSC6IPKA zuY$|A-HXTMEz{Z`@~BMI&f&`mwCP}ZOO{tP@S3{W≶*4}BhB>liE>e@ZNzD3)u| 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 JO2xkW{(rqK7_|TZ literal 0 HcmV?d00001 diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md index a839beb26..024e2d75a 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md @@ -5,21 +5,8 @@ This demo shows the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore Gateway and `create_react_agent` from LangGraph for the agent loop. > 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. -``` -┌────────────┐ "Latest AWS announcements?" ┌──────────────────────────┐ -│ User │ ─────────────────────────────▶ │ LangChain Agent │ -│ │◀───────────────────────────── │ (ChatBedrockConverse) │ -│ │ "Here's what I found: [...]" │ │ -└────────────┘ │ tools from MCP client │ - │ │ │ - └───────┼──────────────────┘ - │ MultiServerMCPClient - ▼ - ┌──────────────────────────┐ - │ AgentCore Gateway │ - │ → Web Search Connector │ - └──────────────────────────┘ -``` + +![Langchain web search Architecture](images/langchain-web-search-architecture.png) ## How It Works diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/images/langchain-web-search-architecture.png b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/images/langchain-web-search-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..4946d436009dbec80ae50dd3a6e34e22419d3c7f GIT binary patch literal 146371 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

QBW& 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 literal 0 HcmV?d00001 diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md index fc4923a54..0063b311b 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md @@ -14,18 +14,7 @@ The Web Search Tool uses the **connector** target type — a fully AWS-managed integration that requires no schema, no endpoint configuration, and no outbound credential setup. You specify `connectorId: "web-search"` and the Gateway handles everything else. -``` -┌─────────────┐ OAuth Token ┌──────────────────────────────────┐ -│ Your Agent │ ───────────────▶ │ AgentCore Gateway (MCP) │ -│ (Strands, │ │ │ -│ LangChain, │ tools/list │ ┌────────────────────────────┐ │ -│ or any MCP │ ───────────────▶ │ │ Web Search Connector │ │ -│ client) │ │ │ connectorId: "web-search" │ │ -│ │ tools/call │ │ │ │ -│ │ ───────────────▶ │ │ → Real-time web results │ │ -│ │◀─────────────── │ └────────────────────────────┘ │ -└─────────────┘ results └──────────────────────────────────┘ -``` +![Web search with Amazon Bedrock AgentCore Gateway](images/agentcore-web-search-architecture.png) ### Key Capabilities diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/images/agentcore-web-search-architecture.png b/01-features/03-connect-your-agent-to-anything/03-web-search/images/agentcore-web-search-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..75e53cb8f06f2b57483c7687b7d6e2da454bffd0 GIT binary patch literal 202864 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 z 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

n<~9FCGDf8NZim@iC@9@B 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�{_^Di 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%0AdLza_Y38WxE)NO2rmyp(1BNy|2PS7HFPn4f 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 literal 0 HcmV?d00001 diff --git a/02-use-cases/01-conversational-agents/README.md b/02-use-cases/01-conversational-agents/README.md index 861a265e7..573907b70 100644 --- a/02-use-cases/01-conversational-agents/README.md +++ b/02-use-cases/01-conversational-agents/README.md @@ -29,6 +29,7 @@ Agents that interact with users in real time through a chat or query interface. | [A2A-multi-agent-incident-response](./A2A-multi-agent-incident-response/) | IT / DevOps | Advanced | Runtime, Gateway, Memory, A2A using Strands + OpenAI Agents + Google ADK | | [AWS-operations-agent](./AWS-operations-agent/) | Cloud Operations | Advanced | Runtime, Gateway, Memory, Policy, Observability; built with Strands, ADK, and OpenAI Agents SDK | | [customer-support-assistant-vpc](./customer-support-assistant-vpc/) | Retail / E-commerce | Intermediate | Runtime, Gateway deployed inside a VPC with private endpoints | +| [deep-research-agent](./deep-research-agent/) | Research / Q&A | Intermediate | Runtime, Gateway (Web Search); iterative Plan → Search → Reflect → Synthesize loop with auto-provisioning | | [device-management-agent](./device-management-agent/) | IoT / Smart Home | Intermediate | Runtime, Gateway, Policy, Identity (Cognito); React frontend | | [finance-personal-assistant](./finance-personal-assistant/) | Personal Finance | Beginner | Gateway, Policy; notebook-based | | [healthcare-appointment-agent](./healthcare-appointment-agent/) | Healthcare | Intermediate | Runtime, Gateway, Policy, Observability; FHIR R4 via HealthLake | diff --git a/02-use-cases/deep-research-agent/README.md b/02-use-cases/01-conversational-agents/deep-research-agent/README.md similarity index 70% rename from 02-use-cases/deep-research-agent/README.md rename to 02-use-cases/01-conversational-agents/deep-research-agent/README.md index e48dd106a..5521c6df7 100644 --- a/02-use-cases/deep-research-agent/README.md +++ b/02-use-cases/01-conversational-agents/deep-research-agent/README.md @@ -6,30 +6,7 @@ An intelligent research agent powered by Amazon Bedrock AgentCore and Claude Son Single-shot web search works for simple factual queries. For questions that require comparing multiple sources, reconciling conflicting information, or drilling into details revealed by earlier results, you need a reflect-and-refine loop. The Deep Research Agent makes that loop explicit and configurable. -``` -Question - │ - ▼ -┌──────────────────────────────────────────┐ -│ PLAN: Break into prioritised │ -│ sub-questions │ -└──────────────┬───────────────────────────┘ - │ - ▼ -┌──────────────────────────────────────────┐ -│ SEARCH: Execute highest-priority query │◀──┐ -└──────────────┬───────────────────────────┘ │ - │ │ - ▼ │ -┌──────────────────────────────────────────┐ │ -│ REFLECT: What gaps remain? │ │ -│ → Gaps found: refine query, repeat ─────┼───┘ -│ → Confident: synthesize │ -└──────────────┬───────────────────────────┘ - │ - ▼ - Comprehensive answer with citations -``` +![Deep Research Agent-Iterative Research Loop](images/deep-research-loop-diagram.png) | Information | Details | |:------------|:--------| @@ -62,22 +39,7 @@ Question ## Architecture -``` -┌─────────────┐ Research question ┌──────────────────────────────────┐ -│ User / │ ───────────────────▶ │ Deep Research Agent │ -│ Client │ │ (Claude Sonnet 4 via Strands) │ -│ │◀─────────────────── │ │ -│ │ Cited research │ Plan → Search → Reflect loop │ -└─────────────┘ report │ │ │ - └───────┼──────────────────────────┘ - │ MCP tools/call - ▼ - ┌──────────────────────────────────┐ - │ AgentCore Gateway │ - │ → Web Search Connector │ - │ → Real-time web results │ - └──────────────────────────────────┘ -``` +![Deep Research Agent with Amazon Bedrock AgentCore](images/deep-research-agent-architecture.png) ## Features @@ -126,7 +88,7 @@ On subsequent runs, if you export the printed variables, only `bedrock:InvokeMod ### 1. Install dependencies ```bash -cd 02-use-cases/deep-research-agent +cd 02-use-cases/01-conversational-agents/deep-research-agent pip install -r requirements.txt ``` @@ -192,7 +154,7 @@ When deployed, invoke via the AgentCore Runtime API: When you're done, remove all provisioned resources using the shared cleanup script: ```bash -python ../../01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py \ +python ../../../01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py \ --gateway-id \ --user-pool-id \ --role-name @@ -259,6 +221,5 @@ deep_research_agent.py ## Related Resources -- [`01-features/03-connect-your-agent-to-anything/03-web-search/`](../../01-features/03-connect-your-agent-to-anything/03-web-search/) — Gateway setup, raw MCP, and basic agent demos -- [`06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/`](../../06-workshops/05-AgentCore-tools/03-Agent-Core-web-search/04-advanced-examples/03-iterative-research/) — Jupyter Notebook version of this pattern (workshop format) +- [`01-features/03-connect-your-agent-to-anything/03-web-search/`](../../../01-features/03-connect-your-agent-to-anything/03-web-search/) — Gateway setup, raw MCP, and basic agent demos - [AgentCore Gateway documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) diff --git a/02-use-cases/deep-research-agent/deep_research_agent.py b/02-use-cases/01-conversational-agents/deep-research-agent/deep_research_agent.py similarity index 100% rename from 02-use-cases/deep-research-agent/deep_research_agent.py rename to 02-use-cases/01-conversational-agents/deep-research-agent/deep_research_agent.py diff --git a/02-use-cases/deep-research-agent/gateway_setup.py b/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py similarity index 100% rename from 02-use-cases/deep-research-agent/gateway_setup.py rename to 02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/images/deep-research-agent-architecture.png b/02-use-cases/01-conversational-agents/deep-research-agent/images/deep-research-agent-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..14a1e285f28521ad5db4b1419c91bfbf6347ed27 GIT binary patch literal 211659 zcmeFa2fXW6eK;OM%IaXR0%fKopY{c9+k_EK%S-Z*E!%}YWJ#7}YuFl=ZAPFen*u*t zMq5guPznV?Tf!n_HZQbj4?|UzUymw#t|K7XrKKn>I zI?{K~^ZdG0{LQ=l_T5f9?X=%4iCpuv(|+xO(@s16KksrUFml&>zyF7)o%Z#sW4;@E z^P%IKr=5wj>rZE5h#f@nnK*YQhG~<@IfkQIq2@*B_+|`-z;Vqo{mluI8LY=5U31O# zMd*5D5QK&qu7?mfg!5-2G`Jl8;Ou5v@Wt1>&6S*KPQXCZj7%-mZSav^-3t5F=BgjE`e;;2M>s*W7(Tq7qSDMmYuvgGqN=!NY~e|hPENM zevjGP41)knw*}bk!`VsRoHbqeva|QNxzCxHaLcdVc^lyl68 zcIVyPDvB2wYJ>B9!-Q}_&%~J&qGW5L=@2d{z$!3i$DX@64Cu;b12PJXi_L%;#%6}paOn8Z*@aQj z3_LRq7XVK77Mh^w=JlpWAl3S2oBQN9r)($(!#Cfx4N6-(Q$zM~bHEPH*8z|x#L)d^3g`isT`-1~x?8JcfR;xHZWdfWBjA)zujwCZb@Bx`H+cdcu(g2uz zK(abO8z`@s8K58s@Kt(qAPyj54+B5mP#+3ub@hG286c&??^`sD5;>ls!T5UdTV#4n zAqQVIy!UNMy%<0^IPVtmV$_jfCo*cyz@B|SK!Kn#(ptQeT63w8tO}g1w#<7VFv@=L% zg7`p4H-n_B4WMcbG3xlR{N;JJYYrjT-^;N*$1tGEb_CPTm~`vdOnV0nHXz;At!PhM z20nNqW{s{V2IiT--2yq9apR15GZe@`Uf6K>0|B`Qt*FDNCcq0D_-_g2W3y`3)e-|J z8b}LTXTZ)yh%+$?aE7@Cra3E#&e8nX4ugrKpQEqNJru3ZJVcxzMxMd_7T^Mg9y~4p z6IegxXg|Ln74o?PT7WA1K2on%YXJOBQv(2Yd<%T$eaivb<1RkLrZ+J|ZRL!>IRr=v zsMRB$Ha{E#)6R$bGJ$~US4{9E=yYgq1NlrakelxtE`c4Wh=Q1TCc}A zU^mlYsKMt4lnkhOTaH6~*rx*^NN%kI?8Ar?1;+iV+Kw)s!7<|k8#wNmXa~aWC$8q7 zG&pW)UC_?n2QER#BS01&g@8{CxH6^rIQ$sjLv=WQkoIbSLvGtcFqy>e7yq+Fwwxp3GY3i26B5Xy7vk7ldXegFxiG< z2HOoB$qcR;91m2eZ{T>Fi1jVO3;~omw~r>__X+Ne$MCkMtD6?wB!;gSvjdKU6xu+es1bX3|$~L2wMS8duYQ|K|pYa(QdO=$W|Q<{8r6DYZI?OAYMymVU7$bGP*tx zUK^T27X~a8xhesbZ%E7s3Xj{fMYN;i>=T_$ zUa0b{vKc?|;lDjb3Yi%t8(z8Nayn2@|0+mOI*QB)#&|6aq?Pe7);}d}c8ChK@LD zXXKm-+XIc(ud<8}ui^r0!*%^$Ok-bS@%|jxAPHA#uHcd*!$7+pT?|f?#RY;ewgW5h zHJ9HVWsc0=**&KUB7~c)*^wE?i;XWrOMsgXXUw@1cQ=RO=N|YBgRbi%9At~oX#o#$ z@I|k__#l-PUbORN>neC`_p;Tu?7Dr{6NZDlT^>xoKB8{2VAsLM^$U!(&;mIFtBm=L zM_`l9bo}I1h%8`vAcb`+_ckd!IQ%@NfATRz)7IDd~uv@_4~gR?iqz<`f$Hwmt|wrfJu(;ScscdJSZ zZZ>KAuD4fiiXvbnr@9bOGMGvpEADXGkWh9UxdCo=W>rt28i zb8i2J%>E|k$El4qcFX3+L9A5Rq`Vxr9w&QHaQc?uIsS`UO@6BjGGKAj;f#`3=G_|Y zZmHstO>q#+AX6|_^5Ev`9w(F;oGAK-E{R?9dyD+pz#oDVH%J?|9qDg~>=1HJj>vB; zqz$1R$`tIQX+Ouu*JF`fHuD~}Di{u#BfUawi;7I|$3Zexe=PNZeaN+mKE@P_ybd$8;jDEwN1?9?m) zA~woaX6a^i1zFnLs=V)5=}`OY2-c-REI`o{g8*4%Z43U`9{8ikUIaKE=Y_oWrt5aW zIk#3{2opbcJabnD9Y1&RNT0&d@)x%g9ro1Z!h)cqRs`XIQdfT8qnZ6%xv5YuI7y_O z>7m<@%=mRi$r)rf@&Y|j*Kh{NlNiUljSGTqI_zWGDBg9tK9DZxSG3i;h)s%Fbb+oyWi|hpuqMFeh%X@HVRY zZJ+*_ahWYnbdyMeWisYKki-JP*Hl~lKbZosW4pVf}=K+FC_$&})n z5VmB>`fjJ1Ou>r5Bi zhGa&@86?q+_BV8WunJ@bNeA@dTVwa}IW%a72c;e7%|RE$iG7ZiM#MRQd{zlDB{&HV z3e=+Yrz6kW+zOm<{2**JHe=B3aGk5Np}5_s>j@%3K=@E*ZvhV94DG-zOIF&z?O;{1 z3~r~W;t&0RtBBmOyUXm5?>-Rkc!k+Dn>jHchn|={AkWA*138uzx1CZTzx@l~%-k}Z z8KAlS&O&f}Qw|M2t;(CTD~{=39PHHFAKG#?!iHnul6C$ba7-gx$F|xL!b#5RM&MDD+#E(>3ggOiN#)NzdMUO{C$SANOM%T#z{)jm0?5H1MDV}tNkBy4 zNcZKscKi15fV%4dU)o_kG-3GL(OjrFWtHbgdnoX%D^MQ^%U@0CmsJIT9-;uK!Cr#g zMJQKq(c3u@wqwS~w&dGRSTo~x=w1Pr8Jq{=*>W`R|EZS%leXQHndZ0+#hX$u4>sln zp?DHh%T*qZ6E6;f{*s3^T?d6nhds>)y>C}u|6dV}6Ftzt5(MS1qPAJ0R}IdBtg-HG zU2b|5Ju{=@jPvf*GY=Thu<#|WO~Aogn!{UhzPK| zt;Bbdd)Je19XWP-(S9FLGxGtR2>F|F>21!Pg^f2@P{^=iV{GhHrXHC1z5N>+n;xvd zJ74l=KpWp|bFky(+X??5pzr<60VO@a7kI)rLFUujMuLnxWUOGX5_Yh0;&si-YEu9p zOV_Ec7;;M!mG^Ecuxs$0@Oqc5!leh@N$0>^wVPA#0#ExTiWZJlBemgNn`*AYenz%) z;qe`0Yrn;Inbit7+c}+EiIjk^Ws$0^4HTT<=41??;KA~YwU`0}=-iVZsldHh%&c07PO1q2BAbm(|( ziEj>7LXiOgyT5ei(CsCUA0>`_B}C?)xam~d^}}bc0Gxjc*Z8dY%O>q}jRUtQ7ImcT zggoFR$WDTTfA?{qb$#&`+gX_hN16dUmmZ(DtO2ntJ+s8zokFTDZo#c`2O+_MEN={1 ztC4Vun?tELM}BT`3T#i0gyRMLZ_e#AD%q{E%S?$|Q{l5IdfTbZKK=@BgA%!oc+N7k zAPc?ylFvyh&)=beBL(;gC7&!i>}ce(PNRUS6Cg$)fL(+@3dN4~bru5z@G3)h)h2$m zbHMSjY8Rt-&=3mpqqGRvB`bVS8``V_B%_7x-MDVf-FMfJRjy_;-7csqgVs($&#eBS>cX950}FbLiu?Wxd&KC$wZ4MY4z9yo8+!)SD*R^#ZqlAI0cH zfq{L*TfUVyIMo{_WC>3j!E@_4Pd3Sc@STkT1!dN58=jkxS}Wo9OSmF;lC1Xd9k7;T zIdqOVXPNq_KDwD^W z+Z@MdaC4;BDXZOOI~A@B?p3RSfd-r4t-O|5_8fFwZv2Z|SnJjC(Cqa55p7Pd*CQtGO&jq{6a|Ec8?Oc0sdmEBjanMH0?GzCl2ws3jl=k7F3))zn6toaHp5@`@(QDvm z!5@GYJBrCIL5t%lINN9ev1uP#fX*Bvpi z_dDc}TPMKu?cM8F-{2hCgzJI5-@zQ)C!jmuKp!qR{r14#@2drFop9voa5Zp_Z2HyX z0sqyJ-`5KSV>lBeu?zYZfc^zO*fnDl!v(cA2F$t6P=Ehkaz|_QvO?x{ly;XjZVEDB zWEfQIYh0f~KHI{6)0hHer0bwL zM0K?}G6#}y_UQ~ex7e|X;7R*vpH^FdBw4uF&9U3KI~A32`E9Z%_RxJs<{L?nwNyS3 zs$YfKkDlLqJch8PK>iZ-WbozyO>apx*&bbS2k!eoePZC7)ogBoHyhe8bqw9;*c<3# z)TRpU;J^!2{LP}a8TrkG?@2Zg0Ilq!?i~l}J}B>|M(xC;8aun{LGgQA=K>!k18{H6 zS@wN{0Qm9z8ITp6P`|%xf~-Gd*MWR15a5@w2UhLKj@plG$I3gN;s+JIeK0>Ul#OOx zaJNW%uWh%7aT6J&4}`QgkUd6E!IMVZx1e{_4r#ZJT~m5&hF)D^@`(X{2G}jwXHt2? z*0cPk4N((WrPTp~{vcWUEr5DqKR-VX3;JS&|$wGpxitFf-pUiFe?g1hJaA3ig@hgP{)oN{x z1gxti1}x)hK?fSh=|?s=e_NY!M`Hjt0sB)x;oo=@ex+c4w2pnP{T=>J5(B{Yly&Y= z{U}&&1DA4u3?TO_$N*L<->M1YPSYS{rxD9p`#YALpt#LZxB{rMTEFk3O9Tq$LmwPM zfUT$wAG8zTm?;1;+y-wQ@ZW?nGWXtbd;rJZYB=k|0=>Y10(ZU8S+^m5T~iKQdBUbY zIY20|)z9w#M{oF3TJ2`L-hXk|rHE`4(X%{lei&|e3uXclm!V@N;i~oM3R^K~ssg!D zfbGT@fR#I~V%Dq7TIQSx?sXKu1)gOqZjg0nZ;XxS0wWF*TaRj>-g=Ri#U30FWWE4I z%c4nDZD6|fAaYjCdvIRGNK zk9%#ZSD`!Qjyd5Sv5+5;0;U=AN*QNVyc_$uJZTjC<lL7Du^t%8}t;dlq=kXmmQj(#%d*PYHr)6k%icx8yz+5 z^hz;1ZCaH+7tpmzC`@C%Xm?7MAlV2l3W9^Gj@X!v8?0wh4Cgqh7IxS`P|FP0FlZZX z^rX(zZnGh8xq)mosG!D9(Z-bNIPDf9HcAH1G94}Ms8y`dGJVrswya(c*V=KBwaw8e zY=XTyL3JYdH$-MjLtR*ioA>IyagW6Z<*45bJAo~uVTY5#m@gRppb5_PdwRW{4hO=x zYk6dqjOJy!nJ(t47WLfT+ziWQ_#P+2V9s}{MRp##4Zmi4>~P#OBgU_?6}lQ>{$OUz zH5+T;6Qe9dSc~}Xe1sZekY#SMc6!I3ygn{)9dID$2|W{I>M;+( zz09nrbc(&4j~G%N>r~L*LUY*4aAZbkahBw~5}ORoS_J$~%)E&8JvPdtR5}t`(_S}K zn;vP1GzqiMnC2)J=62c}FRG)kuUmeq=A^M2^^{g=Ahprh>VdNm6J3=2G81tkSXUnx zNA9SakXC;@*Dxt8}_dg&T})%9*)^TF{EU*(5Fwk_tGP9S8j- zGv1b?K8zJGeJJWmuP)iVN-BLqgYhs~bOqT96UQo3J(7BMq zmVEq8s*wJP4!tz%NgQ0ho_1Q1RdiPNe8qOSR$`HK9Xxj%ak{xlGENoCEt|@W@0lq*9Tb57QJD12M14#Zxi2)Kf!gzX_1&)0MKP>=lac%%*uQ?7*zs;{6mJ@rUV zmMn`$it~IaZ06Hh>#3?N-!zPwN_XzC&r+tk@;-G}lEaBSICg zVd%>BrROTGv-=6lZrE!f?upeV62EeyOq(twHmc*W(GVPS^S<05-z_ z5rVdSlI#`Q;6@Ar8chitwElf>+f`ivdRL?3n9v;4TnaPowY38GG*u8gB_8N&TwdxcG&=IyfL!5GAE8gDs7d0DZxs9-Y*q;?I=W~TCU(UYoXP&MX(B{H_K5r zKTJn0)2#_mkod*Pf;5=9>*$n*6V0$!7xUvn$L$L3hTttHP9u#90||3GUd^&*c_*pm z+Wx4;6Vb?>2Ti`yK#6>tFo(_Ncu^nB^K}=OX8(nf=H(f8flvePLk)o@&^=ks%~*F+tM z>)8v-!&IX}wcPdMYI!6!E2xgzuImhJtZGBF5Sjz9*0F|*0y_2#+QI2| zK1ur{IuRD89F2PcY9~n)R9v^$SQM9Jzm^ZJnvW$0$@q<8$uuhb(&=d0G#2~C`m}}T z$%$5`x{76~W{@v0gmP_xb@;k(=N3&GlMCxN;*OcxM3EX5!2~$d;Prf)GaBxEsdT}* zS=lU<{At%KPsOAofe|G)Qfk&P?ksaXuP@THRX1I|w%}y=*3$yd&TMd+RR*hG1~q;> zPXs&UBQvMaI@71faZs0L61}i_?^2STA^jGItb z0*r}4o3U1EiH)AsEg1C@pF<`EWm;FO1C^qb;-F(!bdne@29sgQn9pYVObt45tBJD)k%M zcnMaBDHXn!*Lw@ORKUqzi=2_fQkF)vKy`^!8jBX&z)f>0N(*l=mFOHF&1o}G!KJ*N zCzrKEHJ3TB)noP2(&50$C?k%;F5k=N2RUyZHiK9TQrcO{rBh!X$%W4u=O8UG#TD1F|*r}n`xM)n- z6r4)e3QL#okuymJguy8+8$-D*jK{SRyKq{jq=F2~Y2wYQ946KZp0u2>O=C{!3R<1c zd*RZvB0ru3hzV&N(h49~D<2pA4kHj`I8&TNoz)hChLuTYijC$;&Q#PwV_36}5D#eoQrDQly@WA9pjX9G}CQEG6F0j2ymj(JY#AMJK zmjNd@ZJlWA#bR5dtIA02hb1c@V{mNZjYT!;%d}E0b*)IHI|X}Ic1oTvmZrdqGbB~a zs|cFa)H+sL8S_0O*A(Y5(JwM)zBB;l7gNJIrrL091DOSwNyMC#CJ{Rc7n7n@bi90D zh9tmIZei-lgw>P8r35BlFHq@%H4H^;QgU-8U+;<&YoVr72`eInp0VuGH6{n~x;v0d zeG#uRYGee7%Gk@{7!V`lvh#YsNY#2vDiBi9!aAM0sY(bESe88yT2#mzZaEKGNVQ+^ zDKilU6*k8#c(pRM>hj!^yVC+V%I9m-Zawr{y+mDvMt)l57^L6ouywA@)6E%23ybL# zA-bcXq2>AUVlpn&J;VwCT}@iJDp67tN26{uQEjDW1MR-J6sE|c;>V+r+?uKSQU*X_ zmP2Kr&x$xjP_t`|D7`kLCOlJ=mRN`&Sl+Js>S!uUwOEiO635CTywp{D&X{i32LXj* z-4N|h2yV{SqM)G^ywI>Z{mM-4wv|p4ryfEM9DGn!E6aQ%8H2vsfSI=Y=CT4M*n&^y zMxkz{lTbj0qY-Zm$^$(|4WN=`^uZZ~g>(?EFY*#f^0?ShoAet<+X|HG zVo?!9Fs;%k`-(D+SbZ`ow&SutkHd~Ux674fC0A$%yv8Xls;$z%3l$ z)sXxWiR#lbHSuxP?^#f&4M}A>2h1|8V?7~PpCn!2wi0!U=}9h$=ayk8PrMo?wp(1Cs-TmW zg-7!cuSK0OA?Q)QZo)UH)lt6JZWQUcR2&r`9WSgXHkB$kmJg6h6s1be;p_RyL?-=u z&?T-%N8Mb)%3U7ALS9+$Ht>!z<94wEjrMr~3$PL(D<lGK$ zOiOc$Ss+Szs0OH|BvraB2jnDp{X#*QD=l6nO_Uq3Gqyj_A@1P54a6e@8UBE4SL9Z6 zi55ffh$&}QdcqQ24Esc#iEVY-Y_{gTS{`dHWz4P)mywK!L~k-LGQMpPoid^&Q6e&2 zxR%D5pPgr}ABkN95G|*_;9V$Lcn<;}BI$vRLC(UR(>&GsTK6npAmSnE{h%O$Y<0IS#8PCsv7vJp47|Ba8y>gxi=r+kV)VJZLur{je+RdEs16;RHI!d zM@_2~PXo~{)=9SIqzsO>ET=PGDWcHX>j1(YYh3~ObZeqT6&t`MGxa4JNh+zL^+X1V z>>dl4s>V$84(%bS%uV_%A*z)q*BiWYjYYU+vC+$fjxOST!a3xYk#}&(HhYC?G zvjL41n+qc>88kIf-BbnoH516Aajp$qhj>e>IuT!VxYQ8K*euUXTBBZ}9(Y2LfDU%L z)$Yj63d#0>IRHwTPFmtIvB~Dx$~`5>RnZa#;!Rn|F$+O%qBuLdlO9MA`lwNy{H=~j z-&Ro^P);};nv|{s;AN4ZlNHB-!JM5q4%z1htrb$;k~ofwZpU$Y0^e4L<5{n))p(}a zx7A*mUv!F%3Lm$Xd6O@*W1ULI6Wf*Q3Ls88zs%>CR;f%m0b6k@j!w7Re7WZ=9F~ss zzTmbra?JNxJvYM&>avCcNxVds^-i=zxfzhJfa?3XWSWH20&a9>9Y-10q2yra25?c# z7lFV5zcY*&)k-z4n9#&<&Lb%kS|BDs`|wm#jChUUMt-9V4J6OBFw^F( zKUbJ@KHF49Kov~G=!VF^DGplRyj>JQNI?&W1K^8Crxds?(65LVkdKVR4tO=PcM+ENE zUd{zxU?yR5cB$bMsR`awim_}}`yENCS1i*Eb+rjaF-#<45FktC1O%@JW+(znrvkn3 zP2ElNNk3!^uFK)AxHD_y;-7V3T628O)l{bz=08WK1kuP8h+tn9-ciX;CncyCZuBy`&-o1U*6_ zoxwowI6XtB!OQb8y=P4MaNf2=a!QwKmWU=P4SYYYicqRwn>3&bmx6Gn?0LXcYe0RT zQ>}{KEDMW5Q5^VmRd5^TLc?d}zS`wxB_?kV0d5N*W=R75MQA~@RmkJSSe2)g*-V2m zBjf=D8O$p{U8k69RHpTI0SI8BRFr)M8_}IAZ)p}cWRh9j0wEo6+7eFMW~L(~57pIH zC*sBpgD6kk>P$eSWEPYLp+6zI@1`uORo%Qw5VXiXdx*U77S|Lpv^LdZFcbP zMCTlfZcw7O6xwBQhe;R}Ll8F@+nTf}8lo6r<9x|$_z~An!119fK_{_2%F)%j(j~b8 zJs?JLON7W1V^Yo@j2fkG88c%Zo#Q!FkdYp>L?O01i5DORco*=KkP43ZqGC1Znohft zErK%&@Ru?`ka9bo7U#_n$y0V^YL>FpUPsy?85l!| z{J_-j>VuYGwky!UfaZ0~g&i|r&czr+isrP3=P^LtBwP^_$HUpI7APR+qQ@DOS!(%c z-DKH(3$JvvYT|aP!E}ia8hOo@s}KEeK zzXaw5063HDx|GxpyCIP)=HUG_%kE(!H=lM}b3>YNV`DI-2V*a85>3uo@<53nkw(2& zjq4>#>6>C@E(PU=wdk>YHBc97r#g-R2F9}3C=g(;s(jz65xQtkX(Y5Mrq#zi1-@W? zN#>UgdpXYysX-}Z!Fy$L7;tHoyHSA{hB5)l5-K)tP;*|lMSMY(F;vghng)S8&5kb= zJKCtBvzk+1>bS3iK+vqc1Zt_E+uayPp!)<5r(IyeFpa_-m-U&+;ca*5xn`xz6!T$H z%U4RGh4)Ox@+F;Cm6}YMYK-P`Az6m{U9#vT1v80CAV|U?T|8n(s#s`}K4bxUqu>iT z@R|vWW&|K3!#m21v&{Jw5>lY$7lyOxSXs(}v+TFqod(dWF%l#R$WwDTkqL5MwNth< zrzY64qE8*MLqQa2dTMvkVJneW$Qz4Fu`X9^lNKsrq0%j)#Yr+?tKtYeFo=v-BNj?1 zWs;b2Wf@kxO)_ehi&E6@iol8P7oon~EbC)oCQWF+GsMHHMxyDsOH~$3tk2p7sx%IP z-v(pcme=i;nnWwov5~CV2?3nEM7x&2FttO7!LX@#NvAmlmqq*G9@d`h3_jfHUL>7csQ(*IjtVLXeGp2aiH=Ot~Z~6$loM44|O}N&BZC+UD)hm zSzY#)jz|wMfXz~!7?49&GDgjyIs=kH5H*>|J5n2jI)kVp%*wJ*q`M0YPh_S678ofi z@bXeXzxCXz&ak6`$7513ck@)EVTxQlC#0Mvaf_ti=rkrv=qYWoERf1-b*vA}6j=`Z zq&O+m$IAj`(Uc(@Ey1cMokr@q%DB>;fbRh#=cO3TsnsXC>@Qunqu@@yK-xlAP?82}DIE}5 zrL1{bk4C@?mBOqh#w!9UELKFKv22LTq^OmoCWCM@ts%rtIK;rz%qpe4y(||8gF2Zj zRFp*a~pyxwW?6mpeEx;_7t|L^a25s;dRJG#~X@$Olo1 zA9%6Z@wq4_$I=jlrL8GDZuX3VtS$jlAC`(tsMlFGb%rY7C<5+}mLLsijFWk1(r(Qt zW-4(^FGnykLKp#f8w{SrkaXLvegSpeB76^Hp6oclF~#{|br3m=#&TMtid9^qfz~Ay z8$)E#Yr6|?(vpa}2YKeq0}-IMiZv{0hA#)ay95CRnhn_H)ZyA1ignVO(xz%^=nkV1 zi#8kPv_nd0C#tmj`K5vNDJ58rC8Y;$kiuLL2C}V2E3Bi1`U30D5~Eu$EW?Gx7Mtuc z=yV8hd^|KchRx@utsdYfQ#5Jiw6W~XN0n}Sk&1L`<;;X#_b88w^9

Gr6Qsz!t%`&?<< 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

  • d;LE@>-S%AVfO;I_+ssnuYc>hpFH<#-~Abv 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 z z#%x`3xXwp@LxLKg?C$Hs?V@-Iwgg9lAeSF$-<1b_Jo)T?r>3bRn}Q|)gWs#PQ)2uL zZXWo#!mqPx``H9tnoH~|+|P2Wzt|uAc+=uj(c*F3nOA@$M^)(!+6e1A{a&m`)7|o@ zqv70IWG2!|y{n2vF+ruM@%*IPTmQ{qIwC@nvCFIp*ypAf0g7$eE-JQ{Ow}$r9Lwr= zVZZm%cxEWqNU6RtEd*>^d5cPWG>ONmHKn~oE{GjtfH*anQa?2C9_)UeQ_UQFxFNAO zFQdaNvA`;tZvyGOM^JE~Jwm3<~ijYNlUd6Gq>sN(hY`GwAoV0^Jg*pg2;jLv~n zdK=GJq0?IAJ4Jqn0csE75@ZT;OErFUWVkD_@|4zNj*7VId9?Vk$DLc`Hc$keaTymP z9gOQhWmc3PJ$J=+i^G`L0by!BvP`_gUI zW}xx$DV6bzD8-zkW*Z_Og{R=q`XjpM5aM?uF0}diYk$NVEgC>Poj{WB|D(ULJWwlf zt;O;Wo?<)LMOFzg`rN+M(oNCeCoogBT!fx};*G;{lX7+L6XxE}pD{%SU1=r)9{cMY z642nO-rA@a@<*||mS%v=eXrvrezF_lw{T_Idv#U56qrX|xpk^|;(L!XUZ?Qo^x4uz ziN&C>rd<9aV!dO<7Wge75!v!!qM?+Tonz zzmf{H&l&zCMy67^tiCdyIs}>TR$M5_7*xX_N{SzE!sQcjy}&c3nnYTP5`iY|0JJ#W zt{A*@0lCi{dG@^lI19p7TW$W-?1dy0t_P0t8~iq&Qw zw=DGKwm!I<;)i{V2kJUV!S-$a_8a^KK?Urf8O^zG`XsbnwV{jq>#{qf7)i@6u@rO|SG3C6RX ztN=kEQ?IvvCk!=F#-{-~I~CW1i;nk=-%D!*T_Rh>C3{1_D`s}(Iiux7rJ&2wt0%Qr z+7-1ISWH@FZ3D3rpTK@!VmOzam*Q719uP&GXKK@n%Tzn~Ut;xgC}yo;iX`u5E$Qd{Fzk zjI?xJ^SF;f@XUVqpiVu)Q;q8D>y`M7Vy)nIJ#eWo$@mv-1e}}8Ddsx%LA*52k737$ zvKE@E$s6uHpw`Q?y=1xtG=`t#Ws@>*GLeCgH=vMJ*{WV3Fsa_sJR=&=GTm8o2=J9!0 zfpL3$y4StXw%JS)1PylKv#(y8SMr#~Q+tEWBikqDitnY5#VC4?OnU1a!&;d^o(&h$ zE)7T92D2|>Y}dE>`gkz$CKL055dm>Byhm0Xpb-UOSolNs@8cHaT-Z0JhQ!jd<@?P~ z^xy(-Wa^y7Z@hQQChxN|9CfbKP*ywerWO)a={tA~mI{`-`({+ZdFkrXlb~X5wq6Lw4yB&`d z195ZOXfxxwi0MLLE5`&!B)9rWL2%P)$9c=yB>;t2t6*s9`@GQrC z4JCt8@TR%B@ag$R@q%7|8^h*}VzDgK7X8Dk;@ufFb{FdF(>05iy4r#UOkI(LuqeIT zta^Lh34C@B@#QJrXxh~FR5?jGwzu%HBngj~WlZ)SGoRX2;OTcMZakre?6?MdfB+vg zqT+M?8MT|Osk4wdJdD1HCGiY1HO1a#s(Q2LaTQVIqu+8!$&b@q|*74}657*)HGE*`xj zn>VEceKwF)ky~c?0EcYlu{1!_=FDi{eRJGv@rLZX3YQf!G9~g2#1(2j8H+Wl1_`*d zBq6-tsqLCUjahq={LcEMK_V}f_-QE$qKC&jt#Z< zO-sp}hrgWNOgH65)K50bb{-g63P){KueS#0_m@qrSY3ZtUjeB*_a1uAk2Y^}32!VY zZbGlY-06z1q8Pz(?3m7{FU=qynzx-~Zszj)?MU|a>*ED^>%OylEzZ}sRKB3N5inLD z4&1_#_Jy!dvQBh>gICxeuGPs75Krd$|AV8(0vz?@yH`TLIO-^E#&tO*j7A-|#rFr7 zNwr|`bbNbDvBF4QyuS{h__M0+WO>#RW>B^lf6;jz{Y`+hT6*lc=~O`}UV+(_M=cc} zkH#~l%cXPdP?P(uGB23KpLi5?`qoA&BEZ}F>zyBAU`Pvm^e#vKg*eH2ROl=gnc0yK9j^G!&is{-~9}*xlW=1Pn$YW&CVWQ{*?Qc9&qIl*OvKR$yT8 zmrecaZGmJ^OC{DPwM-`JZ0bTxqbAQ1NTG{=lLg6>X4DZA){@j$8M3COmZ-SDGF~6q zVbFg$Wm_8Lr)W(vM_g5Zcfjxw?B@y<1x(EF%Por`=C{C@Ucdg}#jd0KvcyY|!iy{F zW`(XAbK!MTP#xYs^R<4C3IKJf6Ol~HKr+OD)d;+8^CLG*om2(|D2N4Gp|GcdYX z3MFoDx`92am1{0OI=t9jkSNvbdE$9v)EuS_i5+(Ol|`&W|=gDs%+8KfL`1 zNW6RM%Zi`>>T|m3`6~wwbUQ3lrST$ytEBw|9KpV<|i8E=ehbGc^0> zo8S2WP_lJ-&+HEfWk)iN`)?AI5_T&UFvKJ80FJiHCo*@?^k38MQxIju1?a=xZC377 z;uFH(Vc+IRf8Y!u{j*u3bfCd-AGAu?+t!|1!T!*>+tq(2b}4Zl)PxeIAgg?O^sn}Q zW&C`Rv;uuYf9b|$u)s{zm*_1b{&r*g2=?(`mh*GCU$Jk;_qM%2Dzs${`4f=A`)7B* zUQ-_8453K*0yn<*|HoncH2_0xSdGNL_MrxB2J?NX-+e{{5MJhb#^g>50R0`ypZxgZ zLrV6^9x8_}jo81<{GHsdZ1U}rVFT7EPff4!8K12REiSp=v9^rGR|LX>Z7ot~pDd2CnDQbJBvG;!m_>l?bnD&l@-_3;q z$R69Gw7piPj(!I}8vpn1|4v6#<93X368C6^hJd`m9U?_MzdCH<|fo) zj7)c4tF7AaO)$2NHDmm}!9;)&-C>!3HkJ6k<&pm0ZSq3(b_MYQYefz=ikV?@6K!1N zIy_NYX3GlnuK0DQap#88%Qs-La6N^eIfO*MZG|*m*sX5bb#!&ne(tYS2@MZ#7|%8T zqw3rl)NNLx`1|uhbeR%ir%YIRN2OMh<#v|5OT~mQ_50}45l+` z2II^PpH|6-urD)#cc;rK)+~71-@ebQwE)<1ljL0Pju^~@al+>QhITuktgRDSnYE02v872(005gUR*vDi){kko;iZsel_yhb-EOSuG!nOS zD;^}vzug>)F)+2;fMXbrJ^$xE)kwpd|NDTb#{#RxCZ(-$!cmj)64zK5s^bl@W5net z&_P67KqI;z=O7!l6rb+lKlY9cgIqY&3lXDrW(KuawXl4rHM4=)?# zFK&RtB9g1@Cs4Y9#GY98eWyav*{fsBy$%Two5gnuHI73H$EJMd1OhB9GjMm5H;_Gk zpV!~joE@zHeW6+RZ1(M@`z~m6{E8VqT_H)??(+HrKHzzw@K414ZE(Nr&+pcuH=y~+ zcIbw-;JV;wKskzmAg*$1q$B45MyWu`#bbpspg1I_u<0E*Rx}p!SvMCF(Y{FCvUXQ$ zoK_>DyHCOAPD+)Tx#}D@Drog`gAWWykt892#4Js zHcbIQF-G!6s43oM`%sMQ)tbr63R|k=ovkH5fE5$43SWh6(M_(`W(}3FHOyUbj@pdF zFbfF!?%&9};AH}teVU>0oo|c6U{;ga|b&Z$D;QjKk%)RaYj2?p{)#fJ%QUoI4dj5 z66XY5hNfNP_{h5HGYj#;Ys@gYB)sv0nSdY4j8v2@6hK}IzH=o{+nppGgESl=ES`o* zkQC}thr?HfSW+iID&*aEj$5Quo+J>33@Ar*+GKVx@>?XuYZ2JurJl@ zGF*I9O;Gzjqo&Ut&5;$01PAq;8M5!JGwbFd+i*CIdTO%l!}L2%b{kKbVSlLpPiR{# zgBQe(8=8ZY(zzeM3I5XV6+hYg1Y8#GZ`FS8RN}BB2sYr&RAvWjF<4GEpzG-^Ww2@1 zODmtApX;{1!>dBRm@6?$#tQ~2N#1s$gEOrQe@r$wA)0#0X4WWPO;@pG>)gM>EN(o) zt+HAOB+&L+IHx2(8nI!jqlZUG4F;f-uTNFj0nSY3kbrR;uHdnn>TO0ma-rx2>ZO2{ zy#Cmnn{0fsbiaA5l|bmI0&&a~=#yk9&dcCG8}-i@iRr#7^sv;nJMh?8Z+t3Qt+F#@ z^L4DJggSL{YuAK(2@{OTM*w#qammjl`#d8oBxCV#JQWu7_%_SC@VVSl=^T9^hUQ*! z^-c$Hz{K)(Lp!;`zt-uGxff_xBS#RAmO2p`9Ue+-)I(ZIsNhOGA@B`TD}0`On*;?R zhZ24KXpchi#4IhD#;qsY=EB;1I5(DBTH7IlO)V_6wD^E7X}b~2q>Y<5nBufsj}0We ziXO%lsJ(How5WkvOceZ(|7R}zr|+|bHUFnCv?YUQ!G1&1RbJ81ksNFc zhHb-K^Sb>ApEIeLIZ~}2Mj% z3`_C4bnx&-J_Zw+ecjKn~q?e4YOa2G{uozWLavP_p_HeV{yKw$hI^Asb1v z_LW;bg~*RH;P1v5&eyml_hVp2wIEVpb^sY|-|Jwj+_!>4fw+K|y-^ zWy&=b$%s}N0HdIDk_sC?scNp|79@rGY}=NL=F+4Y`_qc`c`vFoi5 z{B%4AE^wlPOg5oI8tcg*UPlOE%^LX;XI=_ye-~}9CGnh^Q3K4muo#~xi5dB*%;P!C zY`6E)^q{gDX0IBskn36@=J1#HH$dKpundt`M@2RFHFA3q#`NqVlE(a*=(|gt84SF? zTPTYEFym3!9pe54c0RKBg>~poyxf<%4Pd0WZVVWlY&$5kCX2$%24+}&Rp{V}`_)C) zMHOUwJsz(48xHZWx2{eYPp^BuxzoMh@D1z~T323#13OY;yoB3u{e5KC2~mTPHHjVn z4dM};4lR#C8`55<4Fm-lyV%KR`iPUL+4}||u8%ZWr|E+9>~O8L@{9845cT)hC1y=X z)~!C-`*Q?d`v89$-bf|qP9GkL67n5Gz3vPU@oA$2MAgc$TuRE8bSXlBjNj@ZU6H3S z6esR@sCf~kXQ6=YvQTG`{r@9jE4*OQ6JZ3(R`24MU2GqQd*vA5E>?#en~peZ zy2q+a!C8T*kIY=p@rzz(792nG%(*{5KmSRssZWaKq1Le(df(!7RCA7vetZk5h>qER z`})ccU-9bhq94hN#Zdhc3wvB|h7*pLmqxltXJ|$4(|f4vd1O=Xe_kQ-1-KfTZS)hV+tEE; zfPeC{0P~;d=k~Q;rELpJUI`}U_lOnf7nLU>t&^+t*HDcS%jU6@MDBV^Oz|J?QK?QL90kU~;p=M5`R z?gcpMe+F6;;LGuc^_AV0G^?*YwMhNlRx}~Z+F#qhvwA}!fajI>Wi~lx-c=C)yWOvs z@D<{>J=p@>X`4E;@L#UaP#9Jt=3iH80CMM?{ZjmPp*Toj3T6JU6$6Oq({q5c(WSB&!qfUgz!6(6m|Gr?)+!4eya}vCPu39g%Nfu*w^@1 z4e~!j4)7YFil%|o(OI{uCcV7Vzfmo)Obk+@SHHWxwEhD9;cZ+&|VVFgzxX2`}e26E+(dn zo@-_T(uIrM6Po`T0${Q7qKCivmY?G-&EglNPkMK^QKDV68B_mpd?BLl0DtEdBFF1z zpaGPWzqIO(*4=LC&+>MThcMQc1A}*30KoMQO3c3hXRthxzR~~;|81gv;m?3UbO~A~ z{W>Tu5!4xW|3?>;Z*JE-94_z6f110S^-p9(37dGUANIK$RN=EXz1e2Hx+BqWHAH5}{IfGJ}3w zbr~^C;s4;#GLGA$ceZI#SZPuDukqaN9801jXAJ()X|%<*xA3Q+-EZ`&7WV4S* z91AG)*?U^O)4iorNd4|mvyYGGK@S~@{vRnNah-IrF#^gv4|W|~X^eule4Jw*v0(0J zq`~2JJ9rq!tQj<%Ewhqr(>_FXY*|lq!*iY;B0P2=;-?}NRHnOXeeJMlIf`du(!J(BCU1;*! z2d1RIIh2{e=RoUvO(x`yOGQN$^7d_QP})trP^<-W#y z!%2+R4;U_`*8?OJl(yMghyAs99e)fiBOayDR2$d`{dmoWV>z+(0%f!F$qw~c@np%)y8+wz9T#6I1>k|-!XVX z6RdN+By98z_u}6C!U9F5#YESf%Yv1N&+*nsx3~Po^~LUfJEjPIh@TLmBg>}75MOlV zAj~|@=~)02$vbjMD7&iGWsh7OD*=i-uW8EF=kdb0*2cKQ2{_y#GA|tP{p6lgK7RZy zv}M8jf*GGxJA7#9B`%{18ZetGA6G~4IJ(tL6@m@@qvsz)i?nJNcXm>rnf+S#Xgws; zECxAWDEIt|Yw?Ou6jXQ~?kpH@_iY2u0eO$dquoT@KsU@6OJ<+ynWS}Rs;mfkZ7J`g z6B`!#xRG;PP2&o=ACOE#XxN@~#qQj1s-@_fH_ zH1qcXH-v?4kU7wPrkDVgpO@GY_J@wjl?XCZMIdd@*5X{9AD1umEk`@b9&F{MFQ3fV z1Q!>xmZyl7{{H&Mdoc5wu2D;kK~PfX9vj|$?G6uYDBi1EQGL{;01NO+EE0=-iJXMO zp1k7)>IN2j`Nf#Rrx}vEvJx>!A2DH*fP94LIj!ig0q`l!E4kUM3B_HYP}}msR?u(A zB1e((`5&zH&ct^(ZBJsQrKQDNWO@Ex&8JwfKer>kcb~k&18etL15eJ^dp}k~0mz_( zr4Yw5x-3PhjJy|r^)-fONA}t2s}#C)&+m0_o{ou)-91QS_zKpMqSb?8_p|3S)ZNmC z3FGf;=IRsAbkC2rPW%Mx&8Et7yr^t?-aV?#2b^;>7qaOXwXFow-uz(~iH$FmTHY74 z!YxW)gX;Je`v_J2P=}XXe z3YswLqpkD*)_gN{g&I^9Q z3p%Iz>GQ9d`{7b%u$1w_%v*qj1KcnNmU+vL4zjbd*z`M)dVRf#%)E?TerM4_MEPl2 zJaBiFQ}A~|4Z-Y%(e}6SkyQ5hA?y}lY02MmUnG|p_Y(`0p6tx@as@ofynCYLRn$F@ z^j=yomMi9ZV}e;=fsF3a=5WT%CSZNNGPdIaml}ZGi{{crpW#2HXlpRppYQZgTi0BQ z0L64HlJx3ihl$2fw$QmbtoM~#tSJdMEp|cZ|Kvyjdfu>cFyAZY%DOI;Xcj0ZPKn$* zS!G4CK9Fi*aS&yZ{PHdzvX$ZsPV4j_+%?+rtRpga2W0%wrSFDPlm^&pHMW_@I9hd% zW=~9qC=FP|%kljjrA0@6K9Bejd$BPdx(Gz8y|k23=P&VmNOEa{Q!F1r_0II_WglNK z{vM6rk-YEi;`1s@G=`f6g6SyPPtS>RoiK?N;5l&pGBPNcv>PS|YRyJ+o%8S3N0QPC zxdzhOKzBHwQk88{K_aCKIEV}`Wxz$-Zlt=*e=;-Gx`lOg8FAFnImmm!@&Hq4$TKn{ zWT7Aam#n0Rqj+g6@?bwRj(1>(NV1ribxiUn%y>If#WZ;G6LdE}3puoW1!YYWvY-&qS$tS?x5 zy{_75)ahfqn=G0W*O+)oR-mG zC#veIjiRTkK9{3>!a=MT!`=gVJWh%~Q5qT|?|os2`RP7&v^-J`q^HQkkv}mmH>M3< zK1~qWJ9Zqv1uQzl41xi5y-4s`G!HzkKcFv0u+sGL5jljTV^&!>6b@U{NW33zH~P{g zNyUA{q)#)TlPiv5ba*NmaF2bs=Lg$(MX3dsgPcnHlP{zWkOx^OEbQIuhQtvGX~Dy@ zuR`zL+RpxbmxtE#<7DNF7{V0gsD^Q7*w1phH`iAo;o*{*;(;yIKDh_BKeXY$Bls<- zkW1#=^f%If*yKUo@z#!fA@jz1lC--(#2zSB@3v1LD0Q=WG4K9D{|CCJT!SCOdfYY- z$qS%DEIzqnHLEdi=e%dxr#uz2=-oKSn)y}jI$IN{hM;vRQ6fQskK+de7k~=-JUDlU z8&vbw)zs^DNg7<^CwH-LZ1x9WI59ULc@SQ807|IGLIp;8prVLGo%RTXoPIQ3CdzA zW#J-5{3uIdTXb@J5UcjMIZQg7zXW@u=~G}i1-{H8PeeZ{>f(0y8djyru+(t{4eZ48 z7AFOVxs{?yib}YL_rXknbAE~k8;nU&b@iPm^94P&ACtImZ-M$lx_NU&jAAavFbri> zz2i*LifcO}{B6GeWfJ_yct|CO%d^_1S}5cgh(RnOzQQBb3nhGWpZtKe{6T)6jxJ*p z(mD#2J;~e+Cqw!`xGjwT{3ANdMB|iGv3#;3*K-YQTjZ-8*?9S0JuVe~ng>nhA3db^ zM<9K2@Af`VAx}+vhgeoagKVy3L`ykbT?snwr+EXvo^OzJ1+|55? zMkqru7ZUBWAl^~O4pB6a-;o~5SPv0yAW!QwZ*RWJ+xu+Cqd!02c^O8 z{&K?|y6`ulhiov>3o4ZPKuHpQl$=GL}mDh(udYjLOzD(jL&_AZd_bC+eN0crQ>xVhqKiWi3XjrRZu)EeWn=dF` zb1eZ`%&`(=>?rgOdrUi%Vn*s>twZ>YCZt&4)_0`KTV*YUv(w|rL`i6JdCrZo=F=MR z7%@_ePNe+&tw+RUhlWP=E*QN?;to?PSeFmz@3eq3!UMxY=`i~<+dVD9IEaXYq7U7m z%;M)^u%gK#tRoi~WE$XUe`9}5?jkgBY~LO201@=WyPk1|EtZ?K-00lt;zhM9db3hi zu1aSOQ_ER+OFLVfY@FxvNA%?)VyfUHN%`~<9g%OGWfbG69~gC1Cn(h~g4Qs2FYT%9 zS6qi0eNn~bhS=e~d`QH*prWT`nMjvkGO>1&{8UOSR?&!OziUhe^`E0b=yKVIky6jt zVG+l>r=p(IxSo22s9nVGaQs*_A89&!v~)R1V8xeR61cE5OHgSSG+wVWDn5BxoM;7y zAU{CoIjkFSJwdW@t%@$zJRA5??eu)K261ZI(-*Kqu@<=Ya6)y&khdIJd)zZT;ikj~ zyED8{b-a`vRs4+`S6s((-x{CN4Fzh~jyJglX#U>jm?%YdQqDNFUO^z$(@;I6)aw{^ z3FdVgZVp_kn+AA|=CrL?RKJB;|F2}_mWhm^e2s`eN~UwlJ9n32W|~W9;7aoJ9Yx>i zj$Ha&|7A7^q*W22#)%?GF6=~6a)y;JJ#BSKZ+>IHcbdAR`JHqjZD7R$e(G!g`_!?b z78-7*2Z9(I-GWgeW7!W*t#IJIy*S&}y^s@DD2xJ3H4w^aint8h^5vEj1WiR_FpXZub z!xL{DZZcGHYZ2DINpEZ@A&hfxsjg;mJ;R0Zk~YnUpya`e(o>H)tXVF{K&Ood#6%ID z9)pDY6G!aUIP@h&BG@5-EmbX->`=ZP4&v1-tHUau3hqW6>O_^9gWQ^E6_s7a& za4)+Q;LL-pa4*~H5}FhAzh%&jTIp#XpK&U^e14c4?OBagT05TNJ)bej@47GCz~&5> zyc~cPSX;yz{@`+I8#L+kxMN+()63+W%1cS~$dE49UQ9I=0fn^cweU#zz&D3z?3T{S z&XzavSl`s+)Do;+M@$ZOVo@@@#{8?kO}fUl2}(n+tB7&9$=mH{P*|ruripE5pux;Xk-i927^57s%K9*h;D#?{6$op<7;@*vk|?&}L2tF(x$Hc@s~&oj26 zIoLv>Z0CNNyJ#Onhspx zy?;NK9^QX%JpqAcyw#Ouc;2AdOVguy?f$OP^ypIBG$|x zo||o&^iZVQ72?3n)e|6gNPk$89p>?zVvSR`+$5U8EZALs&rMe8lQ?(&#I?^Fq*yg0 zB00~R^b^}!=QtEyHZg+kRA&+ueijd3R_Z#>ykmWwE$e&j;4*V{lh%ZcTF-Nz zIpj@S_8vGCcm|x$x?K_X+fvwZ@my%EP*R5aRKujPx>aac|Z7RvM7XXe-BFDrIDJfxUh_l*HvOz1iy zz=mL_a;@B%zcWzPhB<73{8L1F-DrzfW!R#e>8kQZV|!n-R@1$sno6{F;RU1>@?x8d zkErO$Az}2}-gBjo*Bfm)Ol{tkceaAmpyo=ms`*ItDf097ehA>J{g-3~90h6S zYHcSK%Zq&VFPQAr1*-F3J-`hh!_ZyMHCWu&^U`1#>2`QK>pgjTUZ^%x&hTvmQ#VFH zYm2asF|p&tBZnC`W}h{D!^0DJ=6WJ;$SWM917l7uUA1xXmG5qrKqliO!f(tG#?B=@ zjg5rn=sojLm1U#-YXuo7d(IY?T@gv=fZUz4vfN{>LT4$+ zE2%DUZtgYI@(V6b954@2^Er;^EjE)54oVhPSNm#0g8R=%OP9ptrWf~4WFSyynh6h& z6#XJBo2{^Md~I43Op@ZB<)PZp zkJOi3nD9d9+i>tWv0q({`UL+f!~<>K$oiS%!_Xoa=#77hO#vtDsko$dGDZ|>V9doF z=&RM~Fn{8BdFIIZUBMF(ppnp zS^6SF#n&C?&{{b>9e;-F*~nNaR&_F9umviFgC)O2$89tl?&VK&dv51IwI{f@R{@qE za1&LWDc+JDIJ+>cUuJJ$OL&!->I*&$1Cz)90QYymxf(84nwbGah$mXq)btZss?B8u zvJ`c6AaV-I+lqYXfh{Em|NU~RY8FZrQd^XG*^|`DxTb>bl`TJ>>pB1U zE~~c0A$nuIo+eJ`-cO#wKC@bnqjokry9O}l>*a%eRq~h=m|kuRS_NnhY;?HgdEDoG zWUF1!%s0T1xH81m8KNA#X!dxB_@qL;o!QPmr`M~Elm?^OIACe!@oMvrhJ4&_kvfq4 zx75 z^z^E1L_|dDl|Kl=5;Z!nRuN_JZdk!<$cPGC5TVgLd374jrEhb2?6%4RGw2^HRyxY5 z!>73lDu0i)+pwtIP&6lFIJa=#Ez#d@XsEum`1oRB zj6!%!fLP2Km7c|Y_3`~(ltQ(B>sp1dwax5gD{`7*j)+1{)ZnOQJfXzk5Z(G(t<{;m zXYh_^tpQYDoi$lGT@(W3Hj(RGLWK1@UUDBDNPSJ%u=5^W2|?%UCzaeu!_;`}&|Pn@ z>5BguBUs^{r;T@B(MoUXBE`u5m2cKauvtxuC43)@|F5uAa*r4IXh0VYf4 zK~AztGiMH5pkWa;hwK;xjLmfcl|yHmmqw# zdr9FcrynW6T$&g^$sR5e^gS_Iw8~Om0tEn04#nI~sv9wNbNMcSE>iHElH)srx0{ED zi88!KHBt@oPz0RI^NnMfrzsCM^@O#QUK`pbh@*UQq{AYG;G!7xQ(!R}&?n3xGO-#= zCx1B!wkEY~ljMsaG_RA8lViF$VdHyyGpk*CkGpvoO>^GTxEc=?UbjC}RBqODmKzBp zs!TI9mNeeapP_r*Q`<~~IK3)A{JUGZx=4My3Ta3G0!v%NTppHZtlP-)*?6n$ki`$~ z6tu_|gX4aRbaJg)vhQTEU*Gqq3X{)7AS9dlu_QbYXjkRrdqUfIy~oQM%uu9jwz}gV)thS9ET~Gry)u2m>X;Nt3E_ zrf9E*NT`J8L}?B5aEC{Tg=4i5k@BIC_%)CT9>mMYg&d02%bfUEB}Ft`ZPV(l##C1b zFmkum(qi6tLIk7knIsiqJiyt)PbKpvU^*g`UUepHoqCkUPtx7Clsu z8I#*_uEkPA>9FQIangljCzh8dt_jH78v2w%3f!A@GFg4cMtx8n}wUo;&4UGiPpt|vHe%?zq=MG zKC1@bV^uO)m8i7h1DDROEySf-31DsG$HhYgETk5*YA+WPB|F)Dd@+;adU}fr!Vqb{ zb-e8dnd6nN*k8s++>^sfSmwN1l_qI*o9eCB?U9Wbu5?x$D(nF8Fvw|s1;EZzLr)uq zYCbrL4ClV`E@6!%5pgB-8>`$c`#9%9J6ac{E3DHuev-GA!H5o_<#DQp6`W@+!KGFdJ0DaQB_!&)FvkaH{1gF z(DaJuPU^G{yN-Af+(3Bj4J5u~-fBR`q>SI#2mleG0~rAxBw z^q<;8Mz}{LuXlvSs>XMdac#XlF=-41DAp&#YeKw6oc!B+F)?VgW>(BQOk`4qNU>bB zK;Rrq{h23^XG8ipE#JlDlg2N#@=stlmaxyZ5Lsv%PW56w zf`@HAmdGx76}Fh3B81^PaplOKvMWHmhOFRF>qZ?ljM!2?L^CFj*e|TT@}p*(IZm%9 zk%-%FU-2nw2T7T#let|r7W40B@p)N+sJuu3 z>x?$Ct3WNW36iqJukSGqDNMP;?&RabgCvHs>N}%zOu1c=X>Ir*kTdh{A<+I~WD!;c zO@puRt|o2ZZR)cDd7RP-`I8IQ*Hw6Go^V7dnd0T+=!-@nNc3SP*J8h*`7U)w%2cr7 zl>_fROjh9h8U{9fCF8`ZTGW)R(SB+ojJdaF&jRz#fB#G*z2i)TypmPcKp;H{N*u$9 zztL2O?1@ZP&9>udK8qfu)%lJqH6T{v8XO@y!rDG1EY(V|&^ki0JyUK7H&iIm_Zf5& zXnF)9JyoWG$FPP8jh*L$__gy0n8uJCc`?FAxjxW4Y?kNkcy!@7ycko@yV)Jjnw@f5H&fV~XMd|U^6yB%V}ip!HHIz4I&;a zp>TQil#Ir9qoYWP3Tbb@P4>m}DSKAT;5qFr!fBLeA@og3YS-TT!UZD49|G{d+?775 z(mwcqe0>E_n_br}65JZxq0kmuiWiqai?js_RDj|RMS{Bqifc=8355bJ?(R-;XmNM9 zAi=_Y===8nzWd*qJCk8TW|BO4&N=(+z0O)|Gp@6==EQ;ZmfvM5>lcv{6Yi7B}HqwZsrJxP62uLmRT^eN;+${%Gif=1%eym>-V0j3*u$7!{ciKuiU6g4s~if< zz0_Oai1!cCsxY>BG~(q_dr$#4ey?5)mfqaE-$C!Z(Dr4^*dL*GWpO{Vtfc#&YcidCN3d-r?A!5k$7lJX}nF#uN<4! zB=zK_c_`70W!*@IU<}PG~5dZLGS|i%j<*zl%YqP17Tc zO@b7uKKFR_{*svsW6=Vt>M@NL$G3JBYP%aXB?hLs__am&Y>SvXyO?;3fT8uvR;_#Gb z1MyUCtChai;$dSlh3e|bBKz1n+AEtbw2cvIrk{w)k1Dp^jU?=S?6D`I`_`BJs1;W; zw}zlyNi5@JFqIo+p1-z@4gd9?^gtR%b9~!-HAY=K0sYILh@SUaX?25lS6mGQ=~1tQ zbbt!p>hh#;tYz%X`k;E2jX!i$Fy<3D4dLn88Rr&j(N6DTi(Gv=hXU{M)qY-3SO%a7 zG&e~ijPV81Er~E;2##(D&b9Emz`F9Di%U({!H?e^r||3HCM(AExVmxTm2>11duO;A zg4&G|D0d36)&~#WB3E`wW^mgF?B1_itfR}CL^9pf8`p94C$8cHrFYM*%c5KT+kY4X zfGut~+V$z!qa-qsr3T}^-!;Q5s(i|V9FiBVIw-Z z$05Vxq*{u>s9AHJx3-Kz@dFO3@y0$iMy{$Iy*tPRqh84oL!J1bTFS9E?XBQXSxh{? z6QbsXTq|C6jE^=CAnyyG5v2gm(juB+M0Z3_BtYKNpik3g&7U|)>O*z!m~8T`yc91K zyTJ}Hp zZ-fC|={czM4ti)w`Aa25sez}|ubqCB%VkqI^&Xw`nqI4Jb0ygkwd0r)yG*C@~7 zKlDD}5UY_0?st=V<1df0$4wPO8}6#|+k0f+SW10-=~-}{n~M9510$)=2_Wcs&f@-t z{Y};w&^5b9`dc^Txt*M%oy)qfSch>C!8n#ims3lbME(v+nDMy&L~EyEH~ZI=Gd^8d>eji$UMYhal~ z{FgT)FfCbZ-7p^gH-q>&89*5s1(jj{^I|nU`s)8Cg8q}a62a&mV(0YZ3xxiAd;Tv* zB*1e?FZt(^NAQ44++2||r@j5Ye;&~yc;@f^^Y5P*Hv@nZ`(yiiPe{Ps;h^#d{~57= zX)w3M)?3M19}nsDv)UaDE#7mX zqoE1G#EH>`^f0iMES)3n#tnP7^-v6?NW`~~31v@h@|%IdV7K9g%TuO$b3L)!>$;Ws z{zuvi@Js>LyF>nyH-9b)rYNOS!`V?E3xf4GCt1uf5tVs_I50}<`rk^;{Ks-M{5H|uxYJ@vmUA? zPerC3*HW;|r)vZ7I1g7cNzzsQYlQ(LJ8v2kP9O@!RtcRB@p+)w+1@jHAXn5_+5f$% z>+8B!!*HFR&(37s{Mxn6f(tcd6H-5cVDP-?s2Y13OWEBfcNGw?>p|6&)L1?E6Ni|w zvkUGM;o|P&S3^L_zx}z`brWCwRE4TftGZpMaytBE&4X$2Itmr^$>-Ytx8?XW-$21- zUPHcX{Y^RmitPJ5m^!b&aJH#GeZ{1*gL3F|eav_5jkq4fjS5DqDmuHklX;V9d}eKS zm~mv%o34;Uyr+_*=42_|?=2iO>v0N0c=q;f7Mxugpfa*51-ekZxI4zjn^g1qh2Tn& zCK3n@nx;Y7$VEi*;ncL(6yF)qh%+cpqV+Qv#QN!K~a8$Jy2wK)8Q3| z&0?>OkFA!H4{DY9O2|lXDQrfYE(*u3!eW@*sPj53A%S`t{+BQY%*pNq&=Y_*4C|8t zxMHTFNt$7QR)SRR1KZ}{tN;QE$HBt^F=!dfzOPN7{=k*2+C47ApJH>9lrEJGM6n#P zU5RDu#a64d^~fDEVeh4Tk+db%H(mS7jRP(QGv9tx76F&nyoiSFJ=TTW0tSS5bb?k> ze%Cm}U*~ab?kexi;NlTgI062}fgYkWu(|zuY)xhyESzai_4Y>l^?{J=2s(q`Nlwta z2yWIj$&(5H4OCx@h9T$|Al$XvnZSE2F-$Vq3rQ#sgly-^RR8=rrDimac%3=WCtSmT_wu0w*y4|)$&<)~c(Rrqg)hIsl? zB$!eGD4>V5LyGshp~_>bBAiADkK9`1bU>$Wx7Nteu;96(F7QP>hDWAipnzF*J#R{G ziFqO)Y6G#y;(fK7>3PHh0czcjm&GRA&g9*25;5o95)9j$C`hw}O9dv@2j_O960>=9 z@tF#K7cd!vKWzTW_rl5YtJUV`wFKci3veQjRj$?})i2U`=2QP2VG=`q<+C*-DF5Lt zMFV$1^(R?+)(5~;W0s-HdX^OP=In0n+g#sC2da#9EhgqE+|cI-MM`<5>^ixii8#u3 z0xE8t0{4fWwYinhNy5g)#_wubEC6Z8x?{mq$wrQgwYd`N#33%8Qgvl08>+uDf1`h% zD@DovCqv?<@wq3r?}_W%dW zNK?zKH;yPP+*MK6adlyLH3C>$%R^sTyW!m2mHQJBfX>w)%HT|W_q>v_Dyd#)qSTAc z;%%N^#kNq!c|pV{2@hWhV)E6twl)#++L=*wz;v&2Q&0XXWC5{0oa^?cZZNq16*UCCR~qBafd16Z29YN4NYp*8_glCA_MFJs$t zE4I04L_DN?`!fmrCE4n ztF(HjPUr-eSI6hu&ZF-n53)aa(5XqlB<4*@9&mkq&FeEvI@A!*wx~}*r;WjfrP1Cw zb*=)+>L@gu5iUG;ZSU_A3=ezsg~Pu}Z#Qz(Y(Ue6qTDc&!`>#8iX$|xKdIV3DyoVz zlerf(%X{ouCv?gnY|NRfV`)N@Xul0?{QK~T7j)(#o?E|YTwR4{9H0~FT)QC|VSl=K88yD4YGjExO*uIX=R<0Xr)Rzp|86f_|b$yN5_*nl@5 zk{abK50p&*?86X@q<@}EQL-+4>KM!WL$khRS`)FVF#CAZOE|Yi!uidJ`w|4Gq@`P& z;ZN^l8t!r#8ZMCn0??xORp0`xxlplv^9WY?$f^2X*$T_IWn(RmbBbvUWL{HA6WMbHz(ema*Q=e|9vtY+ zP6;fmuZM|Em4i58<2Eyd@wk0QA7R#sLQWS}GBPp?!#H&dUoXY9wvE=<*mfpr=(1jt zcU`CMKlKHB7VxBgB+gYY_-M}RKB~^Y-f+__%}VT%4p=K`RN4#RQ}jjInG?vd zkY2LMqg#KSscDit80;Np)A)liM$py6<9$`rYBJx9D`{?o=hKw>K(0n( z3V1Ba9~HMLmbjh7Z?hOnm-t#wPj84efpBi)_junp=J7Ic@`ai#{rVd4CToyA-9e3M zPCVhwaB~`(=hu6Bc6!M)z1(@#{DtfbdC%z3zkCg!4ZS=3P8<8Srx{ zVDrOZp88jm2K&XLl51@DF(9B$hks^j#q`+gMoIkizzccMAhbi!zhV0IWfnd)ax!S_ zX~nb=i6$(;;gNdw6C_``S*?Vh8Qc@3=Q%aq_ip;{pd)lvtaMuq$T?{8-k)ro+?#|(Wtg7iDr)l9n4OtfU8Iidb&^HR*mUfn!%thD zow<}=1H$gUxVnsK%_p)|U5vK7wN(+}DoU1yrbE{4RPf`@m?*~%ts>{DtE4B;V5AYE z1KMYF{fc4Qe^1!zqR`p(CRKfSJ0kwDFNTD_7rU^?ZM0MHdic@?hFBmTAK=v$+`d93 z-@NBdJQtS(T)`EWI?U3f04FNzB&QE<^*0N5EdzFKg{>O@q#VyJF*dF15eBe{QXdL6 zYj_?rcH$BJ!g)VJyg|ofTns*Ofcw#AI-vL+9eF$Ru!HY9&S1>8#P}~s>s#tP-2m<1 zrX`PII1y-~4yT^U&a$4o+McR$=j37xkqWXhKy0b@JiWL;YDmYOkb%y)^q_0D+A}0w zhK+TvNlCRTcZ=2fn2s;$@8117)>M*5qxV|A z&VAd(z~J9527m|BLhtAXBa6f!Z%K{BQFDVU>POema);UNW=I3pWV%bbOb&@s>*HFK z^ltp4*^7RMJA_efIj@N{ZZ8WC4{a}FxX^DVSUzmCbO65aO&X?nlN*2`th>!u*eF?| zr@D`OZXMIpfkR?$==|CS8~wYlgFaoBc&Kh5blF8$$gp^y9|J?wg7~;jFi4jM5s!Mk zPWY~9TtUjGM~7Rw;;$~znDpT2=%s1cv8sf8B6fnToWuYPT0!=641AX8 z0lcd!&o32M;h~Ym7zYO~af_Q`9+~e8BEPGb)cp4?BM;2X=zkWC&e^-0I2AN_N$Q3nInnKxnbT9P_`_p|HnFQUJRS2=?I$zTEv&ZswS} zTgQnX7s5TL1rX%-q@)wZ+XkL(w`{Xw)xA0_jBJ9S&D{_6i%WetS0mbI4{~KZ^c20E zo_Jh!dfccFRJYf-AH3g(`KtZ3*ZF6Yp-E`|lGXH8b2E8`mIagPnUcgR-jE5Xh(MR= z;k?JsV`@4^ShOq$c&OCwr{j0s!dJ`$zZTBh5uxkqlp4^$_ZfgD+u{2Y)&IK^hV@A? zmlZC0YA}!OX@7hmFl91!-$IAQwjboGb8xZXWZ$3q&9E)F0mo{;@%N*t0v7OdJd8p_ zkCS(n418<(0+16ndIxU(MF~H@lsfr$T$x8nCwx4EbhJ81D|Xd@tfCnUqj0;`DOH>O z1=Ej-g*#&4!IUF}wKV%n@V}qPZWu1wQCrh;Nr3=BMGOpDDBd<^aH=0z%_D&hyb*QLGq7@;WU#60E<7 z+YDhF`t@z!o2t4YRzo`;T0`1?uN>l{q21Ii5(Q_iP`<`9zKZ= zO(5q_~m`|`aIi0#|-3vT_0w1+)WEAfBEm6=^nbpN;cYZdH@vX8wed=pQB5R6SnV8 z$FA|)7x@bng$I**$bg9&Tq*-+E z%Hd=OnCB9uM~+IMGy0_AYmGDv3O2!tHTr}2m3 zN2GAw<%^<3GN;FM>YbOBru@ckdS;i9)#IXI^3sp=(NQ?*Mn@MW1BH|NAR}R9|QFz;WY??Y;tMc$z zTY`#&GdYwOr)qiaN|q;A)uYd17;87|OV5GjZ;XG(jk)4B5#TJnwGCpPz4P3PWj#{V z0TJs6<=3KTpi7>N`*!l}F8a9BV(qIDTXUknH#Ppw!Qp{Sg!cKNR+|{lcW(|?ch~gg zRy+;cqdU$x@HY5m)nZxznW|6c^BqD-f3eUn4c|yi{ux(eA`H#d-?#BWl=b)RFZ>8% zX-x?`>RFr7eYn@?PAQI}P59ax?3G+pelIqpnF6o6kYL=&zT@Yke_b75Z||vyYY}^@ z6o3PTtim!4)(@xW`h!D5q;20Cx2js7S2pv6Yx0)Qq&6(%A}CLv#nVGTS+lYLJhSX zq0=kA$X7UD(>^+8G~JLV0j7W^PqRN6f)R}>HQl%^&ZwF-<&e1RZ;Nwl4V1pYS-Pka zQIBGI%J6(=f3Dex*rh22k&8E{fhZChpm#oHA|v{UCAMyRl11L(_7@9KE!163p|Kf# zye>*QMl8D7948VIe?LDDP?!RWEnSRbOi!1RBUi)oC-qeZU}sR4P05+#kloC2J=GRu zyBTFPUF32eZ{1|uW_-n$1+Nnq=Oc$ldNL~M4MYmskjo{H6D;o6_|L39Os&pSr>T=G zj9IK4$4}q4nY{zPkxT58c43+fZy}p&>v533V+6ITYD~eLSN4P?Hhi!BbFZ3z;|kyS zRcms_hDo{KPj~ybP?sXbwGwPyOX`^uF7G%WHfwvrnw@k_<{^HE0ZS1%L51)+k?t13 ziM!s7IDeMP%{(PKPf(}k%5v}#M~x2Md1}1T`3ZifPt$S`tCobVc?{bF@2#LWmlC%2 za7;Qg(SXz;@Y)MZhY5l^>L1;Bg1zU^ z3ypqld*dbRAS7ki1Y+vRtl<)R`4lZ8rWq9f*rz;v-rUuO+12)}cy9;q;}Mm!U!wwY z-4~u?<~Q?g_Xw=X$fP$qckUtfp`cLPa_whRL3EGiO#yX>Qtrq5$=QolAFgM;Zp6=7 z!&4z3ld!kX2Dvb!Aug((lDT50Mdw{QY*}RY@#CtD8fMNNzHn+1kx>zKeCue^Meuk; zK|6*XGA+MdP!*?iIT2VDzB~Z{xEUZ_S7yJD~;-YvnIk%9>mOoBc9F1ixe2! zvJ4Qn0NO{SuwQo@5GN{n*BfXIYFX+-shsE@GkHB_anL zBO%3MTIqC(ks`7JTdosVsfCu$USPLp92KaVUub}6og<`Nd8EQj$Ml3}x-ku)Ph1w^hx_db`Ux9GJnL;RRuOY)>7|(Vgpeq&oSxo#s5^5r9Tz(D zGjhEb@ji9R%Hd-A0GiDGu9+)|(n58~dR>d2ym8!kM;qlch6_>Liok*7Modg-fP&JV z?dvgNa=J4izf+o0OD7WDq>14wpV(M%`ieDb5li4WHN%$0r1KUgEjwABEQ!xikMz{O zrWP?`4y9rb0`C{LKC5a7h3mqDuw%6h$G=AG;NNi3M84Wr2NhV?dCh^uhzqOES-mW#e>Ug4>?`>? z)74mzNpbvf?d`p`rg{I&(kSNo=q=Y%QP1{ej68qBuO80Lt&2I-4i zkJh|6tmo<=5OYrWJnB$VjJx#8dTL$pdP&_{D$GhPrOBJL_O#%``_qdbc_zJ{0p)B% z8L|YPfRO$JB|WkHXG)q_w;mg|fykvQq;u0s6Kq`|l=yVQS}8KEz2r{zB4rXUs7@2999v<*DjMjgza#>BP^W9Klkk89&ud_xVp0Q>3Qke@Dfv) zeqi3?Ff=Ar+|j;@LQLy-9Tn%6V=0uSa!1SL@+-kd>1B_Wc_EywcUI7j@m-wp$x^&9 z@0OH`<%7P|hClV!MGc2D#)`bz;gpB<&vN?Zv z6h!k^BhE0d>cW)yV($a#yJkDy8piAcL0D6~sP_k~Q$p_KT?6#(>4*C)9+leWv}RbI z@@+wV-q7hlF4l>zv`j4?w@n-Nci%}duIv*88;ZMwyZbF>O^|)f5QGof_5CxNQ{m7x zj)?WWt*|UDQ;l&7t0G$?+~d7jIzWp4;-uNG&?$gddL3M9j)jpV^z^_7!L`|0_tx%X z!L${kZ44S1HCZJVB6F_mg)i%KMc9Etc4}hdD5qIls`^R}t-9@4dqW}{4)F{z{H?sN z*v*#+clMFw#E$Niie21qG(oSEq-NmK4`;1k9_L8@o596@ZVj8CTY>65Vf5!l(!9R~dBB_zn+oIi zxX(q(d)hRK2Cs*492pi%nX{4FxshOh4q4Wf6ii)7-yEuiWh%?6!pH$er{*rm*j`f8 zrQI2h0gy`w{}c*sU7JjsXzV6vL?5tk+8N-ygu3c|qo^T>jcN(yotvoWBhb#-?UpIG z;?m~Dp0w{|`GwmSROO!WJd2tC$|3WB~n(=Gq*5VdQlnUWVAuzgeEhZw4&T+Dg}{|Z1Rl__9O7{MA>U|9>B zDzm!kkf!TgE#Bi&g9QSz1LHau)ofb|tEn=2*`wG}wPxM5A12FNF3gWv+Q)hq;ayNN zIeztsO0UMVZsqE#NrdZ0Wm7@6iS_qX zKBAmwrjho2mg%z4e*1`mbk7$ZGJLvq`wHSS7XszE(=^k>`LL>ZlHB+Y=9aI24Xn}W z18uh+Wo<22gy6bw%82-SM~tJiscsCn(G+vr4zF$kCYT7SPeeuLuY8+ydJk_@32 z$0TLw2m!3-a7JQgLnIa6KurwMTX9=dm0^$!EI!fVO8Tr<5sIr-Ml%d(RvtVd*OevE zdCTa-<~XSdQcm>eheST@JHLYzYQS3qwTDRRwdP6buDIoLJXN=8u2Cgh7J6o7PW=kC z?|~HhfOey`wJ6hM11@pcmvsU((hpxWv)&hbqxVnR5l?EHknh>({XKz|#2mJ?`&F+2 zJH%TCz>O2aN~AWatrFLrK2d9D$Pu!G5CJyjNFBbPI2@hsZCN-fAn2(v$f6?bY2njX zC9y1A9lu9$B=YAMd>{yZKbxg-=ay35ZgoEFvtzurejQfTf_EuHNv=)^oVrAFanYKv zcIK6Eew!e$ch~7@*%HrXPaHw|NlBh4r(5FbkpbaH>Q64QV0$e|DyWWvutRDIYYWmX zv~%HDI%sonvGO8<5T|=_@2qv_;(Vz#SOup$#IJhzZc3_-a(?CQkF%x0sHyi-;denN z?~P*+TID2Emi!u;*XtOA(b2cB$V@vh-)|>NWzBv8B@y-aA%=F5ndD8DY8_E^OvlmmKz|9GS#j$LE!co&T` z=zSE7`-{hV&ZRVgw&t3De)w!OER0*?xPqiPvJnkWt` zV!I_r5zjTA-9E&r*yiMAx~%O)E$2aj8Xga#%LJ8r>5u_-!dc!a@@cCxRyDR%Auyn; zWVz@QS@GDVS#d`)g39Z$*4H^3z6af5W$BWWZQ<}?bY1Hw5=PS`dv+tk9E*Do$oE?LK#W(y2J;<8eOBHO$Xoz2V(I(bXvh!OLDBxw&lx<#i;R8 z7#GVUp)l-OZ5}12_MI+@EBki8Jr+~qqmIUkv^5e#U#>^mtA|x4Hlf(EE2>53i@(s< zk#mhw=FyljmzRFriK#dn$9QA<3&Bk;UceY~U=ap;% z%E!%(UYDP>=ik{awG)hK;E*u3uk^&|$o5R_O_t#(#Oq#ld6tT*tmcuL>!u55&rIR< z6Hs*UGBn6^!!R4B=FpWs-Eno~2T}{q#YPgg#h~rMo zlsy2FV$EK|+5p>=^(i%e2Ru9yxqu}B>Fu@MY~^_5R&IHH^V7-IgyCjO%qL( zGCHC(Dg|@xn`x=svG}y@a9A>m6RnLNZ!O{yxwyO=L>$3XHP*5of$LLoUKa6mi!2>E zoudp7)0R`IwwbH1q4@a52RlAes;T8`p3u_O&i#q$42}$9rmpkO2Knv3SU@5Hn2uq$ za7U{G14&vFeLru(?4yB;G)qXUp11D^LN2r0h3T&S{M{6I9cb7L(^@Ht9^HBSLuH|O zvOz|71I{83iB$rV7Z+{~;|4AqKTGMw+QqQN2nqT++x0O&Q~w`7G(IBO(WHaX+sxAq z^<~N{4|Act_rhQ%YfTJphs+#i@th8zwW)5HVwo<``1}^*Uwz$N;3iL=hLj{H_ub!Q zz+SVP6PS`&Tr7HOcXQKfyFR_ht|A&ZS&b;Lo%wZtBzsw&Tu-c#3cBrbE#9Y-v&1=E zeU{0i73&q-BtnbsW@ru9xd_Od-Cj)B!f!+?d;{mvirS-Pq+d`RJv;E%`v{m5TYU|& zr*g)xm9KPb-e9WU4Zsx_W+tbvvW~JH5&(5o-<0uecV@f{W4E==ekd-E9@!=^duUOu zBc}7RxS+So&WvBL(tt_ZW*ij=doScx9F-jJ024~*(r1Y17e!SRDG8sls1pG>y&O6R8)A}`Bk9Z=3f);-8{RY!A1W2q88myoSgiVju7{!8{h^^Yb z4(ZEubv~FH|IK$>k>)vCo~4~sDEQPV&m2bfXLi{BetmMd<)ydO9FmH3I2HPCc=|ya zn7aq3{{GUuvD}g#mtB|P2}wAy3ct&&xv2!c&yY@DJNT=0=OZqz^)h8sUnNu{)h}Py z#7?g*WO+zFOJsScQfV$QGoB%aEUlJ@eDF;T67u7^8{G}5g>JYi2yI)Qef4&-TiUrh zqg`OlBEUWHGdVN8Ki$Uo!Jf?_so>uG!1yNXAV0TI{_R}YlH-r3u?JfVk;1O_XYaPz z@}&Z`$MfGAHB;^N>xeNLe=bftwV_83ZRw9d()nOFc${G)K3`lyyr;L7aFmltf`V|4 zoPEgM(!78vy@RWHI5O*>XA@ej+d;tUx+RWOE86(kxHMJ-b<$#V+PQaSlZzD;MS^jY z79Ko%Y3GgN0}Xk7ELaTp{25=0QLeX}+dbS!kr4&=GfSHpc-p}djSmuk{Z-lN4~G0c z&bKYU-n?>W?5D9iVxYQ0->$v{%GfwxL45fXgZHNW?yla+(dl)p9g=urXK7}hGX!-D83STfBUk4x1 zl|>@qLw($Fa%b`j&Dfbcolea)7shptg}Rb<6iYUW9`n8m+nq(EkW>vFZarVM)_j+> z;-CsauKTT&>BPgc|p`;v|C=Fw%O;u4#j#ivbVe-B8 zHy^dnpXFEVI0-C;%_W@ewLzAe4^z8SB_Q5jmb`L}byKw->~Gr7MT(7E@R1i;Jqcqs zxTZwnAyH}c=p+uTu7`Wd&8LMZ@BIqWXY<;|F3G>Qf;X?D3?1S9&hWT)I7AHFp-D6h z0?~*{%!bQP)kAx!8zxV*v;^1MI1>aGzJXut8wk2P)A+7F;}W0Ae7AcUg$k$9qi(TspU_4EJ-*%(b>k z;vP2YU_A3SIQ!6`bx-eM_--8qqKR0h=P89Xsy7wYWr1975ZF81gC2e1G-9B%N7+ao zFvKh*-CR2|J@Bk2cmsiatfhcfoQFciVKolx8Sl$XLtcGzL#!nT+304N{78I31ty1n z2uaSf#947WRCP5b;c4BU2@A}Uwaq_gSkfw3l0A=~wsZApX`3fe#ffVE)K5|a-|#DI zis)#$)RVC?7q)l)5QV(i;7C}8BM&U;y)QUjSAL?y?X#BDRe|dCi?4j>Y4(6jv#gXB zxZ4lp*~dgd?&4!PL8%0!x_OpscOMC2w|x2(KZF|<(ivFB29}f0I(&&ZM=r*OI`OV8 z5Z9M^-`#txNm=0_#>u(#?#*kUxD5ldzZSvvysPc5A?QUQwCyaduR!83LeGZ-YYiY+ z-kB@|%*FU$!6hReC?!nD6k^0cghB*E&%Bb&)IPdoAOj6t$@Wx z8h+D>LyzMPgARjAy%Iw#xhTd6c_uG%txBsJyR+lt#~{lA#%IM~lMNiej$M)V%&)_#0j z=wc6)dc1kjHeCZ%dhmpVbg8ubg*C>Hp&P*Vbha@7a&_>`CF#6yF=78Dn^SUwHUAeK zUc9-EuyiETd`9c4%&X)$Cgb;~zieocu-@W9TF};5ZPAFhOqVE<_0d$7?Y{ z?Mtervu9|YylO|94|F|Hw)#VDA@L9Y9N+PY!MUCmKwhRVPmrZ!=28oRc5M0 z{#auuw7f5qf>%~|ygGk-ecjB3wZCngMK*Nel-y>z{DTpKCLl0yN;2`)433pcOpNVGhidvwQ{vInCL`a7$G&eQ^V61 zTr>D3FXYDhJuHBYWHQp;^)fwJ56v?||IHIEUoatqAjH6tMVuT+Ekf2DP@RzrWqV7^ ztSpdnNBpS)y08a=mYP`*V&o$s15nv)osybBtE{5_jTj#%B%^=k1&3`W#)@;Z&$ z_y2_v*rYziaWUT(HHry5Et->KMS4u-cd}PG^+w{@lo_`lEiFeuD)(44%gq<}iUEIH zjCzrL$t5>RnD`eY?K z(DE4vJ5jXoDp7D~L#~fUk$?-Z)UfDc%6s|6DO{wxtHCjBcTDeK-$RJCb;gQrojcTK zyIiLC>HU(!ofijXBge3<_)2GxczsSD-@OhhVjN*^x*}YEs>$^h?u(4pF@5a0Z8|U231t-59hnApUAH#y-M9^1k=Pq z0?+Z6Yu@qO@jMa!lr#>nFp-Qd0;zl#Z!XX4!lZ+Ni_m*J(b{yeQJy%$)p*ElorRnn z7!iMpz#ts`fhRs8Z|hFC5Sr#*sj)U>p^A~Jb)vB^fCBn{Ke@2EXco2`mU1p%Dbl4S zIX1Z#Rpl#@mueEy@h%zjL=>Y+(sWIa6qmq$44(u&+ndPqrn(GnZFgPf*dfe+W`-8& z)A>QW-Aa)Wt&d^LO2{UmzcqWZd58*aAjZ<=J)=Vd83fbYm6ZC@V98-dxL2fez+|A2 z{2w8Tc4D*3yjPIAo)-mRINYpd(-7e6i#8-0?{+rh5Y?Z#%3T1RcUxzuKORv?KbZRQ zhK&QIR;W!Q;c*Jm5pdiXY9W^6n4gB$^=Ip-0-238Y`kL7x&!F*!dnH*k&T%ee&jwd zgXDj_&H}oS=HKYY`vSC5li4~K`2x)fl?HdGa+`U^8vE7O9Jsf|daCWfjxsPuc6bbT zN$SRoe4eM*`HO{pY55VXB3|nFC{2@>q3zVF6|rjB(zWadaZ+E^BA{$bmF@K<+0=0> zEXWb5Bs!vOEfSiIG>DjDX&$AM06K~eNvvT;=Y6g`#ASboF)pvaH&e4QniEA7zx@MP ztme?COm7C?1?{pEcaem|)*O`s1kC560CDDpSys{?z{3ioX>ZPWUa>#W&8u|LBCaLh z<=&3C8eGJb^BwRvGU3Y;qgAvADPq_v9}6a^zYpP#DYcjAWH(=ZgySU40hVZ`C%(_L ze0?M_UcSZYn^#DvxqV|UQ!Fz%f>N;13eAFkEL$x;*5aScZ@aoyFAk@tvqMTIJKrg)5MDR9%p-4UN~&z{??05a`e-Sw%R4}NQXv4Sqj}xX!A99 zo{`PDR?N*;Qx_Ga2F%`_FrL|ksV%s>6#|d8@CRTt#ay6l0!N<#q^I7 zkR{JVlvK?G%t(4~G+GEI4WP*8ceM!`6$joaYXPK$FZYM)-ImlE@i={oo>+LshLBS@VnoTZyaFTdPY4IBYd)j@yiOc+#NgJ5-YTdJ{iVhcO5B(#i~-)lwb}d zGWcJ3{VYvbUyY*y^}W^ZTQdet470&?@^5A90&XQ}oQ^I>ZJ%mzxAt*xq#UdwG_!f^+!o;({@g^U%m(9iyWmRGD0>=%}KKv zCyjJe+9@mnSxB@T$b1(lp?O^Pw8b(2A}i#ojOKwwnv~R9V^1Z73oPQD#;M|{1o{Qo z$MN{cnKj5-cKlgtBcS?-NAJay(Lt_m%VT~WpGK$GGwvcwV?ssj*(_EstsCN=Q}1!S z#~bDfYNR^(!Y9U6b;l9sP>aM2uC@7W0{82HL~~nj;?fvD*KV-Oc)}S6&xr!_BYO5X zJv*|FZat9RHl?Q;Biv;G<#;Wrp-;1-Z!r> zYBT75i&-D_IvTuMvO2Q^hv-h zzPet0O~p$#nmfdd|H$NA*rt$YruSOtKA(A(!eaRdXS21Oib;Bh&A~(8Mp%q!XG_1- z@XuyW5)5+b$;gWnWK;x?2kw{`CSua;(8AXT>dQrAexl&hjvY~fVOqBW(!7ACVdkfS zcHZNyben7^F&i@6?D$6;jY>*ye9V2NCG>|aT8Q8^6=u+^XW!`9kw9e$MlVj6Vt{Vitdwgp|{uQ51y)TG1T};<( zoGd@2dYgSu%mVt%#x1% zZlmotSeb9DoPzSTpv8PhTdJ*PiK>=Er9ndC$+J=efxJq@$5&+aSJ^fDtuQjuP;RyvF z*t@1%hP>49)KY)jlSoCvo$A*WukMePqHJCrR$OlnaA`^qkPBq&9;l<$S{?KfAFR4|0F70#>G*}`_VPdy(H^>aPoIEw8bSF6c6EN@L#t8u+Qc6Us$M;M1A?J3 z%IQ~1B@=w(9Op#8Sw`vgpXifkbuf>g8 z^<($2b6g+t}TnoVd!pW`-{gnuMG1_g!JEz8-T9r^~zBR`XfhTo>aFj7>xIN#yJ%9 z<#b;k!4=U>w#6>9=?KgsmsUutSEX^rlny&PX>?2PyyB`S)P+;F{6ppCL)t@;$1!}c zTlaSpOMJQ*KLsZ!8qDDnSi|QOL>z=|KqMHwC{7vV7!+!NjtacE$S#<&`v(%kHZOTR~SnfrrPOv>C>8ETV zC=HKLIOzLHqhX2SsjYK8Z@*9&71!*nz1n_YqOWX|BT%GV`R!L@r6_rB*=lt;=j;pD zbL}L!Mr090DxReLG(vAL2@J75@7L%mt_tDa?>s7U_r=1xy;}DA%e}hWHXB6o%ki;C=gq$2BW+1~?0N){0M)fN+oEW2cPF@ea1EN^A-FpPclY2PLU0Kh z+}+*X-Q5=M@Fv;+{?EDZ-l|klRFYY1&9A?f(cNPRm=G=n6Ya7u7}FO5gRO9W>_U;9 zv3u?dsI}h$Jd}smRx%-R6P>YGMw+|wBI%hw)K))5l5k5rdF3VLzjgH(Am+ZR8-PCO zEB)1esuy0bN|r5g8q8}~ay4A>)Lh@%cx!nCV7G`@Lbp@@PAV$diD+GGz*a>NI$iXQ z+>--PNzd6eZG9o1R9FN%=S(#yHau{6KcZE~%spJSB0CL#dLwUa{#ByY?_Q{J19AtB zO{tqb;ahR?f{HAN#IEb$-6;HKm_m3om`aGoIx0vrMXGfw+eRW(Tt6U5YS-Gfbv>)y zXh#8Bjwqo%6i%kzOM27IuVQLX$B5~(SM22A@KuNd>I8vncUBkt&tO^|WjaVMs>Ae6 z2I&9!>RF3_5xf=yJkAMmQ=T%kq{=Tg;_mS>#(?Y z_aT=sPUMpSf1i}<`->WaR?3$wO1vcYO6H5*}3Wo^=9R z_%nFHZ~(L-<(<99=eD^76C6`+t?aU~oY;ZdD+5^3V!?W}H1^W(&r#^NshpxLB|8%Q zt)DoD4MQ?qvL{DUxB#-r{dZ)v8xkW*TVemhgYcmXV;o|V+K;)mr1J>_1`Y4X5n80p z5$O_3ng4d$7|)Mv6@S4y|nAFxJH+ttoH z5&elMv7^|>ZO4>YUmJz?eLCe1q??4V7Z1mlI%&82 zVm5eCNFXZ#^(7n_L!Txq@&;~tC8A$H6myWK(=IMAQ=)H=L~}0mS=dzHxOWHlQ=_R; zmW)Z=zJGToVce_i3O3Dp%1CWEuwy*{QaDC|`>0?9$l5GHi2wJC6v+9`c3=u`!N7MH zpcYF99UX9ykwGBNO-UM9(MC~2$r2Zs(>AYnzmE{A#%No0mtD{L~aOTS^o@8Qoqu&*e*L_K%UsCzRO5LWdt6 zMHKHJZG_@CTy~9hA#_DbrK;gJ*c4p@VjsB=e}1qtA8yma)*5;Q4u2Lt`bRxO$_A=X zwd~XxM`VNDJ5xB7xC@XhX^)w7*ji+E@l?CnID*_Dh&{7cE~S0dGedo_)(GqS^=vA> z4kycNAaOZrrc?g?8gkj9>m#TIsbZJaO}`E7>tNDea<3veniK-WjQ{2PF;U3nU+w38 zj_S}#`?)nNkk8h`fJmC{h9BgJ@DT&!O#sBe)}4nm8PKa14kEXu zA|n(!TlB>loa@cWbJ^PU6klg~z5mcFWNjVYH}thhio%(({Lj6p@xE-`*7G+m^7fGa zu3KvfgAD-nJth&ljV}&)O?Ij^^we#O$LpAh`#VnZcTm?{#Mht2Yj-l*_9;e3w>^Pb zSCA#A_lc=5#navAoUYSLPP=sQ!=7Zf*jw5(t32y*gp)M(@u?g7F>5tz0b;zyh%&;$ z9!I6tyPscbETBNrS@%-y8x2IkCq1PbC2sbM58I!*iJ-*wqE1xHg1iO@bPrW1I;2_0g{KnaGdW(Vex5ibY!5Slz^`*xp9tFLz|q7{QAiki5wO^{bv)?;JYq zKOP7ZNW5I50CXVQH4_)R$|>+Jq?!4$XMB<(f{ zuO}3V&kL5|gC!}|(<8~9)2qdS%X2T|o!flBg?aM9lEQHA{88n*U4KzkD_?2UU2h4b zDbtazf+^D<{LkAuFvqS}LUHvC6bw3z5Sn!-%@jhkcnL>SGdDR660VWK-?i=@Pm4r^ z45ofrmC}V;?+xpIH|&$w`r^C~QXJN;zWPz>{+sPzEWpz^L|6kABo!{g@mD&|$OM9# z{NwpxGLNg(iB>hkSNIGo^`N>rMzBDw(iCRCh9)(hCwnCVM_NTR5^D{Axo|4|E_H93 zkRIL0C0)!rbWHd@%cG+M^KLzun+z1FzTd_&$jl_ze?{;AZj^@zC!=T5!_N7l@Poi6 zKSN3Q`vi*yu<9+*Icjjjp)jX>)16=PIr==_W~=a3%zx3m%Hv^Jz1ngW>a1-AgE9=K zCq$@E%V}LSI7;j7b-&*ewd3{c$0j0*%%xW`>^*inFQVdWvFc;8TxeXWeLM};o%p?S z;tI4exILIqF&nK!*s>3*b`2g!S2D*_hx63)+&?NNGLf=9Y({5rhxYgPQ!tY^%z^W* z`mB?3B|r&|!y-051SCr1Cr1ojn};3CyShT%37hmB);RmT`iZVXMi&X(@wi=ZbdobY zw_xJqhhb2sqUc!$hp`d(Ikpf-I|}g0%DpY(u)+EPSyi!s0|d~JtT>)l{N5wBl!SAQ z&>r(pw~^AwSOMzR=Wjd~daCfD|CpU^$&;O+G8RPd*=Wo|x7}~GB3W*E*`So@?a18w z;Uq+zv2k5biX|_}>(~E&zZz(^a2;GDIB zikL5oBsi))lfE%&edXs_j77XuKE$irTxnAa7kx zLkz@$BA;t?Yl^v5OKL0WN3+m4ND%YYILn zwJ*V>G{c97MmoHg2{=zOwg4y4pNTEje*Uj_E{BL7$9qg_5xPFF7_S6(X#%5?QM_Z< z?{}Ye?_F|_e2K)ko{bG&2#LVFETCk`#eZ(h6tcCacSKV?qOsgFiR@@J`uv2$%f=H zz6VH7x+}_2LAeg+aF%TTW%S3eypS(;TXZN~S@v~1Q|H?k=B{2Ro`9T*e^t?wd+pPp zu7WM-+R;u?a}K5|oQ=5(0}ajm1+1PlL^m(FvWmv9sx7KFUGofDH}%Kwj{(T))}#D# z{5tAaUuP=CNr%wt6@RtkL0>%}rLcPKY8A6s>GYejRe?GiFtRYY+FyP_8ozAAwEv=4iGOYME z@{Zh7wj*pa1#@gSY&-;F5o_U zaQe33M$GRxe`CzY7Mqd59EMHnIk3!qHkCiN8A;5nH`e+rRWIlL+#*x(gC<5u2)o-0 zOYqJUR)f>Re@@36nJ?0oh?v+MdW(1^Lj+j&H#~*ddm1TMzX{G_f!>Hf&Q!jnay?(5 zE;e>m7{xA046HP1$OpC4k*<84O68Y``3mlI~&60OECAzif#+ zFRK&&aeP-v&_Z{i*3UhC!Er8n1;U<6W0<;SQ|JfebZ?9+)iAumLW&}lTWO{)!~;g4yWr1(2W@9V|u z&{|#tK^gD+mFUo4w3odYndP{(cJyH=kA%6e1cfo9cp&a`*Yo<7yDCZcx13HEq8e6i zy4JopGF;@vjAw=8o`*LQc-rfDZI>OT73|+RKpXaIZ1FpzGO`MR8P6{F?Swcox znXII^c))DUf{cgB_~(Qrf9Okc)2QS5DwnovX+pE!OqO_Z4`<8OMj}Uoj^I;3Z_xHS zexBdn2u05Y#CaJKb{kpqg;ILHtaa%lMu~PCTy?PwH&<|%pXdEWBEGP}GqYv`ejq${ z`#@ZN3_xhYr>ioW#LmYhp>XM+pAS=+;sy|QboX}qe@tQg`f~#gRBw-#PE4!bRXdlw2^IM_)+YZgU^)%J<{Qzy- z8XPLpz?TWr<%V`)&j)>G&ucebi;~V}%)`|cBwbLs+Y$0@E4_%tzHU%-rB7o0MYXIh z)F|RJ!o7|sYeWh+W0rI^)RTsk<PFi0#dX{hP;Fs5*coFvawn5;-lmncCxigwu1 zv{Q0Mhri?G1G-xsos>h0^$H>!e^i%R`K^J#S8jCwx%%70G`!jQ-mZDKz|`;y#qq0_ z9%>jC?Pj`auycusw7v@Q&7*FnzHq34cqHy|Xv^b`ril+8@ksLWFdcl7Z@aC7_X~$5 z#b7+66$$=$Wm;>#DIP1QOKGZ^gQmmLM?a^mthCc>tsyyAqVdYvp`jrioVdJUFmau* zL88T)j&GOafv14p3u4KlwiiXMl@akQV9ZFypA*Eo-Z_bE;p%8Qaw)D3$6iCHRSTws6Uutpo8+1J@Jv`jF!vGkjc*mwd)&o3wmt z6#(T8*0=R{M6JKe#ySv+y9I13yd1O&h;Cj_!+lPB8uuM7nPoycrD{0r8q48dzC*0I@(I<3{_9E4EB5_OM2Z>#JhNU_}o(PyP3Rb!AJBA@AH!T zn4RkK+-PRidmLRKn>Yeas|wxxO>Z^V`jPB5-iHj2$LDBfw++}5Rlv$ozd>YF3f=cZ zf+S)+*XVg<>xK!jQr-x} zoNy5yUqQXuZtDFkjLxz(8)sp%3Y0-tCnZ!q)-fi2-xTaEzcuZ2TH{}>MZ`~;0PEJ> z{&O8@@^a;PZo#IZ0lc}T<@iPWWNCdSAtL~gO5GQ|Jr6#u(v?3u-(+9kV`-FH&!ShM z2~J4&Ku1|!8}Q~tfMv-b$?$Ps@BVW9 zIql?n1DNVuq#pwsQtK;Rx)myI&4OVmFo;BFmfD(E?^mlP;W7{A)f$7g#i3 zl-8{*i5Dq=ZF8o!g-dbA4_;mu`piwc-=BNhZg@(8ElNu8=xRa+(Wu-{Zw(k>bT~p3 zln&~YUmK%Y#^=%joWKkdf2D_8w!`_w-PW$NnNmIGgQb@L^Iib@iJiqb9!I}se>J^n z-Lic3rjyB}u69jfJkw#I4=k`A;IbMTmk(Oi6aa0qM;mr-n{#H!k63kzRqy7y@^6k+ z+=vnhT{R585(*HHC80b#+1|`0!iAhkC(3Wqs}}ptt=*$ydLML!&w>yADy#iP#4D0M_~opK3J>OC}>^R8<-ey^9|5REoH-R)`Q{CLuYyYf_cn z8;*q(LLmvw-Mz$me%FLgks3_DR+HPm^BD+AK;Ue2KH;orSn#jk|MonELO*v(vPTRg z(|+(fLmCxHUVTmuhFtgpJ+Pn+$*0juQ3ttK2RH$e)9%TK#bwu-?C z3mf;YNn|M}7Q1`Ax>mhdS>3xbirn6D+gCVkX_I6zlW*jZ9E!lkD_M*&oLG0aUU%!r ztR$#2E||4kj-A1B28(2-8QSM$4ZzA?f(L?K$jPYiTZz;E#PSI}@i#9wyO-#OtoKWK zYUc;8*sp0P`oleh@Y!u{iwiJmH6u<;u%0#_gTLHu7M-0CIFfggFW;AnRjVI$h)TAX zDW0PQb_T*{3AcK3dz=y?6Y^TFxeHv?DS|F;?BVO}kOKSz?B>$y4962PHbW&F4ekqT zZjK@>xGcp^@MkPb3YF>JsOmUJ$}Cw$NDQum`y4x)KOAxDP5mmlb03$VuQg1lVKZs@ z?q_pVqTWJBLwpHM#piM+t0w*kfEMbBzQ34&FJ22}aO#7F$C$(T+k&LzTYT8;#a$9L ziNu${Vha*Lf7CoFiP?tO1(KPW*`nomRN>=W^(RIu3uO9o7{mC$v^*&hhSWsCxv|YZ z#qa0pBtC2p|1of?si6)1lJ6-1kpr^@S6|~2Nslzvp~m_A2R~r7!R~DH6V3D4nDdaA zs`_W^BGn=TZJO~Dh{s%-M!j?U#~R_&;J`q`Nq`EjrSHoCa>7UKQ2a9E(SHd6gy~S{@jS6n7}6qc zITUnP+nZMDJu8}DzA~-=#gqa+Q{Y=4(#bD%h zh(mV9@?nGsWKII2q+Ub5!_AeBFW>T7ywz^p)VUO zZ6xu0t6`nf)USDX(-Cdo_009|Fl#g7vK@cui`;p_n-ifJ1Fr%AErxq*#`$MGNYz1c zu%bz!KpBis$OQ)LdyL}|A|Qwu$wUk^oC_fbceNIeY}hvXNpWXuNf;TY*VWZ61%59Z z%Vl<34@ct{5Kx~Xy6X%fDhcPQzuzWz|-pakgqE_53r?K z=;@)>o-Id0hbL?dCso}v@9+sz$tFd;u@>u)XO8MtPtTez0U+22KL-zt#_DBqGN(hS z)$5qp-d^o_T%P}$u;WCAHF0Xhodbhf!rsm737?g22GSjNwN{jm*99Rm3JMHlSqtTm zs$c23O4*9un)Jm?CW+ng9UR4R*9VoSR@b!W#B~i*fzpjPreX_Ipax-b*F_k@5+h}V zbIsY&J8)xYE#5C<#Tb_5oAh>S9O{w}&|e9XrDE=U=bfAEhB!FJ;K{j!qWIL4nm#5! zBKyw~J-~G*3k}Qryu!#K6NYWIv`K9Hk;AT4Lz+s;v`^GMk~>~grDjxNPEgB{8_ebE zp5-Qb?C!PMHIH%C5)B6soo2k8Gp9bd*Qc!yF#AB4*cpE8vULYZx%g}>-I88_>{9Un zDYr-O;6H}cR?l~ePZf~Vqn!sN5*v5HYyK)78%xezbsxr-e<|DRa^?558QI! z&KZ$%V)w1yLzo6fL+;@?T~TDorB_(B!0!gAw(`Tu8_AycscJy6v4G2J1B%e#@KTsI zw1NT;<6bvs5vdLK>*v8|Fo8t?{ow{cW7wX@xMX{HWlsNeL1}|@II~-3H{PQ1)6KQ7 z2MQY6a3yHu&({jVbdN*DpUkTG*Wc#E8rX6bb8O#(R$u@U%#RCfxyM7B7u%yq-aF}M z68rY@FpeHqBEy>HiP{YT4a(~WeIy^B8*60NQkasaSjn9ge->#r1)bD+r)l6sN}f09 zbwKRj%m;wZZ+g!$sD&r);&IYHKGxPP+zQvjD3J}Juk(Ez{K;fKC+|X4jh-&(K}<$Q zZWoRgTBKa?eMGZ1U=6ugt(75}(;8Ng^mhuEH-YUyWju{)E#hp-rB4c)t$YTL#Y#3N zy+(IqnZ-(FQUmdz-fy(n`}9~Og1W>b>RH(4C52i?T0W+1M$NkHavoh9D|>b`mX8(n zDv^aZOTnJ?otFzvUbBBx7Fv}8=WI*xXHe16{iQBhOiCMq?qok}@LWE~%)|8Qhpee~ zTBI2li!wF0;&T;`X+L_jQ(=a-Baz1J^ymqqWz|3KC7$o%$eACN?E;9K!G27cC5?r3 z?FL#bl@R*iSOnqc_Z$p_9ebk1cdxhepH#t=##!obfB`%>AFr1mPMjKpYSUNo&0wbsEq{HeLuHvCI48Mi{8Lq242?kc}zbz8{;qB{$l6*Zuu_XPFAtoeEt5tj0=mTV=L`!6Aa9>^kbd!!ykz0Qfa4jB%KJo7~V zX_^*%T;EMORNuIHBmK-mYv7i8X?AM>XT*5+^s?fmqr=zNM+046Ry|^>B&{dZ+%<$| z2$_9w14t_?duDzo_VAuVYAXR?-!VBA=R4M2!EPIg`}_OOrH~p$iQzEaHmMDN=eeaN z1jPx(gkf6M(p1;|mr-u}ZCr`xwEE~N!iBW8rwh(!C5CVoANnc$#TrgN-z)~%OtFfr z`Ev6jV-Qg0DU{fYKY|R_S|Jm8Oa=EhBbgJUBKMe>$N8T?0KPbOX(CII{W`l;M-TILc}F z99*&jk-@FVXE5h|H&bdb^tNUJ41nbb_{}of^f0$YR-O{lrL^&dV=-EGFX0~9`!RR! zM11>N2HzNldpCkg@A$z|0cS|Hq(awftFFsH&6j3jzs=H~&jn!5!oMY?e=95_{DiL_ zhvF4tZ^GZ>FEipOvGYd0yghUyFfy2I&O>agj^%qEx2^?j}rwj0IJ*X!43(ecdMd1 z6$Fl#$TVXvguXA~I&M%fTCIMM7`q*3>u_FCmMmBI8LhB;{tY5zTpXmR$uH!6p6Jt3O7trPSlI6NEu#kkB08b68vfO zbaTkoEn_m9D#SaSE6F`V zTR|OPryL{tbhb>_Y{AfRd>Ugqi6z%mscC!bG_gLsFn#$0cK6t1p6xQD^PtcssIfnX za7&D4B!%^(ta;%4dG6IPo-DHAw$a%#Aht_T0)K4U*3Ma?fsHbDa7Fu?6?u9}tc|LG z%ONi!^Va5(^Q?%4dWKHb_uzVfwYtHoXm>bEJ?`D1d-0Ak7SR=J^C)g_r&jP`F^P;* zlCG+IRbwv^5z%;=i|X?$hST(iQJ3O!Sus>8SSZUMh$b{(tKy$w+l}RpBz=iDJ->gC zHdAk_sWA9WQ^5)a0U02CF+P%UmizNxEMNp{Rnu87+S@c4m8I>hUH{qo(F;Tg2MiMQ zQazXQEg^0=v086(fO-%-S>XnxTIc$YGzM;EXn>hl2 z@Z&1(Y{Y(cQ$oEA`8+@ah3k@FRBXCdo5^KcnT(~M!NxNgjSqHvyB27=<{UPBeY^%P z$5Xj};FF@;f5@n}ymFQOK(3t9D>YLZI+^4>Oqye_ubF6y;D_rG#)2@f6l6of;F-m*(4Tqcwl4Am$Mik2uSnVE z$rtNL6E@DwI+Zdj3>6$SN#2H9Q#xAAqm8nJHU&0couZ9odti;+HCxlS@jp z`8mGZ%QDUb7X{*@5$R;!b@%V=zW6@rg-Oa7c1cct&nGpv;_@_`@xT|Ci(#H-&3x=T zh(P1l(q3P|l?mN8rB?fE_ZBQ}w+Dv1&G=}TtByk_0%al+NWo6GJo zX^9Qp;_L6nyr?yL=HlBFoYn~?{8pX2;Z28Z$4Oy(QU4`_7rz&SkLkTW#BrCn(B$+j zXzn{@gsSuDQ%|`+AvtQfd@SOa3vu^z1`b`BPT%mxs`NvGod-%B39);UP8aQJNfc~> zD$?>6h2aNNYO$vSuaheh3I>Af2%O@F${$&`6NJY};iyg9)^E1A71IkzXnHlHm8y(a zc2{+43)4p$*0z0JNDdlAs>d8H!sybU^TgE7)c`Ea5&~R3hZOY@7LzVfzNI}%C*J0B zWl!setch7vTU%R&^ghJ*`W6-m*YFUmBJI2VdhQio4->(x9WuR(un?YI1)pR*2-IsB z*b7MY$}kiZOLlrkmcl?BHe3di7lH7PD8#+xiff0MlXp|r{OasL*rWD%j*+iW>58V}$Ly@Pn<>Xl0>~=} z$)*>~%0S%D3BB~T%fAHY4ykk!mi?Li`B|6UDlho^27;c>trYcWnNFLZc@@B5r;FVs z(kByp!Xbt;<%Ywc<8L4i?`KpK9d+M;kZ?t;Al5ckWlBe47lSC3oOinN?kY2PkI`~{ zj7Jw4>tkoG8aRPk34`L_>-$~OSDx_M=1L7TK(a-fxv%E5v1xn<1JyizJy>%DVAHqK z*EUM$OFxV!@STB~F;GF7nNyTV{^KplpZp1f%#T6v5P#!qGbKc<&rVzJk8X|#p*y^H zq^t{s7@Ee%OXTA@`U1E*5jJJw67UeS!C<;EAkYT6G45I3<74piUA^r=Wg(x#DTLth z0`%*nWsLj4GJBfYSEL91>qc3cQj8dq>!Sh#M{^C_k^#xzS0>@Fgx7pGyGYI(Teu!a z8`*t@Nzrc5Fu|niY+S%SgF>9^45C*pBR3A)9zLXS{uaYx>}Rnqt&*7UnithL@?+)K zY`TEvuaJaFttMh@E>4eGhCe#FWbdv{N}C8JW^f{fVSA$?ALb(4DA)-+d5jzd zu^7#+G~MdXG4`G~(s8>T%0yg;`1iv~efoP~`=oj}X>y+ma5q49dPKsCJj^LDY9+Ff@;!1FP1g&h_h5&> z?bCAQ>c9Y6t~90+F_#cP3j}e0xjDRWiF-Ts70YF~Int2k{$e+%0eH<9ln1H^P;^}@W z9}zsCxL)@f-;5-GU>_E6r~Anm=w4$%b8hP*dGMoW9*ZKF-E=VX!XAi1;3*=)*mS^a zhl^-$eGYC<&^8{9A#Oe&wN>Fb7>_kfWHtTmP67s}AUM!<##puY8g}4-?aLM8W|(wF zr{_I6y^vT3aw%3nD_O;Br>-3C1MN24&Jrayt#g5hpsy;mi*EN^;v-j=xJ!Pd)Sdom zxbH^mvO1?#=WViGrDfmsbLS?>@Xkul?vpRH<6mwh;&i@w!^CF zDwNCCIIBBaxZ}wU{guoJ`V*lam#z*Q7Z+BtA8`)eWPaDH;Hy***b5-@{O3yrVHgf$ z#Bb4eg{X*-4~|M0KtKZ9{~+B7oTS%yi-RWO#1tS4SJvNus7zPr{h_5W^OR2~)AX=T z7g>@st@~+rNWU;L_^j=P1S4_wgM}8!v%8BjYZ#9ZpR0Qg#0ef-IZ868dxG+v^)L>d z)p91&!|h4X1|aa#r4+MI#GhH$!}&r}w4e$sp0W(Wq!T`k{_=zB*5ZIwD^?7 z7T6iA(~#YE2NgkEOobq%);TnpEHh_W-1CKK?|3br{@u+<)UBf>x9qK))kLGXl8G+5 z>=bCGe@t1RC6|5Qf~DU_Vo_vD5c8N|C znuv&qR031UL+M7&8s_cgrD!XEgF?+0x9?Ce+0G+}{c(KMxWr^EEU=z!0r!a(b7h8? zvuQL+h4mMNIz?-LOmXRh8aG{7yMmN0X0tXi*XU{>0Gd-Us7vpMaa3X`Y;$ zmvFc*VrXiLqbPr-fu3x=!Mqn{20J!RpgP5H6jcZ~#^k(~YG;5O41(LUFyuQ$c|jx^ zl6x<@&aTB|llUXa7JNP|N~Auby}dn0rD7g`KI5tduCa%K*|=63+7q{X^bA$d^}K&1 zzwTk6OKrKDdiLK>u1Ffg?!gJ7Y?Qd%6nc5rV)|)2XeN-1n?lT3i2?<|XXj5`haWFb zG2M07jkbpq*)^hT*W&7`PMO;|bKpRt>6llCvp4f6pz?;t87||!SV5x0@Ludnx@Q3L!%Z+`<0aBMY{%D9DYZ2 z?c5bInaB)bZLgh!n*#UO?x$FOyrx1PfB%55I{)51xBy@6P8s?tc!*F)KUPC(3S`lq z&m!wcXqk0k1$+Gj$kCUl7g=L<0g3Nv?+lMmBsBYIqDMeAEA z(cE~%B+TlcV88?Mq;tLAL5_73rjJ8-ol@W6u&Y2^Rkh358PR}nE*JR?`-Jp&lij5= zs09*nX{W`w>4MZ7^F;^xQe?o%;Dh`r;k?UwIs8V%TM2Lx>Yrd&>>(0-dUs_3fz5(jSx~7 z>`}k0)NF#|_*2^AhobCf7{+mc%Ln8IO`(#)S(qpevGAUmg znu;z=10D;iOICw7y6=pXUsqQcMh&lwX~Kc9<8Oh_R$eB@wnRwzn zkEcb<_J`vP$4UGUh2ju0;!&nKJ}y%@6#G#Yx;revR@Pyc^PKZNqCg%4Z>0cYqCXw@)jI3#WlVFP`1v-c5@4y)wQj)pvLZd(LkivGqgXr~U zyHT~=$0TBv6z*S7G^D}*!2;naqKvMS&L9i;5OjR-B;7Y(@^+Mei#ai0;(>{z^leAL z^L8XaN#?)ph{AI3^cP0l2zg870>Rb*65LP-?~$I6Ew zEdKYGRDUna-zWa(!TEHfe#p=xw~?H1!Ueg+Ts=p7|fAgAOz=45sryR`QeoFZsIhGywM${dIAUkmsL zZu0lVA}7s*gZP99J|?2Qp;E(O?Q>D%3QJw#K%hJHTaxAPW0gEd=r6@cz*EQrvQZ+h zF#mfN;3A~opmP3t`hQO+C&+hqJLGE3n|R~BXN|f%|D9Xw1?J6?4tVzu&c2 z*3D2(!?#yk5<4Nv8Vd^AV#)sX99wK-B)gz?kUWgWB%{;+`K|x`P56hHFO*KQyvO^g zE1UI1MhxN+-7NkH0!(!Wj!`}VzXthw-FlmPpZe$@+t5Ftu#NvY{J3`WILdAu z2;(v_kzi0kYI0Egj6R1VgE1pBdkRaWw&Fyctg^NF^2!V3n^QuZm|D(q^lv+veuVBtb(o4%5-lzfUBRcoi^^=Ksff% znE9xj?Pvx8Q*L+|>^tmRuv?hh(CagkiWpc}JQ++Gu}XhmS_s2lITpsxI{(Y=|M{p{ z!lasw<@txBS^}8jCpsa$TLmlctY0v`v zBMN6I%P2&-V``aW8~{y8BqQDW>sbGLDL3K$9?{AfQyHB+g9xiDf1`sCvk zwD%%dc0}xQlBJGXjt=EY1aj|>YoKxUQVUf#2m(IaJPQP1>UAfRb3yWT49~J?G>JkC zrwb`jaWAz2?SVt8!mQfojU!7k;oL6g=r2p_M2dTt$2{1t*C+s3LVk!$#P|D9t<7>q zL#x4=Jd3fG-Q`TEJ#@+j8-kLQg{4z)QOfP~h=6gb+2uG)Md*M6wi_EFOY)zCA=O92 zoqV9yYIK4Z&1~6LQPfvf$i-L!b0f3MJU2rOCBmkC?j=$ z;bwBs^d6qnX|kN>(J0Xr+5FydptS4LRY9SU*D3$$a$9sv465?(22eWw(P~B1_+S-6 zhc&p_7RlUiSlgGE^EnA(p~}RKJidBnb(Q$+!ykh8rA$l{lZsikzs;`W-fzN9f6 zs5EI~2!@R>VJp;g*wgv)1q+>=m?K5KWf;s@()maMcJY8C4*-y5yoiRhu?n>ybfsCg2EV!D-deW-%ME z+VqG_(sLM@67O=69uREzx6k8355{i`ZYURz->2m()0j` zLmaY7tDV(>&m;nF{=vKjEyn==_u3l$+@Ie|x5vS`4W%p1fsvXndIN1mw)cxpGphfl zP5$kGh!SxqxS#uuVEa`^%DUcJNQY8#))vf-d5_eKvE%<;Zr6_oJbK zZgP$=Ui%S+7X5mz?L}ntSRD-)H^h(^FO}NVS)7>tCluV$4{`YShCz;W)1tPvETwCW zkurEw0nbl>g1~Es=yZu9Qf@fTOkakGurS!g?qH~kh1hV$05PxhElY$R>jXsZhy)L~X2h53NHJJ4%0OnK< z2ZfG=XNh4dicJe#g-_VvBXXj2E-uHjaBKee7iwCjfs>S&p^K$G9`&yGbPxgl!t(lj zBXT4u=s=#;IZy>C`1H!U?l&GEpM3oj+Q^$kfRA6;96%!E1rGxQlbhl68&=s(6~{FG z+xXXSgj(9#Uw;`&q4EVqJJ~yaz0M1+PEQZpr(DqdE%Rx{=zEy0ZMmeaE$q|tvwnmV z$CN%V&LbOgML@qmP{Ru94{;(zdPZO zYMGM#In`2jpA+-WanenE&6B{3e{4d00 zIgLwW7ewmc=CPrMy&rdz5#27P`(z*$vZUTy&NpfY)?`XvNE6A>;Y#04H(YXiZc-ed zY;W~L;Saz=)JFIgYXfEuBw}yDL9cc)Ge0LJVLgWVK)?NY#4G(fv!QzOTVMc(vOJx0 z0dlMVe|V*kgAK!B3W+L7&i>T0_<1s4Hh`E&P{D0hxlE0iG8|h)ACt{kD!NsBQFMxf zqx2DZSxcK7TRZ!+xY20h`>f^P#_U*J^%_0)f4DTA7v=DrLM{8&T3zL*D2>Jzu>#M8G= zk;hm1y(hLe9t)awPco!o8XavsA(|%C!U=5D%IQujdZX>FiZ= zhhYaaKJ!D2cOy{|hm|4(hb2{ykB`@nj)IksS~_geA_xdqDkOw%F=@*U&%npY8|@p| zB%FTI?zs_YW`CtY`X67ew*njTzjC9POxStK{bRNUQoSA62t2-yK}O6=D8G4eUwvZy z=~8fa^* zQ=3?13i`j3#=jonJi=Fo8o16XQEw2Cinm}lKXBKjjDY!;Z_xltsA|#M(DCI>np#p^ z;|-A@d@IzL*2cjlPPx^s4kZeS0H;mV^+jC1perHtuO;WR@aucTK=~`T`;UUZ7&q)* zCb5neT~NJWUXCGzgnW*dUBL23(f()Qo)Q0@%%9kKR?o#KX) z2BJ%dC^7SLXnQug{W_)2_WEJO^~3aHZ6Wi58$rAGc#lpeC26$L@ z_EynM-^Zh(@@9`$Z-!w#^&TIB7P}LPc^;0w0E+W_>4aD^aeK@8N>SSRYOj3v`?dHZ zF58<X7soEqqR~SAKK3Whk0Xq!2uQy zPLa5}h|9XS@H*wITTf%;e7zOSi&`uCQJp2s(hVVh1pS=#pT?b{IsKhRS@>=X-hyVk zBV>kq7c3^-rl=*CvyHO&A}0uYKF@T4zBUW4KTm$-eLyRGr6C+9nz+E74#KYGC)EGkb%goB_5SXNCFxA ze&iT0O=7+JrMFyJQ?*tH;yOg!-e}KPTjhJ}WZlr2tS$3YRyCnJ@R#oIW!X1O(iFe8 zt*-{az#=0nUb^MjOCA`A$9zzd_#pS+xcyeL%tJs_N&sf|RtR=SzZqWW>(2pr;8nLL zqxQ$K!@zHkK)Tob05QaH)v-nEWDAa^|F#U>q{)p7isCKMC^K==s`rEz=@3~Tnn|86 zisVTD|JeG*a)_hFnJaF&cG5Z0gXT+t49{9)%; zu9HZwl1ZX&0-St!OUx-3l^oAbZpgIZ5$uzh^RCT&g-_MrD7Sw9dZSjR<2hg)GjMmY z)zz{ZpJCeh2ngU2IiYXLLe;g~98mBl@*vMPI5Ag2iBd(e4R!U^-IcNV_C!?_uJOa1 zc84%fm-f3OaZ2+)&IVOdYfxZYQ(25;%kTMau2gbrD;+Qg07&Z<31)dacC_*M)|R)x z_MohlJ09-UZNlsFhzIgd-}AcxfP&41{Gs2$+7h{sR~!ZD&VTrVzq3U_OhF(=2U%kp zA=m_VBvxW=$UA3^r?8^f|3LVv=4GW$Fu7@)DoN@5Eq|WIXM#@*F-lz)V6G024x@&L zt7qh>6}hNetx{7`(9!V-ZV=>WCj&$fT0ZA%qOz3+1T;s-xj$PafV}NTPG@{n zy~}_T!|XfvtR+%Qr_sqp0|7Uk0e z)oq_GG?**#%kIAEBQABpQU-vs_(D`V-cF_q_tSN)hR_dO+_uRp@Ld zYJTqjhYR>&6vdz*pL22PCqe6IIPeprCRei%bHBxUG>59sUQd%+%F?~+e{#-OVC3gD zH4pWgzyP`WJkDrw2~#}!YpzabhRHS);N=>?7<#OOAhUY?TfGYO-qvU+#H6i_)A0}H zsAhvHQ;E+XB8iA}Wj$;F4S3m^@dDtVEQQ;VI8Y%)d8^V)$0U_5&xB5d0tPOy1H6iM zL&C4DNB%iiwvbm_A!YogXntsT*gocPBy-VBvWe9!ia|~O@qSi7z0x83T$&0&_C$l4 zTH=u38h(Yx!TSP-CJ_ypLWn_AX)$Y%CwbltfYn3-_OPj6*wnP^F07)$ys&D-%A0GePEXIWn44JsuX8e6){KHRJ-trTHPCn%>C z6PcF9X5vq{)lqu_+4HV0mG5M^GtDo_%oYLMggu+k1kml|GpVZm9W1qQ&9r1m z7A5mUXfEQjr5bYc(G2x%dY2fQEW1{pn)A-z&J<%l30%B6ZCbnPJm_hW8~hI*`8UM{ z4;73HN#=`n(in;|B-U>Z^v*~naF$k9KsQ^ogrJg7#wCktSC=65G+H~?TN~|7EX>0# z$|OrlPL2*|HX;e&AmuV&2)6N0O-+$4CO;Pk92)O{43D_zSDv>gGBEEvrbRk`JiY1Y zs9PV7&|Z9yokF4cV$1EUiY=SJXbR7q z<_ggWV3l<(;eRqHK|Q(JhoHwy)I<|^H{ZO|R|N&Yb8#I(Z=AC7G)@P#PN` zIzt-$g8GUJPnMDh&YmN-g^`5$d$jltf!N>J>-9ze=rrcYe?c)XQgp3<@S|O2<)8;O zIHh~!t7BHp5#Ry@z(PnBUl~CbOL=)Z2^196#-JbPxa;}UJm)weRxZeoOIuhR-G456 zKUEvO>&1=m0p?Tn>*7*hs5h~R(L>lF=Tg})y1adE1U zh}E!UpBR;WgO|)~489$@TaoF~FU>Sr^z_Ui%|&~{ph**kmYnB$%9oB}A@i2W1{B)q z?*ZRQJVFRLtcpF5JRS(Q%~>IX4OK8kx{r8nI%-?LEfw!PU4gd|6GS8w3h>Q2zK5a- zJf{z~AFZE`#}4L6M5ecthJcv9kC&t~+AL^FHU!P_q=GtD-ob0~LeSyC(BWh3(71Up zSYIUu=|T})(kCypQ%FseK_*kL1?YX0iVYV}y=d_@>{L&TY5;c|L9P8jaGINB{RJ>OaX zj;McgFoA~5(3;L*SYq>m9-^oQI_=SR{c{lHbUE)%FEPte~u%mO_`#C7|RpNb5Eue6bn@$ydpps3>#;PSNI%+;sIvc=U)tw)#HJu-?3J2*N%#^@NNWii6aX#|8w+%jX zn~>k{`5o-7`;LoH`@bV10(3?sG-H>&w$)4yg4#nLfoJW^zSE9-diQ{gW7nf`$5UMO zYCWVqf8OU^4U4`L88uzs8wY^J5_Qxz7>++`wply1QMo*G4v1b2lSs`wIulCpxV>q= zDoP7XgAUL?AJ%!>DVHMd#z*XUvfN+R3Rk(&j&kS&P-N?awS=@J34s8#@5{Z%`*XZn zTrCev5*Ce$|HusGW~O?FBN%ulxau$1OyU)9APVE_HxF&&&vV0e!*RoP!*laAq~<&I z-|P18*a~8MJy{WvSe)kv2%PTMybCR>c(Y}zJ$sc{DnzS5ISp<3OpV!R3bpH!#Fqn1 zl{`6IdaYi-#eh9F#7mRt;mOx z=L1}2IyKs??;-LPJEKWj7_G>THY(IgA|fK#2<|HN)ehlB4L`29`AP2HxdHY?8Uq(L z_V9eTrDdgp78|En=Wr$9e#Xv=7NW^@%NJXLF!ISYK{R=aArr4$L7Z; z4NVTB<^RN)zm`R?1|#Y{JTUJVJ5O~T_{Z^CHf zn9CSg06eaLF8yb=n8j2f;rgQrkX3zOzq8e``@RSz;BoP0q5gY7OQS8VYuYWZNbyd% za{CwUIK@0erZ^5%E9P>hK1p}G~LnDOFhS zC|KLuD2h6-``nQW8`@1+%9r0T-S?|-8z1^Le12!pib+M@haLj;PiP?Z#)$g!f4O%U z@7sUq{(g8p3Q>_ypFa5!Q-Ik4C(u}ynR`mR69S1lKS8PsTA#N_f7I}ZTXRQMtGu+Sy5vCI9^8!8M;baXGk ziq@q-of$qTe0Nb`QKU?xLQqgn2AG;|d0itE0zAWAM!45H)(wi}O#Heh-bVln(TLbb zZoIr>+58qY{ENNHN+-v6zt+}@9Ju-!$Z~_$!KJcXULKWM=k*Swt#7{09Ra< z>_1=n|As|?Vz`G_pGTyqj!-pDVfz*PL4w_ACa#!aV_Lh-MQge;e5Li>B5QwnHFc(E zxjc}+r6R&rnx8;6H0O&hu%_MK+{~+=?WVwI?tZvzXFR{yRuc9BO4XVRth|xsvCCqQ z63R3uYyF-c^d@8(jn4q?po{i08vrC8VUH(X^2!QHwGfn{xPAAY9=#7IY(Yz8Arr~N z=4D-cMtJyI+24BMk%RjEPQ*p+*r)nkK) zfCr$wYA-ODg;AbbQ-Jsxd#^Sb$QZe*j3B#3S-(%CutR+0#macp082j_4c>is$9zdzTSFAy=GIYVfnyWESxYpAn;l9Mn(QaWs zom5n>vcUePS`O0(&wgZ{M(sSpjX94-%nvo&#oQWwR8w(ebAR||+i2KD$$8OvGWQBb zL>p)-Ljo9tyl-Z-Oy@Hh;!D*HidOVjDuO|Edds*_!;xM?;ML0FSjS_V%&|4vUpG!Z+tTsuxMu)j!KW)q(Ir0i&zVSndh>TZYe{?3=Cc zXwSDt3KxK{78+;HUgR>_y*OHIM$qpQP&J=Y`eVk^H5@Y4Ny ziY1quuQW);;cT$PMlLtr*Khoi`y-@7o6{ER`N5pOMeRADT*58up55}3L~BF1<>D;8 z*a1#>A#F^{_Z9XN4#lRu>0$3hJ3baFk0Cn5ogv?WO>tk&(ianq29Lh4#+##8o(3Cp z(ZjT4eVVvPpzz=iOk_-8ZjArg2c#<)Q3(GX$t3*%{qr%NT5ggRd*6!;jjnKvRW7>n z5{KQ&(Z)tRei*+qAv>wQH)j}kZhItEsh4Jk^(b7~NHRecqdOjUT$@@#LPoBLp6Vj+ zTJjBeidY()OcX<{khh6@v*i074D?jM zt;~u4qa@6=#$bvs#ood9D0Ro z?C6Br|ACHw#mL`?!19u^qi4WbA25V&9{BTN;Jpn>3m4bdOgBp8cZvm|C`RO4MjpdzAvf;oKzJ7&9fV-#q&AV}|C zVE%jAcRi??h~Ad0!r-exw-D>QDfVVVrL!f+?V6bCqDx*HrE#DVFAE4(?QgGtZYl`U zMK?pU*0J`qPPcBiULEsId3aA;f3zrP1T+bZK>iLSZQ*I(G_Ds(KQVf))ZsCn?^CIr-HmMi7^Ep{d$aKYqw6N3-;`0&Iq!83kd`SOSLS@5eVzHMmv75Rs&{3<2 zVEDW(AqLSOpgpcf2p@&F)3*M+&cESN6&^=jrm{eUpVA;7ss7OA-sA#Ym=avbV^3|keV1EHuPcIY`tz+M#vM$qI5{sK?+=$W z<-UMEz>A_m9uppu98(iL8i-qOWOq=%KYUk0e=wUVatGmivY$k~2|8DMbF+pz7d#GZEC!a2^K`GN97(OKC z##*wDD2x_*K(J4?%)7oVS%BH?x&yKL(Y%lGG>5@s_IU_?*e{Ly-NE^4j9=pvQvCV1 zSzG-Ll)m48P#=g03jCP1Hr9Al@VUmL3!jVy2}(5tq8v$^q(#1DyeG<}?Uct2>U-Rf zdbYE^61kWc@W~+$AEN2Wq<*C;1GJ^{4?{(S$XAC6RSSl`_kTY6uUHTTkKXWOx1@?$ zX9klt&X*Kj0v;q?`xkjPQy0`xJR2t^fA^yhaJ~v!km?>%8+i5x$d6;#zG8D=qgf3r zVxh46zWQG+jZ3S>e#76wLgk-8@{~cXB#6R5&qG(i8KSB86IY~Nbb#SJgy{QrM$1eal!5b(k=VZ1rh zE~80Khx9VKR|VUGy%yC3z0{{8UZ#6c}^w|5<21P|>~Tibo}rKLO8i23r9PMpkon`z8NDslHjAm0lT+w0x3 zmpKWfXA2r~IcyCL;?w|&)3%o+Dm*L~Dc+W#raozttsvuXZ&6=J0g_v;PB4k9K_=*QpIiWvWWlqJ8wpW6DRQ$K31?;;79+&XuIQ*&xRYlQ!^u}1uAkOQM>Js#oxbJ7Y-rdczf3kCi5VkXD6t7 z-B*%b@V_Vi4!f9;K(a>d6APlEB6{VXf)ZO61Jkp9r0$%48zY$Buk8sG5ho=jWz6E^ zXKsIPBpOmJ36CtazT3CASZGojncng}rj;v!XJ8>-*S5?}RC z;JZipVXW<<3q;;F_JH$2Ey{n1<9{OzkQj`ioD|fnVI;OkBUTIuYe4CNu%Ipk6f`uG z*}YrM0Y5slzyl^AEH#v26%OAJa3agZzvLhCxn08W-@CD{m`_3za-4j!KWMGbR4VV> zTREwQXIOep4^wtgEnS8=v1}g8+?6n0H9!Y!-r0R6D-{|eS9iZpl;k02+k0)^O-h#{+IrfP@XF{$#29Q71va^~ND(4B<@S`6iq|;%Q1Q zx&CM&f8Pa-05#$+!`!oEzCvtTV`zPF6Bob}6iqYw33Gq%SKVfy2g+}!LLz~D3tR*Z zXMGXD!~gJ)-Z|dDRVB5_J4m|$?+v){!*ZOvesba6Z{Lu1x~y+tD;Fyhf2}+5j*X?j z8BOtmy8E$N-~Qa|$sPT*QWNmKo?<^fLH~?6i#6FSenII>p;`64TZ=;1Z1zC1&42bf zX?sLw*?r2pKjLwE`;OlfFwB12vkzrDE?&ob*xsFMaj*a82oMamMuUk$adK!_`6Jy^ zX9kQJY9>V7E}Cr1E%p+*ym-!|R^Mai1efV+FS@v-kZzgS~)8U6Ml2P zv453J6!FK_v)9k+IgrFIdFSJ!()2qn56mZ5hpv?L{#SxXIklFEUjwdz6Jm2;Jyc9T zkTmK&272}@7K;aV38p~$Ef@Askyt9JE*89#t7|qeM^=|$`Azjnfnv5`@Nr_#9K(A~ zbhNak2#!gv)!OFW?N+L@0H=*#K|rs$=?2Vw1bg{dKAi3TPI^eK+W&c8QmTPZFVcnl8QHi-COu%W`Qoh`C4MuP)Cu4Be*A5M? zCy=8l?S7d$5kQ6MQ_gQda&ZUz+m!cimv7qc^_T%S(v;?(370J8GxAr1&V*B*_yTKT zG?NJT8i7l7Q1#WQsDd>wZlR^YHsXe3FO~88%@c)sy*f6UVijax%HG@;t@o_(M{I8+tbyp zS_i)Qj-Sfvp$9LgthcX|>Xk6V6&EAQdJa_#$X)K??l+RfS`}+Oe@x-WK-%-mM+&rT z(ueR?hlG`ucG(vU&zEM{R~0_(WA%QwhaBOIcWgF=F~jXUB@d!-`lFRd($7a- z2r8Hzpy?~M z@?8dS;NV=N61Cf$sJ_jXggA%B7ck|)?YFz0v=wa-f#R2y^1SrQzg1*)*SLE%vz*#c zeqffC{kO%U3)sGYtvI%JoV66usN2o4mfKk`uG90Qa}V9B=L=s1F<;2o*r&(mhm+gO zNd+doE|?SnPwlHDUT5alxy3I)ot1i%9SzVwN|_Js=6Ja~m4_kCMPEz#$I${?6mQLx z2T+LfiLN$j=A&lAC+u)#>@D;Y_*34PQ?f?U&t|~fKr18PgoK0zM@1Tn z@4VlbdkRLUY@dmow4Z&ytNZr6$}aD=&H4=4mRP<2fv6epdTR3nkBmVU;D*I3SJQU1 zp_~H02(+Ml$^`Bh0efO0$K%$KQzt?!>oeLktHn?+B(;neG&@xU(X#0~+74N7St!qtBhXzgWx;THapQ{~@1(il>WnsS6Q0CllpyJyR z750PU-JpGeMrqa;I1!~3ZmjF>;rV$4Z2PR{*$%zEQkjFD@WK_^?P!vUHO8?*ka8k? zG3$hM7$(aSfy)jx zSZ-sajuL30&R)DxiG#C_)oWxj{XwDGYKwY_xZ-3@;|86k_q)az9vQJC%U*z7W?@O4 z(?VdO?E=HtqXpjxX{zV$p#LYz2ZvFK>V3{1jQ?-}4Ck3&Uf%9;*CCE-^JMMgmcC%L z_RoIqp;uC!*lai(OEKl8!_A|A5uX3;BC_|?Z2IJ6cs`s7u70CU`Ac8$;$%F30Pptx zq2T)s@hUJ$R!;FGR(9`Hj_a|S@9>_Otv&SHi~A&a&c*Nz{W5p%j;D$B7rU2Cg3(pZ zfL#xTaR*r%BPlce$nmr*HYbfa)7|$xB8W$%zfV*yC7e>x^;|r#c~KyK$_D z|Fv^0eg<$P&IfIe-rwB>w1!a1lkIG<*|grDqEV$GOB&|?$zn2Ez^$XB!^zFPv77FxDvV|n^Qi9=7xOC#`SRH4jQGQZ*2hglx?_9=;Y8&RYTqFW{JGjzd7i(&rOZwYrV^Z` z;7!0wcdEoJ(>D(jL#YI~r{u`q<$eyv`-HM@$2@4|1}{k?iH+wnZ-1*wM;C&;%oEJ~ z`{KAikl!n${!~rvMoX|t7Z=PRp~ZGqn~qA{ZW_WV@Gt5mpaJjsAM~xS&41imJ>=OM z{)8^@$PW?ec1(k&k4hU?PVmEo-X~Z_pz{gHXq(d>?lQo)3xE)%@ z{d~B&z*Rx^hkEX<(LHvM*s)UA+$8!LF|l z_ckn4p?ycYBLKHJZhQ;XZkWG8^5Z=dD)59LerY0_{c_bCew^Ors52LiU8iHt0};Uc zwH+lB$Qdr$No)#@%{AT2;oN4vD_-#ax}iRf_~pf;6V^R#%y;UvzFM?$d1|_X2~;yd zYj`Aw$yWE1AEe(~-F@nC1d~mNbC*q>_zl@Fu6KejAo(#$hMq`F)_*)j=(=2VGo0G> z!rmV9=gf$uswF%0FGp`;6nU-)&*E-e5P{N8-1#(|5hkfHN5PJV{nIzDn=xu1{6&7p z=6}=X0-?Yh#`G~8V*3boQ3ztrtsM7K8kN5Uoyi_y3^4XhUrBBg7mn_UfWJlrPZi+q z8I_pn>Fi%_n7`yorXf$ovX`2O>g)%-_cO_=@;B&i_FCz4pfcBYuQL2zQSVwQKckUc z(hgxLkDxrPZy6uV=i_ArbBo8;x=mN#*Al;l$oD6W*ZD!BL$U=xA;bZituEL=p)C^! zJq|0c(srTl9>s{8$AXNNa*rG78sbb25#LHm6xF!U@iFc4s+ zFSZ7Jec{lu1ihhdPrK2gfhk6(FSgS~Dk6Ym)%tL*QZn;nfduFo);{VdM0_@JB>{EQLgmw679yTSuST(MX7KuQ28=(8qv9C%Pces zOCx~^)lvhI?(x|&PkJHBd>%Gv%r3@i+8wCZ5g}1mNKR$m1B>0&cfBwW`=`B+ZniOB}D9s+&wBS}UTkyS?Dy zrs~imjwoCA(4qA|1QL(xClGH8k4KH-o9w@6|GJ0!giQ^d$=yn=g6@498|| zch}hrB~wvu?8y^)e&lvt{S4P+Kscu}vpv{urEL+7%R-47W~0PGUJlf6{P0Kgl>2r+ zhiSL6x?190>hBd-7Yfteh|OZfYGqqaF3w`-ZNO`N%FXH*AA#ukhoW3Adqr~oxen9m zis~^kRlJD4R5!g3n!mU;u4t@-^fsLr4l|R!7m0@awzH>EQnj>&T+e;RqOV$x=Tvu) z!P;u^t;4<52^`jLVda3inovjpo8Inzm=_Cf1{crffWX1e2<3NQJD5yVm)>2)k_Y|q zf3VvYH>H=i9*)OH%cB?lZL5>p&v{EC01Z?#SPv6ibD1SDzhNG^g&p{&BHqy`dtP@>>C=<|Iqslwo$S7aiY% z{LDTK=y0Us1wJQe&X)h-kU5DUDhH<%5HEk}zUffZIuURwegrZsb&l*<C`3OFeo%WM>7Dy;_Z35%^;?xK(m@qJh(>(=k%nv4JFwYUA}qt9G&7(bUd{bgN>Py1wyjD`3Z#E7v<5 zeHrtJu_-^qlL_aIl!>Q<1X~aJ#=O z3_+5qqAwf117^wp3@m7TrjUpzxEQsD+_5aDoqQh8mdFO~R6HO8n3oR#bL%rj0#S8S zzG^$7T_vN%UoQUPP*N+`ekVmDP=4EJROtD+D4XNds{JWIv+;)*-3Q>$z#tUMzwc$ub}aU{o3i8#?ee%TYqxFX5L@a3@1my`;31(e z3n*QFAQToBS=+o3rS?5q!;_chKJfd{_411PR&U`i9PDkSyuYKg39b`ucYXEVD$^SU zU0&4gRgfiDBMljnQD8 z#h-I#q=gOLU9XHaK}wP-0xw7D_VR@==mCwLNdNw)+*0%Q_FPG|86_&ZJ3O6XGq`p^ z9p#B&t(l~ua93PFVSyA==nkZ!X2WK6> z{d60!BZ>0UyJ|zx1-+-W@!HxVG+s}!X+pS|?v%;*$$3-e>9mv+ZWBm_5B3uXo3c)A zMhWuI#C`@l$iGiFaV0tK4fb%`{xIge>|;5h?m>+VNJX#Yg_q@q7G;^wZ=4Fa6N94p z;BLHJn{T2@jE#5~TV!g7$jttsbYlCGVpV#OfNIr1cbbrd0mB$|p$-mo&IgG1@%*Y& z!I(m%+8CrlmEWdmOLW?ahY}dnR(#!*8x8s+Zuhbyf9?{ZkV}a{CFNj|IIpz1^8hp5 z0z97X#n64+?Cx*RHgC`RNrX-$WAs20>R|5uM(2yX^NdZ3sVR}F8UQb@rGQlD`ZaIy zI1rM9v8aK@6X=BO7N4|CZGoI!2r9~1^;}FLCGi3H}9+%Hy0DWNo;nC?S`!&_6gla*GX zu6Xw=vI;v?vspDA_uQRSMm?yumuJ^F6HnVr2?`Qd>YZv6Fs#(r*=E0lD_YWiwV#bL z=R0mY$s@T9!ADc-8~g!hmk$>$)^tY{1O4v3$p}j(vUffe;e;GM4zag9&gVJIKonkS zaSkalcxr!n4uyn z@peFd$NhFF{-aV_mUy$-Aluomb>d$c>D0%1lMefNc=o_kU}r_FjAza+LejrJKI(H7 zB8rHeDtfx?5}0rCue}^J%sTrH$WU9PUXm1uH|MefYcN-3ge19h?qZapcbwkheBom& zo6Ih^>{kE;tRCw$g_w>dic3-B7JbY%Y+%wDU#;`V>5DHtJ^dhI;w;xqStSX@TMe_m z_z`lh9J60Of|IQF25~Skd17Uo_M>e@21M_Gx?;aj4uvd-r1;yGBUVZf*$Hn`Sr?^K zoGGHq8tQ#xG`VRj+Q-m}oKF!|4Hu^b`|(c@&dj*I149pSvlgOoNceJ-cI49}VIwkC zx69{8*4GPqZd~n1?C%~4Me^9Y1E6ITnH5x~=$A1;IVPn06FaJUWWy@B zGnRU$u$a|s(rs`7RT*$qX6?!YlNoxw5gGkw3GH^hD@ueaw}_K$?|AD~oR6-*JyL$> zVC|>6!sx@ zy1(IEARq1pl(c6+p;jyHqP5a<2{3nI*c9tY%+P~d<(d0f7v3vr-fC8BEA>iU@fess zU!f()wi?rES6|E`5G}2%!HkKBd|E1jFx*kY;SoS^7psbzr8{`v=QN`j7C~XpoS5pQ zAo~v&VEG!f(qCGH^lv_opsiI8e(fDV;dDLo2Wl8in<|8De;5L+r!s-{G5PoXIk@FU zv;^`ym3L^JH^gh#`Kw*IPC`x|Q{gHAuLR>j)AhZ}bYMyF2fJvw0Yz&_Qdg%oWu`HQ z3lU4Mngjkiz9eY%9T#yM51QW}xv~S4`e0jYdY9X8^rK_p(+D~erq_B+7|$jNn)O0p zb5w_WCS}~Amx9obQ$thQI=+hiRgxPLUOc2{<-)4}QkpoS)QAI(emMK({&)+6i3K%Z zWdt1@Qe!sRpTxtN?wuk3_l;O@u9mm!Y3@bcpBD2|&j0sErERb}R8rjcT9*7(bDXmq`VI!V1^~`-j4IV9-^8N-<76 zy;f06h7@TGD|rAYeJ;>OT5ebGJxaVYs^t4|ig@B+;0r(n>&B!^x!#`YS*)~ZU}VOR zlI>C|vKjOt0}Z@1CRvL-q$KmOIP{fE)S2u@rJBwZ9n%!jW(@~oIwy#w0W9v<2JoZy z&+2+1Krq5UGjP{rILfJa0+4#4For{)!5zpzs_f|kEHKFP(>3xT_-d(tDZ9n2)7xS* zv^~rP(<6*VW&(_ryx&Zjg?buGY7U`v9U`f3bDB zK16UCxDb~ExCX`g?^@XV-aYiKh0a*P9QBf;KaN_GI;LVym!dKhl9(xhwe^`P{p!o1 z2Am#71mhJtTJ4qw#HX<$l@C)T8dxP(i*=>v8~@=$mPX)efTd?CuUo;^cxm?)V<^;T*k{4gH?6z9hfk^MbDLbpUqde>3FB+ez8 zNay{H;?P-x%MFpoBBvt8FNa^Lqw}V>B_nU&g0=8V+vx(p#xH$%Gr4PQf*M?Qb?qeGIP>u70qHGv^A)V_tD%fNbJB;Fsj?tM3b{Aq;^Quk|{K2U)U3I$b{K-Gu>AWAYm10e` zu_SXp&g}f2?dmzRf#ox`m*cyhRE*8_Y7fGc%f@B9)=O!RI%f{ID_auld#I(Ncwh70 z&mn>yjP{Vkqqo>rwk)K#g=kBI*lkl6eQ7xt$Y<1?ZBGFKV*N*8TC7 zS=4Rlcr4ewxW8_HDeVN~L*2M{_vPCl$!x!e2T{Q=?-^17XVnBq)?xYl@sVQv@PaD< z*e~V;7wh!29!TZAO&EeeCMf`USBdJZ+5BHZLG!hmW_ z8j*xg5Ial6`vWQV=pORmp4zI>F^MeGwGMAm@8Md4D_L;5K)EE9E0$GQ{Kv1f-SwTZL2SI*h*U96UMER(5jUoFASWOW8$X5Z?CMQKwL+T5^tcu zi|qD>;>K}QbM7ML2#|Pu#fEwSNk$+qpR9=e=VaT;m8e$N8=qMWEBzdq1k^s_{C@VEnsG4eb~sc_ zAE>?&j_MBw_pm>VKtH1)WNQpQtbTvQyNsKO;Ut!6wjsRQ;c9sRgN!c)tyOu*! zNoy5PUrGuoXwo|}_R>T7OsU}8n10-mr3WX-(2;_VR9J>QeyY?Sr+)DyXK{N*EbgdL z06*L&2iWUWsGmCU8g2RK%XYo?dy{pKZt72We`6KN#@JhcDNoZ*;oF~1;Aak87H03% zYtK%l4y1}K2MS{67?0EBiQ4TldIqHg3nA7kn<|-Sd|$OJA#{YR3B5Xrw<@-i#cx3UO3kmb z(i;~#r3PHr3oAw90@HzT21Emg0HY}Xj)G^z01Id=qdT8yt9~|O^vHD1iQ{R5C)3XR zhKI*>I*rdgv7d@BQAI3^zlCun*AOEL{(5?#bBe^F$CeMJ!CH(O{z7mvSO>H761LXX zMm6U&G&=ahZZ6jE7QOH4M@L5}R$48WF4@PHO6f1`oueaS)ZRQ@t@ad@Wk#XiXI`0} zo=&;iPt{}^wdWx}+m)L?3O_-sEG>7)%qq96pr<0Y&3nSUN(Iz1FCrm*wV7Nzg$aXv ziM%Ao9|^noE%(*r^;jqJrrZ}kFy9%szx?q#7sJNsTIqgAPl?oBs&BUR?1T&m3b4E6 zcWbJ-besW|Vd?v}aC_`FslW2@X?2pg4P}w?HRr9(J0$&Xf%d|?H)neZxoe^4!dJ`# z7izRoeWLzeT3J=>IAK~qDLb7h26mm#tH;CAs8Gr{6>@#mDD^OQIL45SJ*?yEV0L<+ z-cnHDNK?y}548q;B_KrzJdgYx@B3Ce?P%$Sk8^KB&toh&$NDRCFQiR>5< z{w}$mEYwU4YK#-Iq7a(Wf&_UOaUsyQA*3fa|9v;b*6(QOuuN&p+lgG6TR;pI!u(j& zcA1w0SJEn<5u?kNx~N{feq`>X6=Mp59BBiMC2{)+Oh_L|vPH{_8 z5gOH1q8%jWhrivK4>aVy2tb#iu*x~KniJ0ozWSB-r=3gqtjN~1B$T*_=pwJnwugzg zyr#C$pRdP3B&&;)HYLnvYJ~R&aHZ4)xyD=gDNmR|7<1^PohOp1h#bf|8&rnOfgQ(VL z%lG4RudAG5JFL(5B~?(4dE7q2 zr=yW)n8*km&m;CwQg z6e$}07;SJt^1I1`s-VBZpNx)KmMHkp9EbFw=k z{*>IhB<3#u9{!bkngz4?B9IFHRVU!f_6jF)U3az7MS}Egg&yidRO5dJ(z1G_Cql@rvz**77kx3DL_` zq0;`DwF^h`wX@dB;vymF?mhB{Pjwa=Q90R`$P^uCCE1KSAI~T&`yB#$ba}uiA`I3< ztvr7^hg?J?>tcCx@$40If8`Y>=JG1+>_!pST_WarxTsCK^3d|_T-8L+NtmD|MT8?7 zY;;~>!YQT5_KQ<1oanoRGH5oSBeMzrh~I1|XOmN6xXt3A4_2Nb%rg5mcImnj z^X6aU>8nWdYLl!LBW|*82}eu7DA(fh)UWmPWCl$^bDiZ!Rx?7jKa^q0HEL-W^5wAy zCg=D|sfk}Ip)S9)t(;Mu?s%IIbQM|Ip?%Y88acGu-63GF*P6RwoC)qhfjTQy`Mq{4 zuDK%vT+T0cx>;3fVSoz^Xw(2Pz=^4M8AHi5*nfmyqziB=8Pp}Ap)xsQF(u?@3x!J5 zR}+lv%w@EEUQ!<61Z>h6gC!h(Y3(3dDVRx_SnYh|XhF;fmpv{i{n$#uaa(x z3V?U2!>QS=k>D!Y4-^bI4A>b(y8u47<4SZoVI5uad;*n!P+=on=TUB#%Dev)CJ30O zx`l-uSqEffd0N`Z=>Tce7fDj?C&0XSC57n@U@cl$8(&xyLH(Fr?;c8>HFk?RM(haR zI$Iz&7c2p+MF^u-Q`O;J4ZT2RGVv^3yELnuZ?3Hq;Dr$b8ISzJb{il-aE%EDIqT#` zT3*U-r`_IeMq=-jFUDO2@BPCCh!7b_D&tA`$1>43(acJNZDRghV(t=?cYrQa7$S!fZ}3$l@_BYa9c z-wtij=yD%257PIG(`{~K97eD*y*yt2+WWw+zxwOOAjyyE2x!9`Zz<$78NdOF2ToSN zwN|i2OLX<>$H7^`3P@;fl<%YFD0fv!;vixFzI0neKVkd^{*)jWFYojPtgWq$!SK^J z?vabDDMPt!zd)tvO;s*fqF8hT!W(K{`ZdwAu5b*4K03>vpm%15Non?THOTkYBiTEX zI+6Rb_J!>5A@XZ3GrY$Jv@4pU>etd!mm1Ix>;<>6fQN*^H~5EWJY&8A{hhm3?<;Z! z^a@7>?-Ea0p*ka$XoDwm!xU!NkR|tVu^&EO!mk!9prcBW|Bw)R5b9rT{p30R{8eiu z7>2Gp{25bS`5fRJeGJ8B%d|QZYeDijbn0G!+~6%r`4B}%f!_xdAHqq#Wg({Vd_3RQ z1gQdv_u~avR}wBjLzfSMIf86{@H{`=V=xOd#(k=@QPQI-@*BKB)Y=xFub=^&eXOWa z+DeRD5`pFVP=+KB-~Wg%H|c!F`?itbBB3jW?6tpSVIZ0?s;sRVB*vWANP| zn(D_@I6L#ev<5-Wd&3YOvEDRoan2+o4hWUm?oSmW>TIlJOQ01&USTR2$c158_~nnW zqPTTp^L;gg9tmGuiSw>A?Es~C;>_t z;h@EG?N&t0xIE!V^)mn6WGd^U9+Ra8oACu;_tEwY5^WY(XQgUlNonn`rL7I!O3qcK zalojz8xCOBdOBZ_iUc69wXKD=7m%Y?>XQ!0HHq#5zx?|p`=tM=gGn(u}pI)|%Ij5KV; z?`Icnu4K}?*hx%F>|^0T#z+8!>)=6Dd?1P`OGJ_C0Iqq-(+7a^*ul$bj(KRrN&G(CJZhZu^z$oz+H|%iWiP*x#_m4CB1E` zVMzG;;`ahXZ?GpNQTk0R&YM!t`HDPKGSmLL)=eIz+_$-W{)2n!H52IY z=ChxqwH?sqZqE>+s8|jRHspr8_AaA<$do~^#Pl8L;=X9TEj4$2jJY#bL&dJ}M`>|( zix#`tyKF5k8>^Z=S}phyKRx@<;23iWY15gEOj|tn+6vv&o@An}9(|rXT~kioz4QqW zJxx+u2NZU#U|8LjBJ>1cFD9MlL0JXyc|H&|CTx!m QUD))_w?{La>P%AzN=UCO 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 I>zopr0I2_Dw*UYD literal 0 HcmV?d00001 diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/images/deep-research-loop-diagram.png b/02-use-cases/01-conversational-agents/deep-research-agent/images/deep-research-loop-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..58fd6787321d5139851d2a086f41513d3ba8d02a GIT binary patch literal 122187 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

    v)C!Ko!0m#U6~V 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≺`H^1B!zyw49oL&Kz&+-TzVmWpp7OjgYd^`yM8`4XP?wlK zs}ZN9@>_9&@bk7WH6IBQ){K|2PBoV!$Tut%-aq8m6{|LotXVB} z6YIhzVY&Ua#4Q7Y@@B*X4s+w1G4@kB!_AU?7lfiqwC^4GeW&ecnD9lXCH77EZA`g- z#rWxH$~d2#f=sWp40d=pi!CV3Wz1AeKOk7%0yAuh`s4FqXXw){981d{V4bA}f?rBV z#QNl$oIs4?BIOhi&+z=nI+Kn&oIexI=Pg4FGg(X>4^SajZ}~J^ZEE!a@m$5GFKw^? zWy^|Fj@g;#qXaBikpop2?9j6&pd#f8dy^thIsE%J?K z^2NrGP8A)dl|>j1Ijf<3WH|)EH@GS%o@|3Ym~8Q&7Tu5{qaDmjE#aWuOQ+CrCOmd+ z4%{3A9L356&*T7Y!>{0X6N=Oo1jkPv1}lKSAun*)9e0Cvb~M4WxhCGPr{9EgdS5}_ zTC^1!ZL^KPY;s7Y;JD2Qqx&gUFH>H72D_;$jHh_Gm5Jx?$fTlY1{kb#(f!EMLO0HE z-OXjoqA~k?IxWf^Kp1FlbU}PYq$;pcczF@h2u)JjdN#3sMS9HL=^q|a4N@Lz-R8oL zZn>tD$6T3QlvFGy)IOXnHs9>Dcb2nI*8G%^gQ*%WU6^L%oC)T!*#A;Tof^qL2Uzb{ zmpxa#L(P1fcR;y?GX4IEOlC)AyYQ@~BDWjewX{pn|fo+ysYa4 zDjx`eQPRBmPDbVO@?d(*ARFpt_Sbb8SOc1IZikQmZPVAKPvm-My_Lg& z&W?0_{)C+C;bx|!-hSiJX5|_IJ45*eG(6&!>>B;cnu|Zsh%)5YEpr;POnJ$SdA+O9 zHpZ1f)3S%_6qj=@|Dlfok%>LTy7thzYnEE7rP9XDON2a#v{MpB2uN#wb`^4jxP>fXB((*JxK@4HH0# zx6ubbE^gjr$(oAk^JDe!2)`IbulHA?&d$hLDK%M2y&W0#hYOCl)}{y$FX+qHVfQI`2l?Eko%J2wwi3Htef{UqwYIN|*N zf5um!mV}wO*^}=tfj{}Lq!6gi5CeRK5u2;G!N1=DHY}HGu0z=k&_{JN@Vz8>#uIvo znp`|0RI(b!9TL8==p5E!JRO?zwO$s{G?r&~sw?YH4w)^fG^%ig!Yit3#2}lR=OSnO z_^zT2m!}JLskQ6E`L_9%movtfRWE*h6ik=Vcs7?Q7^wbBvgD~zsGyuwW8fgRx_ge) zsM3!V`fcMNrP>RPcdwAA!6R_39^7F2{du*+MaZ$=7E*`<-)Q?|{628;R_dHMa}U@D zXM+^>fBt7Yx3iSf82X4|$~;lZYh22YlB!i{O^$+RIP$K1>9BVU(c3E_e>6X0E(1PU zJW8Qga39*Ov$Eg2t)i-8|NLrhP=}f$vrTFhgf4DVj2M!W^r(J0m86RP@FnYGso;qV zxAE-@I}tc9k5zAsW6n;{MzP#1Gj4xb2NwF+yEo=L3{E?fnILOoPHyh5Nf2H6<*CwnHBdT@edK6!_rzg_ zMO$9SA1Nkjo=JT@@iCDPqHTdA2pCwX$HLWEYcn3?crs zuwXxy)7EM7gMzAzqx)@f!H{h1%)#`*k;u-)b2IZe`_`lTEpaUKG9!l(Ql#au5TXr) zF80Lke3@cjHC+pWbtALpl125{Z z&VWD+i-&cGfQxxdkPw)nxhqtP4GC@OazPg9vdHPf^E}L6-LFM>^2dRq;$u8lGR9W% z%-m;h*t0SFzz@%(Vr36|)?9`WJ?a+NJpo_>1f5TI$5zZ_;gDCI9=BRv-xC#E>c>#P z$}==thDO}4EssF?o^W9ES?a!I;&Qt|a0lwryRRhQ3=2}iiru=}wG4?qh%1|FW@P)~ zwHxV<9ssrAU{gF~0@eSv6Q9Wb6+`a9Y(h5WA z1QCGrDqWd7bg>ef$P1xc8z(oIUqKRhSXNET{~q}+pChSg9LMtu8_IE>$v!67eRrcw zxG!$mNBO1?a!sclyIb{iSX#j{nr_x7^YWg_ZztGv@g;O+1D-XyloE17JM!44C)@Y3 zYRo~ujr;x}OC;p#g1}S|W>|JkP?vGe32<1=&l=Vl16TDqc}0D<<zr3|`4RYLxSq z0$-kx);Nw*Zy4IBBv~&pzh($^DY;{T&s~Bz``}q}L&;J^@nWAX-D-P5W>Xj;J#hX( z*tPbtB(^vI%(8GPoymGQi&S42m}~}UBhh$@7F3Ft9692BVb2PonhKuxb<6%5 zIFO))Q$usv*Cn*F3cj%;^-X>P*}Z{{zigjx771$G^0DgUz1YERcbQM$GOZ83&DY*A zlukE)Z_aDEWy|Qa-=3+)rKwId?O!RYev;5%3z|Tz5)wDjNyVdkx8P3Mx~NFHx1&4P z8^a&4Vp!Yn1+0Xr;ny#8O_y&KSk50_CK+HFTk4B^F=^&C!R$f`1=-|zQ67Rqij-60{w`W-PRWKTg~4O%!v3QWA7VYGnFYf zN!LJ~nr6@H9J)fJF+~H)u+^=k%p7%SCEWspcjIJ)7WkN4yE4mYb*DC9wnWGMXBJfK zyeZAP!*5*p;y}6#3niBR%-J8aXc){CQ(xraV0@(ECQG2OX6obeh!C}<0l8N#Yf3xX zJ6&9m=Mt_x9KgchBJ*t%>KGXNg>L<|O192uk%_1L;pS@wO>hQF;PVmUxgk7!Lmq)A zE&q?ItAL7f>)O&O-7QL~fb`HMpwfzTk4j04beEEfN=ORQ($d|{sH8LuDJ{(q|9SCx z@At1Yi-qIN%ZYvV+4(#-BORW!X6$sPo0M={-MZPK{fr{k-Z&^^_+zy#50$?CE*4`^ z$8KDd(+F}~;FM|eX(IJ}q)kJcvQET~XSm)H{ixSQT`&B?BUQoAIVN!!)`!1D=&7=K zCHQpCWugWa>-+t?w-N2_Y`N!b)P+zZG`OnfNZ!csFht!{z{FSaGakh+p(M3@+%xQu zp8Yb@+ zoUjNlxM#sQ@sdMqXXaKjG<&Kux{~bTQERnHWL`knb_Fnq0*_sr+pTzu1RSRwxO>Jk;~* zZ$Y4PcmZ+4wSy_^CQ za zqZgTRTM==E_eMop8s}$HwoC3H*Lm+epFEpQnxjmNW7TyRvaL2b+kJ~_p2bL=TJU+l zbaTASlo7hiiM@RU>?Br=zo;7`c|-53*$q#qvQ_!6UlGB|P$;;bwDM#ImKuK?U1`3b zJY&)}I5UmRvixfQ;x<)b>RQ(0x`VaBoJZ9So-sJfvIza-I2&nnDSumu8Y`V`96MrP zpK!|cT}QjnTc=#2Y{AaOq9!NZMO(i;H+Agv&^<=I@u>BhC%$x;*~K}RuTt8ZB~)Lj z)wRTO+I^04{yyYXp}A>avY#fB|MQ1O@Um%O{ZF%GL5~gT#B-_58l4@zzp((iLF(r- zZSFJ3ufod{FE0G|&#D(hymk&P*JM*ymNaJ0cFGS%ILHYKLQl@5jUCMbrE0_`7#wsy zK^1E_@-prUSID~PFrl9FB=4a`x3gcocUHc3Zuhls`5AZbiW$BR9bk&e=J6ok_~Q4u zYU$MMWhj$n7E*YbQ6Oa^I$5MemCe!`Yxk8@>ioc9s)MtCLZxzeirZeDjze!Z@%+%p z^7xDXNv|hM1h=<7$JRF$?emH*c}RE-C|k}P!Pp%YcR&&Ks7qsOd70`N(a#<;)&XUo zgP21H`yz|8M}$1mh0;tbXGy)S75i&G)OO_?G%v=HX@~Cv4%=@@wOr+xj9jZBMz^O^ zG~T7${JL|PEJRp8Vbqg;Mm5&q#7DV3zsNjK)EmWQwY1On#2}?%g?n#{k7fZ}R3kij zn&nI94FZ0rUBMHA1E~$AyOEPGUJl+rtOjiuaOzgxiz`C6hDr?deC_woI^4VT29`0h z=Y6T`HzFRX4oLmtm+-KoI<(+*A3ZCM_V!6T+_jrNj&>bzv`Sd+-Zcp=xzIiD)$v+y zNp09x6=5p1{_*hALQcB_wS!|Te9%0>4KfX9l^{)9<}bG48<|jPrl5(P*)Vk%<$!6( zENN3=i6O_>3%xs-2`cPgBqjE)6A)B9lTtIojR=qCNmX5OlzL$*v0L2VaA(swrOaM> zd3;pS1cq9gAToSs^5N*0zifL$|MB2QCByZx$Dbf&w*dSAQ60fB=v0E1iip*#JeE?K z)Bt-`8Z8rG+Hrb-qpE<=75bB`{PXkuHSi{zQ?Zs+0-I@RiqxBgx5m$E(?WpT@!l5w zd>4_jtNC*?QlA$+^Bu59Rwa0>A9JzI=4$ko-?km(uN(ok3JVU}29+q<%rOUd#e<5P z2)>^OkQ?JL3)qs-BtG~^I6D~t8e5$h2^D=? zI^tcfgW1D_mSXQVZAM&C2^)M3kM6|y$Vb+`z)J4l0yQ4!-gvCm1-@KGp!uYB*FURM zocH(1XwjQ{AyDF8LDg?Qewp4Q+I7?}dP>!!Wo=(9L*^iXFDoZ8{kQThwDNonJU9Gu zK}vS?Ybs5k5Kp*{Q(@nOEMeGy#cEaX3)8sKAh+C6RlW_Y#t%$bK>*ai|L~?zM{HCj z%!~oB@L5dbR@$qKh~|Bs$UjkFp#ZWK+M=n&92R+{UXY@TbTO~RaGUN29n+dbH@(u- zD@u8y&XCHY_Shn3`Ibs`rdM3iRaS(SgjIY^ySNAriK6Y(`CSHk*tuDJRnM!4h)K9M zgTbf1T{47v`%8W;1y+)Iuw(M4SMoiB<(uMfgW^bbn~%ZuFa@0)BIg5wdz->EpgL0Q zQymCl7rRVetYg{btQ+v%!)=+}mq2^u}1?1## z-c?c(4-boQl1rE$1DnP5z9yRP2Kv)*uu(t7jIC|)pv5lYKQ4dvM2o_FU7=@UiD6yp z!uCeWJ{?(f1J;CrQ3$B9hCcXg6bi_BDn@?D$J{47x{;)3&*sVPs&2R#bJI zJM$E9UVXCLH$+Mw$k;I>_zJV@Saxoyo@<0qa~Xdzha*Ys75I2f z7kk>_MIXv0N}U$l{0L#juvb+}4Jt_1L%!leiI!b_1g`|5Z7k6?iaEvCjcNY)6}%_@ z3j`biT_j2@FED>MJ8IaGc8Q?DOL^q#IKR8Sop0}PZw37r;o+4jNVm4mxC!`VY&(wI zXsf&UP5vK|LWQjffhQ@c&T=E7ZLVss%a^HBEZiFA+(Va{>2Tij=`FL_K@CkrDSqJT z0$O-x_nP9rgp=~B3HtPR6HxIQCf!;QFz%aQSBUJe)q9?Mdb1W5t=z`s-{<19_PA!7 zPDH}wo7<%KGFhR!&zyV6GJT4xrNkNCI~S>W2wC>Og$V%*v#I3SK_kMEKz+-&%Chd& zj=3UIIC7$t^YB%k!_w@&TQl+KT%W8r;_Lz)K`qF9-EOx|4(T59tZ#akxbvL~h?)35 zoOljetUN7;ic94{N}Bp6Jc7K}xM)<8D2keYreZ`-r6oDA6W#=#G$40|KwaFOJr11c zpt(@3<_l@P2cdb~#gtIcDh#9aFTQRX(fx9VpIzl(7=g~{+QhO3H;w3{;k%P%N?6(v z9SfbX7yFd+Yq z0W|)zyvdf~2{_UE{7)R}pNq#DTs)a4+c}QVZ12jnhyAIdktqZ^$XOu+_rGUw+F%Y% zx3B<}OhfTFL|NB#yyz`0q^S6lKmR{rP3Vyj2+3g}_~% z_8ITS=6HZ~oLXDstt@k$o+xx7i`I&Aw;&*?g`>6qftc-YrtZ za{4}jZ(B{Nm41evVw5@-+z5_YCkCnE89?@ zaa>$>o3DGj@*|x?ctdxqg_r3&<#iu#vf4+kW3tsu0c{o8MpqAH1u>8OL;V;6b;P~S#74<*W#f$~rG`4J?%ex! zzAKfkbD%r4h3$IHPks($eK)UJ&-{+t0qUBY>ko&OM=(sSFlf==_+j#ML1005S*X$X zez9k6cD%hB-5nc{?s}Z1;I{o`E-mypTA|TYr$?>NXqQ;+xjU6uB@A!oTpXL*x}wd@ zWn9-L9EI>e8}1q2i<6Ij(Oa|Ou+~j{y@hvikB!lj#xnpQ% zG;a+`bi+#uT5CWlFDD_I}D`J*B!w7?ovxbG{3AF#w#Tu(m$a`9daJxP)8cV5xXalh|; zzW>GSOEc)J}S6@e{!_%*Y?RL+khV_4Fg8MMb@= z|DQ@*g$5xO6{vq%T>t5T%-Lmrfgb|O?qlQ^`rlEcapEngvrs=J(5m=5F|C*7iRoiLZ8|!}flWS;oBN zwOQ)0K>)8K7`oK(chj_>cnW2xY$OR-Do)rF+*2C`ep~N(>rsxvYIPf<#*9nEHn2)* zFQAVycFGoj%K$WqQ#9E+kv3Nchu$G_QN?6H1NixZeQ{4_r)uCIoMz_#Q+11VI#NH)S`%t*TW`hrvloud4;_r;o)g_guDyv`5Xg(r0>JKXO- z1+un~3O4gxk1G=wla0iV+Is(Rwr%xk=bkGvr<}6a+}+`JYjP_6JpfLWL(0i^_Ev_6 z4M(n@(-YH+dbwYG1Q~bH(2*l;+zgTrZME-0YK6$@o|^oP1ynxe4GU%@_eai#{!FcI zPDx0(CM-Gz$m?E?TqJ*gq&T}=ZDJ-rPX_?iV7*^wG#p7BRgr(pAfOwldDK5p0eCXa z@fv6H6k1ne9`|zb5FbyD>0}9pt&1IgMOAmUN!2q1obXiekl?WKF7ob$`fmYjH)D5? z$*C%@h1UmO0+@-FMM?ngQy?W27Vl+qX}@-H&?b-fHazH0UNq>jW7A>KVFUvT zDFCH*iGW7-(yomhiEY+8QVyY`uqG_CrOIBiYd{$;PMXK}^jIB=ZM}C7&3qjD2y~Jk zTqUZw2kA}{e+j&8iPqh#3cp8;61O**Ti+%nC8^$6*1LrG#lH&u*dB}qYVTpDn7J0#*bx-gFl^=)6bU|S0)$(~n zlvrqC@K|wpyI|qu5WdHY$*9XqOhX0JZTb^+!f?OgF~>vnx-N=t!o%dE%bp6@9dK%K zIto^tau*&d`%x#myv{d7fdFA!K{*gp0KUdPD}M21q5+>Pm+NPi-nPW!$qh|!R+2EF zjO2H6^3)aN{HRm*A_R3_28py>ehCT*+-5*;*j4{X-f49Yv2!=PC08L6Kxcs?NwkG5 znx=kpMZpQJjI$cjEEITXYPk;4p1t=F2k38Eb5(-FWa3FV(`1MQ#D3W&+>jwnG`V#T zNAH>Jk6V{u@DyxlDet^^uYS^9k}BX_)B4Fu!UIOrx_B?tP1;>^`zJ`;Z0}C;?tCA5 zyIGDfybxR_xUGM|?8Y}29JB;5be2On@1#srXFhVHvZ`3s&M6ETGZ`VZSBs|7NSOn$@y%rs+nf{yt-Qs$q$EaQt-5oq}5wo)jArx2Po>J%o=?BtQ<^QP09B6PtW*rBYtlG|v1KeyJ_3n%GBh5p9+cm#2F#0x7PuWI_3!I;z4O}fF+V1e1+qaHQ3u^$Fg z7+s~83X)gn?LqqQ9ctseM5Jb0I_`9-#mi;!Hhk~>sG*nLndw5@h1YBk-OifErujmU z#gxxLshS)ATJ;Z9elKM@2+qq`l4{uBO`{+KS3oe1f@)9lKiDrxo_PVCgv=Ldm*_8P zFo|wu5uT=ZCNsf6?j1qs(fnSKg@YYRDu>MEs-%93f0htYJ22wSnrnU*3e23N_$oH0 z!wAHU1A81F8_`g&*`5PCXQ1DE{gg;&?jzE^9m>Pa-)z%%LJ^7=x)W1tzftI9??iTx zhaPR@gmkhL`C#5ctz=D|9_x*86(AhD>9lO;M;a80YrGu)1-aIQ?k?+=IZdCEy_k8J z<0zHH?wPm3!Di`@PdYX!($A-=-NE6XRXPIqlifiLFI zpH?D@)l_Twb7WrLt$$hZMaoC~^UGTc!_lU}II)h_YrA)B7GD$-6Q`WXRV?_g4y=8{ z`EttueFL0f=p{o6Ew^0N&6;go4TiF>BEHNozYX5hRlB3CG9GZ4-4FyY1UX`kg9uFO z8(fOLaL7g~%s4m*SJ@g)hu_KY-pSTH>Jh8a6Zx7q%7k3@US`r!Qs1TQyeea;Rmc0< zz{EpETBLnGGd0x#g;T0qX6N_$KFTwKH>dolw5G{MK-5 zf|Bui`0t`sE6KTSfjf?%h1c_#`FuOzIjA(4`(;6IsVqD|{4sg4QFKT2TSKbQNM^UX zv|$TFI3lYt6mPd<4#d3Y-)rj)-bR0inSbk!@x(v2oW^_17C9DbHkl7bdzdTrnURU! zrt0~emIR%=CsesyT;L|^Kfr}md`f$|_#wr3Fs_g$aGA%Od4rA#net?3{OIDij6rjY zlX@VRCXR7}`R(*QU&Gms{V5!Ox&2^fCRu$CYg4U;iq+in=d%+#Q~0+(vn$LP2F zZGFW(_a=2ttqw+seOn~ycSi?WdPk5`RUQN&soRwDZ9RYTS5L|V&%Z+z1ez#3B>w^T z6LgB~M((3eGMNuG8hrMtX{6n*(LJ__-KrbZISW}}K^L9DqF}kUOkZjH4KF$gMOIbs zaAv4Mf(pygFRYpPqS+8@fMYQ9MdLEV3R3KC5tIP+yIUY4>8MpYRly@8AS*iTm7>=R zcMB*f^rLvgeZMu%4ODhW93A&>d$0l|8`0jK%-(z+6S@LMU=Utfbzy#f*|q<5b)77kF2yiDBd#3Cyt&XlD@2|lbqULPh`f&Sm z#z2n7h6z06$o_=*C&OwVTs&`ZO!G;YEz63O)0%BFc3!mD5t%_;i&| zB=fW5{?d`-0rk(G-Y%6x5jI_;^Lw^`PE8P+f6PWYrc?KCoek7A2uXLmRF&Z19lxg_ zGsjEgPO12cC*}vQyfzCaOWRaSX0Ok9?Y{X*lyAPP*K+>utYX#^BUP*N5-Bca% zOp1zlVM9x+_L=%Cp@B-FZ|IO+Fak%deTCkqd1BNjRNX!$NL<|$eb`wga~2S-D}0uJ z$MdtNW@V+p?pGIZ@DD-{CDJPi;2yqdQ?r6sL+V|<54diIj@WJdkoN4Z6&{{$3`Mwq z4@Ujk8*b-E--yX5a*j6X&1bHUsvG+-T!b__shlc+Cz@eKy^!3IehNOp(XnO$F?WyJ<_Xuj2 zo5QZV89z4zx$C~Ie>hgQbKxBtWR$oYnf}2-;l$Nu47J ze!&6W-tp`amn$g<7#}IyYn6+FeEI&?vTI;8*&4XEZ_m`h8uc`IN?EPjMY>!)*#2-9 z0do+S8}j`Q-15vs@fao+f|6tvN@q&-aRBhOy984uPfVCr&R=IyCiliH*N1|K8FyLy z{P^_D_k-j;u!5+jmNd(2{QkmNbX&`RAI^(WV2QxZ$-f+A51!itchryssRJhG!$gp% zp8A+NcMxvv_@tjF=TQSGXH>F#ozGiCEtfpQOV1iIQhz8kIs5f%3X^gQqjx-Ux95uC zU3I{?*`dW1QzLqKw4k_*YInRFM9oxGE;)ERf=}UL5&j=P3`~mC2vZ_6U(`Ah_X!6e z{&MyM4Q5r^Vfg_zQCuH&Zl(@@A?{Jo0qiH3fDaJuPC~$b4tDbQN@Ox;A40SrHUB2hHW>z>e9^gCS$}Ml8N)wE5WK7G`Qs>Z zqM_&U&wyjM8~FeaAj|S~;63qhUY(L`IOeL_sS4G&R>M!U)M`Z;$KW9_J|Z#T9>Eon zk&!`atH8fz=B;q;O&pJbKe$^*_xAP(0jgba-EN3&jwbXB-WodN&v}H@T^hNcpt*P(KTLM(nJjP+! zsh+gb(HB>J5%I65?%(IxIHxLVl>a2nnFjY0|W2{WA z-_&|lP?!D1vaO?om7SgLd&MN@tv7nal3g7XDR&Oa3ydbT-|I}}xqt{94Ys^rair2lEgO4W1xUSA(L~-v z>Q~pr%?tm=0zA8!FP3VVXFqkOHgA*K15RtBG#L+M@^_lkCS;*e^LX))N0$lUdzy4w zK8qJcN$UWF&)XJlU9LMlU9P9A0At)}Dq2F6u3B>~rA))?qPv8BwqM~*)4Xx#`(Y+%nSBe^T?7p3J zMcY;_4xqkRsvJJvs@i_mNqzB!vh5%6s`+7&nO2jF)3vDHaTod~B*N{${UC*JXNtJd zv@1}3_KaA%{bC(v+N?eS2S6ODepaH`T^E}urq;Imj|{z2y$*z?86~kZI=w;wd<9SNJZx;%nneHNInYMy#j0}4BkAo-xdLon~3(er!0;W!ql#Z z8zTPc#ekiv3V>@AJ0hQbgRg}90@w%55;=F33zW%?pGAmK`>|KGcJzMFROzni(sLda zH7?;BdimI^eB|f0G|*FfV2xi``^(8!41ezTV(%P4lW1SfPI}cBq4Iq4D{X(Ga5LZ% zeV#a&{LS`9&L?F108#ZWmFsP4UZV~pizL=oAL;XNk~w;1VoRqY2uPrYi%h5~aw(q6 zumkMs5P(;XRb6a*TcTL%_nZi!JaauFQn_Q$t&Ve+7Ela5o_smD4?F!vr51lsy@w81 zCx;p1#>=fu*QsaHQlAPH` z3j08usR&1H73P=soL@Zmy)giK$#_cO>_0smDu2Rzg};;^^N4NTp0r6g7xYQLwFaQf znl?lZH=u5!R~C{4<)VuQn(sqyRAy|lXHjg}&Ej=Ap8 z(AnSNh+XOg>LODKx7)hW_DM$sKQ5!a6l6dn%c19*m*P?^{-A*~hIOcxr@6+l#+t{b z$IicHjT@;NzqT^8jhQsI&X6>DDwp)_v&i`9Mi};oMA033a&maP!xw=p*Jte(Dt@qM z#}rZ>PljL1owpgt8kfjn^(9GCm)i`t0iqiJ^oaS0>8IK{&G_xu`@ft7a=1&;JqDLB z34Ir@s(h57+-o`}dq`7Ik%CaXx>n1wxofjNuKh;y%5a_@2H>xDaC}Z60`k@dmzbe0bMN!Ts1-Vfn8+|yxVbgfQwtyU^ZaEaYA zhFG1Uc^XeCr3$OyXlYc>Yh;JE;BDQnG~%wCrPJ*8TSy@Ydx3fU7774H4 zpVvNCRr=m`zPIMdHtpv5wRg?ng|qQ*=@MHM(NL~YuRHhZho>hH$16n0qWsHFcm=C* z*u!q3(gsP4sD4`}#S~h;CIZ`X&nDU^cKA+q7}(wO;nt!aGyXQ7M2K+_PWi^wA1*p3 z*av~rW*$l4XcL`t4!WK?QAwXJwE4zNBBNJ!U%lsRkK;wkoQ5F)pYeA0HHEkedx}Pqvgm~QdsAE;~{{>WYIf{ig+~XH4S(a{1w9EYI5nk zel$TWyhI0UZU>?UA%-s-Q0LS-172&dC4Y5|{Cv1kbhV-FSXIPkz}M}3@$Es!oU%sR z$!}*>dszMS-jY+}FlngS@Gl{|Lg8g~=fpX|umQ?^ZTMJtky%II&#ot?Bm~;bl1U7_ z6ft`hCqb^p`&e9JqiH!g_c*pi8NCnh}{6i5*#S@H zfpTMo%UF>tUQnD24<}G@iYzECgx6ks(~t*1L1l>^qePKd0oqMGKUt3Jn4vWdd(!t)eO zWaiymoUt3vX7M!A$GfQMJ7cu@o0+K9A*Q5GkKL=@1#j%u=eL->=&`4MFfZ>*wPqq2 zv{FO&h1YB|x6LspTB>U&mkdn@bQTRQrcH|{Z}HaqX%0A5T)T6=-Ky`mFJR{Lqukn^ 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 B$A16- literal 0 HcmV?d00001 diff --git a/02-use-cases/deep-research-agent/requirements.txt b/02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt similarity index 100% rename from 02-use-cases/deep-research-agent/requirements.txt rename to 02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt diff --git a/02-use-cases/README.md b/02-use-cases/README.md index f0bb12523..65fbdf7e9 100644 --- a/02-use-cases/README.md +++ b/02-use-cases/README.md @@ -13,6 +13,7 @@ Agents that interact with users in real time. Users authenticate through an iden | [A2A-multi-agent-incident-response](./01-conversational-agents/A2A-multi-agent-incident-response/) | IT / DevOps | Runtime, Gateway, Memory, A2A (3 frameworks) | | [AWS-operations-agent](./01-conversational-agents/AWS-operations-agent/) | Cloud Operations | Runtime, Gateway, Memory, Policy, Observability | | [customer-support-assistant-vpc](./01-conversational-agents/customer-support-assistant-vpc/) | Retail / E-commerce | Runtime, Gateway (VPC) | +| [deep-research-agent](./01-conversational-agents/deep-research-agent/) | Research / Q&A | Gateway (Web Search), Runtime | | [device-management-agent](./01-conversational-agents/device-management-agent/) | IoT / Smart Home | Runtime, Gateway, Policy, Identity (Cognito) | | [finance-personal-assistant](./01-conversational-agents/finance-personal-assistant/) | Personal Finance | Gateway, Policy | | [healthcare-appointment-agent](./01-conversational-agents/healthcare-appointment-agent/) | Healthcare | Runtime, Gateway, Policy, Observability (FHIR R4) | From a6fb30f02a8e0d6dc28f648caa90464fba544f12 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Mon, 15 Jun 2026 03:22:58 -0400 Subject: [PATCH 13/21] refactor: restructure web-search by key learning and add self-contained cleanup - Reorganize 03-web-search/ into standalone samples: 01-raw-mcp, 02-strands-agent, 03-langchain-agent - Each sample includes setup_gateway.py, demo script, cleanup.py, images, and README - Remove separate 01-setup-gateway/ and 05-cleanup/ folders - Move shared setup/cleanup logic to utils/ - Add cleanup.py to deep-research-agent use case - Update all READMEs to template format (Core Concepts, Tutorials, Quick Start, How It Works) - Add request timeout to gateway_auth.py - Pin boto3>=1.38.0 in requirements.txt --- .../03-web-search/01-raw-mcp/README.md | 124 ++++++++++++ .../{05-cleanup => 01-raw-mcp}/cleanup.py | 15 +- .../images/raw-mcp-call-architecture.png | Bin .../raw_mcp_call.py | 0 .../03-web-search/01-raw-mcp/setup_gateway.py | 17 ++ .../03-web-search/01-setup-gateway/README.md | 143 -------------- .../03-web-search/02-raw-mcp/README.md | 84 -------- .../03-web-search/02-strands-agent/README.md | 117 ++++++++++++ .../03-web-search/02-strands-agent/cleanup.py | 129 +++++++++++++ .../strands-web-search-architecture.png | Bin .../02-strands-agent/setup_gateway.py | 17 ++ .../web_search_strands.py | 0 .../03-langchain-agent/README.md | 122 ++++++++++++ .../03-langchain-agent/cleanup.py | 129 +++++++++++++ .../langchain-web-search-architecture.png | Bin .../03-langchain-agent/setup_gateway.py | 15 ++ .../web_search_langchain.py | 0 .../03-web-search/03-strands-agent/README.md | 85 --------- .../04-langchain-agent/README.md | 87 --------- .../03-web-search/05-cleanup/README.md | 22 --- .../03-web-search/README.md | 179 +++++------------- .../03-web-search/requirements.txt | 3 +- .../gateway_setup.py} | 6 +- .../deep-research-agent/README.md | 24 ++- .../deep-research-agent/cleanup.py | 135 +++++++++++++ .../deep-research-agent/requirements.txt | 6 +- 26 files changed, 884 insertions(+), 575 deletions(-) create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md rename 01-features/03-connect-your-agent-to-anything/03-web-search/{05-cleanup => 01-raw-mcp}/cleanup.py (85%) rename 01-features/03-connect-your-agent-to-anything/03-web-search/{02-raw-mcp => 01-raw-mcp}/images/raw-mcp-call-architecture.png (100%) rename 01-features/03-connect-your-agent-to-anything/03-web-search/{02-raw-mcp => 01-raw-mcp}/raw_mcp_call.py (100%) create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py delete mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md delete mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py rename 01-features/03-connect-your-agent-to-anything/03-web-search/{03-strands-agent => 02-strands-agent}/images/strands-web-search-architecture.png (100%) create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py rename 01-features/03-connect-your-agent-to-anything/03-web-search/{03-strands-agent => 02-strands-agent}/web_search_strands.py (100%) create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py rename 01-features/03-connect-your-agent-to-anything/03-web-search/{04-langchain-agent => 03-langchain-agent}/images/langchain-web-search-architecture.png (100%) create mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py rename 01-features/03-connect-your-agent-to-anything/03-web-search/{04-langchain-agent => 03-langchain-agent}/web_search_langchain.py (100%) delete mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md delete mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md delete mode 100644 01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/README.md rename 01-features/03-connect-your-agent-to-anything/03-web-search/{01-setup-gateway/setup_gateway.py => utils/gateway_setup.py} (98%) create mode 100644 02-use-cases/01-conversational-agents/deep-research-agent/cleanup.py diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md new file mode 100644 index 000000000..ac591c89b --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md @@ -0,0 +1,124 @@ +# Raw MCP Tool Discovery and Invocation + +## Overview + +This example calls the AgentCore Gateway directly over the MCP protocol — no agent framework involved. It's the simplest way to verify your Gateway and Web Search Tool target are working correctly. + +> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. + +![Raw MCP Client web search Architecture](images/raw-mcp-call-architecture.png) + +## Prerequisites + +- Python 3.10+ +- AWS account with Amazon Bedrock enabled in **us-east-1** +- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions + +## How It Works + +The script performs three operations against the Gateway: + +### Step 1: Authenticate + +An OAuth token is obtained from Cognito using the `client_credentials` flow. The token is attached as a `Bearer` header on the MCP Streamable HTTP transport. This is handled internally by `create_streamable_http_transport()`. + +```python +from utils.gateway_auth import create_streamable_http_transport + +transport = create_streamable_http_transport() +``` + +### Step 2: Discover Tools (`tools/list`) + +The MCP `tools/list` call returns all tools available on the Gateway. For a Gateway with the Web Search connector target, you'll see: + +```json +{ + "name": "WebSearch", + "description": "Search the web for current information", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Search query (max 200 characters)" + } + }, + "required": ["query"] + } +} +``` + +### Step 3: Invoke the Tool (`tools/call`) + +Calling the tool with a query returns structured results: + +```json +{ + "results": [ + { + "text": "Snippet from the web page...", + "url": "https://example.com/article", + "title": "Article Title", + "publishedDate": "2026-05-28" + } + ] +} +``` + +## Files + +| File | Description | +|:-----|:------------| +| `raw_mcp_call.py` | Main example script — tool discovery and invocation | + +## Quick Start + +```bash +# Install dependencies +pip install -r ../requirements.txt + +# Set up the Gateway (creates IAM role, Cognito, Gateway, Web Search target) +python setup_gateway.py +#python setup_gateway.py --gateway-name my-web-search-gw + +# Load credentials into your shell +source .env.web-search + +# Run the example — discovers WebSearch tool and invokes it +python raw_mcp_call.py + +# Try a custom query +python raw_mcp_call.py --query "Latest Python release" +python raw_mcp_call.py --query "AWS re:Invent 2026 announcements" +``` + +| Parameter | Required | Description | +|:----------|:---------|:------------| +| `--query` | No | Search query (default: built-in example query) | + +## Cleanup (Optional) + +When you're done remove all provisioned AWS resources: + +**1. Retrieve resource IDs** from the setup output (printed when you ran `setup_gateway.py`): + +``` +Gateway ID: +IAM Role: agentcore-web-search-gateway-role +Cognito Pool: +``` + +> **Tip:** If you no longer have the terminal output, the gateway ID is the subdomain prefix in your `AGENTCORE_GATEWAY_URL` (e.g., `gw-abc123` from `https://gw-abc123.gateway.bedrock-agentcore...`). The IAM role follows the pattern `agentcore--role`. + +**2. Run cleanup:** + +```bash +python cleanup.py --gateway-id --user-pool-id --role-name +``` + +| Parameter | Required | Description | +|:----------|:---------|:------------| +| `--gateway-id` | Yes | Gateway ID | +| `--user-pool-id` | Yes | Cognito User Pool ID | +| `--role-name` | Yes | IAM role name | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py similarity index 85% rename from 01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py rename to 01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py index 82119344a..8d42e1b8b 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py @@ -21,14 +21,9 @@ import boto3 -# ── Configuration ───────────────────────────────────────────────────────────── - REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") -# ── Cleanup Steps ───────────────────────────────────────────────────────────── - - def delete_gateway(gateway_client, gateway_id): """Delete all targets and the gateway itself.""" print("\n[1/3] Deleting Gateway resources...") @@ -67,7 +62,6 @@ def delete_iam_role(iam_client, role_name): """Delete the IAM role and its inline policies.""" print("\n[3/3] Deleting IAM resources...") try: - # Delete inline policies policies = iam_client.list_role_policies(RoleName=role_name) for policy_name in policies["PolicyNames"]: iam_client.delete_role_policy( @@ -81,9 +75,6 @@ def delete_iam_role(iam_client, role_name): print(f" Error deleting IAM role: {e}") -# ── Main ────────────────────────────────────────────────────────────────────── - - def parse_args(): parser = argparse.ArgumentParser( description="Clean up Web Search Tool Gateway resources" @@ -123,6 +114,12 @@ def main(): delete_cognito(cognito_client, args.user_pool_id) delete_iam_role(iam_client, args.role_name) + # Remove local credentials file + env_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env.web-search") + if os.path.exists(env_file): + os.remove(env_file) + print(f"\n Deleted local credentials file: {env_file}") + print("\n" + "=" * 60) print("✅ All resources cleaned up successfully!") print("=" * 60) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/images/raw-mcp-call-architecture.png b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/images/raw-mcp-call-architecture.png similarity index 100% rename from 01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/images/raw-mcp-call-architecture.png rename to 01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/images/raw-mcp-call-architecture.png diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py similarity index 100% rename from 01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/raw_mcp_call.py rename to 01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py new file mode 100644 index 000000000..b10080a6c --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py @@ -0,0 +1,17 @@ +"""Set up AgentCore Gateway with Web Search Tool — delegates to shared utility. +After running this script, load credentials with `source .env.web-search` to use +with the other web search examples. + +Usage: + python setup_gateway.py + python setup_gateway.py --gateway-name my-gateway + python setup_gateway.py --region us-east-1 +""" +import sys +import os + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +from utils.gateway_setup import main + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md deleted file mode 100644 index f4a035e1f..000000000 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/README.md +++ /dev/null @@ -1,143 +0,0 @@ -# Set Up AgentCore Gateway with Web Search Tool - -## Overview - -This script creates all the infrastructure needed to expose the Web Search Tool through an AgentCore Gateway. After running it, you'll have a fully functional MCP endpoint that any agent framework can connect to. - -> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. - -``` -┌──────────────────┐ ┌─────────────────────────────────────┐ -│ setup_gateway │────────▶│ AWS Resources Created: │ -│ │ │ │ -│ 1. IAM Role │ │ • IAM Role (InvokeWebSearch) │ -│ 2. Cognito │ │ • Cognito User Pool + M2M Client │ -│ 3. Gateway │ │ • AgentCore Gateway (MCP) │ -│ 4. Target │ │ • Web Search Connector Target │ -└──────────────────┘ └─────────────────────────────────────┘ -``` - -## How It Works - -### Gateway Service Role - -The Gateway needs an IAM role that allows the AgentCore service to perform actions on your behalf. For the Web Search Tool, the role needs two permissions: - -- `bedrock-agentcore:InvokeGateway` — to invoke the Gateway itself -- `bedrock-agentcore:InvokeWebSearch` — to authorize web search invocations against `arn:aws:bedrock-agentcore::aws:tool/web-search.v1` - -### Cognito Authentication - -The script creates a Cognito User Pool with: -- A resource server defining an `invoke` scope -- A machine-to-machine (M2M) client using the `client_credentials` OAuth flow - -This provides JWT-based authentication for incoming requests to the Gateway. - -### Gateway Creation - -The Gateway is created with: -- **Protocol**: MCP (Model Context Protocol) -- **MCP version**: 2025-03-26 -- **Search type**: SEMANTIC (enables tool discovery across multiple targets) -- **Authorizer**: Custom JWT backed by the Cognito User Pool - -### Web Search Connector Target - -The Web Search Tool uses the `connector` target type — a fully AWS-managed integration. You specify `connectorId: "web-search"` and the Gateway handles schema management, endpoint resolution, and service authentication automatically. - -Outbound authentication uses `GATEWAY_IAM_ROLE` — the Gateway's own service role authenticates to the Web Search backend. No additional credentials needed. - -## Prerequisites - -```bash -pip install -r ../requirements.txt -``` - -Your AWS credentials must have permissions to create IAM roles, Cognito pools, and AgentCore Gateways. Your account must be allowlisted for the Web Search Tool private beta. - -> **Region**: The Web Search Tool connector is currently available in **us-east-1** only. - -## Usage - -```bash -# Default setup -python setup_gateway.py - -# Custom gateway name -python setup_gateway.py --gateway-name my-web-search-gw - -# Explicit region -python setup_gateway.py --region us-east-1 -``` - -After completion, the script writes credentials to a local `.env.web-search` file: - -```bash -source .env.web-search -``` - -This loads the following variables into your shell: - -```bash -AGENTCORE_GATEWAY_URL="https://..." -COGNITO_DOMAIN="..." -COGNITO_CLIENT_ID="..." -COGNITO_CLIENT_SECRET="..." -COGNITO_SCOPE="agentcore-websearch/invoke" -AWS_DEFAULT_REGION="us-east-1" -``` - -Source this file before running the other demos. - -> **⚠️ Security**: The `.env.web-search` file contains your client secret. Keep it secure and do not commit it to version control (it's already in `.gitignore`). - -## IAM Permissions - -### Caller (you) - -```json -{ - "Effect": "Allow", - "Action": [ - "iam:CreateRole", - "iam:PutRolePolicy", - "iam:GetRole", - "cognito-idp:CreateUserPool", - "cognito-idp:CreateUserPoolDomain", - "cognito-idp:CreateResourceServer", - "cognito-idp:CreateUserPoolClient", - "cognito-idp:ListUserPools", - "cognito-idp:ListUserPoolClients", - "cognito-idp:DescribeUserPoolClient", - "cognito-idp:DescribeResourceServer", - "bedrock-agentcore:CreateGateway", - "bedrock-agentcore:GetGateway", - "bedrock-agentcore:CreateGatewayTarget", - "bedrock-agentcore:ListGatewayTargets" - ], - "Resource": "*" -} -``` - -### Gateway Service Role (created by this script) - -```json -{ - "Effect": "Allow", - "Action": [ - "bedrock-agentcore:InvokeGateway", - "bedrock-agentcore:InvokeWebSearch" - ], - "Resource": [ - "arn:aws:bedrock-agentcore:us-east-1::gateway/*", - "arn:aws:bedrock-agentcore:us-east-1:aws:tool/web-search.v1" - ] -} -``` - -## Files - -| File | Description | -|:-----|:------------| -| `setup_gateway.py` | Main setup script — creates all resources | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md deleted file mode 100644 index a75306d3e..000000000 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-raw-mcp/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# Raw MCP Tool Discovery and Invocation - -## Overview - -This demo calls the AgentCore Gateway directly over the MCP protocol — no agent framework involved. It's the simplest way to verify your Gateway and Web Search Tool target infrastructure are working correctly. - -> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. - -![Raw MCP Client web search Architecture](images/raw-mcp-call-architecture.png) - -## How It Works - -### Tool Discovery (`tools/list`) - -The MCP `tools/list` call returns all tools available on the Gateway. For a Gateway with only the Web Search connector target, you'll see one tool: - -```json -{ - "name": "WebSearch", - "description": "Search the web for current information", - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "Search query (max 200 characters)" - } - }, - "required": ["query"] - } -} -``` - -### Tool Invocation (`tools/call`) - -Calling the tool with a query returns structured results: - -```json -{ - "results": [ - { - "text": "Snippet from the web page...", - "url": "https://example.com/article", - "title": "Article Title", - "publishedDate": "2026-05-28" - } - ] -} -``` - -### Authentication Flow - -1. The script obtains an OAuth token from Cognito (`client_credentials` flow) -2. The token is passed as a `Bearer` header on the MCP Streamable HTTP transport -3. The Gateway validates the JWT and authorizes the request - -## Prerequisites - -```bash -pip install -r ../requirements.txt -``` - -Run `01-setup-gateway/setup_gateway.py` first, then load credentials: `source .env.web-search` - -## Usage - -```bash -# Default query -python raw_mcp_call.py - -# Custom query -python raw_mcp_call.py --query "Latest Python release" -python raw_mcp_call.py --query "AWS re:Invent 2026 announcements" -``` - -## IAM Permissions - -No direct IAM permissions needed — authentication is handled via the Cognito OAuth token. The Gateway's service role provides the `bedrock-agentcore:InvokeWebSearch` permission. - -## Files - -| File | Description | -|:-----|:------------| -| `raw_mcp_call.py` | Main demo script — tool discovery and invocation | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md new file mode 100644 index 000000000..f58b45dea --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md @@ -0,0 +1,117 @@ +# Web Search with a Strands AI Agent + +## Overview + +This example shows the complete agent integration: a Strands agent automatically discovers and invokes the Web Search Tool to answer real-time questions with cited sources. + +![Strands Agent web search Architecture](images/strands-web-search-architecture.png) + +## Prerequisites + +- Python 3.10+ +- AWS account with Amazon Bedrock enabled in **us-east-1** +- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions +- Claude Sonnet 4 model access enabled in Bedrock + +```bash +pip install -r ../requirements.txt +``` + +## Quick Start + +```bash +# 1. Set up the Gateway (creates IAM role, Cognito, Gateway, Web Search target) +python setup_gateway.py + +# 2. Load credentials into your shell +source .env.web-search + +# 3. (Optional) Override the default model +export BEDROCK_MODEL_ID="us.anthropic.claude-sonnet-4-20250514-v1:0" + +# 4. Run the agent +python web_search_strands.py + +# Try a custom query +python web_search_strands.py --query "What are the latest AI announcements?" +python web_search_strands.py --query "Current price of Bitcoin" +``` + +| Parameter | Required | Description | +|:----------|:---------|:------------| +| `--query` | No | Research question (default: built-in demo queries) | + +## How It Works + +The script connects to the Gateway, creates an agent, and runs a research query: + +### Step 1: Connect to the Gateway + +The agent connects via MCP Streamable HTTP. Authentication is handled internally — an OAuth token is obtained from Cognito and attached to the transport. The Gateway returns the `WebSearch` tool with its input schema, and Strands registers it as an available tool for the LLM. + +```python +from utils.web_search_agent import create_agent, create_mcp_client + +mcp_client = create_mcp_client() +``` + +### Step 2: Create the Agent + +The `create_agent()` function discovers tools via `tools/list` and configures a Strands agent with a system prompt that instructs it to search and cite sources: + +```python +with mcp_client: + agent = create_agent(mcp_client) +``` + +### Step 3: Run the Agent Loop + +When you ask a question, the agent loop executes: + +1. Strands sends the query + tool schema to Claude Sonnet 4 +2. Claude decides to call `WebSearch` with a concise search query +3. Strands invokes the tool via MCP `tools/call` on the Gateway +4. The Gateway routes to the Web Search connector and returns results +5. Results are fed back to Claude as a tool result +6. Claude synthesizes a final answer with cited sources + +```python +result = agent("What is the latest version of Python?") +print(result.message) +``` + +## Files + +| File | Description | +|:-----|:------------| +| `setup_gateway.py` | Creates Gateway + Web Search target infrastructure | +| `web_search_strands.py` | Main demo script — Strands agent with web search | +| `cleanup.py` | Deletes all provisioned AWS resources | +| `../utils/web_search_agent.py` | Shared agent factory with MCP client setup | +| `../utils/gateway_auth.py` | OAuth token retrieval and transport creation | + +## Cleanup (Optional) + +When you're done remove all provisioned AWS resources: + +**1. Retrieve resource IDs** from the setup output (printed when you ran `setup_gateway.py`): + +``` +Gateway ID: +IAM Role: agentcore-web-search-gateway-role +Cognito Pool: +``` + +> **Tip:** If you no longer have the terminal output, the gateway ID is the subdomain prefix in your `AGENTCORE_GATEWAY_URL` (e.g., `gw-abc123` from `https://gw-abc123.gateway.bedrock-agentcore...`). The IAM role follows the pattern `agentcore--role`. + +**2. Run cleanup:** + +```bash +python cleanup.py --gateway-id --user-pool-id --role-name +``` + +| Parameter | Required | Description | +|:----------|:---------|:------------| +| `--gateway-id` | Yes | Gateway ID | +| `--user-pool-id` | Yes | Cognito User Pool ID | +| `--role-name` | Yes | IAM role name | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py new file mode 100644 index 000000000..8d42e1b8b --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py @@ -0,0 +1,129 @@ +""" +Clean up all resources created by the Web Search Tool setup. + +Deletes in order: + 1. Gateway targets and Gateway + 2. Cognito User Pool (domain, clients, pool) + 3. IAM Role and inline policies + +Prerequisites: + pip install -r ../requirements.txt + AWS credentials with permissions to delete the resources. + +Usage: + python cleanup.py --gateway-id --user-pool-id --role-name + python cleanup.py --gateway-id gw-abc123 --user-pool-id us-east-1_AbCdEf --role-name agentcore-web-search-gateway-role +""" + +import argparse +import os +import time + +import boto3 + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") + + +def delete_gateway(gateway_client, gateway_id): + """Delete all targets and the gateway itself.""" + print("\n[1/3] Deleting Gateway resources...") + try: + targets = gateway_client.list_gateway_targets( + gatewayIdentifier=gateway_id, maxResults=100 + ) + for item in targets["items"]: + gateway_client.delete_gateway_target( + gatewayIdentifier=gateway_id, targetId=item["targetId"] + ) + print(f" Deleted target: {item['name']}") + + time.sleep(10) + gateway_client.delete_gateway(gatewayIdentifier=gateway_id) + print(f" Deleted gateway: {gateway_id}") + except Exception as e: + print(f" Error deleting gateway: {e}") + + +def delete_cognito(cognito_client, user_pool_id): + """Delete the Cognito User Pool and its domain.""" + print("\n[2/3] Deleting Cognito resources...") + try: + domain = user_pool_id.replace("_", "").lower() + cognito_client.delete_user_pool_domain( + Domain=domain, UserPoolId=user_pool_id + ) + cognito_client.delete_user_pool(UserPoolId=user_pool_id) + print(f" Deleted user pool: {user_pool_id}") + except Exception as e: + print(f" Error deleting Cognito: {e}") + + +def delete_iam_role(iam_client, role_name): + """Delete the IAM role and its inline policies.""" + print("\n[3/3] Deleting IAM resources...") + try: + policies = iam_client.list_role_policies(RoleName=role_name) + for policy_name in policies["PolicyNames"]: + iam_client.delete_role_policy( + RoleName=role_name, PolicyName=policy_name + ) + print(f" Deleted policy: {policy_name}") + + iam_client.delete_role(RoleName=role_name) + print(f" Deleted role: {role_name}") + except Exception as e: + print(f" Error deleting IAM role: {e}") + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Clean up Web Search Tool Gateway resources" + ) + parser.add_argument( + "--gateway-id", required=True, help="Gateway ID to delete" + ) + parser.add_argument( + "--user-pool-id", required=True, help="Cognito User Pool ID to delete" + ) + parser.add_argument( + "--role-name", required=True, help="IAM role name to delete" + ) + parser.add_argument( + "--region", default=REGION, help="AWS region (default: us-east-1)" + ) + return parser.parse_args() + + +def main(): + args = parse_args() + region = args.region + + print("=" * 60) + print("AgentCore Web Search Tool — Resource Cleanup") + print("=" * 60) + print(f"\nRegion: {region}") + print(f"Gateway ID: {args.gateway_id}") + print(f"User Pool ID: {args.user_pool_id}") + print(f"Role Name: {args.role_name}") + + gateway_client = boto3.client("bedrock-agentcore-control", region_name=region) + cognito_client = boto3.client("cognito-idp", region_name=region) + iam_client = boto3.client("iam") + + delete_gateway(gateway_client, args.gateway_id) + delete_cognito(cognito_client, args.user_pool_id) + delete_iam_role(iam_client, args.role_name) + + # Remove local credentials file + env_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env.web-search") + if os.path.exists(env_file): + os.remove(env_file) + print(f"\n Deleted local credentials file: {env_file}") + + print("\n" + "=" * 60) + print("✅ All resources cleaned up successfully!") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/images/strands-web-search-architecture.png b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/images/strands-web-search-architecture.png similarity index 100% rename from 01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/images/strands-web-search-architecture.png rename to 01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/images/strands-web-search-architecture.png diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py new file mode 100644 index 000000000..b10080a6c --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py @@ -0,0 +1,17 @@ +"""Set up AgentCore Gateway with Web Search Tool — delegates to shared utility. +After running this script, load credentials with `source .env.web-search` to use +with the other web search examples. + +Usage: + python setup_gateway.py + python setup_gateway.py --gateway-name my-gateway + python setup_gateway.py --region us-east-1 +""" +import sys +import os + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +from utils.gateway_setup import main + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py similarity index 100% rename from 01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/web_search_strands.py rename to 01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md new file mode 100644 index 000000000..5e0b89113 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md @@ -0,0 +1,122 @@ +# Web Search with a LangChain Agent + +## Overview + +This demo shows the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore Gateway and `create_react_agent` from LangGraph for the agent loop. + +![Langchain web search Architecture](images/langchain-web-search-architecture.png) + +## Prerequisites + +- Python 3.10+ +- AWS account with Amazon Bedrock enabled in **us-east-1** +- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions +- Claude Sonnet 4 model access enabled in Bedrock + +```bash +pip install -r ../requirements.txt +``` + +## Quick Start + +```bash +# 1. Set up the Gateway (creates IAM role, Cognito, Gateway, Web Search target) +python setup_gateway.py +#python setup_gateway.py --gateway-name my-web-search-gw + +# 2. Load credentials into your shell +source .env.web-search + +# 3. (Optional) Override the default model +export BEDROCK_MODEL_ID="us.anthropic.claude-sonnet-4-20250514-v1:0" + +# 4. Run the agent +python web_search_langchain.py + +# Try a custom query +python web_search_langchain.py --query "Latest AWS announcements" +python web_search_langchain.py --query "Python 3.13 new features" +``` + +| Parameter | Required | Description | +|:----------|:---------|:------------| +| `--query` | No | Search query (default: built-in demo query) | + +## How It Works + +The script authenticates, discovers tools from the Gateway, and runs an agent loop: + +### Step 1: Connect to the Gateway via MCP + +An OAuth token is obtained from Cognito and passed to `MultiServerMCPClient`, which connects to the Gateway and converts MCP tools into LangChain-compatible objects: + +```python +from langchain_mcp_adapters.client import MultiServerMCPClient + +async with MultiServerMCPClient({ + "web-search": { + "transport": "streamable_http", + "url": gateway_url, + "headers": {"Authorization": f"Bearer {token}"}, + } +}) as client: + tools = client.get_tools() +``` + +### Step 2: Create the Agent + +The agent uses LangGraph's `create_react_agent` with `ChatBedrockConverse` as the LLM: + +```python +from langchain_aws import ChatBedrockConverse +from langgraph.prebuilt import create_react_agent + +model = ChatBedrockConverse( + model="us.anthropic.claude-sonnet-4-6", + region_name="us-east-1", +) +agent = create_react_agent(model, tools=tools) +``` + +### Step 3: Run the Agent Loop + +LangChain's MCP adapter uses async I/O. The agent invokes `WebSearch` automatically when it determines a search is needed, then synthesizes a cited response: + +```python +result = await agent.ainvoke({"messages": [{"role": "user", "content": query}]}) +``` + +## Files + +| File | Description | +|:-----|:------------| +| `setup_gateway.py` | Creates Gateway + Web Search target infrastructure | +| `web_search_langchain.py` | Main demo script — LangChain agent with web search | +| `cleanup.py` | Deletes all provisioned AWS resources | +| `../utils/gateway_auth.py` | OAuth token retrieval (shared with other demos) | + +## Cleanup (Optional) + +When you're done remove all provisioned AWS resources: + +**1. Retrieve resource IDs** from the setup output (printed when you ran `setup_gateway.py`): + +``` +Gateway ID: +IAM Role: agentcore-web-search-gateway-role +Cognito Pool: +``` + +> **Tip:** If you no longer have the terminal output, the gateway ID is the subdomain prefix in your `AGENTCORE_GATEWAY_URL` (e.g., `gw-abc123` from `https://gw-abc123.gateway.bedrock-agentcore...`). The IAM role follows the pattern `agentcore--role`. + +**2. Run cleanup:** + +```bash +python cleanup.py --gateway-id --user-pool-id --role-name +``` + +| Parameter | Required | Description | +|:----------|:---------|:------------| +| `--gateway-id` | Yes | Gateway ID | +| `--user-pool-id` | Yes | Cognito User Pool ID | +| `--role-name` | Yes | IAM role name | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py new file mode 100644 index 000000000..8d42e1b8b --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py @@ -0,0 +1,129 @@ +""" +Clean up all resources created by the Web Search Tool setup. + +Deletes in order: + 1. Gateway targets and Gateway + 2. Cognito User Pool (domain, clients, pool) + 3. IAM Role and inline policies + +Prerequisites: + pip install -r ../requirements.txt + AWS credentials with permissions to delete the resources. + +Usage: + python cleanup.py --gateway-id --user-pool-id --role-name + python cleanup.py --gateway-id gw-abc123 --user-pool-id us-east-1_AbCdEf --role-name agentcore-web-search-gateway-role +""" + +import argparse +import os +import time + +import boto3 + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") + + +def delete_gateway(gateway_client, gateway_id): + """Delete all targets and the gateway itself.""" + print("\n[1/3] Deleting Gateway resources...") + try: + targets = gateway_client.list_gateway_targets( + gatewayIdentifier=gateway_id, maxResults=100 + ) + for item in targets["items"]: + gateway_client.delete_gateway_target( + gatewayIdentifier=gateway_id, targetId=item["targetId"] + ) + print(f" Deleted target: {item['name']}") + + time.sleep(10) + gateway_client.delete_gateway(gatewayIdentifier=gateway_id) + print(f" Deleted gateway: {gateway_id}") + except Exception as e: + print(f" Error deleting gateway: {e}") + + +def delete_cognito(cognito_client, user_pool_id): + """Delete the Cognito User Pool and its domain.""" + print("\n[2/3] Deleting Cognito resources...") + try: + domain = user_pool_id.replace("_", "").lower() + cognito_client.delete_user_pool_domain( + Domain=domain, UserPoolId=user_pool_id + ) + cognito_client.delete_user_pool(UserPoolId=user_pool_id) + print(f" Deleted user pool: {user_pool_id}") + except Exception as e: + print(f" Error deleting Cognito: {e}") + + +def delete_iam_role(iam_client, role_name): + """Delete the IAM role and its inline policies.""" + print("\n[3/3] Deleting IAM resources...") + try: + policies = iam_client.list_role_policies(RoleName=role_name) + for policy_name in policies["PolicyNames"]: + iam_client.delete_role_policy( + RoleName=role_name, PolicyName=policy_name + ) + print(f" Deleted policy: {policy_name}") + + iam_client.delete_role(RoleName=role_name) + print(f" Deleted role: {role_name}") + except Exception as e: + print(f" Error deleting IAM role: {e}") + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Clean up Web Search Tool Gateway resources" + ) + parser.add_argument( + "--gateway-id", required=True, help="Gateway ID to delete" + ) + parser.add_argument( + "--user-pool-id", required=True, help="Cognito User Pool ID to delete" + ) + parser.add_argument( + "--role-name", required=True, help="IAM role name to delete" + ) + parser.add_argument( + "--region", default=REGION, help="AWS region (default: us-east-1)" + ) + return parser.parse_args() + + +def main(): + args = parse_args() + region = args.region + + print("=" * 60) + print("AgentCore Web Search Tool — Resource Cleanup") + print("=" * 60) + print(f"\nRegion: {region}") + print(f"Gateway ID: {args.gateway_id}") + print(f"User Pool ID: {args.user_pool_id}") + print(f"Role Name: {args.role_name}") + + gateway_client = boto3.client("bedrock-agentcore-control", region_name=region) + cognito_client = boto3.client("cognito-idp", region_name=region) + iam_client = boto3.client("iam") + + delete_gateway(gateway_client, args.gateway_id) + delete_cognito(cognito_client, args.user_pool_id) + delete_iam_role(iam_client, args.role_name) + + # Remove local credentials file + env_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env.web-search") + if os.path.exists(env_file): + os.remove(env_file) + print(f"\n Deleted local credentials file: {env_file}") + + print("\n" + "=" * 60) + print("✅ All resources cleaned up successfully!") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/images/langchain-web-search-architecture.png b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/images/langchain-web-search-architecture.png similarity index 100% rename from 01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/images/langchain-web-search-architecture.png rename to 01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/images/langchain-web-search-architecture.png diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py new file mode 100644 index 000000000..e1fe26293 --- /dev/null +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py @@ -0,0 +1,15 @@ +"""Set up AgentCore Gateway with Web Search Tool — delegates to shared utility. + + Usage: + python setup_gateway.py + python setup_gateway.py --gateway-name my-gateway + python setup_gateway.py --region us-east-1 +""" +import sys +import os + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +from utils.gateway_setup import main + +if __name__ == "__main__": + main() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py similarity index 100% rename from 01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/web_search_langchain.py rename to 01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md deleted file mode 100644 index 822b8f491..000000000 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-strands-agent/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# Web Search with a Strands AI Agent - -## Overview - -This demo shows the complete agent integration: a Strands agent automatically discovers and invokes the Web Search Tool to answer real-time questions with cited sources. - -> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. - - -![Strands Agent web search Architecture](images/strands-web-search-architecture.png) - -## How It Works - -### Tool Discovery - -The agent connects to the Gateway via MCP Streamable HTTP and calls `tools/list`. The Gateway returns the `WebSearch` tool with its input schema. Strands automatically registers it as an available tool for the LLM. - -### Agent Loop - -When you ask a question: - -1. Strands sends the query + tool schema to Claude Sonnet 4 -2. Claude(the Strands Agent model) decides to call `WebSearch` with a concise search query -3. Strands invokes the tool via MCP `tools/call` on the Gateway -4. The Gateway routes to the Web Search connector and returns results -5. Results are fed back to Claude as a tool result -6. Claude synthesizes a final answer with cited sources - -### Shared Agent (`utils/web_search_agent.py`) - -The agent factory handles MCP client setup and tool discovery: - -```python -from utils.web_search_agent import create_agent, create_mcp_client - -mcp_client = create_mcp_client() - -with mcp_client: - agent = create_agent(mcp_client) - result = agent("What is the latest version of Python?") - print(result.message) -``` - -The `create_mcp_client()` function handles OAuth token retrieval and transport creation. The `create_agent()` function discovers tools and configures the Strands agent with an appropriate system prompt. - -## Prerequisites - -```bash -pip install -r ../requirements.txt -``` - -Run `01-setup-gateway/setup_gateway.py` first, then load credentials: `source .env.web-search` - -Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-6`) in us-east-1. - -## Usage - -```bash -# Run default demo queries -python web_search_strands.py - -# Custom query -python web_search_strands.py --query "What are the latest AI announcements?" -python web_search_strands.py --query "Current price of Bitcoin" -``` - -## IAM Permissions - -```json -{ - "Effect": "Allow", - "Action": "bedrock:InvokeModel", - "Resource": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-6" -} -``` - -Gateway invocation is authorized via the Cognito OAuth token — no additional IAM permissions needed for the caller. - -## Files - -| File | Description | -|:-----|:------------| -| `web_search_strands.py` | Main demo script — Strands agent with web search | -| `../utils/web_search_agent.py` | Shared agent factory with MCP client setup | -| `../utils/gateway_auth.py` | OAuth token retrieval and transport creation | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md deleted file mode 100644 index 024e2d75a..000000000 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/04-langchain-agent/README.md +++ /dev/null @@ -1,87 +0,0 @@ -# Web Search with a LangChain Agent - -## Overview - -This demo shows the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore Gateway and `create_react_agent` from LangGraph for the agent loop. - -> 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. - -![Langchain web search Architecture](images/langchain-web-search-architecture.png) - -## How It Works - -### MCP Client Setup - -`langchain-mcp-adapters` provides `MultiServerMCPClient` which connects to one or more MCP servers and converts their tools into LangChain-compatible tool objects: - -```python -from langchain_mcp_adapters.client import MultiServerMCPClient - -async with MultiServerMCPClient({ - "web-search": { - "transport": "streamable_http", - "url": gateway_url, - "headers": {"Authorization": f"Bearer {token}"}, - } -}) as client: - tools = client.get_tools() - # tools is a list of LangChain Tool objects -``` - -### Agent Creation - -The agent uses LangGraph's `create_react_agent` with `ChatBedrockConverse` as the LLM: - -```python -from langchain_aws import ChatBedrockConverse -from langgraph.prebuilt import create_react_agent - -model = ChatBedrockConverse( - model="us.anthropic.claude-sonnet-4-6", - region_name="us-east-1", -) -agent = create_react_agent(model, tools=tools) -result = await agent.ainvoke({"messages": [{"role": "user", "content": query}]}) -``` - -### Async Execution - -LangChain's MCP adapter uses async I/O. The demo wraps the agent call in `asyncio.run()` for CLI usage. - -## Prerequisites - -```bash -pip install -r ../requirements.txt -``` - -Run `01-setup-gateway/setup_gateway.py` first, then load credentials: `source .env.web-search` - -Requires access to Claude Sonnet 4 (`us.anthropic.claude-sonnet-4-6`) in us-east-1. - -## Usage - -```bash -# Default query -python web_search_langchain.py - -# Custom query -python web_search_langchain.py --query "Latest AWS announcements" -python web_search_langchain.py --query "Python 3.13 new features" -``` - -## IAM Permissions - -```json -{ - "Effect": "Allow", - "Action": "bedrock:InvokeModel", - "Resource": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-6" -} -``` - -## Files - -| File | Description | -|:-----|:------------| -| `web_search_langchain.py` | Main demo script — LangChain agent with web search | -| `../utils/gateway_auth.py` | OAuth token retrieval (shared with other demos) | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/README.md deleted file mode 100644 index 5d3ad7ae8..000000000 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Resource Cleanup - -## Overview - -Deletes all AWS resources created by the setup script: Gateway targets, Gateway, Cognito User Pool, and IAM role. - -## Usage - -Use the resource IDs printed by `01-setup-gateway/setup_gateway.py`: - -```bash -python cleanup.py \ - --gateway-id gw-abc123def456 \ - --user-pool-id us-east-1_AbCdEfGh \ - --role-name agentcore-web-search-gateway-role -``` - -## Files - -| File | Description | -|:-----|:------------| -| `cleanup.py` | Deletes Gateway, Cognito, and IAM resources | diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md index 0063b311b..82bcb6707 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md @@ -1,14 +1,41 @@ # AgentCore Web Search Tool -## Overview +![Web Search Tool Architecture](images/tutorial-architecture.png) -[Amazon Bedrock AgentCore Web Search Tool](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) exposes web search as a fully managed, MCP-compliant tool through Amazon Bedrock AgentCore Gateway. Your agents discover and invoke it using the standard Model Context Protocol — no custom integrations, no infrastructure to manage. +[Amazon Bedrock AgentCore Web Search Tool](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-connector-web-search-tool.html) exposes web search as a fully managed, MCP-compliant tool through Amazon Bedrock AgentCore Gateway. Your agents discover and invoke it using the standard Model Context Protocol — no custom integrations, no infrastructure to manage. > 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. -![Web Search Tool Architecture](images/tutorial-architecture.png) +## Key Capabilities + +- **Real-time information access** — Retrieve current web results with titles, URLs, snippets, and publication dates +- **Zero infrastructure management** — No search APIs to provision or scaling to configure +- **Framework agnostic** — Works with Strands Agents, LangChain, LangGraph, CrewAI, or any MCP-compatible client +- **Structured results** — Results returned in both MCP `content` (text) and `structuredContent` (typed JSON) formats +- **MCP-native** — Standard `tools/list` and `tools/call` protocol; no custom SDK required + +## Tutorials + +| Section | Description | +|:--------|:------------| +| [01-raw-mcp/](01-raw-mcp/) | Direct MCP tool discovery and invocation without an agent framework | +| [02-strands-agent/](02-strands-agent/) | Full agent loop with Strands Agents — automatic tool selection and cited responses | +| [03-langchain-agent/](03-langchain-agent/) | Full agent loop using LangChain + LangGraph with MCP adapter | + +## Prerequisites + +- AWS account with Amazon Bedrock enabled in **us-east-1** +- Python 3.10+ +- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions +- Model access enabled for Claude Sonnet 4 (cross-region inference profile) + +```bash +pip install -r requirements.txt +``` -## How the Web Search Tool Works +> **Note:** The Web Search Tool connector is currently available in **us-east-1** only. + +## Core Concepts ### Gateway + Connector Architecture @@ -16,13 +43,6 @@ The Web Search Tool uses the **connector** target type — a fully AWS-managed i ![Web search with Amazon Bedrock AgentCore Gateway](images/agentcore-web-search-architecture.png) -### Key Capabilities - -- **Real-time information access** — Retrieve current web results with titles, URLs, snippets, and publication dates -- **Zero infrastructure management** — No search APIs to provision or scaling to configure -- **Framework agnostic** — Works with Strands Agents, LangChain, LangGraph, CrewAI, or any MCP-compatible client -- **Structured results** — Results returned in both MCP `content` (text) and `structuredContent` (typed JSON) formats - ### How It Works 1. **Gateway setup** — Create an AgentCore Gateway and add a Web Search Tool target using `connectorId: "web-search"` @@ -60,137 +80,32 @@ The Web Search Tool uses the **connector** target type — a fully AWS-managed i - **Inbound**: Amazon Cognito with `client_credentials` OAuth flow (can use other OAuth providers) - **Outbound**: Automatic — the Gateway uses its own IAM role to authenticate to the Web Search backend -## Demos - -| Folder | Framework | What You'll Learn | -|:-------|:----------|:------------------| -| [01-setup-gateway/](01-setup-gateway/) | boto3 (SDK) | Create IAM role, Cognito, Gateway, and Web Search target | -| [02-raw-mcp/](02-raw-mcp/) | MCP protocol | Direct tool discovery and invocation without an agent | -| [03-strands-agent/](03-strands-agent/) | Strands Agents | Full agent loop with automatic tool selection and cited responses | -| [04-langchain-agent/](04-langchain-agent/) | LangChain + LangGraph | Full agent loop integration using LangChain's MCP adapter | -| [05-cleanup/](05-cleanup/) | boto3 (SDK) | Delete all resources created by the setup | - -## Prerequisites - -Before running the agent demos (steps 3–4 in Quick Start), your AWS account must have model access enabled for the Bedrock model you intend to use. - -**Default model**: `us.anthropic.claude-sonnet-4-5-20250514-v1:0` (cross-region inference profile) - -To use a different model, export `BEDROCK_MODEL_ID` before running any agent demo: - -```bash -export BEDROCK_MODEL_ID="us.anthropic.claude-3-5-sonnet-20241022-v2:0" -``` - -> **Note:** On-demand model IDs (e.g. `anthropic.claude-sonnet-4-5-20250929-v1:0`) are not supported directly — you must use a cross-region inference profile ID (prefixed with `us.`, `eu.`, or `ap.`) or an inference profile ARN. See [Supported models and Regions for cross-Region inference](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html) for the full list. - -To enable model access in your account: -1. Open the [Amazon Bedrock console](https://console.aws.amazon.com/bedrock/) -2. Go to **Model access** in the left navigation -3. Request access for the model you want to use - -## Quick Start +## End-to-End Example ```bash pip install -r requirements.txt -# Step 1: Create Gateway and Web Search target -python 01-setup-gateway/setup_gateway.py +# Create Gateway and Web Search target (run from any sample folder) +python 01-raw-mcp/setup_gateway.py -# Step 2: Load the credentials written by setup +# Load credentials source .env.web-search -# Optional: override the default Bedrock model -export BEDROCK_MODEL_ID="us.anthropic.claude-3-5-sonnet-20241022-v2:0" - -# Step 3: Verify with raw MCP calls -python 02-raw-mcp/raw_mcp_call.py - -# Step 4: Run with Strands agent -python 03-strands-agent/web_search_strands.py - -# Step 5: Run with LangChain agent -python 04-langchain-agent/web_search_langchain.py - -# Cleanup when done -python 05-cleanup/cleanup.py --gateway-id --user-pool-id --role-name -``` - -## Shared Utilities - -Demos 02–04 share utilities in `utils/`: - -```python -from utils.gateway_auth import get_oauth_token, create_streamable_http_transport -from utils.web_search_agent import create_agent, create_mcp_client -``` - -- `gateway_auth.py` — OAuth token retrieval from Cognito and MCP transport factory -- `web_search_agent.py` — Strands agent factory with Web Search tools +# Verify with raw MCP calls +python 01-raw-mcp/raw_mcp_call.py -## IAM Permissions +# Run with Strands agent +python 02-strands-agent/web_search_strands.py -### Caller (setup script) +# Run with LangChain agent +python 03-langchain-agent/web_search_langchain.py -```json -{ - "Effect": "Allow", - "Action": [ - "iam:CreateRole", - "iam:PutRolePolicy", - "iam:GetRole", - "cognito-idp:CreateUserPool", - "cognito-idp:CreateUserPoolDomain", - "cognito-idp:CreateResourceServer", - "cognito-idp:CreateUserPoolClient", - "bedrock-agentcore:CreateGateway", - "bedrock-agentcore:GetGateway", - "bedrock-agentcore:CreateGatewayTarget", - "bedrock-agentcore:ListGatewayTargets" - ], - "Resource": "*" -} +# Cleanup when done (run from any sample folder) +python 01-raw-mcp/cleanup.py --gateway-id --user-pool-id --role-name ``` -### Caller (agent demos) - -```json -{ - "Effect": "Allow", - "Action": "bedrock:InvokeModel", - "Resource": "*" -} -``` - -### Gateway Service Role (created by setup) - -```json -{ - "Effect": "Allow", - "Action": [ - "bedrock-agentcore:InvokeGateway", - "bedrock-agentcore:InvokeWebSearch" - ], - "Resource": [ - "arn:aws:bedrock-agentcore:us-east-1::gateway/*", - "arn:aws:bedrock-agentcore:us-east-1:aws:tool/web-search.v1" - ] -} -``` - -## Region Availability - -The Web Search Tool connector is currently available in **us-east-1** only. - -## Files +## Documentation -| File | Description | -|:-----|:------------| -| `requirements.txt` | Python dependencies for all sub-demos | -| `utils/gateway_auth.py` | Shared OAuth and MCP transport utilities | -| `utils/web_search_agent.py` | Shared Strands agent factory | -| `01-setup-gateway/` | Gateway and target creation script | -| `02-raw-mcp/` | Direct MCP protocol demo | -| `03-strands-agent/` | Strands agent demo | -| `04-langchain-agent/` | LangChain agent demo | -| `05-cleanup/` | Resource deletion script | +- [Web Search Tool connector](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-connector-web-search-tool.html) +- [AgentCore Gateway](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) +- [Supported models for cross-region inference](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt b/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt index f7769b56a..ee73c7891 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt @@ -1,4 +1,5 @@ -boto3 +boto3>=1.38.0 +botocore>=1.38.0 strands-agents>=0.1.8 mcp requests diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py similarity index 98% rename from 01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py rename to 01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py index dc287a505..7b4798978 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py @@ -336,8 +336,10 @@ def main(): print("SETUP COMPLETE") print("=" * 60) - # Write credentials to a local .env file (avoids logging secrets to stdout) - env_file = ".env.web-search" + # Write credentials to a local .env file next to the script that invoked setup + caller_dir = os.path.dirname(os.path.abspath(sys.argv[0])) if sys.argv[0] else os.getcwd() + env_file = os.path.join(caller_dir, ".env.web-search") + with open(env_file, "w") as f: f.write(f"export AGENTCORE_GATEWAY_URL=\"{gateway_url}\"\n") f.write(f"export COGNITO_DOMAIN=\"{cognito_config['domain']}\"\n") diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/README.md b/02-use-cases/01-conversational-agents/deep-research-agent/README.md index 5521c6df7..cd26843e0 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/README.md +++ b/02-use-cases/01-conversational-agents/deep-research-agent/README.md @@ -37,7 +37,7 @@ Single-shot web search works for simple factual queries. For questions that requ - "What are the current best practices for deploying LLM agents in production, based on recent industry reports?" - "What are the trade-offs between RAG and fine-tuning for enterprise LLM applications?" -## Architecture +## Use Case Architecture ![Deep Research Agent with Amazon Bedrock AgentCore](images/deep-research-agent-architecture.png) @@ -151,16 +151,25 @@ When deployed, invoke via the AgentCore Runtime API: ## Cleanup -When you're done, remove all provisioned resources using the shared cleanup script: +When you're done, remove all provisioned resources: ```bash -python ../../../01-features/03-connect-your-agent-to-anything/03-web-search/05-cleanup/cleanup.py \ - --gateway-id \ - --user-pool-id \ - --role-name +python cleanup.py --gateway-id --user-pool-id --role-name ``` -The gateway ID, role name, and user pool ID are printed during provisioning. After cleanup, unset environment variables: +| Parameter | Required | Description | +|:----------|:---------|:------------| +| `--gateway-id` | Yes | Gateway ID (printed during provisioning) | +| `--user-pool-id` | Yes | Cognito User Pool ID (printed during provisioning) | +| `--role-name` | Yes | IAM role name (printed during provisioning) | + +The cleanup script will: +- Delete the Gateway and all its targets +- Delete the Cognito User Pool and domain +- Delete the IAM service role and inline policies +- Remove the local `.env.web-search` credentials file + +After cleanup, unset environment variables: ```bash unset AGENTCORE_GATEWAY_URL COGNITO_DOMAIN COGNITO_CLIENT_ID COGNITO_CLIENT_SECRET COGNITO_SCOPE @@ -192,6 +201,7 @@ See the Prerequisites section above for the full list of permissions needed to c |:-----|:------------| | `deep_research_agent.py` | Main agent — Plan/Search/Reflect loop, AgentCore Runtime entrypoint, and CLI | | `gateway_setup.py` | Auto-detection and provisioning of Gateway + Web Search infrastructure | +| `cleanup.py` | Deletes all provisioned AWS resources and local credentials | | `requirements.txt` | Python dependencies | | `README.md` | This file | diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/cleanup.py b/02-use-cases/01-conversational-agents/deep-research-agent/cleanup.py new file mode 100644 index 000000000..1f99865ed --- /dev/null +++ b/02-use-cases/01-conversational-agents/deep-research-agent/cleanup.py @@ -0,0 +1,135 @@ +""" +Clean up all resources provisioned by the Deep Research Agent. + +Deletes in order: + 1. Gateway targets and Gateway + 2. Cognito User Pool (domain, clients, pool) + 3. IAM Role and inline policies + 4. Local .env.web-search credentials file + +Prerequisites: + pip install -r requirements.txt + AWS credentials with permissions to delete the resources. + +Usage: + python cleanup.py --gateway-id --user-pool-id --role-name + python cleanup.py --gateway-id gw-abc123 --user-pool-id us-east-1_AbCdEf --role-name agentcore-web-search-gateway-role +""" + +import argparse +import os +import time + +import boto3 + +REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") + + +def delete_gateway(gateway_client, gateway_id): + """Delete all targets and the gateway itself.""" + print("\n[1/3] Deleting Gateway resources...") + try: + targets = gateway_client.list_gateway_targets( + gatewayIdentifier=gateway_id, maxResults=100 + ) + for item in targets["items"]: + gateway_client.delete_gateway_target( + gatewayIdentifier=gateway_id, targetId=item["targetId"] + ) + print(f" Deleted target: {item['name']}") + + time.sleep(10) + gateway_client.delete_gateway(gatewayIdentifier=gateway_id) + print(f" Deleted gateway: {gateway_id}") + except Exception as e: + print(f" Error deleting gateway: {e}") + + +def delete_cognito(cognito_client, user_pool_id): + """Delete the Cognito User Pool and its domain.""" + print("\n[2/3] Deleting Cognito resources...") + try: + domain = user_pool_id.replace("_", "").lower() + cognito_client.delete_user_pool_domain( + Domain=domain, UserPoolId=user_pool_id + ) + cognito_client.delete_user_pool(UserPoolId=user_pool_id) + print(f" Deleted user pool: {user_pool_id}") + except Exception as e: + print(f" Error deleting Cognito: {e}") + + +def delete_iam_role(iam_client, role_name): + """Delete the IAM role and its inline policies.""" + print("\n[3/3] Deleting IAM resources...") + try: + policies = iam_client.list_role_policies(RoleName=role_name) + for policy_name in policies["PolicyNames"]: + iam_client.delete_role_policy( + RoleName=role_name, PolicyName=policy_name + ) + print(f" Deleted policy: {policy_name}") + + iam_client.delete_role(RoleName=role_name) + print(f" Deleted role: {role_name}") + except Exception as e: + print(f" Error deleting IAM role: {e}") + + +def delete_env_file(): + """Remove local .env.web-search credentials file.""" + env_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env.web-search") + if os.path.exists(env_file): + os.remove(env_file) + print(f"\n Deleted local credentials file: {env_file}") + + +def parse_args(): + parser = argparse.ArgumentParser( + description="Clean up Deep Research Agent Gateway resources" + ) + parser.add_argument( + "--gateway-id", required=True, help="Gateway ID to delete" + ) + parser.add_argument( + "--user-pool-id", required=True, help="Cognito User Pool ID to delete" + ) + parser.add_argument( + "--role-name", required=True, help="IAM role name to delete" + ) + parser.add_argument( + "--region", default=REGION, help="AWS region (default: us-east-1)" + ) + return parser.parse_args() + + +def main(): + args = parse_args() + region = args.region + + print("=" * 60) + print("Deep Research Agent — Resource Cleanup") + print("=" * 60) + print(f"\nRegion: {region}") + print(f"Gateway ID: {args.gateway_id}") + print(f"User Pool ID: {args.user_pool_id}") + print(f"Role Name: {args.role_name}") + + gateway_client = boto3.client("bedrock-agentcore-control", region_name=region) + cognito_client = boto3.client("cognito-idp", region_name=region) + iam_client = boto3.client("iam") + + delete_gateway(gateway_client, args.gateway_id) + delete_cognito(cognito_client, args.user_pool_id) + delete_iam_role(iam_client, args.role_name) + delete_env_file() + + print("\n" + "=" * 60) + print("✅ All resources cleaned up successfully!") + print("=" * 60) + print("\n💡 Remember to unset environment variables:") + print(" unset AGENTCORE_GATEWAY_URL COGNITO_DOMAIN COGNITO_CLIENT_ID COGNITO_CLIENT_SECRET COGNITO_SCOPE") + + +if __name__ == "__main__": + main() diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt b/02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt index 449dc1750..46b6c671a 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt +++ b/02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt @@ -1,6 +1,6 @@ bedrock-agentcore>=0.2.0 strands-agents>=0.1.8 -boto3>=1.34.0 -botocore>=1.34.0 +boto3>=1.38.0 +botocore>=1.38.0 mcp -requests +requests \ No newline at end of file From 23cba1243ac23277f2f291aafa74c8e4f6daa3e1 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Thu, 18 Jun 2026 12:41:42 -0400 Subject: [PATCH 14/21] Testing post NY Summit boto3 sdk release --- .../03-web-search/01-raw-mcp/README.md | 1 + .../03-web-search/01-raw-mcp/raw_mcp_call.py | 2 +- .../03-web-search/02-strands-agent/README.md | 3 ++- .../03-web-search/03-langchain-agent/README.md | 4 ++-- .../03-langchain-agent/web_search_langchain.py | 5 +++-- .../03-web-search/requirements.txt | 4 ++-- .../03-web-search/utils/gateway_setup.py | 6 ++++++ .../01-conversational-agents/deep-research-agent/README.md | 2 +- .../deep-research-agent/requirements.txt | 4 ++-- 9 files changed, 20 insertions(+), 11 deletions(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md index ac591c89b..ac240e675 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md @@ -77,6 +77,7 @@ Calling the tool with a query returns structured results: ```bash # Install dependencies pip install -r ../requirements.txt +#python3 -m pip install --upgrade --force-reinstall boto3 # Set up the Gateway (creates IAM role, Cognito, Gateway, Web Search target) python setup_gateway.py diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py index 3d66b2479..8defc824e 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py @@ -41,7 +41,7 @@ # ── Configuration ───────────────────────────────────────────────────────────── -DEFAULT_QUERY = "what is tesla stock price right now?" +DEFAULT_QUERY = "Tesla stock price right now?" # ── Main ────────────────────────────────────────────────────────────────────── diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md index f58b45dea..23547339a 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md @@ -21,7 +21,8 @@ pip install -r ../requirements.txt ```bash # 1. Set up the Gateway (creates IAM role, Cognito, Gateway, Web Search target) -python setup_gateway.py +#python setup_gateway.py +python setup_gateway.py --gateway-name strands-web-search-gw # 2. Load credentials into your shell source .env.web-search diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md index 5e0b89113..b7c6ad2a1 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md @@ -21,8 +21,8 @@ pip install -r ../requirements.txt ```bash # 1. Set up the Gateway (creates IAM role, Cognito, Gateway, Web Search target) -python setup_gateway.py -#python setup_gateway.py --gateway-name my-web-search-gw +#python setup_gateway.py +python setup_gateway.py --gateway-name langchain-web-search-gw # 2. Load credentials into your shell source .env.web-search diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py index 096d84619..491e6ae97 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py @@ -41,7 +41,7 @@ from langchain_aws import ChatBedrockConverse from langchain_mcp_adapters.client import MultiServerMCPClient -from langgraph.prebuilt import create_react_agent # noqa: E402 — stable in langgraph>=1.0 +from langchain.agents import create_agent # ── Configuration ───────────────────────────────────────────────────────────── @@ -84,7 +84,8 @@ async def run_agent(query: str): print(f" Discovered {len(tools)} tool(s)") # Create and run the agent - agent = create_react_agent(model, tools=tools) + #agent = create_react_agent(model, tools=tools) + agent = create_agent(model, tools=tools) result = await agent.ainvoke( {"messages": [{"role": "user", "content": query}]} ) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt b/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt index ee73c7891..d8c552bb4 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/requirements.txt @@ -1,5 +1,5 @@ -boto3>=1.38.0 -botocore>=1.38.0 +boto3 +botocore strands-agents>=0.1.8 mcp requests diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py index 7b4798978..a25667e4f 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py @@ -33,8 +33,10 @@ import argparse import json import os +import sys import time + import boto3 # ── Configuration ───────────────────────────────────────────────────────────── @@ -347,6 +349,10 @@ def main(): f.write(f"export COGNITO_CLIENT_SECRET=\"{cognito_config['client_secret']}\"\n") # noqa: E501 f.write(f"export COGNITO_SCOPE=\"{cognito_config['scope']}\"\n") f.write(f"export AWS_DEFAULT_REGION=\"{region}\"\n") + f.write(f'export GATEWAY_ID="{gateway_id}"\n') + f.write(f'export USER_POOL_ID="{cognito_config["user_pool_id"]}"\n') + f.write(f'export ROLE_NAME="{role_name}"\n') + f.write(f'# Cleanup resource IDs\n') print(f"\n✅ Credentials written to: {env_file}") print(" Load them with: source .env.web-search\n") diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/README.md b/02-use-cases/01-conversational-agents/deep-research-agent/README.md index cd26843e0..d016196dd 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/README.md +++ b/02-use-cases/01-conversational-agents/deep-research-agent/README.md @@ -130,7 +130,7 @@ export COGNITO_SCOPE="agentcore-websearch/invoke" export AWS_DEFAULT_REGION="us-east-1" ``` -### 4. Deploy to AgentCore Runtime +### 4. (Optional) Deploy to AgentCore Runtime For runtime deployments, environment variables **must** be pre-configured in the container environment (no interactive provisioning in runtime mode): diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt b/02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt index 46b6c671a..bf6ee953e 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt +++ b/02-use-cases/01-conversational-agents/deep-research-agent/requirements.txt @@ -1,6 +1,6 @@ bedrock-agentcore>=0.2.0 strands-agents>=0.1.8 -boto3>=1.38.0 -botocore>=1.38.0 +boto3 +botocore mcp requests \ No newline at end of file From f7bb89982f5db9004a2ed11d7450ee1649c140e8 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Mon, 22 Jun 2026 17:48:34 -0400 Subject: [PATCH 15/21] Changes to follow naming convention 'AgentCore gateway ' AgentCore web search + Updated websearch tutorialarchitecture + web search supported regions and note --- .../03-web-search/01-raw-mcp/README.md | 4 ++-- .../03-web-search/01-raw-mcp/cleanup.py | 2 +- .../03-web-search/01-raw-mcp/raw_mcp_call.py | 6 +++--- .../03-web-search/01-raw-mcp/setup_gateway.py | 2 +- .../03-web-search/02-strands-agent/README.md | 2 +- .../03-web-search/02-strands-agent/cleanup.py | 2 +- .../02-strands-agent/setup_gateway.py | 2 +- .../02-strands-agent/web_search_strands.py | 4 ++-- .../03-langchain-agent/README.md | 4 ++-- .../03-langchain-agent/cleanup.py | 2 +- .../03-langchain-agent/setup_gateway.py | 2 +- .../web_search_langchain.py | 4 ++-- .../03-web-search/README.md | 14 +++++++------- .../images/tutorial-architecture.png | Bin 31128 -> 50098 bytes .../03-web-search/utils/gateway_auth.py | 2 +- .../03-web-search/utils/gateway_setup.py | 16 ++++++++-------- .../03-web-search/utils/web_search_agent.py | 6 +++--- .../README.md | 10 +++++----- 01-features/README.md | 3 ++- .../deep-research-agent/README.md | 16 ++++++++-------- .../deep-research-agent/gateway_setup.py | 2 +- README.md | 4 ++-- 22 files changed, 55 insertions(+), 54 deletions(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md index ac240e675..c67b60124 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/README.md @@ -2,7 +2,7 @@ ## Overview -This example calls the AgentCore Gateway directly over the MCP protocol — no agent framework involved. It's the simplest way to verify your Gateway and Web Search Tool target are working correctly. +This example calls the AgentCore gateway directly over the MCP protocol — no agent framework involved. It's the simplest way to verify your Gateway and Web Search Tool target are working correctly. > 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. @@ -12,7 +12,7 @@ This example calls the AgentCore Gateway directly over the MCP protocol — no a - Python 3.10+ - AWS account with Amazon Bedrock enabled in **us-east-1** -- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions +- AWS credentials with IAM, Cognito, and AgentCore gateway permissions ## How It Works diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py index 8d42e1b8b..98157b22e 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py @@ -99,7 +99,7 @@ def main(): region = args.region print("=" * 60) - print("AgentCore Web Search Tool — Resource Cleanup") + print("AgentCore web search tool — Resource Cleanup") print("=" * 60) print(f"\nRegion: {region}") print(f"Gateway ID: {args.gateway_id}") diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py index 8defc824e..4d86c18a5 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py @@ -1,5 +1,5 @@ """ -Raw MCP Tool Discovery and Invocation against AgentCore Gateway. +Raw MCP Tool Discovery and Invocation against AgentCore gateway. Demonstrates direct MCP protocol calls without an agent framework: 1. Connect to the Gateway using MCP Streamable HTTP transport @@ -49,7 +49,7 @@ def parse_args(): parser = argparse.ArgumentParser( - description="Raw MCP tool discovery and invocation against AgentCore Gateway" + description="Raw MCP tool discovery and invocation against AgentCore gateway" ) parser.add_argument( "--query", @@ -63,7 +63,7 @@ def main(): args = parse_args() print("=" * 60) - print("AgentCore Web Search Tool — Raw MCP Calls") + print("AgentCore web search tool — Raw MCP Calls") print("=" * 60) # Create MCP client diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py index b10080a6c..30c6a7121 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py @@ -1,4 +1,4 @@ -"""Set up AgentCore Gateway with Web Search Tool — delegates to shared utility. +"""Set up AgentCore gateway with Web Search Tool — delegates to shared utility. After running this script, load credentials with `source .env.web-search` to use with the other web search examples. diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md index 23547339a..f8a3e63ea 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md @@ -10,7 +10,7 @@ This example shows the complete agent integration: a Strands agent automatically - Python 3.10+ - AWS account with Amazon Bedrock enabled in **us-east-1** -- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions +- AWS credentials with IAM, Cognito, and AgentCore gateway permissions - Claude Sonnet 4 model access enabled in Bedrock ```bash diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py index 8d42e1b8b..98157b22e 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py @@ -99,7 +99,7 @@ def main(): region = args.region print("=" * 60) - print("AgentCore Web Search Tool — Resource Cleanup") + print("AgentCore web search tool — Resource Cleanup") print("=" * 60) print(f"\nRegion: {region}") print(f"Gateway ID: {args.gateway_id}") diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py index b10080a6c..30c6a7121 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py @@ -1,4 +1,4 @@ -"""Set up AgentCore Gateway with Web Search Tool — delegates to shared utility. +"""Set up AgentCore gateway with Web Search Tool — delegates to shared utility. After running this script, load credentials with `source .env.web-search` to use with the other web search examples. diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py index 87d6bddc0..b58416fc1 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py @@ -68,7 +68,7 @@ def run_query(agent, query: str): def parse_args(): parser = argparse.ArgumentParser( - description="Strands agent with Web Search Tool via AgentCore Gateway" + description="Strands agent with Web Search Tool via AgentCore gateway" ) parser.add_argument( "--query", @@ -82,7 +82,7 @@ def main(): args = parse_args() print("=" * 60) - print("AgentCore Web Search Tool — Strands Agent") + print("AgentCore web search tool — Strands Agent") print("=" * 60) mcp_client = create_mcp_client() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md index b7c6ad2a1..5a85c0dfb 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/README.md @@ -2,7 +2,7 @@ ## Overview -This demo shows the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore Gateway and `create_react_agent` from LangGraph for the agent loop. +This demo shows the same Web Search Tool integration using LangChain and LangGraph instead of Strands. It uses `langchain-mcp-adapters` to connect to the AgentCore gateway and `create_react_agent` from LangGraph for the agent loop. ![Langchain web search Architecture](images/langchain-web-search-architecture.png) @@ -10,7 +10,7 @@ This demo shows the same Web Search Tool integration using LangChain and LangGra - Python 3.10+ - AWS account with Amazon Bedrock enabled in **us-east-1** -- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions +- AWS credentials with IAM, Cognito, and AgentCore gateway permissions - Claude Sonnet 4 model access enabled in Bedrock ```bash diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py index 8d42e1b8b..98157b22e 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py @@ -99,7 +99,7 @@ def main(): region = args.region print("=" * 60) - print("AgentCore Web Search Tool — Resource Cleanup") + print("AgentCore web search tool — Resource Cleanup") print("=" * 60) print(f"\nRegion: {region}") print(f"Gateway ID: {args.gateway_id}") diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py index e1fe26293..c11b1b6f9 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py @@ -1,4 +1,4 @@ -"""Set up AgentCore Gateway with Web Search Tool — delegates to shared utility. +"""Set up AgentCore gateway with Web Search Tool — delegates to shared utility. Usage: python setup_gateway.py diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py index 491e6ae97..00d9c0f43 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py @@ -105,7 +105,7 @@ async def run_agent(query: str): def parse_args(): parser = argparse.ArgumentParser( - description="LangChain agent with Web Search Tool via AgentCore Gateway" + description="LangChain agent with Web Search Tool via AgentCore gateway" ) parser.add_argument( "--query", @@ -119,7 +119,7 @@ def main(): args = parse_args() print("=" * 60) - print("AgentCore Web Search Tool — LangChain Agent") + print("AgentCore web search tool — LangChain Agent") print("=" * 60) print(f"\nQuery: {args.query}\n") diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md index 82bcb6707..ba817c7df 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/README.md @@ -1,8 +1,8 @@ -# AgentCore Web Search Tool +# AgentCore web search tool ![Web Search Tool Architecture](images/tutorial-architecture.png) -[Amazon Bedrock AgentCore Web Search Tool](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-connector-web-search-tool.html) exposes web search as a fully managed, MCP-compliant tool through Amazon Bedrock AgentCore Gateway. Your agents discover and invoke it using the standard Model Context Protocol — no custom integrations, no infrastructure to manage. +[Amazon Bedrock AgentCore web search tool](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-connector-web-search-tool.html) exposes web search as a fully managed, MCP-compliant tool through Amazon Bedrock AgentCore gateway. Your agents discover and invoke it using the standard Model Context Protocol — no custom integrations, no infrastructure to manage. > 🔒 **Search Privacy**: The Web Search Tool queries an AWS-maintained search index. Queries do not route to any third-party search engines or external providers. @@ -26,14 +26,14 @@ - AWS account with Amazon Bedrock enabled in **us-east-1** - Python 3.10+ -- AWS credentials with IAM, Cognito, and AgentCore Gateway permissions +- AWS credentials with IAM, Cognito, and AgentCore gateway permissions - Model access enabled for Claude Sonnet 4 (cross-region inference profile) ```bash pip install -r requirements.txt ``` -> **Note:** The Web Search Tool connector is currently available in **us-east-1** only. +> **Note:** The Web Search Tool connector is available in [supported regions](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-connector-web-search-tool.html#gateway-target-connector-web-search-tool-availability). Set your region accordingly when running the setup script. ## Core Concepts @@ -41,11 +41,11 @@ pip install -r requirements.txt The Web Search Tool uses the **connector** target type — a fully AWS-managed integration that requires no schema, no endpoint configuration, and no outbound credential setup. You specify `connectorId: "web-search"` and the Gateway handles everything else. -![Web search with Amazon Bedrock AgentCore Gateway](images/agentcore-web-search-architecture.png) +![Web search with Amazon Bedrock AgentCore gateway](images/agentcore-web-search-architecture.png) ### How It Works -1. **Gateway setup** — Create an AgentCore Gateway and add a Web Search Tool target using `connectorId: "web-search"` +1. **Gateway setup** — Create an AgentCore gateway and add a Web Search Tool target using `connectorId: "web-search"` 2. **Tool discovery** — Your agent calls `tools/list` on the Gateway endpoint and discovers `WebSearch` with its input schema 3. **Search invocation** — Your agent calls `tools/call` with a natural language query (up to 200 characters) 4. **Structured results** — The tool returns results with text snippets, URLs, titles, and publication dates @@ -107,5 +107,5 @@ python 01-raw-mcp/cleanup.py --gateway-id --user-pool-id --role-name < ## Documentation - [Web Search Tool connector](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-connector-web-search-tool.html) -- [AgentCore Gateway](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) +- [AgentCore gateway](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) - [Supported models for cross-region inference](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/images/tutorial-architecture.png b/01-features/03-connect-your-agent-to-anything/03-web-search/images/tutorial-architecture.png index d7d044ca4ec974212f19d4e0613c01ef01750c75..36eb0484d14fae1dc59334d7a29c2dadf23e1a69 100644 GIT binary patch literal 50098 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 L*GMN@%QonLJ?TAbgMGhf|C?(z9C8cypcT0zF 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 MCPClient: - """Create an MCPClient connected to the AgentCore Gateway. + """Create an MCPClient connected to the AgentCore gateway. Args: gateway_url: The Gateway MCP endpoint URL. diff --git a/01-features/03-connect-your-agent-to-anything/README.md b/01-features/03-connect-your-agent-to-anything/README.md index 6fa5e51d9..a9a6e4ee7 100644 --- a/01-features/03-connect-your-agent-to-anything/README.md +++ b/01-features/03-connect-your-agent-to-anything/README.md @@ -8,11 +8,11 @@ Give your agents access to powerful built-in tool environments — sandboxed cod |:-------|:--------------| | [`01-code-interpreter/`](./01-code-interpreter/) | Sandboxed Python execution environment — run code, execute shell commands, upload and read files, use the AWS CLI, all in an isolated per-session sandbox | | [`02-browser/`](./02-browser/) | Fully managed headless Chromium browser — drive it with Nova Act, Browser-Use, Strands, or raw Playwright via the Chrome DevTools Protocol | -| [`03-web-search/`](./03-web-search/) | Real-time web search as an MCP-compliant tool — ground your agents in current information via AgentCore Gateway with zero infrastructure to manage | +| [`03-web-search/`](./03-web-search/) | Real-time web search as an MCP-compliant tool — ground your agents in current information via AgentCore gateway with zero infrastructure to manage | ## How these tools work -Code Interpreter and Browser follow the same pattern: AgentCore provisions an isolated sandbox session on demand, your agent calls tool APIs within that session, and the session terminates when you stop it. Web Search uses a different pattern — it's exposed as an MCP-compliant connector through AgentCore Gateway, so your agent discovers and invokes it via standard MCP protocol calls. All three require no infrastructure to manage. +Code Interpreter and Browser follow the same pattern: AgentCore provisions an isolated sandbox session on demand, your agent calls tool APIs within that session, and the session terminates when you stop it. Web Search uses a different pattern — it's exposed as an MCP-compliant connector through AgentCore gateway, so your agent discovers and invokes it via standard MCP protocol calls. All three require no infrastructure to manage. ### Code Interpreter @@ -47,7 +47,7 @@ with browser_session("us-west-2") as client: ### Web Search Tool -- **What it is**: A fully managed web search connector exposed through AgentCore Gateway via MCP +- **What it is**: A fully managed web search connector exposed through AgentCore gateway via MCP - **Use it for**: Agents that need real-time information — current events, latest releases, fact-checking, competitive intelligence - **Entry point**: Create a Gateway with `connectorId: "web-search"`, then connect any MCP client @@ -79,7 +79,7 @@ python 02-browser/01-nova-act/getting_started.py \ # Web Search Tool pip install -r 03-web-search/requirements.txt -python 03-web-search/01-setup-gateway/setup_gateway.py +python 03-web-search/01-raw-mcp/setup_gateway.py # Load the credentials written by setup: source .env.web-search python 03-web-search/03-strands-agent/web_search_strands.py @@ -89,5 +89,5 @@ python 03-web-search/03-strands-agent/web_search_strands.py - [Code Interpreter — Developer Guide](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-overview.html) - [Browser Tool — Developer Guide](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/browser-tool-overview.html) -- [AgentCore Gateway — Developer Guide](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) +- [AgentCore gateway — Developer Guide](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) - [boto3 Data Plane Reference (`bedrock-agentcore`)](https://docs.aws.amazon.com/boto3/latest/reference/services/bedrock-agentcore.html) diff --git a/01-features/README.md b/01-features/README.md index b19e3290d..2ab63944f 100644 --- a/01-features/README.md +++ b/01-features/README.md @@ -21,6 +21,7 @@ AgentCore services work together or independently with any open-source framework | **payments** | Microtransaction payments for agents via the x402 protocol — wallet integration, configurable spending limits, and end-to-end observability. | | **code interpreter** | Isolated sandbox for agents to execute Python, JavaScript, and TypeScript code. | | **browser** | Managed cloud browser for agents to interact with web applications, navigate sites, fill forms, and extract information. | +| **web search** | Real-time web search as a managed MCP connector through AgentCore gateway. Agents discover and invoke it via standard MCP protocol — no search APIs to provision. | | **harness** | Serverless agent orchestration layer — model, tools, system prompt, and context management in a single API call, without managing a runtime. | ![AgentCore map](../00-getting-started/images/agentcore-map.png) @@ -78,7 +79,7 @@ data = boto3.client('bedrock-agentcore', region_name='us-west-2') |:--|:-------|:--------------| | 01 | [harness](01-harness/) | Serverless agent orchestration environment — model, tools, sandbox, and session management in a single API call | | 02 | [host your agent](02-host-your-agent/) | Deploy agents and MCP tool servers on AgentCore runtime; multi-protocol (HTTP, MCP, A2A, AG-UI), streaming, sessions, async, VPC, and coding agents | -| 03 | [connect your agent to anything](03-connect-your-agent-to-anything/) | Built-in managed tools: sandboxed Python code execution (Code Interpreter) and headless browser automation (Browser Tool) | +| 03 | [connect your agent to anything](03-connect-your-agent-to-anything/) | Built-in managed tools: sandboxed Python code execution (Code Interpreter), headless browser automation (Browser Tool), and real-time web search (Web Search Tool) | | 04 | [manage context of your agent](04-manage-context-of-your-agent/) | Short-term session memory and long-term persistent memory for context-aware agents | | 05 | [authenticate and authorize](05-authenticate-and-authorize/) | Inbound auth (Cognito, Entra ID, Okta, PingFederate) and outbound auth (OAuth2, API keys, 3LO, M2M, OBO) | | 06 | [observe, evaluate, and optimize](06-observe-evaluate-optimize-your-agent/) | Trace and debug with OpenTelemetry, evaluate with LLM-as-a-judge and ground-truth evaluators, optimize prompts and tool descriptions | diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/README.md b/02-use-cases/01-conversational-agents/deep-research-agent/README.md index d016196dd..2eb4f1167 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/README.md +++ b/02-use-cases/01-conversational-agents/deep-research-agent/README.md @@ -12,7 +12,7 @@ Single-shot web search works for simple factual queries. For questions that requ |:------------|:--------| | Use case type | Research / Question answering | | Agent type | Single agent | -| AgentCore components | AgentCore Gateway, AgentCore Runtime | +| AgentCore components | AgentCore gateway, AgentCore runtime | | Agentic framework | Strands Agents | | LLM model | Anthropic Claude Sonnet 4 | | Use case vertical | Cross-vertical | @@ -46,8 +46,8 @@ Single-shot web search works for simple factual queries. For questions that requ - **Configurable depth** — set `--max-iter` (or `DEEP_RESEARCH_MAX_ITER`) to tune depth vs. cost - **Transparent reasoning** — plan, search queries, and reflections are visible in the output - **Cited answers** — every factual claim is backed by a source URL -- **AgentCore Runtime** — production-ready hosting via `BedrockAgentCoreApp` -- **CLI + runtime modes** — run locally with `--query` or deploy to AgentCore Runtime +- **AgentCore runtime** — production-ready hosting via `BedrockAgentCoreApp` +- **CLI + runtime modes** — run locally with `--query` or deploy to AgentCore runtime ## Tuning the Loop @@ -130,7 +130,7 @@ export COGNITO_SCOPE="agentcore-websearch/invoke" export AWS_DEFAULT_REGION="us-east-1" ``` -### 4. (Optional) Deploy to AgentCore Runtime +### 4. (Optional) Deploy to AgentCore runtime For runtime deployments, environment variables **must** be pre-configured in the container environment (no interactive provisioning in runtime mode): @@ -140,7 +140,7 @@ container environment (no interactive provisioning in runtime mode): python deep_research_agent.py # starts the runtime server when deployed ``` -When deployed, invoke via the AgentCore Runtime API: +When deployed, invoke via the AgentCore runtime API: ```json { @@ -199,7 +199,7 @@ See the Prerequisites section above for the full list of permissions needed to c | File | Description | |:-----|:------------| -| `deep_research_agent.py` | Main agent — Plan/Search/Reflect loop, AgentCore Runtime entrypoint, and CLI | +| `deep_research_agent.py` | Main agent — Plan/Search/Reflect loop, AgentCore runtime entrypoint, and CLI | | `gateway_setup.py` | Auto-detection and provisioning of Gateway + Web Search infrastructure | | `cleanup.py` | Deletes all provisioned AWS resources and local credentials | | `requirements.txt` | Python dependencies | @@ -218,7 +218,7 @@ The system prompt encodes the loop directly. Claude: ### Gateway Integration -The agent connects to AgentCore Gateway via MCP Streamable HTTP. The Gateway exposes the Web Search connector as a standard MCP `WebSearch` tool. Tool discovery (`tools/list`) and invocation (`tools/call`) happen automatically through the Strands `MCPClient`. +The agent connects to AgentCore gateway via MCP Streamable HTTP. The Gateway exposes the Web Search connector as a standard MCP `WebSearch` tool. Tool discovery (`tools/list`) and invocation (`tools/call`) happen automatically through the Strands `MCPClient`. ### Auth Flow @@ -232,4 +232,4 @@ deep_research_agent.py ## Related Resources - [`01-features/03-connect-your-agent-to-anything/03-web-search/`](../../../01-features/03-connect-your-agent-to-anything/03-web-search/) — Gateway setup, raw MCP, and basic agent demos -- [AgentCore Gateway documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) +- [AgentCore gateway documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html) diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py b/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py index 1de63f7b7..5e52cebf4 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py +++ b/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py @@ -560,7 +560,7 @@ def ensure_gateway(interactive: bool = True) -> GatewayConfig: print(" • AgentCore Gateway (MCP protocol)") print(" • Web Search connector target") print() - print(" Region: us-east-1 (only supported region for Web Search)") + print(f" Region: {REGION}") print(" Estimated time: ~60 seconds") print("-" * 60) diff --git a/README.md b/README.md index 0ce6004cb..166733217 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Focused examples for individual AgentCore capabilities: - **[Gateway](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html)** — Convert APIs, Lambda functions, and services into MCP-compatible tools - **[Identity](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/identity.html)** — Agent identity and access management across AWS and third-party apps - **[Memory](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory.html)** — Managed memory infrastructure for personalized agent experiences -- **[Tools](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-tool.html)** — Built-in Code Interpreter and Browser Tool +- **[Tools](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-tool.html)** — Built-in Code Interpreter, Browser Tool, Web Search Tool - **[Observability](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/observability.html)** — Trace, debug, and monitor agent performance with OpenTelemetry - **[Evaluation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/evaluations.html)** — Built-in and custom evaluators for on-demand and online evaluation - **[Policy](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/policy.html)** — Fine-grained access control with Cedar policies @@ -159,7 +159,7 @@ agentcore add online-eval # Enable continuous evaluation agentcore deploy # Sync changes to AWS ``` -Congratulations! Your agent is now running on Amazon Bedrock AgentCore Runtime. +Congratulations! Your agent is now running on Amazon Bedrock AgentCore runtime. For the full CLI reference, see the [AgentCore CLI documentation](https://github.com/aws/agentcore-cli). From f1f3fb81f7dd3b34c84f585e9caa13ad9a42503e Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Mon, 22 Jun 2026 20:24:15 -0400 Subject: [PATCH 16/21] Update README.md Signed-off-by: Naga Gaddamu --- .../03-web-search/02-strands-agent/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md index f8a3e63ea..7e9871327 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md @@ -44,7 +44,7 @@ python web_search_strands.py --query "Current price of Bitcoin" ## How It Works -The script connects to the Gateway, creates an agent, and runs a research query: +The script creates an agent that connects to the Gateway, and runs a research query to the agent: ### Step 1: Connect to the Gateway From a4defdee698ca65ae2afc0bbae814345fddc9730 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Mon, 22 Jun 2026 20:24:32 -0400 Subject: [PATCH 17/21] Update README.md Signed-off-by: Naga Gaddamu --- .../03-web-search/02-strands-agent/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md index 7e9871327..063b1cd2a 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/README.md @@ -44,7 +44,7 @@ python web_search_strands.py --query "Current price of Bitcoin" ## How It Works -The script creates an agent that connects to the Gateway, and runs a research query to the agent: +The script creates an agent that connects to the Gateway, and runs a research query to the agent. ### Step 1: Connect to the Gateway From 0209197f0d98544e83baf9553f748b423b2f9b68 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Mon, 22 Jun 2026 20:26:54 -0400 Subject: [PATCH 18/21] Update web_search_strands.py Signed-off-by: Naga Gaddamu --- .../03-web-search/02-strands-agent/web_search_strands.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py index b58416fc1..36a872d39 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py @@ -1,8 +1,7 @@ """ Web Search with a Strands AI Agent. -Demonstrates a Strands agent that uses the Web Search Tool via AgentCore -Gateway to answer real-time questions: +Demonstrates a Strands agent that uses the Web Search Tool via AgentCore gateway to answer real-time questions: 1. Connect to the Gateway using MCP Streamable HTTP transport 2. Discover the WebSearch tool via tools/list 3. Create a Strands agent with the discovered tools From 5bda933ce90c4d05fc280d2e2a0fd6e48d7aeccf Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Mon, 22 Jun 2026 20:30:04 -0400 Subject: [PATCH 19/21] Update web_search_langchain.py Signed-off-by: Naga Gaddamu --- .../03-web-search/03-langchain-agent/web_search_langchain.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py index 00d9c0f43..3584dfc56 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py @@ -1,8 +1,7 @@ """ Web Search with a LangChain Agent. -Demonstrates a LangChain agent that uses the Web Search Tool via AgentCore -Gateway to answer real-time questions: +Demonstrates a LangChain agent that uses the Web Search Tool via AgentCore gateway to answer real-time questions: 1. Connect to the Gateway using langchain-mcp-adapters MultiServerMCPClient 2. Discover tools from the Gateway 3. Create a LangChain agent with ChatBedrockConverse From 472f705e77834c6e8a990247e57dce505b3f10a9 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Mon, 22 Jun 2026 22:07:07 -0400 Subject: [PATCH 20/21] Fixing linting issues and CodeQL alerts --- .../03-web-search/utils/gateway_setup.py | 7 ++++--- .../deep-research-agent/gateway_setup.py | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py index 31070b292..dcd4373f4 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py @@ -341,7 +341,7 @@ def main(): # Write credentials to a local .env file next to the script that invoked setup caller_dir = os.path.dirname(os.path.abspath(sys.argv[0])) if sys.argv[0] else os.getcwd() env_file = os.path.join(caller_dir, ".env.web-search") - + # START nosec - intentional for local development workflow with open(env_file, "w") as f: f.write(f"export AGENTCORE_GATEWAY_URL=\"{gateway_url}\"\n") f.write(f"export COGNITO_DOMAIN=\"{cognito_config['domain']}\"\n") @@ -352,7 +352,8 @@ def main(): f.write(f'export GATEWAY_ID="{gateway_id}"\n') f.write(f'export USER_POOL_ID="{cognito_config["user_pool_id"]}"\n') f.write(f'export ROLE_NAME="{role_name}"\n') - f.write(f'# Cleanup resource IDs\n') + f.write('# Cleanup resource IDs\n') + #END nosec - intentional for local development workflow print(f"\n✅ Credentials written to: {env_file}") print(" Load them with: source .env.web-search\n") @@ -361,7 +362,7 @@ def main(): print(f" IAM Role: {role_name}") print(f" Cognito Pool: {cognito_config['user_pool_id']}") print(f"\n⚠️ Keep {env_file} secure — it contains your client secret.") - print(f" Add it to .gitignore to avoid committing it.") + print(" Add it to .gitignore to avoid committing it.") if __name__ == "__main__": diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py b/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py index 5e52cebf4..6c22115e1 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py +++ b/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py @@ -82,6 +82,7 @@ def export_to_env(self): def print_env_vars(self): """Write credentials to a local .env file and print non-sensitive info.""" env_file = ".env.web-search" + # START nosec - intentional for local development workflow with open(env_file, "w") as f: f.write(f'export AGENTCORE_GATEWAY_URL="{self.gateway_url}"\n') f.write(f'export COGNITO_DOMAIN="{self.cognito_domain}"\n') @@ -89,7 +90,7 @@ def print_env_vars(self): f.write(f'export COGNITO_CLIENT_SECRET="{self.cognito_client_secret}"\n') f.write(f'export COGNITO_SCOPE="{self.cognito_scope}"\n') f.write(f'export AWS_DEFAULT_REGION="{self.region}"\n') - + # END nosec - intentional for local development workflow print(f"\n ✅ Credentials written to: {env_file}") print(f" Load them with: source {env_file}\n") print(f" Gateway URL: {self.gateway_url}") From 008bc4bace27094d80e7258c60d1238d522bd8d7 Mon Sep 17 00:00:00 2001 From: Naga Gaddamu Date: Tue, 23 Jun 2026 13:40:25 -0400 Subject: [PATCH 21/21] Fixed Ruff issues --- .../03-web-search/01-raw-mcp/cleanup.py | 36 +++------- .../03-web-search/01-raw-mcp/raw_mcp_call.py | 8 +-- .../03-web-search/01-raw-mcp/setup_gateway.py | 1 + .../03-web-search/02-strands-agent/cleanup.py | 36 +++------- .../02-strands-agent/setup_gateway.py | 1 + .../02-strands-agent/web_search_strands.py | 4 +- .../03-langchain-agent/cleanup.py | 36 +++------- .../03-langchain-agent/setup_gateway.py | 11 ++-- .../web_search_langchain.py | 14 ++-- .../03-web-search/utils/gateway_auth.py | 4 +- .../03-web-search/utils/gateway_setup.py | 61 ++++++----------- .../03-web-search/utils/web_search_agent.py | 9 +-- .../deep-research-agent/cleanup.py | 36 +++------- .../deep_research_agent.py | 7 +- .../deep-research-agent/gateway_setup.py | 65 ++++++------------- 15 files changed, 95 insertions(+), 234 deletions(-) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py index 98157b22e..4d231f659 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/cleanup.py @@ -28,13 +28,9 @@ def delete_gateway(gateway_client, gateway_id): """Delete all targets and the gateway itself.""" print("\n[1/3] Deleting Gateway resources...") try: - targets = gateway_client.list_gateway_targets( - gatewayIdentifier=gateway_id, maxResults=100 - ) + targets = gateway_client.list_gateway_targets(gatewayIdentifier=gateway_id, maxResults=100) for item in targets["items"]: - gateway_client.delete_gateway_target( - gatewayIdentifier=gateway_id, targetId=item["targetId"] - ) + gateway_client.delete_gateway_target(gatewayIdentifier=gateway_id, targetId=item["targetId"]) print(f" Deleted target: {item['name']}") time.sleep(10) @@ -49,9 +45,7 @@ def delete_cognito(cognito_client, user_pool_id): print("\n[2/3] Deleting Cognito resources...") try: domain = user_pool_id.replace("_", "").lower() - cognito_client.delete_user_pool_domain( - Domain=domain, UserPoolId=user_pool_id - ) + cognito_client.delete_user_pool_domain(Domain=domain, UserPoolId=user_pool_id) cognito_client.delete_user_pool(UserPoolId=user_pool_id) print(f" Deleted user pool: {user_pool_id}") except Exception as e: @@ -64,9 +58,7 @@ def delete_iam_role(iam_client, role_name): try: policies = iam_client.list_role_policies(RoleName=role_name) for policy_name in policies["PolicyNames"]: - iam_client.delete_role_policy( - RoleName=role_name, PolicyName=policy_name - ) + iam_client.delete_role_policy(RoleName=role_name, PolicyName=policy_name) print(f" Deleted policy: {policy_name}") iam_client.delete_role(RoleName=role_name) @@ -76,21 +68,11 @@ def delete_iam_role(iam_client, role_name): def parse_args(): - parser = argparse.ArgumentParser( - description="Clean up Web Search Tool Gateway resources" - ) - parser.add_argument( - "--gateway-id", required=True, help="Gateway ID to delete" - ) - parser.add_argument( - "--user-pool-id", required=True, help="Cognito User Pool ID to delete" - ) - parser.add_argument( - "--role-name", required=True, help="IAM role name to delete" - ) - parser.add_argument( - "--region", default=REGION, help="AWS region (default: us-east-1)" - ) + parser = argparse.ArgumentParser(description="Clean up Web Search Tool Gateway resources") + parser.add_argument("--gateway-id", required=True, help="Gateway ID to delete") + parser.add_argument("--user-pool-id", required=True, help="Cognito User Pool ID to delete") + parser.add_argument("--role-name", required=True, help="IAM role name to delete") + parser.add_argument("--region", default=REGION, help="AWS region (default: us-east-1)") return parser.parse_args() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py index 4d86c18a5..1b0a6d924 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/raw_mcp_call.py @@ -48,9 +48,7 @@ def parse_args(): - parser = argparse.ArgumentParser( - description="Raw MCP tool discovery and invocation against AgentCore gateway" - ) + parser = argparse.ArgumentParser(description="Raw MCP tool discovery and invocation against AgentCore gateway") parser.add_argument( "--query", default=DEFAULT_QUERY, @@ -99,9 +97,7 @@ def main(): return ws_tool_name = ws_tools[0].tool_name - result = mcp_client.call_tool_sync( - "raw-mcp-demo", ws_tool_name, {"query": args.query} - ) + result = mcp_client.call_tool_sync("raw-mcp-demo", ws_tool_name, {"query": args.query}) # Step 3: Display results print("[3] Results:\n") diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py index 30c6a7121..8824d5c10 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/01-raw-mcp/setup_gateway.py @@ -7,6 +7,7 @@ python setup_gateway.py --gateway-name my-gateway python setup_gateway.py --region us-east-1 """ + import sys import os diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py index 98157b22e..4d231f659 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/cleanup.py @@ -28,13 +28,9 @@ def delete_gateway(gateway_client, gateway_id): """Delete all targets and the gateway itself.""" print("\n[1/3] Deleting Gateway resources...") try: - targets = gateway_client.list_gateway_targets( - gatewayIdentifier=gateway_id, maxResults=100 - ) + targets = gateway_client.list_gateway_targets(gatewayIdentifier=gateway_id, maxResults=100) for item in targets["items"]: - gateway_client.delete_gateway_target( - gatewayIdentifier=gateway_id, targetId=item["targetId"] - ) + gateway_client.delete_gateway_target(gatewayIdentifier=gateway_id, targetId=item["targetId"]) print(f" Deleted target: {item['name']}") time.sleep(10) @@ -49,9 +45,7 @@ def delete_cognito(cognito_client, user_pool_id): print("\n[2/3] Deleting Cognito resources...") try: domain = user_pool_id.replace("_", "").lower() - cognito_client.delete_user_pool_domain( - Domain=domain, UserPoolId=user_pool_id - ) + cognito_client.delete_user_pool_domain(Domain=domain, UserPoolId=user_pool_id) cognito_client.delete_user_pool(UserPoolId=user_pool_id) print(f" Deleted user pool: {user_pool_id}") except Exception as e: @@ -64,9 +58,7 @@ def delete_iam_role(iam_client, role_name): try: policies = iam_client.list_role_policies(RoleName=role_name) for policy_name in policies["PolicyNames"]: - iam_client.delete_role_policy( - RoleName=role_name, PolicyName=policy_name - ) + iam_client.delete_role_policy(RoleName=role_name, PolicyName=policy_name) print(f" Deleted policy: {policy_name}") iam_client.delete_role(RoleName=role_name) @@ -76,21 +68,11 @@ def delete_iam_role(iam_client, role_name): def parse_args(): - parser = argparse.ArgumentParser( - description="Clean up Web Search Tool Gateway resources" - ) - parser.add_argument( - "--gateway-id", required=True, help="Gateway ID to delete" - ) - parser.add_argument( - "--user-pool-id", required=True, help="Cognito User Pool ID to delete" - ) - parser.add_argument( - "--role-name", required=True, help="IAM role name to delete" - ) - parser.add_argument( - "--region", default=REGION, help="AWS region (default: us-east-1)" - ) + parser = argparse.ArgumentParser(description="Clean up Web Search Tool Gateway resources") + parser.add_argument("--gateway-id", required=True, help="Gateway ID to delete") + parser.add_argument("--user-pool-id", required=True, help="Cognito User Pool ID to delete") + parser.add_argument("--role-name", required=True, help="IAM role name to delete") + parser.add_argument("--region", default=REGION, help="AWS region (default: us-east-1)") return parser.parse_args() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py index 30c6a7121..8824d5c10 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/setup_gateway.py @@ -7,6 +7,7 @@ python setup_gateway.py --gateway-name my-gateway python setup_gateway.py --region us-east-1 """ + import sys import os diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py index b58416fc1..9b39f33fb 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/02-strands-agent/web_search_strands.py @@ -67,9 +67,7 @@ def run_query(agent, query: str): def parse_args(): - parser = argparse.ArgumentParser( - description="Strands agent with Web Search Tool via AgentCore gateway" - ) + parser = argparse.ArgumentParser(description="Strands agent with Web Search Tool via AgentCore gateway") parser.add_argument( "--query", default=None, diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py index 98157b22e..4d231f659 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/cleanup.py @@ -28,13 +28,9 @@ def delete_gateway(gateway_client, gateway_id): """Delete all targets and the gateway itself.""" print("\n[1/3] Deleting Gateway resources...") try: - targets = gateway_client.list_gateway_targets( - gatewayIdentifier=gateway_id, maxResults=100 - ) + targets = gateway_client.list_gateway_targets(gatewayIdentifier=gateway_id, maxResults=100) for item in targets["items"]: - gateway_client.delete_gateway_target( - gatewayIdentifier=gateway_id, targetId=item["targetId"] - ) + gateway_client.delete_gateway_target(gatewayIdentifier=gateway_id, targetId=item["targetId"]) print(f" Deleted target: {item['name']}") time.sleep(10) @@ -49,9 +45,7 @@ def delete_cognito(cognito_client, user_pool_id): print("\n[2/3] Deleting Cognito resources...") try: domain = user_pool_id.replace("_", "").lower() - cognito_client.delete_user_pool_domain( - Domain=domain, UserPoolId=user_pool_id - ) + cognito_client.delete_user_pool_domain(Domain=domain, UserPoolId=user_pool_id) cognito_client.delete_user_pool(UserPoolId=user_pool_id) print(f" Deleted user pool: {user_pool_id}") except Exception as e: @@ -64,9 +58,7 @@ def delete_iam_role(iam_client, role_name): try: policies = iam_client.list_role_policies(RoleName=role_name) for policy_name in policies["PolicyNames"]: - iam_client.delete_role_policy( - RoleName=role_name, PolicyName=policy_name - ) + iam_client.delete_role_policy(RoleName=role_name, PolicyName=policy_name) print(f" Deleted policy: {policy_name}") iam_client.delete_role(RoleName=role_name) @@ -76,21 +68,11 @@ def delete_iam_role(iam_client, role_name): def parse_args(): - parser = argparse.ArgumentParser( - description="Clean up Web Search Tool Gateway resources" - ) - parser.add_argument( - "--gateway-id", required=True, help="Gateway ID to delete" - ) - parser.add_argument( - "--user-pool-id", required=True, help="Cognito User Pool ID to delete" - ) - parser.add_argument( - "--role-name", required=True, help="IAM role name to delete" - ) - parser.add_argument( - "--region", default=REGION, help="AWS region (default: us-east-1)" - ) + parser = argparse.ArgumentParser(description="Clean up Web Search Tool Gateway resources") + parser.add_argument("--gateway-id", required=True, help="Gateway ID to delete") + parser.add_argument("--user-pool-id", required=True, help="Cognito User Pool ID to delete") + parser.add_argument("--role-name", required=True, help="IAM role name to delete") + parser.add_argument("--region", default=REGION, help="AWS region (default: us-east-1)") return parser.parse_args() diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py index c11b1b6f9..2b66af2f7 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/setup_gateway.py @@ -1,10 +1,11 @@ """Set up AgentCore gateway with Web Search Tool — delegates to shared utility. - - Usage: - python setup_gateway.py - python setup_gateway.py --gateway-name my-gateway - python setup_gateway.py --region us-east-1 + +Usage: +python setup_gateway.py +python setup_gateway.py --gateway-name my-gateway +python setup_gateway.py --region us-east-1 """ + import sys import os diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py index 00d9c0f43..9876778fe 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/03-langchain-agent/web_search_langchain.py @@ -46,9 +46,7 @@ # ── Configuration ───────────────────────────────────────────────────────────── REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") -MODEL_ID = os.getenv( - "BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6" -) +MODEL_ID = os.getenv("BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6") GATEWAY_URL = os.getenv("AGENTCORE_GATEWAY_URL", "") DEFAULT_QUERY = "What is today's news around the world?" @@ -84,11 +82,9 @@ async def run_agent(query: str): print(f" Discovered {len(tools)} tool(s)") # Create and run the agent - #agent = create_react_agent(model, tools=tools) + # agent = create_react_agent(model, tools=tools) agent = create_agent(model, tools=tools) - result = await agent.ainvoke( - {"messages": [{"role": "user", "content": query}]} - ) + result = await agent.ainvoke({"messages": [{"role": "user", "content": query}]}) # Print the final response print("\n[Agent Response]") @@ -104,9 +100,7 @@ async def run_agent(query: str): def parse_args(): - parser = argparse.ArgumentParser( - description="LangChain agent with Web Search Tool via AgentCore gateway" - ) + parser = argparse.ArgumentParser(description="LangChain agent with Web Search Tool via AgentCore gateway") parser.add_argument( "--query", default=DEFAULT_QUERY, diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py index bb8cd0bb2..184648023 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_auth.py @@ -90,9 +90,7 @@ def create_streamable_http_transport(gateway_url: str = "", **token_kwargs): """ gateway_url = gateway_url or GATEWAY_URL if not gateway_url: - raise ValueError( - "Gateway URL not configured. Set AGENTCORE_GATEWAY_URL environment variable." - ) + raise ValueError("Gateway URL not configured. Set AGENTCORE_GATEWAY_URL environment variable.") token = get_oauth_token(**token_kwargs) diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py index dcd4373f4..da67202a3 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/gateway_setup.py @@ -81,9 +81,7 @@ def create_gateway_role(iam_client, role_name, account_id, region): "Action": "sts:AssumeRole", "Condition": { "StringEquals": {"aws:SourceAccount": account_id}, - "ArnLike": { - "aws:SourceArn": f"arn:aws:bedrock-agentcore:{region}:{account_id}:*" - }, + "ArnLike": {"aws:SourceArn": f"arn:aws:bedrock-agentcore:{region}:{account_id}:*"}, }, } ], @@ -148,18 +146,14 @@ def create_cognito_resources(cognito_client, region): create_resp = cognito_client.create_user_pool(PoolName=pool_name) user_pool_id = create_resp["UserPool"]["Id"] domain = user_pool_id.replace("_", "").lower() - cognito_client.create_user_pool_domain( - Domain=domain, UserPoolId=user_pool_id - ) + cognito_client.create_user_pool_domain(Domain=domain, UserPoolId=user_pool_id) print(f" Created user pool: {user_pool_id}") else: print(f" User pool exists: {user_pool_id}") # Create resource server try: - cognito_client.describe_resource_server( - UserPoolId=user_pool_id, Identifier=resource_server_id - ) + cognito_client.describe_resource_server(UserPoolId=user_pool_id, Identifier=resource_server_id) except cognito_client.exceptions.ResourceNotFoundException: cognito_client.create_resource_server( UserPoolId=user_pool_id, @@ -171,13 +165,9 @@ def create_cognito_resources(cognito_client, region): # Find or create M2M client client_id, client_secret = None, None - for client in cognito_client.list_user_pool_clients( - UserPoolId=user_pool_id, MaxResults=60 - )["UserPoolClients"]: + for client in cognito_client.list_user_pool_clients(UserPoolId=user_pool_id, MaxResults=60)["UserPoolClients"]: if client["ClientName"] == "agentcore-websearch-client": - desc = cognito_client.describe_user_pool_client( - UserPoolId=user_pool_id, ClientId=client["ClientId"] - ) + desc = cognito_client.describe_user_pool_client(UserPoolId=user_pool_id, ClientId=client["ClientId"]) client_id = client["ClientId"] client_secret = desc["UserPoolClient"]["ClientSecret"] break @@ -200,10 +190,7 @@ def create_cognito_resources(cognito_client, region): print(f" Client exists: {client_id}") domain = user_pool_id.replace("_", "").lower() - discovery_url = ( - f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}" - f"/.well-known/openid-configuration" - ) + discovery_url = f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}/.well-known/openid-configuration" scope_string = " ".join(scope_names) return { @@ -222,9 +209,7 @@ def create_gateway(gateway_client, name, role_arn, cognito_config): name=name, roleArn=role_arn, protocolType="MCP", - protocolConfiguration={ - "mcp": {"supportedVersions": ["2025-03-26"], "searchType": "SEMANTIC"} - }, + protocolConfiguration={"mcp": {"supportedVersions": ["2025-03-26"], "searchType": "SEMANTIC"}}, authorizerType="CUSTOM_JWT", authorizerConfiguration={ "customJWTAuthorizer": { @@ -255,15 +240,11 @@ def create_web_search_target(gateway_client, gateway_id): "mcp": { "connector": { "source": {"connectorId": "web-search"}, - "configurations": [ - {"name": "WebSearch", "parameterValues": {}} - ], + "configurations": [{"name": "WebSearch", "parameterValues": {}}], } } }, - credentialProviderConfigurations=[ - {"credentialProviderType": "GATEWAY_IAM_ROLE"} - ], + credentialProviderConfigurations=[{"credentialProviderType": "GATEWAY_IAM_ROLE"}], ) target_id = target_response["targetId"] @@ -281,9 +262,7 @@ def create_web_search_target(gateway_client, gateway_id): def parse_args(): - parser = argparse.ArgumentParser( - description="Set up AgentCore gateway with Web Search Tool target" - ) + parser = argparse.ArgumentParser(description="Set up AgentCore gateway with Web Search Tool target") parser.add_argument( "--gateway-name", default="web-search-gateway", @@ -325,9 +304,7 @@ def main(): # Step 3: Gateway print("\n[3/4] Creating AgentCore gateway...") gateway_client = boto3.client("bedrock-agentcore-control", region_name=region) - gateway_id, gateway_url = create_gateway( - gateway_client, args.gateway_name, role_arn, cognito_config - ) + gateway_id, gateway_url = create_gateway(gateway_client, args.gateway_name, role_arn, cognito_config) # Step 4: Web Search Target print("\n[4/4] Creating Web Search Tool target...") @@ -343,17 +320,17 @@ def main(): env_file = os.path.join(caller_dir, ".env.web-search") # START nosec - intentional for local development workflow with open(env_file, "w") as f: - f.write(f"export AGENTCORE_GATEWAY_URL=\"{gateway_url}\"\n") - f.write(f"export COGNITO_DOMAIN=\"{cognito_config['domain']}\"\n") - f.write(f"export COGNITO_CLIENT_ID=\"{cognito_config['client_id']}\"\n") - f.write(f"export COGNITO_CLIENT_SECRET=\"{cognito_config['client_secret']}\"\n") # noqa: E501 - f.write(f"export COGNITO_SCOPE=\"{cognito_config['scope']}\"\n") - f.write(f"export AWS_DEFAULT_REGION=\"{region}\"\n") + f.write(f'export AGENTCORE_GATEWAY_URL="{gateway_url}"\n') + f.write(f'export COGNITO_DOMAIN="{cognito_config["domain"]}"\n') + f.write(f'export COGNITO_CLIENT_ID="{cognito_config["client_id"]}"\n') + f.write(f'export COGNITO_CLIENT_SECRET="{cognito_config["client_secret"]}"\n') # noqa: E501 + f.write(f'export COGNITO_SCOPE="{cognito_config["scope"]}"\n') + f.write(f'export AWS_DEFAULT_REGION="{region}"\n') f.write(f'export GATEWAY_ID="{gateway_id}"\n') f.write(f'export USER_POOL_ID="{cognito_config["user_pool_id"]}"\n') f.write(f'export ROLE_NAME="{role_name}"\n') - f.write('# Cleanup resource IDs\n') - #END nosec - intentional for local development workflow + f.write("# Cleanup resource IDs\n") + # END nosec - intentional for local development workflow print(f"\n✅ Credentials written to: {env_file}") print(" Load them with: source .env.web-search\n") diff --git a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py index 0c5538d1b..377967e9a 100644 --- a/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py +++ b/01-features/03-connect-your-agent-to-anything/03-web-search/utils/web_search_agent.py @@ -27,10 +27,7 @@ # ── Configuration ───────────────────────────────────────────────────────────── REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") -MODEL_ID = os.getenv( - "BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6" - -) +MODEL_ID = os.getenv("BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6") SYSTEM_PROMPT = """You are a helpful research assistant with access to real-time web search. @@ -61,9 +58,7 @@ def create_mcp_client(gateway_url: str = "", **token_kwargs) -> MCPClient: Returns: MCPClient instance (must be used as a context manager). """ - transport_factory = create_streamable_http_transport( - gateway_url=gateway_url, **token_kwargs - ) + transport_factory = create_streamable_http_transport(gateway_url=gateway_url, **token_kwargs) return MCPClient(transport_factory) diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/cleanup.py b/02-use-cases/01-conversational-agents/deep-research-agent/cleanup.py index 1f99865ed..aff660cc0 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/cleanup.py +++ b/02-use-cases/01-conversational-agents/deep-research-agent/cleanup.py @@ -29,13 +29,9 @@ def delete_gateway(gateway_client, gateway_id): """Delete all targets and the gateway itself.""" print("\n[1/3] Deleting Gateway resources...") try: - targets = gateway_client.list_gateway_targets( - gatewayIdentifier=gateway_id, maxResults=100 - ) + targets = gateway_client.list_gateway_targets(gatewayIdentifier=gateway_id, maxResults=100) for item in targets["items"]: - gateway_client.delete_gateway_target( - gatewayIdentifier=gateway_id, targetId=item["targetId"] - ) + gateway_client.delete_gateway_target(gatewayIdentifier=gateway_id, targetId=item["targetId"]) print(f" Deleted target: {item['name']}") time.sleep(10) @@ -50,9 +46,7 @@ def delete_cognito(cognito_client, user_pool_id): print("\n[2/3] Deleting Cognito resources...") try: domain = user_pool_id.replace("_", "").lower() - cognito_client.delete_user_pool_domain( - Domain=domain, UserPoolId=user_pool_id - ) + cognito_client.delete_user_pool_domain(Domain=domain, UserPoolId=user_pool_id) cognito_client.delete_user_pool(UserPoolId=user_pool_id) print(f" Deleted user pool: {user_pool_id}") except Exception as e: @@ -65,9 +59,7 @@ def delete_iam_role(iam_client, role_name): try: policies = iam_client.list_role_policies(RoleName=role_name) for policy_name in policies["PolicyNames"]: - iam_client.delete_role_policy( - RoleName=role_name, PolicyName=policy_name - ) + iam_client.delete_role_policy(RoleName=role_name, PolicyName=policy_name) print(f" Deleted policy: {policy_name}") iam_client.delete_role(RoleName=role_name) @@ -85,21 +77,11 @@ def delete_env_file(): def parse_args(): - parser = argparse.ArgumentParser( - description="Clean up Deep Research Agent Gateway resources" - ) - parser.add_argument( - "--gateway-id", required=True, help="Gateway ID to delete" - ) - parser.add_argument( - "--user-pool-id", required=True, help="Cognito User Pool ID to delete" - ) - parser.add_argument( - "--role-name", required=True, help="IAM role name to delete" - ) - parser.add_argument( - "--region", default=REGION, help="AWS region (default: us-east-1)" - ) + parser = argparse.ArgumentParser(description="Clean up Deep Research Agent Gateway resources") + parser.add_argument("--gateway-id", required=True, help="Gateway ID to delete") + parser.add_argument("--user-pool-id", required=True, help="Cognito User Pool ID to delete") + parser.add_argument("--role-name", required=True, help="IAM role name to delete") + parser.add_argument("--region", default=REGION, help="AWS region (default: us-east-1)") return parser.parse_args() diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/deep_research_agent.py b/02-use-cases/01-conversational-agents/deep-research-agent/deep_research_agent.py index 3c48102ac..7494a8299 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/deep_research_agent.py +++ b/02-use-cases/01-conversational-agents/deep-research-agent/deep_research_agent.py @@ -63,9 +63,7 @@ # ── Configuration ────────────────────────────────────────────────────────────── REGION = os.getenv("AWS_DEFAULT_REGION", "us-east-1") -MODEL_ID = os.getenv( - "BEDROCK_MODEL_ID", "us.anthropic.claude-sonnet-4-6" -) +MODEL_ID = os.getenv("BEDROCK_MODEL_ID", "us.anthropic.claude-sonnet-4-6") MAX_SEARCH_ITERATIONS = int(os.getenv("DEEP_RESEARCH_MAX_ITER", "4")) # Configure logging @@ -284,8 +282,7 @@ def deep_research_runtime(payload): def parse_args(): parser = argparse.ArgumentParser( description=( - "Deep Research Agent — iterative Plan/Search/Reflect/Synthesize " - "loop via AgentCore Gateway Web Search Tool" + "Deep Research Agent — iterative Plan/Search/Reflect/Synthesize loop via AgentCore Gateway Web Search Tool" ) ) parser.add_argument( diff --git a/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py b/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py index 6c22115e1..f96f64732 100644 --- a/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py +++ b/02-use-cases/01-conversational-agents/deep-research-agent/gateway_setup.py @@ -140,23 +140,17 @@ def _find_existing_gateway() -> dict | None: # List all gateways paginator_kwargs = {} while True: - response = client.list_gateways( - maxResults=50, **paginator_kwargs - ) + response = client.list_gateways(maxResults=50, **paginator_kwargs) for gw in response.get("items", []): gw_id = gw["gatewayId"] # Check if this gateway has a web-search target try: - targets = client.list_gateway_targets( - gatewayIdentifier=gw_id - ) + targets = client.list_gateway_targets(gatewayIdentifier=gw_id) for target in targets.get("items", []): target_name = target.get("name", "").lower() if "web-search" in target_name or "websearch" in target_name: # Get the full gateway details for the URL - gw_detail = client.get_gateway( - gatewayIdentifier=gw_id - ) + gw_detail = client.get_gateway(gatewayIdentifier=gw_id) return { "gateway_id": gw_id, "gateway_url": gw_detail["gatewayUrl"], @@ -191,9 +185,7 @@ def _find_cognito_for_gateway(gateway_id: str) -> dict | None: # Look for pools matching our naming conventions if "agentcore" in pool_name.lower() and "websearch" in pool_name.lower(): pool_id = pool["Id"] - clients = cognito_client.list_user_pool_clients( - UserPoolId=pool_id, MaxResults=60 - )["UserPoolClients"] + clients = cognito_client.list_user_pool_clients(UserPoolId=pool_id, MaxResults=60)["UserPoolClients"] for client_info in clients: if "websearch" in client_info["ClientName"].lower(): @@ -250,9 +242,7 @@ def _create_gateway_role(iam_client, role_name, account_id, region): "Action": "sts:AssumeRole", "Condition": { "StringEquals": {"aws:SourceAccount": account_id}, - "ArnLike": { - "aws:SourceArn": f"arn:aws:bedrock-agentcore:{region}:{account_id}:*" - }, + "ArnLike": {"aws:SourceArn": f"arn:aws:bedrock-agentcore:{region}:{account_id}:*"}, }, } ], @@ -316,18 +306,14 @@ def _create_cognito_resources(cognito_client, region): create_resp = cognito_client.create_user_pool(PoolName=pool_name) user_pool_id = create_resp["UserPool"]["Id"] domain = user_pool_id.replace("_", "").lower() - cognito_client.create_user_pool_domain( - Domain=domain, UserPoolId=user_pool_id - ) + cognito_client.create_user_pool_domain(Domain=domain, UserPoolId=user_pool_id) print(f" Created user pool: {user_pool_id}") else: print(f" User pool exists: {user_pool_id}") # Create resource server try: - cognito_client.describe_resource_server( - UserPoolId=user_pool_id, Identifier=resource_server_id - ) + cognito_client.describe_resource_server(UserPoolId=user_pool_id, Identifier=resource_server_id) except cognito_client.exceptions.ResourceNotFoundException: cognito_client.create_resource_server( UserPoolId=user_pool_id, @@ -339,13 +325,9 @@ def _create_cognito_resources(cognito_client, region): # Find or create M2M client client_id, client_secret = None, None - for client in cognito_client.list_user_pool_clients( - UserPoolId=user_pool_id, MaxResults=60 - )["UserPoolClients"]: + for client in cognito_client.list_user_pool_clients(UserPoolId=user_pool_id, MaxResults=60)["UserPoolClients"]: if client["ClientName"] == "agentcore-websearch-client": - desc = cognito_client.describe_user_pool_client( - UserPoolId=user_pool_id, ClientId=client["ClientId"] - ) + desc = cognito_client.describe_user_pool_client(UserPoolId=user_pool_id, ClientId=client["ClientId"]) client_id = client["ClientId"] client_secret = desc["UserPoolClient"]["ClientSecret"] break @@ -368,10 +350,7 @@ def _create_cognito_resources(cognito_client, region): print(f" Client exists: {client_id}") domain = user_pool_id.replace("_", "").lower() - discovery_url = ( - f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}" - f"/.well-known/openid-configuration" - ) + discovery_url = f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}/.well-known/openid-configuration" scope_string = " ".join(scope_names) return { @@ -390,9 +369,7 @@ def _create_gateway_and_target(gateway_client, name, role_arn, cognito_config): name=name, roleArn=role_arn, protocolType="MCP", - protocolConfiguration={ - "mcp": {"supportedVersions": ["2025-03-26"], "searchType": "SEMANTIC"} - }, + protocolConfiguration={"mcp": {"supportedVersions": ["2025-03-26"], "searchType": "SEMANTIC"}}, authorizerType="CUSTOM_JWT", authorizerConfiguration={ "customJWTAuthorizer": { @@ -419,15 +396,11 @@ def _create_gateway_and_target(gateway_client, name, role_arn, cognito_config): "mcp": { "connector": { "source": {"connectorId": "web-search"}, - "configurations": [ - {"name": "WebSearch", "parameterValues": {}} - ], + "configurations": [{"name": "WebSearch", "parameterValues": {}}], } } }, - credentialProviderConfigurations=[ - {"credentialProviderType": "GATEWAY_IAM_ROLE"} - ], + credentialProviderConfigurations=[{"credentialProviderType": "GATEWAY_IAM_ROLE"}], ) if _wait_for_targets_ready(gateway_client, gateway_id): @@ -470,9 +443,7 @@ def provision_gateway(gateway_name: str | None = None) -> GatewayConfig: # Step 3: Gateway + Target print("\n [3/4] Creating AgentCore Gateway...") gateway_client = boto3.client("bedrock-agentcore-control", region_name=region) - gateway_id, gateway_url = _create_gateway_and_target( - gateway_client, name, role_arn, cognito_config - ) + gateway_id, gateway_url = _create_gateway_and_target(gateway_client, name, role_arn, cognito_config) print("\n [4/4] Setup complete ✓") @@ -570,10 +541,14 @@ def ensure_gateway(interactive: bool = True) -> GatewayConfig: print("\n Aborted. To set up manually, you can either:") print() print(" Option 1 — Use the bundled setup module:") - print(" python -c \"from gateway_setup import provision_gateway; cfg = provision_gateway(); cfg.print_env_vars()\"") + print( + ' python -c "from gateway_setup import provision_gateway; cfg = provision_gateway(); cfg.print_env_vars()"' + ) print() print(" Option 2 — Use the standalone setup script:") - print(" python ../../01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py") + print( + " python ../../01-features/03-connect-your-agent-to-anything/03-web-search/01-setup-gateway/setup_gateway.py" + ) print() print(" Then export the printed environment variables and re-run the agent.") raise SystemExit(1)