🛠️ How-To: Knodge.eu Bridge für Obsidian Diese Anleitung beschreibt, wie du Obsidian als professionelles Interface für dein Knodge.eu Wissensportal einrichtest. Mit diesem Setup kannst du Notizen direkt hochladen und KI-Analysen (wie Experten-Reviews oder Zusammenfassungen) per Knopfdruck anfordern [cite: API.md]. 1. Vorbereitungen in Knodge.eu Bevor du Obsidian verbindest, müssen die API-Zugänge in Knodge.eu bereitstehen: API-Keys: Du benötigst zwei Keys aus deinem Portal-Dashboard: Chat API-Key: Für Abfragen und Analysen (api-chat). Upload API-Key: Ein Key mit Editor- oder Manager-Rechten für den Dokumenten-Upload. Portal-Slug: Das ist die Kennung deines Portals in der URL (z. B. mein-wissens-hub). Instruktionen: Stelle sicher, dass Dateien wie _instruction_expert.md oder _instruction_summary.md bereits in deinem Portal hochgeladen sind, damit die Keywords (#expert, #summary) funktionieren [cite: _instruction_expert.md, _instruction_summary.md]. 2. Einrichtung in Obsidian Wir nutzen das beliebte Plugin Templater, um das JavaScript-Script auszuführen. Schritt 1: Plugins installieren Öffne die Settings in Obsidian. Gehe zu Community Plugins und schalte den "Safe Mode" aus. Suche nach Templater und installiere/aktiviere es. Schritt 2: Das Script erstellen Erstelle eine neue Notiz (z. B. im Ordner Templates/Knodge-Bridge.md) und füge den folgenden Code ein: <%* /* Knodge.eu Unified Bridge / SCP-Konform (Upload & Chat) Angepasst auf Domain-Uploads und Agent-Messages. */ // KONFIGURATION const CHAT_API_KEY = "6393c04f..."; // Dein Chat-Key const UPLOAD_API_KEY = "cb7106f5..."; // Dein Upload-Key const DOMAIN_ID = "efdb0c9f..."; // Aus deiner API-Einstellung const PORTAL_SLUG = "faq"; // Dein Portal-Identifier const BASE_URL = "https://knodge.eu/api"; const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!activeView) { new Notice("Keine aktive Notiz gefunden."); return; } const content = activeView.editor.getValue(); const fileName = `${activeView.file.basename}.md`; // AUSWAHL-DIALOG const mode = await tp.system.suggester( ["📤 Dokument in Domain hochladen", "💬 KI-Agent anfragen (Messages)"], ["upload", "chat"] ); if (mode === "upload") { // 1. UPLOAD-LOGIK (Domain-basiert) const formData = new FormData(); const blob = new Blob([content], { type: 'text/markdown' }); formData.append('file', blob, fileName); new Notice("Upload in Domain läuft..."); try { const res = await fetch(`${BASE_URL}/domains/${DOMAIN_ID}/documents`, { method: "POST", headers: { "X-API-Key": UPLOAD_API_KEY // Header-Anforderung }, body: formData }); if (res.ok) new Notice("✅ Dokument erfolgreich in Domain gespeichert!"); else new Notice("❌ Fehler beim Upload."); } catch (e) { new Notice("❌ Netzwerkfehler beim Upload."); } } else if (mode === "chat") { // 2. CHAT-LOGIK (Agent-Messages Endpunkt) new Notice("KI-Agent wird angefragt..."); try { const res = await fetch(`${BASE_URL}/portal/${PORTAL_SLUG}/agent/messages`, { method: "POST", headers: { "Content-Type": "application/json", "X-API-Key": CHAT_API_KEY // }, body: JSON.stringify({ messages: [{ role: "user", content: content }], // SCP-konformer Body stream: false, // Streaming für Obsidian-Integration deaktiviert locale: "de" }) }); const data = await res.json(); // Annahme: Die Antwort kommt im Feld 'response' oder 'message' zurück const aiMessage = data.response || (data.messages && data.messages[0].content); if (aiMessage) { const insertion = `\n\n---\n### 🤖 Agent-Antwort\n${aiMessage}`; activeView.editor.replaceRange(insertion, { line: activeView.editor.lineCount(), ch: 0 }); new Notice("✅ Antwort empfangen."); } else { new Notice("❌ Keine gültige Antwort vom Agenten."); } } catch (e) { new Notice("❌ Fehler bei der Agenten-Anfrage."); } } %> 3. Nutzung im Alltag Notiz analysieren (#Keywords) Schreibe deine Gedanken in Obsidian. Wenn du eine spezifische Analyse möchtest, füge einfach ein Keyword ein: #expert: Für eine tiefgreifende technische Analyse [cite: _instruction_expert.md]. #summary: Um eine strukturierte Zusammenfassung zu erhalten [cite: _instruction_summary.md]. #quiz: Um Testfragen zu deinem Text zu generieren [cite: _instruction_quiz.md]. Drück