chatbot.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. require_once 'CsvReader.php';
  3. set_time_limit(2500); // 2 Minuten erlauben
  4. header('Content-Type: application/json');
  5. // only accept POST requests
  6. if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
  7. http_response_code(405);
  8. echo json_encode(['error' => 'Only POST allowed']);
  9. exit;
  10. }
  11. /** Extract text from a PDF file using pdftotext command line tool.
  12. *
  13. * @param string $file Path to the PDF file.
  14. * @return string Extracted text from the PDF.
  15. */
  16. function extractPdfText($file) {
  17. $tmp = tempnam(sys_get_temp_dir(), 'pdftext');
  18. exec("pdftotext " . escapeshellarg($file) . " " . escapeshellarg($tmp));
  19. $text = file_get_contents($tmp);
  20. unlink($tmp);
  21. return $text ?: '';
  22. }
  23. // Build prompt for deepseek
  24. $input = json_decode(file_get_contents('php://input'), true);
  25. $question = isset($input['question']) ? $input['question'] : '';
  26. $roleFile = __DIR__ . '/data/role.txt';
  27. $role = file_exists($roleFile) ? file_get_contents($roleFile) : '';
  28. $reader = new CsvReader(__DIR__ . '/data/csv');
  29. $rows = $reader->readAll();
  30. $contextText = "";
  31. foreach ($rows as $row) {
  32. $contextText .= "- " . implode(" | ", $row) . "\n";
  33. }
  34. $pdf1 = extractPdfText(__DIR__ . '/data/pdf/onboarding.pdf');
  35. $pdf2 = extractPdfText(__DIR__ . '/data/pdf/urlaub.pdf');
  36. $pdfContext = "\n\nAus Onboarding-Dokument:\n" . $pdf1 . "\n\nAus Urlaubsdokument:\n" . $pdf2;
  37. $htmlDir = __DIR__ . '/data/html';
  38. $htmlContext = '';
  39. $prompt = "";
  40. $prompt = "Deine Rolle ist: ". $role;
  41. $prompt .= "\nDeine Frage ist: " . $question;
  42. $prompt .= "\nCSV-Daten:\n" . $contextText;
  43. $prompt .= "\nPDF-Kontext:\n" . $pdfContext;
  44. $prompt .= "\nHTML-Wissensdatenbank:\n" . $htmlContext;
  45. // ollama stuff
  46. //$payload = json_encode([
  47. // "model" => "deepseek-r1",
  48. //// "model" => "deepseek-llm",
  49. //// "model" => "deepseek-coder:6.7b",
  50. // "prompt" => $prompt,
  51. // "stream" => false,
  52. // "stop" => ["</think>"]
  53. //]);
  54. //$promptContext = "Kontextdaten:\n\nCSV:\n$contextText\n\nPDF:\n$pdfContext\nHTML:\n$htmlContext";
  55. $promptContext = "Kontextdaten:\n\nCSV:\n$contextText\n\nPDF:\n$pdfContext";
  56. error_log("System prompt length: " . strlen($promptContext));
  57. $payload = json_encode([
  58. "model" => "deepseek-llm-7b-chat",
  59. "messages" => [
  60. // ["role" => "system", "content" => "Rolle:\n$role\n\n$promptContext"],
  61. ["role" => "system", "content" => "Rolle:\n$role"],
  62. ["role" => "user", "content" => $question]
  63. // ["role" => "context", "content" => $promptContext]
  64. ],
  65. "temperature" => 0.5,
  66. "max_tokens" => -1,
  67. "stream" => false
  68. ]);
  69. $start = microtime(true);
  70. // ### Send Request
  71. //$ch = curl_init('http://localhost:11434/api/generate');
  72. $ch = curl_init('http://localhost:1234/api/v0/chat/completions');
  73. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  74. curl_setopt($ch, CURLOPT_POST, true);
  75. curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
  76. curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
  77. $response = curl_exec($ch);
  78. curl_close($ch);
  79. $data = json_decode($response, true);
  80. $end = microtime(true);
  81. // ### Prepare Response
  82. //$responseText = isset($data['response']) ? $data['response'] : 'No answer from Deepseek!';
  83. //$responseText = $data['choices'][0]['message']['content'] ?? 'No answer from Deepseek!';
  84. $responseText = isset($data['choices'][0]['message']['content']) ? $data['choices'][0]['message']['content'] : '';
  85. //$responseText = preg_replace('/<think>.*?<\/think>/s', ' ', $responseText);
  86. $responseText = trim($responseText);
  87. echo json_encode([
  88. 'reply' => $responseText,
  89. // 'misc' => $htmlContext,
  90. 'duration_seconds' => round($end - $start, 3)
  91. ]);