# Dynavera: An Agentic Approach to Role-Specific Trainers

[![Vue 3](https://img.shields.io/badge/Vue-35495E?style=for-the-badge&logo=vue.js&logoColor=4FC08D)](https://vuejs.org/)
[![Vite](https://img.shields.io/badge/Vite-646CFF?style=for-the-badge&logo=vite&logoColor=white)](https://vite.dev/)
[![Django](https://img.shields.io/badge/Django-092E20?style=for-the-badge&logo=django&logoColor=white)](https://www.djangoproject.com/)
[![DRF](https://img.shields.io/badge/DRF-092E20?style=for-the-badge&logo=django&logoColor=white)](https://www.django-rest-framework.org/)
[![Channels](https://img.shields.io/badge/Django_Channels-092E20?style=for-the-badge&logo=django&logoColor=white)](https://channels.readthedocs.io/)
[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-4169E1?style=for-the-badge&logo=postgresql&logoColor=white)](https://www.postgresql.org/)
[![pgvector](https://img.shields.io/badge/pgvector-00599C?style=for-the-badge&logo=postgresql&logoColor=white)](https://github.com/pgvector/pgvector)
[![Redis](https://img.shields.io/badge/Redis-DC382D?style=for-the-badge&logo=redis&logoColor=white)](https://redis.io/)
[![Celery](https://img.shields.io/badge/Celery-37814A?style=for-the-badge&logo=celery&logoColor=white)](https://docs.celeryq.dev/en/stable/)
[![FastAPI](https://img.shields.io/badge/FastAPI-009688?style=for-the-badge&logo=fastapi&logoColor=white)](https://fastapi.tiangolo.com/)
[![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white)](https://www.docker.com/)

Dynavera is a distributed agentic onboarding platform designed to solve the productivity gap in organizational training. The motivation was to create a system that delivers tailored, retrieval-grounded guidance for new roles, leveraging modern AI and orchestration techniques. This project was built to address the challenge of scalable, role-specific onboarding—where generic training fails to meet the needs of specialized positions. By combining curriculum generation, document-grounded retrieval, and live progress tracking, Dynavera enables organizations to onboard users efficiently and transparently. Through this project, I learned how to architect distributed systems, integrate retrieval-augmented generation, and design agent workflows for real-world impact.

## Table of Contents

- [Overview](#overview)
- [Core Features](#core-features)
- [Architecture](#architecture)
- [Quick Start](#quick-start)
- [Usage & Smoke Test](#usage--smoke-test)
- [Project Structure](#project-structure)
- [Demo Access](#demo-access)
- [Operational Commands](#operational-commands)
- [Screenshots](#screenshots)
- [Documentation](#documentation)



## Overview & Core Features

Dynavera addresses the onboarding productivity gap by combining:

- Role-aware curriculum generation
- Retrieval-augmented responses grounded in uploaded organizational documents
- Tool-aware orchestration over WebSockets
- Local-first inference support for privacy-sensitive deployments

The runtime is intentionally distributed: Django manages state and governance, while a dedicated inference service handles model-intensive workloads.

Key features:

- Distributed architecture separating application control plane and inference plane
- Multi-agent style orchestration for curriculum, knowledge, assessment, and monitoring behaviors
- RAG pipeline with semantic chunking, embeddings, and pgvector retrieval
- Live onboarding session updates via Django Channels WebSockets
- Persistent session/progress storage for auditability and recovery

## Architecture

High-level architecture diagram:

![High Level System Architecture](docs/high-level-system-architecture.png)

Key backend runtime entry points:

- `apps/onboarding/consumers.py` for orchestration loop and WebSocket flow
- `apps/onboarding/mcp.py` for tool routing and backend tool execution
- `apps/knowledge/tasks.py` for ingestion/chunking/embedding workflow
- `gpu_server.py` for inference and embedding endpoints

## Quick Start

Prerequisites:

- Docker Engine or Docker Desktop
- NVIDIA drivers and NVIDIA Container Toolkit (for GPU inference)

1. Clone repository

```bash
git clone https://git.cs.bham.ac.uk/projects-2025-26/vxn217
cd vxn217
```

2. Create environment file

PowerShell:

```powershell
Copy-Item .env.template .env
```

CMD:

```cmd
copy .env.template .env
```

macOS/Linux:

```bash
cp .env.template .env
```

3. Start development stack

```bash
docker compose -f compose/dev/docker-compose.yml --env-file .env up -d --build
```

4. Open application

- http://localhost:8000

## Usage/Smoke Test

Follow this end-to-end workflow to use the project and to run the smoke test:

1. Create or select an organization and role
2. Upload role-specific training files
3. Wait for ingestion and embedding to complete (monitor the ingestion UI or logs)
4. Invite a user to the configured role
5. Log in as that user and start onboarding
6. Complete at least one guided interaction and one assessment action

Expected behaviour:

- Workflow completes without manual page refresh
- UI state transitions update live
- No dropped WebSocket session during onboarding

## Project Structure

- `apps/accounts` user, organization, and role membership logic
- `apps/knowledge` training file ingestion and vector document persistence
- `apps/onboarding` sessions, orchestration runtime, and tool integration
- `config` Django settings, routing, ASGI/WSGI wiring
- `compose` development and production container configuration
- `site` frontend application
- `docs` architecture and deployment documentation

## Demo Access

Hosted URL:

- https://fyp.viswamedha.com

Evaluation credentials:

| Role | Email | Password |
| :--- | :--- | :--- |
| Admin | admin@example.com | admin |
| Manager | haleisaac@example.com | password |
| User | j.thompson@example.com | password |

Manager registration code: `MANAGER2026`

## Operational Commands

Stop services:

```bash
docker compose -f compose/dev/docker-compose.yml --env-file .env down
```

Tail logs:

```bash
docker compose -f compose/dev/docker-compose.yml --env-file .env logs -f
```

Run migrations:

```bash
docker exec -it fyp-django-dev python manage.py migrate
```

Reset seeded passwords:

```bash
docker exec -it fyp-django-dev python manage.py reset_passwords
```

## Screenshots

Home:

![Home Page](docs/images/home-page.png)

Organization:

![Organization Page](docs/images/organization-page.png)

Onboarding generation state:

![Onboarding Loading](docs/images/onboarding-loading-page.png)

Onboarding content flow:

![Onboarding Flow](docs/images/onboarding-content-page.png)

## Documentation

- [Distributed Runtime Flow](docs/distributed-runtime-flow.md)
- [Application Structure](docs/application-structure.md)
- [Deployment Topologies](docs/deployment-topologies.md)
