llm-kelt
Knowledge · Embedding · Learning · Training
Persistent memory and fine-tuning data for LLM applications, backed by Postgres.
Store the things an LLM needs to know or learn from — facts, feedback, preferences, predictions, directives — under an isolation key. Retrieve them for prompt injection or RAG. Export them to DPO/SFT/classifier datasets. Train LoRA/DPO/Prompt adapters from the exported data.
Requirements
- Python 3.11+
- PostgreSQL 16+ with the
vectorextension (pgvector) - For training: CUDA GPU (or MPS on Apple Silicon)
Supported Python versions
CI tests every push on:
- Linux (Ubuntu): Python 3.11, 3.12, 3.13, 3.14
requires-python = ">=3.11" is declared in package metadata; newer Python
versions are validated in CI before being added to the matrix.
Install
pip install llm-kelt # runtime
pip install llm-kelt[training] # + torch / transformers / peft / trl
Database prerequisite
llm-kelt is a database-backed substrate: the quickstart and all
examples/*.py scripts need a running Postgres 16+ server with pgvector
before they will do anything useful. Standing one up takes ~30 seconds:
docker run -d --rm --name kelt-quickstart-db \
-p 127.0.0.1:25432:5432 \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=learn_test \
pgvector/pgvector:pg16
Repo cloners can equivalently make pg.server.up (uses the shipped
etc/pg.yaml). See docs/quickstart.md § 1
for the full three-path menu (repo Makefile, standalone docker, existing
Postgres).
Minimal example
import os
from appinfra.dot_dict import DotDict
from appinfra.log import LogConfig, LoggerFactory
from llm_kelt import ClientContext, ClientFactory
from llm_kelt.inference import ContextBuilder
lg = LoggerFactory.create_root(LogConfig.from_params(level="warning"))
database_url = os.environ.get(
"DATABASE_URL", "postgresql://postgres:postgres@127.0.0.1:25432/learn_test"
)
config = DotDict({"dbs": {"main": {"url": database_url, "create_db": True}}})
kelt = ClientFactory(lg).create_from_config(
context=ClientContext(context_key="my-agent"),
config=config,
)
kelt.atomic.assertions.add("Timezone: UTC", category="settings")
kelt.atomic.assertions.add("Prefers concise, code-first answers", category="style")
system_prompt = ContextBuilder(kelt.atomic.assertions).build_system_prompt(
base_prompt="You are a helpful assistant.",
)
# → "You are a helpful assistant.\n\n## About the user:\n- Timezone: UTC\n- ..."
That's the whole shape: put things in under a context_key, pull them back out grouped for
prompt injection. Everything else (RAG, feedback, preferences, training) builds on the same
model.
Where to go next
- Quickstart — 5 minutes from install to first RAG query.
- Concepts — context keys, schemas, atomic vs KG. Read once before the tutorials.
- Atomic memory — the seven fact clients (assertions, feedback, preferences, predictions, directives, interactions, solutions) and how they relate.
- Context & RAG — embedding facts, semantic search,
ContextQuery. - Conversation — multi-turn sessions, token accounting, compaction, storage.
- Training — manifest workflow, LoRA/DPO/SFT/Prompt, exports, adapter registry.
- Knowledge graph — entities, aliases, hierarchical scopes.
- Multi-schema —
SchemaMode,with_schema(), isolation. - CLI reference —
llm-kelt atomic|proxy|train|session. - Glossary — project-specific terms.
Configuration
ClientFactory.create_from_config accepts any dict-like config (a DotDict, a
plain dict, or the object returned by appinfra's Config after loading a yaml
file). For a yaml-backed setup, the shape is:
dbs:
main:
url: postgresql://user:pass@localhost:5432/llm_kelt
extensions: [vector]
llm:
default: local
backends:
local:
base_url: http://localhost:8000/v1
model: default
embedding:
type: openai
base_url: http://localhost:8001/v1
model: text-embedding-3-small
kelt:
adapters:
lora:
base_path: ~/models/adapters
llm, embedding, and kelt.adapters are only required for the subsystems that use them
(ContextQuery, RAG, and training respectively).
Examples
Runnable scripts in examples/:
Suggested reading order:
facts_and_context.py— assertions +ContextBuilder.rag_retrieval.py— embeddings,search_similar,ContextQuerywith RAG.training_export.py— feedback + preferences → DPO/SFT/classifier JSONL.lora_training.py— end-to-end LoRA training.conversation.py—Conversation, compaction,FileSessionStorage.
License
Apache 2.0
Maintained by LLM Works LLC and contributors.
Metadata
Release files for llm-kelt 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| llm_kelt-0.5.0.tar.gz | 393.3 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| llm_kelt-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 692.6 kB
Release files / llm_kelt-0.5.0.tar.gz
| Download URL | llm_kelt-0.5.0.tar.gz |
|---|---|
| Size | 393.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f473cc9e1a043d134abd92f85d31cf40001ba1585542a71764010af109a28996
|
|
BLAKE2b-256 checksum How to use checksums |
7136bf5571a649b75426a2171397db7ed48467576f10a5137778c63a1bfd12c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logRelease files / llm_kelt-0.5.0-py3-none-any.whl
| Download URL | llm_kelt-0.5.0-py3-none-any.whl |
|---|---|
| Size | 299.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
489c8bddcb05699204b11f27efcc9e44ef5e113c373e4f40f600aa54ec18d833
|
|
BLAKE2b-256 checksum How to use checksums |
9d1e59dd9f2d1e6666513585b68ea44763b14cc75135acdeba8b9e4b0fa22ace
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logSecurity for llm-kelt 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for llm_kelt-0.5.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.