@pentatonic-ai/ai-agent-sdk 0.9.6 → 0.10.1
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.
- package/README.md +3 -3
- package/bin/cli.js +1 -1
- package/bin/commands/config.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/packages/doctor/src/checks/local-memory.js +2 -2
- package/packages/memory/README.md +2 -2
- package/packages/memory/openclaw-plugin/README.md +2 -2
- package/packages/memory/openclaw-plugin/openclaw.plugin.json +1 -1
- package/packages/memory/src/server.js +2 -2
- package/packages/memory-engine-v2/.env.example +30 -0
- package/packages/memory-engine-v2/README.md +125 -0
- package/packages/memory-engine-v2/compat/Dockerfile +11 -0
- package/packages/memory-engine-v2/compat/requirements.txt +6 -0
- package/packages/memory-engine-v2/compat/server.py +1047 -0
- package/packages/memory-engine-v2/docker-compose.aws.yml +78 -0
- package/packages/memory-engine-v2/docker-compose.yml +206 -0
- package/packages/memory-engine-v2/extractor-async/Dockerfile +14 -0
- package/packages/memory-engine-v2/extractor-async/confidence.py +62 -0
- package/packages/memory-engine-v2/extractor-async/noise_filter.py +144 -0
- package/packages/memory-engine-v2/extractor-async/requirements.txt +2 -0
- package/packages/memory-engine-v2/extractor-async/test_confidence.py +76 -0
- package/packages/memory-engine-v2/extractor-async/test_noise_filter.py +177 -0
- package/packages/memory-engine-v2/extractor-async/worker.py +827 -0
- package/packages/memory-engine-v2/extractor-sync/Dockerfile +11 -0
- package/packages/memory-engine-v2/extractor-sync/requirements.txt +4 -0
- package/packages/memory-engine-v2/extractor-sync/server.py +424 -0
- package/packages/memory-engine-v2/org-model/migrations/001_init.sql +390 -0
- package/packages/memory-engine-v2/tests/e2e_smoke.py +356 -0
- package/packages/memory-engine-v2/tests/fixtures/generate_synthetic_corpus.py +758 -0
- package/packages/memory-engine/.env.example +0 -13
- package/packages/memory-engine/MIGRATION.md +0 -219
- package/packages/memory-engine/README.md +0 -145
- package/packages/memory-engine/bench/README.md +0 -99
- package/packages/memory-engine/bench/scorecards-engine/agent-coding__pentatonic-baseline__20260427-142523.json +0 -1115
- package/packages/memory-engine/bench/scorecards-engine/chat-recall__pentatonic-baseline__20260427-142648.json +0 -819
- package/packages/memory-engine/bench/scorecards-engine/circular-economy__pentatonic-baseline__20260427-142757.json +0 -1278
- package/packages/memory-engine/bench/scorecards-engine/customer-support__pentatonic-baseline__20260427-142900.json +0 -1018
- package/packages/memory-engine/bench/scorecards-engine/marketplace-ops__pentatonic-baseline__20260427-142957.json +0 -1038
- package/packages/memory-engine/bench/scorecards-engine/product-catalogue__pentatonic-baseline__20260427-143122.json +0 -961
- package/packages/memory-engine/bench/scorecards-engine-via-docker/agent-coding__pentatonic-memory__20260427-161812.json +0 -1115
- package/packages/memory-engine/bench/scorecards-engine-via-docker/chat-recall__pentatonic-memory__20260427-161701.json +0 -819
- package/packages/memory-engine/bench/scorecards-engine-via-docker/circular-economy__pentatonic-memory__20260427-161713.json +0 -1278
- package/packages/memory-engine/bench/scorecards-engine-via-docker/customer-support__pentatonic-memory__20260427-161723.json +0 -1018
- package/packages/memory-engine/bench/scorecards-engine-via-docker/marketplace-ops__pentatonic-memory__20260427-161732.json +0 -1038
- package/packages/memory-engine/bench/scorecards-engine-via-docker/product-catalogue__pentatonic-memory__20260427-161741.json +0 -937
- package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/agent-coding__pentatonic-memory__20260427-184718.json +0 -1115
- package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/chat-recall__pentatonic-memory__20260427-184614.json +0 -819
- package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/circular-economy__pentatonic-memory__20260427-184809.json +0 -1278
- package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/customer-support__pentatonic-memory__20260427-184854.json +0 -1018
- package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/marketplace-ops__pentatonic-memory__20260427-184929.json +0 -1038
- package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/product-catalogue__pentatonic-memory__20260427-185015.json +0 -961
- package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/agent-coding__pentatonic-memory__20260427-175252.json +0 -1115
- package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/chat-recall__pentatonic-memory__20260427-175312.json +0 -819
- package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/circular-economy__pentatonic-memory__20260427-175335.json +0 -1278
- package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/customer-support__pentatonic-memory__20260427-175355.json +0 -1018
- package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/marketplace-ops__pentatonic-memory__20260427-175413.json +0 -1038
- package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/product-catalogue__pentatonic-memory__20260427-175430.json +0 -883
- package/packages/memory-engine/bench/scorecards-engine-via-shim/agent-coding__pentatonic-memory__20260427-155409.json +0 -1115
- package/packages/memory-engine/bench/scorecards-engine-via-shim/chat-recall__pentatonic-memory__20260427-155421.json +0 -819
- package/packages/memory-engine/bench/scorecards-engine-via-shim/circular-economy__pentatonic-memory__20260427-155433.json +0 -1278
- package/packages/memory-engine/bench/scorecards-engine-via-shim/customer-support__pentatonic-memory__20260427-155443.json +0 -1018
- package/packages/memory-engine/bench/scorecards-engine-via-shim/marketplace-ops__pentatonic-memory__20260427-155453.json +0 -1038
- package/packages/memory-engine/bench/scorecards-engine-via-shim/product-catalogue__pentatonic-memory__20260427-155503.json +0 -937
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/agent-coding__pentatonic-memory-latest__20260427-145103.json +0 -1115
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/agent-coding__pentatonic-memory__20260427-144909.json +0 -1115
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/chat-recall__pentatonic-memory-latest__20260427-145153.json +0 -819
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/chat-recall__pentatonic-memory__20260427-145120.json +0 -542
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/circular-economy__pentatonic-memory-latest__20260427-145313.json +0 -1278
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/circular-economy__pentatonic-memory__20260427-145207.json +0 -894
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/customer-support__pentatonic-memory-latest__20260427-145412.json +0 -1018
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/customer-support__pentatonic-memory__20260427-145327.json +0 -680
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/marketplace-ops__pentatonic-memory-latest__20260427-145517.json +0 -1038
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/marketplace-ops__pentatonic-memory__20260427-145422.json +0 -693
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/product-catalogue__pentatonic-memory-latest__20260427-145616.json +0 -961
- package/packages/memory-engine/bench/scorecards-pentatonic-baseline/product-catalogue__pentatonic-memory__20260427-145528.json +0 -727
- package/packages/memory-engine/compat/Dockerfile +0 -22
- package/packages/memory-engine/compat/server.py +0 -1255
- package/packages/memory-engine/docker-compose.test.yml +0 -59
- package/packages/memory-engine/docker-compose.yml +0 -255
- package/packages/memory-engine/engine/README.md +0 -52
- package/packages/memory-engine/engine/l2-hybridrag-proxy.py +0 -1543
- package/packages/memory-engine/engine/l5-comms-layer.py +0 -663
- package/packages/memory-engine/engine/l6-document-store.py +0 -1018
- package/packages/memory-engine/engine/services/_shared/__init__.py +0 -1
- package/packages/memory-engine/engine/services/_shared/embed_provider.py +0 -562
- package/packages/memory-engine/engine/services/l2/Dockerfile +0 -50
- package/packages/memory-engine/engine/services/l2/init_databases.py +0 -81
- package/packages/memory-engine/engine/services/l2/l2-hybridrag-proxy.py +0 -2721
- package/packages/memory-engine/engine/services/l5/Dockerfile +0 -11
- package/packages/memory-engine/engine/services/l5/l5-comms-layer.py +0 -808
- package/packages/memory-engine/engine/services/l6/Dockerfile +0 -30
- package/packages/memory-engine/engine/services/l6/l6-document-store.py +0 -1221
- package/packages/memory-engine/engine/services/nv-embed/Dockerfile +0 -28
- package/packages/memory-engine/engine/services/nv-embed/server.py +0 -152
- package/packages/memory-engine/pme_memory/__init__.py +0 -0
- package/packages/memory-engine/pme_memory/__main__.py +0 -129
- package/packages/memory-engine/pme_memory/artifacts.py +0 -95
- package/packages/memory-engine/pme_memory/embed.py +0 -74
- package/packages/memory-engine/pme_memory/health.py +0 -36
- package/packages/memory-engine/pme_memory/hygiene.py +0 -159
- package/packages/memory-engine/pme_memory/indexer.py +0 -200
- package/packages/memory-engine/pme_memory/needs.py +0 -55
- package/packages/memory-engine/pme_memory/provenance.py +0 -80
- package/packages/memory-engine/pme_memory/scoring.py +0 -168
- package/packages/memory-engine/pme_memory/search.py +0 -52
- package/packages/memory-engine/pme_memory/store.py +0 -86
- package/packages/memory-engine/pme_memory/synthesis.py +0 -114
- package/packages/memory-engine/pyproject.toml +0 -65
- package/packages/memory-engine/scripts/kg-extractor.py +0 -557
- package/packages/memory-engine/scripts/kg-preflexor-v2.py +0 -738
- package/packages/memory-engine/scripts/wipe-legacy-l3-entities.py +0 -128
- package/packages/memory-engine/tests/e2e_arena.sh +0 -259
- package/packages/memory-engine/tests/embed_stub/Dockerfile +0 -13
- package/packages/memory-engine/tests/embed_stub/server.py +0 -80
- package/packages/memory-engine/tests/test_aggregate.py +0 -333
- package/packages/memory-engine/tests/test_api_contract.sh +0 -57
- package/packages/memory-engine/tests/test_arena_safety.py +0 -232
- package/packages/memory-engine/tests/test_channel_stat_reader.py +0 -437
- package/packages/memory-engine/tests/test_channel_stat_rollups.py +0 -308
- package/packages/memory-engine/tests/test_compat_nv_embed_probe.py +0 -48
- package/packages/memory-engine/tests/test_embed_provider.py +0 -693
- package/packages/memory-engine/tests/test_l2_qmd_vec_search.py +0 -280
- package/packages/memory-engine/tests/test_l3_arena_isolation.py +0 -412
- package/packages/memory-engine/tests/test_l6_module_load.py +0 -84
- package/packages/memory-engine/tests/test_people_list_reader.py +0 -432
package/README.md
CHANGED
|
@@ -114,7 +114,7 @@ sudo systemctl restart ollama
|
|
|
114
114
|
|
|
115
115
|
```bash
|
|
116
116
|
git clone https://github.com/Pentatonic-Ltd/ai-agent-sdk.git
|
|
117
|
-
cd ai-agent-sdk/packages/memory-engine
|
|
117
|
+
cd ai-agent-sdk/packages/memory-engine-v2
|
|
118
118
|
|
|
119
119
|
# Default .env points at Ollama on the host. Edit if your Ollama is
|
|
120
120
|
# elsewhere or you want to use a higher-quality model (e.g. mxbai-embed-large
|
|
@@ -238,7 +238,7 @@ await adapter.init();
|
|
|
238
238
|
await adapter.ingestChunk('User prefers dark mode', { kind: 'note' });
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
-
For raw `/search` and `/store`, just `fetch()` against `${engineUrl}/search` etc. The wire format is documented in `packages/memory-engine/MIGRATION.md`.
|
|
241
|
+
For raw `/search` and `/store`, just `fetch()` against `${engineUrl}/search` etc. The wire format is documented in `packages/memory-engine-v2/MIGRATION.md`.
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
@@ -504,7 +504,7 @@ const { content, model, usage, toolCalls } = normalizeResponse(openaiResponse);
|
|
|
504
504
|
|
|
505
505
|
Thin HTTP client for the memory engine. `config = { engineUrl, arena, apiKey? }`. Returns `{ ingestChunk(content, metadata), deleteByCorpusFile(repoAbs, relPath), init() }`. See [Use as a library](#use-as-a-library).
|
|
506
506
|
|
|
507
|
-
For raw `/store` / `/search` calls, just `fetch()` against `${engineUrl}` directly — the wire format is documented in `packages/memory-engine/MIGRATION.md`.
|
|
507
|
+
For raw `/store` / `/search` calls, just `fetch()` against `${engineUrl}` directly — the wire format is documented in `packages/memory-engine-v2/MIGRATION.md`.
|
|
508
508
|
|
|
509
509
|
---
|
|
510
510
|
|
package/bin/cli.js
CHANGED
|
@@ -78,7 +78,7 @@ function ask(question) {
|
|
|
78
78
|
// in favour of:
|
|
79
79
|
// - `tes config local` → writes the plugin config + prints engine
|
|
80
80
|
// bring-up instructions
|
|
81
|
-
// - `cd packages/memory-engine && docker compose up -d` → runs the
|
|
81
|
+
// - `cd packages/memory-engine-v2 && docker compose up -d` → runs the
|
|
82
82
|
// actual engine
|
|
83
83
|
// `ask` is kept for any future interactive prompts.
|
|
84
84
|
|
package/bin/commands/config.js
CHANGED
|
@@ -131,7 +131,7 @@ async function runConfigLocal(opts) {
|
|
|
131
131
|
log("");
|
|
132
132
|
log(" 2. Bring up the engine docker stack:");
|
|
133
133
|
log("");
|
|
134
|
-
log(" cd packages/memory-engine");
|
|
134
|
+
log(" cd packages/memory-engine-v2");
|
|
135
135
|
log(" cp .env.example .env # if no .env yet");
|
|
136
136
|
log(" # edit .env if you want a different embedding model/dim");
|
|
137
137
|
log(" docker compose up -d --scale nv-embed=0");
|
package/dist/index.cjs
CHANGED
|
@@ -878,7 +878,7 @@ function fireAndForgetEmit(clientConfig, sessionOpts, messages, result, model) {
|
|
|
878
878
|
}
|
|
879
879
|
|
|
880
880
|
// src/telemetry.js
|
|
881
|
-
var VERSION = "0.
|
|
881
|
+
var VERSION = "0.10.1";
|
|
882
882
|
var TELEMETRY_URL = "https://sdk-telemetry.philip-134.workers.dev";
|
|
883
883
|
function machineId() {
|
|
884
884
|
const raw = typeof process !== "undefined" ? `${process.env?.USER || process.env?.USERNAME || "u"}:${process.platform || "x"}:${process.arch || "x"}` : "browser";
|
package/dist/index.js
CHANGED
|
@@ -847,7 +847,7 @@ function fireAndForgetEmit(clientConfig, sessionOpts, messages, result, model) {
|
|
|
847
847
|
}
|
|
848
848
|
|
|
849
849
|
// src/telemetry.js
|
|
850
|
-
var VERSION = "0.
|
|
850
|
+
var VERSION = "0.10.1";
|
|
851
851
|
var TELEMETRY_URL = "https://sdk-telemetry.philip-134.workers.dev";
|
|
852
852
|
function machineId() {
|
|
853
853
|
const raw = typeof process !== "undefined" ? `${process.env?.USER || process.env?.USERNAME || "u"}:${process.platform || "x"}:${process.arch || "x"}` : "browser";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pentatonic-ai/ai-agent-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "TES SDK — LLM observability and lifecycle tracking via Pentatonic Thing Event System. Track token usage, tool calls, and conversations. Manage things through event-sourced lifecycle stages with AI enrichment and vector search.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"src",
|
|
28
28
|
"bin",
|
|
29
29
|
"packages/memory",
|
|
30
|
-
"packages/memory-engine",
|
|
30
|
+
"packages/memory-engine-v2",
|
|
31
31
|
"packages/doctor",
|
|
32
32
|
"build.js",
|
|
33
33
|
"README.md",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Local memory engine checks.
|
|
3
3
|
*
|
|
4
4
|
* Targets the engine stack started by:
|
|
5
|
-
* cd packages/memory-engine && docker compose up -d
|
|
5
|
+
* cd packages/memory-engine-v2 && docker compose up -d
|
|
6
6
|
*
|
|
7
7
|
* The engine exposes a compat HTTP shim on port 8099 (or whatever
|
|
8
8
|
* memory_url is set to in the user's plugin config). All checks are
|
|
@@ -202,7 +202,7 @@ function checkEmbeddingPath() {
|
|
|
202
202
|
}
|
|
203
203
|
return {
|
|
204
204
|
ok: false,
|
|
205
|
-
msg: `nv_embed=${nv} — L4/L5/L6 indexing will fail. Check NV_EMBED_URL in packages/memory-engine/.env`,
|
|
205
|
+
msg: `nv_embed=${nv} — L4/L5/L6 indexing will fail. Check NV_EMBED_URL in packages/memory-engine-v2/.env`,
|
|
206
206
|
detail: { nv_embed: nv },
|
|
207
207
|
};
|
|
208
208
|
} catch (err) {
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
>
|
|
5
5
|
> This package is the **legacy** single-process MCP server backed by
|
|
6
6
|
> PostgreSQL + pgvector + Ollama. It's superseded by the **7-layer
|
|
7
|
-
> memory engine** at [`packages/memory-engine/`](../memory-engine/),
|
|
7
|
+
> memory engine** at [`packages/memory-engine-v2/`](../memory-engine/),
|
|
8
8
|
> which is what the top-level SDK README walks users into and what
|
|
9
9
|
> TES production runs.
|
|
10
10
|
>
|
|
11
|
-
> | | This package (legacy) | `packages/memory-engine/` (current) |
|
|
11
|
+
> | | This package (legacy) | `packages/memory-engine-v2/` (current) |
|
|
12
12
|
> |---|---|---|
|
|
13
13
|
> | Wire | MCP over stdio | HTTP (`/store`, `/search`, ...) |
|
|
14
14
|
> | Storage | One Postgres table, one embedding | 7 layers fused via RRF |
|
|
@@ -7,7 +7,7 @@ Persistent, searchable memory for OpenClaw. Local (Docker + Ollama) or hosted (P
|
|
|
7
7
|
> The `database_url` / `embedding_url` / `llm_url` config fields shown
|
|
8
8
|
> in this README configure the **legacy** `packages/memory/` Postgres+
|
|
9
9
|
> Ollama+pgvector MCP server, which is being retired in favour of the
|
|
10
|
-
> 7-layer memory engine at `packages/memory-engine/`. Both backends
|
|
10
|
+
> 7-layer memory engine at `packages/memory-engine-v2/`. Both backends
|
|
11
11
|
> still work; the legacy one will be removed in v1.0.
|
|
12
12
|
>
|
|
13
13
|
> **For new installs, prefer:**
|
|
@@ -23,7 +23,7 @@ Persistent, searchable memory for OpenClaw. Local (Docker + Ollama) or hosted (P
|
|
|
23
23
|
> ```
|
|
24
24
|
>
|
|
25
25
|
> …with the engine brought up via `docker compose up -d` from
|
|
26
|
-
> `packages/memory-engine/`. See the
|
|
26
|
+
> `packages/memory-engine-v2/`. See the
|
|
27
27
|
> [top-level SDK README](../../../README.md#local-self-hosted) for the
|
|
28
28
|
> walkthrough.
|
|
29
29
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"memory_url": {
|
|
18
18
|
"type": "string",
|
|
19
19
|
"default": "http://localhost:8099",
|
|
20
|
-
"description": "Memory engine HTTP URL (local mode). Default 8099 = packages/memory-engine compat shim. (3333 was the legacy single-process MCP server port — deprecated.)"
|
|
20
|
+
"description": "Memory engine HTTP URL (local mode). Default 8099 = packages/memory-engine-v2 compat shim. (3333 was the legacy single-process MCP server port — deprecated.)"
|
|
21
21
|
},
|
|
22
22
|
"database_url": {
|
|
23
23
|
"type": "string",
|
|
@@ -42,14 +42,14 @@ process.on("unhandledRejection", (err) => {
|
|
|
42
42
|
|
|
43
43
|
// Deprecation notice — see packages/memory/README.md for context.
|
|
44
44
|
// This MCP server (Postgres+pgvector+Ollama, single-process) is being
|
|
45
|
-
// retired in favour of the 7-layer engine at packages/memory-engine/.
|
|
45
|
+
// retired in favour of the 7-layer engine at packages/memory-engine-v2/.
|
|
46
46
|
// Targeted for removal in v1.0; in the meantime everything keeps
|
|
47
47
|
// working. Print once on startup so operators see the signal in logs
|
|
48
48
|
// without flooding the conversation surface.
|
|
49
49
|
if (process.env.PENTATONIC_DEPRECATION_QUIET !== "1") {
|
|
50
50
|
process.stderr.write(
|
|
51
51
|
"[memory-server] DEPRECATED: this server (Postgres+pgvector+Ollama MCP) " +
|
|
52
|
-
"is superseded by the 7-layer memory engine at packages/memory-engine/. " +
|
|
52
|
+
"is superseded by the 7-layer memory engine at packages/memory-engine-v2/. " +
|
|
53
53
|
"Existing deployments keep working; removal targeted for v1.0. " +
|
|
54
54
|
"See README → Memory → Local for the migration path. " +
|
|
55
55
|
"Suppress this warning with PENTATONIC_DEPRECATION_QUIET=1.\n"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# pentatonic-memory-engine v2 environment.
|
|
2
|
+
# Copy to .env on the engine box; never commit a populated copy.
|
|
3
|
+
|
|
4
|
+
# --- Embed gateway (same as v1) -----------------------------------
|
|
5
|
+
NV_EMBED_URL=https://lambda-gateway.pentatonic.com/v1/embed
|
|
6
|
+
PENTATONIC_AI_GATEWAY_KEY=<rotate-on-deploy>
|
|
7
|
+
NV_EMBED_PROVIDER=pentatonic-gateway
|
|
8
|
+
|
|
9
|
+
# --- Postgres (org-model) -----------------------------------------
|
|
10
|
+
PME_V2_PG_USER=pme
|
|
11
|
+
PME_V2_PG_PASSWORD=<random-strong-password>
|
|
12
|
+
PME_V2_PG_DB=org_model
|
|
13
|
+
PME_V2_PG_DSN=postgresql://pme:<password>@org-model:5432/org_model
|
|
14
|
+
|
|
15
|
+
# --- Ports (host-side) --------------------------------------------
|
|
16
|
+
# v1 runs on 8099; if you want v2 alongside, give it a different port
|
|
17
|
+
# until the cutover. Compose maps these to internal 8099 / 5432 / 6333.
|
|
18
|
+
PME_V2_COMPAT_PORT=8199 # v2 alongside v1
|
|
19
|
+
PME_V2_ORG_MODEL_PORT=15433
|
|
20
|
+
PME_V2_QDRANT_HTTP_PORT=16335
|
|
21
|
+
PME_V2_QDRANT_GRPC_PORT=16336
|
|
22
|
+
|
|
23
|
+
# --- Embedding dimension ------------------------------------------
|
|
24
|
+
PME_V2_EMBED_DIM=4096
|
|
25
|
+
|
|
26
|
+
# --- Cloudflared (optional, only set if exposing v2 publicly) -----
|
|
27
|
+
# TUNNEL_TOKEN_V2=<cut-a-new-tunnel-or-reuse-v1>
|
|
28
|
+
|
|
29
|
+
# --- LLM endpoint (extractor-async; stub mode if empty) -----------
|
|
30
|
+
# PME_V2_LLM_ENDPOINT=https://lambda-gateway.pentatonic.com/v1/chat/completions
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# pentatonic-memory-engine v2
|
|
2
|
+
|
|
3
|
+
Keystone-first rebuild. Three stores, not seven. Wire-compatible with
|
|
4
|
+
v1's compat shim so TES can flip via a single env var.
|
|
5
|
+
|
|
6
|
+
## Status
|
|
7
|
+
|
|
8
|
+
- Infrastructure scaffolded (this directory)
|
|
9
|
+
- Not yet released to npm; not yet CI'd
|
|
10
|
+
- Currently deployed to AWS engine box at `/opt/engine-v2` via rsync
|
|
11
|
+
- Real LLM extraction (extractor-async) stubbed pending keystone spec
|
|
12
|
+
(#285 extraction-objectives.md)
|
|
13
|
+
|
|
14
|
+
## Layout
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
packages/memory-engine-v2/
|
|
18
|
+
docker-compose.yml # 5 services: org-model, vector-index,
|
|
19
|
+
# extractor-sync, extractor-async, compat
|
|
20
|
+
docker-compose.aws.yml # AWS overlay (bind-mount volumes, prod env)
|
|
21
|
+
compat/ # FastAPI v1-wire-compatible shim
|
|
22
|
+
Dockerfile + server.py + requirements.txt
|
|
23
|
+
extractor-sync/ # Deterministic per-source extraction
|
|
24
|
+
Dockerfile + server.py + requirements.txt
|
|
25
|
+
extractor-async/ # LLM distillation worker (stub for now)
|
|
26
|
+
Dockerfile + worker.py + requirements.txt
|
|
27
|
+
org-model/migrations/ # Postgres schema
|
|
28
|
+
001_init.sql # Initial schema with provenance cols
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## What's in here vs v1
|
|
32
|
+
|
|
33
|
+
| v1 has | v2 has | Notes |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| L0 (sqlite FTS5) inside L2 | not yet — falls back to vector-only on /search | Keyword fallback comes once the typed router lands |
|
|
36
|
+
| L2 HybridRAG proxy | compat shim does the routing | Single shim, no separate proxy service |
|
|
37
|
+
| L3 Neo4j knowledge graph | recursive-CTE on org-model (pending spike #278) | If quality acceptable, Neo4j retires entirely |
|
|
38
|
+
| L4 sqlite-vec sidecar | gone | Already removed in SDK PR #51 |
|
|
39
|
+
| L4 QMD (vectors as JSON text in SQLite) | gone | Replaced by Qdrant + content-hash IDs |
|
|
40
|
+
| L5 Milvus chats | folded into Qdrant via source_kind=chat | One vector store, payload-filtered |
|
|
41
|
+
| L6 Milvus doc-store | folded into Qdrant via source_kind=doc | Same |
|
|
42
|
+
| Compat shim | compat (same wire contract) | Same external surface, totally new internals |
|
|
43
|
+
| nv-embed service | external (NV_EMBED_URL points at GH200) | Same as v1's AWS deploy |
|
|
44
|
+
| HyDE per query | gone | Confidence-gated query rewrite if needed later |
|
|
45
|
+
|
|
46
|
+
## Deploy (AWS engine box, via rsync — no CI)
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# From SDK repo on your laptop:
|
|
50
|
+
rsync -av --delete \
|
|
51
|
+
packages/memory-engine-v2/ \
|
|
52
|
+
ubuntu@<engine-host>:/opt/engine-v2/
|
|
53
|
+
|
|
54
|
+
# On the box:
|
|
55
|
+
ssh ubuntu@<engine-host>
|
|
56
|
+
cd /opt/engine-v2
|
|
57
|
+
# CRITICAL: production deploys MUST include `-f docker-compose.aws.yml`.
|
|
58
|
+
# The base `docker-compose.yml` uses named docker volumes (anonymous,
|
|
59
|
+
# project-scoped). The AWS overlay re-points those to bind mounts under
|
|
60
|
+
# `/var/lib/pme-v2/<service>` — that's where the actual production data
|
|
61
|
+
# lives. Omitting the overlay creates fresh empty volumes and effectively
|
|
62
|
+
# "hides" the real data until the overlay is re-applied. The data is not
|
|
63
|
+
# lost; the container just mounts the wrong path.
|
|
64
|
+
sudo docker compose --env-file .env \
|
|
65
|
+
-f docker-compose.yml -f docker-compose.aws.yml \
|
|
66
|
+
up -d --build
|
|
67
|
+
|
|
68
|
+
# Verify:
|
|
69
|
+
curl http://localhost:8099/health # cheap liveness
|
|
70
|
+
curl http://localhost:8099/health/deep # round-trips all stores
|
|
71
|
+
|
|
72
|
+
# Single-service redeploy (e.g. just rebuild extractor-async after a
|
|
73
|
+
# code change). --no-deps avoids touching other healthy services.
|
|
74
|
+
# Same overlay rule applies here.
|
|
75
|
+
sudo docker compose --env-file .env \
|
|
76
|
+
-f docker-compose.yml -f docker-compose.aws.yml \
|
|
77
|
+
up -d --no-deps --build extractor-async
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Required env vars (set in `.env` next to the compose file):
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
NV_EMBED_URL=https://lambda-gateway.pentatonic.com/v1/embed
|
|
84
|
+
PENTATONIC_AI_GATEWAY_KEY=<the key>
|
|
85
|
+
NV_EMBED_PROVIDER=pentatonic-gateway
|
|
86
|
+
PME_V2_PG_PASSWORD=<random>
|
|
87
|
+
PME_V2_PG_DSN=postgresql://pme:<password>@org-model:5432/org_model
|
|
88
|
+
|
|
89
|
+
# Optional:
|
|
90
|
+
PME_V2_LLM_ENDPOINT=https://lambda-gateway.pentatonic.com/v1/chat/completions
|
|
91
|
+
PME_V2_COMPAT_PORT=8099 # match v1 so the env-var flip is one line
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Cutover from v1 → v2
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# On TES wrangler secrets:
|
|
98
|
+
wrangler pages secret put MEMORY_ENGINE_URL --project-name <project>
|
|
99
|
+
# Enter: https://memory-engine-v2.thingeventsystem.ai (or whichever
|
|
100
|
+
# cloudflared tunnel hostname routes to v2's compat:8099)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Then v1's containers can be stopped:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
cd /opt/engine
|
|
107
|
+
sudo docker compose stop l2 l3 l5 l6 compat
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Roll back by reverting the wrangler secret.
|
|
111
|
+
|
|
112
|
+
## Open work (not in this scaffold)
|
|
113
|
+
|
|
114
|
+
1. **Keystone (PR #285)** — extraction-objectives.md. Per-source typed
|
|
115
|
+
schemas, κ / false-omission bars. Drives the real extractor-async
|
|
116
|
+
prompts. Until this lands, extractor-async is a stub that drains
|
|
117
|
+
the queue at no-op speed.
|
|
118
|
+
2. **Typed router** in /search — intent classify → org-model and/or
|
|
119
|
+
vector-index → fuse. Currently /search is vector-only.
|
|
120
|
+
3. **BM25 fallback** — sqlite FTS5 service or inline in compat.
|
|
121
|
+
4. **Graph spike (#278)** — recursive-CTE personFacets/peopleList over
|
|
122
|
+
org-model. Outcome decides whether Neo4j retires.
|
|
123
|
+
5. **Memory-proxy Worker** (separate from v2) — removes the public
|
|
124
|
+
tunnel surface. Design doc at
|
|
125
|
+
`thing-event-system/modules/pentatonic-memory/proxy/DESIGN.md`.
|