This project demonstrates a multi-agent platform deployed entirely on Amazon EKS that simulates an organizational assistant. It features an Admin/Supervisor agent that intelligently routes queries to specialized HR and Finance agents, showcasing agent-to-agent collaboration using the Agent-to-Agent (A2A) protocol with OAuth 2.0 security.
The platform simulates an organizational assistant for employee services, implementing a multi-agent workflow where specialized agents collaborate to handle HR inquiries, financial queries, and administrative tasks with skill-based routing and built-in security.
The platform showcases Agent-to-Agent (A2A) communication pattern where:
- HR and Finance Agents act as A2A servers, exposing their specialized capabilities through standardized endpoints
- Admin Agent serves as an A2A client, discovering agent capabilities and routing user requests
- OAuth Security: All inter-agent communication is secured using OAuth 2.0 client credentials flow (via Okta in secure mode), ensuring authenticated and authorized access
graph TB
subgraph "<b>EKS Cluster</b>"
subgraph "Frontend"
UI["π₯οΈ Chatbot<br/>"]
end
subgraph "Agent Layer"
Admin["π― Admin Agent<br/>(A2A Client)<br/>"]
HR["π₯ HR Agent<br/>(A2A Server)<br/>"]
Finance["π° Finance Agent<br/>(A2A Server)<br/>"]
end
subgraph "Data Layer"
HRDB[("π HR Database")]
FinDB[("π΅ Finance Database")]
end
subgraph "Integration"
MCP["π MCP Server<br/>Holiday API"]
end
end
subgraph "External Services"
Okta["π Okta<br/>OAuth Provider"]
Bedrock["π€ AWS Bedrock<br/>LLM Provider"]
Nager["π
Nager.Date<br/>Holiday API"]
end
User["π€ User"] -->|"Login"| UI
UI <-->|"OAuth Flow"| Okta
UI -->|"Query"| Admin
Admin -->|"Route Query"| HR
Admin -->|"Route Query"| Finance
HR <-->|"Employee Data"| HRDB
Finance <-->|"Finance Data"| FinDB
HR <-->|"Holiday Data"| MCP
MCP <-->|"API Call"| Nager
Admin <-->|"LLM Routing"| Bedrock
HR <-->|"CrewAI Tasks"| Bedrock
Finance <-->|"LangGraph Flow"| Bedrock
style UI fill:#4A5568,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style Admin fill:#2D3748,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style HR fill:#2B6CB0,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style Finance fill:#2F855A,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style Okta fill:#553C9A,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style Bedrock fill:#C05621,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style HRDB fill:#1A365D,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style FinDB fill:#22543D,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style MCP fill:#742A2A,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style Nager fill:#744210,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
style User fill:#1A202C,stroke:#E2E8F0,stroke-width:2px,color:#F7FAFC
classDef transparentSubgraph fill:transparent,stroke:#718096,stroke-width:2px,stroke-dasharray:5 5
class Frontend,AgentLayer,DataLayer,Integration,External transparentSubgraph
- Framework: Streamlit web application
- Authentication: Okta OAuth 2.0 authorization code flow
- Features: Interactive chat interface with agent communication
- Framework: A2A SDK + LangChain
- AI Model: Uses Amazon Bedrock as Model Provider
- Features:
- π§ LLM-powered intelligent query routing
- π Fallback keyword-based routing for reliability
- π A2A client for downstream agent communication
- π OAuth client credentials flow for secure inter-agent communication
- Framework: CrewAI + A2A SDK
- Database: SQLite
- Features:
- π Employee directory and information management
- ποΈ Vacation day calculations with leave policy management
- π MCP Server Integration: Real-time public holiday data via Nager.Date API
- π₯ CrewAI crew-based task execution
- Framework: LangGraph + A2A SDK
- Database: SQLite with pre-populated financial data
- Features:
- π΅ Salary and compensation analysis
- π Leave deduction calculations with payroll impact
- π― Performance-based financial computations
The HR Agent leverages Model Context Protocol (MCP) for external data integration:
- Public Holiday Service: Real-time holiday data from Nager.Date API
- Purpose: Enhances vacation calculations with accurate holiday information
- Integration: Seamlessly integrated into CrewAI task workflows
- HR Database: Auto-generated at startup with employee records, leave policies, and balance tracking
- Finance Database: Pre-populated with salary, performance, and department data
- π OAuth 2.0 Flow: Complete authentication using Okta
- π·οΈ JWT Token Validation: RS256 signature verification with JWKS
- π― Scope-based Authorization: Fine-grained access control
- π€ Agent-to-Agent Security: Client credentials flow for inter-agent communication
- β A2A Implementation with OAuth 2.0 security
- β Intelligent Query Routing using AWS Bedrock LLM
- β Kubernetes-native Deployment with Helm charts
- β Dual Deployment Modes: Demo (no auth) and Secure (OAuth)
Before deploying the platform, ensure you have:
- π§ AWS CLI configured with appropriate permissions
- π³ Docker installed and running
- β kubectl configured for your EKS cluster
- π― Helm 3.8+ for Kubernetes deployments
- π€ AWS Bedrock access for Claude 3 Sonnet model
- π¦ Amazon ECR for container registry
- βοΈ Amazon EKS cluster deployed
- π Okta Account for OAuth 2.0 (secure mode only)
- π§ Mem0 API Key for external memory features
Deploy your EKS cluster using Terraform:
cd infra
# Configure your AWS settings
cp terraform.tfvars.example terraform.tfvars
# Edit terraform.tfvars with your values
# Deploy infrastructure
./install.sh
Build and push agent container images to ECR:
cd ..
# Set your AWS account ID
export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
# Build all container images
./build-images.sh
# Or build specific components only
./build-images.sh ui # Build only UI component
./build-images.sh admin hr # Build admin and HR components
# Available components: admin, hr, finance, ui
Choose your deployment mode based on your requirements:
Suitable for development, and testing purposes, without OAuth complexity.
- π« No Authentication: Bypasses OAuth for easy testing
- β‘ Quick Setup: No OKTA configuration required
- π§ͺ Demo User: Pre-configured test user
- π Open Access: All agents accessible without tokens
# Set required environment variable
export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
#Note replace region and name with what you choose in terraform.tfvars
aws eks update-kubeconfig --region us-west-2 --name my-agentic-cluster
# Deploy in demo mode
./deploy-helm.sh -m demo
# Port-forward the UI application
kubectl port-forward svc/agents-ui-app-service 8501:80
# Open browser to http://localhost:8501
No login required - start chatting immediately!
"What is the name of employee EMP0002?"
Recommended for production environments with full OAuth 2.0 authentication.
- π Full OAuth 2.0: Complete Okta integration
- π‘οΈ Token Validation: JWT verification on all requests
- π€ User Authentication: Okta login required
- π Agent-to-Agent Security: Client credentials flow
- Required Environment Variables:
# AWS Configuration
export ACCOUNT_ID=your-aws-account-id
# Okta Configuration
export OKTA_DOMAIN=your-domain.okta.com
export OKTA_AUTH_SERVER_ID=your-auth-server-id
# Admin Agent OAuth (All-Agents-App)
export OKTA_ADMIN_CLIENT_ID=your-admin-client-id
export OKTA_ADMIN_CLIENT_SECRET=your-admin-secret
# UI OAuth (Agent-UI-App)
export OKTA_UI_CLIENT_ID=your-ui-client-id
export OKTA_UI_CLIENT_SECRET=your-ui-secret
export OKTA_REDIRECT_URI=http://localhost:8501 # Optional
# Deploy with OAuth enabled
./deploy-helm.sh -m secure
# Port-forward the UI application
kubectl port-forward svc/agents-ui-app-service 8501:80
# Open browser to http://localhost:8501
# You'll be redirected to Okta for authentication
# Upgrade demo deployment
./deploy-helm.sh -m demo -a upgrade
# Upgrade secure deployment
./deploy-helm.sh -m secure -a upgrade
The platform supports intelligent query routing to specialized agents:
π¬ "What is the name of employee EMP0002?"
# β Retrieves employee information from HR database
π¬ "How many vacation days does employee EMP0001 have left?"
# β Calculates remaining days based on policy, usage, and carryover
π¬ "What is the annual salary of employee EMP0003?"
# β Retrieves salary and compensation details
- π Authentication Setup
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.