Services
| Service | Port | Purpose |
|---|---|---|
| api-gateway | 8000 | Public API entry point |
| admin-api | 8001 | Admin operations |
| meeting-api | 8080 | Bot lifecycle, meeting records |
| agent-api | 8100 | AI agent integration |
| runtime-api | 8090 | Container orchestration (Docker/K8s/Process/RunPod) |
| transcription-service | 80 | Whisper speech-to-text |
| tts-service | 8002 | Text-to-speech |
| mcp | 18888 | Vexa MCP server |
| redis | 6379 | Transcription streams, scheduling |
| minio | 9000 | Recording storage |
| vexa-bot | — | Playwright browser bot (joins meetings) |
Runtime API Backends
The runtime-api orchestrates bot containers with pluggable backends:| Backend | Env | Description |
|---|---|---|
docker | ORCHESTRATOR_BACKEND=docker | Default. Uses Docker socket to spawn bot containers. |
kubernetes | ORCHESTRATOR_BACKEND=kubernetes | K8s pods. |
process | ORCHESTRATOR_BACKEND=process | Subprocesses (single-host, no Docker). |
runpod | ORCHESTRATOR_BACKEND=runpod | RunPod REST API. Spawns GPU bot pods per meeting. |
Bot Lifecycle
Custom: RunPod Backend
Kioku adds a customrunpod backend that spawns ephemeral GPU pods via the RunPod REST API:
- Bot pods run
kyomoto/kioku-statelessimage (Playwright + Whisper + GPU) BOT_REDIS_URLandBOT_MEETING_API_URLenv vars point bots back to the stateful pod’s public IP- A Redis-backed reaper loop polls pod status every 15s for exit detection
- Pod is deleted on exit
