Aktilot

Getting Started

The fastest way to run Aktilot is with Docker Compose. You need an OpenAI API key and Docker installed.

Terminal
git clone https://github.com/vikas0686/Aktilot.git
cd Aktilot
cp .env.example .env
# Open .env and set: OPENAI_API_KEY=sk-...
docker compose up --build

That's it. Create a project, upload a PDF, create an agent, and start asking questions. The Temporal UI at :8233 lets you monitor document processing jobs, inspect individual pipeline steps, and retry failed uploads without re-uploading the file.

Services

ServiceURLPurpose
Apphttp://localhost:3000Main UI
Backend APIhttp://localhost:8000REST API + OpenAPI docs at /docs
Temporal UIhttp://localhost:8233Workflow execution history and retries
Grafanahttp://localhost:3002Observability dashboards (admin / admin)
Prometheushttp://localhost:9090Metrics query engine

Local Development

Prerequisites: Python 3.12+, Node 20+, Docker (for Postgres + Temporal)

Backend

Terminal
cd backend
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # set OPENAI_API_KEY and DATABASE_URL
# Start Postgres and Temporal via Docker
docker compose up postgres temporal -d
alembic upgrade head
# Terminal 1 — API server
uvicorn main:app --reload --port 8000
# Terminal 2 — Temporal worker (processes document uploads)
python -m temporal.worker

Frontend

Terminal
cd frontend
npm install
npm run dev # http://localhost:5173

Tests

Terminal
# Backend
cd backend && source .venv/bin/activate
pytest --tb=short -q
# Frontend
cd frontend && npm test

Environment Variables

Copy .env.example to .env in the project root (for Docker) or backend/.env (for local dev).

VariableRequiredDescription
OPENAI_API_KEYYesYour OpenAI API key
DATABASE_URLYesPostgreSQL connection string (asyncpg)
TEMPORAL_ADDRESSNoTemporal server address (default: localhost:7233)
CHAT_MODELNoChat model to use (default: gpt-4o-mini)
EMBEDDING_MODELNoEmbedding model (default: text-embedding-3-small)
UPLOAD_DIRNoWhere uploaded files are stored (default: uploads)
CHROMA_DIRNoWhere vector data is persisted (default: chroma_data)