KITE by Memoket turns conversations into structured, source-backed facts, then answers questions with the exact moment they came from attached.
Most AI memory turns every sentence into a cloud of numbers and hands back whatever lands closest to your question. It always returns something, even when the answer was never there, and it cannot show you why.
KITE by Memoket reads what a question means, not how it sounds.
"Who's the decision-maker on the Henderson account now?"
Nothing in memory says decision-maker:
- March. Marcus: "I'll sign off on Henderson."
- June. The new VP of Ops: "Dana owns Henderson from here."
Both were filed under the same topic when they were written. Then now sorts them by date. Similarity has no notion of now: nearest-match memory rates March just as relevant and answers "Marcus", with nothing to tell you it is wrong. KITE answers "Dana", with the June line attached.
| Nearest-match memory | 🪁 KITE by Memoket | |
|---|---|---|
| Finds | whatever sounds like the question | the facts that answer it |
| When it was never said | returns something anyway | comes back empty, and says so |
| Why this answer? | a similarity score | a readable plan, with who said it and when |
| Runtime stack | embeddings · vector DB · rerankers | one portable, topic-indexed file |
| Ask again tomorrow | depends on the index that day | the same plan walks the same steps |
The whole idea in one line: conversations settle into facts under topics, and a question finds its topic and pulls that topic's memories, receipts included.
A user says, "I moved to Tokyo on July 26." KITE by Memoket extracts what happened and files it under its topics, keeping the original message as evidence:
<fact t="2026-07-26" kind="event" who="user"
place="tokyo" event="move" src="chat1L1">
The user moved to Tokyo on 26 July 2026.
</fact>
<line id="chat1L1" who="user">I moved to Tokyo on July 26.</line>When the agent asks "Where does the user live now?", KITE by Memoket compiles the question into a plan you can read, validate, and cache:
{
"select": "facts",
"where": {"who": ["user"], "event": ["move"]},
"pipe": [
{"op": "sort", "key": "t", "desc": true},
{"op": "head", "n": 1}
]
}The executor runs the plan over the topic index. Keywords and associations come first, then conditions filter down to the one moment that answers the question:
SEARCH facts
FILTER who = "user" AND event = "move"
SORT BY event_time DESC
TAKE 1
The same validated plan always follows the same steps over the same memory, with no embeddings and no vector database anywhere.
Answer: Tokyo
Source: chat1L1, "I moved to Tokyo on July 26."
| No embeddings, no vector database, no layers to embed, sort, and re-rank every result. | Conversations crystallize into typed, dated, topic-indexed memory you can open and read. | Every question becomes a symbolic plan, revealing exactly how each answer was matched. |
| People, events, dates, and updates handled directly, so "now" means now. | Evidence links straight back to the moment it came from: who said it, when, and the actual words. | When something was never said, the search comes back genuinely empty, and KITE says so. |
python -m pip install memoket-kite
export OPENAI_API_KEY="sk-..."
mkdir -p artifacts
curl -fsSL \
https://raw.githubusercontent.com/memoket/memoket-kite/main/examples/data/demo_codebook.xml \
-o artifacts/quickstart.xmlUsing another OpenAI-compatible provider? Set OPENAI_BASE_URL as well.
Turn a conversation into structured, source-backed facts:
from memoket_kite import Memory
memory = Memory.load("artifacts/quickstart.xml")
memory.remember(
[{"role": "user", "content": "I moved to Tokyo."}],
session_id="session_1",
)Compile a question into a plan and retrieve matching facts, each carrying its sources:
from memoket_kite import Memory
memory = Memory.load("artifacts/quickstart.xml")
for fact in memory.recall("Where did the user move?"):
print(fact.content)
print(fact.sources)Generate an answer from the retrieved evidence and keep the receipts:
from memoket_kite import Memory
memory = Memory.load("artifacts/quickstart.xml")
result = memory.answer_with_evidence("Where did the user move?")
print(result.text) # "The user moved to Tokyo."
for fact in result.evidence:
print(fact.content, fact.sources) # the moments the answer stands on
print(memory.answer("Where did the user move?")) # just the textFull reference in docs/api.md;
more runnable examples in
examples/.
KITE by Memoket posts the top overall score on both public long-conversation memory benchmarks. It is the only system up there that uses no vectors, and it reads less context than any capable rival.
| Benchmark | Overall Accuracy | Avg. Reader Context |
|---|---|---|
| LoCoMo | 🥇 93.51% | 1.51k tokens |
| LongMemEval-S | 🥇 85.60% | 1.65k tokens |
All systems are evaluated under one shared protocol, with gpt-4.1-mini as the
common reader and judge; the exact rubrics are in the
LoCoMo protocol
and
LongMemEval protocol.
Reader context is the mean per-question evidence budget: what the reader actually
gets to see, measured by the same ledger on every question.
Each figure comes from a reference run under the default configuration, with
gpt-4.1-mini reading and judging and no ablation flags set. The reproduction
contract pins the dataset revisions, protocols, model IDs, expected row counts,
and reported scores. The provided scripts rebuild the evaluation locally from
the official datasets with a configured compatible LLM endpoint.
How a local run is recorded
Every rebuilt run writes a local manifest naming the exact commit, corpus
digest, tokenizer, and plan-cache digest it used. Judging records the answers,
verdicts, and score in a second manifest keyed to the first. A completed run can
validate that seal and recompute its metrics offline; the reference verifier
also checks the manifest-declared paths, counts, and reported aggregate. Details
are in the
benchmark guide
and
reproducibility notes;
the benchmark corpora keep their own licences, spelled out in
LICENSE-DATA.md.
KITE by Memoket is a plain Python library: three calls take you from a raw conversation to a cited answer. Integrations across the agent ecosystem (Claude Code, Codex, Cursor, OpenCode, and more) are next on the roadmap.
Want yours first? Tell us on Discord.
The memory you just read about ships today. KITE is the algorithm inside every Memoket: the same topic-filed facts, the same line back to the source, running on your own device. Ask it "didn't this client say their fiscal year ends in March?" months later, and it surfaces the exact moment: who said it, when, and in their words.
Memoket captures memories; KITE is the memory itself.
KITE-inside-MemoChat.mp4
See more of Memoket in action →
- 💬 Discord for questions, ideas, and integration requests
- 🐛 Issues for bugs and feature requests
- 🔧 Contributing guide · 🔒 Security policy
A technical report is in preparation; BibTeX will land here with the arXiv release. Until then, please cite this repository.
KITE by Memoket is released under the Apache License 2.0.
Like its name, KITE by Memoket stays light enough to fly, always on a line back to the truth. 🪁




