Files

1 line
7.3 KiB
JSON

{"repo": "aurylia/smartgrade", "files": {"lib/aiHelper.ts": {"cb44e5e4ee9b569a16b4bedd9b194e908b255f3e": {"t": 1785745583.4882078, "n": 3373, "h": "d08472ad8e6a7c75", "c": "/**\n * AI Integration Helper\n * Menggunakan: DeepSeek via OpenRouter\n * API: https://openrouter.ai/\n */\n\nimport Constants from \"expo-constants\";\n\nexport async function callDeepSeekViaOpenRouter(\n userQuestion: string,\n question: any,\n studentAnswer: string,\n isCorrect: boolean\n): Promise<string> {\n // Baca API key dari expo-constants\n const OPENROUTER_API_KEY =\n Constants.expoConfig?.extra?.DEEPSEEK_API_KEY ||\n process.env.EXPO_PUBLIC_DEEPSEEK_API_KEY ||\n \"\";\n\n if (!OPENROUTER_API_KEY) {\n console.error(\"❌ API key DeepSeek tidak ditemukan!\");\n console.error(\"Pastikan DEEPSEEK_API_KEY sudah di app.json > extra\");\n console.error(\"Lalu restart: npx expo start --tunnel --clear\");\n return \"❌ API key OpenRouter/DeepSeek belum diset.\\n\\nSolusi:\\n1. Pastikan app.json punya extra.DEEPSEEK_API_KEY\\n2. Restart aplikasi: npx expo start --tunnel --clear\";\n }\n\n console.log(\n \"✅ API key ditemukan, panjang:\",\n OPENROUTER_API_KEY.substring(0, 10) + \"...\"\n );\n\n const messages = [\n {\n role: \"system\",\n content:\n \"Kamu adalah tutor yang menjawab pertanyaan siswa secara natural, jelas, dan edukatif. Jangan hanya menyalin deskripsi guru; jelaskan dengan kata-katamu sendiri, gunakan analogi jika perlu, dan fokus pada pertanyaan siswa. Gunakan emoji untuk lebih ramah 😊\",\n },\n {\n role: \"user\",\n content: `\nKONTEKS SOAL:\n${question.question}\n\nPILIHAN JAWABAN:\nA: ${question.optionDescriptions?.a || \"-\"}\nB: ${question.optionDescriptions?.b || \"-\"}\nC: ${question.optionDescriptions?.c || \"-\"}\nD: ${question.optionDescriptions?.d || \"-\"}\n\nJAWABAN BENAR: ${question.correctAnswer?.toUpperCase() || \"-\"}\nJAWABAN SISWA: ${studentAnswer ? studentAnswer.toUpperCase() : \"Belum dijawab\"}\nSTATUS: ${isCorrect ? \"✓ Benar\" : \"✗ Salah\"}\n\nREFERENSI PENJELASAN (gunakan hanya sebagai panduan, jangan copy-paste):\n${question.detailedExplanation || \"-\"}\n\nPERTANYAAN SISWA:\n${userQuestion}\n\nInstruksi:\n- Jawab dengan kata-katamu SENDIRI\n- Berikan penjelasan singkat dan jelas\n- Tambahkan contoh/analogi jika perlu\n- Ramah dan gunakan emoji 😊\n`,\n },\n ];\n\n try {\n console.log(\"🤖 Menghubungi DeepSeek via OpenRouter...\");\n\n const resp = await fetch(\"https://openrouter.ai/api/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${OPENROUTER_API_KEY}`,\n \"HTTP-Referer\": \"https://smart-grade.app\",\n \"X-Title\": \"Smart Grade Tutor\",\n },\n body: JSON.stringify({\n model: \"deepseek/deepseek-chat-v3.1\",\n messages,\n temperature: 0.7,\n max_tokens: 800,\n }),\n });\n\n const data = await resp.json();\n console.log(\"📦 Response dari OpenRouter:\", JSON.stringify(data, null, 2));\n\n if (data?.choices?.length) {\n console.log(\"✅ Respons dari DeepSeek diterima\");\n return data.choices[0].message.content;\n }\n\n if (data?.error) {\n console.error(\"❌ OpenRouter Error:\", data.error);\n return `Maaf, terjadi error dari OpenRouter: ${\n data.error.message || \"Unknown error\"\n }`;\n }\n\n return \"Maaf, tidak ada respons dari AI. Response: \" + JSON.stringify(data);\n } catch (err: any) {\n console.error(\"❌ DeepSeek Error:\", err);\n return `Maaf, terjadi kesalahan saat menghubungi AI. Error: ${\n err.message || \"Unknown\"\n }`;\n }\n}\n"}, "f253df4716835e6a0e6b10504b90a6506f002665": {"t": 1785754486.2373264, "n": 3373, "h": "d08472ad8e6a7c75", "c": "/**\n * AI Integration Helper\n * Menggunakan: DeepSeek via OpenRouter\n * API: https://openrouter.ai/\n */\n\nimport Constants from \"expo-constants\";\n\nexport async function callDeepSeekViaOpenRouter(\n userQuestion: string,\n question: any,\n studentAnswer: string,\n isCorrect: boolean\n): Promise<string> {\n // Baca API key dari expo-constants\n const OPENROUTER_API_KEY =\n Constants.expoConfig?.extra?.DEEPSEEK_API_KEY ||\n process.env.EXPO_PUBLIC_DEEPSEEK_API_KEY ||\n \"\";\n\n if (!OPENROUTER_API_KEY) {\n console.error(\"❌ API key DeepSeek tidak ditemukan!\");\n console.error(\"Pastikan DEEPSEEK_API_KEY sudah di app.json > extra\");\n console.error(\"Lalu restart: npx expo start --tunnel --clear\");\n return \"❌ API key OpenRouter/DeepSeek belum diset.\\n\\nSolusi:\\n1. Pastikan app.json punya extra.DEEPSEEK_API_KEY\\n2. Restart aplikasi: npx expo start --tunnel --clear\";\n }\n\n console.log(\n \"✅ API key ditemukan, panjang:\",\n OPENROUTER_API_KEY.substring(0, 10) + \"...\"\n );\n\n const messages = [\n {\n role: \"system\",\n content:\n \"Kamu adalah tutor yang menjawab pertanyaan siswa secara natural, jelas, dan edukatif. Jangan hanya menyalin deskripsi guru; jelaskan dengan kata-katamu sendiri, gunakan analogi jika perlu, dan fokus pada pertanyaan siswa. Gunakan emoji untuk lebih ramah 😊\",\n },\n {\n role: \"user\",\n content: `\nKONTEKS SOAL:\n${question.question}\n\nPILIHAN JAWABAN:\nA: ${question.optionDescriptions?.a || \"-\"}\nB: ${question.optionDescriptions?.b || \"-\"}\nC: ${question.optionDescriptions?.c || \"-\"}\nD: ${question.optionDescriptions?.d || \"-\"}\n\nJAWABAN BENAR: ${question.correctAnswer?.toUpperCase() || \"-\"}\nJAWABAN SISWA: ${studentAnswer ? studentAnswer.toUpperCase() : \"Belum dijawab\"}\nSTATUS: ${isCorrect ? \"✓ Benar\" : \"✗ Salah\"}\n\nREFERENSI PENJELASAN (gunakan hanya sebagai panduan, jangan copy-paste):\n${question.detailedExplanation || \"-\"}\n\nPERTANYAAN SISWA:\n${userQuestion}\n\nInstruksi:\n- Jawab dengan kata-katamu SENDIRI\n- Berikan penjelasan singkat dan jelas\n- Tambahkan contoh/analogi jika perlu\n- Ramah dan gunakan emoji 😊\n`,\n },\n ];\n\n try {\n console.log(\"🤖 Menghubungi DeepSeek via OpenRouter...\");\n\n const resp = await fetch(\"https://openrouter.ai/api/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${OPENROUTER_API_KEY}`,\n \"HTTP-Referer\": \"https://smart-grade.app\",\n \"X-Title\": \"Smart Grade Tutor\",\n },\n body: JSON.stringify({\n model: \"deepseek/deepseek-chat-v3.1\",\n messages,\n temperature: 0.7,\n max_tokens: 800,\n }),\n });\n\n const data = await resp.json();\n console.log(\"📦 Response dari OpenRouter:\", JSON.stringify(data, null, 2));\n\n if (data?.choices?.length) {\n console.log(\"✅ Respons dari DeepSeek diterima\");\n return data.choices[0].message.content;\n }\n\n if (data?.error) {\n console.error(\"❌ OpenRouter Error:\", data.error);\n return `Maaf, terjadi error dari OpenRouter: ${\n data.error.message || \"Unknown error\"\n }`;\n }\n\n return \"Maaf, tidak ada respons dari AI. Response: \" + JSON.stringify(data);\n } catch (err: any) {\n console.error(\"❌ DeepSeek Error:\", err);\n return `Maaf, terjadi kesalahan saat menghubungi AI. Error: ${\n err.message || \"Unknown\"\n }`;\n }\n}\n"}}}}