cryptomem 2026.6.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cryptomem-2026.6.1/.gitignore +44 -0
- cryptomem-2026.6.1/PKG-INFO +86 -0
- cryptomem-2026.6.1/README.md +51 -0
- cryptomem-2026.6.1/cryptomem/__init__.py +51 -0
- cryptomem-2026.6.1/cryptomem/adapters/__init__.py +5 -0
- cryptomem-2026.6.1/cryptomem/adapters/base.py +11 -0
- cryptomem-2026.6.1/cryptomem/adapters/mock_adapter.py +14 -0
- cryptomem-2026.6.1/cryptomem/adapters/ollama_adapter.py +41 -0
- cryptomem-2026.6.1/cryptomem/cli.py +38 -0
- cryptomem-2026.6.1/cryptomem/client.py +361 -0
- cryptomem-2026.6.1/cryptomem/config.py +37 -0
- cryptomem-2026.6.1/cryptomem/crypto/__init__.py +5 -0
- cryptomem-2026.6.1/cryptomem/crypto/hashing.py +25 -0
- cryptomem-2026.6.1/cryptomem/crypto/keys.py +63 -0
- cryptomem-2026.6.1/cryptomem/crypto/merkle.py +59 -0
- cryptomem-2026.6.1/cryptomem/crypto/signer.py +52 -0
- cryptomem-2026.6.1/cryptomem/efficiency/__init__.py +12 -0
- cryptomem-2026.6.1/cryptomem/efficiency/budgeter.py +40 -0
- cryptomem-2026.6.1/cryptomem/efficiency/cache.py +32 -0
- cryptomem-2026.6.1/cryptomem/efficiency/compressor.py +38 -0
- cryptomem-2026.6.1/cryptomem/efficiency/deduper.py +25 -0
- cryptomem-2026.6.1/cryptomem/embeddings/__init__.py +5 -0
- cryptomem-2026.6.1/cryptomem/embeddings/base.py +26 -0
- cryptomem-2026.6.1/cryptomem/embeddings/minilm.py +36 -0
- cryptomem-2026.6.1/cryptomem/embeddings/stub.py +31 -0
- cryptomem-2026.6.1/cryptomem/models.py +49 -0
- cryptomem-2026.6.1/cryptomem/proactive/__init__.py +6 -0
- cryptomem-2026.6.1/cryptomem/proactive/extractor.py +27 -0
- cryptomem-2026.6.1/cryptomem/proactive/planner.py +45 -0
- cryptomem-2026.6.1/cryptomem/proactive/triggers.py +59 -0
- cryptomem-2026.6.1/cryptomem/proactive/writeback.py +35 -0
- cryptomem-2026.6.1/cryptomem/py.typed +0 -0
- cryptomem-2026.6.1/cryptomem/retrieval/__init__.py +3 -0
- cryptomem-2026.6.1/cryptomem/retrieval/retriever.py +80 -0
- cryptomem-2026.6.1/cryptomem/server/__init__.py +3 -0
- cryptomem-2026.6.1/cryptomem/server/app.py +186 -0
- cryptomem-2026.6.1/cryptomem/store/__init__.py +6 -0
- cryptomem-2026.6.1/cryptomem/store/base.py +29 -0
- cryptomem-2026.6.1/cryptomem/store/neo4j_store.py +156 -0
- cryptomem-2026.6.1/cryptomem/store/remote_store.py +74 -0
- cryptomem-2026.6.1/cryptomem/store/sqlite_store.py +119 -0
- cryptomem-2026.6.1/cryptomem/verification/__init__.py +15 -0
- cryptomem-2026.6.1/cryptomem/verification/citations.py +51 -0
- cryptomem-2026.6.1/cryptomem/verification/cove.py +51 -0
- cryptomem-2026.6.1/cryptomem/verification/entropy.py +65 -0
- cryptomem-2026.6.1/cryptomem/verification/faithfulness.py +47 -0
- cryptomem-2026.6.1/cryptomem/verification/grounding.py +26 -0
- cryptomem-2026.6.1/pyproject.toml +61 -0
- cryptomem-2026.6.1/tests/__init__.py +0 -0
- cryptomem-2026.6.1/tests/conftest.py +13 -0
- cryptomem-2026.6.1/tests/test_adapters.py +31 -0
- cryptomem-2026.6.1/tests/test_crypto.py +51 -0
- cryptomem-2026.6.1/tests/test_efficiency.py +60 -0
- cryptomem-2026.6.1/tests/test_enterprise.py +92 -0
- cryptomem-2026.6.1/tests/test_integration.py +55 -0
- cryptomem-2026.6.1/tests/test_neo4j_store.py +165 -0
- cryptomem-2026.6.1/tests/test_proactive.py +60 -0
- cryptomem-2026.6.1/tests/test_retrieval.py +34 -0
- cryptomem-2026.6.1/tests/test_server.py +137 -0
- cryptomem-2026.6.1/tests/test_store.py +68 -0
- cryptomem-2026.6.1/tests/test_verification.py +71 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# ---- Python ----
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
env/
|
|
11
|
+
.mypy_cache/
|
|
12
|
+
.ruff_cache/
|
|
13
|
+
.pytest_cache/
|
|
14
|
+
.hypothesis/
|
|
15
|
+
.coverage
|
|
16
|
+
htmlcov/
|
|
17
|
+
*.so
|
|
18
|
+
|
|
19
|
+
# ---- Rust ----
|
|
20
|
+
/rust/target/
|
|
21
|
+
target/
|
|
22
|
+
**/*.rs.bk
|
|
23
|
+
Cargo.lock # library crate: keep unlocked (binaries may commit it)
|
|
24
|
+
|
|
25
|
+
# ---- cryptomem local data / models ----
|
|
26
|
+
*.sqlite
|
|
27
|
+
*.sqlite3
|
|
28
|
+
*.db
|
|
29
|
+
models/
|
|
30
|
+
.cache/
|
|
31
|
+
*.onnx
|
|
32
|
+
# Never commit private keys
|
|
33
|
+
*.key
|
|
34
|
+
*.pem
|
|
35
|
+
secrets/
|
|
36
|
+
.env
|
|
37
|
+
.env.*
|
|
38
|
+
|
|
39
|
+
# ---- Editors / OS ----
|
|
40
|
+
.idea/
|
|
41
|
+
.vscode/
|
|
42
|
+
*.swp
|
|
43
|
+
.DS_Store
|
|
44
|
+
Thumbs.db
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cryptomem
|
|
3
|
+
Version: 2026.6.1
|
|
4
|
+
Summary: Cryptographically verified, relational, persistent memory for AI agents.
|
|
5
|
+
Author: cryptomem contributors
|
|
6
|
+
License: MIT OR Apache-2.0
|
|
7
|
+
Keywords: agents,ai,cryptography,graphrag,memory,ollama
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Topic :: Security :: Cryptography
|
|
14
|
+
Requires-Python: >=3.10
|
|
15
|
+
Requires-Dist: httpx>=0.27
|
|
16
|
+
Requires-Dist: pydantic-settings>=2.2
|
|
17
|
+
Requires-Dist: pydantic>=2.6
|
|
18
|
+
Requires-Dist: pynacl>=1.5
|
|
19
|
+
Provides-Extra: dev
|
|
20
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
21
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
22
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
23
|
+
Requires-Dist: respx>=0.21; extra == 'dev'
|
|
24
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
25
|
+
Provides-Extra: local
|
|
26
|
+
Requires-Dist: onnxruntime>=1.17; extra == 'local'
|
|
27
|
+
Requires-Dist: sentence-transformers>=3.0; extra == 'local'
|
|
28
|
+
Provides-Extra: neo4j
|
|
29
|
+
Requires-Dist: neo4j>=5.14; extra == 'neo4j'
|
|
30
|
+
Provides-Extra: serve
|
|
31
|
+
Requires-Dist: fastapi>=0.110; extra == 'serve'
|
|
32
|
+
Requires-Dist: tiktoken>=0.7; extra == 'serve'
|
|
33
|
+
Requires-Dist: uvicorn>=0.29; extra == 'serve'
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
# cryptomem
|
|
37
|
+
|
|
38
|
+
Cryptographically verified, relational, persistent memory for AI agents.
|
|
39
|
+
|
|
40
|
+
This package is the Python engine. Every fact is SHA-256 hashed and Ed25519
|
|
41
|
+
signed at write time; at read time each node is re-verified, and tampered or
|
|
42
|
+
unsigned facts are dropped so the agent abstains rather than guessing.
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
from cryptomem import MemoryClient
|
|
46
|
+
|
|
47
|
+
mem = MemoryClient()
|
|
48
|
+
mem.archive("Project Phoenix", "Budget approved at $4.2M for FY26.")
|
|
49
|
+
|
|
50
|
+
for hit in mem.query("What budget did Project Phoenix get?"):
|
|
51
|
+
print(hit.node.content, hit.confidence)
|
|
52
|
+
|
|
53
|
+
print(mem.answer("What budget did Project Phoenix get?"))
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Runs on CPU-only hardware with zero model downloads via the default stub
|
|
57
|
+
embedder and in-memory SQLite store. See the repository `docs/` for the full
|
|
58
|
+
architecture and roadmap.
|
|
59
|
+
|
|
60
|
+
## Beyond retrieval
|
|
61
|
+
|
|
62
|
+
- `mem.respond(...)` — answer plus a provenance block (injected node ids,
|
|
63
|
+
verification status, Merkle root).
|
|
64
|
+
- `mem.proof(node_id)` — a verifiable Merkle **inclusion proof** against the
|
|
65
|
+
current ledger root.
|
|
66
|
+
- `mem.confidence(...)` — semantic-entropy confidence over sampled answers.
|
|
67
|
+
- `mem.verify_answer(draft)` — Chain-of-Verification re-check of a draft.
|
|
68
|
+
- `mem.contradictions()` — same-entity nodes whose content diverges.
|
|
69
|
+
- `mem.suggest(...)`, `mem.triggers()`, `mem.stage_facts(...)`,
|
|
70
|
+
`mem.pending()`, `mem.confirm(node_id)` — proactive planner, triggers, and
|
|
71
|
+
write-back of staged (pending) facts that you later confirm.
|
|
72
|
+
|
|
73
|
+
## Store backends
|
|
74
|
+
|
|
75
|
+
Selected via `CRYPTOMEM_MODE` (or `Settings(mode=...)`):
|
|
76
|
+
|
|
77
|
+
- **`sqlite`** (default) — zero-config local store; Python-side vector search.
|
|
78
|
+
- **`neo4j`** — graph-native store over the Bolt driver
|
|
79
|
+
(`pip install "cryptomem[neo4j]"`, `CRYPTOMEM_NEO4J_URI=...`).
|
|
80
|
+
- **`remote`** — signs locally and POSTs verbatim to a `/cmem/v1/*` backend
|
|
81
|
+
(`CRYPTOMEM_BACKEND_URL=...`); falls back to SQLite if the backend is down.
|
|
82
|
+
|
|
83
|
+
## Optional extras
|
|
84
|
+
|
|
85
|
+
`pip install "cryptomem[local]"` (MiniLM embeddings), `[serve]` (FastAPI
|
|
86
|
+
Ollama-compatible sidecar + CLI), `[neo4j]` (graph store), `[dev]` (tooling).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# cryptomem
|
|
2
|
+
|
|
3
|
+
Cryptographically verified, relational, persistent memory for AI agents.
|
|
4
|
+
|
|
5
|
+
This package is the Python engine. Every fact is SHA-256 hashed and Ed25519
|
|
6
|
+
signed at write time; at read time each node is re-verified, and tampered or
|
|
7
|
+
unsigned facts are dropped so the agent abstains rather than guessing.
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
from cryptomem import MemoryClient
|
|
11
|
+
|
|
12
|
+
mem = MemoryClient()
|
|
13
|
+
mem.archive("Project Phoenix", "Budget approved at $4.2M for FY26.")
|
|
14
|
+
|
|
15
|
+
for hit in mem.query("What budget did Project Phoenix get?"):
|
|
16
|
+
print(hit.node.content, hit.confidence)
|
|
17
|
+
|
|
18
|
+
print(mem.answer("What budget did Project Phoenix get?"))
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Runs on CPU-only hardware with zero model downloads via the default stub
|
|
22
|
+
embedder and in-memory SQLite store. See the repository `docs/` for the full
|
|
23
|
+
architecture and roadmap.
|
|
24
|
+
|
|
25
|
+
## Beyond retrieval
|
|
26
|
+
|
|
27
|
+
- `mem.respond(...)` — answer plus a provenance block (injected node ids,
|
|
28
|
+
verification status, Merkle root).
|
|
29
|
+
- `mem.proof(node_id)` — a verifiable Merkle **inclusion proof** against the
|
|
30
|
+
current ledger root.
|
|
31
|
+
- `mem.confidence(...)` — semantic-entropy confidence over sampled answers.
|
|
32
|
+
- `mem.verify_answer(draft)` — Chain-of-Verification re-check of a draft.
|
|
33
|
+
- `mem.contradictions()` — same-entity nodes whose content diverges.
|
|
34
|
+
- `mem.suggest(...)`, `mem.triggers()`, `mem.stage_facts(...)`,
|
|
35
|
+
`mem.pending()`, `mem.confirm(node_id)` — proactive planner, triggers, and
|
|
36
|
+
write-back of staged (pending) facts that you later confirm.
|
|
37
|
+
|
|
38
|
+
## Store backends
|
|
39
|
+
|
|
40
|
+
Selected via `CRYPTOMEM_MODE` (or `Settings(mode=...)`):
|
|
41
|
+
|
|
42
|
+
- **`sqlite`** (default) — zero-config local store; Python-side vector search.
|
|
43
|
+
- **`neo4j`** — graph-native store over the Bolt driver
|
|
44
|
+
(`pip install "cryptomem[neo4j]"`, `CRYPTOMEM_NEO4J_URI=...`).
|
|
45
|
+
- **`remote`** — signs locally and POSTs verbatim to a `/cmem/v1/*` backend
|
|
46
|
+
(`CRYPTOMEM_BACKEND_URL=...`); falls back to SQLite if the backend is down.
|
|
47
|
+
|
|
48
|
+
## Optional extras
|
|
49
|
+
|
|
50
|
+
`pip install "cryptomem[local]"` (MiniLM embeddings), `[serve]` (FastAPI
|
|
51
|
+
Ollama-compatible sidecar + CLI), `[neo4j]` (graph store), `[dev]` (tooling).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from cryptomem.adapters.mock_adapter import MockAdapter
|
|
2
|
+
from cryptomem.adapters.ollama_adapter import OllamaAdapter
|
|
3
|
+
from cryptomem.client import ABSTAIN, MemoryClient
|
|
4
|
+
from cryptomem.config import Settings
|
|
5
|
+
from cryptomem.embeddings.minilm import MiniLMEmbedder
|
|
6
|
+
from cryptomem.embeddings.stub import StubEmbedder
|
|
7
|
+
from cryptomem.models import (
|
|
8
|
+
Contradiction,
|
|
9
|
+
CryptoEnvelope,
|
|
10
|
+
MemoryNode,
|
|
11
|
+
Relationship,
|
|
12
|
+
ScoredNode,
|
|
13
|
+
)
|
|
14
|
+
from cryptomem.proactive import Planner, TriggerEngine, WriteBack
|
|
15
|
+
from cryptomem.store.remote_store import RemoteStore
|
|
16
|
+
from cryptomem.store.sqlite_store import SqliteStore
|
|
17
|
+
from cryptomem.verification import (
|
|
18
|
+
ChainOfVerification,
|
|
19
|
+
Citer,
|
|
20
|
+
FaithfulnessChecker,
|
|
21
|
+
GroundingGate,
|
|
22
|
+
SemanticEntropy,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
__version__ = "2026.06.1"
|
|
26
|
+
|
|
27
|
+
__all__ = [
|
|
28
|
+
"ABSTAIN",
|
|
29
|
+
"MemoryClient",
|
|
30
|
+
"Settings",
|
|
31
|
+
"MemoryNode",
|
|
32
|
+
"Relationship",
|
|
33
|
+
"CryptoEnvelope",
|
|
34
|
+
"ScoredNode",
|
|
35
|
+
"Contradiction",
|
|
36
|
+
"StubEmbedder",
|
|
37
|
+
"MiniLMEmbedder",
|
|
38
|
+
"MockAdapter",
|
|
39
|
+
"OllamaAdapter",
|
|
40
|
+
"GroundingGate",
|
|
41
|
+
"FaithfulnessChecker",
|
|
42
|
+
"Citer",
|
|
43
|
+
"SemanticEntropy",
|
|
44
|
+
"ChainOfVerification",
|
|
45
|
+
"Planner",
|
|
46
|
+
"TriggerEngine",
|
|
47
|
+
"WriteBack",
|
|
48
|
+
"SqliteStore",
|
|
49
|
+
"RemoteStore",
|
|
50
|
+
"__version__",
|
|
51
|
+
]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class LLMAdapter(ABC):
|
|
7
|
+
"""Uniform completion interface across model backends."""
|
|
8
|
+
|
|
9
|
+
@abstractmethod
|
|
10
|
+
def complete(self, prompt: str) -> str:
|
|
11
|
+
"""Return the model completion for ``prompt``."""
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from cryptomem.adapters.base import LLMAdapter
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class MockAdapter(LLMAdapter):
|
|
7
|
+
"""Model-free adapter for deterministic, offline development and tests.
|
|
8
|
+
|
|
9
|
+
Echoes the verified context it was handed so grounding and abstention can
|
|
10
|
+
be asserted without downloading or running any model.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def complete(self, prompt: str) -> str:
|
|
14
|
+
return f"[mock] grounded answer based on:\n{prompt.strip()}"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import httpx
|
|
4
|
+
|
|
5
|
+
from cryptomem.adapters.base import LLMAdapter
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class OllamaAdapter(LLMAdapter):
|
|
9
|
+
"""Completion adapter that forwards prompts to a local Ollama server.
|
|
10
|
+
|
|
11
|
+
Speaks Ollama's native ``/api/generate`` wire protocol with streaming
|
|
12
|
+
disabled, so it works against any stock Ollama install with zero config.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
base_url: str = "http://localhost:11434",
|
|
18
|
+
model: str = "qwen2.5:0.5b",
|
|
19
|
+
timeout: float = 60.0,
|
|
20
|
+
):
|
|
21
|
+
self.base_url = base_url.rstrip("/")
|
|
22
|
+
self.model = model
|
|
23
|
+
self._client = httpx.Client(base_url=self.base_url, timeout=timeout)
|
|
24
|
+
|
|
25
|
+
def complete(self, prompt: str) -> str:
|
|
26
|
+
resp = self._client.post(
|
|
27
|
+
"/api/generate",
|
|
28
|
+
json={"model": self.model, "prompt": prompt, "stream": False},
|
|
29
|
+
)
|
|
30
|
+
resp.raise_for_status()
|
|
31
|
+
return str(resp.json().get("response", ""))
|
|
32
|
+
|
|
33
|
+
def is_alive(self) -> bool:
|
|
34
|
+
"""Return ``True`` if the Ollama server answers ``GET /api/tags``."""
|
|
35
|
+
try:
|
|
36
|
+
return self._client.get("/api/tags").status_code == 200
|
|
37
|
+
except httpx.HTTPError:
|
|
38
|
+
return False
|
|
39
|
+
|
|
40
|
+
def close(self) -> None:
|
|
41
|
+
self._client.close()
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
|
|
5
|
+
from cryptomem import __version__
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def main(argv: list[str] | None = None) -> int:
|
|
9
|
+
"""Entry point for the ``cryptomem`` command."""
|
|
10
|
+
parser = argparse.ArgumentParser(prog="cryptomem", description="cryptomem CLI")
|
|
11
|
+
parser.add_argument("--version", action="version", version=f"cryptomem {__version__}")
|
|
12
|
+
sub = parser.add_subparsers(dest="command")
|
|
13
|
+
|
|
14
|
+
serve = sub.add_parser("serve", help="run the Ollama-compatible sidecar")
|
|
15
|
+
serve.add_argument("--host", default="127.0.0.1")
|
|
16
|
+
serve.add_argument("--port", type=int, default=8088)
|
|
17
|
+
serve.add_argument("--ollama-url", default="http://localhost:11434")
|
|
18
|
+
|
|
19
|
+
args = parser.parse_args(argv)
|
|
20
|
+
|
|
21
|
+
if args.command == "serve":
|
|
22
|
+
try:
|
|
23
|
+
import uvicorn
|
|
24
|
+
|
|
25
|
+
from cryptomem.server.app import create_app
|
|
26
|
+
except ImportError:
|
|
27
|
+
print("The sidecar needs the 'serve' extra: pip install 'cryptomem[serve]'")
|
|
28
|
+
return 1
|
|
29
|
+
app = create_app(ollama_url=args.ollama_url)
|
|
30
|
+
uvicorn.run(app, host=args.host, port=args.port)
|
|
31
|
+
return 0
|
|
32
|
+
|
|
33
|
+
parser.print_help()
|
|
34
|
+
return 0
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if __name__ == "__main__":
|
|
38
|
+
raise SystemExit(main())
|