chatbot.php 3.4 KB

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