@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.
Files changed (127) hide show
  1. package/README.md +3 -3
  2. package/bin/cli.js +1 -1
  3. package/bin/commands/config.js +1 -1
  4. package/dist/index.cjs +1 -1
  5. package/dist/index.js +1 -1
  6. package/package.json +2 -2
  7. package/packages/doctor/src/checks/local-memory.js +2 -2
  8. package/packages/memory/README.md +2 -2
  9. package/packages/memory/openclaw-plugin/README.md +2 -2
  10. package/packages/memory/openclaw-plugin/openclaw.plugin.json +1 -1
  11. package/packages/memory/src/server.js +2 -2
  12. package/packages/memory-engine-v2/.env.example +30 -0
  13. package/packages/memory-engine-v2/README.md +125 -0
  14. package/packages/memory-engine-v2/compat/Dockerfile +11 -0
  15. package/packages/memory-engine-v2/compat/requirements.txt +6 -0
  16. package/packages/memory-engine-v2/compat/server.py +1047 -0
  17. package/packages/memory-engine-v2/docker-compose.aws.yml +78 -0
  18. package/packages/memory-engine-v2/docker-compose.yml +206 -0
  19. package/packages/memory-engine-v2/extractor-async/Dockerfile +14 -0
  20. package/packages/memory-engine-v2/extractor-async/confidence.py +62 -0
  21. package/packages/memory-engine-v2/extractor-async/noise_filter.py +144 -0
  22. package/packages/memory-engine-v2/extractor-async/requirements.txt +2 -0
  23. package/packages/memory-engine-v2/extractor-async/test_confidence.py +76 -0
  24. package/packages/memory-engine-v2/extractor-async/test_noise_filter.py +177 -0
  25. package/packages/memory-engine-v2/extractor-async/worker.py +827 -0
  26. package/packages/memory-engine-v2/extractor-sync/Dockerfile +11 -0
  27. package/packages/memory-engine-v2/extractor-sync/requirements.txt +4 -0
  28. package/packages/memory-engine-v2/extractor-sync/server.py +424 -0
  29. package/packages/memory-engine-v2/org-model/migrations/001_init.sql +390 -0
  30. package/packages/memory-engine-v2/tests/e2e_smoke.py +356 -0
  31. package/packages/memory-engine-v2/tests/fixtures/generate_synthetic_corpus.py +758 -0
  32. package/packages/memory-engine/.env.example +0 -13
  33. package/packages/memory-engine/MIGRATION.md +0 -219
  34. package/packages/memory-engine/README.md +0 -145
  35. package/packages/memory-engine/bench/README.md +0 -99
  36. package/packages/memory-engine/bench/scorecards-engine/agent-coding__pentatonic-baseline__20260427-142523.json +0 -1115
  37. package/packages/memory-engine/bench/scorecards-engine/chat-recall__pentatonic-baseline__20260427-142648.json +0 -819
  38. package/packages/memory-engine/bench/scorecards-engine/circular-economy__pentatonic-baseline__20260427-142757.json +0 -1278
  39. package/packages/memory-engine/bench/scorecards-engine/customer-support__pentatonic-baseline__20260427-142900.json +0 -1018
  40. package/packages/memory-engine/bench/scorecards-engine/marketplace-ops__pentatonic-baseline__20260427-142957.json +0 -1038
  41. package/packages/memory-engine/bench/scorecards-engine/product-catalogue__pentatonic-baseline__20260427-143122.json +0 -961
  42. package/packages/memory-engine/bench/scorecards-engine-via-docker/agent-coding__pentatonic-memory__20260427-161812.json +0 -1115
  43. package/packages/memory-engine/bench/scorecards-engine-via-docker/chat-recall__pentatonic-memory__20260427-161701.json +0 -819
  44. package/packages/memory-engine/bench/scorecards-engine-via-docker/circular-economy__pentatonic-memory__20260427-161713.json +0 -1278
  45. package/packages/memory-engine/bench/scorecards-engine-via-docker/customer-support__pentatonic-memory__20260427-161723.json +0 -1018
  46. package/packages/memory-engine/bench/scorecards-engine-via-docker/marketplace-ops__pentatonic-memory__20260427-161732.json +0 -1038
  47. package/packages/memory-engine/bench/scorecards-engine-via-docker/product-catalogue__pentatonic-memory__20260427-161741.json +0 -937
  48. package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/agent-coding__pentatonic-memory__20260427-184718.json +0 -1115
  49. package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/chat-recall__pentatonic-memory__20260427-184614.json +0 -819
  50. package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/circular-economy__pentatonic-memory__20260427-184809.json +0 -1278
  51. package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/customer-support__pentatonic-memory__20260427-184854.json +0 -1018
  52. package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/marketplace-ops__pentatonic-memory__20260427-184929.json +0 -1038
  53. package/packages/memory-engine/bench/scorecards-engine-via-l2-7-layer-populated/product-catalogue__pentatonic-memory__20260427-185015.json +0 -961
  54. package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/agent-coding__pentatonic-memory__20260427-175252.json +0 -1115
  55. package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/chat-recall__pentatonic-memory__20260427-175312.json +0 -819
  56. package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/circular-economy__pentatonic-memory__20260427-175335.json +0 -1278
  57. package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/customer-support__pentatonic-memory__20260427-175355.json +0 -1018
  58. package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/marketplace-ops__pentatonic-memory__20260427-175413.json +0 -1038
  59. package/packages/memory-engine/bench/scorecards-engine-via-l2-empty-layers/product-catalogue__pentatonic-memory__20260427-175430.json +0 -883
  60. package/packages/memory-engine/bench/scorecards-engine-via-shim/agent-coding__pentatonic-memory__20260427-155409.json +0 -1115
  61. package/packages/memory-engine/bench/scorecards-engine-via-shim/chat-recall__pentatonic-memory__20260427-155421.json +0 -819
  62. package/packages/memory-engine/bench/scorecards-engine-via-shim/circular-economy__pentatonic-memory__20260427-155433.json +0 -1278
  63. package/packages/memory-engine/bench/scorecards-engine-via-shim/customer-support__pentatonic-memory__20260427-155443.json +0 -1018
  64. package/packages/memory-engine/bench/scorecards-engine-via-shim/marketplace-ops__pentatonic-memory__20260427-155453.json +0 -1038
  65. package/packages/memory-engine/bench/scorecards-engine-via-shim/product-catalogue__pentatonic-memory__20260427-155503.json +0 -937
  66. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/agent-coding__pentatonic-memory-latest__20260427-145103.json +0 -1115
  67. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/agent-coding__pentatonic-memory__20260427-144909.json +0 -1115
  68. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/chat-recall__pentatonic-memory-latest__20260427-145153.json +0 -819
  69. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/chat-recall__pentatonic-memory__20260427-145120.json +0 -542
  70. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/circular-economy__pentatonic-memory-latest__20260427-145313.json +0 -1278
  71. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/circular-economy__pentatonic-memory__20260427-145207.json +0 -894
  72. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/customer-support__pentatonic-memory-latest__20260427-145412.json +0 -1018
  73. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/customer-support__pentatonic-memory__20260427-145327.json +0 -680
  74. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/marketplace-ops__pentatonic-memory-latest__20260427-145517.json +0 -1038
  75. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/marketplace-ops__pentatonic-memory__20260427-145422.json +0 -693
  76. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/product-catalogue__pentatonic-memory-latest__20260427-145616.json +0 -961
  77. package/packages/memory-engine/bench/scorecards-pentatonic-baseline/product-catalogue__pentatonic-memory__20260427-145528.json +0 -727
  78. package/packages/memory-engine/compat/Dockerfile +0 -22
  79. package/packages/memory-engine/compat/server.py +0 -1255
  80. package/packages/memory-engine/docker-compose.test.yml +0 -59
  81. package/packages/memory-engine/docker-compose.yml +0 -255
  82. package/packages/memory-engine/engine/README.md +0 -52
  83. package/packages/memory-engine/engine/l2-hybridrag-proxy.py +0 -1543
  84. package/packages/memory-engine/engine/l5-comms-layer.py +0 -663
  85. package/packages/memory-engine/engine/l6-document-store.py +0 -1018
  86. package/packages/memory-engine/engine/services/_shared/__init__.py +0 -1
  87. package/packages/memory-engine/engine/services/_shared/embed_provider.py +0 -562
  88. package/packages/memory-engine/engine/services/l2/Dockerfile +0 -50
  89. package/packages/memory-engine/engine/services/l2/init_databases.py +0 -81
  90. package/packages/memory-engine/engine/services/l2/l2-hybridrag-proxy.py +0 -2721
  91. package/packages/memory-engine/engine/services/l5/Dockerfile +0 -11
  92. package/packages/memory-engine/engine/services/l5/l5-comms-layer.py +0 -808
  93. package/packages/memory-engine/engine/services/l6/Dockerfile +0 -30
  94. package/packages/memory-engine/engine/services/l6/l6-document-store.py +0 -1221
  95. package/packages/memory-engine/engine/services/nv-embed/Dockerfile +0 -28
  96. package/packages/memory-engine/engine/services/nv-embed/server.py +0 -152
  97. package/packages/memory-engine/pme_memory/__init__.py +0 -0
  98. package/packages/memory-engine/pme_memory/__main__.py +0 -129
  99. package/packages/memory-engine/pme_memory/artifacts.py +0 -95
  100. package/packages/memory-engine/pme_memory/embed.py +0 -74
  101. package/packages/memory-engine/pme_memory/health.py +0 -36
  102. package/packages/memory-engine/pme_memory/hygiene.py +0 -159
  103. package/packages/memory-engine/pme_memory/indexer.py +0 -200
  104. package/packages/memory-engine/pme_memory/needs.py +0 -55
  105. package/packages/memory-engine/pme_memory/provenance.py +0 -80
  106. package/packages/memory-engine/pme_memory/scoring.py +0 -168
  107. package/packages/memory-engine/pme_memory/search.py +0 -52
  108. package/packages/memory-engine/pme_memory/store.py +0 -86
  109. package/packages/memory-engine/pme_memory/synthesis.py +0 -114
  110. package/packages/memory-engine/pyproject.toml +0 -65
  111. package/packages/memory-engine/scripts/kg-extractor.py +0 -557
  112. package/packages/memory-engine/scripts/kg-preflexor-v2.py +0 -738
  113. package/packages/memory-engine/scripts/wipe-legacy-l3-entities.py +0 -128
  114. package/packages/memory-engine/tests/e2e_arena.sh +0 -259
  115. package/packages/memory-engine/tests/embed_stub/Dockerfile +0 -13
  116. package/packages/memory-engine/tests/embed_stub/server.py +0 -80
  117. package/packages/memory-engine/tests/test_aggregate.py +0 -333
  118. package/packages/memory-engine/tests/test_api_contract.sh +0 -57
  119. package/packages/memory-engine/tests/test_arena_safety.py +0 -232
  120. package/packages/memory-engine/tests/test_channel_stat_reader.py +0 -437
  121. package/packages/memory-engine/tests/test_channel_stat_rollups.py +0 -308
  122. package/packages/memory-engine/tests/test_compat_nv_embed_probe.py +0 -48
  123. package/packages/memory-engine/tests/test_embed_provider.py +0 -693
  124. package/packages/memory-engine/tests/test_l2_qmd_vec_search.py +0 -280
  125. package/packages/memory-engine/tests/test_l3_arena_isolation.py +0 -412
  126. package/packages/memory-engine/tests/test_l6_module_load.py +0 -84
  127. 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
 
@@ -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.9.6";
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.9.6";
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.9.6",
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`.
@@ -0,0 +1,11 @@
1
+ FROM python:3.12-slim
2
+
3
+ WORKDIR /app
4
+
5
+ COPY requirements.txt .
6
+ RUN pip install --no-cache-dir -r requirements.txt
7
+
8
+ COPY server.py .
9
+
10
+ EXPOSE 8099
11
+ CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8099", "--workers", "4"]
@@ -0,0 +1,6 @@
1
+ fastapi==0.115.0
2
+ uvicorn[standard]==0.32.0
3
+ psycopg[binary,pool]==3.2.3
4
+ httpx==0.27.2
5
+ qdrant-client==1.12.1
6
+ pydantic==2.9.2