Skip to main content

Memory infrastructure for personal AI — bi-temporal facts, honest contradictions, autonomous maintenance, real forgetting. MCP-native, multi-tenant, multilingual.

Project description

gnokee

Memory infrastructure for personal AI — bi-temporal facts, honest contradictions, autonomous maintenance, real forgetting. MCP-native, multi-tenant, multilingual.

PyPI npm License: Apache-2.0

Status: v0.6 — v0.1 core surface (ingest + recall + MCP) plus v0.2 typed clinical-data reads (gnokee_lab_query / gnokee_med_query), v0.3 lite-mode ingest for high-cadence sources, v0.4 encrypted-body branch (content xor encrypted_body; gnokee never holds keys), v0.5 read-side hardening (declarative gnokee_query envelope, per-claim citations, recency-proxy confidence, Obsidian adapter, refusal posture), and v0.6 ingest hardening: storage-first ingest pipeline + adaptive TPM-aware retry (ADR-0023). gnokee never loses an episode regardless of Graphiti state. Closes the Q18 silent-drop bug class on the LongMemEval-S corpus (recall@5 measurable: 17.6% → 100%). See docs/specs/v0.1.md for the core surface and docs/README.md for the full doc map.

┌─────────────────────────────────────────────────────────┐
│  Adapters (thin shims; consumer-owned)                  │
│  files / md-vault / api-push / rss / email / pulse-sdk  │
└────────────────┬────────────────────────────────────────┘
                  ↓ ingest_episode (full or lite)
┌─────────────────────────────────────────────────────────┐
│  gnokee core                                            │
│    • bi-temporal store, supersession, contradiction     │
│    • retrieval: pgvector cosine + Cypher narrow         │
│    • forgetting: tombstones + crypto erasure            │
│    • MCP server (5 tools, token-efficient)              │
└────────────────┬────────────────────────────────────────┘
                  ↓
┌─────────────────────────────────────────────────────────┐
│  Backends (pluggable)                                   │
│  Postgres + pgvector  •  Neo4j Community (Graphiti)     │
│  bge-m3 via TEI / Ollama  •  consumer-supplied LLM      │
└─────────────────────────────────────────────────────────┘

Quickstart

Requirements: Docker, Python 3.10+, an OpenAI-compatible LLM API key (gpt-4o-mini per Q4).

# 1. Bring up Postgres + Neo4j + TEI
make up

# 2. Install (editable) and run the demo
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[mcp,dev]"

# 3. Configure env
cp .env.example .env
# edit .env to set GNOKEE_OPENAI_API_KEY (or GNOKEE_LLM_API_KEY)

# 4. Apply migrations and run the demo
make migrate
make demo

The demo ingests five episodes about a person, runs a recall, and prints any contradictions. Output is plain stdout — gnokee is a library + MCP server, not a UI.

MCP server

python -m gnokee.mcp        # stdio (default; for Claude Desktop / Code / Cursor)
GNOKEE_MCP_HTTP=1 python -m gnokee.mcp   # streamable-http (dev only)

Drop-in client config snippets for Claude Desktop, Claude Code, and Cursor live under examples/03_mcp_clients/.

Tools surfaced:

Tool Purpose
gnokee_ingest_episode Store a fact / event / observation in bi-temporal memory.
gnokee_recall Natural-language fact retrieval with provenance handles.
gnokee_fact_provenance Fetch the original episode body behind a fact_uuid.
gnokee_lab_query (v0.2) Typed clinical-lab reads: latest | history | min | max | avg | count over lab_record.
gnokee_med_query (v0.2) Typed medication-history reads: active | history | allergies | switches over med_record.
gnokee_wiki_export (v0.5) Markdown wiki view of a tenant's memory (index.md + log.md + entities/<slug>.md). ADR-0015.

Core schemas in docs/specs/v0.1.md §6; v0.2 typed reads documented in ADR-0009 + ADR-0010; v0.5 wiki export in ADR-0015.

llms.txt manifest

gnokee ships an llms.txt manifest listing the MCP tool surface, identity model, and red lines so agents can discover gnokee without reading the full README. Two static files ride along with every release:

File Purpose
static/.well-known/llms.txt Full structured manifest (tools, ADR index, identity, red lines).
static/.well-known/gnokee.txt Pointer file (manifest: ./llms.txt) for agents probing <project>.txt.

Both files ship inside the PyPI sdist + wheel at <site-packages>/gnokee/.well-known/{llms.txt,gnokee.txt} (see pyproject.toml [tool.hatch.build.targets.wheel.force-include]). gnokee itself does NOT publish a webserver; self-hosters wire their own static-file route at /.well-known/llms.txt if they want the manifest reachable over HTTP. Docker users find the same files in the in-repo static/.well-known/ path of the gnokee install.

Environment variables

Var Purpose
GNOKEE_PG_DSN postgresql://…
GNOKEE_NEO4J_URI / GNOKEE_NEO4J_USER / GNOKEE_NEO4J_PASSWORD Bolt + auth
GNOKEE_TEI_URL TEI base URL (e.g. http://localhost:8080)
GNOKEE_EMBED_MODEL default bge-m3 (1024-dim, locked)
GNOKEE_OPENAI_BASE_URL / GNOKEE_OPENAI_API_KEY consumer-supplied LLM (alias: GNOKEE_LLM_*)
GNOKEE_LLM_MODEL default gpt-4o-mini
GNOKEE_TENANT_DEFAULT demo + tests only; production paths require tenant_id explicitly
GNOKEE_MCP_HTTP 0 for stdio, 1 for streamable-http (dev only)
GNOKEE_LOG_LEVEL default info

Tests

make test-unit             # no compose required
make up && make test-integration   # needs LLM key + compose stack

What gnokee is

A memory layer that treats facts the way infrastructure treats state: declared, versioned, reconciled, garbage-collected. It ingests episodes from any source (files, APIs, event streams), stores them with bi-temporal validity, detects contradictions at write and surfaces them at read, supersedes facts explicitly rather than overwriting, forgets verifiably when asked, and runs maintenance autonomously.

MCP-native. Multi-tenant from day one. Multilingual by default (bge-m3). Built on top of Graphiti's bi-temporal knowledge graph primitive.

Two ingest modes:

  • Full (extract=True, default): full Graphiti narrative extraction + contradiction detection. p50 ≈ 4.5 s, p95 ≈ 7.1 s. For one-off / low-cadence sources.
  • Lite (extract=False, v0.3+): skip the LLM-bound stages; Postgres + TEI only. p50 ≈ 200 ms. For telemetry / wearable summaries / log scrapes. Pair with gnokee.maintenance.run_deferred_extraction to backfill narrative facts on a schedule. See docs/integration_patterns.md.

Encrypted-body branch (v0.4+): pass encrypted_body=... instead of content=...; gnokee stores ciphertext, never decrypts, never sees the DEK. Recall surfaces ciphertext verbatim — consumer decrypts with their own KMS via key_id. See docs/architecture.md §Encrypted-body lifecycle.

What gnokee is not

  • Not a chat UI (use any MCP client)
  • Not an LLM host (use Ollama, LiteLLM, direct APIs)
  • Not a sync engine, workflow engine, agent framework, document parser, vault editor, auth provider, federation layer

See docs/architecture.md for the full refusal list.

Status

  • Namespace claimed (PyPI, npm, GitHub org gnokeelabs, domains gnokee.com/.dev/.io)
  • Q1 Graphiti spike — ADOPT as storage primitive (ADR-0001)
  • Q2 bge-m3 cross-lingual — ADOPT (100% top-1 via direct cosine); retrieval reassigned to gnokee (ADR-0004)
  • Q3 MCP token-efficiency — ADOPT gnokee response shape (60% token reduction at 91.7% top-3 recall vs Graphiti-raw 50%)
  • Q4 contradiction-classifier smoke test — ADOPT gpt-4o-mini (8/10 = 80% accuracy on labeled pairs)
  • Q5 forgetting hard-delete propagation — ADOPT (2/2 probes; Neo4j cascade + retrieval-surface clean)
  • Q5 storage adapter audit (FalkorDB) — Neo4j for v0.1; FalkorDB swap deferred to v0.2 (Graphiti-internal API differs; gnokee's Cypher is portable)
  • v0.1 spec finalized (docs/specs/v0.1.md)
  • v0.1 implementation — ingest + recall + MCP + contradictions, integration tests on real compose stack
  • Q7 clinical-labs spike — OFF-RAMP at 13.3 %; typed lab_record table per ADR-0009
  • Q8 med-supersession spike — ADOPT_WITH_GAPS at 53.3 %; typed med_record table per ADR-0010
  • Q9 wearable-throughput off-ramp (ADR-0011)
  • v0.2 typed clinical reads landed (gnokee_lab_query + gnokee_med_query); Q7 lifted to 66.7 % ADOPT_WITH_GAPS, Q8 lifted to 93.3 % ADOPT
  • Eval suite formalised across cross-tool (vs Mem0 / Graphiti-alone / Zep-OSS / basic-memory) — Stage A 2026-05-09 (10 Q × 10 sessions, 3 SUTs, double-run judge agreed); Stage C-pilot 2026-05-10 (30 Q × 20-session, 3 SUTs, double-run judge agreed) confirms magnitude — all three SUTs 0/30 strict on LongMemEval-S; gnokee REJECT for v0.2.x retrieval surface (ADR-0012 Accepted). Q10.1: Zep-OSS + basic-memory adapters wired + smoked (5 wired SUTs). Bottleneck moved from retrieval to synth-prompt abstention bias (#62); full-pilot Stage C (100 Q × ~47-session × Track 1 + Track 2) tracked under #63
  • First tagged release

Roadmap

Phase Milestone
Spike Q1 — Graphiti's bi-temporal model fits Omur + personal corpora
v0.1 Single-tenant, single-binary; ingest + retrieval + MCP; basic forgetting; Apache 2.0
v0.2 Typed clinical reads (labs + meds) per ADR-0009/0010; structured Postgres siblings to graphiti's narrative
v0.3 Omur consumes gnokee; multi-tenant validation; encrypted-body branch
v1.0 API stability commitment; published evals vs Mem0 / Graphiti-alone / basic-memory

Documentation

docs/README.md is the entry map — audience-grouped index of every doc in this repo. Quick links:

Project name

gnokee = gno (Greek γνῶσις, "knowledge") + kee (English keep, custodian). Pun: "no key" — gnokee never holds keys, never decrypts (see docs/architecture.md § Privacy). Originally drafted as Veda; rebranded after namespace collision.

License

Apache-2.0. See LICENSE.

Contributing

Open with guardrails. Bug fixes, docs, tests, eval improvements, and adapters via PR; new MCP tools, breaking changes, and new ADRs require maintainer pre-approval. The AGENTS.md "do not" list (no UI, no LLM hosting, no auto-resolve, no key holding, no supersession-by-deletion) is normative for every PR.

See:

Source of truth

Design documents live in Notion (private) until first commit; from this point forward the repo is canonical. See AGENTS.md for the convention.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gnokee-0.6.0.tar.gz (459.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gnokee-0.6.0-py3-none-any.whl (159.6 kB view details)

Uploaded Python 3

File details

Details for the file gnokee-0.6.0.tar.gz.

File metadata

  • Download URL: gnokee-0.6.0.tar.gz
  • Upload date:
  • Size: 459.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gnokee-0.6.0.tar.gz
Algorithm Hash digest
SHA256 36051b4d1f838cea69d7bb92f78fe682d4e7294e41a93779244865f295e98a42
MD5 a52c3e28a6c863a9d3882d72878b3f01
BLAKE2b-256 518d2855e5eb38fc2e5d65656c3b8f5377a6a078a5aca2f0f8c36a51f118a3a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for gnokee-0.6.0.tar.gz:

Publisher: pypi-publish.yml on gnokeelabs/gnokee

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gnokee-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: gnokee-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 159.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gnokee-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f94ab6e4c9258798c8fdb3934b529af8f8e58256c168e15803f3078c4c8a1cc7
MD5 cdad7fb1e8d5b7bedeae86996c786539
BLAKE2b-256 b5f19dc704bc78913438bfa501f44c5a822bb301bee90aace7f614783f17edce

See more details on using hashes here.

Provenance

The following attestation bundles were made for gnokee-0.6.0-py3-none-any.whl:

Publisher: pypi-publish.yml on gnokeelabs/gnokee

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page