sessionRepo->findByUuid($uuid); if ($session === null) { return null; } $messages = $this->messageRepo->findBySessionId((int) $session['id']); $title = $session['title'] ?? 'Chat'; $date = date('d.m.Y H:i'); $model = $session['model'] ?? 'unbekannt'; $md = "# {$title}\n"; $md .= "*Exportiert am {$date}*\n"; $md .= "*Modell: {$model}*\n\n"; $md .= "---\n\n"; $questionNum = 0; foreach ($messages as $msg) { if ($msg['role'] === 'user') { $questionNum++; $md .= "## Frage {$questionNum}\n\n"; $md .= $msg['content'] . "\n\n"; } else { $md .= "## Antwort {$questionNum}\n\n"; $md .= $msg['content'] . "\n\n"; $sources = json_decode($msg['sources'] ?? '[]', true) ?: []; if (!empty($sources)) { $md .= "**Quellen:**\n"; foreach ($sources as $source) { $title = $source['title'] ?? 'Unbekannt'; $score = isset($source['score']) ? round($source['score'] * 100) . '%' : ''; $collection = isset($source['collection']) ? "[{$source['collection']}] " : ''; $md .= "- {$collection}{$title} ({$score})\n"; } $md .= "\n"; } $md .= "---\n\n"; } } return $md; } /** * Export session as JSON. * * @return array|null */ public function exportAsJson(string $uuid): ?array { $session = $this->sessionRepo->findByUuid($uuid); if ($session === null) { return null; } $messages = $this->messageRepo->findBySessionId((int) $session['id']); $exportMessages = []; foreach ($messages as $msg) { $exportMsg = [ 'role' => $msg['role'], 'content' => $msg['content'], 'created_at' => $msg['created_at'] ?? null, ]; if ($msg['role'] === 'assistant') { $sources = json_decode($msg['sources'] ?? '[]', true) ?: []; $exportMsg['sources'] = $sources; $exportMsg['tokens'] = [ 'input' => (int) ($msg['tokens_input'] ?? 0), 'output' => (int) ($msg['tokens_output'] ?? 0), ]; $exportMsg['model'] = $msg['model'] ?? null; } $exportMessages[] = $exportMsg; } return [ 'session' => [ 'uuid' => $session['uuid'], 'title' => $session['title'] ?? 'Chat', 'created_at' => $session['created_at'] ?? null, 'model' => $session['model'] ?? null, 'collections' => json_decode($session['collections'] ?? '[]', true), ], 'messages' => $exportMessages, 'exported_at' => date('c'), ]; } /** * Generate filename for export. */ public function generateFilename(string $uuid, string $format): string { $session = $this->sessionRepo->findByUuid($uuid); $title = $session['title'] ?? 'chat'; // Sanitize title for filename $title = preg_replace('/[^a-zA-Z0-9äöüÄÖÜß\-_\s]/u', '', $title); $title = preg_replace('/\s+/', '-', trim($title)); $title = mb_substr($title, 0, 50); if ($title === '') { $title = 'chat'; } $date = date('Y-m-d'); $ext = $format === 'json' ? 'json' : 'md'; return "chat-{$title}-{$date}.{$ext}"; } }