No description
Problem: - MSAL was throwing runtime errors when Azure credentials were incomplete - Script error in browser due to invalid MSAL configuration - PublicClientApplication constructor failing with empty/undefined values Solution: - Added tenant ID validation in addition to client ID check - Wrapped MSAL initialization in try-catch to handle configuration errors gracefully - Log warning instead of crashing when MSAL cannot be initialized - Allow application to continue with simple login when Azure is not configured Changes: - Check both REACT_APP_AZURE_CLIENT_ID and REACT_APP_AZURE_TENANT_ID - Use try-catch when creating PublicClientApplication instance - Set msalInstance to null on initialization failure - Console warning for debugging when Azure AD is not properly configured This prevents runtime errors and allows the application to work in test mode without requiring valid Azure AD configuration. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| backend | ||
| frontend | ||
| .gitignore | ||
| DEPLOYMENT.md | ||
| docker-compose.yml | ||
| QUICKSTART.md | ||
| README.md | ||
APAC Ops Bot
AI-powered operations assistant for Oliver Agency's APAC region. Built with FastAPI, React, and OpenAI Responses API.
Features
- 🔐 Azure AD Authentication - Secure SSO via MSAL with PKCE flow
- 🤖 RAG-powered Chatbot - Strictly answers from Vector Store documents (no hallucinations)
- 💬 Multi-turn Conversations - Maintains context across conversation history
- 📊 Token Usage Tracking - Complete analytics and cost monitoring
- 🎨 Dark & Gold UI - Beautiful, professional interface
- 🐳 Dockerized - Easy deployment with Docker Compose
Tech Stack
Backend:
- FastAPI (Python 3.11+)
- PostgreSQL + SQLAlchemy
- Redis
- OpenAI Responses API
- MSAL Authentication
Frontend:
- React 18 + TypeScript
- MSAL React
- TailwindCSS
- WebSocket for real-time
Prerequisites
- Docker & Docker Compose
- OpenAI API Key with access to Responses API
- Azure AD Application (for MSAL authentication)
Quick Start
1. Clone the repository
git clone <repository-url>
cd apac-ops-bot
2. Configure environment variables
Backend:
cd backend
cp .env.example .env
# Edit .env with your actual values
Frontend:
cd ../frontend
cp .env.example .env
# Edit .env with your actual values
Required Backend environment variables:
SECRET_KEY- Generate with:openssl rand -hex 32AZURE_TENANT_ID- Your Azure AD tenant IDAZURE_CLIENT_ID- Your Azure AD application client IDAZURE_CLIENT_SECRET- Your Azure AD application client secretOPENAI_API_KEY- Your OpenAI API keyOPENAI_VECTOR_STORE_ID- Your Vector Store ID (default: vs_QkOKiQCqzCHS4iFT5lP9qUxc)
Required Frontend environment variables:
REACT_APP_AZURE_CLIENT_ID- Same as backend Azure client IDREACT_APP_AZURE_TENANT_ID- Same as backend Azure tenant IDREACT_APP_API_URL- Backend API URL (default: http://localhost:8000/api/v1)
3. Start services with Docker Compose
# From project root
docker-compose up --build
This will start:
- PostgreSQL (port 5432)
- Redis (port 6379)
- Backend API (port 8000)
- Frontend (port 3000)
First run: The backend will automatically create database tables on startup.
4. Access the application
- Frontend Application: http://localhost:3000
- API Documentation: http://localhost:8000/docs
- Health Check: http://localhost:8000/health
Development
Backend Development
# Install dependencies
cd backend
pip install -r requirements.txt
pip install -r requirements-dev.txt
# Run migrations
alembic upgrade head
# Start development server
uvicorn app.main:app --reload
Frontend Development
# Install dependencies
cd frontend
npm install
# Start development server
npm start
Database Migrations
# Create a new migration
alembic revision --autogenerate -m "description"
# Apply migrations
alembic upgrade head
# Rollback migration
alembic downgrade -1
Docker Commands
# Start all services
docker-compose up
# Start in detached mode
docker-compose up -d
# View logs
docker-compose logs -f backend
# Stop services
docker-compose down
# Rebuild containers
docker-compose up --build
# Run migrations in container
docker-compose exec backend alembic upgrade head
# Access PostgreSQL
docker-compose exec postgres psql -U apac_ops_bot
Project Structure
apac-ops-bot/
├── backend/ # FastAPI backend
│ ├── app/
│ │ ├── api/ # API endpoints
│ │ ├── models/ # SQLAlchemy models
│ │ ├── schemas/ # Pydantic schemas
│ │ ├── services/ # Business logic
│ │ ├── repositories/ # Data access layer
│ │ └── core/ # Security, middleware
│ ├── alembic/ # Database migrations
│ └── tests/ # Backend tests
│
├── frontend/ # React frontend
│ └── src/
│ ├── components/ # React components
│ ├── context/ # State management
│ ├── hooks/ # Custom hooks
│ └── services/ # API services
│
└── docker-compose.yml # Docker services configuration
API Documentation
Once the backend is running, access the interactive API documentation at:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
Security
- All code and comments are in English only
- Strict RAG-only responses (no AI hallucinations)
- MSAL PKCE flow for authentication
- Token hashing before storage
- Rate limiting enabled
- CORS configured
- SQL injection protection via ORM
Testing
# Backend tests
cd backend
pytest
# Frontend tests
cd frontend
npm test
Deployment
See DEPLOYMENT.md for production deployment instructions.
Contributing
- All code, comments, and commit messages must be in English
- Follow existing code style (Black for Python, Prettier for TypeScript)
- Write tests for new features
- Update documentation as needed
License
Proprietary - Oliver Agency
Support
For issues and questions, please contact the development team.