'Only POST allowed']); exit; } /** Extract text from a PDF file using pdftotext command line tool. * * @param string $file Path to the PDF file. * @return string Extracted text from the PDF. */ function extractPdfText($file) { $tmp = tempnam(sys_get_temp_dir(), 'pdftext'); exec("pdftotext " . escapeshellarg($file) . " " . escapeshellarg($tmp)); $text = file_get_contents($tmp); unlink($tmp); return $text ?: ''; } // Build prompt for deepseek $input = json_decode(file_get_contents('php://input'), true); $question = isset($input['question']) ? $input['question'] : ''; $roleFile = __DIR__ . '/data/role.txt'; $role = file_exists($roleFile) ? file_get_contents($roleFile) : ''; $reader = new CsvReader(__DIR__ . '/data/csv'); $rows = $reader->readAll(); $contextText = ""; foreach ($rows as $row) { $contextText .= "- " . implode(" | ", $row) . "\n"; } $pdf1 = extractPdfText(__DIR__ . '/data/pdf/onboarding.pdf'); $pdf2 = extractPdfText(__DIR__ . '/data/pdf/urlaub.pdf'); $pdfContext = "\n\nAus Onboarding-Dokument:\n" . $pdf1 . "\n\nAus Urlaubsdokument:\n" . $pdf2; $htmlDir = __DIR__ . '/data/html'; $htmlContext = ''; $prompt = ""; $prompt = "Deine Rolle ist: ". $role; $prompt .= "\nDeine Frage ist: " . $question; $prompt .= "\nCSV-Daten:\n" . $contextText; $prompt .= "\nPDF-Kontext:\n" . $pdfContext; $prompt .= "\nHTML-Wissensdatenbank:\n" . $htmlContext; // ollama stuff //$payload = json_encode([ // "model" => "deepseek-r1", //// "model" => "deepseek-llm", //// "model" => "deepseek-coder:6.7b", // "prompt" => $prompt, // "stream" => false, // "stop" => [""] //]); //$promptContext = "Kontextdaten:\n\nCSV:\n$contextText\n\nPDF:\n$pdfContext\nHTML:\n$htmlContext"; $promptContext = "Kontextdaten:\n\nCSV:\n$contextText\n\nPDF:\n$pdfContext"; error_log("System prompt length: " . strlen($promptContext)); $payload = json_encode([ "model" => "deepseek-llm-7b-chat", "messages" => [ // ["role" => "system", "content" => "Rolle:\n$role\n\n$promptContext"], ["role" => "system", "content" => "Rolle:\n$role"], ["role" => "user", "content" => $question] // ["role" => "context", "content" => $promptContext] ], "temperature" => 0.5, "max_tokens" => -1, "stream" => false ]); $start = microtime(true); // ### Send Request //$ch = curl_init('http://localhost:11434/api/generate'); $ch = curl_init('http://localhost:1234/api/v0/chat/completions'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); $end = microtime(true); // ### Prepare Response //$responseText = isset($data['response']) ? $data['response'] : 'No answer from Deepseek!'; //$responseText = $data['choices'][0]['message']['content'] ?? 'No answer from Deepseek!'; $responseText = isset($data['choices'][0]['message']['content']) ? $data['choices'][0]['message']['content'] : ''; //$responseText = preg_replace('/.*?<\/think>/s', ' ', $responseText); $responseText = trim($responseText); echo json_encode([ 'reply' => $responseText, // 'misc' => $htmlContext, 'duration_seconds' => round($end - $start, 3) ]);