From 72be9cd83c9d1185f07c49ed8c5a4261082be5a9 Mon Sep 17 00:00:00 2001 From: Satya Vedamtam Date: Sun, 16 Nov 2025 19:26:34 -0500 Subject: [PATCH 1/3] Initial upload, early stopping pattern --- early-stopping-sf-bedrock/README.md | 105 ++++++++ .../functions/awsdocmcpserver.py | 138 ++++++++++ .../functions/evaluationfn.py | 103 ++++++++ .../functions/synthesis.py | 122 +++++++++ .../functions/workeragent.py | 237 ++++++++++++++++++ .../resources/MainWorkflow.png | Bin 0 -> 60240 bytes .../resources/WorkerExecutionStatus.png | Bin 0 -> 26591 bytes .../resources/WorkerWorkflows.png | Bin 0 -> 68350 bytes .../statemachine/main.asl.json | 158 ++++++++++++ .../statemachine/worker.asl.json | 93 +++++++ early-stopping-sf-bedrock/template.yaml | 212 ++++++++++++++++ 11 files changed, 1168 insertions(+) create mode 100644 early-stopping-sf-bedrock/README.md create mode 100644 early-stopping-sf-bedrock/functions/awsdocmcpserver.py create mode 100644 early-stopping-sf-bedrock/functions/evaluationfn.py create mode 100644 early-stopping-sf-bedrock/functions/synthesis.py create mode 100644 early-stopping-sf-bedrock/functions/workeragent.py create mode 100644 early-stopping-sf-bedrock/resources/MainWorkflow.png create mode 100644 early-stopping-sf-bedrock/resources/WorkerExecutionStatus.png create mode 100644 early-stopping-sf-bedrock/resources/WorkerWorkflows.png create mode 100644 early-stopping-sf-bedrock/statemachine/main.asl.json create mode 100644 early-stopping-sf-bedrock/statemachine/worker.asl.json create mode 100644 early-stopping-sf-bedrock/template.yaml diff --git a/early-stopping-sf-bedrock/README.md b/early-stopping-sf-bedrock/README.md new file mode 100644 index 00000000..0ab0616e --- /dev/null +++ b/early-stopping-sf-bedrock/README.md @@ -0,0 +1,105 @@ +# Parallel Execution with Early Stopping pattern with AWS Step Functions and Amazon Bedrock + +The **Parallel Agent Early Stopping** pattern uses AWS Step Functions and Amazon Bedrock to run multiple AI agents simultaneously on the same problem, with different approaches, and automatically terminates unnecessary processes once a high-confidence solution is discovered. The workflow coordinates Worker Agents that either retrieve information from the AWS Documentation MCP Server or generate responses using Amazon Bedrock models, while an Evaluation Agent continuously assesses confidence levels and triggers early stopping when a predetermined threshold is met. This design optimizes both performance and cost through parallel exploration, intelligent termination, and resource optimization techniques including agent tiering, token optimization, and Lambda memory tuning. + +Learn more about this workflow at Step Functions workflows collection: https://serverlessland.com/workflows/early-stopping-sf-bedrock + +Important: this application uses various AWS services and there are costs associated with these services after the Free Tier usage - please see the [AWS Pricing page](https://aws.amazon.com/pricing/) for details. You are responsible for any AWS costs incurred. No warranty is implied in this example. + +## Requirements + +* [Create an AWS account](https://portal.aws.amazon.com/gp/aws/developer/registration/index.html) if you do not already have one and log in. The IAM user that you use must have sufficient permissions to make necessary AWS service calls and manage AWS resources. +* [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) installed and configured +* [Git Installed](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +* [AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) (AWS SAM) installed + +## Deployment Instructions + +1. Create a new directory, navigate to that directory in a terminal and clone the GitHub repository: + ``` + git clone https://github.com/aws-samples/step-functions-workflows-collection + ``` +2. Change directory to the pattern directory: + ``` + cd step-functions-workflows-collection/early-stopping-sf-bedrock + ``` +3. From the command line, use AWS SAM to deploy the AWS resources for the workflow as specified in the template.yaml file: + ``` + sam deploy --guided + ``` +4. During the prompts: + * Enter a stack name + * Enter the desired AWS Region + * Allow SAM CLI to create IAM roles with the required permissions. + + Once you have run `sam deploy --guided` mode once and saved arguments to a configuration file (samconfig.toml), you can use `sam deploy` in future to use these defaults. + +5. Note the outputs from the SAM deployment process. These contain the resource names and/or ARNs which are used for testing. + +## How it works + +1. A user submits a query (eg. What is CloudFront ?), and AWS Step Functions orchestrates 4 parallel agent workflows simultaneously. Each agent uses a different specialized approach (service-specific, architecture patterns, cost optimization, and general overview). + +2. Each agent independently retrieves information from the AWS Documentation MCP Server (Context Provider). If relevant information isn't available, agents fall back to Amazon Bedrock models to generate responses. + +3. As results arrive, an Evaluation Agent assesses each response's confidence level. When any agent produces a result exceeding the confidence threshold (typically 0.95), Step Functions automatically terminates the other executing workflows to optimize resources and costs. + +4. If no single agent achieves high confidence, a Synthesis Agent combines insights from multiple agents into a comprehensive answer. The final result is returned to the user with processing metadata. + + +## Image + +![image](./resources/MainWorkflow.png) +![image](./resources/WorkerWorkflows.png) +![image](./resources/WorkerExecutionStatus.png) + +## Testing +Based on the uploaded document, here are the testing instructions for logging into the console and starting execution of the main workflow: + +## Testing Instructions + +1. Log in to the AWS Management Console + - Navigate to console.aws.amazon.com + - Enter your AWS account credentials + - Select the region where you deployed the solution (e.g., us-east-1) + +2. Access AWS Step Functions Console + - From the AWS services menu, search for and select "Step Functions" + - In the Step Functions dashboard, locate and click on the "MainStateMachine" that was created during deployment + - You should see details about the state machine including its Amazon Resource Name (ARN) + +3. Start a New Execution + - Click the "Start execution" button + - In the input field, enter a test query in JSON format: + ```json + {"query": "What is CloudFront?"} + ``` + - Optionally, provide a name for your execution in the "Name" field + - Click "Start execution" to begin the workflow + +4. Monitor the Execution + - The console will display a visual representation of your workflow execution + - You'll see the workflow spawn multiple parallel agents with different specialized approaches + - Watch as some agents complete successfully while others are terminated early + - When execution completes, review the output in the "Execution output" tab to see the synthesized result + +5. Verify Results + - Check that the output includes a "status" field (typically "synthesized") + - Review the "processing_details" section to confirm early stopping functionality + - Verify that responses include attribution to AWS Documentation + + +## Cleanup + +1. Delete the stack + ```bash + aws cloudformation delete-stack --stack-name STACK_NAME + ``` +1. Confirm the stack has been deleted + ```bash + aws cloudformation list-stacks --query "StackSummaries[?contains(StackName,'STACK_NAME')].StackStatus" + ``` +---- +Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: MIT-0 diff --git a/early-stopping-sf-bedrock/functions/awsdocmcpserver.py b/early-stopping-sf-bedrock/functions/awsdocmcpserver.py new file mode 100644 index 00000000..ca8de6ff --- /dev/null +++ b/early-stopping-sf-bedrock/functions/awsdocmcpserver.py @@ -0,0 +1,138 @@ +import json +import subprocess +import sys +import os +# import tempfile +import asyncio +import shutil +import glob + + +# Initialize MCP server at module level (runs once per container) +print("Initializing MCP server...") + +# Install packages to persistent location +temp_dir = "/tmp/mcp_packages" +os.makedirs(temp_dir, exist_ok=True) + +# Only install if not already installed +if not os.path.exists(os.path.join(temp_dir, "awslabs")): + print(f"Installing packages to {temp_dir}") + + # Clear any existing SSL environment variables + ssl_env_vars = ["SSL_CERT_FILE", "REQUESTS_CA_BUNDLE", "CURL_CA_BUNDLE"] + for var in ssl_env_vars: + if var in os.environ: + del os.environ[var] + + # Install packages + subprocess.check_call([ + sys.executable, "-m", "pip", "install", + "awslabs.aws-documentation-mcp-server", + "certifi", + "--target", temp_dir, + "--trusted-host", "pypi.org", + "--trusted-host", "pypi.python.org", + "--trusted-host", "files.pythonhosted.org" + ]) + +# Add to path +sys.path.insert(0, temp_dir) + +# Set environment variables +os.environ["FASTMCP_LOG_LEVEL"] = "ERROR" +os.environ["AWS_DOCUMENTATION_PARTITION"] = "AWS" + +# Find and set SSL certificates +cert_pattern = os.path.join(temp_dir, "**/cacert.pem") +cert_files = glob.glob(cert_pattern, recursive=True) + +if not cert_files: + # Fallback: try to find any .pem file + pem_pattern = os.path.join(temp_dir, "**/*.pem") + cert_files = glob.glob(pem_pattern, recursive=True) + +if cert_files: + # Use the first certificate file found + cert_path = cert_files[0] + print(f"Found certificate file: {cert_path}") + + # Copy to persistent location + persistent_cert_path = "/tmp/cacert.pem" + shutil.copy2(cert_path, persistent_cert_path) + + # Set SSL environment variables + os.environ["SSL_CERT_FILE"] = persistent_cert_path + os.environ["REQUESTS_CA_BUNDLE"] = persistent_cert_path + os.environ["CURL_CA_BUNDLE"] = persistent_cert_path + print(f"SSL certificates set to: {persistent_cert_path}") +else: + print("Warning: No certificate file found") + +print("MCP server initialization complete") + +class CustomJSONEncoder(json.JSONEncoder): + def default(self, obj): + if hasattr(obj, '__dict__'): + return obj.__dict__ + elif hasattr(obj, 'model_dump'): + return obj.model_dump() + elif hasattr(obj, 'dict'): + return obj.dict() + return super().default(obj) + +async def async_handler(event, context): + try: + # Process the request + action = event.get('action') + + if action == 'search': + search_phrase = event.get('search_phrase', '') + limit = event.get('limit', 5) + + print(f"Searching for: {search_phrase}") + + # Import and use MCP server + from awslabs.aws_documentation_mcp_server import server_aws + + class MockContext: + pass + + mock_ctx = MockContext() + result = await server_aws.search_documentation(mock_ctx, search_phrase=search_phrase, limit=limit) + + # Convert to JSON + result_json = json.loads(json.dumps(result, cls=CustomJSONEncoder)) + + print(f"Search completed successfully") + return { + "output": { + "kind": "text", + "content": json.dumps(result_json) + } + } + + else: + return {"error": f"Unsupported action: {action}"} + + except Exception as e: + import traceback + error_msg = f"Error: {str(e)}\nTraceback: {traceback.format_exc()}" + print(error_msg) + return {"error": error_msg} + +def handler(event, context): + try: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + try: + result = loop.run_until_complete(async_handler(event, context)) + return result + finally: + loop.close() + except Exception as e: + import traceback + return { + "error": str(e), + "traceback": traceback.format_exc() + } diff --git a/early-stopping-sf-bedrock/functions/evaluationfn.py b/early-stopping-sf-bedrock/functions/evaluationfn.py new file mode 100644 index 00000000..67bb668d --- /dev/null +++ b/early-stopping-sf-bedrock/functions/evaluationfn.py @@ -0,0 +1,103 @@ +import json +import os +import boto3 + +def lambda_handler(event, context): + # Extract the confidence threshold from environment variables + confidence_threshold = float(os.environ.get('CONFIDENCE_THRESHOLD', 0.8)) + + # Get the result from the worker agent + agent_result = event + confidence_score = agent_result.get('confidence_score', 0) + + # Additional AWS-specific evaluation criteria + aws_service_completeness = evaluate_service_completeness( + agent_result.get('query', ''), + agent_result.get('result', ''), + agent_result.get('services_referenced', []) + ) + + has_implementation_steps = 'steps' in agent_result.get('result', '').lower() or \ + 'step 1' in agent_result.get('result', '').lower() + + # Adjust confidence score based on AWS-specific criteria + adjusted_score = confidence_score + if aws_service_completeness > 0.8: + adjusted_score += 0.1 + if has_implementation_steps: + adjusted_score += 0.05 + + adjusted_score = min(adjusted_score, 1.0) # Cap at 1.0 + + # Determine if the confidence threshold is met + threshold_met = adjusted_score >= confidence_threshold + + # If threshold is met, we will stop other executions + if threshold_met: + # In production, extract and stop the parent Map execution + execution_arn = os.environ.get('AWS_LAMBDA_FUNCTION_NAME', 'unknown') + stop_other_executions(execution_arn) + + return { + 'result': agent_result['result'], + 'confidence_score': adjusted_score, + 'original_confidence': confidence_score, + 'threshold_met': threshold_met, + 'agent_id': agent_result.get('agent_id', 'unknown'), + 'aws_service_completeness': aws_service_completeness, + 'has_implementation_steps': has_implementation_steps + } + +def evaluate_service_completeness(query, result, services_referenced): + """Evaluate if the result references appropriate AWS services for the query""" + # Simple heuristic - could be enhanced with ML-based evaluation + compute_keywords = ['compute', 'server', 'instance', 'container', 'serverless'] + storage_keywords = ['storage', 'file', 'object', 'backup'] + database_keywords = ['database', 'table', 'query', 'record', 'data store'] + network_keywords = ['network', 'vpc', 'subnet', 'traffic', 'routing'] + + expected_services = [] + + # Determine expected service types based on query + query_lower = query.lower() + if any(keyword in query_lower for keyword in compute_keywords): + expected_services.extend(['EC2', 'Lambda', 'ECS', 'EKS', 'Fargate']) + if any(keyword in query_lower for keyword in storage_keywords): + expected_services.extend(['S3', 'EBS', 'EFS', 'FSx', 'Storage Gateway']) + if any(keyword in query_lower for keyword in database_keywords): + expected_services.extend(['RDS', 'DynamoDB', 'Aurora', 'DocumentDB', 'Neptune']) + if any(keyword in query_lower for keyword in network_keywords): + expected_services.extend(['VPC', 'Route 53', 'CloudFront', 'API Gateway']) + + # If no specific service type is identified, return medium score + if not expected_services: + return 0.7 + + # Calculate overlap between expected and referenced services + service_overlap = len(set([s.upper() for s in services_referenced]) & + set([s.upper() for s in expected_services])) + + if service_overlap == 0: + return 0.5 + + # Calculate completeness score + return min(1.0, service_overlap / (len(expected_services) * 0.7)) + +def stop_other_executions(execution_arn): + """Stop other parallel executions when threshold is met""" + # In a real implementation, you would: + # 1. Extract the execution ID from context + # 2. Use Step Functions API to stop the Map state executions + + # Example implementation with AWS SDK: + try: + # This is a simplified example - in production, you'd need to + # properly extract the execution ARN from the context + sfn_client = boto3.client('stepfunctions') + sfn_client.stop_execution( + executionArn=execution_arn, + cause="Confidence threshold met by another agent" + ) + print(f"Successfully stopped execution: {execution_arn}") + except Exception as e: + print(f"Error stopping execution: {str(e)}") diff --git a/early-stopping-sf-bedrock/functions/synthesis.py b/early-stopping-sf-bedrock/functions/synthesis.py new file mode 100644 index 00000000..8ae3d8e5 --- /dev/null +++ b/early-stopping-sf-bedrock/functions/synthesis.py @@ -0,0 +1,122 @@ +import json +import boto3 +import os +import traceback + +def lambda_handler(event, context): + print(f"Received event: {json.dumps(event)}") # Log the input for debugging + + try: + # Initialize Bedrock client + bedrock_runtime = boto3.client('bedrock-runtime') + + # Extract the original query from the event + original_query = event.get('original_query', 'How to implement on AWS?') + + # Extract results from multiple agents + agent_results = event.get('agent_results', []) + + # Consolidate mentioned AWS services across all agents + all_services = set() + for result in agent_results: + if isinstance(result, dict): + services = result.get('services_referenced', []) + if isinstance(services, list): + all_services.update(services) + + # Prepare a synthesis prompt + results_text = "" + for i, result in enumerate(agent_results): + if isinstance(result, dict): + approach = result.get('approach', 'general') + confidence = result.get('confidence_score', 'unknown') + result_text = result.get('result', '') + if not result_text and 'body' in result: + # Try to extract from body if result is empty + try: + body = result['body'] + if body.startswith('"') and body.endswith('"'): + body = body[1:-1] # Remove quotes + result_text = body + except: + result_text = "No result available" + + results_text += f"Agent {i+1} ({approach}, confidence: {confidence}):\n" + results_text += f"{result_text}\n\n" + + synthesis_prompt = f"""You are an AWS solutions architect synthesizer. + The original question was: "{original_query}" + + Below are different perspectives from multiple AWS experts on how to implement this solution. + Please synthesize these results into a comprehensive answer. + + {results_text} + + Provide a synthesized solution that: + 1. Begins with a clear architectural overview + 2. Includes the most appropriate AWS services from all responses + 3. Provides step-by-step implementation guidance + 4. Highlights best practices and security considerations + 5. Mentions cost optimization strategies + + Focus on creating actionable guidance that an AWS customer could follow. + """ + + # Invoke Bedrock for synthesis + response = bedrock_runtime.invoke_model( + modelId=os.environ.get('MODEL_ID', 'us.anthropic.claude-3-5-haiku-20241022-v1:0'), + body=json.dumps({ + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 3000, + "messages": [ + { + "role": "user", + "content": synthesis_prompt + } + ], + "temperature": 0.3, + "top_p": 0.9 + }) + ) + + # Parse response + response_body = json.loads(response['body'].read().decode('utf-8')) + synthesized_result = response_body.get('content', [{}])[0].get('text', '') + + # Extract AWS services mentioned in the synthesized result + services_mentioned = extract_aws_services(synthesized_result) + if not services_mentioned: + services_mentioned = list(all_services) + + return { + 'synthesized_result': synthesized_result, + 'source_count': len(agent_results), + 'services_mentioned': services_mentioned, + 'original_query': original_query + } + except Exception as e: + print(f"Error in lambda_handler: {str(e)}") + print(traceback.format_exc()) + # Fallback response if anything fails + return { + 'synthesized_result': f"I encountered an error while processing your request about {original_query if 'original_query' in locals() else 'your query'}. Please try again.", + 'source_count': 0, + 'services_mentioned': [], + 'original_query': original_query if 'original_query' in locals() else "Unknown query" + } + +def extract_aws_services(text): + """Extract mentioned AWS services from the response""" + aws_services = [ + "EC2", "S3", "Lambda", "DynamoDB", "RDS", "Aurora", "ECS", "EKS", + "SQS", "SNS", "API Gateway", "CloudFormation", "CloudFront", "Route 53", + "2PC", "IAM", "CloudWatch", "Step Functions", "EventBridge", "Cognito", + "Kinesis", "Glue", "Athena", "Redshift", "EMR", "SageMaker", "Bedrock" + ] + + found_services = [] + for service in aws_services: + if service in text or service.lower() in text.lower(): + found_services.append(service) + + return found_services diff --git a/early-stopping-sf-bedrock/functions/workeragent.py b/early-stopping-sf-bedrock/functions/workeragent.py new file mode 100644 index 00000000..d4d9b14a --- /dev/null +++ b/early-stopping-sf-bedrock/functions/workeragent.py @@ -0,0 +1,237 @@ +import json +import os +import boto3 +import time +import traceback + +# Initialize Bedrock client +bedrock_runtime = boto3.client('bedrock-runtime') + +def lambda_handler(event, context): + # Extract the AWS question + query = event['query'] + agent_id = event.get('agent_id', 'default') + approach = event.get('approach', 'general') + + print(f"Processing query: {query} with approach: {approach}") + + # First, try to get answer from MCP server with specialized search + mcp_info = query_mcp_server(query, approach) + + if mcp_info: + # Use MCP server response directly but format based on approach + print("Using MCP server response directly") + + # Format the MCP response based on agent's approach + if approach == 'service_specific': + result = f"Based on AWS Documentation (Service Implementation Focus):\n\n{mcp_info}" + elif approach == 'architecture_patterns': + result = f"Based on AWS Documentation (Architecture & Design Focus):\n\n{mcp_info}" + elif approach == 'cost_optimization': + result = f"Based on AWS Documentation (Cost & Pricing Focus):\n\n{mcp_info}" + else: + result = f"Based on AWS Documentation (General Overview):\n\n{mcp_info}" + + confidence_score = 0.95 # High confidence for official documentation + + return { + 'agent_id': agent_id, + 'approach': approach, + 'query': query, + 'result': result, + 'confidence_score': confidence_score, + 'processing_time': time.time() - context.get_remaining_time_in_millis()/1000, + 'services_referenced': extract_aws_services(result), + 'source': 'mcp_server', + 'lambda_execution_arn': context.aws_request_id + } + + # Fallback to Bedrock if MCP server doesn't have the information + print("MCP server didn't provide results, falling back to Bedrock") + + # Create a customized prompt based on the agent's assigned approach + if approach == 'service_specific': + prompt = f"""You are an AWS service specialist. + Provide a step-by-step guide on how to accomplish this task on AWS: + {query} + + Focus on the specific AWS services needed, their configurations, and how they interact. + Include console instructions and any relevant CLI commands or CloudFormation snippets. + Include confidence score from 0-1 at the end of your response. + """ + elif approach == 'architecture_patterns': + prompt = f"""You are an AWS solutions architect. + Provide an architectural solution for this AWS implementation question: + {query} + + Focus on best practice architectural patterns, service selection rationale, and design considerations. + Include a logical architecture description and service interactions. + Include confidence score from 0-1 at the end of your response. + """ + elif approach == 'cost_optimization': + prompt = f"""You are an AWS cost optimization specialist. + For the following AWS implementation question: + {query} + + Provide a cost-effective approach, pricing considerations, and optimization strategies. + Include relevant pricing models, reserved capacity options, and cost comparison of alternatives. + Include confidence score from 0-1 at the end of your response. + """ + else: + prompt = f"""You are an AWS technical expert. + Provide a comprehensive answer to the following AWS implementation question: + {query} + + Include relevant AWS services, implementation steps, and best practices. + Include confidence score from 0-1 at the end of your response. + """ + + try: + # Invoke Bedrock model + model_id = os.environ.get('MODEL_ID', 'us.anthropic.claude-3-5-haiku-20241022-v1:0') + print(f"Invoking Bedrock model: {model_id}") + + response = bedrock_runtime.invoke_model( + modelId=model_id, + body=json.dumps({ + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 2000, + "messages": [ + { + "role": "user", + "content": prompt + } + ], + "temperature": 0.2, + "top_p": 0.9 + }) + ) + + # Parse response + response_body = json.loads(response['body'].read().decode('utf-8')) + result = response_body.get('content', [{}])[0].get('text', '') + + # Extract confidence score + try: + if 'confidence score:' in result.lower(): + confidence_parts = result.lower().split('confidence score:') + confidence_score = float(confidence_parts[1].strip()) + else: + import re + matches = re.findall(r'confidence(?:\s*(?:score|level|rating)?)?(?:\s*[:=]\s*)?([0-9]*\.?[0-9]+)', + result.lower()) + confidence_score = float(matches[-1]) if matches else 0.7 + except Exception: + confidence_score = 0.7 + + return { + 'agent_id': agent_id, + 'approach': approach, + 'query': query, + 'result': result, + 'confidence_score': confidence_score, + 'processing_time': time.time() - context.get_remaining_time_in_millis()/1000, + 'services_referenced': extract_aws_services(result), + 'source': 'bedrock', + 'lambda_execution_arn': context.aws_request_id + } + + except Exception as e: + print(f"Error invoking Bedrock: {str(e)}") + return { + 'agent_id': agent_id, + 'approach': approach, + 'query': query, + 'result': f"Error processing query: {query}. Please try again.", + 'confidence_score': 0.1, + 'processing_time': time.time() - context.get_remaining_time_in_millis()/1000, + 'services_referenced': [], + 'source': 'error', + 'lambda_execution_arn': context.aws_request_id + } + +def query_mcp_server(query, approach): + """Use the AWS Documentation MCP Server Lambda with approach-specific search strategies""" + try: + print(f"Querying MCP server for: {query} with approach: {approach}") + + # Create approach-specific search phrases + if approach == 'service_specific': + # Focus on implementation, configuration, setup + search_phrase = f"{query} implementation configuration setup guide" + elif approach == 'architecture_patterns': + # Focus on architecture, design, patterns, best practices + search_phrase = f"{query} architecture design patterns best practices" + elif approach == 'cost_optimization': + # Focus on pricing, cost, billing, optimization + search_phrase = f"{query} pricing cost optimization billing" + else: + # General search + search_phrase = query + + print(f"Using specialized search phrase: {search_phrase}") + + # Create a Lambda client + lambda_client = boto3.client('lambda') + + # Create the MCP request with specialized search + mcp_request = { + "action": "search", + "search_phrase": search_phrase, + "limit": 5 + } + + # Invoke the MCP server Lambda + response = lambda_client.invoke( + FunctionName=os.environ.get('MCP_FUNCTION_NAME', 'AWSMCPServerFunction'), + InvocationType='RequestResponse', + Payload=json.dumps(mcp_request) + ) + + # Parse the response + payload = json.loads(response['Payload'].read().decode('utf-8')) + print(f"MCP server response received for {approach} approach") + + # Check for errors + if 'error' in payload: + print(f"Error from MCP server: {payload['error']}") + return "" + + # Process the search results + if 'output' in payload and 'content' in payload['output']: + content = json.loads(payload['output']['content']) + + # Extract the top search results + results = [] + for item in content: + if isinstance(item, dict) and 'url' in item and 'title' in item and 'context' in item: + results.append(f"# {item['title']}\n\n{item['context']}\n\nSource: {item['url']}") + + # If we have results, return them + if results: + print(f"Found {len(results)} MCP results for {approach} approach") + return "\n\n".join(results) + + print(f"No MCP content found for {approach} approach") + return "" + + except Exception as e: + print(f"Error querying MCP server: {str(e)}") + print(traceback.format_exc()) + return "" + +def extract_aws_services(text): + """Extract mentioned AWS services from the response""" + aws_services = [ + "EC2", "S3", "Lambda", "DynamoDB", "RDS", "Aurora", "ECS", "EKS", + "SQS", "SNS", "API Gateway", "CloudFormation", "CloudFront", "Route 53", + "VPC", "IAM", "CloudWatch", "Step Functions", "EventBridge", "Cognito", + "Kinesis", "Glue", "Athena", "Redshift", "EMR", "SageMaker" + ] + + found_services = [] + for service in aws_services: + if service in text or service.lower() in text.lower(): + found_services.append(service) + + return found_services diff --git a/early-stopping-sf-bedrock/resources/MainWorkflow.png b/early-stopping-sf-bedrock/resources/MainWorkflow.png new file mode 100644 index 0000000000000000000000000000000000000000..68bada988b528617c0ee645a644ffa75a0fb8f55 GIT binary patch literal 60240 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[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 literal 0 HcmV?d00001 diff --git a/early-stopping-sf-bedrock/resources/WorkerExecutionStatus.png b/early-stopping-sf-bedrock/resources/WorkerExecutionStatus.png new file mode 100644 index 0000000000000000000000000000000000000000..588b96fea6c548610663829abd7a7f4e7956b4e7 GIT binary patch literal 26591 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 OISMkbp;b~QLH`f%cl=@i literal 0 HcmV?d00001 diff --git a/early-stopping-sf-bedrock/resources/WorkerWorkflows.png b/early-stopping-sf-bedrock/resources/WorkerWorkflows.png new file mode 100644 index 0000000000000000000000000000000000000000..4619112640442d7b2fee8c1dbe5a0ea97b698e4a GIT binary patch literal 68350 zcmZU*1ymf();0>0K?b+r?hsspySqCCcOBf_-95Mlm!QF&kl+$rf;%C&{KI>`BkSH- zt5iXQR|4+R}z4F!BF0=e)Z7ZlXHx0Qo;9cp=Yk$;{-W{}gex6(HAEP$m^~bT%jb$i%|LLN16v zN=nM_Y-Yi$DlYkd;Q9v&WM7B*%!HbzJZMi(y! zS7T2`2N#NeRr2q8#LZnyovoc*tsNam-|96saddMPASZuo=s&-I_0!zb`oAqXxcuL+ zAOmE6%VB0^VqyMI-4Ig#w^UwbYfp1K9dT=W2zwxH2y$|<@c&c(|CjUM7XOD*`+q1o z*#DREe{%l6lo~GP&SH-CkS1LP|2s4PNBqB;|3}Er{5JCc;l#h#{7))`&w>d2%>S7) zL4@+VZ}m`6!ca2eBI=&dC!gU0^)=c@UT1yQ)=nIf6&eqbF=pVY5`lEEXdJW}bnbn( z!q70g_gMKC#PAPL5<}(MBG4j~GnA=NWT70SWL=gXP3G?2`Cc3C9v1Ev9xW3KS)b2) zf3Nf0&TV}D{Fs04yH7Zj*>Nc2WCV~81hGI<_X0C}Swu z`cE2*9dPN2)vltQ{EgfJWg2D_O5hXyJJ^#$o)9erzbKvr0w`YZS?Ka~Ocvt|s) z4bzA%%ZLNlm;=A08wd~q21DOH`xElJ!Y9!(>uWc1WfA-YhDQY!6}e-apR&o>)VK8Yq0lXNPAG8>xew0Lcy3KZSPpw9FzsRa6_dl?5 zYIk3l5w3OO*c$r9)sU6mKyTi#1(8uhMi~k1aw%Uh2M;ed@@qdguBWR3n=gSVT(s~& z3nzJua&K;ar(Z2&>pnm*q2}E2Sc@k&3d9mLEfqL4a?n}6N75?4P}S@tz*}K z^1(pXL2_%pd%J{6y2a;WeEDlT&OH%?W9Bk}mYu1)_WO$LLHdCH4)FZ0R&S~FW|{~V zaS=9|$;(%-cl`95>{UW*j&iaNG5-*i$_Fx%l=|Mboyr>}!s}mE&TF@xQ*gAjBCAH- z$5gthZ_dfEU;N(4o5&9|&4R+j#RABFMqhv-iSX<5n&KW2wQm$LuNO6MMv}dM#~3;^ zA`Ei&r&itu{?zTp7%_o9;dXY?_GYVcz_7vMt@eAKH?BI>=z3 zsS2t-M=#HBgxjy{WRZVc*$A}!E(cGv9+bHeC*B*^)+6BJN2#Rk8%ya|n*)j^g|3l| z*(KpaL=|`(tZ&^OQaHX$`y&+Q_jvP%W7W8P@_qbAzz)-^l6vho-6Ku@1F@ai+rF+B zI!f}sqEmX*POQ_Kt#H<$LaK{Pm!CsrI}y`!XZXv}9dup8XM;~)z@9IqIGr+m(~$Lg zEiPQiRs0fe*vD^5mmCFLUU-I4m|UgN;r1TaLRwt9QbFh+_IGbVY@(2B{zc8snP_10Tu~#O|^zxy@EsI;w7$9F@3FzNueeMj1sO=z5 zTA<**n6*W>7Myb_BkvqP_Qm>zytT&?v_;BdJX3;>LtK=4XX zJ)bYvPqFF><#VoU;M^~^3Xe@vytgw-WDM}5D40Fmq9>Q)@ZdnI(VT4^cA=+M-UALB zy!dHbj<&dwEo==Nk}4eJ7Qmzh12BgZMkJR%w`lkK@U<2@=o>U}M6C1y zqtgSekI1vSC)d42ACB zEj&~IeHc6CR+Hr+z|r@HQ5?&!idbR?|0=DTn(dWsDkpO9?22H!!+@-s;NB&<^F-n1 zZ&!Rk_a40&WzQBlnGHb)eoWfjz#$unqFw3rSWKZ#gnjXip=jFx1VhDW8ScmGA?~}o z{KT7bu0^I{S3cy7y9ATj!qs_|A77gaZI|LTC;DJ4H46V;a*irYt9S;x_k3NhCPMce zhRh)jAie#&ajq*l#uk+B%l#jwMLEXcA*sqWRtIKGTvF(iu{nDXTmlT*CvFr&UNHID zN_sk?WeVqSgj|~$6EYp~pT6fR`qvNq{7=8Y!dMj*RN%`xlC3X7^8HEyUNB`+#r3$) zo~M0`6#>MfiIU7;->HFJ`aub;yHul3rgSz-wSZu{))JG9zO;TAm45}6OQO9JtMrn zJjvbtjGJY-Oqi`dT+VUIPkpA+cZ<>gImj#&xe@z0m7XIyL}@L$?x{-0|1}2exy!p* z%j`$OT&nt;uVU^=BQ*hWgcVvuxNxSI%@Qx!jLOdES!n<ttrTV1oOB5*h8%QgKn9xeoS}O`PkYZG zZRQXGPV^r>+<%Kr*gzN?_0Vo>*N`YSQNeK1g=gm&JEhnqm zZjAWoe|8WDd`7^aDN&p`Bm0b3yAga_*NL$~ou5#(@%Ucw*=UhjDW(r9VR40rrpFQ> zPb$&NE%H$a7S)fXS{`eEB1B>icP%Jgh)c}P_C0b=Y=qw~MqB=R;w<*=%!o?BUtiot zQz1V*{If^ai~IB9h4gMCiQW0zraS4KO$tm}9Dr0j@zC8EX8rTjORa(blV0BDPOXX=ND{)vC`U7=G?Z`X(^NOcLxf4o2e3&w(c-M$Hhsd`s!mez@pz3>{Mg(2 zYGEXZoHzF)CH&K}z?IuNpoSNolXK4uYT?m zdv3O(uFsr>#E!K}%z7V-6t>2*gr_kgy>&;unlR{NFu{&1EX{vX>J{o_=h=zpH&()% zyOm2#;#>q}#As~Mir))A{9!NS%D6Q?pw#Mv$c|2!+|Jjy*bDQh9$$I>(!EERsHm2l zz1$)k`DqR4F$PeHkVe|c z2v6Z%)c67nmU5R?SX}&p7tS;#ThgS4=mos#dnQJ%AsqAWYI}bebt&1H7-_yJHre&g zYr7le#^rqEa z!dgv@w%_{wQi~%OPXh9fb9C04n?L)00Os0z8hm_$aTw;?6cAFbFgeO>Y8Xf9S7I;* zaZuMxVA6eN^Lk=WfrOAx~)qjA0J9jAn(9i z#iC|O1_Js>1@AWB>AUqwOdU3J&p7+`{!mc{mH*6*dGE5f)0!ZNzNW>lsx?1d4@ zaT?*ZV4eJzLS|Uz_2>5+mH65ar0413_^$yS*gaFx$zrM zM?x;EKe?daG6LapJL0Q$6YOQ%$?>`$N_Rhm|4KknDM8U8yo>>EFJfQ5bS2$*guyR(vR5Imqbz-FHC2EJ8T4q#aGjU%KTsPDfrmAcZ1f9&RZMQ(=k+&833sV}{wdAv*0srwN zq{W24%=Z|SY4Q1!s=l^w>fGt}Fk8?z87ZMO=83p2KUb)pswS|=>~iT(am?n*J&HOk zJGI|4dTh^`zm+v(qAEQ9N-5SEMr#rXi!A7HwoJHC-DGlohV2%cOx6Jd^8hEvi~+Ey zr!-|#sHq!j2YtO$R%mjsF{QacMhu!JFOGQ7ICC;Hxnw0wZAYPIK>*Du;SRi#!|2QFhFyb&$vqW-(`%x+^=@4*`~ zb=@#LBf`XG1Mr`)nOU_PQL`Mqm8j?$S{3;>a37Kg9FhXBp*lbo5gs5)yl92UL9PsQ zRT)x1G8786GZx;xHWidA2u)SvFdp>Q>=X&$>2#XJCO6{$Ist`wzy*y>@+>)m2Z50P zQa%K|plupwyeRMRLpVT+5kG}cjuiY>UYQ$GG>mi341qobE)#{Bp9Vj-2J5(OpXKeGCsMNj^| ze)I@2Ehl} z=vme`G5X@ccj?>T5F}(U(>C`%9Db06@W)UF%nRWM8}O6it>*e4dCL5M^1MlVQOX5+ zx8xwb_)Syqb^Hh)E;=It{`pVM%J6Rko!V}u5;Ia|0KDr|MO}N21}HqDO7AM6!bH>( zGvSHoj-Cc)FRE`P^dFG-HW^4RJ~JGzKPj^j(-t8uQWaZU4j$lr_tC1kO{375MZVxSL~%oVuQy6`r_C0h|G0LM$3dc! zf@hqA4B{mCdzZrM4Nq$=ne_8Ce0V?1`dHI<-fZB5a$FvYv(k7xR7^r+=WcP;z^lX5 zcGWa#wi3^KFk?=c)Z*Ii`frMYqM@}f8{UYw)_*;@2N$}0W4UYZKo@oy+dWdN{SNT@ zall$7@hQ(eXKdm%mhFRSDbm{6t)=MqcNXN)lavss-p!{^EI_aOJ%TeySc4n|%t8Ij zrJi3f-tW9LToAJ-=C0v9CI7^ST5$}51A`vQ^9D6|5i!1XUC?$my*pP76vT8W#TZGW zzdO*jE36odh$p6{krL%*#g<4@g$|LW>S_kYdz>+~B>Wt0u|(GqF!{4brmVr)h)fr@ zJVs-oMH_@40=uAU#oXF335*>{5bHYiv-|BhD#-pJB6NG-JJi1oZU=lgkEOKf=d9@; z5q?B2L9QM%{K1hP6#qvII(E^9Wx*yWVfb9&npd&+2_M;OzUhfJLMXfY20UMj+R$25 zR5upGY%m&fY`|Jw>uf^x{2taS{pVQ;{-5TMOGK)mVPzm|9Pv(=lF3p+ev4GSs790= z>lUDWZTx|k>jHYcxf{Sr5PF}2s5wRtB)7@p-x675oF7-3ap`%gsMhwxc zMM7g9*aKEnSVT$Qg#!W6uWnA9JX5yr!3d4!Ucgh)aq!dM(aB8uXvYYcB$l6XK-NAh z@j08J<9LKnuamoEQZ>R2YZdO#%w zWYdVxMSxWNHD|TXAI)mk!5e_D0dk2tnv6!!TbFbG{v z9`!Mdm`h7fndD~cV`KWn40Sz4QK_r9ot={@K@_?hIjC+taAo+Q;kXU%JZgKjW(m7x zn@mi5oJL1S9i4yrWO$hy*)};d@{2-S&3Gif_yz9nibOEAB)L>1am;jlr~R*;-yLObH8}ZIoM{au-AA7g*M%P`kyd<4$kTe7CMB z)vc2XX;Qtq#HEARceF-Fdr>u!cbS7_D}<{EI9}E@LxlCJV#X4}3@wG0Kf?94Jy#p(jZFN&kGJEaLft!@>_*WmX|klbH>DM8B4 zG0~ad2}Ug%a`DxTXb*%@2{hR&mp+a_IU@z#9jNJuw{GYx>L8a z^oZiNCY;~{*fS9rO_XO6GIxu!)4TJ;3_p3tz&zUBh#Vr}^aEwHp+N5rZ$DIipb${B z(EHq$!hq$W$>-$Xz0b{K^(t62D4~&B)*pDJ_&Fm?(xF81$~B=_MVoq*%wCAd=HbY& zbU|i-Zk`vDX@PEQ8rLaHXQF_tLEMz(%F$5=3t#dihpM&bAJAM29AsYN82GfhwAtr=wbm9ZkEu6yzVi@n z;oW|PYI<I*5VEfmHyuK!D%%4f{6fHkTGOWiZO;Vt9hLywv%VwO70De^UMSr=m@m#I)d_)bK zQZ0DBdwr}bN=>olx*ZbdgJy84&=b$SU%0KQk#)2NC$jnw#8mc-zS?tSsQvAOTf&7m zu{XC|S+qLiytOX?PH_A(eMu7YTp<~(QyAz0Ohw-L(vE$zD+XI2XZh%OB3)Aq-b*n; zH*$=26AAoH47YkP?wOOGb@icdy|5KivDm8Fd=pTv!vYf)9?&K?qZ#t+x_=W?b3ETI z<9p8cYbi?one8(Bxc6@xN+1Y{9s26^YMNb}KSm>&;^AUJhvCw zxc&fE4AN~nehj5;bUb%F|3Q5UOsJ2EQhOh-dQK92-v2Ng;%A%tY+{xS=>SB|U{Quh zD6q1Le{ckXGM;3fw3-0^&J($cF_zYkTc%#QWo3eMwY}|Sl#E9j*9LpA|H$9b*^tw` zs9T`88T@M}#$*j-eF{3VeOOX!mH6aE7nP@KUMp}6d?d^kM2(~DCbZZn!?){-4 zyE>IP81nU*KA0UM5xw;o9bz0J3E84b#3trg5tSeS(Ic+vkxF*5-*84EFZwSP^_DZf zgQ%5%db4G%>U|!hiKn%Kr-`EC2hJ|)^&LJ)_evr5NLVwzj}Y|Gc@nhPHC9!pW})WP2v@1IIpDHPS9hQEVQfHs2XwELX!gV=nzZ ztviH+(a$Jx9XE88F%f9QtPeAPr_Q320M&RVj8WaN4Z=95ckxlr;H!he><)$tjycbDgG-aWb}L`D8Jp=P;bcpN&v`c z??OU?C5K?Ia(-I>+w;Kq&!=+dp)ZBRYy+0|{5dvwHFnutf_^$bGkzVXehl*=Pwk8l z>uwYvBl$F8mi%3|{1|KP9a;Ar4uC*!`C@e%mfvsBT3cE(zWD;pi>Ud2Q9t6{YpW}( zyXQC0_QD2c31^6*jSXToRAFniN#)?!Rj02eVqMk%*NY*(Z;vmV`y^ilWBEGlSiXPO z^VEA(tr5CWXn*`#t`HRVU`AcDS&3Y#na*j}B$ zSFesYjOo8zw4OP5J;+TM;8>Bh6+$5qDErV6iW#QqpMO zXcJ`u8g%tljfd>K3FcdNB$vDW%@=O|5}Vl0>w()fki8Zu1sod0FAfPr+8J4LNb($05_asdJ{15S;1tN;%V^-(`Dv@fLi$r@XoeG{ain)m5&EE zJ%k_0A~9uT(n@lCF&nF*Sg93Pr2T}}h+^x~Nx^?)7H%0zV_d$GF137$EOzD~j(csV z|1-;G3+vn{!xkph@u1SGvF9k0DXHaZHa{jQhZ%I`&B&B2c6_ut--p#+ou3K<>N3l-q4wuZK= z8jp(+HKp`zhhN{2wLq3?7{uh9IJmOO+3Bz?(1}Jj6#w8e&WfAuX_QE%8wmS;%rZ!T$Y1 zJt;d-4ui>!jbuU?6>YbFNT03i^BU~c77dKV{nVZuI>H|zP<}#Z!HxoaVi0t$xX4k3 zSlWx#&k0*Qr2v*WSa<&B7?UaaBd7-l6YSpy6a_I~^(b&$&iW{8OSV!!l$<~2g^duX z@2TJe+U@GYH>?wieN*VF#w>SUmsijWdS<9qQQlLE{ze;c`CZ+XzD_7p0X8t-3wHI& z=zKpp$VtgYc_+RAe_w0nLXpc{iQVclfa&U9`S9`=tA)N9%I5kG z(^$YDri#ft?iEfFLEr05N}v#i#OH=%*D_Xb0s61JgcoouJt-Gx8uK%54Jhz%)GYXK z_IPBE2H<0&bL(icKGHyQ`{)+A(m`FoXt}g}q#^o#YP82_qLCJrIWt(D3 z3Rri9Y7|^6;V=*EBGN-`16?f3p>Y;FKTz#$Y1r@ z%`t4OJ5DV(mIF8PJ1A*}(%rd!66dIX=h3=@=uZUR_KEYnxM*w-e~W0CVFVqBewQ?| zvgMPi=qK;CZjmO#<-;eA>}R&gsriRXCZ0s!xNv71YfozVLw^~ct|fIDUx#`I(tF-{ z2~StbaT@*^tuUD$t->j>Ux&^m6s1j99V9%`uve0Gn#T0Vg=UYAz8=SLZREBUyX!DC z+kcL^wio4a%)cN^cW}E^x(Tx-`9fsU)IfgPPepP278#^LbM$5OyQ4xsX4LGt5)U#( zUP#C=uuPaU`Sdyw5{Q~Bmj1>e`2I*592pB_2{L;e;FMVvv(CppGG7WtS)3ndHwdqh zt+kp0>2ud&C!DNh(A`G-+1tDGRG&qYYq_{PU4O^j*@BNhKl-|6hW~>`-Ute)?TZ9O zY{{4_>VmS@Vz=Kl#%ma=c?2+BfYJIlPxM zK99{)w8a$1U`OLUC3H{~g?=rS7}mg%UJw zIpNGKL8_FAFE5NkEiO57Nl*f9J6mY#-tQPV&T5LyOT@OE^10I0O2h3RmfdtHf0JON zcg}n=OD|ux$nYpuD>+}!PNIxRTTi#2WJ;LK67~Rgv-(iyl?@GcH|_d0wo#Fl%^r=) zcxFs0eXpiuS+nR1iNSHr_`H)PJO**TQE6i_JChxg4xls zCrFiFf*xOp5V@6cx#ns3;w0Z))PX}x?naSDQ+5auwnIcVw>!YxO&ti2GEOId?$JuK z4Et%!05veGwyEhJ1hF=4NN>tbZC|YUQ`(H-#J?ff$a0Cd-O)gJD~oV63X}4cb2p`haGWehyl5z(shXBh)@$WEc z;Q%LpR8TzHGaoV`(!TsmuncQH4(syT$0G-+=C%3b4~l#}H!S2crRA?GX@kYYFvPdN zNxTn}3nSpUyo&srq82&}da{-Dd~jq1u;yRoF40;zT1B{fZ*U*7nbf5Dh`o30^&3Cf zK1Wrc5@ZV;^jUJHbaE()db+d!1^;2aAZ{oHkF=!~XF%x*N}hM^=Aj3rHP0Lpy_Z>C zDe65xXn$b60?)svZ4b*CL)V?Yt_cKiUgP|US*8Rf21O^J<@x%&^A8`p+o9W;UMwwM z#&_S$;p?i%X#w_pCaqJ&zHBuW6OW-np*X!DkMKS8ei5delKkM6sKyBW!A4>FtS6Cmqhrk`jfFSK_^!3DNulQyF#KH8{YJUwb@lszWF65V+~&W!mh1r z2u{JmgeW_QT)Em9#Uu+PixV};iDu@d;g%mfk?cWKx%g~9ro2phLj=sGGwrzsvcOIn zror<_%h{zA(kArLEl!~fB(j-qHoSW>QayKmBFk1kaYV)K2Ysv1_vG7&hRlDaddrvY z9_~u~qI2Yioq;h3)~q?Djac>@osAa*`IWnSj7!S(=7+<6Tb_#_U1Ft+LDq4yiXADO z@7;AaMa|8mH;*x@%Nfp!eV>`}waJkZzo^5PBQ&|Z)-JthV+&}tlKPDdBQB9t!39%> zm)kndeWJ`Dh&`FcvAy#668>firME~xEy_NwE#XaHJt_y$3V&iC90P{u3-3(-Xmf5Q z#+j42=r<0q*wEWDacf|>}~CpVY)A|`#GnegEo5VXOW5i+M<)Ojj;m*0m@8#N;RYdkn_|+ro z)BB!$3p0sXrbPngzoLx4*Z#QMGiEb257WWi-*Hft6J?OG->@CIRZ`zhVw3`FZ##=> z+T1tST#D)cG5%mv#?T*X6KviM~)VbEIdH`vqY5Nm?EFuiAWh?}b( zb8)K6NdzW>7X=4-_OsZ4#s)s1N+mS zYkzrSO@551=iS{&I_&a8c=7gT%v)`SNhm}?Wx$m}wY)^kQ=J-Mr@=kG_|9HtB>J%E z*$m@RyAnTw(y|%j^2qjnG(JbsF#4E1Z1`gDChjh(9AQ7%4fyhWcN6a}|M@GHN5Xse zU|`F+H;&;(1CDLgzL5km;`b+6{1F@Sq%D~A#0{yO#djGCQC{=Z6C2aQ*!a3&O$>b| z3@QYDWvUe;@;E-KEmjE(r2a{&AThX)JIh_?J7gnt*S$(Qgc!(oW8L63?>=(fxb$kw zBjBge=KS!DY!5RKYJ2Y26&cUKLD+_D#xhGOg3HrIkFAJD+spFG%C3mc)Z@Oo1+G3V zKAhLw)6^PDGqS?Hw-3930APo60*eIURT5dji1mEq1=?R*dz6Wy9b+X+PLZT$*=n`& z(moJ6$5lJWZ*qy>FJfxh?EPZ0pQ7GtxNal=1@A?majI(_?bU% z3`k9t5G626_lv0)4BF{d6~(J7>vcEa%NDw+8x!kDue(k+He$83PUl)hAggJ(SJ$U( zNL5KiZ|oE`;F=@kgAZw3P4e3agvm2b`#=o(l z5R1Y(ST|eDh~9k%F(T0c?Cv)c0GPCh01!tD@jyyMc73{kvQkaGm>hP*3y?&h&2fpS zs4zdJf%mIuH?yQ#FuBylDOV#+!>|>uXhJoJqkaDHWafoih$0C+3$3rS*?sjJUVlg7 z5LOPXO7`B0^uAus*hcXeKvU`Jbs!FJuU&s=?u@j4)HIP};FT-)mpw|E9?;3aVk?vz zCeDshtt@ZtI1J1n$o<07hMkc{>0{6y*W;;uN!ljy3!y{S?mx7 zD^1SZK)fKE^k_^N1;i*vKIJKWmlDcSRZGkztENGreOx4n{os2|(#JKrUt+OLp6$PK zcs#&OER-1T-}tLEJgBjlZQpDc&$4&Yz11XUBe(|iPKVBH@ne5H z25@0q>6XL!xX#2(|LU)Dk?p=Fj-SoVF3FJs4Hu?j`NdN>)hLxTIOAoV747>F9}T#x zn@!U%F46kVdQBR0s#jKIUx+_eJC*c&u{w~_=3ZV~Vxp3N6>IVw98E1X?EpW>W)v?6 z)iGwqxTOA|#Betf^X~hoYp!11>KrN0dAL) zC$zdOT~$|h6=U66b1Lwds%>gs)quSy`)uEr== zs0feB6%1%8H@ImipsPI=ToPdit8=JTWRPXJMsO8uOmT4sm7W>Ud!7WWj+)GRrDz78PTPY_7mab5TPe}m5Q7g*= z?=babJz`eq(YZ?&j3f{RQn}Hfy>XR@BY3mX{|vO6QSUPp(B<*iHFJCHnelh}lXTy9 z+4y4}x<{E7b?oR)*UbXDyh7P{R))68{T@!eiWF;B+t%9fqW%_kNI z(w+!gYjt3zM15nE|Kc=8~PdHDRI0R81eHn%3B2tiI zLI^3vrBf z7*hIJQ;sKoSWrNgn!=iI@%uMwv)yAlqbI#yzEu@?G4@1rf075cA$(^9oXH?fm?=z$ zuB<+%h<{gx19PJ-cdW62ecjJfhM!Y4jFp*_0+B`S`Qy(|JV_pfE~A{Kl4f7wbqJdU zP*6t^!^nJ8>T@w*cjELTt_i7yK-PWDeY77P@eVse4P_<=_`I5KvFNZdV?cXRuq>H6d^Fvf_5i5(!aV&&A&@IhTeHk zqeo6<*ya2JxUocLlATg2yZ#`&f&I(CFYYoJqV9e`*fESOMRd4;YHVPF?-DfWTth8z z%Cpv8DD=hJ<3O`2Eo@|}cn=>o3+mAqiA|Zw!4v+QtY#By&PQY=bA3ciT2;XOHCKI$ zY}*(_$S-{}>|3ufJJ?6}Y8K;3VaYDto|;n27chX9ZcqBi8mGQFa-^BRw$GL-yp`PO zX>@o#w;dJ%pWxa(-ez#Zo%!CQqZR3SeFFtl5bODW-X~5#fSlrzL-q`littK@`LUm& zgcwga+@DvJ6DjB+;5{2eYr-1q^T>FYo$VB$KosuR(rXp|-H$*MaN@)Zi5F<>qbBY4 zC8@+qD1|2Z>G|x2TdV@Hg8}KS_@<3-)`?HL!CvyhvxS6Q2|sI zWZSbCWChpvR&|}+pKu47bYy?0gV_;Ddj&~gdbdmdrIv@N#(R6;ZHkqSA6v6X-Bdk z=tC!~SA1C@@9o5RGd$!&@X5nuyh}VAVDhfh0uPhTrKSfiDSx$lj`x=Tp?A(szgUb0s2CvXEWgB z0FKSm#S=CoY;G7M6ySreHrj}ex>384YCUUroy)O4)w;j|!PWDq-n643vnFIi&Pd~G zAj-oxPfA=V>5j5N!fXt`N)=@5e3Nkx#9ad0#x3e%X_7vYY-|0Aqd^Ux?=2-qa*PgD znichPHhmJy{r*~B6wv%fT04Kd|3ICqAlY{LbL7mm$uOcWmUjGnbBk$&D2qme`^tA^ z3Rn^BVn_SM(5B?Ji*~vq<%GVwt9CFJQd-RXynYZA+Q3*kL@XT7dNz_vPLv^+4Ich7 zQG+-J;=kW1FtEB8N7POPY<&d;(vk5xkkoeUQkj zwMY9aYGa6Mu6n-UNfG!nmT$tQl6k!Z=?CWZwg?;Nj|S~ax?qCnyUY5;kdZWZ{S=s+ zOrbzVZ^XUZVO`UHB2CWtq=Ngee1Uix78509rT6e#wA|$zR7C3{O3bFkJBRnzgo*R>v&#)fVq87{G|5~1wPfs9eu5=2}AjI_X zA(b`T@$6g+;k=}rV`P%&(7A+puzr=y!6BK7FG=@|#g=H=Jib2eW}J$DtYpMI#Ay;F zhOs9Kr}ysVLmx?R!{$=QWo0^c_zJV?$xVmQ zOq;G67M(#>AW`V5*|=Cy8!dFcHzbadHyBK%$z7d^QT9|~VPPeGVil)d6Ssp}3uS`O zY0_L58Nz^5^%Yd@=&_UeD@sl#^e?vlG`#!pd}f`BacnAge2v*<;ButWp}B3MhT|ZD z&ErN0x~EkV_b<_sL2V5zr3doN*_^S+&@he4U=68-a3{ha>QA^w-wj@XgsyyDl(l

q0%12Kl0E<+;mZLAhl#NmCj=MkoSi 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 literal 0 HcmV?d00001 diff --git a/early-stopping-sf-bedrock/statemachine/main.asl.json b/early-stopping-sf-bedrock/statemachine/main.asl.json new file mode 100644 index 00000000..6bf0beef --- /dev/null +++ b/early-stopping-sf-bedrock/statemachine/main.asl.json @@ -0,0 +1,158 @@ +{ + "Comment": "Main Step Function for Job Processing - Coordinates multiple workers to generate random numbers until reaching a target sum", + "StartAt": "ParseInput", + "States": { + "ParseInput": { + "Comment": "Handles both SQS message format and direct JSON input", + "Type": "Choice", + "Choices": [ + { + "Variable": "$.query", + "IsPresent": true, + "Next": "Parse Direct Input" + } + ], + "Default": "Parse SQS Input" + }, + "Parse SQS Input": { + "Comment": "Extracts and parses JSON from SQS message body", + "Type": "Pass", + "InputPath": "$[0].body", + "Parameters": { + "parsed": { + "input.$": "States.StringToJson($)" + } + }, + "Next": "Initialize" + }, + "Parse Direct Input": { + "Comment": "Passes through direct JSON input", + "Type": "Pass", + "Parameters": { + "parsed": { + "input.$": "$" + } + }, + "Next": "Initialize" + }, + "Initialize": { + "Comment": "Sets up initial state with query and 4 workers using different approaches", + "Type": "Pass", + "Parameters": { + "query.$": "$.parsed.input.query", + "approaches": [ + { + "workerId": 1, + "approach": "general" + }, + { + "workerId": 2, + "approach": "service_specific" + }, + { + "workerId": 3, + "approach": "architecture_patterns" + }, + { + "workerId": 4, + "approach": "cost_optimization" + } + ] + }, + "Next": "Launch Workers" + }, + "Launch Workers": { + "Comment": "Starts worker state machine with task token. First worker to complete advances the workflow.", + "Type": "Task", + "Resource": "arn:aws:states:::states:startExecution.waitForTaskToken", + "Parameters": { + "StateMachineArn": "${WorkerStateMachine}", + "Input": { + "workers.$": "$.approaches", + "query.$": "$.query", + "executionName.$": "$$.Execution.Name", + "taskToken.$": "$$.Task.Token" + }, + "Name.$": "$$.Execution.Name" + }, + "TimeoutSeconds": 600, + "Catch": [ + { + "ErrorEquals": ["States.Timeout", "States.TaskFailed"], + "Next": "All Workers Failed" + } + ], + "ResultPath": "$.workerResult", + "Next": "Clean Up Workers" + }, + "All Workers Failed": { + "Comment": "Handles case when all workers fail or timeout", + "Type": "Fail", + "Cause": "All workers failed or timed out", + "Error": "AllWorkersFailed" + }, + "Clean Up Workers": { + "Comment": "Stops the worker state machine execution after first result", + "Type": "Task", + "Resource": "arn:aws:states:::aws-sdk:sfn:stopExecution", + "Parameters": { + "ExecutionArn.$": "$.workerResult.executionArn", + "Cause": "Successfully completed - First worker returned valid result", + "Error": "SUCCESS" + }, + "ResultPath": null, + "Next": "Update State" + }, + "Update State": { + "Comment": "Extracts successful worker result", + "Type": "Pass", + "Parameters": { + "query.$": "$.query", + "approaches.$": "$.approaches", + "result.$": "$.workerResult.result", + "confidence_score.$": "$.workerResult.confidence_score", + "agent_id.$": "$.workerResult.agent_id" + }, + "Next": "Generate Synthesis" + }, + "Generate Synthesis": { + "Comment": "Generates final synthesis output with early termination details", + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "Parameters": { + "FunctionName": "${SynthesisFunction}", + "Payload": { + "original_query.$": "$.query", + "agent_results": [ + { + "result.$": "$.result", + "confidence_score.$": "$.confidence_score", + "agent_id.$": "$.agent_id" + } + ] + } + }, + "ResultPath": "$.synthesis", + "Next": "Format Final Output" + }, + "Format Final Output": { + "Comment": "Formats the final JSON output with all required fields", + "Type": "Pass", + "Parameters": { + "early_termination": true, + "original_query.$": "$.query", + "winning_approach.$": "$.approaches[?(@.workerId == $.agent_id)].approach", + "confidence_score.$": "$.confidence_score", + "result.$": "$.result", + "synthesized_result.$": "$.synthesis.Payload.synthesized_result", + "agent_id.$": "$.agent_id" + }, + "Next": "Success" + }, + "Success": { + "Comment": "Final state - returns text obtained AWS documentation server", + "Type": "Succeed", + "OutputPath": "$" + } + } +} \ No newline at end of file diff --git a/early-stopping-sf-bedrock/statemachine/worker.asl.json b/early-stopping-sf-bedrock/statemachine/worker.asl.json new file mode 100644 index 00000000..235ed2f2 --- /dev/null +++ b/early-stopping-sf-bedrock/statemachine/worker.asl.json @@ -0,0 +1,93 @@ +{ + "Comment": "Worker Step Function that generates random numbers between 1-10 and reports back to main state machine", + "StartAt": "Initialize Workers", + "States": { + "Initialize Workers": { + "Comment": "Map state to handle multiple workers in parallel", + "Type": "Map", + "ItemsPath": "$.workers", + "Parameters": { + "taskToken.$": "$.taskToken", + "executionName.$": "$.executionName", + "query.$": "$.query", + "workerId.$": "$$.Map.Item.Value.workerId", + "approach.$": "$$.Map.Item.Value.approach" + }, + "Iterator": { + "StartAt": "Call Worker Agent", + "States": { + "Call Worker Agent": { + "Comment": "Invokes WorkerAgent to query AWS MCP server", + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "Parameters": { + "Payload": { + "query.$": "$.query", + "agent_id.$": "$.workerId", + "approach.$": "$.approach" + }, + "FunctionName": "${WorkerAgentFunction}" + }, + "ResultPath": "$.agentResult", + "Catch": [ + { + "ErrorEquals": ["States.ALL"], + "Next": "Worker Error" + } + ], + "Next": "Evaluate Result" + }, + "Worker Error": { + "Comment": "Handles worker agent errors and ends workflow", + "Type": "Fail", + "Cause": "Worker agent execution failed", + "Error": "WorkerAgentError" + }, + "Evaluate Result": { + "Comment": "Evaluates if the agent result meets confidence threshold", + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "Parameters": { + "Payload.$": "$.agentResult.Payload", + "FunctionName": "${EvaluationFunction}" + }, + "ResultPath": "$.evaluation", + "Next": "Check Confidence Threshold" + }, + "Check Confidence Threshold": { + "Comment": "Checks if confidence threshold is met", + "Type": "Choice", + "Choices": [ + { + "Variable": "$.evaluation.Payload.threshold_met", + "BooleanEquals": true, + "Next": "Report Success" + } + ], + "Default": "Worker Error" + }, + "Report Success": { + "Comment": "Reports back to main state machine with generated number using task token", + "Type": "Task", + "Resource": "arn:aws:states:::aws-sdk:sfn:sendTaskSuccess", + "Parameters": { + "TaskToken.$": "$.taskToken", + "Output": { + "result.$": "$.evaluation.Payload.result", + "confidence_score.$": "$.evaluation.Payload.confidence_score", + "agent_id.$": "$.evaluation.Payload.agent_id", + "workerId.$": "$.workerId", + "executionArn.$": "$$.Execution.Id", + "executionName.$": "$.executionName", + "query.$": "$.query", + "approach.$": "$.approach" + } + }, + "End": true + } + } + }, + "End": true + } + } +} \ No newline at end of file diff --git a/early-stopping-sf-bedrock/template.yaml b/early-stopping-sf-bedrock/template.yaml new file mode 100644 index 00000000..8481da24 --- /dev/null +++ b/early-stopping-sf-bedrock/template.yaml @@ -0,0 +1,212 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: SAM Template for Worker Job Processing + +Resources: + # AWS MCP Server Lambda Function (First Deployment) + AWSMCPServerFunction: + Type: AWS::Serverless::Function + Properties: + CodeUri: functions/ + Handler: awsdocmcpserver.handler + Runtime: python3.12 + Timeout: 300 + MemorySize: 512 + Environment: + Variables: + FASTMCP_LOG_LEVEL: ERROR + AWS_DOCUMENTATION_PARTITION: AWS + + # IAM Role for invoking MCP Server Lambda + MCPServerInvokeRole: + Type: AWS::IAM::Role + Properties: + RoleName: !Sub ${AWS::StackName}-MCPServerInvokeRole + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: + Service: + - lambda.amazonaws.com + - states.amazonaws.com + Action: sts:AssumeRole + Policies: + - PolicyName: InvokeMCPServerPolicy + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: + - lambda:InvokeFunction + Resource: !GetAtt AWSMCPServerFunction.Arn + + # SQS Queue + JobQueue: + Type: AWS::SQS::Queue + Properties: + QueueName: JobQueue + VisibilityTimeout: 180 # 3 minutes, adjust as needed + + # EventBridge Pipe + SQSToStateMachinePipe: + Type: AWS::Pipes::Pipe + DependsOn: + - SQSToStateMachinePipeRole + - MainStateMachine + Properties: + Name: pipe-sqs-to-sfn + RoleArn: !GetAtt SQSToStateMachinePipeRole.Arn + Source: !GetAtt JobQueue.Arn + Target: !Ref MainStateMachine + SourceParameters: + SqsQueueParameters: + BatchSize: 1 + TargetParameters: + StepFunctionStateMachineParameters: + InvocationType: FIRE_AND_FORGET + + # IAM Role for EventBridge Pipe + SQSToStateMachinePipeRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: + Service: pipes.amazonaws.com + Action: sts:AssumeRole + Policies: + - PolicyName: SQSAccess + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: + - sqs:ReceiveMessage + - sqs:DeleteMessage + - sqs:GetQueueAttributes + Resource: !GetAtt JobQueue.Arn + - PolicyName: StepFunctionAccess + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: states:StartExecution + Resource: !Sub arn:aws:states:${AWS::Region}:${AWS::AccountId}:stateMachine:${AWS::StackName}-MainStateMachine + + WorkerAgentFunction: + Type: AWS::Serverless::Function + Properties: + CodeUri: functions/ + Handler: workeragent.lambda_handler + Runtime: python3.12 + Timeout: 60 + MemorySize: 256 + Environment: + Variables: + MODEL_ID: us.anthropic.claude-3-5-haiku-20241022-v1:0 + MCP_FUNCTION_NAME: !Ref AWSMCPServerFunction + Policies: + - Statement: + - Effect: Allow + Action: + - bedrock:InvokeModel + - lambda:InvokeFunction + Resource: + - "arn:aws:bedrock:*::foundation-model/us.anthropic.claude-3-5-haiku-20241022-v1:0" + - !GetAtt AWSMCPServerFunction.Arn + + EvaluationFunction: + Type: AWS::Serverless::Function + Properties: + CodeUri: functions/ + Handler: evaluationfn.lambda_handler + Runtime: python3.12 + Timeout: 30 + MemorySize: 128 + Environment: + Variables: + CONFIDENCE_THRESHOLD: "0.8" + Policies: + - Statement: + - Effect: Allow + Action: + - states:StopExecution + Resource: "*" + + SynthesisFunction: + Type: AWS::Serverless::Function + Properties: + CodeUri: functions/ + Handler: synthesis.lambda_handler + Runtime: python3.12 + Timeout: 60 + MemorySize: 256 + Environment: + Variables: + MODEL_ID: us.anthropic.claude-3-5-haiku-20241022-v1:0 + Policies: + - Statement: + - Effect: Allow + Action: + - bedrock:InvokeModel + Resource: "arn:aws:bedrock:*::foundation-model/us.anthropic.claude-3-5-haiku-20241022-v1:0" + + # Step Functions + MainStateMachine: + Type: AWS::Serverless::StateMachine + Properties: + DefinitionSubstitutions: + WorkerStateMachine: !GetAtt WorkerStateMachine.Arn + SynthesisFunction: !GetAtt SynthesisFunction.Arn + Policies: + - LambdaInvokePolicy: + FunctionName: '*' + - Statement: + - Effect: Allow + Action: + - states:StartExecution + - states:StopExecution + - states:DescribeExecution + Resource: + - !Sub arn:aws:states:${AWS::Region}:${AWS::AccountId}:stateMachine:WorkerStateMachine-* + - !Sub arn:aws:states:${AWS::Region}:${AWS::AccountId}:execution:WorkerStateMachine-* + DefinitionUri: statemachine/main.asl.json + + WorkerStateMachine: + Type: AWS::Serverless::StateMachine + Properties: + DefinitionSubstitutions: + WorkerAgentFunction: !GetAtt WorkerAgentFunction.Arn + EvaluationFunction: !GetAtt EvaluationFunction.Arn + Policies: + - LambdaInvokePolicy: + FunctionName: '*' + - Statement: + - Effect: Allow + Action: + - states:SendTaskSuccess + - states:SendTaskFailure + - states:SendTaskHeartbeat + Resource: '*' + DefinitionUri: statemachine/worker.asl.json + +Outputs: + AWSMCPServerFunctionArn: + Description: ARN of the AWS MCP Server Lambda Function + Value: !GetAtt AWSMCPServerFunction.Arn + Export: + Name: !Sub ${AWS::StackName}-MCPServerArn + MCPServerInvokeRoleArn: + Description: ARN of the role to invoke MCP Server Lambda + Value: !GetAtt MCPServerInvokeRole.Arn + Export: + Name: !Sub ${AWS::StackName}-MCPServerInvokeRoleArn + JobQueueUrl: + Description: URL of the Job Queue + Value: !Ref JobQueue + MainStateMachineArn: + Description: ARN of the Main State Machine + Value: !Ref MainStateMachine \ No newline at end of file From 4e4d5e736d65f649d5108f535792388b187e8e99 Mon Sep 17 00:00:00 2001 From: Satya Vedamtam Date: Mon, 17 Nov 2025 19:52:23 -0500 Subject: [PATCH 2/3] Added example-workflow.json --- .../example-workflow.json | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 early-stopping-sf-bedrock/example-workflow.json diff --git a/early-stopping-sf-bedrock/example-workflow.json b/early-stopping-sf-bedrock/example-workflow.json new file mode 100644 index 00000000..0cd7c905 --- /dev/null +++ b/early-stopping-sf-bedrock/example-workflow.json @@ -0,0 +1,76 @@ +{ + "title": "Smart Exploration with Early Stopping workflow", + "description": "Runs multiple worker workflows to answer AWS questions, and terminates once high confidence answer is received.", + "language": "Python", + "simplicity": "2 - Pattern", + "usecase": "", + "type": "Standard", + "diagram":"/resources/MainWorkflow.png", + "videoId": "", + "level": "200", + "framework": "SAM", + "services": ["bedrock","stepfunctions", "eventbridge","lambda"], + "introBox": { + "headline": "How it works", + "text": [ + "A user submits a query (eg. What is CloudFront ?), and AWS Step Functions orchestrates 4 parallel agent workflows simultaneously. Each agent uses a different specialized approach (service-specific, architecture patterns, cost optimization, and general overview). Response with high confidence is used to terminate rest of the workflows." + ] + }, + "testing": { + "headline": "Testing", + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "headline": "Cleanup", + "text": [ + "1. Delete the stack: sam delete." + ] + }, + "deploy": { + "text": [ + "sam deploy --guided" + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/step-functions-workflows-collection/tree/main/dynamodb-transfer/", + "templateDir":"dynamodb-transfer", + "templateFile": "template.yaml", + "ASL": "statemachine/statemachine.asl.json" + }, + "payloads": [ + { + "headline": "", + "payloadURL": "" + } + ] + }, + "resources": { + "headline": "Additional resources", + "bullets": [ + { + "text": "The AWS Step Functions Workshop", + "link": "https://catalog.workshops.aws/stepfunctions/en-US" + } + ] + }, + "authors": [ + { + "name": "Dave Horne", + "image": "https://d2908q01vomqb2.cloudfront.net/9e6a55b6b4563e652a23be9d623ca5055c356940/2025/04/07/me.jpeg", + "bio": "Dave is a senior solutions architect supporting Federal System Integrators at AWS. He is based in Washington, DC, and has 15 years of experience building, modernizing, and integrating systems for public sector customers. Outside of work, Dave enjoys playing with his kids, hiking, and watching Penn State football.", + "linkedin": "davidjhorne", + "twitter": "" + }, + { + "name": "Satya Vedamtam", + "image": "", + "bio": "Satya is a senior solutions architect supporting US Federal customers at AWS. He is passionate about serverless technologies and everyday is an opportunity to solve customer challenges.", + "linkedin": "svedamtam", + "twitter": "" + } + ] + } + \ No newline at end of file From a995fe9ad389a937f9f033dd38128da385ddf401 Mon Sep 17 00:00:00 2001 From: Satya Vedamtam Date: Sat, 22 Nov 2025 17:46:15 -0500 Subject: [PATCH 3/3] Updates per the comments --- early-stopping-sf-bedrock/README.md | 32 +++++++------------ .../example-workflow.json | 10 +++--- .../functions/synthesis.py | 2 +- early-stopping-sf-bedrock/template.yaml | 16 +++------- 4 files changed, 22 insertions(+), 38 deletions(-) diff --git a/early-stopping-sf-bedrock/README.md b/early-stopping-sf-bedrock/README.md index 0ab0616e..69d2d4c1 100644 --- a/early-stopping-sf-bedrock/README.md +++ b/early-stopping-sf-bedrock/README.md @@ -1,6 +1,6 @@ # Parallel Execution with Early Stopping pattern with AWS Step Functions and Amazon Bedrock -The **Parallel Agent Early Stopping** pattern uses AWS Step Functions and Amazon Bedrock to run multiple AI agents simultaneously on the same problem, with different approaches, and automatically terminates unnecessary processes once a high-confidence solution is discovered. The workflow coordinates Worker Agents that either retrieve information from the AWS Documentation MCP Server or generate responses using Amazon Bedrock models, while an Evaluation Agent continuously assesses confidence levels and triggers early stopping when a predetermined threshold is met. This design optimizes both performance and cost through parallel exploration, intelligent termination, and resource optimization techniques including agent tiering, token optimization, and Lambda memory tuning. +The **Parallel Agent Early Stopping** pattern uses AWS Step Functions and Amazon Bedrock to run multiple AI agents simultaneously on the same problem, with different approaches, and automatically terminates unnecessary processes once a high-confidence solution is discovered. The workflow coordinates Worker Agents that either retrieve information from the AWS Documentation MCP Server or generate responses using Amazon Bedrock models, while an Evaluation Agent continuously assesses confidence levels and triggers early stopping when a predetermined threshold is met. This design optimizes both performance and cost through parallel exploration, intelligent termination, and resource optimization techniques including agent tiering, token optimization, and Lambda memory tuning. Learn more about this workflow at Step Functions workflows collection: https://serverlessland.com/workflows/early-stopping-sf-bedrock @@ -40,7 +40,7 @@ Important: this application uses various AWS services and there are costs associ 1. A user submits a query (eg. What is CloudFront ?), and AWS Step Functions orchestrates 4 parallel agent workflows simultaneously. Each agent uses a different specialized approach (service-specific, architecture patterns, cost optimization, and general overview). -2. Each agent independently retrieves information from the AWS Documentation MCP Server (Context Provider). If relevant information isn't available, agents fall back to Amazon Bedrock models to generate responses. +2. Each agent independently retrieves information from the AWS Documentation MCP Server (Context Provider). If relevant information isn't available, agents fall back to Amazon Bedrock models to generate responses. Claude Haiku 3.5 is used in this example for its speed and cost-effectiveness. 3. As results arrive, an Evaluation Agent assesses each response's confidence level. When any agent produces a result exceeding the confidence threshold (typically 0.95), Step Functions automatically terminates the other executing workflows to optimize resources and costs. @@ -54,21 +54,11 @@ Important: this application uses various AWS services and there are costs associ ![image](./resources/WorkerExecutionStatus.png) ## Testing -Based on the uploaded document, here are the testing instructions for logging into the console and starting execution of the main workflow: -## Testing Instructions - -1. Log in to the AWS Management Console - - Navigate to console.aws.amazon.com - - Enter your AWS account credentials - - Select the region where you deployed the solution (e.g., us-east-1) - -2. Access AWS Step Functions Console - - From the AWS services menu, search for and select "Step Functions" +1. Log in to the AWS Step Functions Console - In the Step Functions dashboard, locate and click on the "MainStateMachine" that was created during deployment - - You should see details about the state machine including its Amazon Resource Name (ARN) -3. Start a New Execution +2. Start a New Execution - Click the "Start execution" button - In the input field, enter a test query in JSON format: ```json @@ -77,13 +67,13 @@ Based on the uploaded document, here are the testing instructions for logging in - Optionally, provide a name for your execution in the "Name" field - Click "Start execution" to begin the workflow -4. Monitor the Execution +3. Monitor the Execution - The console will display a visual representation of your workflow execution - - You'll see the workflow spawn multiple parallel agents with different specialized approaches - - Watch as some agents complete successfully while others are terminated early - - When execution completes, review the output in the "Execution output" tab to see the synthesized result + - The main workflow starts execution of 4 worker agents in parallel using a distributed map + - Worker agent execution shows the agent with success, and others as aborted + - Review the main workflow's output in the "Execution output" tab to see the synthesized result -5. Verify Results +4. Verify Results - Check that the output includes a "status" field (typically "synthesized") - Review the "processing_details" section to confirm early stopping functionality - Verify that responses include attribution to AWS Documentation @@ -95,11 +85,11 @@ Based on the uploaded document, here are the testing instructions for logging in ```bash aws cloudformation delete-stack --stack-name STACK_NAME ``` -1. Confirm the stack has been deleted +2. Confirm the stack has been deleted ```bash aws cloudformation list-stacks --query "StackSummaries[?contains(StackName,'STACK_NAME')].StackStatus" ``` ---- -Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: MIT-0 diff --git a/early-stopping-sf-bedrock/example-workflow.json b/early-stopping-sf-bedrock/example-workflow.json index 0cd7c905..e28058d1 100644 --- a/early-stopping-sf-bedrock/example-workflow.json +++ b/early-stopping-sf-bedrock/example-workflow.json @@ -35,10 +35,10 @@ }, "gitHub": { "template": { - "repoURL": "https://github.com/aws-samples/step-functions-workflows-collection/tree/main/dynamodb-transfer/", - "templateDir":"dynamodb-transfer", + "repoURL": "https://github.com/aws-samples/step-functions-workflows-collection/tree/main/early-stopping-sf-bedrock/", + "templateDir":"early-stopping-sf-bedrock", "templateFile": "template.yaml", - "ASL": "statemachine/statemachine.asl.json" + "ASL": "statemachine/main.asl.json" }, "payloads": [ { @@ -60,14 +60,14 @@ { "name": "Dave Horne", "image": "https://d2908q01vomqb2.cloudfront.net/9e6a55b6b4563e652a23be9d623ca5055c356940/2025/04/07/me.jpeg", - "bio": "Dave is a senior solutions architect supporting Federal System Integrators at AWS. He is based in Washington, DC, and has 15 years of experience building, modernizing, and integrating systems for public sector customers. Outside of work, Dave enjoys playing with his kids, hiking, and watching Penn State football.", + "bio": "Dave is a senior Solutions Architect supporting Federal System Integrators at AWS. He is based in Washington, DC, and has 15 years of experience building, modernizing, and integrating systems for public sector customers. Outside of work, Dave enjoys playing with his kids, hiking, and watching Penn State football.", "linkedin": "davidjhorne", "twitter": "" }, { "name": "Satya Vedamtam", "image": "", - "bio": "Satya is a senior solutions architect supporting US Federal customers at AWS. He is passionate about serverless technologies and everyday is an opportunity to solve customer challenges.", + "bio": "Satya is a senior Solutions Architect supporting US Federal customers at AWS. He is passionate about serverless technologies and everyday is an opportunity to solve customer challenges.", "linkedin": "svedamtam", "twitter": "" } diff --git a/early-stopping-sf-bedrock/functions/synthesis.py b/early-stopping-sf-bedrock/functions/synthesis.py index 8ae3d8e5..d617af37 100644 --- a/early-stopping-sf-bedrock/functions/synthesis.py +++ b/early-stopping-sf-bedrock/functions/synthesis.py @@ -110,7 +110,7 @@ def extract_aws_services(text): aws_services = [ "EC2", "S3", "Lambda", "DynamoDB", "RDS", "Aurora", "ECS", "EKS", "SQS", "SNS", "API Gateway", "CloudFormation", "CloudFront", "Route 53", - "2PC", "IAM", "CloudWatch", "Step Functions", "EventBridge", "Cognito", + "VPC", "IAM", "CloudWatch", "Step Functions", "EventBridge", "Cognito", "Kinesis", "Glue", "Athena", "Redshift", "EMR", "SageMaker", "Bedrock" ] diff --git a/early-stopping-sf-bedrock/template.yaml b/early-stopping-sf-bedrock/template.yaml index 8481da24..2f25eb0f 100644 --- a/early-stopping-sf-bedrock/template.yaml +++ b/early-stopping-sf-bedrock/template.yaml @@ -9,7 +9,7 @@ Resources: Properties: CodeUri: functions/ Handler: awsdocmcpserver.handler - Runtime: python3.12 + Runtime: python3.14 Timeout: 300 MemorySize: 512 Environment: @@ -101,7 +101,7 @@ Resources: Properties: CodeUri: functions/ Handler: workeragent.lambda_handler - Runtime: python3.12 + Runtime: python3.14 Timeout: 60 MemorySize: 256 Environment: @@ -123,25 +123,19 @@ Resources: Properties: CodeUri: functions/ Handler: evaluationfn.lambda_handler - Runtime: python3.12 + Runtime: python3.14 Timeout: 30 MemorySize: 128 Environment: Variables: CONFIDENCE_THRESHOLD: "0.8" - Policies: - - Statement: - - Effect: Allow - Action: - - states:StopExecution - Resource: "*" - + SynthesisFunction: Type: AWS::Serverless::Function Properties: CodeUri: functions/ Handler: synthesis.lambda_handler - Runtime: python3.12 + Runtime: python3.14 Timeout: 60 MemorySize: 256 Environment: