galet-memory
Provider-neutral memory abstractions and reusable implementations for agent applications.
This package is being extracted from Lucy's src/coala_memory package. It will own
memory models, interfaces, retrieval and ranking logic, and reusable persistence
implementations.
Dependency rule
Applications may depend on
galet-memory;galet-memorymust never depend on an application.
In particular, this repository must not import from Lucy's src package.
Lucy-specific configuration, dependency injection, storage adapters, agent lookup,
request context, and tool handlers remain in Lucy.
Planned extraction order
- Neutral episodic, semantic, procedural, and working-memory interfaces and models.
- Retrieval, ranking, and digest logic.
- Reusable SQLite and vector-backed implementations behind package-owned ports.
- Lucy compatibility re-exports and adapters.
- Exact-commit integration in Lucy followed by parity and full-suite testing.
The extraction must preserve database formats, retrieval results, prompts, and tool permissions.
Storage ports
Reusable memory implementations depend on narrow, structurally typed ports:
EmbeddingProviderturns text into vectors.GaletEmbeddingProvideradapts Galet'sEmbeddingApi.EmbeddingIndexperforms namespace-scoped similarity queries without exposing an application's storage records.TextLoaderloads bounded text from paths already authorized by the host.ContextRepositoryreturns neutral context and skill snapshots.
Host applications adapt their storage and configuration to these ports. The
package includes VectorSemanticMemory, EmbeddingDigestRecall,
ContextProceduralMemory, and a basic FileTextLoader.
Request-scoped embedding reuse
Semantic document recall and episodic digest recall commonly embed the same query. Wrap their shared provider once and open a cache scope around the application request:
from galet_memory import CachingEmbeddingProvider
embeddings = CachingEmbeddingProvider(base_embeddings)
semantic_memory = VectorSemanticMemory(embeddings=embeddings, ...)
digest_recall = EmbeddingDigestRecall(embeddings=embeddings, ...)
with embeddings.request_scope() as cache:
digest_recall(episodic_request)
semantic_memory.recall(semantic_request)
print(cache.info())
The cache key contains the exact embedding model and the exact ordered input texts. A model change therefore cannot reuse vectors from the previous model. Calls outside a request scope pass through uncached, concurrent contexts are isolated, and failed provider calls are never stored.
SqliteVecEmbeddingIndex reads the existing 1536-dimension sqlite-vec
schema. It defaults to vec_embeddings_v2 and joins results to
embedding_metadata; the original vec_embeddings table can be selected
explicitly for legacy reads. Internal tables generated by vec0 are never
accessed directly.
SqliteEpisodicMemory implements both the prompt-time EpisodicMemory and
session-management EpisodicMemoryManager contracts. It opens the existing
Lucy-compatible kv/logs schema directly, while exposing only neutral
galet-memory models. Existing keys under sessions/ and correlations/ are
preserved, so adopting the package does not require a database migration.
from galet_memory import SqliteEpisodicMemory
episodic = SqliteEpisodicMemory("/path/to/chat2.sqlite")
session = episodic.get_session("existing-session-id")
Episodic memory road test
Create a disposable database and session:
galet-memory-episodic --db /tmp/galet-chat.sqlite create \
--account demo --agent lucy --session-id road-test \
--friendly-name "Road test"
Append and inspect an event:
galet-memory-episodic --db /tmp/galet-chat.sqlite add \
road-test "Hello episodic memory"
galet-memory-episodic --db /tmp/galet-chat.sqlite show road-test
Append supplied digest text as a logical archive boundary, then compare the visible and complete histories:
galet-memory-episodic --db /tmp/galet-chat.sqlite archive \
road-test "The earlier conversation was summarized." --account demo
galet-memory-episodic --db /tmp/galet-chat.sqlite show road-test
galet-memory-episodic --db /tmp/galet-chat.sqlite show road-test --scope all
The sample accepts digest text directly and does not call an LLM. Run it against a disposable database or a copy while experimenting.
Embedding memory road test
Install the package, set OPENAI_API_KEY (or use Galet's
GALET_CREDENTIAL_PATH), and point the CLI at a copy or test embedding
database.
Add a sample:
galet-memory-embeddings \
--db /home/junwin/lucy_storage/data/embeddings-v2.sqlite \
--account junwin \
--namespace demo \
add "The allotment has runner beans and three apple trees."
Query it:
galet-memory-embeddings \
--db /home/junwin/lucy_storage/data/embeddings-v2.sqlite \
--account junwin \
--namespace demo \
query "What fruit trees are in the allotment?"
Query it with path to credentials:
galet-memory-embeddings \
--credential-path /home/zzzzzz/credential \
--db /home/junwin/lucy_storage/data/embeddings-v2.sqlite \
--account junwin \
--namespace demo \
query "What fruit trees are in the allotment?"
Use --extension when vec0 is not installed at
/usr/local/lib/sqlite-vec/vec0.so. The current schema requires
1536-dimension vectors, so the default model is
text-embedding-3-small. Run against a copy of a production database when
experimenting.
Release files for galet-memory 0.1.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 | |
|---|---|---|---|
| galet_memory-0.1.0.tar.gz | 41.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| galet_memory-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 82.1 kB
Release files / galet_memory-0.1.0.tar.gz
| Download URL | galet_memory-0.1.0.tar.gz |
|---|---|
| Size | 41.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a1dae7e802ae9d48c230395a46a53cabf00c2b6e22b0b2bac487ffc8631adc8a
|
|
BLAKE2b-256 checksum How to use checksums |
60df538c9768d5c66d441c8397a50bf0b15ece1737e8394ee2dc0191e219871b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.16 {"installer":{"name":"uv","version":"0.12.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / galet_memory-0.1.0-py3-none-any.whl
| Download URL | galet_memory-0.1.0-py3-none-any.whl |
|---|---|
| Size | 40.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a58870190d9e0e0a7c183ce0b79159fb92c5fdb08af8c6c25b3689e3bfcc5ff8
|
|
BLAKE2b-256 checksum How to use checksums |
ee21245246640074f58663d05a1c16ac4588a4eaa4c6b347fd11c5caaa4c3259
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.16 {"installer":{"name":"uv","version":"0.12.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|