1
- // aiService.js by **MIA**
2
- import { buildPrompt } from "./promptBuilder.js" ;
1
+ // aiService.js **by MIA**
3
2
/**
4
- * Mengirim prompt ke Groq API melalui Cloudflare Worker kamu.
3
+ * Mengirim pesan pengguna ke Cloudflare Worker (backend AI kamu).
4
+ * Worker akan menangani pemrosesan dengan Groq/Gemma dan GitHub API.
5
5
*
6
- * @param {object } prompt - Object prompt yang berisi model dan messages
7
- * @returns {Promise<string> } - Hasil jawaban AI dalam bentuk teks
6
+ * @param {string } userMessage - Pesan teks mentah dari pengguna.
7
+ * @returns {Promise<object> } - Objek JSON yang diproses dari Cloudflare Worker
8
+ * (berisi { intent, query, message, results, error }).
8
9
*/
9
- export async function sendToAI ( prompt ) {
10
- const response = await fetch ( "https://api-ai.d-adityadwiputraramadhan.workers.dev/" , {
11
- method : "POST" ,
12
- headers : {
13
- "Content-Type" : "application/json"
14
- } ,
15
- body : JSON . stringify ( prompt )
16
- } ) ;
17
-
18
- if ( ! response . ok ) {
19
- // Lebih baik lempar error dengan detail jika respon tidak OK
20
- const errorData = await response . json ( ) . catch ( ( ) => ( { message : "Respon bukan JSON" } ) ) ;
21
- throw new Error ( `Gagal menghubungi AI: ${ response . status } - ${ errorData . message || response . statusText } ` ) ;
10
+ export async function sendToAI ( userMessage ) {
11
+ // PENTING: Ganti dengan URL Cloudflare Worker kamu
12
+ const WORKER_URL = "https://lyra-ai.d-adityadwiputraramadhan.workers.dev/" ;
13
+
14
+ try {
15
+ const response = await fetch ( WORKER_URL , {
16
+ method : "POST" ,
17
+ headers : {
18
+ "Content-Type" : "application/json"
19
+ } ,
20
+ // PENTING: Mengirim { message: userMessage } ke Worker, bukan objek prompt mentah Groq.
21
+ body : JSON . stringify ( { message : userMessage } )
22
+ } ) ;
23
+
24
+ if ( ! response . ok ) {
25
+ // Lebih baik lempar error dengan detail jika respon tidak OK
26
+ const errorData = await response . json ( ) . catch ( ( ) => ( { message : "Respon bukan JSON atau error parsing" } ) ) ;
27
+ throw new Error ( `Gagal menghubungi AI: ${ response . status } - ${ errorData . message || response . statusText || 'Unknown error' } ` ) ;
28
+ }
29
+
30
+ const data = await response . json ( ) ;
31
+ // Objek ini sudah diproses dan akan memiliki { intent, query, message, results, error }
32
+ return data ;
33
+
34
+ } catch ( error ) {
35
+ console . error ( "Kesalahan dalam sendToAI:" , error ) ;
36
+ // Lemparkan error agar bisa ditangkap di core-ai.js
37
+ throw new Error ( `Koneksi AI gagal: ${ error . message } ` ) ;
22
38
}
23
- const data = await response . json ( ) ;
24
- return data . choices ?. [ 0 ] ?. message ?. content || "Maaf, tidak ada jawaban." ;
25
39
}
26
40
27
41
document . addEventListener ( 'DOMContentLoaded' , async ( ) => {
28
- const messagePrompt = "kamu adalah lyra ✨, Agents GitHub intelligence yang ramah dan profesional dibuat oleh Daffa & jangan terlalu panjang menjawab." ;
29
42
const chatWelcomeDiv = document . getElementById ( 'chat-welcome' ) ;
30
- try {
31
- // --- PERBAIKAN DI SINI ---
32
- // Kirim prompt sebagai OBJEK sesuai format yang diharapkan oleh Groq API
33
- const promptObject = {
34
- model : "gemma2-9b-it" , // Ganti dengan model Groq yang kamu gunakan rekomen gua: gemma2
35
- messages : [ { role : "user" , content : messagePrompt } ]
36
- } ;
43
+ if ( chatWelcomeDiv ) {
44
+ // Tampilkan pesan loading atau placeholder
45
+ chatWelcomeDiv . innerHTML = `<h2 class="font-bold text-4xl text-blue-400">L Y Я A</h2><br><p class="text-gray-300 animate-pulse">Memuat AI...</p>` ;
37
46
38
- const result = await sendToAI ( promptObject ) ;
47
+ try {
48
+ const initialAboutAIResponse = await sendToAI ( "Kamu siapa?" ) ;
39
49
40
- // --- BAGIAN PERUBAHAN UTAMA DI SINI ---
41
- // Ubah konten HTML dari div dengan hasil dari AI
42
- if ( chatWelcomeDiv ) { // Pastikan elemen ditemukan
43
- // Kamu bisa langsung menampilkan hasilnya:
44
- // chatWelcomeDiv.innerText = result;
50
+ if ( initialAboutAIResponse . error ) {
51
+ chatWelcomeDiv . innerHTML = `<span class="font-bold text-red-500">Error:</span> ${ initialAboutAIResponse . error } ` ;
52
+ chatWelcomeDiv . classList . add ( 'text-red-500' ) ;
53
+ } else {
54
+ // Ambil pesan 'about_ai' dari properti 'message' yang dikembalikan Worker
55
+ const aboutAIText = initialAboutAIResponse . message || "Selamat datang! Ada yang bisa saya bantu?" ;
45
56
46
- // Atau, jika Kamu ingin mempertahankan beberapa HTML bawaan dan hanya mengganti sebagian,
47
- // Kamu bisa manipulasi innerHTML atau membuat elemen baru.
48
- // Contoh: mengganti teks selamat datang dengan respon AI
49
- chatWelcomeDiv . innerHTML = `<h2 class="font-bold text-4xl text-blue-400">L Y Я A</h2><br>${ result } ` ;
50
-
51
- // Jika Kamu ingin efek fading atau animasinya, Kamu bisa tambahkan class
52
- chatWelcomeDiv . classList . remove ( 'opacity-100' , 'blur-0' ) ;
53
- chatWelcomeDiv . classList . add ( 'opacity-0' , 'blur-sm' ) ; // Sembunyikan dulu
54
-
55
- setTimeout ( ( ) => {
56
- chatWelcomeDiv . innerHTML = `<h2 class="font-bold text-4xl text-blue-400">L Y Я A</h2><br>${ result } ` ;
57
- chatWelcomeDiv . classList . remove ( 'opacity-0' , 'blur-sm' ) ;
58
- chatWelcomeDiv . classList . add ( 'opacity-100' , 'blur-0' ) ; // Munculkan kembali
59
- } , 700 ) ; // Sesuaikan dengan durasi transisi CSS Kamu (700ms)
60
- }
57
+ // Aplikasikan efek fading jika diinginkan
58
+ chatWelcomeDiv . classList . remove ( 'opacity-100' , 'blur-0' ) ;
59
+ chatWelcomeDiv . classList . add ( 'opacity-0' , 'blur-sm' ) ;
61
60
62
- // console.log("Respon dari AI:", result);
63
- } catch ( error ) {
64
- console . error ( "Terjadi kesalahan:" , error . message ) ;
65
- if ( chatWelcomeDiv ) {
66
- chatWelcomeDiv . innerHTML = `<span class="font-bold text-red-500">Error:</span> ${ error . message } ` ;
67
- chatWelcomeDiv . classList . add ( 'text-red-500' ) ; // Beri warna merah untuk error
68
- chatWelcomeDiv . classList . remove ( 'opacity-0' , 'blur-sm' ) ;
69
- chatWelcomeDiv . classList . add ( 'opacity-100' , 'blur-0' ) ;
61
+ setTimeout ( ( ) => {
62
+ chatWelcomeDiv . innerHTML = `<h2 class="font-bold text-4xl text-blue-400">L Y Я A</h2><br>${ aboutAIText } ` ;
63
+ chatWelcomeDiv . classList . remove ( 'opacity-0' , 'blur-sm' ) ;
64
+ chatWelcomeDiv . classList . add ( 'opacity-100' , 'blur-0' ) ;
65
+ } , 700 ) ; // Sesuaikan dengan durasi transisi CSS kamu
66
+ }
67
+
68
+ } catch ( error ) {
69
+ console . error ( "Terjadi kesalahan saat memuat respons AI:" , error . message ) ;
70
+ chatWelcomeDiv . innerHTML = `<span class="font-bold text-red-500">Error:</span> Gagal memuat AI. ${ error . message } ` ;
71
+ chatWelcomeDiv . classList . add ( 'text-red-500' ) ;
70
72
}
73
+
71
74
}
72
75
} ) ;
0 commit comments