> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sertifikasitrainer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Alur generate dokumen

> Cara AI Mentor membangun dokumen SKKNI dari chat hingga DOCX/PPTX.

Generate dokumen di AI Mentor bukan "AI tulis satu file besar". Pipeline-nya **bertingkat**: kumpulkan fakta → susun payload deterministik → AI perkaya bagian tertentu → validasi → render ke template.

## Tiga keluarga dokumen

| Keluarga     | Flow UI                  | Jumlah tipe              | AI                                      |
| ------------ | ------------------------ | ------------------------ | --------------------------------------- |
| **master**   | Master / bukti pelatihan | `bukti-1` … `bukti-8`    | Sebagian (`aiMode: assist`)             |
| **trainer**  | Trainer BNSP             | 15 dokumen (`trainer-*`) | Via **section generator** (4 gelombang) |
| **branding** | Branding trainer         | 4 output teks            | Per dokumen (`aiMode: assist`)          |

Registry pusat: `apps/api/src/generation/document-definitions/registry.ts`

## Diagram pipeline

```mermaid theme={null}
flowchart TD
  chat[Chat / workspace] --> extract[Extractor AI]
  extract --> canon[Canonical state]
  canon --> compose[Composer deterministik]
  compose --> enrich{aiMode assist?}
  enrich -->|ya| aiEnrich[AI enricher per grup]
  enrich -->|tidak| validate[Validasi Zod]
  aiEnrich --> validate
  validate --> render[Renderer DOCX/PPTX]
  render --> download[Download peserta]
```

## Mode AI per dokumen

| `aiMode` | Arti                                                                 |
| -------- | -------------------------------------------------------------------- |
| `none`   | 100% deterministik dari data WSP + canonical state                   |
| `assist` | Base payload tetap; AI hanya mengisi field di `enrichableFieldPaths` |

Field di `exactFieldPaths` **tidak pernah** diubah AI (nama trainer, kode unit, tanggal, dll.).

## Multi-prompt enrichment (master)

Dokumen panjang (mis. bukti-1, bukti-6) tidak di-enrich sekali jadi. Mereka punya **`enrichmentGroups`**: 2–4 prompt terpisah, masing-masing fokus ke bagian (intro, analisis, rekomendasi). Hasilnya di-merge path-by-path ke payload.

`bukti-6` + `bukti-6-deck` berbagi **`enrichmentGroup`** yang sama — AI cukup jalan **sekali** untuk keduanya.

## Trainer: dua lapisan AI

1. **Section generator** — mengisi `masterJson` per section (organizer, curriculum, pretest, …) dalam 4 gelombang
2. **Composer per dokumen** — memetakan `masterJson` → payload tiap file trainer (sebagian besar deterministik dari KUK/unit)

## Chat sebelum generate

| Prompt      | File                                            | Fungsi                                     |
| ----------- | ----------------------------------------------- | ------------------------------------------ |
| Interviewer | `apps/api/src/ai/prompts/interviewer.prompt.ts` | Tanya fakta inti (trainer/master/branding) |
| Extractor   | `apps/api/src/ai/prompts/extractor.prompt.ts`   | Parse jawaban user → field terstruktur     |

Unit SKKNI (elemen, KUK, peta kompetensi) **tidak** diekstrak dari chat — diambil dari WSP setelah user pilih unit.

## Env yang mempengaruhi AI

```bash theme={null}
DEEPSEEK_API_KEY=sk-...
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
AI_PROVIDER=deepseek
AI_MODEL=deepseek-v4-flash   # atau deepseek-v4-pro
GEMINI_API_KEY=...           # opsional, flow tertentu
```

## Halaman terkait

* [Katalog semua dokumen](/ai/katalog-dokumen)
* [Prompt master (bukti)](/ai/prompt-master)
* [Prompt trainer (section)](/ai/prompt-trainer)
* [Prompt branding](/ai/prompt-branding)
* [Cara mengedit prompt](/ai/mengedit-prompt)
