# EnCoach - AI Stack Technical Report

**Analysis Date:** March 8, 2026

---

## Table of Contents

1. [AI Stack Overview](#1-ai-stack-overview)
2. [OpenAI GPT (Content Generation & Grading)](#2-openai-gpt--content-generation--grading)
3. [OpenAI Whisper (Speech-to-Text)](#3-openai-whisper--speech-to-text)
4. [AWS Polly (Text-to-Speech)](#4-aws-polly--text-to-speech)
5. [FAISS + Sentence Transformers (RAG Training Tips)](#5-faiss--sentence-transformers--rag-training-tips)
6. [ELAI (AI Avatar Video Generation)](#6-elai--ai-avatar-video-generation)
7. [GPTZero (AI Writing Detection)](#7-gptzero--ai-writing-detection)
8. [End-to-End Data Flows](#8-end-to-end-data-flows)
9. [Frontend AI Integration Points](#9-frontend-ai-integration-points)
10. [Environment Variables & Configuration](#10-environment-variables--configuration)

---

## 1. AI Stack Overview

The EnCoach platform uses **6 AI/ML services** working together to power automated IELTS exam generation, grading, and personalized training.

```
┌─────────────────────────────────────────────────────────┐
│                    Frontend (Next.js)                    │
│  ExamEditor, ExamPage, Training, AIDetection components │
└────────────────────────┬────────────────────────────────┘
                         │ HTTP (JWT)
                         ▼
┌─────────────────────────────────────────────────────────┐
│                  Backend (FastAPI)                       │
│                                                         │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐              │
│  │ OpenAI   │  │ Whisper  │  │ AWS Polly│              │
│  │ GPT-4o   │  │ (local)  │  │ (cloud)  │              │
│  │ GPT-3.5  │  │ base     │  │ neural   │              │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘              │
│       │              │              │                    │
│  Content Gen    Transcription    TTS Audio               │
│  Grading        Speaking eval    Listening MP3s          │
│  Evaluation                                              │
│                                                         │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐              │
│  │ FAISS +  │  │  ELAI    │  │ GPTZero  │              │
│  │ SentTrans│  │ (cloud)  │  │ (cloud)  │              │
│  │ (local)  │  │ avatars  │  │ detect   │              │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘              │
│       │              │              │                    │
│  RAG Tips       Avatar Videos   AI Detection             │
│  Training       Speaking        Writing eval             │
│                                                         │
└─────────────────────────────────────────────────────────┘
```

| Service | Type | Purpose | Model/Version |
|---|---|---|---|
| **OpenAI GPT** | Cloud API | Content generation, grading, evaluation | `gpt-4o`, `gpt-3.5-turbo` |
| **OpenAI Whisper** | Local (self-hosted) | Speech-to-text transcription | `base` (~1 GB, 4 instances) |
| **AWS Polly** | Cloud API | Text-to-speech for listening | Neural engine, 11 voices |
| **FAISS + Sentence Transformers** | Local (self-hosted) | RAG-based training tips | `all-MiniLM-L6-v2` + `IndexFlatL2` |
| **ELAI** | Cloud API | AI avatar video generation | ElevenLabs/Azure voices |
| **GPTZero** | Cloud API | AI-generated text detection | v2/predict/text |

---

## 2. OpenAI GPT — Content Generation & Grading

### 2.1 Configuration

| Setting | Value |
|---|---|
| **Default Model** | `gpt-4o` |
| **Secondary Model** | `gpt-3.5-turbo` |
| **Max Tokens** | 4,097 (300 reserved) |
| **Response Format** | `json_object` |
| **Retry Limit** | 2 (on blacklist or missing fields) |
| **Content Filter** | Blacklisted words (religious, sexual, political terms) |

**Temperature settings:**

| Context | Temperature | Behavior |
|---|---|---|
| Grading | 0.1 | Near-deterministic, consistent evaluation |
| Tips / Summaries | 0.2 | Low creativity, factual output |
| Content Generation | 0.7 | Higher creativity for passages and tasks |

### 2.2 Content Generation

GPT generates all IELTS exam content. Each module has specific prompt templates:

#### Reading Module
- **Model:** `gpt-4o`, temperature 0.7
- **Generates:** Passages with title and text body
- **Difficulty scaling:**
  - Passage 1: easy
  - Passage 2: hard
  - Passage 3: very hard
- **Exercise types generated:** Fill in the blanks, True/False/Not Given, Matching headings, Multiple choice
- **Prompt pattern:** System prompt defines JSON schema → User prompt specifies passage difficulty, topic, and word count

#### Listening Module
- **Model:** `gpt-4o`, temperature 0.7
- **Generates:** Conversation scripts and monologues
- **Output format:**
  - Conversations: `{"conversation": [{"name", "gender", "text"}]}` — 2 or 4 speakers
  - Monologues: `{"monologue": "..."}` — social or academic context
- **Exercise types generated:** Same as reading (fill blanks, T/F/NG, matching, MC)

#### Writing Module
- **Task 1 (General):** Letter prompts — `gpt-3.5-turbo`
- **Task 1 (Academic):** Image-based prompts — `gpt-4o`
- **Task 2 (Essay):** Essay prompts — `gpt-4o`

#### Speaking Module
- **Model:** `gpt-4o`, temperature 0.7
- **Part 1:** 5 questions across 2 topics
- **Part 2:** 1 question + 3 follow-up prompts
- **Part 3:** 5 discussion questions

#### Level Test
- **Generates:** Multiple choice questions at varying difficulty levels
- **Supports:** Standard level, UTAS format, custom levels

### 2.3 Grading / Evaluation

GPT evaluates student answers using IELTS band scoring criteria:

#### Writing Grading
- **Model:** `gpt-4o`, temperature 0.1 (Task 1) / 0.7 (Task 2)
- **Runs in parallel:** Evaluation + Perfect Answer + Spelling Fix + GPTZero
- **Output JSON:**
  ```json
  {
    "comment": "Detailed commentary...",
    "overall": 6.5,
    "task_response": {
      "Task Achievement": { "score": 7, "comment": "..." },
      "Coherence and Cohesion": { "score": 6, "comment": "..." },
      "Lexical Resource": { "score": 7, "comment": "..." },
      "Grammatical Range and Accuracy": { "score": 6, "comment": "..." }
    }
  }
  ```
- **Perfect Answer:** GPT generates an ideal answer for comparison
- **Spelling Fix:** `gpt-3.5-turbo` at temperature 0.2 corrects transcription errors

#### Speaking Grading
- **Flow:** Audio → Whisper transcription → GPT-4o grading
- **Criteria:** Fluency & Coherence, Lexical Resource, Grammar, Pronunciation
- **Perfect Answers:** `gpt-4o` (Part 1), `gpt-3.5-turbo` (Parts 2/3)

#### Exam Summary
- **Model:** `gpt-3.5-turbo`, temperature 0.2
- **Uses:** OpenAI function calling (`save_evaluation_and_suggestions`)
- **Output:** Overall evaluation, suggestions, bullet points

### 2.4 Other GPT Uses
- **Training tips selection:** GPT selects relevant tips from FAISS results
- **Whisper overlap fix:** GPT-4o merges overlapping transcription segments
- **Short answer grading:** Grades fill-in-the-blank and short text answers

---

## 3. OpenAI Whisper — Speech-to-Text

### 3.1 Configuration

| Setting | Value |
|---|---|
| **Model** | `base` (~1 GB) |
| **Instances** | 4 (round-robin) |
| **Loading** | `in_memory=True` |
| **Concurrency** | `ThreadPoolExecutor` with 4 workers |
| **Language** | English |
| **Precision** | `fp16=False` |

### 3.2 How It Works

Whisper runs **locally** on the Cloud Run container (not via OpenAI's API). Four model instances are loaded into memory at startup and assigned to workers via round-robin.

**Processing pipeline:**

```
Audio Input
    │
    ▼
Resample to 16 kHz mono float32 (librosa)
    │
    ▼
Split into 30-second chunks (1/4 overlap)
    │
    ▼
Transcribe each chunk (Whisper base model)
    │
    ▼
Concatenate transcriptions
    │
    ▼
Fix overlapping text (GPT-4o removes duplicated words)
    │
    ▼
Final transcript
```

**Retry:** 3 attempts via `tenacity` library.

### 3.3 Where It's Connected

| Feature | Connection |
|---|---|
| **Speaking Grading** | Student audio → Whisper → transcript → GPT grading |
| **Audio Transcription** | Uploaded audio → Whisper → listening script for exam editor |

---

## 4. AWS Polly — Text-to-Speech

### 4.1 Configuration

| Setting | Value |
|---|---|
| **Engine** | Neural |
| **Output Format** | MP3 |
| **Region** | `eu-west-1` |
| **Max Chunk Size** | 3,000 characters (split at sentence boundaries) |

### 4.2 Available Voices

| Voice | Language/Accent |
|---|---|
| Danielle | American English |
| Gregory | American English |
| Kevin | American English |
| Ruth | American English |
| Stephen | American English |
| Arthur | British English |
| Olivia | Australian English |
| Ayanda | South African English |
| Aria | New Zealand English |
| Kajal | Indian English |
| Niamh | Irish English |

### 4.3 How It Works

**Listening exam audio generation:**

```
Generated Dialog/Monologue (from GPT)
    │
    ▼
Assign voices to speakers (random for monologue, per-speaker for dialog)
    │
    ▼
Split text into ≤3000 char chunks at sentence boundaries
    │
    ▼
AWS Polly Neural TTS → MP3 audio bytes
    │
    ▼
Concatenate audio segments
    │
    ▼
Upload to Firebase Storage
    │
    ▼
Return download URL
```

### 4.4 Where It's Connected

| Feature | Connection |
|---|---|
| **Listening Exam Audio** | GPT script → Polly TTS → MP3 → Firebase Storage → student playback |
| **Listening Instructions** | "Recording has now finished" scripts → Stephen voice → MP3 |

---

## 5. FAISS + Sentence Transformers — RAG Training Tips

### 5.1 Configuration

| Setting | Value |
|---|---|
| **Embeddings Model** | `all-MiniLM-L6-v2` (Sentence Transformers) |
| **Index Type** | `faiss.IndexFlatL2` (exact L2 search) |
| **Top-K** | 5 results per query |
| **Data Source** | `pathways_2_rw_with_ids.json` |

### 5.2 Knowledge Base Categories

| Category | Index File |
|---|---|
| `ct_focus` | `./faiss/ct_focus_tips_index.faiss` |
| `language_for_writing` | `./faiss/language_for_writing_tips_index.faiss` |
| `reading_skill` | `./faiss/reading_skill_tips_index.faiss` |
| `strategy` | `./faiss/strategy_tips_index.faiss` |
| `word_link` | `./faiss/word_link_tips_index.faiss` |
| `word_partners` | `./faiss/word_partners_tips_index.faiss` |
| `writing_skill` | `./faiss/writing_skill_tips_index.faiss` |

**Metadata:** `./faiss/tips_metadata.pkl` (pickle file with tip IDs and text)

### 5.3 How RAG Works

```
Student Exam Performance
    │
    ▼
GPT analyzes performance → generates queries (text + category)
    │
    ▼
Sentence Transformers encodes query → embedding vector
    │
    ▼
FAISS L2 search → top 5 matching tips per category
    │
    ▼
GPT selects most relevant tips from retrieved results
    │
    ▼
Tips stored in MongoDB and displayed to student
```

### 5.4 Where It's Connected

| Feature | Connection |
|---|---|
| **Training Module** | After exam → analyze weak areas → retrieve personalized tips → display training content |
| **Walkthrough** | Tips linked to specific reading/writing skills for guided learning |

---

## 6. ELAI — AI Avatar Video Generation

### 6.1 Configuration

| Setting | Value |
|---|---|
| **API Endpoint** | `https://apis.elai.io/api/v1/videos` |
| **Auth** | Bearer token (`ELAI_TOKEN`) |
| **Animation** | `fade_in` |
| **Language** | English |

### 6.2 Available Avatars

| Avatar | Gender | Voice Provider |
|---|---|---|
| Gia | Female | ElevenLabs |
| Vadim | Male | Azure |
| Orhan | Male | ElevenLabs |
| Flora | Female | Azure |
| Scarlett | Female | ElevenLabs |
| Parker | Male | Azure |
| Ethan | Male | ElevenLabs |

Each avatar has a unique `avatar_code`, `avatar_url`, `avatar_canvas` dimensions, `voice_id`, and `voice_provider`.

### 6.3 How It Works

```
Speaking Task Text (from GPT)
    │
    ▼
Select Avatar (user choice from available list)
    │
    ▼
Build video config (slide, avatar, canvas, logo, voice settings)
    │
    ▼
POST to ELAI API → create video
    │
    ▼
POST render request → start processing
    │
    ▼
Poll GET status every 10 seconds until "ready"
    │
    ▼
Return video URL for playback
```

### 6.4 Where It's Connected

| Feature | Connection |
|---|---|
| **Speaking Exam** | AI avatar presents speaking questions via video |
| **Exam Editor** | Teachers generate speaking videos while creating exams |

---

## 7. GPTZero — AI Writing Detection

### 7.1 Configuration

| Setting | Value |
|---|---|
| **API Endpoint** | `https://api.gptzero.me/v2/predict/text` |
| **Auth** | `x-api-key` header |
| **Multilingual** | `false` |

### 7.2 How It Works

```
Student's Writing Submission
    │
    ▼
POST to GPTZero API with document text
    │
    ▼
Response: predicted_class, confidence, per-sentence AI probability
    │
    ▼
Returned as part of writing evaluation
    │
    ▼
Frontend displays AI Detection component
```

**Response fields:**
- `predicted_class`: `ai`, `mixed`, or `human`
- `confidence_category`: confidence level
- `class_probabilities`: probability distribution
- `sentences`: per-sentence analysis with `highlight_sentence_for_ai` flag

### 7.3 Where It's Connected

| Feature | Connection |
|---|---|
| **Writing Grading** | Runs in parallel with GPT evaluation, perfect answer, and spelling fix |
| **Frontend UI** | `AIDetection` component displays results with radial progress, segmented bars, and highlighted AI-generated sentences |

---

## 8. End-to-End Data Flows

### 8.1 Exam Generation Flow

```
Teacher clicks "Generate" in Exam Editor
    │
    ▼
Frontend: POST /api/exam/generate/{module}/{sectionId}
    │
    ▼
Next.js API Route: proxies to BACKEND_URL/{module}/...
    │
    ▼
FastAPI Controller → Service
    │
    ├── Reading: GPT-4o generates passage + exercises
    ├── Listening: GPT-4o generates script → Polly TTS → MP3 → Firebase
    ├── Writing: GPT-4o/3.5 generates task prompt
    └── Speaking: GPT-4o generates questions → ELAI creates avatar video
    │
    ▼
Response with generated content → stored in exam editor state
```

### 8.2 Writing Grading Flow

```
Student submits writing answer
    │
    ▼
Frontend: POST /api/evaluate/writing
    │
    ▼
Next.js API: inserts pending evaluation in MongoDB → proxies to backend
    │
    ▼
FastAPI runs 4 tasks IN PARALLEL:
    ├── GPT-4o: Grade against IELTS band criteria (temp 0.1)
    ├── GPT-4o: Generate perfect answer for comparison
    ├── GPT-3.5: Fix spelling/transcription errors (temp 0.2)
    └── GPTZero: Detect AI-generated content
    │
    ▼
Combined result stored in MongoDB evaluation collection
    │
    ▼
Frontend polls /api/evaluate/status until complete
    │
    ▼
UI shows: band scores, detailed comments, perfect answer, AI detection
```

### 8.3 Speaking Grading Flow

```
Student records audio response
    │
    ▼
Frontend: POST /api/evaluate/speaking (FormData with audio)
    │
    ▼
Next.js API: inserts pending evaluation → proxies to backend
    │
    ▼
FastAPI pipeline:
    │
    ▼
Whisper (local): Transcribe audio → text
    │
    ▼
GPT-4o: Grade transcript against IELTS speaking criteria (temp 0.1)
    │
    ▼
GPT-4o/3.5: Generate perfect answer
    │
    ▼
Result stored in MongoDB
    │
    ▼
Frontend polls and displays scores + transcript + perfect answer
```

### 8.4 Training / Personalized Tips Flow

```
Student completes an exam
    │
    ▼
Frontend: POST /api/training
    │
    ▼
Backend analyzes exam performance with GPT
    │
    ▼
GPT generates search queries + categories
    │
    ▼
Sentence Transformers encodes queries → FAISS L2 search
    │
    ▼
Top 5 tips per category retrieved
    │
    ▼
GPT selects most relevant tips
    │
    ▼
Training content stored in MongoDB → displayed to student
```

---

## 9. Frontend AI Integration Points

### 9.1 API Routes (Next.js → FastAPI)

| Frontend Route | Backend Route | AI Services Used |
|---|---|---|
| `POST /api/evaluate/writing` | `BACKEND_URL/grade/writing/{task}` | GPT-4o, GPT-3.5, GPTZero |
| `POST /api/evaluate/speaking` | `BACKEND_URL/grade/speaking/{task}` | Whisper, GPT-4o, GPT-3.5 |
| `GET /api/exam/generate/reading/{id}` | `BACKEND_URL/reading/{passage}` | GPT-4o |
| `GET /api/exam/generate/listening/{id}` | `BACKEND_URL/listening/{section}` | GPT-4o |
| `GET /api/exam/generate/writing/{id}` | `BACKEND_URL/writing/{task}` | GPT-4o / GPT-3.5 |
| `GET /api/exam/generate/speaking/{id}` | `BACKEND_URL/speaking/{task}` | GPT-4o |
| `POST /api/exam/media/listening` | `BACKEND_URL/listening/media` | AWS Polly |
| `POST /api/exam/media/speaking` | `BACKEND_URL/speaking/media` | ELAI |
| `POST /api/transcribe` | `BACKEND_URL/listening/transcribe` | Whisper |
| `POST /api/training` | `BACKEND_URL/training/` | GPT, FAISS, Sentence Transformers |
| `GET /api/exam/avatars` | `BACKEND_URL/speaking/avatars` | ELAI |

### 9.2 Key UI Components

| Component | Purpose |
|---|---|
| `AIDetection.tsx` | Displays AI detection results (radial progress, highlighted sentences) |
| `GenerateBtn.tsx` | Brain icon button with spinner for content generation |
| `generateVideos.ts` | Manages ELAI video creation + polling loop |
| `ExamPage.tsx` | Triggers writing/speaking evaluation + polls for results |
| `useEvaluationPolling.tsx` | Hook that polls evaluation status until grading completes |
| `generation.tsx` | Page for generating exams (gated by permissions) |

### 9.3 Permissions

| Permission | Controls |
|---|---|
| `generate_reading` | Reading passage generation |
| `generate_listening` | Listening script generation |
| `generate_writing` | Writing prompt generation |
| `generate_speaking` | Speaking task generation |
| `generate_level` | Level test generation |

---

## 10. Environment Variables & Configuration

### 10.1 Required API Keys

| Variable | Service | Where Used |
|---|---|---|
| `OPENAI_API_KEY` | OpenAI GPT-4o / GPT-3.5 | Content generation, grading, evaluation |
| `AWS_ACCESS_KEY_ID` | AWS Polly | Text-to-speech |
| `AWS_SECRET_ACCESS_KEY` | AWS Polly | Text-to-speech |
| `ELAI_TOKEN` | ELAI | Avatar video generation |
| `GPT_ZERO_API_KEY` | GPTZero | AI writing detection |

### 10.2 Backend Service Wiring (Dependency Injection)

```
DI Container
├── llm           → OpenAI(client=AsyncOpenAI)
├── tts           → AWSPolly(client=polly_client)
├── stt           → OpenAIWhisper(model="base", num_models=4)
├── vid_gen       → ELAI(client=http_client, token, avatars, conf)
├── ai_detector   → GPTZero(client=http_client, key)
├── training_kb   → TrainingContentKnowledgeBase(embeddings=SentenceTransformer)
│
├── Controllers
│   ├── ReadingController    → uses llm
│   ├── ListeningController  → uses llm, tts
│   ├── WritingController    → uses llm, ai_detector
│   ├── SpeakingController   → uses llm, stt, vid_gen
│   ├── GradeController      → uses llm, stt, ai_detector
│   ├── LevelController      → uses llm
│   └── TrainingController   → uses llm, training_kb
```

### 10.3 Cost Drivers

| Service | Cost Model | Usage Pattern |
|---|---|---|
| **OpenAI GPT-4o** | Per token (input + output) | Every generation, every grading — highest cost |
| **OpenAI GPT-3.5** | Per token (cheaper) | Summaries, spelling, some writing tasks |
| **AWS Polly** | Per character (Neural) | Every listening exam audio |
| **ELAI** | Per video minute | Every speaking exam video |
| **GPTZero** | Per API call | Every writing grading |
| **Whisper (local)** | Compute only (no API cost) | Every speaking grading + transcription |
| **FAISS (local)** | Compute only (no API cost) | Every training session |
