Skip to main content
Trainer flow punya 15 file output, tapi AI utama jalan di section generator — satu prompt per section masterJson, bukan per file DOCX. File: apps/api/src/generation/trainer-section-generator.service.ts
Fungsi prompt: buildPrompt(sectionName, context)

System prompt (semua section)

You are a BNSP document generator for Indonesian vocational training.
Output ONLY valid JSON matching the requested schema.
No markdown, no explanation, no extra text.
Model: env.AI_MODEL (default deepseek-v4-flash), temperature: 0.3, max_tokens: 4000, response_format: json_object.

Empat gelombang generate

GelombangSectionsKetergantungan
1organizer, document, people, requirements, time_allocation, training_needsData chat + unit
2curriculum, resources, safetyButuh wave 1 (organizer, curriculum untuk resources)
3lesson_plan, pretest, posttest, evaluationsButuh curriculum
4assessment, certification, signatures, testButuh unit KUK + training
Gelombang berjalan berurutan; section dalam satu gelombang bisa paralel.

Section tanpa panggilan AI

SectionCara isi
time_allocationHitung deterministik dari JP (total_jp, jp_minutes)
signaturesJSON statis + nomor MET acak
testTemplate jawaban kosong

Ringkasan prompt per section

Wave 1

organizer — JSON: name, letterhead_text, logo_placeholder
Nama lembaga realistis sesuai bidang keahlian.
document — JSON: city, date_text, prepared_by, validator
Kota 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 lisan
pretest_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

Tiap trainer-* 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
Jadi 15 dokumen mayoritas aiMode: none di registry — AI sudah “habis” di tahap section.

Context yang disuntik ke setiap prompt

Dari ctxFields() / canonical state:
  • trainingName, unitName, unitCode
  • trainerName, expertise, audience, outcome
  • totalJp, 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

  1. Buka trainer-section-generator.service.tsbuildPrompt() → case section yang ingin diubah
  2. Untuk aturan global JSON, ubah system message di callAI()
  3. Deploy API worker
Untuk mengubah isi template DOCX (bukan prompt), edit composer per dokumen di apps/api/src/generation/composers/trainer/.