Warum WOS

Langzeitgedächtnis für KI-Agenten.

WOS ist eine Memory-API. Sie speichern die Erinnerungen eines Nutzers einmal, rufen dann zu jeder Abfrage nur die relevanten ab und übergeben sie an den Prompt Ihres Modells.

Der Abruf ist rein semantisch, ohne Keyword- oder BM25-Matching, daher ist die Recall-Qualität in allen Sprachen identisch. Jede Abfrage liefert einen kleinen, begrenzten Kontext zurück, unabhängig davon, wie viel Sie gespeichert haben, und über Ihre gespeicherten Erinnerungen läuft niemals ein Modell.

Kernoperationen

  • store - speichert eine Erinnerung für einen Nutzer.
  • recall - liefert die relevanten Erinnerungen zu einer Abfrage. Dies ist der zentrale Aufruf.
  • search - rohe semantische Suche über gespeicherte Erinnerungen.
  • supersede - aktualisiert oder ersetzt eine veraltete Erinnerung.
  • forget - löscht eine einzelne Erinnerung oder einen ganzen Nutzer (DSGVO).
Wählen Sie links einen Abschnitt für Details zu jedem Thema.
Modell

Drei Modelle, eine Linie.

WOS-Modelle sind danach benannt, wie Menschen im Lauf der Geschichte Wissen bewahrt haben - Tablet, Scroll, Codex. Steintafel, Schriftrolle, gebundenes Buch: Jedes leistet mehr für Ihren Agenten als das vorherige.

Tablet

Live
In Stein gemeißelt · store & recall

Eine schlanke, schnelle und kostengünstige Art, Erinnerungen einzuschreiben und abzurufen - das Fundament, auf dem jedes Modell aufbaut.

Scroll

Live
Entrollt · LLM-gestützter Abruf

Ergänzt ein Sprachmodell, das Ihre Frage genauer liest und einen vollständigeren Kontext zurückbringt - verstreute Belege kommen so wieder zusammen, statt dass ein Teil fehlt.

Codex

Demnächst
Gebunden & indexiert · selbststeuernd

Schlägt von selbst die richtige Seite auf - wählt in jedem Moment das passende Gedächtnis und die passenden Werkzeuge und wird mit jeder Nutzung schärfer.

Der vollständige Benchmark-Bericht zu Tablet 1 steht auf der Benchmark-Seite.

Kosten

Zahlen Sie uns $2. Sparen Sie ein Vielfaches davon bei Ihrem LLM.

WOS führt Ihrem LLM ~1.200 Tokens pro Abfrage zu - einen begrenzten, relevanten Ausschnitt - statt die gesamte Historie in jeden Prompt zu stopfen. Der Abstand ist enorm und wächst mit Ihrer Historie.

LLM-Kosten pro 1.000 Abfragen Basierend auf Tablet 1
Nutzerhistorie100K
Abfragen / Monat1,000
Ihr LLM
45× günstiger - Sie sparen $244/Monat
Ohne WOS$250.00
Mit WOS$5.50

Jeder für WOS ausgegebene $1 spart ~$98 beim LLM. Größere Historie oder ein teureres Modell → größerer ROI.

Woher die Einsparungen kommen

  • Ohne WOS packen Sie die gesamte Historie in jeden Prompt - 100K tokens × $2.50/1M = $0.25 pro Abfrage, zu GPT-4o-Eingabepreisen (bei Modellen der Opus-Klasse etwa das Doppelte).
  • Mit WOS nehmen Sie die Daten einmal auf ($2/1M); danach ist jede Abfrage ein winziger Abruf ($3/1M × 1,200) plus Ihr LLM auf nur ~1.200 Tokens.
  • Je weniger Tokens Ihr LLM liest, desto weniger zahlen Sie - und WOS hält diese Zahl konstant, während das Gedächtnis wächst.
Kontext-Verkleinerung = Historie ÷ zugeführte Tokens, nicht Kosten (der Rechner oben bepreist jeden Abruf).  25K → 21× · 100K → 83× · 200K → 167×.
Mehrsprachigkeit

Jede Sprache, dieselbe Genauigkeit.

Der Abruf ist rein semantisch - ausschließlich Embeddings, null Keyword- oder BM25-Matching. Die Recall-Qualität ist daher identisch, ob Ihre Nutzer auf 日本語, 中文, Español oder Englisch schreiben.

Lexikalisches Matching wie BM25 ist auf die Gestalt einer bestimmten Sprache abgestimmt - Morphologie, Leerzeichen, Schriftsystem. In einem mehrsprachigen Store heißt das: Die Abrufqualität variiert je nach Sprache. WOS verwendet überhaupt kein lexikalisches Matching, sodass jede Sprache denselben Weg nimmt.

Ein Store, drei Sprachen zugleich

Sie wählen keine Sprache pro Store - mischen Sie frei. Unten enthält das Gedächtnis eines Nutzers gleichzeitig Japanisch, Englisch und Spanisch, und jede Frage findet die richtige Erinnerung, unabhängig von der Sprache. Dies ist ein echter Austausch mit der Live-API:

# one user, three languages stored together
mem.add("彼女はコーヒーより紅茶が好き", user_id="alice")                      # Japanese
mem.add("she works at a design studio in Brooklyn", user_id="alice")       # English
mem.add("A ella le encanta hacer senderismo los sábados", user_id="alice")  # Spanish
Tatsächliche Ergebnisse - jede Frage wechselt in eine andere Sprache
"¿Qué bebe ella?"               -> 彼女はコーヒーより紅茶が好き
"what does she do on weekends?" -> A ella le encanta hacer senderismo los sábados
"彼女の仕事は?"                  -> she works at a design studio in Brooklyn

Kein Übersetzungsschritt, keine Spracherkennung, keine Konfiguration pro Sprache. Erinnerungen und Fragen werden nach Bedeutung eingeordnet, nicht nach Sprache - passt die Bedeutung, spielt die Sprache keine Rolle.

Drei Sprachen sind hier nur das, was auf eine Seite passt - es gibt keine Liste unterstützter Sprachen, auf der man stehen müsste. Derselbe Live-Test besteht auch mit Erinnerungen auf 中文, Русский und العربية, alle gegen die Produktions-API verifiziert.

Warum wir Keywords bewusst verbannt haben

Lexikalisches Scoring wie BM25 stärkt den Abruf für manche Sprachen mehr als für andere - hinderlich, wenn ein Store viele Sprachen enthält. Wir haben es daher vollständig aus der Engine entfernt und setzen diese Regel im Code-Review durch: Mit jeglichem lexikalischem Scoring im Pfad würde die Recall-Qualität je nach Sprache abweichen.

LongMemEval ist rein englischsprachig und misst daher keinen mehrsprachigen Recall. Die Demo oben zeigt, wie Sie ihn direkt gegen die Live-API verifizieren können.
Architektur

Kein Modell läuft über Ihre Erinnerungen.

Die Speicherung erfolgt wortgetreu, und die Engine sucht über Embeddings - günstig, schnell und deterministisch. Über Ihre gespeicherten Erinnerungen läuft niemals ein Modell. Tablet verwendet gar kein Modell; Scroll und Codex setzen für stärkere Ergebnisse eines um die Engine herum ein, doch es sieht immer nur Ihre Abfrage, nie das, was Sie gespeichert haben.

  • Deterministische Engine. Die Engine liefert für dieselbe Abfrage jedes Mal dieselben Erinnerungen - deshalb stammt die Varianz in unserem Benchmark allein vom Reader-Modell.
  • Günstig im großen Maßstab. Keine Generierungskosten beim Speichern oder Abrufen - Ihre Rechnung folgt dem Speicherplatz, nicht der Modellnutzung, während das Gedächtnis wächst.

Ihre Worte, unangetastet

Ein verbreitetes Design lässt beim Schreiben ein Sprachmodell laufen, um "Fakten" aus dem Text zu extrahieren und umzuschreiben. Dieses Design bezahlt dreifach: Generierungskosten bei jedem Schreibvorgang, zusätzliche Latenz und die Speicherung der Paraphrase eines Modells statt der ursprünglichen Worte. WOS trifft die entgegengesetzte Wahl - es speichert das Gesagte unverändert und lässt Ihr LLM die Interpretation zur Lesezeit übernehmen, mit dem Originaltext in der Hand.

Was WOS nicht ist: keine Vektor-Datenbank, die Sie betreiben müssen, und kein RAG-Framework, das Sie zusammenbauen müssen. Über Ihre gespeicherten Daten läuft niemals ein Modell - dieser Pfad besteht rein aus Embeddings. Scroll und Codex nutzen zwar ein Sprachmodell für stärkere Ergebnisse, doch es sieht immer nur Ihre Abfrage, nie Ihre gespeicherten Erinnerungen - und es trainiert niemals auf Ihren Daten oder sammelt sie.
Nachweis

90.7%, gemessen und reproduzierbar.

90.7% auf LongMemEval-S, gemittelt über 5 unabhängige Läufe (σ 0.5%, keiner handverlesen), bewertet vom kanonischen GPT-4o-Judge des Benchmarks.

Auf demselben Benchmark schwanken die Ergebnisse stark mit dem Bewertungsprotokoll - dem Judge, dem Prompt und dem, was die Abrufschicht tun darf. Wir verwenden den kanonischen GPT-4o-Judge des Benchmarks von dritter Seite wie veröffentlicht, passen nichts an den Test an und veröffentlichen den Bewertungscode und den Reader-Prompt, sodass jeder die 90.7% exakt reproduzieren kann.

Das Protokoll in einer Tabelle

PunktUnser Vorgehen
DatensatzLongMemEval-S (bereinigt), ~240K Tokens Historie pro Frage
JudgeDer kanonische GPT-4o-Judge des Benchmarks - eine dritte Partei, nicht wir
Läufe5 unabhängige Läufe, jeder Wert veröffentlicht, Mittelwert berichtet (σ 0.5%)
ReaderFestes Reader-Modell und fester Prompt, wortwörtlich veröffentlicht

Was es ehrlich hält: ein Judge von dritter Seite, der unverändert veröffentlichte Reader-Prompt, rein semantischer Abruf und die Veröffentlichung jedes Laufs - nicht nur des besten. Die Abruf-Engine ist deterministisch - führen Sie sie erneut aus, erhalten Sie dieselben Erinnerungen.

Wir erklimmen härtere Benchmarks

Wir testen auf dem härtesten Standard-Benchmark, den wir noch nicht bezwungen haben - und die Zahl ist die Bestmarke über alle WOS-Modelle hinweg, neu geschrieben, sobald ein besseres erscheint. Überschreiten wir klar 94%, steigen wir zu einem härteren Benchmark auf.

LongMemEval-SIn Arbeit
Tablet 185.2%
Scroll 190.7%
GPT-4o-Judge · Bestwert über alle WOS-Modelle94% zum Aufstieg
Vollständigen Bericht ansehen
Preise

Zwei Token-Preise pro Modell,
plus $0.0001 pro Anfrage.

Pro Million Tokens plus pauschal $0.0001 pro Anfrage, Bezahlung nach Verbrauch. Kein Abonnement, keine Speichermiete, keine Gedächtnisgrenzen. Sie zahlen, wenn Ihr Agent schreibt oder liest - nie für das, was er sich merkt.

ModellEingabe / 1MAusgabe / 1M
Tablet 1$2$3Live
Scroll 1$4$8Live
Codex 1--Noch offen
  • $0.0001 pro Anfrage. Eine Pauschalgebühr auf jeden API-Aufruf, zusätzlich zur Token-Nutzung.
  • Speicherung ist kostenlos. Die Aufnahme wird einmal bezahlt; das Aufbewahren kostet Sie nichts. Kein Mengenlimit, keine Aufbewahrungsgrenze.
  • Wir speichern es. Wir trainieren nie darauf, verwenden es nicht und sehen es nicht ein. Das Gedächtnis Ihres Agenten gehört Ihnen - wir organisieren es nur, damit Sie es abrufen können.
  • Warum Tablet so günstig ist: Seine Engine führt kein Modell aus, unsere Kosten sind also Embeddings und Festplatten - keine GPUs. Scroll und Codex ergänzen ein Modell, und genau das deckt ihr höherer Preis ab.
Andere Abrechnungsmodelle berechnen monatlich das gespeicherte Volumen oder deckeln die Anzahl der Erinnerungen je nach Tarif. WOS berechnet für gespeicherte Daten nichts, unabhängig von Volumen oder Alter.

Rate-Limits nach Nutzungsstufe →

Für Entwickler

Drei Aufrufe: Speichern, Abrufen, Antworten.

Eine API. Der Aufruf recall() liefert Kurzzeit-, Langzeit- und Umgebungskontext in einem einzigen Roundtrip - bereit zum Einfügen in Ihren Prompt.

1

Speichern

Speichern Sie Fakten und Gesprächszüge Ihres Nutzers mit add(). Beim Eingang eingebettet - kein LLM.

2

Abrufen

recall() liefert Kurzzeit + Langzeit + Kontext in einem Aufruf - ein begrenzter Kontext fester Größe.

3

Antworten

Übergeben Sie diesen begrenzten Kontext an Ihr LLM - beliebiger Anbieter, Ihr Schlüssel.

from wontopos import Client
mem = Client(api_key="wos-...")
mem.add("she prefers tea over coffee", user_id="alice")
# one call: short + long + context
ctx = mem.recall("what does alice drink?", user_id="alice")
Schnellstart

Ihr erster Recall in 5 Minuten.

Ein Schlüssel, eine Installationszeile, drei Aufrufe - und Ihr Agent hat ein Gedächtnis. Jedes Snippet auf dieser Seite wurde tatsächlich ausgeführt; die Antworten sind wortwörtlich wiedergegeben.

1

API-Schlüssel erstellen

Erstellen Sie einen in der Konsole. Ein 155 Zeichen langer Schlüssel, der mit wos-live- beginnt, wird einmal angezeigt. Bewahren Sie ihn in einer Umgebungsvariable auf - niemals im Code.

2

Installieren

pip install wontopos        # Python
npm install wontopos        # TypeScript / JavaScript
cargo add wontopos          # Rust
# curl - nothing to install, just set WOS_API_KEY
3

Store anlegen, dann speichern & abrufen

Ein Store ist die user_id, unter der Sie lesen und schreiben. Stores sind explizit: Legen Sie zuerst einen an (der Aufruf unten), dann speichern Sie hinein und rufen daraus ab. Speichern - beim Eingang eingebettet, kein LLM-Aufruf. Abrufen - Kurzzeit + Langzeit + Kontext in einem Roundtrip.

from wontopos import Client

mem = Client(api_key="wos-live-...", user_id="alice")  # set the store once
mem.create_store()              # create it (stores are explicit)
mem.add("she prefers tea over coffee")  # no user_id needed

# one call → short-term + long-term + context
ctx = mem.recall("what does alice drink?")
import { Client } from "wontopos";

const mem = new Client({ apiKey: "wos-live-...", userId: "alice" });  // set the store once
await mem.createStore();            // create it (stores are explicit)
await mem.add("she prefers tea over coffee");  // no userId needed

// one call → short-term + long-term + context
const ctx = await mem.recall("what does alice drink?");
use wontopos::Client;

let mem = Client::new("wos-live-...").with_user("alice");  // set the store once
mem.create_store(None).await?;            // create it (stores are explicit)
mem.add("she prefers tea over coffee", None, json!({})).await?;

// one call → short-term + long-term + context
let ctx = mem.recall("what does alice drink?", None).await?;
# create the store once - stores are explicit
curl -X POST https://api.wontopos.com/api/v1/memory/collection \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice"}'

# store - embedded on the way in, no LLM call
curl -X POST https://api.wontopos.com/api/v1/memory/store \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","content":"she prefers tea over coffee"}'

# one call → short-term + long-term + context
curl -X POST https://api.wontopos.com/api/v1/memory/recall \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","query":"what does alice drink?"}'
Tatsächliche Antwort - create_store()
{"user_id": "alice", "status": "created"}
Tatsächliche Antwort - add()
{"id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "stored (1 chunks)"}
Store einmal setzen. Übergeben Sie user_id an den Client, und jeder Aufruf verwendet sie - kein Wiederholen nötig; überschreiben Sie einen einzelnen Aufruf, indem Sie ihm user_id übergeben. Stores sind explizit: Das Speichern in einen oder Abrufen aus einem Store, der nicht existiert, liefert 404 - legen Sie ihn zuerst an. Jedes Konto startet mit einem default-Store, sodass der Pfad ganz ohne user_id ohne jede Einrichtung funktioniert. Siehe Stores zum Auflisten und Verwalten.

recall() liefert vier Blöcke - short_term (jüngste Gesprächszüge), long_term (relevante Erinnerungen), context (das Umfeld des besten Treffers) und eine instruction, die dem LLM sagt, wie es sie verwenden soll. Fügen Sie das Ganze in Ihren Prompt ein.

Funktioniert in jeder Sprache. Speichern Sie auf Englisch, fragen Sie auf Koreanisch, Japanisch oder Chinesisch - dieselbe Erinnerung kommt zurück. Embedding-Suche, kein Keyword-Matching.

Jede Methode, pro Sprache →

Stores

Stores - anlegen, auflisten, löschen.

Ein Store ist die user_id, unter der Sie lesen und schreiben - ein isolierter Gedächtnisraum pro Endnutzer, Agent oder Thema. Stores sind explizit: Legen Sie einen an, bevor Sie hineinspeichern oder daraus abrufen, sonst liefert der Aufruf 404. Jedes Konto startet mit einem default-Store, Sie können also ohne Create-Aufruf beginnen.

Wie die Isolation verschachtelt ist. Ein Konto besitzt Workspaces; jeder Workspace isoliert sein eigenes Gedächtnis, seine API-Schlüssel und seine Nutzung (die Abrechnung erfolgt gemeinsam auf Kontoebene). Ein Store liegt innerhalb eines Workspace: Schlüssel im selben Workspace teilen sich dessen Stores, und verschiedene Workspaces sehen niemals das Gedächtnis des jeweils anderen. account → workspace → store (user_id) → memories.
mem.create_store("alice")        # create (idempotent)
mem.list_stores()              # [{"user_id","created_at"}, ...]
mem.delete_store("alice")        # delete the store + all its memories
await mem.createStore("alice");
await mem.listStores();          // [{ user_id, created_at }, ...]
await mem.deleteStore("alice");     // store + all its memories
mem.create_store("alice").await?;
let stores = mem.list_stores().await?;
mem.delete_store("alice").await?;
# create
curl -X POST https://api.wontopos.com/api/v1/memory/collection \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" -d '{"user_id":"alice"}'
# list
curl https://api.wontopos.com/api/v1/memory/collections -H "X-API-Key: $WOS_API_KEY"
# delete (store + all its memories)
curl -X DELETE https://api.wontopos.com/api/v1/memory/collection \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" -d '{"user_id":"alice"}'
Tatsächliche Antwort - create
{ "user_id": "alice", "status": "created" }   // "exists" if it already did
Tatsächliche Antwort - list
{ "collections": [
  { "user_id": "default", "created_at": "2026-06-26T02:23:14Z" },
  { "user_id": "alice",   "created_at": "2026-06-26T02:24:01Z" }
], "count": 2 }
Recall auf einen Store, der nicht existiert
{ "error": { "type": "not_found_error",
  "message": "Store 'ghost' does not exist. Create it first with
              POST /api/v1/memory/collection {\"user_id\":\"ghost\"}, then store or recall." } }
Verwenden Sie einen Store pro Endnutzer ("alice", "user_42"), um die Erinnerungen jeder Person getrennt zu halten, oder einen einzelnen default-Store für einen persönlichen Agenten. Stores lassen sich auch in der Konsole anlegen und durchsehen (Memory ids → Issue), ganz ohne Code. Das Löschen eines Stores ist endgültig - es entfernt jede Erinnerung darin.
Python-SDK

Python - jede Methode, drei Gruppen.

Schreiben, Lesen, Löschen. Jedes Beispiel unten wurde am 2026-06-10 gegen die Live-API ausgeführt; die Antworten sind wortwörtlich wiedergegeben.

pip install wontopos
from wontopos import Client

mem = Client(api_key="wos-live-...")  # or read from an env var

Modell wählen

Der API-Schlüssel bestimmt, welches Gedächtnis (Ihr Konto); das Modell bestimmt, welche Engine es liest. Alle Modelle teilen sich ein Gedächtnis, Sie können also mit einem speichern und mit einem anderen abrufen. Setzen Sie einen Standard am Client; überschreiben Sie einen einzelnen Aufruf, indem Sie ihm model= übergeben.

mem = Client(api_key="wos-live-...", model="tablet-1")  # default engine
mem.recall("...", user_id="alice")                  # tablet-1
mem.recall("...", user_id="alice", model="tablet-1")  # or pick a model per call

list_models ✓ live-tested

Der Katalog - die IDs, die Sie an model übergeben können, und ob sie jeweils live sind. Modelle mit memory: "shared" lesen denselben Store; "isolated" führt einen eigenen. Benötigt keinen API-Schlüssel.

mem.list_models()
Tatsächliche Antwort
[{"id": "tablet-1", "name": "Tablet 1", "available": true, "memory": "shared"}]

Der Katalog oben spiegelt stets die aktuell verfügbaren Modelle wider - übergeben Sie eine andere ID, erhalten Sie einen klaren Fehler. Neue Modelle erscheinen dort automatisch, sobald sie ausgeliefert werden.

Schreiben

add ✓ live-tested

Eine Erinnerung speichern. Beim Eingang eingebettet - kein LLM-Aufruf, Sie zahlen nur Embeddings.

mem.add("she prefers tea over coffee", user_id="alice")
Tatsächliche Antwort
{"id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "stored (1 chunks)"}

add_turn ✓ live-tested

Einen Gesprächszug (Nutzer + Assistent) zugleich ins Kurzzeit- und Langzeitgedächtnis speichern.

mem.add_turn("alice", "hi", "hello!")
Tatsächliche Antwort
{"status": "ok"}

add_bulk ✓ live-tested

Einen großen Textblock nachladen. Serverseitig zerlegt und eingebettet - ideal zum Import bestehender Historie.

mem.add_bulk("Alice moved to Brooklyn in March. She works at a design studio downtown.", user_id="alice")
Tatsächliche Antwort
{"elapsed_secs": 0.154154944, "status": "ok", "stored": 1, "total_chunks": 1}

update ✓ live-tested

Ein Fakt hat sich geändert. Die alte Erinnerung wird als ersetzt markiert (für die Historie behalten); die neue nimmt ihren Platz im Recall ein.

mem.update("alice", old_memory_id="576700aa-...", new_content="she switched to coffee this year")
Tatsächliche Antwort
{"new_memory_id": "07e94433-b7cc-4e49-8d8f-f37fc1a392b7",
 "old_memory_id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "superseded"}

Lesen

search ✓ live-tested

Semantische Suche, das Relevanteste zuerst. Reines Embedding - kein Keyword-Matching, jede Sprache findet also jede Erinnerung. Das SDK gibt das memories-Array direkt zurück; der rohe HTTP-Body ist unten abgebildet.

r = mem.search("what does she drink?", user_id="alice", limit=1)
Tatsächliche Antwort (HTTP-Body)
{"memories": [{
   "id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624",
   "content": "she prefers tea over coffee",
   "category": "general",
   "time_bucket": "2026-06",
   "importance": 0.3,
   "similarity": 0.6316057443618774,
   "is_superseded": false,
   "superseded_by": null,
   "created_at": "2026-06-10T04:20:39.688276876Z"
 }], "search_ms": 315, "total_found": 1}
FeldBedeutung
similarityRohe Embedding-Ähnlichkeit zu Ihrer Abfrage (0–1).
is_supersededTrue, wenn dieser Fakt durch update() ersetzt wurde.
search_msServerseitige Abrufzeit.

recall ✓ live-tested

Ein Roundtrip liefert alles, was Ihr LLM braucht - fügen Sie das Ergebnis direkt in Ihren Prompt ein: ein begrenzter Kontext fester Größe, egal wie viel Sie gespeichert haben.

ctx = mem.recall("what does she drink?", user_id="alice")
Tatsächliche Antwort (Struktur - Listen gekürzt)
{"short_term":  {"count": 2, "turns": [{"role": "user", "content": "hi", ...}]},
 "long_term":   {"count": 4, "memories": [{"content": "she prefers tea over coffee",
                                           "similarity": 0.63, ...}]},
 "context":     {"count": 4, "around_top_memory": [
                  "[match] she prefers tea over coffee",
                  "[after] Alice moved to Brooklyn in March. ..."]},
 "instruction": "Use short_term for recent context, long_term for relevant
                 past memories, context for surrounding conversation of the
                 most relevant memory."}

history ✓ live-tested

Jüngste Gesprächszüge (Kurzzeitgedächtnis), älteste zuerst.

turns = mem.history("alice")
Tatsächliche Antwort (HTTP-Body)
{"count": 2, "turns": [
   {"role": "user",      "content": "hi",     "timestamp": "2026-06-10T04:20:40.989011337Z"},
   {"role": "assistant", "content": "hello!", "timestamp": "2026-06-10T04:20:40.989013416Z"}
 ], "user_id": "alice"}

stats ✓ live-tested

Anzahl der Erinnerungen für einen Nutzer.

mem.stats("alice")
Tatsächliche Antwort
{"short_term_turns": 2, "total_memories": 4, "user_id": "alice"}

Löschen

delete ✓ live-tested

Eine einzelne Erinnerung per ID löschen.

mem.delete("alice", memory_id="576700aa-...")
Tatsächliche Antwort
{"memory_id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "deleted"}

delete_all ✓ live-tested

Alles für einen Nutzer löschen - ein Aufruf, DSGVO-bereit.

mem.delete_all("alice")
Tatsächliche Antwort
{"memories_deleted": 4, "status": "deleted", "user_id": "alice"}
TypeScript-SDK

TypeScript - jede Methode, drei Gruppen.

Schreiben, Lesen, Löschen. Jedes Beispiel unten wurde am 2026-06-10 gegen die Live-API ausgeführt; die Antworten sind wortwörtlich wiedergegeben.

npm install wontopos
import { Client } from "wontopos";

const mem = new Client({ apiKey: "wos-live-..." });

Modell wählen

Der API-Schlüssel bestimmt, welches Gedächtnis (Ihr Konto); das Modell bestimmt, welche Engine es liest. Alle Modelle teilen sich ein Gedächtnis, Sie können also mit einem speichern und mit einem anderen abrufen. Setzen Sie einen Standard im Konstruktor; überschreiben Sie einen einzelnen Aufruf mit withModel().

const mem = new Client({ apiKey: "wos-live-...", model: "tablet-1" });  // default
mem.recall("...", "alice");                          // tablet-1
mem.withModel("tablet-1").recall("...", "alice");  // or pick a model per call

listModels ✓ live-tested

Der Katalog - die IDs, die Sie an model übergeben können, und ob sie jeweils live sind. Modelle mit memory: "shared" lesen denselben Store; "isolated" führt einen eigenen. Benötigt keinen API-Schlüssel.

await mem.listModels();
Tatsächliche Antwort
[{"id": "tablet-1", "name": "Tablet 1", "available": true, "memory": "shared"}]

Der Katalog oben spiegelt stets die aktuell verfügbaren Modelle wider - übergeben Sie eine andere ID, erhalten Sie einen klaren Fehler. Neue Modelle erscheinen dort automatisch, sobald sie ausgeliefert werden.

Schreiben

add ✓ live-tested

Eine Erinnerung speichern. Beim Eingang eingebettet - kein LLM-Aufruf, Sie zahlen nur Embeddings.

await mem.add("she prefers tea over coffee", "alice");
Tatsächliche Antwort
{"id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "stored (1 chunks)"}

addTurn ✓ live-tested

Einen Gesprächszug (Nutzer + Assistent) zugleich ins Kurzzeit- und Langzeitgedächtnis speichern.

await mem.addTurn("alice", "hi", "hello!");
Tatsächliche Antwort
{"status": "ok"}

addBulk ✓ live-tested

Einen großen Textblock nachladen. Serverseitig zerlegt und eingebettet - ideal zum Import bestehender Historie.

await mem.addBulk("Alice moved to Brooklyn in March. She works at a design studio downtown.", "alice");
Tatsächliche Antwort
{"elapsed_secs": 0.154154944, "status": "ok", "stored": 1, "total_chunks": 1}

update ✓ live-tested

Ein Fakt hat sich geändert. Die alte Erinnerung wird als ersetzt markiert (für die Historie behalten); die neue nimmt ihren Platz im Recall ein.

await mem.update("alice", "576700aa-...", "she switched to coffee this year");
Tatsächliche Antwort
{"new_memory_id": "07e94433-b7cc-4e49-8d8f-f37fc1a392b7",
 "old_memory_id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "superseded"}

Lesen

search ✓ live-tested

Semantische Suche, das Relevanteste zuerst. Reines Embedding - kein Keyword-Matching, jede Sprache findet also jede Erinnerung. Das SDK gibt das memories-Array direkt zurück; der rohe HTTP-Body ist unten abgebildet.

const r = await mem.search("what does she drink?", "alice", 1);
Tatsächliche Antwort (HTTP-Body)
{"memories": [{
   "id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624",
   "content": "she prefers tea over coffee",
   "category": "general",
   "time_bucket": "2026-06",
   "importance": 0.3,
   "similarity": 0.6316057443618774,
   "is_superseded": false,
   "superseded_by": null,
   "created_at": "2026-06-10T04:20:39.688276876Z"
 }], "search_ms": 315, "total_found": 1}
FeldBedeutung
similarityRohe Embedding-Ähnlichkeit zu Ihrer Abfrage (0–1).
is_supersededTrue, wenn dieser Fakt durch update() ersetzt wurde.
search_msServerseitige Abrufzeit.

recall ✓ live-tested

Ein Roundtrip liefert alles, was Ihr LLM braucht - fügen Sie das Ergebnis direkt in Ihren Prompt ein: ein begrenzter Kontext fester Größe, egal wie viel Sie gespeichert haben.

const ctx = await mem.recall("what does she drink?", "alice");
Tatsächliche Antwort (Struktur - Listen gekürzt)
{"short_term":  {"count": 2, "turns": [{"role": "user", "content": "hi", ...}]},
 "long_term":   {"count": 4, "memories": [{"content": "she prefers tea over coffee",
                                           "similarity": 0.63, ...}]},
 "context":     {"count": 4, "around_top_memory": [
                  "[match] she prefers tea over coffee",
                  "[after] Alice moved to Brooklyn in March. ..."]},
 "instruction": "Use short_term for recent context, long_term for relevant
                 past memories, context for surrounding conversation of the
                 most relevant memory."}

history ✓ live-tested

Jüngste Gesprächszüge (Kurzzeitgedächtnis), älteste zuerst.

const turns = await mem.history("alice");
Tatsächliche Antwort (HTTP-Body)
{"count": 2, "turns": [
   {"role": "user",      "content": "hi",     "timestamp": "2026-06-10T04:20:40.989011337Z"},
   {"role": "assistant", "content": "hello!", "timestamp": "2026-06-10T04:20:40.989013416Z"}
 ], "user_id": "alice"}

stats ✓ live-tested

Anzahl der Erinnerungen für einen Nutzer.

await mem.stats("alice");
Tatsächliche Antwort
{"short_term_turns": 2, "total_memories": 4, "user_id": "alice"}

Löschen

delete ✓ live-tested

Eine einzelne Erinnerung per ID löschen.

await mem.delete("alice", "576700aa-...");
Tatsächliche Antwort
{"memory_id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "deleted"}

deleteAll ✓ live-tested

Alles für einen Nutzer löschen - ein Aufruf, DSGVO-bereit.

await mem.deleteAll("alice");
Tatsächliche Antwort
{"memories_deleted": 4, "status": "deleted", "user_id": "alice"}
Rust-SDK

Rust - jede Methode, drei Gruppen.

Schreiben, Lesen, Löschen. Jedes Beispiel unten wurde am 2026-06-10 gegen die Live-API ausgeführt; die Antworten sind wortwörtlich wiedergegeben.

cargo add wontopos
use wontopos::Client;

let mem = Client::new("wos-live-...");

Modell wählen

Der API-Schlüssel bestimmt, welches Gedächtnis (Ihr Konto); das Modell bestimmt, welche Engine es liest. Alle Modelle teilen sich ein Gedächtnis, Sie können also mit einem speichern und mit einem anderen abrufen. Setzen Sie einen Standard mit with_model(); verketten Sie es erneut, um einen einzelnen Aufruf zu überschreiben.

let mem = Client::new("wos-live-...").with_model("tablet-1");  // default
mem.recall("...", "alice").await?;                       // tablet-1
mem.with_model("tablet-1").recall("...", "alice").await?;  // or pick a model per call

list_models ✓ live-tested

Der Katalog - die IDs, die Sie an with_model übergeben können, und ob sie jeweils live sind. Modelle mit memory: "shared" lesen denselben Store; "isolated" führt einen eigenen. Benötigt keinen API-Schlüssel.

mem.list_models().await?;
Tatsächliche Antwort
[{"id": "tablet-1", "name": "Tablet 1", "available": true, "memory": "shared"}]

Der Katalog oben spiegelt stets die aktuell verfügbaren Modelle wider - übergeben Sie eine andere ID, erhalten Sie einen klaren Fehler. Neue Modelle erscheinen dort automatisch, sobald sie ausgeliefert werden.

Schreiben

add ✓ live-tested

Eine Erinnerung speichern. Beim Eingang eingebettet - kein LLM-Aufruf, Sie zahlen nur Embeddings.

mem.add("she prefers tea over coffee", "alice", json!({})).await?;
Tatsächliche Antwort
{"id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "stored (1 chunks)"}

add_turn ✓ live-tested

Einen Gesprächszug (Nutzer + Assistent) zugleich ins Kurzzeit- und Langzeitgedächtnis speichern.

mem.add_turn("alice", "hi", "hello!").await?;
Tatsächliche Antwort
{"status": "ok"}

add_bulk ✓ live-tested

Einen großen Textblock nachladen. Serverseitig zerlegt und eingebettet - ideal zum Import bestehender Historie.

mem.add_bulk("Alice moved to Brooklyn in March...", "alice", "general").await?;
Tatsächliche Antwort
{"elapsed_secs": 0.154154944, "status": "ok", "stored": 1, "total_chunks": 1}

update ✓ live-tested

Ein Fakt hat sich geändert. Die alte Erinnerung wird als ersetzt markiert (für die Historie behalten); die neue nimmt ihren Platz im Recall ein.

mem.update("alice", "576700aa-...", "she switched to coffee this year").await?;
Tatsächliche Antwort
{"new_memory_id": "07e94433-b7cc-4e49-8d8f-f37fc1a392b7",
 "old_memory_id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "superseded"}

Lesen

search ✓ live-tested

Semantische Suche, das Relevanteste zuerst. Reines Embedding - kein Keyword-Matching, jede Sprache findet also jede Erinnerung. Das SDK gibt das memories-Array direkt zurück; der rohe HTTP-Body ist unten abgebildet.

let r = mem.search("what does she drink?", "alice", 1).await?;
Tatsächliche Antwort (HTTP-Body)
{"memories": [{
   "id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624",
   "content": "she prefers tea over coffee",
   "category": "general",
   "time_bucket": "2026-06",
   "importance": 0.3,
   "similarity": 0.6316057443618774,
   "is_superseded": false,
   "superseded_by": null,
   "created_at": "2026-06-10T04:20:39.688276876Z"
 }], "search_ms": 315, "total_found": 1}
FeldBedeutung
similarityRohe Embedding-Ähnlichkeit zu Ihrer Abfrage (0–1).
is_supersededTrue, wenn dieser Fakt durch update() ersetzt wurde.
search_msServerseitige Abrufzeit.

recall ✓ live-tested

Ein Roundtrip liefert alles, was Ihr LLM braucht - fügen Sie das Ergebnis direkt in Ihren Prompt ein: ein begrenzter Kontext fester Größe, egal wie viel Sie gespeichert haben.

let ctx = mem.recall("what does she drink?", "alice").await?;
Tatsächliche Antwort (Struktur - Listen gekürzt)
{"short_term":  {"count": 2, "turns": [{"role": "user", "content": "hi", ...}]},
 "long_term":   {"count": 4, "memories": [{"content": "she prefers tea over coffee",
                                           "similarity": 0.63, ...}]},
 "context":     {"count": 4, "around_top_memory": [
                  "[match] she prefers tea over coffee",
                  "[after] Alice moved to Brooklyn in March. ..."]},
 "instruction": "Use short_term for recent context, long_term for relevant
                 past memories, context for surrounding conversation of the
                 most relevant memory."}

history ✓ live-tested

Jüngste Gesprächszüge (Kurzzeitgedächtnis), älteste zuerst.

let turns = mem.history("alice").await?;
Tatsächliche Antwort (HTTP-Body)
{"count": 2, "turns": [
   {"role": "user",      "content": "hi",     "timestamp": "2026-06-10T04:20:40.989011337Z"},
   {"role": "assistant", "content": "hello!", "timestamp": "2026-06-10T04:20:40.989013416Z"}
 ], "user_id": "alice"}

stats ✓ live-tested

Anzahl der Erinnerungen für einen Nutzer.

mem.stats("alice").await?;
Tatsächliche Antwort
{"short_term_turns": 2, "total_memories": 4, "user_id": "alice"}

Löschen

delete ✓ live-tested

Eine einzelne Erinnerung per ID löschen.

mem.delete("alice", "576700aa-...").await?;
Tatsächliche Antwort
{"memory_id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "deleted"}

delete_all ✓ live-tested

Alles für einen Nutzer löschen - ein Aufruf, DSGVO-bereit.

mem.delete_all("alice").await?;
Tatsächliche Antwort
{"memories_deleted": 4, "status": "deleted", "user_id": "alice"}
curl

curl - keine Installation, dieselben Methoden.

Kein SDK zu installieren - jeder HTTP-Client funktioniert. Setzen Sie Ihren Schlüssel einmal und rufen Sie dieselben Endpunkte auf, die die SDKs kapseln. Basis-URL https://api.wontopos.com, Authentifizierung über X-API-Key, JSON rein und raus.

# set your key once (never hard-code it)
export WOS_API_KEY="wos-live-..."

Schreiben

store ✓ live-tested

Eine Erinnerung speichern. Beim Eingang eingebettet - kein LLM-Aufruf.

curl -X POST https://api.wontopos.com/api/v1/memory/store \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","content":"she prefers tea over coffee"}'
Tatsächliche Antwort
{"id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "stored (1 chunks)"}

store-turn ✓ live-tested

Einen Gesprächszug (Nutzer + Assistent) zugleich ins Kurzzeit- und Langzeitgedächtnis speichern.

curl -X POST https://api.wontopos.com/api/v1/memory/store-turn \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","user_msg":"hi","assistant_msg":"hello!"}'
Tatsächliche Antwort
{"status": "ok"}

supersede ✓ live-tested

Ein Fakt hat sich geändert - die alte Erinnerung wird als ersetzt markiert, die neue nimmt ihren Platz im Recall ein.

curl -X POST https://api.wontopos.com/api/v1/memory/supersede \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","old_memory_id":"576700aa-...","new_content":"she switched to coffee this year"}'
Tatsächliche Antwort
{"new_memory_id": "07e94433-...", "old_memory_id": "576700aa-...", "status": "superseded"}

Lesen

search ✓ live-tested

Semantische Suche, das Relevanteste zuerst. Reines Embedding - jede Sprache findet jede Erinnerung.

curl -X POST https://api.wontopos.com/api/v1/memory/search \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","query":"what does she drink?","max_results":1}'
Tatsächliche Antwort
{"memories": [{"id": "576700aa-...", "content": "she prefers tea over coffee",
   "similarity": 0.63, "is_superseded": false}], "search_ms": 315, "total_found": 1}

recall ✓ live-tested

Ein Roundtrip liefert Kurzzeit + Langzeit + Kontext + eine Instruktion. Fügen Sie es direkt in Ihren Prompt ein.

curl -X POST https://api.wontopos.com/api/v1/memory/recall \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","query":"what does she drink?"}'
Tatsächliche Antwort (Struktur)
{"short_term": {"count": 2, "turns": [...]},
 "long_term":  {"count": 4, "memories": [{"content": "she prefers tea over coffee", "similarity": 0.63}]},
 "context":    {"count": 4, "around_top_memory": ["[match] she prefers tea over coffee"]},
 "instruction": "Use short_term for recent context, long_term for relevant past memories..."}

Löschen

forget ✓ live-tested

Eine Erinnerung per ID löschen - oder die ID weglassen, um alles für einen Nutzer zu löschen (DSGVO).

curl -X POST https://api.wontopos.com/api/v1/memory/forget \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice"}'  # omit memory_id = delete all
Tatsächliche Antwort
{"memories_deleted": 1, "status": "deleted", "user_id": "alice"}

Jeder Endpunkt + Body-Felder →

Engramme

Engrams

Aufrufbare Recall-Werkzeuge, die Ihr Modell einsetzen kann - jedes eine eigene Abrufstrategie über dasselbe Gedächtnis. Nutzen Sie eines oder führen Sie mehrere zugleich aus.

Demnächst verfügbar. Die allgemeinen Engramme unten sind Abruf-Pipelines ohne LLM und laufen daher auf jeder Stufe ab Tablet 1. Die API bedient heute store und recall, diese Aufrufe sind also noch nicht live. Memoir und Archive, ein separater Modellmodus, werden weiter unten in einem eigenen Abschnitt behandelt.

Regelmäßig erscheinen weitere Engramme - diese Liste wächst.

Memoir & Archive Demnächst verfügbar

Dies ist ein Modell-Modus, kein aufrufbares Werkzeug. Wählen Sie ihn am Modell, und jeder Recall, eine einfache Suche eingeschlossen, kommt mit entsprechend geschriebener Zeit zurück. Demnächst verfügbar.

Alle Engramme Engramme

Time_awareness Demnächst verfügbar

Ein Modellmodus, keine Option pro Aufruf. Wählen Sie das Modell - Time_awareness-memoir oder Time_awareness-archive - und jeder Recall kommt entsprechend gerendert zurück: eine einfache Suche, ein Recall oder jedes Engramm, ohne zusätzlichen Parameter. Ein Memoir liest sich, wie ein Mensch sich erinnert; ein Archive führt ein exaktes Protokoll - der Unterschied zeigt sich am deutlichsten darin, wie beide die Zeit schreiben. Das Präfix Time_awareness- lässt Raum für weitere Fähigkeiten.

Memoir

Time_awareness-memoir
Erinnert wie ein Mensch · eine Erzählung

Erzählt, was geschah und wie ein Moment zum nächsten führte, mit dem weichen Zeitgefühl menschlicher Erinnerung - liest sich als Erlebnis, nicht als Liste.

Archive

Time_awareness-archive
Geführt als Protokoll · präzise Zeit

Liefert Treffer als exakte Datensätze - präzise verstrichene Zeit und absolute Anker, so strukturiert, dass ein Modell sie direkt ablesen kann.

Es rendert Erinnerungen, die Sie bereits gespeichert haben - es erzeugt keine. Jede Erinnerung ist ein store-/add-Aufruf unter einer user_id (diese user_id ist der Store dieser Person). Zuerst speichern; danach kommt jeder Recall - die einfache Suche unten eingeschlossen - mit Zeitmarkierung zurück. Siehe Schnellstart zum Speichern.
# plain search - no engram - on a memoir model
r = mem.search("what does Alice drink?", user_id="alice", model="Time_awareness-memoir", tz=9)
# every hit gets a .time field → "a couple weeks ago"  (archive model → "2 weeks ago (Jun 09)")
// plain search - no engram - on a memoir model
const r = await mem.withModel("Time_awareness-memoir").search("what does Alice drink?", "alice", 10, { tz: 9 });
// model picks the mode; tz over HTTP via the X-WOS-Timezone header
let r = mem.with_model("Time_awareness-memoir").search("what does Alice drink?", "alice", 10).await?;
curl -X POST https://api.wontopos.com/api/v1/memory/search \
  -H "X-API-Key: wos-live-..." -H "X-WOS-Model: Time_awareness-memoir" -H "X-WOS-Timezone: 9" \
  -d '{"user_id":"alice","query":"what does Alice drink?"}'
# each memory comes back with a "time" field; use Time_awareness-archive for exact time

tz ist der UTC-Versatz des Aufrufers in Stunden - damit "heute Morgen" und die 4-Uhr-Tagesgrenze in dessen Ortszeit landen. Weglassen für UTC; über HTTP ist es der X-WOS-Timezone-Header. Grob nach Region: US-Ostküste -5, US-Zentral -6, US-Westküste -8 · UK / Lissabon 0 · Mitteleuropa +1 · Osteuropa +2 · Indien +5.5 · China / Singapur +8 · Korea / Japan +9 · Sydney +10. (Normalzeit - die Sommerzeit verschiebt manche Regionen um +1; übergeben Sie, was für Ihre Nutzer tatsächlich gilt.)

Dieselbe Suche, zwei Modelle - die Erinnerungen sind identisch, nur time ändert sich:

Ergebnis · Time_awareness-memoir
{ "count": 3, "memories": [
  { "content": "Alice prefers tea over coffee", "time": "a couple weeks ago" },
  { "content": "met Alice at the cafe downtown",  "time": "yesterday afternoon" },
  { "content": "Alice moved to Brooklyn",          "time": "about half a year ago" }
] }
Ergebnis · Time_awareness-archive
{ "count": 3, "memories": [
  { "content": "Alice prefers tea over coffee", "time": "2 weeks ago (Jun 09)" },
  { "content": "met Alice at the cafe downtown",  "time": "yesterday at 14:00" },
  { "content": "Alice moved to Brooklyn",          "time": "6 months ago (Dec 2025)" }
] }
VerstrichenMemoirArchive
3 Min.a few minutes ago3 minutes ago
14 Min.about 15 minutes ago14 minutes ago
30 Min.half an hour ago30 minutes ago
50 Min.about an hour ago50 minutes ago
2 Std.a couple hours ago2 hours ago, at 13:10
8 Std.this morning8 hours ago, at 07:10
gestern Nachm.yesterday afternoonyesterday at 14:00
letzte Nachtlast night17 hours ago, at 22:00
2 Tagea couple days ago2 days ago (Tue 15:10)
6 Tageseveral days ago6 days ago (Fri 15:10)
9 Tageabout a week agolast week (Jun 16)
16 Tagea couple weeks ago2 weeks ago (Jun 09)
35 Tageabout a month agolast month (May 21)
60 Tagea couple months ago2 months ago (Apr 2026)
180 Tageabout half a year ago6 months ago (Dec 2025)
380 Tageabout a year agolast year (Jun 2025)
800 Tagea couple years ago2 years ago (Apr 2024)
1500 Tageabout 4 years ago4 years ago (May 2022)

Jeder Wert oben ist die tatsächliche Ausgabe des Renderers. Betrachten Sie die beiden "gestern"-Zeilen: Ein Memoir trennt den Nachmittag von der letzten Nacht - ein Tag ist ein Schlaf - während ein Archive eine einzelne Uhrzeit schreibt und keine Tag-Nacht-Grenze zieht.

Wie jeder Modus die Zeit liest

Memoir - so, wie Menschen es tatsächlich sagen. Jüngste Momente bleiben recht scharf (etwa 15 Minuten, eine halbe Stunde), dann weitet sich die Formulierung, je weiter man zurückgeht - ein paar Wochen, etwa ein halbes Jahr, ein paar Jahre - so, wie sich Erinnerung selbst mit der Entfernung lockert. Innerhalb eines Tages weicht die Uhr einem Orientierungspunkt: heute Morgen, letzte Nacht, gestern Nachmittag. Und ein Tag ist ein Schlaf, kein Kalendersprung: Die Grenze liegt bei etwa 4 Uhr Ortszeit, sodass eine späte Nacht noch als derselbe Abend gilt, nicht schon als morgen.

Archive - präzise, stets mit Anker. Jede Zeile trägt die exakte verstrichene Zeit plus eine absolute Referenz, mit der ein Modell rechnen kann, und der Anker wird enger, je näher es rückt: eine Uhrzeit für heute (vor 8 Stunden, um 07:10), Wochentag und Uhrzeit für diese Woche (vor 2 Tagen (Di 15:10)), ein Datum für diesen Monat (letzte Woche (16. Jun)), Monat und Jahr darüber hinaus (vor 6 Monaten (Dez 2025)). Nie vage, nie falsch.

Memoir und Archive sind ein Modellmodus, der auf jeden Recall wirkt - eine einfache Suche, ein Recall oder ein Engramm - keine Option pro Aufruf. Die Modellstufe (Tablet → Scroll → Codex) bestimmt, wie viel die Engine leistet; der Modus (memoir / archive) bestimmt, wie sie die Zeit schreibt. Demnächst verfügbar.
Alle Engramme Engramme

deep_recall

Multi-Hop-Recall. Sucht nach Ihrer Abfrage, nimmt dann den besten Treffer und sucht erneut nach dessen Inhalt - und holt so verknüpften Kontext ein, den eine einzelne Suche übersehen würde. Am stärksten, wenn Erinnerungen aufeinander verweisen (eine Person → ihre Projekte → Details). Liefert bis zu ~12.

out = mem.engram("deep_recall", "what should I know about Alice?", user_id="alice")
const out = await mem.engram("deep_recall", "what should I know about Alice?", "alice");
let out = mem.engram("deep_recall", "what should I know about Alice?", "alice").await?;
curl -X POST https://api.wontopos.com/api/v1/engram/run \
  -H "X-API-Key: wos-live-..." -H "Content-Type: application/json" \
  -d '{"name":"deep_recall","user_id":"alice","query":"what should I know about Alice?"}'
Antwort
{ "engram": "deep_recall", "hops": 2, "count": 12,
  "memories": [ ... ],
  "usage": { "input_tokens": 5, "output_tokens": 61 } }
Abgerechnet nach Tokens - jeder Aufruf liefert usage (Eingabe + Ausgabe), gezählt mit demselben Tokenizer wie der Rest der API; keine versteckte Gebühr pro Engramm. Mehrere zugleich nötig? Rufen Sie sie parallel auf - jedes Engramm ist eine unabhängige Anfrage.
Alle Engramme Engramme

timeline

Zeitlich geordneter Recall. Liefert Erinnerungen neueste zuerst, sortiert nach dem Zeitpunkt des Ereignisses, nicht nach Relevanz. Für "Wann war X", Verlauf und Reihenfolgefragen. Liefert bis zu 15.

events = mem.engram("timeline", "project milestones", user_id="alice")
const events = await mem.engram("timeline", "project milestones", "alice");
let events = mem.engram("timeline", "project milestones", "alice").await?;
curl -X POST https://api.wontopos.com/api/v1/engram/run \
  -H "X-API-Key: wos-live-..." -H "Content-Type: application/json" \
  -d '{"name":"timeline","user_id":"alice","query":"project milestones"}'
Antwort
{ "engram": "timeline", "hops": 1, "count": 15,
  "memories": [ ... ],
  "usage": { "input_tokens": 4, "output_tokens": 88 } }
Abgerechnet nach Tokens - jeder Aufruf liefert usage (Eingabe + Ausgabe), gezählt mit demselben Tokenizer wie der Rest der API; keine versteckte Gebühr pro Engramm. Mehrere zugleich nötig? Rufen Sie sie parallel auf - jedes Engramm ist eine unabhängige Anfrage.
Alle Engramme Engramme

gather

Breites Sammeln. Sucht und erweitert dann um die besten drei Treffer herum - ein weiteres Netz als deep_recall. Damit holen Sie alles zu einer Person, einem Projekt oder einem Thema in einem Aufruf ein. Liefert bis zu ~18.

related = mem.engram("gather", "everything about Project Atlas", user_id="alice")
const related = await mem.engram("gather", "everything about Project Atlas", "alice");
let related = mem.engram("gather", "everything about Project Atlas", "alice").await?;
curl -X POST https://api.wontopos.com/api/v1/engram/run \
  -H "X-API-Key: wos-live-..." -H "Content-Type: application/json" \
  -d '{"name":"gather","user_id":"alice","query":"everything about Project Atlas"}'
Antwort
{ "engram": "gather", "hops": 4, "count": 18,
  "memories": [ ... ],
  "usage": { "input_tokens": 6, "output_tokens": 142 } }
Abgerechnet nach Tokens - jeder Aufruf liefert usage (Eingabe + Ausgabe), gezählt mit demselben Tokenizer wie der Rest der API; keine versteckte Gebühr pro Engramm. Mehrere zugleich nötig? Rufen Sie sie parallel auf - jedes Engramm ist eine unabhängige Anfrage.
HTTP-API

Jeder Endpunkt, eine Basis-URL.

Kein SDK erforderlich - jeder HTTP-Client funktioniert. Basis-URL https://api.wontopos.com, Authentifizierung über den X-API-Key-Header, JSON rein und raus. Memory-Operationen sind POST; die Verwaltung von Stores nutzt POST / GET / DELETE auf /collection. Ein Store muss zuerst existieren (siehe Stores), sonst liefern Operationen im Store 404.

EndpunktZweckBody-Felder
POST /api/v1/memory/collectionStore anlegenuser_id
GET /api/v1/memory/collectionsIhre Stores auflisten(keine)
DELETE /api/v1/memory/collectionStore + seine Erinnerungen löschenuser_id
/api/v1/memory/storeeine Erinnerung speichernuser_id · content · metadata?
/api/v1/memory/store-turneinen Gesprächszug speichernuser_id · user_msg · assistant_msg
/api/v1/memory/bulk-storeeinen Textblock nachladenuser_id · content · category?
/api/v1/memory/searchsemantische Sucheuser_id · query · max_results?
/api/v1/memory/recallKurzzeit + Langzeit + Kontextuser_id · query
/api/v1/memory/historyjüngste Gesprächszügeuser_id
/api/v1/memory/statsAnzahl der Erinnerungenuser_id
/api/v1/memory/supersedeeinen geänderten Fakt ersetzenuser_id · old_memory_id · new_content
/api/v1/memory/forgeteine (oder alle) löschenuser_id · memory_id? (weglassen = alle löschen)
# create the store once (stores are explicit)
curl -X POST https://api.wontopos.com/api/v1/memory/collection \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice"}'

# store a memory
curl -X POST https://api.wontopos.com/api/v1/memory/store \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","content":"she prefers tea over coffee"}'

# recall - one call, ready for your prompt
curl -X POST https://api.wontopos.com/api/v1/memory/recall \
  -H "X-API-Key: $WOS_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","query":"what does alice drink?"}'
Tatsächliche Antwort - store
{"id": "576700aa-f0e0-4c26-99a0-10e2d5b0d624", "status": "stored (1 chunks)"}
Nutzungsstufen

Dieselben Funktionen für alle.
Stufen erhöhen nur Ihre Limits.

Jede Stufe nutzt die vollständige Engine - dieselbe Recall-Qualität, dieselben Sprachen, jede Methode. Die Stufen steigen automatisch bis Stufe 5, während Ihre kumulierten Guthabenkäufe wachsen - ohne Antrag oder Vertriebsgespräch. Enterprise (Stufe 6) ist die einzige Ausnahme.

Ausgabenlimits

Jede Stufe begrenzt, wie viel Sie pro Kalendermonat ausgeben können. Sie steigen sofort auf, sobald Ihre kumulierten Guthabenkäufe die nächste Schwelle erreichen.

NutzungsstufeGuthabenkaufMonatliches Ausgabenlimit
Tier 1$5$100
Tier 2$40$500
Tier 3$200$1,000
Tier 4$400$5,000
Tier 5$1,000$25,000
Tier 6 - EnterpriseSprechen Sie mit unsKein Limit

Rate-Limits

Rate-Limits gelten pro Konto - alle API-Schlüssel eines Kontos teilen sich ein Limit, das mit Ihrer Stufe skaliert. Bei Überschreitung kommt ein 429 mit einem retry-after-Header zurück; warten Sie gestaffelt (1s → 2s → 4s) und versuchen Sie es erneut. Jeder Endpunkt ist idempotenzfreundlich, Wiederholungen sind also sicher.

StufeAnfragen pro Minute
Tier 1150
Tier 2300
Tier 3600
Tier 41,500
Tier 53,000
Tier 6 - EnterpriseIndividuell

Enterprise (Stufe 6) erhält individuelle Rate-Limits, ein SLA, dedizierten Support und optional eine Self-Host-Lizenz - sprechen Sie mit uns.

Die Preise sind nutzungsbasiert: Tokens plus pauschal $0.0001 pro Anfrage. Tablet kostet $2 pro 1M Eingabe-Tokens, $3 pro 1M Ausgabe-Tokens. Speicherung ist kostenlos und ohne Obergrenzen. Siehe warum wir so bepreisen.
Fehler & Limits

Wenn etwas schiefgeht.

Fehler kommen als JSON-Umschlag zurück, mit einem stabilen type, einer menschenlesbaren Meldung und einer request_id, die Sie uns bei der Meldung eines Problems mitschicken können.

Tatsächliche Antwort - ungültiger Schlüssel (HTTP 401)
{"type": "error", "error": {
   "type": "authentication_error",
   "message": "Invalid or revoked API key.",
   "request_id": "063f8b83-eee2-4383-a5cf-11e4bcd29d7c"
 }}
HTTPBedeutungWas zu tun ist
401Ungültiger oder widerrufener API-SchlüsselPrüfen Sie den Schlüssel; stellen Sie in der Konsole einen neuen aus.
422Fehlerhafter Body (fehlendes Feld oder falscher Typ)Die Meldung nennt das genaue Feld - korrigieren und erneut versuchen.
429Rate-Limit erreichtExponentiell warten (1s → 2s → 4s) und erneut versuchen. Sicher: Alle Endpunkte sind idempotenzfreundlich.
5xxServerseitiges ProblemMit Backoff erneut versuchen; geben Sie die request_id an, wenn Sie uns kontaktieren.
# SDK error handling (Python)
from wontopos import Client, WosError

try:
    mem.search("...", user_id="alice")
except WosError as e:
    if e.status == 401: ...  # bad key
    elif e.status == 429: ...  # back off and retry
Schlüsselsicherheit. Ihr Schlüssel wird bei der Erstellung einmal angezeigt und bei uns nur als Hash gespeichert. Bewahren Sie ihn in einer Umgebungsvariable auf; falls er durchsickert, widerrufen Sie ihn in der Konsole - der Widerruf wirkt sofort.

Rate-Limits gelten pro Konto, geteilt über alle Ihre Schlüssel, und skalieren mit Ihrer Stufe - siehe Nutzungsstufen. Die Nutzung Ihres Kontos sehen Sie in der Konsole.

Self-Hosting

Ihre Server, Ihre Daten.

Die Engine kann in Ihrer eigenen Infrastruktur laufen - dieselbe API, dieselben SDKs. Richten Sie den Client auf Ihren Host, und sonst ändert sich nichts.

mem = Client(api_key="...", base_url="https://wos.your-host.com")
const mem = new Client({ apiKey: "...", baseUrl: "https://wos.your-host.com" });
let mem = Client::with_base_url("...", "https://wos.your-host.com");
  • Datenresidenz. Erinnerungen verlassen Ihr Netzwerk nie.
  • Dieselbe Oberfläche. Dieselben Methoden und Endpunkte funktionieren identisch.
  • Lizenzierung. Self-Host-Pakete werden pro Deployment vereinbart - kontaktieren Sie uns.
Skalierung

Jenseits des Kontextfensters.

WOS ruft aus Historien von 1.4M Tokens ab - weit größer als jedes LLM-Kontextfenster - und liefert dennoch einen kompakten Ausschnitt von ~1.470 Tokens zurück.

Das Gedächtnis Ihres Agenten ist nicht dadurch begrenzt, was in einen Prompt passt. Es behält alles und ruft nur das Wesentliche ab, egal wie groß die Historie wird.

Datenschutz

Privat, und Ihr Eigentum.

Ihre Daten bleiben in Ihrem Store. Wir trainieren nie darauf, sehen sie nicht ein und verwenden sie nicht weiter - wir organisieren sie nur, damit Sie sie abrufen können.

  • BYOK. Ihr LLM-Schlüssel wird pro Anfrage gesendet und nie gespeichert.
  • Isoliert. Erinnerungen sind pro Konto und darin pro user_id abgegrenzt.
  • DSGVO-Löschung & Self-Hosting. Ein Aufruf löscht einen Nutzer vollständig; auf Wunsch betreiben Sie die Engine in Ihrer eigenen Umgebung.