Skip to content
hotdata-devPublic

About

Agent memory as tables on Hotdata

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

hotmemory

Agent memory as tables on Hotdata.

A memory record is a row in a managed table. The row carries the text, a scope, tags, source references, and the time span in which the fact was true. The table is an ordinary Hotdata table, so an agent can join its memory to its own data in one SQL query. None of the memory systems that we surveyed stores memory as typed columns in the same engine as the data of the consumer.

Status: version 0.0.0, not published. The storage contract exists in Python with one driver, MemoryStore, which runs in process memory. The Hotdata driver and the memory contract do not exist yet. docs/internal/roadmap.md lists the phases.

The library has two layers:

  • A storage contract. Put, get, list, search, and delete records in a namespace. Records are immutable. A new put under the same key creates a new revision.
  • A memory contract. Remember facts, recall them inside a context budget, supersede a fact, and forget by id or by horizon. Extraction from raw text is optional, and it takes a model callable that the caller supplies.

The library runs in the process of the consumer and calls the Hotdata API with the API key of the consumer. There is no hotmemory server. The first consumer is an incident investigator built on Hotdata. The library is not specific to it. A plain Python agent, a LangGraph agent, or any process with a Hotdata API key can use it.

Try the storage contract

MemoryStore needs an embedder for a search with query text. An embedder is a callable that turns a list of texts into a list of vectors. This example uses a toy embedder that counts two words:

from hotmemory import Filter, MemoryStore


def embed(texts):
    return [[text.count("disk") + 0.1, text.count("cpu") + 0.1] for text in texts]


store = MemoryStore(embedder=embed)
store.put(("team", "alerts"), "disk", kind="fact", content="The disk fills at night.")
store.put(("team", "alerts"), "disk", kind="fact", content="The disk fills at noon.")
store.put(("team", "alerts"), "cpu", kind="fact", content="The cpu spikes after a deploy.")

print(store.get(("team", "alerts"), "disk").id)  # team/alerts/disk@2
print([r.revision for r in store.history(("team", "alerts"), "disk")])  # [1, 2]
hits = store.search("disk", [("team",)], Filter(kind="fact"), k=1)
print(hits[0].record.content)  # The disk fills at noon.

Documents

  • docs/contracts.md: the record, the storage operations, the memory operations, and the platform facts behind them.
  • docs/guarantees.md: each behavior that a consumer can rely on, its state, and its proof.
  • docs/local.md: how to run the library against a local RuntimeDB container.
  • CONTRIBUTING.md: the one command that checks a change, and the rules of the test suite.
  • CHANGELOG.md: each change to a public surface.
  • docs/internal/: the design brief, the survey, the roadmap, and the plan for the current phase.

About

Agent memory as tables on Hotdata

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages