Lompat ke konten
dokumentasi.id
Commit d59d965
v3
Star763

5.2

Prompt Multibahasa

Bahasa roast ditentukan sepenuhnya oleh field language yang dikirim klien. Endpoint tidak menyusun teks per bahasa di tempat lain: satu array validLanguages menyaring nilai yang masuk, satu switch memilih teks prompt, lalu satu panggilan client.chat.completions.create mengirim prompt itu ke model gpt-4o-mini. Alur lengkapnya digambarkan diagram berikut.

graph TD
  UI["selectedLanguage di +page.svelte"] -->|"POST /llama {username, language}"| CHECK{"validLanguages.includes(language)"}
  CHECK -->|"false"| ERR["400: invalid language specified..."]
  CHECK -->|"true"| SW["switch (language)"]
  DEF["prompt default: give a short and harsh roasting"] --> SW
  SW -->|"case cocok"| PROMPT["prompt bahasa terpilih"]
  SW -->|"english atau tanpa case"| DEF
  PROMPT --> CALL["client.chat.completions.create"]
  CALL --> OUT["model: gpt-4o-mini, messages: system + user"]
  style UI fill:#f59e0b,color:#000
  style CHECK fill:#f59e0b,color:#000
  style ERR fill:#dc2626,color:#fff
  style DEF fill:#f59e0b,color:#000
  style SW fill:#8b5cf6,color:#fff
  style PROMPT fill:#8b5cf6,color:#fff
  style CALL fill:#2d7d46,color:#fff
  style OUT fill:#336791,color:#fff
%% fig: Pemilihan prompt per bahasa
%% desc: Nilai language dari klien disaring validLanguages, dipetakan ke satu prompt lewat switch, lalu dikirim ke model gpt-4o-mini.
Fig. 1: Pemilihan prompt per bahasaNilai language dari klien disaring validLanguages, dipetakan ke satu prompt lewat switch, lalu dikirim ke model gpt-4o-mini.

Daftar nilai bahasa yang dikenal

Klien mengirim language dari dropdown select yang isinya berasal dari array languages berisi 15 opsi; nilai awalnya english (src/routes/+page.svelte:10, src/routes/+page.svelte:12-28). Select itu diikat ke selectedLanguage lewat bind:value, sehingga yang terkirim adalah value, bukan label (src/routes/+page.svelte:85-93). Nilai tersebut ikut masuk ke body fetch('/llama') bersama username (src/routes/+page.svelte:39-45).

Di sisi server, validLanguages hanya memuat 11 nilai, dan switch memuat 14 case. Dua daftar itu tidak identik, dan tidak semua opsi UI lolos keduanya (src/routes/llama/+server.js:15-27, src/routes/llama/+server.js:134-176).

valuelabel di UIAda di validLanguagesAda case di switchPrompt yang benar-benar dipakai
englishEnglishyatidakprompt default berbahasa Inggris
frenchFrançais (French)yayaprompt case 'french'
italianItaliano (Italian)tidakyaditolak 400 sebelum switch
indonesianIndonesianyayaprompt case 'indonesian'
indianहिंदी (Hindi)yayaprompt case 'indian'
korean한국어 (Korean)yayaprompt case 'korean'
japanese日本語 (Japanese)yayaprompt case 'japanese'
chinese中文 (Chinese)yayaprompt case 'chinese'
germanDeútsche (German)tidakyaditolak 400 sebelum switch
arabicالعربية (Arabic)yayaprompt case 'italian'
vietnameseTiếng việt (Vietnamese)yayaprompt case 'vietnamese'
finnishSuomi (Finnish)tidakyaditolak 400 sebelum switch
portuguesePortuguês (Portuguese)tidakyaditolak 400 sebelum switch
polishjęzyk polski (Polish)yayaprompt case 'polish'
traditionalChinese中文(臺灣) (Traditional Chinese)yayaprompt case 'traditionalChinese'

Dari 15 opsi UI, hanya 11 yang diterima. Empat sisanya ditolak sebelum sempat mencapai switch.

Validasi sebelum prompt dibuat

Handler POST membaca body request.json() lalu mengambil username dan language. Kalau language tidak ada di validLanguages, handler langsung mengembalikan status 400 dengan pesan invalid language specified, please pass a valid language. dan tidak pernah memanggil GitHub maupun OpenAI (src/routes/llama/+server.js:31-38).

Pemilihan prompt lewat switch

Sebelum switch, prompt sudah berisi teks default berbahasa Inggris yang menyisipkan username dan JSON.stringify(datas) (src/routes/llama/+server.js:133). Objek datas berasal dari pemanggilan GitHub API; rinciannya ada di Pengumpulan Data Profil GitHub.

Setiap case hanya mengganti isi variabel prompt dengan kalimat instruksi dalam bahasa terkait, lalu break. case 'english' tidak ada, jadi bahasa Inggris memakai teks default. Semua case menyisipkan username dan detail profil yang sama, sehingga yang berbeda hanya bahasa instruksinya (src/routes/llama/+server.js:134-176).

Dua jebakan pada pemetaan bahasa

⚠️ case 'arabic' tidak diakhiri break. Alurnya jatuh ke case 'italian' yang langsung menimpa prompt dengan kalimat Italia, lalu berhenti di break milik italian. Akibatnya permintaan dengan language: 'arabic' yang lolos validasi tetap menghasilkan roast berbahasa Italia (src/routes/llama/+server.js:156-160).

graph TD
  AR["case 'arabic'"] -->|"tanpa break"| IT["case 'italian'"]
  AR --> ARP["prompt Arab ditulis"]
  IT --> ITP["prompt Italia menimpa prompt Arab"]
  ARP --> ITP
  ITP --> OUT["roast berbahasa Italia"]
  style AR fill:#dc2626,color:#fff
  style IT fill:#dc2626,color:#fff
  style ARP fill:#f59e0b,color:#000
  style ITP fill:#8b5cf6,color:#fff
  style OUT fill:#dc2626,color:#fff
%% fig: Fallthrough case arabic ke case italian
%% desc: case arabic tidak punya break, jadi prompt Arab ditimpa prompt Italia sebelum sampai ke model.
Fig. 2: Fallthrough case arabic ke case italiancase arabic tidak punya break, jadi prompt Arab ditimpa prompt Italia sebelum sampai ke model.

⚠️ Empat case tidak pernah tercapai: german, italian, finnish, dan portuguese. Keempat nilai itu ada di dropdown UI dan ada di switch, tetapi tidak terdaftar di validLanguages, sehingga request-nya sudah dibalas 400 lebih dulu (src/routes/llama/+server.js:15-27, src/routes/llama/+server.js:153-172).

Pemanggilan model gpt-4o-mini

Prompt hasil switch dikirim sebagai messages kedua dengan role: 'user'. Pesan pertama adalah system tetap berbahasa Inggris: You roast people github account based on their bio, name, readme, and repos as harsh and spicy as possible, and keep it short. Panggilan memakai model: 'gpt-4o-mini' dan stream: false, lalu hasilnya diambil dari completion.choices[0].message.content (src/routes/llama/+server.js:180-193).

Kalau panggilan itu gagal, handler mengembalikan status 500 dengan pesan Failed to generate roast (src/routes/llama/+server.js:209-212). Nilai language yang sudah lolos validasi juga disimpan ke tabel roasts bersama hasil roast; kolomnya dibahas di Model Data Tabel roasts.