| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- <?php
- require_once 'CsvReader.php';
- set_time_limit(2500); // 2 Minuten erlauben
- header('Content-Type: application/json');
- // only accept POST requests
- if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
- http_response_code(405);
- echo json_encode(['error' => 'Only POST allowed']);
- exit;
- }
- 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" => ["</think>"]
- //]);
- //$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>.*?<\/think>/s', ' ', $responseText);
- $responseText = trim($responseText);
- echo json_encode([
- 'reply' => $responseText,
- // 'misc' => $htmlContext,
- 'duration_seconds' => round($end - $start, 3)
- ]);
|