Skip to main content
Glama

AWHM Lite

CI

Externes Langzeitgedächtnis für LLM-Agenten. Keine Cloud, keine API-Schlüssel, läuft vollständig lokal.

AWHM Lite verleiht jedem LLM über Gespräche hinweg ein persistentes Gedächtnis – durch Append-only-Logging, regexbasiertes Muster-Matching, einen widerspruchsbewussten Gedächtnisgraph, symbolische Konsolidierung (ohne ein einzigen LLM-Aufruf) und Abruf mittels lexikalischer + semantischer Merkmalsfusion.

Status: Forschungsprototyp. Entwickelt im Februar 2026, veröffentlicht im August 2026; v0.2.0 hat es gehärtet, v0.3.0 hat Hooks, Stufe 2, Entitätsauflösung, Zeitreise, SQLite-Speicherung und die Auswertung auf einem realen Korpus ergänzt. 145 Tests, CI auf Python 3.11 bis 3.13.

Projektdokumentation

  • docs/awhm-whitepaper.md: das vollständige AWHM-Architekturpapier, von dem dieses Projekt eine Teilmenge ist

  • docs/awhm-whitepaper-vs-lite.md: was Lite behält und was es weglässt

  • docs/Future Plans.md: der geplante nächste Schritt (eine stille Middleware, die in jeder Gesprächsrunde unauffällig mitläuft)

Related MCP server: claude-memory-mcp

Wie das entstanden ist

Die Architektur und die Ideen dahinter stammen von mir. Der Code wurde vollständig von KI-Coding-Agenten (hauptsächlich Claude Code) unter meiner Leitung geschrieben: Ich habe das Design festgelegt, die Aufgaben abgegrenzt, die Ergebnisse geprüft und die Richtung vorgegeben. Das Whitepaper ist auf demselben Weg entstanden.

INTERACTION TIME                        OFFLINE (SESSION END)
────────────────────                    ─────────────────────
┌──────────────────┐   real-time log    ┌──────────────────────┐
│  PRIMARY AGENT   │──────────────────► │  STAGE 1 CONSOLIDATION│
│  (user-facing)   │   (middleware,     │  (symbolic only,      │
└──────┬───────────┘    no LLM)         │   zero LLM calls)     │
       │                                └──────────┬───────────┘
       │ queries                                   │ writes
       ▼                                           ▼
┌──────────────┐    ┌──────────┐    ┌──────────────────────┐
│  RETRIEVAL   │◄───│ SESSION  │    │    FLAT MEMORY GRAPH  │
│  ENGINE      │    │ BUFFER   │    │                      │
│              │◄───┤(checked  │    │  nodes: episodic,    │
│ BM25 +       │    │ first)   │    │  semantic, procedural│
│ embedding    │    └──────────┘    │                      │
│ similarity   │◄───────────────────│  edges: typed        │
│              │                    │  strength: rec + freq│
└──────────────┘                    └──────────────────────┘
       ▲
       │ fallback (first ~10 sessions)
┌──────┴───────┐
│   RAW LOGS   │
│ (append-only)│
└──────────────┘

Installation

# Core (numpy, spaCy, dateparser) plus the sentence-transformers embedding model
pip install -e ".[embeddings]"

# spaCy NER model (used in consolidation; without it, entity extraction is skipped)
python -m spacy download en_core_web_sm

# Claude Code MCP integration
pip install -e ".[mcp]"

# Optional: Anthropic SDK client for Stage 2 (the default Stage 2 client is
# the Claude Code CLI and needs nothing extra)
pip install -e ".[anthropic]"

sentence-transformers ist optional, weil es PyTorch nach sich zieht. Ohne diese Bibliothek Sessions einfach mit use_mock_embeddings=True starten (deterministische Hash-basierte Vektoren, völlig ausreichend für Tests und um die CLI auszuprobieren). Das echte Modell (all-MiniLM-L6-v2, 22 MB) wird bei der ersten Verwendung heruntergeladen.

Schnellstart

Python-API

from awhm import AWHMSession
from awhm.types import Role

# Start a session (also usable as a context manager: `with AWHMSession.start_session() as session:`)
session = AWHMSession.start_session()

# Log messages
session.log_message(Role.USER, "My name is Alice")
session.log_message(Role.ASSISTANT, "Hello Alice!")
session.log_message(Role.USER, "I prefer Python over JavaScript")
session.log_message(Role.USER, "The API endpoint is https://api.example.com/v2")

# Query memory (works immediately via session buffer)
results = session.query("What language does the user prefer?")
for r in results:
    print(f"[{r.source}] {r.content}")

# Consolidate into long-term memory graph
session.consolidate_current()

# End session (flushes WAL, saves graph)
session.end_session()

Integration mit einem LLM

AWHM sitzt als Middleware. Es selbst ruft kein LLM auf – Sie betten es in ein, was auch immer Sie verwenden:

from awhm import AWHMSession
from awhm.types import Role

session = AWHMSession.start_session()

def handle_message(user_text):
    session.log_message(Role.USER, user_text)

    # Retrieve relevant memories
    memories = session.query(user_text, k=5)
    memory_context = "\n".join(f"- {m.content}" for m in memories)

    # Inject into system prompt
    system = f"Memories from past conversations:\n{memory_context}"
    response = your_llm_call(system_prompt=system, user_message=user_text)

    session.log_message(Role.ASSISTANT, response)
    return response

# At end of conversation:
session.consolidate_current()
session.end_session()

CLI

awhm status                        # Show system stats
awhm query "Python preferences"    # Search memory
awhm query "API endpoint" --include-history --trace
awhm consolidate                   # Run Stage 1 on pending sessions
awhm snapshot create               # Backup current graph
awhm snapshot list                 # List snapshots
awhm snapshot restore --path FILE  # Restore from snapshot
awhm delete NODE_ID                # Hard-delete a node (privacy)
awhm eval --json                   # Run built-in benchmark report

Claude-Code-Integration (Hooks, empfohlen)

Mit Hooks funktioniert das Gedächtnis in jeder Runde, ohne dass das Modell ein Tool aufrufen müsse. Jeder Hook ist ein eigener kurzlebiger Prozess: der Session-Puffer wird zwischen den Hooks aus seinem Write-Ahead-Log wiederhergestellt.

Ereignis

Befehl

Was passiert

UserPromptSubmit

awhm hook prompt

Protokolliert den Prompt, ruft die relevantesten Erinnerungen ab (BM25 + Puffer; mit --semantic zusätzlich auch Einbettungen) und liefert sie als versteckten Kontext

Stop

awhm hook stop

Protokolliert die Antwort des Assistenten

SessionEnd

awhm hook session-end

Konsolidiert die Session in den Graph (mit --stage2 bzw. AWHM_STAGE2=1 läuft zusätzlich Stufe 2 über claude -p)

awhm hook settings          # prints the block to merge into ~/.claude/settings.json

Hooks blockieren niemals eine Session: Jeder Fehler wird nach stderr geschrieben und der Prozess endet mit Exit-Code 0. Mit AWHM_DATA_DIR lässt sich festlegen, wo die Erinnerungen leben.

Claude-Code-Integration (MCP)

AWHM Lite wird auch als MCP-Server ausgeliefert, sodass Claude Code es als ein Tool verwenden kann.

Einrichten

# Install with MCP support
cd awhm-lite
pip install -e ".[mcp]"

# Register with Claude Code
claude mcp add --transport stdio awhm-lite -- awhm-mcp

Oder manuell in .claude/settings.json hinzufügen:

{
  "mcpServers": {
    "awhm-lite": {
      "type": "stdio",
      "command": "awhm-mcp",
      "env": {
        "AWHM_DATA_DIR": "~/.awhm"
      }
    }
  }
}

Verfügbare MCP-Tools

Tool

Beschreibung

memory_query

Durchsucht das Gedächtnis per natürlichsprachlicher Query (include, with_tracing optional)

memory_log

Protokolliert eine Nachricht im einem abstrakten Unterhaltungslog (conversation log)

memory_consolidate

Extrahiert Erinnerungen aus ausstehenden Sessions in die Graphstruktur

memory_status

Zeigt Anzahl der Knoten, Kunstnummern der Kanten, Session, Anzahl

memory_snapshot_create

Erstellt sich ein Backup-Snapshot

memory_delete_node

Löscht einen Knoten endgültig + bereinigt Treffer in passenden Snapshot-Daten

Sobald verbunden, hat Claude Code automatisch Zugriff auf diese Werkzeuge und kann Erinnerungen über Gespräche hinweg abfragen und ablegen.

So funktioniert es

Rohdaten des Protokolls

Jede Nachricht wird zu einer JSONL-Datei hinzugefügt (einer Avocado pro Session). Append-only, außer bei endgültigen Löschungen aus Datenschutzgründen nie verändert Änderungen. Das ist die Erdung der Wahrheit.

Session-Puffer

Ein regex-basiertes Muster verwendet wird in Echtzeit auf jede Benutzernachricht und identifiziert folgende Muster:

  • Korrekturen: „Also eigentlich ist X doch das Y“, „nein, es ist X“

  • Präferenzen: „Ich bevorzuge X“, „immer X nehmen“, „nie X“

  • Tierarten: „der Endpunkt ist X“, „Ich heiße X“

  • Ergebnisse:: „das hat funktioniert“, „das ist fehlgeschlagen“

Es fängt ca. 60–70 % des expliziten Signals ab – und das ohne LLM-Aufruf. Der Puffer wird beim Abruf zuerst geprüft und liefert so eine Sofortkontinuität innerhalb der Session. Beim normalen Abruf werden diejenigen Puffer-Einträge verborgen, die eine spätere Aussage überholt (gleicher Slot oder eine explizite Korrektur ein paar Nachrichten später). Korrekturen gewinnen also. Persistiert wird per Write-Ahead-Prot per Session (Flush-Intervall 30 Sekunden, wenn sich nichts geändert hat).

Memory-Graph

Ein flacher gerichteter Graph mit drei Knotenarten (episodisch, semantisch, prozedural) und drei Kantenarten (temporal, Abstraktion, Assoziation).

Jeder Knoten hat zusätzlich Metadaten zum Widerspruchslebenszyklus:

  • kanonischer_schlüssel (eine identity à la Slot, z.B. fact:meine bevorzugte Sprache)

  • Status (active, superseded, retracted – also aktiv, ersetzt, zurückgezogen)

  • supersedes (ältere Knoten-IDs, die von dem Knoten

  • valid_from / valid_to (gültig ab / gültig bis)

  • Konfidenz

Gespeichert als JSON, in den Speicher geladen.

Abwärtskompatibilität: Ältere Tweet-Dateien (die weitere Felder enthalten) werden beim Start automatisch migriert.

Stärke-Scoring (Likely)

Jeder Knoten hat einem zusammengesetzten Stärke-Rating (strength):

S(v) = 0.4 * recency + 0.6 * frequency

Aktualität nutzt Rekurrenz: s_rec = (1 + 0.1 * hours)^(-0.3) – also grob 0.71 nach 24 Stunden, 0.40 nach 7 Ihr 0.27 nach 30 Tagen days. Die Häufigkeit ist die Zugriffswertellung gegen das 90. Perzentil.

Konsolidierung (Stufe 1)

Am Ende einer Session ablaufen, null LLM-Aufrufe:

  1. NER durchgeführt suis spaCy: Personen, Organisationen, Orte, Produkte. Heißt manuell mit CARDINAL (Zahlen), MONEY (Geldbeträge), DATE (Datumsangaben) ... und Ähnlichem – die hat zuvor nur Rauschen erzeugt. Dies konfigurierbar über ner_labels.

  2. Zeitliche Parser (Temporal parsing) via ", Resolve gesternoder5. März` in ISO-Zeitstempel

  3. Regelbasierte Extraktion: dieselben Regex-Muster wie beim bloßen Session-Puffer, über die neuen Nachrichten

  4. Entity Linking: Entitäten werden mit vorhandenen Knoten abgeglichen (ein Kosinus-Matrixmultiplikation plus Der Ganze + Verkettungs-Typ muss stimmen ÜberStringbasierte Sicherheitsprüfung)

  5. Deduplizierung: identische Aussagen innerhalb eines Batches werden zusammengefasst; – Duplikate (Kosinus-Schwelle größer > 0.92) stärken den bestehenden Knoten, statt neue zu erschaffen.

  6. Commit: Kanonische-Kennt gemacht, widersprechende frühere Erinnerungen werden ersetzt, Kanten und Knoten, Stärke-stronghold.

Widersprüche: Die kanonischen Notierungen

Ein kanonischer Schlüssel canonical_key bestimmt den Slot, den gelesene Aussage ausfüllt. Zwei aktive Erinnerungen, den gleichen Slot beanspruchen, widersprechen sich. Die neuere ersetzt dann die ältere (status=superseded, valid_to gesetzt, supersedes-Verknüpfung von dem neuen Knoten).

Aussage

Schlüssel

„Meine bevorzugte Sprache ist Python“

fact:my preferred language

„Ich lebe in Kapstadt“

fact:i live in

„Ich bevorzugte Dunkelhell“

preference:dark

„Nie Tabulators zur Einrückung“

policy:use:tabs

„Ich nutze Python für Powershell“

(keiner – additiv / "none (additively)")

Die Zugänge, bewusst konservativ weil kein LLM ur Intention:

  • Gleicher Schlüssel: führt immer – der Slot wird mit dem neuen bevorzugten Wert belegt.

  • Gleiche Familie (Sprache-Beleidigungen): „Präferenz-/Politik“-Familie : Nur eine explizierte Korrektur (z.B. „Ich bevorzuge eigentlich Rust“,) über die vorherige Aussage derselben Familie schreiben, sofernn dies in correction_window_messages (Default 3, d.h. innerhalb der nächsten drei Nachrichten Nachfahren) dieser Session geschieht. Ohne solche Korrekturmarker bleiben Präferenzen additiv: „Tabs sind okay“ und „Dark“ Mode bitte – beide erhalten Sichtbarkeit zugleich.

  • Faktenfamilie– gehört: Hier überschwemmt nur ein Multiple je Schlüssel (exactMatch). Eine Korrektur an einem API-Endpunkt überschreibt also nie und nicht den Namen.

  • Etwas anderes zunächst kein Slider zu – es wird kein Key, also neue / validücke Ergänzung.

Entitys (benannte Objekte)

Benannte Unterteilungen werden immer zu einem Knoten aufgelöst, egal wie sie geschrieben sind. Oberflächen treten normalisiert (case, Possessiv-Endungen und gezielte Firmenzusatz-Schreibweisen, Domains: z.B. "Acme Holdings Limited" und "acme.com" -> zu-normalisierten „acme" ), werden verglichen (exact alias, eindeutige Wichtungsfamilie–ault; also wenn "Acme" im Namen k. "Acme Holdings"), und zuletzt über eine disambiguierung durch Einbettungshingesehen entsprechen same Entity type sind Type. Jede Entgegenahme wird als zusätz loader, und jede Aussage erhält Be-attention edges zu den genanntenTopic – so wandert das Retrieval von „ece“ zu allem, was über besagte Entität weiß.

Stufe 2 (optional LLM-Refinement / ohne api-Keys)

Stufe 1 ist eine strikte Begrenzung: Sie fängt ab „Ich bevorzuge Rust“, aber sie sieht weiter, wenn klein durch „machen wir eben Rust,“ mL: also “Stufe 2” – das Angebot eines LLM (offline), das retro&sich die Erinnerungen vorschlägt, die die Regeln gefunden haben. LLM: nur dabei … Jeder Vorschlag wird in der Engine validiert(Format, zitiert, Nachrichtensexistieren?, hebt. Untergrenze`), aussortiert werdeniss das grep ohne Erinnerung– und Präzedenz-Was: ganz durch “V”-Die Retrie-Funktion bleibt die of ours.

Das default client – ruft die Claude-Code-Befehlszeile auf (claude -p mit strukturierter Ausgabe) – nutzt also Ihr bestehendes Login und speichert logically kein key eine Stelle. Die Ausführung als signal do, sodass Memory-Hooks innerhalb nicht zusätzlaufen.

awhm consolidate --stage2                    # Claude Code CLI, default model
awhm consolidate --stage2 --stage2-model sonnet
from awhm import AWHMSession, AWHMConfig

config = AWHMConfig(stage2_enabled=True, stage2_model="sonnet")
with AWHMSession.start_session(config) as session:   # builds ClaudeCodeClient
    ...
    session.consolidate_current()

Jedes Objekt mit einer complete_json(system, user, schema) -> str als Client funktioniert (llm_client=...). Eine zusätzliche Client für Anthropic-SDK ist ebenso enthalten für alle, die API-Rechnung bevorzugen (stage2_client="anthropic", extra Zusatz [anthropic]).

Suche (Retrieval)

Kein LLM-Awake. Feature-basierte Fusion:

  1. Puffer-Check: Zuerst in den Puffer ť; Suchtreffer treffen ( instand, über Rank-Graph).

  2. Variantenfestlegung: BM25-Summenüber und sowie-Similarity (Vereinigung). We are located BM25-Index im Prozess auf (Lucene-style IDF, damit auch kleine Korpora sinnvoll providen) – Chelt cached bis sich Knoten/Ebenen ändern.

  3. Verlaufsfilter: Standardfalls dürfen nur aktive Graphen (graph nodes mit status=active) verwendet.

  4. Merkmalsscore : Semantische Ähnlichkeit; wiederholung lexikalischer Score – plus hardness Konstellation– zuzüglich confidence minus einer Widerspruchs-Strafe. Würde Strength neu berechnet – nur unter den Kundenpräsent eingegrenzt sind.

  5. Returniert top-k (Default: 10)

  6. Nachwechseln (Aktion) : I’m one.-Hob-Nachbarn der Kandidaten (linked entity, subsequent episodes) tak, hinzu andduction with verbessertem weightweight Active. Nur Anchor die aktuell sind réal.).

  7. Cold-Start-Fallback: Ersten ~10 Sessions bis BM25 zusätzlich zusätzlich über rohe Protokolle. Diese werden asse in [0, raw_log_score_scale] eingeschleust, So no neues Graph-Spiel übertrifft.

Zeitreise

Fakten enthalten a Gültigkeitsfenster. Datumformulierungen: „seit"/“von“ setzen valid_from und „bis“ setzen valid_to; eine Verknüpfung ersetzt das Fenster ältere L. query(..., as_of="2026-03-01") beantwortet, was in diesem Zustand zu diesem Zeit gel.. Zeitpunkt – include incl. mit veralteten und ersetztemte Entfernungen; siehe unten:

awhm query "API endpoint"                       # what is true now
awhm query "API endpoint" --as-of 2026-02-01    # what was true then

Setzen Sie include_history=True, um ersetzte / zurückgezogene Erinnerungen zu zeigen.

Verwenden Sie mit with_trace=True zu pro Ergebnis – derRanking momentsome details jede Treffer.

Auswertung / Evaluierung

Die integrierte Benchmark ist eine liste synthetische-(Smoke)-Test: drei Anfragetypen mit vielen Vernichtigungen plus eine Löschskontrolle. Echte Zahlen kommen aus dem Abspielen eines Körpers –>:

awhm eval                                            # built-in synthetic benchmark
awhm eval --corpus my_sessions.json                  # native format, see below
awhm eval --corpus longmemeval_s.json --longmemeval --limit 50

Beide melden Recall@k, nDCG@k, Widerspruchsfehlerrate, p50/p95-Latenz sowie kategorieweises Recall. Das native Korpusformat ist {"sessions": [{"id", "messages": [{"role", "content"}]}], "questions": [{"id", "question", "expected": [...], "forbidden": [...], "as_of", "category"}]}. LongMemEval-Instanzen werden konsolidiert und einzeln abgefragt, dem Benchmark-Protokoll folgend. Der Abgleich erfolgt über Antwort-Teilstrings, eine bewusste untere Schranke: Paraphrasierte Treffer werden nicht gezählt.

Gemessen (nur Stage 1, Oracle-Split, 500 Fragen): Recall@5 0.196, von 0.40 bei Single-Session-Nutzerfakten bis 0.00 bei Präferenzen, bei 4 ms pro Anfrage. Das ist die sichtbare Grenze des Regex-Ansatzes; Stage 2 existiert, um sie anzuheben. Vollständige Tabelle, Einschränkungen und Reproduktion in docs/benchmarks.md.

Konfiguration

Alle Parameter sind über AWHMConfig konfigurierbar:

Parameter

Standard

Beschreibung

alpha

0.3

Zerfallsrate (Potenzgesetz-Exponent)

beta

0.1

Zerfalls-Skalierungskonstante

w_rec

0.4

Recency-Gewicht im Stärke-Score

w_freq

0.6

Häufigkeitsgewicht im Stärke-Score

retrieval_profile

"balanced"

Abruf-Gewichtungsprofil

w_semantic

0.55

Gewicht für semantische Ähnlichkeit

w_lexical

0.20

Lexikalisches Gewicht (BM25)

w_strength

0.15

Gewicht für den Stärke

w_confidence

0.10

Gewicht für Konsolidierungs-Konfidenz

contradiction_penalty

0.35

Strafe für nicht aktive Erinnerungen

include_history_by_default

False

Standardmäßig abgelöste/zurückgezogene Erinnerungen einbeziehen

trace_retrieval

False

Ranking-Traces standardmäßig ausgeben

k

10

Top-k-Abrufanzahl

entity_link_threshold

0.85

Kosinus-Schwellwert für Entity Linking

dedup_threshold

0.92

Kosinus-Schwellwert für Deduplizierung

bm25_anchor_ratio

0.6

Lexikalischer Anker, wenn Score>= Verhältnis × bester BM25-Score

embed_threshold

0.3

Minimale Kosinus-Ähnlichkeit für die Anchor-Shape

raw_log_score_scale

0.5

Obergrenze für Raw-Log-Treffer-Scores beim Kaltstart

neighbor_expansion / neighbor_decay

True / 0.6

Ein-Hopf-Graphnachbarn der Anker mit diesem Kantengewichts-Multiplikator einbeziehen

w_association

0.10

Gewicht der Nachbarevidenz in der Mischung

storage_backend

"json"

"json" (eine Datei, zwei) oder "sqlite" (inkrementelles Speichern)

stage2_enabled

False

Offline-LLM-Verfeinerung nach Stage 1

stage2_client / stage2_model

"claude-code" / None

claude-code (CLI, ohne Schlüssel) oder anthropic; Modell-Alias, None = Client-Standard

stage2_max_messages / stage2_min_confidence

60 / 0.5

Nachrichten pro LLM-Aufruf; einen Vorschlägen unterhalb dieser Konfidenz werden verworfen

correction_window_messages

3

Wie nahe eine explizite Korrektur am Original liegen muss, um eine Präferenz/Richtlinie zu ersetzen

ner_labels

PERSON, ORG, GPE, ...

spaCy-Ententsitäts-Labels, die zu Knoten werden

deletion_flush_interval

30

WAL-Persistenzintervall

ann_index_type

"none"

Reservierter ANN-Index-Modus

delete_snapshots_on_hard_delete

True

Passende Snapshot-Erinnerungen beim endgültigen Löschen bereinigen

from awhm.config import AWHMConfig

config = AWHMConfig(
    data_dir="~/.my-project-memory",
    k=20,
    w_rec=0.5,
    w_freq=0.5,
)

Datenverzeichnis

~/.awhm/
├── logs/                          # Raw JSONL logs (one per session)
│   ├── {session_id}.jsonl
│   └── ...
├── graph/
│   ├── memory_graph.json          # The memory graph (storage_backend="json")
│   └── memory_graph.sqlite        # ... or one row per node (storage_backend="sqlite")
├── snapshots/
│   └── snapshot_{timestamp}.json  # Manual backups
├── wal/
│   └── {session_id}.wal           # Per-session write-ahead logs
└── meta/
    ├── consolidated_sessions.json # Tracks which sessions have been processed
    ├── deletion_tombstones.jsonl  # Deletion tombstones
    └── deletion_ledger.jsonl      # Deletion audit ledger

Tests

pip install -e ".[dev]"
pytest tests/ -v

Alle Tests verwenden MockEmbeddingService (deterministisch über Prozesse hinweg, ohne Modelldownload). ruff check . führt den Linter aus; CI führt beides unter Python 3.11, 3.12 und 3.13 aus.

Abhängigkeiten

Paket

Größe

Zweck

Finsozufall

~43 MB

Vektormathematik

spacy + en_core_web_sm

~255 MB

NER

dateparser

~2 MB

Datumsverarbeitung

sentence-transformers(optional, [embeddings])

~3 MB (+PyTorch ~350 MB)

Einbettungsmodell

mcp (optional, [mcp])

~1 MB

Integration für Claude Code

BM25 ist im Paket selbst implementiert (etwa 60 Zeilen), eine Rangfolge-Abhängigkeit besteht ebenfalls nicht.

Das Einbettungsmodell (all-MiniLM-L6-v2, 22 MB) wird bei der ersten Verwendung nach ~/.cache/huggingface heruntergeladen.

Projektstruktur

src/awhm/
├── __init__.py            # AWHMSession facade (top-level API)
├── config.py              # All parameters + path helpers
├── types.py               # Enums: Role, NodeType, NodeStatus, EdgeType, BufferEntryType
├── mcp_server.py          # MCP server for Claude Code
├── hooks.py               # Claude Code hook commands (prompt / stop / session-end)
├── timeutil.py            # Timestamp parsing, validity windows
├── eval/                  # Built-in benchmark + real-corpus replay (LongMemEval loader)
├── raw_log/               # Append-only JSONL logging
├── session_buffer/        # Regex pattern matching + WAL
├── graph/                 # Memory graph, strength scoring, JSON/SQLite stores
├── consolidation/         # NER, temporal, extraction, entities, dedup, Stage 2, pipeline
├── retrieval/             # Embedding, BM25, ranking, retrieval engine
├── snapshots/             # Snapshot create/restore/list
├── deletion/              # Hard-delete cascade
└── cli/                   # argparse CLI
A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A persistent memory MCP server for Claude Code that enables long-term recall across sessions via hybrid search, code intelligence, and tools for reading/writing memory.
    23
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A MCP server that gives Claude Code and other AI assistants long-term memory by automatically extracting technical knowledge from conversations and retrieving relevant experiences in future sessions.
    14
    MIT

View all related MCP servers

Related MCP Connectors

  • Cloud-hosted MCP server for durable AI memory

  • Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer

  • One memory, every AI: Claude, ChatGPT, Perplexity, Gemini, Cursor, OpenClaw, Hermes, any MCP client.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/juderosendev/awhm-lite'

If you have feedback or need assistance with the MCP directory API, please join our Discord server