1 line
15 KiB
JSON
1 line
15 KiB
JSON
{"repo": "centrova-id/centrova-web", "files": {"app/Http/Controllers/Api/ChatbotController.php": {"2ee83ad7d9069ce5f74676a6e22f07eced26a182": {"t": 1785746154.2985358, "n": 6121, "h": "6017d6ba413303e5", "c": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Http;\nuse Illuminate\\Support\\Facades\\Log;\n\nclass ChatbotController extends Controller\n{\n protected function getContextData(): string\n {\n $contextFile = public_path('data/chatbot_context.md');\n\n if (file_exists($contextFile)) {\n $content = file_get_contents($contextFile);\n // Strip Markdown formatting for cleaner system prompt\n $content = preg_replace('/^#+\\s*/m', '', $content);\n $content = preg_replace('/\\*\\*(.*?)\\*\\*/', '$1', $content);\n $content = preg_replace('/^>\\s*/m', '', $content);\n return trim($content);\n }\n\n return '';\n }\n\n public function ask(Request $request)\n {\n $request->validate([\n 'message' => 'required|string|max:2000',\n 'history' => 'nullable|array',\n 'history.*.role' => 'required|string|in:user,assistant',\n 'history.*.content' => 'required|string',\n ]);\n\n $userMessage = $request->input('message');\n $history = $request->input('history', []);\n\n // Load context data from chatbot_context.md\n $contextData = $this->getContextData();\n\n $systemPrompt = <<<PROMPT\nAnda adalah asisten AI resmi Centrova — AI Venture Engineering company dan technology partner.\nJawab pertanyaan dengan ramah, informatif, dan dalam bahasa Indonesia.\nAnda BUKAN sekadar chatbot biasa. Anda adalah sales virtual Centrova yang cerdas, seperti sales manusia yang sangat ahli menjual.\nAnda harus paham psikologi calon klien: dengarkan dulu kebutuhannya, bangun rasa percaya, lalu tawarkan solusi Centrova dengan meyakinkan.\n\nGunakan data berikut sebagai sumber informasi utama untuk menjawab pertanyaan tentang Centrova.\nJika ada informasi yang tidak tersedia di data berikut, gunakan pengetahuan umum Anda namun tetap relevan dengan konteks Centrova.\nJangan menyebutkan nama legal perusahaan (PT Centrova Teknologi Indonesia) secara langsung di awal percakapan. Hanya sampaikan jika ada yang bertanya spesifik tentang nama legal perusahaan.\n\nDATA INFORMASI CENTROVA:\n{$contextData}\n\nPANDUAN SALES PSYCHOLOGY:\n- Jadilah seperti sales manusia yang cerdas: dengarkan, pahami masalahnya, lalu tawarkan solusi.\n- Bangun rasa urgensi dan FOMO (Fear of Missing Out) secara halus ketika relevan.\n- Gunakan bahasa yang hangat, profesional, dan membangun kepercayaan.\n- Tanyakan balik tentang kebutuhan mereka untuk memahami lebih dalam.\n- Ketika seseorang tertarik, dorong mereka untuk menghubungi tim via WhatsApp.\n\nPANDUAN RESPONS:\n- Jawab berdasarkan data Centrova terlebih dahulu.\n- Jika ditanya HARGA: jangan menyebut angka. Arahkan ke WhatsApp tim Centrova di <a href=\"https://wa.me/62895397633012?text=Halo%20Centrova,%20saya%20ingin%20tanya%20soal%20harga\">+62 895-3976-33012</a>.\n- Jika ditanya WAKTU PENGERJAAN: jelaskan estimasi menyesuaikan kebutuhan proyek, dan arahkan diskusi lebih detail via WhatsApp.\n- Jika diminta MEMBUAT CODINGAN / SCRIPT / APLIKASI: tolak dengan sopan. Katakan bahwa pembuatan codingan dan pengembangan software ditangani langsung oleh tim teknisi Centrova. Arahkan untuk menghubungi tim via WhatsApp untuk konsultasi lebih lanjut. Jangan pernah memberikan kode/skrip.\n- Jika ditanya di luar topik layanan Centrova, arahkan kembali ke layanan Centrova dengan sopan.\n- Maksimal 300 kata per respons.\n- Jangan mengarang testimoni, portofolio, statistik, atau studi kasus yang tidak ada di data.\n- Jangan menyebut Centrova sebagai software house biasa, tetapi sebagai AI Venture Engineering company atau technology partner.\n- Semua link/nomor telepon WAJIB menggunakan format hyperlink HTML <a href=\"...\"> yang bisa diklik langsung.\n- Gunakan tag HTML untuk respons agar tampil rapi: <h2>, <h3>, <p>, <ul>, <li>, <strong>, <a href>, <blockquote>, <ol>. JANGAN gunakan markdown. Cukup konten HTML murni tanpa wrapper.\nPROMPT;\n\n // Build messages array with conversation history\n $messages = [\n [\n 'role' => 'system',\n 'content' => $systemPrompt,\n ],\n ];\n\n // Append conversation history (limit to last 10 messages for token efficiency)\n $history = array_slice($history, -10);\n foreach ($history as $msg) {\n $messages[] = [\n 'role' => $msg['role'],\n 'content' => $msg['content'],\n ];\n }\n\n // Add current user message\n $messages[] = [\n 'role' => 'user',\n 'content' => $userMessage,\n ];\n\n try {\n $response = Http::withHeaders([\n 'Authorization' => 'Bearer sk-66c4d2e259984004ab9e0e8b655c4099',\n 'Content-Type' => 'application/json',\n ])->timeout(60)->post('https://api.deepseek.com/v1/chat/completions', [\n 'model' => 'deepseek-chat',\n 'messages' => $messages,\n 'max_tokens' => 1000,\n 'temperature' => 0.7,\n ]);\n\n if ($response->successful()) {\n $data = $response->json();\n $reply = $data['choices'][0]['message']['content'] ?? 'Maaf, saya tidak bisa menjawab pertanyaan tersebut saat ini.';\n\n return response()->json([\n 'success' => true,\n 'reply' => $reply,\n ]);\n }\n\n Log::error('DeepSeek API error', [\n 'status' => $response->status(),\n 'body' => $response->body(),\n ]);\n\n return response()->json([\n 'success' => false,\n 'reply' => 'Maaf, layanan AI sedang sibuk. Silakan coba lagi nanti.',\n ], 500);\n\n } catch (\\Exception $e) {\n Log::error('Chatbot exception: ' . $e->getMessage());\n\n return response()->json([\n 'success' => false,\n 'reply' => 'Maaf, terjadi kesalahan koneksi. Silakan coba lagi nanti.',\n ], 500);\n }\n }\n}\n"}, "0744e212258bc349930f9629f508411f464c2b00": {"t": 1785760247.409187, "n": 6121, "h": "6017d6ba413303e5", "c": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Http;\nuse Illuminate\\Support\\Facades\\Log;\n\nclass ChatbotController extends Controller\n{\n protected function getContextData(): string\n {\n $contextFile = public_path('data/chatbot_context.md');\n\n if (file_exists($contextFile)) {\n $content = file_get_contents($contextFile);\n // Strip Markdown formatting for cleaner system prompt\n $content = preg_replace('/^#+\\s*/m', '', $content);\n $content = preg_replace('/\\*\\*(.*?)\\*\\*/', '$1', $content);\n $content = preg_replace('/^>\\s*/m', '', $content);\n return trim($content);\n }\n\n return '';\n }\n\n public function ask(Request $request)\n {\n $request->validate([\n 'message' => 'required|string|max:2000',\n 'history' => 'nullable|array',\n 'history.*.role' => 'required|string|in:user,assistant',\n 'history.*.content' => 'required|string',\n ]);\n\n $userMessage = $request->input('message');\n $history = $request->input('history', []);\n\n // Load context data from chatbot_context.md\n $contextData = $this->getContextData();\n\n $systemPrompt = <<<PROMPT\nAnda adalah asisten AI resmi Centrova — AI Venture Engineering company dan technology partner.\nJawab pertanyaan dengan ramah, informatif, dan dalam bahasa Indonesia.\nAnda BUKAN sekadar chatbot biasa. Anda adalah sales virtual Centrova yang cerdas, seperti sales manusia yang sangat ahli menjual.\nAnda harus paham psikologi calon klien: dengarkan dulu kebutuhannya, bangun rasa percaya, lalu tawarkan solusi Centrova dengan meyakinkan.\n\nGunakan data berikut sebagai sumber informasi utama untuk menjawab pertanyaan tentang Centrova.\nJika ada informasi yang tidak tersedia di data berikut, gunakan pengetahuan umum Anda namun tetap relevan dengan konteks Centrova.\nJangan menyebutkan nama legal perusahaan (PT Centrova Teknologi Indonesia) secara langsung di awal percakapan. Hanya sampaikan jika ada yang bertanya spesifik tentang nama legal perusahaan.\n\nDATA INFORMASI CENTROVA:\n{$contextData}\n\nPANDUAN SALES PSYCHOLOGY:\n- Jadilah seperti sales manusia yang cerdas: dengarkan, pahami masalahnya, lalu tawarkan solusi.\n- Bangun rasa urgensi dan FOMO (Fear of Missing Out) secara halus ketika relevan.\n- Gunakan bahasa yang hangat, profesional, dan membangun kepercayaan.\n- Tanyakan balik tentang kebutuhan mereka untuk memahami lebih dalam.\n- Ketika seseorang tertarik, dorong mereka untuk menghubungi tim via WhatsApp.\n\nPANDUAN RESPONS:\n- Jawab berdasarkan data Centrova terlebih dahulu.\n- Jika ditanya HARGA: jangan menyebut angka. Arahkan ke WhatsApp tim Centrova di <a href=\"https://wa.me/62895397633012?text=Halo%20Centrova,%20saya%20ingin%20tanya%20soal%20harga\">+62 895-3976-33012</a>.\n- Jika ditanya WAKTU PENGERJAAN: jelaskan estimasi menyesuaikan kebutuhan proyek, dan arahkan diskusi lebih detail via WhatsApp.\n- Jika diminta MEMBUAT CODINGAN / SCRIPT / APLIKASI: tolak dengan sopan. Katakan bahwa pembuatan codingan dan pengembangan software ditangani langsung oleh tim teknisi Centrova. Arahkan untuk menghubungi tim via WhatsApp untuk konsultasi lebih lanjut. Jangan pernah memberikan kode/skrip.\n- Jika ditanya di luar topik layanan Centrova, arahkan kembali ke layanan Centrova dengan sopan.\n- Maksimal 300 kata per respons.\n- Jangan mengarang testimoni, portofolio, statistik, atau studi kasus yang tidak ada di data.\n- Jangan menyebut Centrova sebagai software house biasa, tetapi sebagai AI Venture Engineering company atau technology partner.\n- Semua link/nomor telepon WAJIB menggunakan format hyperlink HTML <a href=\"...\"> yang bisa diklik langsung.\n- Gunakan tag HTML untuk respons agar tampil rapi: <h2>, <h3>, <p>, <ul>, <li>, <strong>, <a href>, <blockquote>, <ol>. JANGAN gunakan markdown. Cukup konten HTML murni tanpa wrapper.\nPROMPT;\n\n // Build messages array with conversation history\n $messages = [\n [\n 'role' => 'system',\n 'content' => $systemPrompt,\n ],\n ];\n\n // Append conversation history (limit to last 10 messages for token efficiency)\n $history = array_slice($history, -10);\n foreach ($history as $msg) {\n $messages[] = [\n 'role' => $msg['role'],\n 'content' => $msg['content'],\n ];\n }\n\n // Add current user message\n $messages[] = [\n 'role' => 'user',\n 'content' => $userMessage,\n ];\n\n try {\n $response = Http::withHeaders([\n 'Authorization' => 'Bearer sk-66c4d2e259984004ab9e0e8b655c4099',\n 'Content-Type' => 'application/json',\n ])->timeout(60)->post('https://api.deepseek.com/v1/chat/completions', [\n 'model' => 'deepseek-chat',\n 'messages' => $messages,\n 'max_tokens' => 1000,\n 'temperature' => 0.7,\n ]);\n\n if ($response->successful()) {\n $data = $response->json();\n $reply = $data['choices'][0]['message']['content'] ?? 'Maaf, saya tidak bisa menjawab pertanyaan tersebut saat ini.';\n\n return response()->json([\n 'success' => true,\n 'reply' => $reply,\n ]);\n }\n\n Log::error('DeepSeek API error', [\n 'status' => $response->status(),\n 'body' => $response->body(),\n ]);\n\n return response()->json([\n 'success' => false,\n 'reply' => 'Maaf, layanan AI sedang sibuk. Silakan coba lagi nanti.',\n ], 500);\n\n } catch (\\Exception $e) {\n Log::error('Chatbot exception: ' . $e->getMessage());\n\n return response()->json([\n 'success' => false,\n 'reply' => 'Maaf, terjadi kesalahan koneksi. Silakan coba lagi nanti.',\n ], 500);\n }\n }\n}\n"}, "2f589351470312e2d1e6efd47f69fb60461e317c": {"t": 1785760248.6305437, "n": 2692, "h": "76760ebb244ef2a6", "c": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Http;\nuse Illuminate\\Support\\Facades\\Log;\n\nclass ChatbotController extends Controller\n{\n public function ask(Request $request)\n {\n $request->validate([\n 'message' => 'required|string|max:2000',\n ]);\n\n $userMessage = $request->input('message');\n\n try {\n $response = Http::withHeaders([\n 'Authorization' => 'Bearer sk-66c4d2e259984004ab9e0e8b655c4099',\n 'Content-Type' => 'application/json',\n ])->timeout(60)->post('https://api.deepseek.com/v1/chat/completions', [\n 'model' => 'deepseek-chat',\n 'messages' => [\n [\n 'role' => 'system',\n 'content' => 'Anda adalah asisten AI resmi Centrova (PT Centrova Teknologi Indonesia). Jawab pertanyaan dengan ramah, informatif, dan dalam bahasa Indonesia. Anda membantu pengguna yang menanyakan tentang layanan Centrova seperti: web development, mobile app development, UI/UX design, AI automation, AI agents, konsultasi teknologi, dan solusi digital lainnya. Jika ditanya di luar topik layanan Centrova, arahkan kembali ke layanan Centrova dengan sopan. Gunakan bahasa yang hangat dan profesional. Maksimal 300 kata per respons.',\n ],\n [\n 'role' => 'user',\n 'content' => $userMessage,\n ],\n ],\n 'max_tokens' => 1000,\n 'temperature' => 0.7,\n ]);\n\n if ($response->successful()) {\n $data = $response->json();\n $reply = $data['choices'][0]['message']['content'] ?? 'Maaf, saya tidak bisa menjawab pertanyaan tersebut saat ini.';\n\n return response()->json([\n 'success' => true,\n 'reply' => $reply,\n ]);\n }\n\n Log::error('DeepSeek API error', [\n 'status' => $response->status(),\n 'body' => $response->body(),\n ]);\n\n return response()->json([\n 'success' => false,\n 'reply' => 'Maaf, layanan AI sedang sibuk. Silakan coba lagi nanti.',\n ], 500);\n\n } catch (\\Exception $e) {\n Log::error('Chatbot exception: ' . $e->getMessage());\n\n return response()->json([\n 'success' => false,\n 'reply' => 'Maaf, terjadi kesalahan koneksi. Silakan coba lagi nanti.',\n ], 500);\n }\n }\n}\n"}}}} |