Dokumentation

Soul in Betrieb nehmen

Zwei getrennte Dinge: der Gedächtnis-Kernel 4.0.2, den du sofort installieren kannst, und der Proxy 4.1.0, der noch gebaut wird.

Inhalt

Quickstart — Soul 4.0.2

Ausgeliefert

4.0.2 ist auf npm veröffentlicht und läuft vollständig lokal. Kein Konto, kein API-Key, kein ausgehender Netzwerkverkehr. Voraussetzung ist Node.js ab Version 18.

1 — Installation

Ein Aufruf legt das Datenverzeichnis ~/.soul an. Bestehende Stände aus früheren Versionen werden dabei migriert; vor der Migration wird eine Sicherung geschrieben.

npx -y soul-mcp init

2 — Im MCP-Client einhängen

Soul spricht das Model Context Protocol über stdio. In Claude Code genügt ein Befehl:

claude mcp add soul -- npx -y soul-mcp

Andere MCP-Clients (Cursor, Windsurf, Zed) tragen den Server in ihrer Konfigurationsdatei ein:

{ "mcpServers": { "soul": { "command": "npx", "args": ["-y", "soul-mcp"] } } }

Nach dem Neustart des Clients meldet der Handshake [email protected] mit 23 Werkzeugen.

3 — Die Fünf-Minuten-Demo

Der Punkt von Soul lässt sich in vier Schritten zeigen. Entscheidend ist Schritt 2: die Session wird wirklich beendet, damit klar ist, dass die Erinnerung nicht aus dem Kontextfenster kommt.

Schritt 1 — etwas merken. In einer laufenden Session:

Session A
› Merk dir: Dieses Projekt nutzt pnpm, nicht npm.
soul_remember → gespeichert
source_type: user_statement
source_ref: "Dieses Projekt nutzt pnpm, nicht npm."
user_statement wird nur vergeben, wenn es eine tatsächliche Nutzeraussage gibt — mit Zitat. Eigene Schlussfolgerungen des Modells landen als agent_inference. Das ist der Unterschied, um den es geht.

Schritt 2 — Session schliessen. Fenster zu, Client beenden, neu starten. Kein geteilter Kontext.

Schritt 3 — in der neuen Session abrufen.

Session B — frisch gestartet
› Welchen Paketmanager nutzt dieses Projekt?
soul_recall → 1 Treffer
✓ pnpm — Quelle: user_statement, du selbst

Schritt 4 — den Verlauf ansehen. soul_timeline zeigt, wann welches Wissen dazukam und was es korrigiert hat.

npx soul-mcp status # Memories, Ledger-Länge, Integrität

Was die Demo zeigt und was nicht. Sie belegt, dass Wissen eine Session überlebt und seine Herkunft behält. Sie ist kein Nachweis, dass ein Modell dadurch bessere Antworten gibt — dafür braucht es einen kontrollierten Vergleich, und der ist für den Proxy noch nicht gefahren. Der Stand der Messungen steht auf der Nachweise-Seite.

Werkzeugreferenz

23 Werkzeuge, gruppiert nach Aufgabe.

WerkzeugGruppeZweck
soul_rememberGedächtnisFakt speichern, mit Herkunftsangabe
soul_recallGedächtnisNach gespeichertem Wissen suchen
soul_correctGedächtnisBestehenden Eintrag berichtigen
soul_confirmGedächtnisEintrag bestätigen, Konfidenz anheben
soul_resolveGedächtnisWiderspruch zwischen Einträgen entscheiden
soul_forgetGedächtnisEintrag zurückziehen (Ledger bleibt)
soul_contextKontextKapsel für die aktuelle Aufgabe abrufen
soul_about_meKontextWas das System über den Nutzer weiss
soul_identityKontextIdentitätsprofil lesen und pflegen
soul_timelineVerlaufChronologie der Wissensänderungen
soul_statusVerlaufZustand von Datenbank und Ledger
soul_exportVerlaufVollständigen Bestand exportieren
soul_importVerlaufBestand einspielen
soul_reflectVerlaufSitzung abschliessen, Erkenntnisse festhalten
soul_runLaufzeitAufgabe als nachvollziehbaren Run starten
soul_feedbackLaufzeitErgebnis eines Runs zurückmelden
soul_goalLaufzeitZiele setzen und verfolgen
soul_deliberateUrteilStrukturierte Abwägung einer Entscheidung
soul_commit_deliberationUrteilAbwägung als Entscheidung festschreiben
soul_predictUrteilVorhersage mit Konfidenz ablegen (Kalibrierung)
soul_mark_usefulUrteilEintrag als nützlich markieren
soul_workbenchWerkbankOffene Aufgaben an Modelle zuweisen
soul_review_queueWerkbankWas auf menschliche Prüfung wartet

CLI

npx soul-mcp init # ~/.soul anlegen oder migrieren npx soul-mcp status # Memories, Ledger, Integrität npx soul-mcp doctor # Selbstprüfung aller Komponenten npx soul-mcp semantic on # lokale semantische Suche (opt-in)

semantic on ist bewusst nicht voreingestellt: es lädt ein lokales Modell nach. Auch danach verlässt kein Datum den Rechner.

Wo die Daten liegen

PfadArtInhalt
~/.soul/memories.dbSQLite (WAL)Alle Einträge, Ledger, Runs, Episoden
~/.soul/constitution.jsonJSONRichtlinie — im Code durchgesetzt, nicht nur im Prompt

Die Richtlinie regelt, was gar nicht erst gespeichert wird: erkannte Secrets werden verworfen, es bleibt nur ein bereinigtes Ablehnungsereignis. Inhalte, die nach Prompt-Injection aussehen, werden isoliert und nie wieder ausgeliefert. Sensible Kategorien warten auf eine ausdrückliche Bestätigung.

Grenze, offen gesagt: Eine Kontext-Firewall kann prinzipiell nicht lückenlos sein. Die Regeln senken das Risiko, sie beseitigen es nicht. Wer damit hochsensible Daten verarbeitet, sollte das wissen.

API-Referenz — Soul 4.1.0 Proxy

Status: in Entwicklung

Dieser Dienst ist noch nicht erreichbar. Was hier steht, beschreibt die geplante Schnittstelle, damit eine Integration vorbereitet werden kann — es ist keine Beschreibung eines laufenden Systems. Details können sich bis zum Start noch ändern.

Es liegt für 4.1.0 auch keine Wirksamkeitsmessung vor. Der Vergleich gegen die Baseline ist präregistriert, aber nicht gefahren. Bis dahin steht hier keine Leistungszahl.

Was gemessen ist und was nicht, samt der bekannten Schwächen von 4.0.2, steht gesammelt auf der Startseite unter Nachweise.

Der Proxy ist OpenAI-kompatibel. Für bestehende Integrationen ändert sich nur der Base-URL — Anfrage- und Antwortformat bleiben, wie die SDKs sie erwarten. Dazwischen laufen Intent Analysis und Task Restructuring.

POST https://api.nextool.app/v1/chat/completions

Was dazwischen passiert

Der Proxy legt vor deine Anfrage eine Vorbereitungs-Runde. Im voreingestellten Modus setzt er dafür eine deterministisch zusammengebaute System-Nachricht an den Anfang der Nachrichtenliste — deine letzte Nutzer-Nachricht bleibt dabei Byte für Byte unverändert. Es wird also nichts umgeschrieben, was du geschrieben hast; das Modell bekommt zusätzlich eine Anleitung, wie es an die Aufgabe herangehen soll.

AMPLIFY_MODEModellaufrufVerhalten
implantneinVoreinstellung. System-Nachricht davor, Nutzer-Nachricht unverändert
implant-v10neinVergleichsarm für die Messung, gleiches Prinzip, anderer Rahmen
analyzerjaÄlterer Pfad: ersetzt die letzte Nutzer-Nachricht durch eine Vorlage
offneinReines Durchreichen, keine Vorbereitung
Zwei Eigenschaften, die uns wichtig sind

Fail-open. Geht beim Zusammenbauen irgendetwas schief, wird die Anfrage im Original weitergereicht statt abgebrochen. Ein Fehler im Amplifier soll dich nie einen Aufruf kosten.

Triviales bleibt unangetastet. Kurze, offensichtliche Anfragen erkennt der Proxy und lässt sie durch — eine Vorbereitungs-Runde für „wie spät ist es" wäre nur Ballast.

Ungemessen. Ob diese Vorbereitung die Ergebnisse messbar verbessert, ist offen. Der Vergleich gegen die Baseline (Benchmark B2) ist präregistriert und noch nicht gefahren. Bis das Ergebnis vorliegt, ist der Mechanismus eine begründete Annahme — kein belegter Vorteil, und hier steht keine Zahl dazu.

Authentifizierung

Über einen API-Key aus dem Dashboard, als Bearer-Token im Header:

Authorization: Bearer soul_live_xxxxxxxxxxxxxxxxxxxxxxxx

Der Schlüssel wird bei der Erstellung genau einmal im Klartext angezeigt; gespeichert wird nur ein Hash. Geht er verloren, wird ein neuer erzeugt — der alte lässt sich im Dashboard widerrufen und ist danach sofort ungültig.

Der Schlüssel gehört in eine Umgebungsvariable, nicht in Frontend-Code und nicht ins Repository. Wer ihn hat, kann Aufrufe auf dein Kontingent absetzen.

Eigener Upstream-Key (BYOK)

Es sind zwei getrennte Schlüssel im Spiel. Der Soul-Key im Authorization-Header weist dich gegenüber Soul aus. Zusätzlich kannst du optional deinen eigenen Modell-Key mitschicken — dann läuft der Aufruf über dein Konto beim Anbieter statt über den hinterlegten Standard-Key.

Authorization: Bearer soul_live_… # Zugang zu Soul X-Soul-Upstream-Key: sk-… # optional: dein Modell-Key

Der Wert aus X-Soul-Upstream-Key ersetzt den hinterlegten Standard-Key für genau diesen einen Aufruf. Er wird nicht gespeichert und nicht protokolliert. Antwortet der Anbieter mit einem Fehler, wird der verwendete Schlüssel aus dem Antworttext entfernt, bevor er dich erreicht — manche Anbieter spiegeln Schlüssel in Fehlermeldungen zurück.

Anbieter pro Anfrage wählen

Zusätzlich lässt sich der Anbieter je Anfrage bestimmen. Fehlt der Header, geht der Aufruf an den Upstream, den der Betrieb hinterlegt hat.

Authorization: Bearer soul_live_… X-Soul-Upstream-Key: sk-… # dein Key beim Anbieter X-Soul-Upstream-Base: https://openrouter.ai/api/v1 # Anbieter dieser Anfrage

Erlaubt sind ausschliesslich Adressen aus einer serverseitigen Liste. Steht der Wert nicht darin, antwortet der Proxy mit 400 und dem Fehlertyp upstream_base_not_allowed — und kontaktiert gar keinen Upstream. Voreingestellt sind fünf OpenAI-kompatible Anbieter:

https://api.openai.com/v1 https://openrouter.ai/api/v1 https://api.groq.com/openai/v1 https://api.mistral.ai/v1 https://api.deepseek.com/v1
Warum eine Liste und keine freie URL

Eine frei wählbare Adresse hiesse, dass ein Aufruf den Proxy dazu bringen kann, beliebige Ziele anzusprechen — auch interne. Dagegen stehen zwei Schichten: Beim Start weigert sich der Aufbau der Liste, private oder lokale Adressen aufzunehmen, selbst wenn sie versehentlich in der Konfiguration stehen. Bei der Anfrage wird der Header per exaktem Zeichenkettenvergleich geprüft — der Nutzerwert wird nicht als URL zerlegt.

Das schliesst die üblichen Parser-Tricks aus. Etwa https://[email protected]/v1: der tatsächliche Host ist evil.example, obwohl die Zeichenkette harmlos beginnt. Ohne Zerlegung gibt es schlicht keinen Treffer.

Beides lässt sich kombinieren: Wird eine erlaubte Alt-Adresse gewählt, geht der mitgeschickte Schlüssel an genau diesen Anbieter. Die Bereinigung von Fehlerantworten gilt auch dann — ein Anbieter, der den Schlüssel zurückspiegelt, erreicht dich nicht im Klartext.

Stand: Beides ist im Proxy implementiert und durch Tests abgedeckt — dass der mitgeschickte Schlüssel den Standard-Key ersetzt, dass eine erlaubte Alt-Adresse wirklich angesprochen wird, dass eine fremde oder interne Adresse mit 400 endet, ohne dass ein Upstream kontaktiert wird, und dass die Schlüssel-Bereinigung auch bei gewählter Alt-Adresse greift. Nutzbar ist das trotzdem erst, wenn der Dienst erreichbar ist — siehe das Banner oben.

Chat Completions

Anfrage (Feldnamen wie bei der OpenAI-API):

FeldTypBeschreibung
modelstringZielmodell, an das weitergereicht wird
messagesarrayNachrichtenverlauf mit role und content
streambooleanBei true Antwort als Server-Sent Events
temperaturenumberOptional, wird durchgereicht
max_tokensintegerOptional, wird durchgereicht

Mit dem offiziellen OpenAI-SDK genügt der geänderte Base-URL:

import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://api.nextool.app/v1", apiKey: process.env.SOUL_API_KEY, }); const res = await client.chat.completions.create({ model: "…", messages: [{ role: "user", content: "…" }], });

Streaming (SSE)

Mit "stream": true antwortet der Endpunkt als text/event-stream. Die Chunks haben die gewohnte Form, der Strom endet mit data: [DONE]:

data: {"id":"…","object":"chat.completion.chunk","choices":[{"delta":{"content":"Hal"}}]} data: {"id":"…","object":"chat.completion.chunk","choices":[{"delta":{"content":"lo"}}]} data: [DONE]

Die vorgelagerte Analyse geschieht, bevor der erste Chunk fliesst. Die Zeit bis zum ersten Token ist dadurch höher als bei einem direkten Aufruf — wie viel, wird der Benchmark zeigen. Eine Zahl dazu gibt es noch nicht.

Fehler und Limits

StatusBedeutungWas zu tun ist
400Bad RequestAnfrageformat prüfen. Beim Fehlertyp upstream_base_not_allowed stand ein nicht erlaubter Wert in X-Soul-Upstream-Base; die Antwort führt die zulässigen Adressen auf
401UnauthorizedSchlüssel fehlt, ist ungültig oder widerrufen
429Too Many RequestsRate-Limit oder Kontingent erreicht; mit exponentiellem Backoff wiederholen
5xxServerfehlerErneut versuchen; hält es an, ist es unser Problem

Die konkreten Grenzwerte für Rate-Limit und Kontingent stehen noch nicht fest. Sobald sie es tun, stehen sie hier — mit Zahlen, nicht mit Andeutungen.

Was schon jetzt geht

Ein Konto lässt sich bereits anlegen. Die Schlüsselverwaltung im Dashboard ist gebaut und zeigt offen an, dass die API noch nicht antwortet — sie täuscht keinen Schlüssel vor, der nirgends gültig wäre.