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.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:101, src/routes/+page.svelte:12-282). Select itu diikat ke selectedLanguage lewat bind:value, sehingga yang terkirim adalah value, bukan label (src/routes/+page.svelte:85-933). Nilai tersebut ikut masuk ke body fetch('/llama') bersama username (src/routes/+page.svelte:39-454).
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-275, src/routes/llama/+server.js:134-1766).
value | label di UI | Ada di validLanguages | Ada case di switch | Prompt yang benar-benar dipakai |
|---|---|---|---|---|
english | English | ya | tidak | prompt default berbahasa Inggris |
french | Français (French) | ya | ya | prompt case 'french' |
italian | Italiano (Italian) | tidak | ya | ditolak 400 sebelum switch |
indonesian | Indonesian | ya | ya | prompt case 'indonesian' |
indian | हिंदी (Hindi) | ya | ya | prompt case 'indian' |
korean | 한국어 (Korean) | ya | ya | prompt case 'korean' |
japanese | 日本語 (Japanese) | ya | ya | prompt case 'japanese' |
chinese | 中文 (Chinese) | ya | ya | prompt case 'chinese' |
german | Deútsche (German) | tidak | ya | ditolak 400 sebelum switch |
arabic | العربية (Arabic) | ya | ya | prompt case 'italian' |
vietnamese | Tiếng việt (Vietnamese) | ya | ya | prompt case 'vietnamese' |
finnish | Suomi (Finnish) | tidak | ya | ditolak 400 sebelum switch |
portuguese | Português (Portuguese) | tidak | ya | ditolak 400 sebelum switch |
polish | język polski (Polish) | ya | ya | prompt case 'polish' |
traditionalChinese | 中文(臺灣) (Traditional Chinese) | ya | ya | prompt 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-387).
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:1338). 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-1766).
Dua jebakan pada pemetaan bahasa
⚠️
case 'arabic'tidak diakhiribreak. Alurnya jatuh kecase 'italian'yang langsung menimpapromptdengan kalimat Italia, lalu berhenti dibreakmilikitalian. Akibatnya permintaan denganlanguage: 'arabic'yang lolos validasi tetap menghasilkan roast berbahasa Italia (src/routes/llama/+server.js:156-1609).
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.⚠️ Empat
casetidak pernah tercapai:german,italian,finnish, danportuguese. Keempat nilai itu ada di dropdown UI dan ada diswitch, tetapi tidak terdaftar divalidLanguages, sehingga request-nya sudah dibalas 400 lebih dulu (src/routes/llama/+server.js:15-275, src/routes/llama/+server.js:153-17210).
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-19311).
Kalau panggilan itu gagal, handler mengembalikan status 500 dengan pesan Failed to generate roast (src/routes/llama/+server.js:209-21212). Nilai language yang sudah lolos validasi juga disimpan ke tabel roasts bersama hasil roast; kolomnya dibahas di Model Data Tabel roasts.