masterJson, bukan per file DOCX.
File: apps/api/src/generation/trainer-section-generator.service.tsFungsi prompt:
buildPrompt(sectionName, context)
System prompt (semua section)
env.AI_MODEL (default deepseek-v4-flash), temperature: 0.3, max_tokens: 4000, response_format: json_object.
Empat gelombang generate
| Gelombang | Sections | Ketergantungan |
|---|---|---|
| 1 | organizer, document, people, requirements, time_allocation, training_needs | Data chat + unit |
| 2 | curriculum, resources, safety | Butuh wave 1 (organizer, curriculum untuk resources) |
| 3 | lesson_plan, pretest, posttest, evaluations | Butuh curriculum |
| 4 | assessment, certification, signatures, test | Butuh unit KUK + training |
Section tanpa panggilan AI
| Section | Cara isi |
|---|---|
time_allocation | Hitung deterministik dari JP (total_jp, jp_minutes) |
signatures | JSON statis + nomor MET acak |
test | Template jawaban kosong |
Ringkasan prompt per section
Wave 1
organizer — JSON:name, letterhead_text, logo_placeholderNama lembaga realistis sesuai bidang keahlian. document — JSON:
city, date_text, prepared_by, validatorKota dari konteks (bukan placeholder
<kota>).
people — JSON: trainer, assessor, assessee
requirements — JSON: persyaratan peserta & instruktur (pendidikan, pengalaman, kesehatan)
training_needs — JSON: items[] analisis kebutuhan (1–2 baris pekerjaan)
Wave 2
curriculum — JSON:items, modules (teori/praktik, topik per modul)Membaca elemen unit dari WSP. resources — JSON:
materials[], equipment[] (min. 2–3 masing-masing)Hint peralatan dari
variable_constraints WSP bila ada.
safety — JSON: jsa.items[] (5 item Job Safety Analysis, dominan risiko peralatan)
Wave 3
lesson_plan — JSON:sections[] pembukaan, inti (sesuai modul), penutup + durasi JP
pretest — JSON: question_bank 5–10 soal PG, question_id format PRE-X
posttest — sama struktur, POST-X, topik sama pretest soal berbeda
evaluations — JSON: pertanyaan evaluasi trainer (8–10), materi (4–6), penyelenggara (4–6), format Ya/Tidak
Wave 4
assessment — JSON besar: aturan asesmen, observasi per elemen/KUK, demonstrasi, pertanyaan lisanpretest_scoring.items wajib kosong — diisi otomatis dari soal pre-test di doc 09.
certification — JSON: skema sertifikasi, LSP, scheme_number dari referensi WSP
Setelah masterJson lengkap
Tiaptrainer-* composer membaca section yang relevan + unit content deterministik:
apps/api/src/generation/composers/trainer/trainer-unit-content.ts
- Soal pre/post test bisa di-generate dari teks KUK
- FR.IA.01–03 mengisi checklist dari elemen unit
- Evaluasi rubric dari bank soal pretest
aiMode: none di registry — AI sudah “habis” di tahap section.
Context yang disuntik ke setiap prompt
DarictxFields() / canonical state:
trainingName,unitName,unitCodetrainerName,expertise,audience,outcometotalJp,jpMinutes,deliveryMethod,city- Section sebelumnya di
existingSections(untuk kurikulum → resources → lesson plan)
Retry & parse
- Max 2 retry per section
- Parser:
tryParseJson+ perbaikan trailing comma, single quote, unquoted keys (sama pola generate job utama)
Mengedit prompt trainer
- Buka
trainer-section-generator.service.ts→buildPrompt()→ case section yang ingin diubah - Untuk aturan global JSON, ubah system message di
callAI() - Deploy API worker
apps/api/src/generation/composers/trainer/.