@pentatonic-ai/ai-agent-sdk 0.9.6 → 0.10.0

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 +797 -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
@@ -1,59 +0,0 @@
1
- # docker-compose.test.yml — overlay for hermetic CI runs.
2
- #
3
- # Replaces the nv-embed GPU service with a deterministic embedding
4
- # stub that mimics both the OpenAI /v1/embeddings shape and the
5
- # lambda-gateway /v1/embed shape. Lets CI exercise every layer's
6
- # vector path without an actual model.
7
- #
8
- # Usage:
9
- # docker compose -f docker-compose.yml -f docker-compose.test.yml \
10
- # up -d --wait l3 l4 l5 l6 l2 compat embed-stub
11
- #
12
- # The base nv-embed service is intentionally NOT started in CI
13
- # (requires a GPU). l4/l5/l6 are pointed at embed-stub via env.
14
-
15
- services:
16
- embed-stub:
17
- build:
18
- context: ./tests/embed_stub
19
- dockerfile: Dockerfile
20
- container_name: pme-embed-stub
21
- networks:
22
- - engine-net
23
- environment:
24
- EMBED_DIM: "4096"
25
- healthcheck:
26
- test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8041/health',timeout=3)"]
27
- interval: 5s
28
- timeout: 3s
29
- retries: 20
30
- start_period: 5s
31
-
32
- # Pin the embedding dim explicitly across layers, independent of any
33
- # developer-local .env (which may set EMBED_DIM=768 for Ollama-based
34
- # local dev). The stub returns 4096; layers must agree.
35
- l5:
36
- environment:
37
- L5_NV_EMBED_URL: http://embed-stub:8041/v1/embeddings
38
- L5_EMBED_API_KEY: ""
39
- L5_EMBED_DIM: "4096"
40
-
41
- l6:
42
- environment:
43
- L6_NV_EMBED_URL: http://embed-stub:8041/v1/embeddings
44
- L6_EMBED_API_KEY: ""
45
- L6_EMBED_DIM: "4096"
46
-
47
- l2:
48
- environment:
49
- PME_NV_EMBED_URL: http://embed-stub:8041/v1/embeddings
50
-
51
- compat:
52
- environment:
53
- NV_EMBED_URL: http://embed-stub:8041/v1/embeddings
54
- depends_on:
55
- embed-stub:
56
- condition: service_healthy
57
- l2: { condition: service_started }
58
- l5: { condition: service_started }
59
- l6: { condition: service_started }
@@ -1,255 +0,0 @@
1
- name: pentatonic-memory-engine
2
-
3
- # pentatonic-memory-engine v0.1
4
- #
5
- # Drop-in HTTP-compatible replacement for `pentatonic-memory` v0.5,
6
- # backed by the 7-layer hybrid retrieval engine.
7
- #
8
- # Bring up: docker compose up -d
9
- # API surface: http://localhost:8099 (matches pentatonic-memory v0.5)
10
- # Health: curl http://localhost:8099/health
11
- #
12
- # Layers:
13
- # l0 (in-process) — BM25 over SQLite FTS5 (inside L2 + L6)
14
- # l1 (in-process) — Always-loaded core files (inside L2)
15
- # l2 :8031 — HybridRAG proxy (RRF fusion)
16
- # l3 :7474 — Knowledge Graph (Neo4j Community)
17
- # l4 :8042 — sqlite-vec vector index
18
- # l5 :8034 — Milvus comms layer
19
- # l6 :8037 — Document store + cross-encoder reranker
20
- # compat :8099 — pentatonic-memory v0.5 API translation shim
21
- #
22
- # nv-embed :8041 — NV-Embed-v2 4096d embedding service
23
- #
24
- # The nv-embed service requires a GPU. If running without GPU,
25
- # override NV_EMBED_URL to point at an external embedding endpoint:
26
- # - OpenAI's /v1/embeddings (text-embedding-3-large)
27
- # - the Pentatonic AI Gateway
28
- # - any OpenAI-compat embedding endpoint
29
-
30
- x-engine-base: &engine-base
31
- restart: unless-stopped
32
- networks:
33
- - engine-net
34
-
35
- services:
36
- # --------------------------------------------------------------------
37
- # NV-Embed-v2 — 4096-dim embedding service (GPU required)
38
- # --------------------------------------------------------------------
39
- nv-embed:
40
- <<: *engine-base
41
- build:
42
- context: ./engine/services/nv-embed
43
- dockerfile: Dockerfile
44
- container_name: pme-nv-embed
45
- ports: ["127.0.0.1:${PME_NV_EMBED_PORT:-8041}:8041"]
46
- volumes:
47
- - pme-nv-embed-cache:/cache
48
- deploy:
49
- resources:
50
- reservations:
51
- devices:
52
- - driver: nvidia
53
- count: 1
54
- capabilities: [gpu]
55
- healthcheck:
56
- test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8041/health',timeout=3)"]
57
- interval: 15s
58
- timeout: 10s
59
- retries: 20
60
- start_period: 120s
61
-
62
- # --------------------------------------------------------------------
63
- # L3 — Knowledge Graph (Neo4j Community)
64
- # --------------------------------------------------------------------
65
- l3:
66
- <<: *engine-base
67
- image: neo4j:5-community
68
- container_name: pme-l3
69
- ports:
70
- - "127.0.0.1:${PME_L3_HTTP_PORT:-7475}:7474" # HTTP browser
71
- - "127.0.0.1:${PME_L3_BOLT_PORT:-7688}:7687" # bolt protocol
72
- environment:
73
- NEO4J_AUTH: ${NEO4J_AUTH:-neo4j/local-dev-pw}
74
- NEO4J_PLUGINS: '["apoc"]'
75
- # Heap defaults were 512m hardcoded — fine for an empty dev
76
- # graph, catastrophic at production scale. A 2026-05-14 prod
77
- # incident on a ~10M-relationship KG saw L3 sit at >600% CPU
78
- # locked in parallel GC, blocking the L2 write fan-out and
79
- # triggering cascading 5xx through L6 and the embed gateway.
80
- # The graph fit in RAM fine; the JVM just had nowhere to put
81
- # short-lived allocations.
82
- #
83
- # Defaults now sized for a small-but-realistic local graph
84
- # (~1M relationships): 1g heap + 256m initial + 512m pagecache.
85
- # Production deployments override via PME_L3_HEAP_MAX etc.
86
- # (the AWS overlay sets 4g/1g/1g — see thing-event-system
87
- # modules/pentatonic-memory/deploy/docker-compose.aws.yml).
88
- NEO4J_dbms_memory_heap_max__size: ${PME_L3_HEAP_MAX:-1g}
89
- NEO4J_dbms_memory_heap_initial__size: ${PME_L3_HEAP_INITIAL:-256m}
90
- NEO4J_dbms_memory_pagecache_size: ${PME_L3_PAGECACHE:-512m}
91
- volumes:
92
- - pme-l3-data:/data
93
- healthcheck:
94
- test: ["CMD-SHELL", "wget -qO- http://localhost:7474 >/dev/null 2>&1 || exit 1"]
95
- interval: 10s
96
- timeout: 5s
97
- retries: 30
98
- start_period: 30s
99
-
100
- # --------------------------------------------------------------------
101
- # L5 — Qdrant comms layer
102
- # --------------------------------------------------------------------
103
- l5:
104
- <<: *engine-base
105
- build:
106
- context: ./engine/services
107
- dockerfile: l5/Dockerfile
108
- container_name: pme-l5
109
- # Default 18034 to avoid port collisions on 8034.
110
- # Override via PME_L5_PORT for bench setups that intentionally replace it.
111
- ports: ["127.0.0.1:${PME_L5_PORT:-18034}:8034"]
112
- environment:
113
- L5_NV_EMBED_URL: ${NV_EMBED_URL:-http://host.docker.internal:8041/v1/embeddings}
114
- L5_EMBED_MODEL: ${EMBED_MODEL_NAME:-nv-embed-v2}
115
- L5_EMBED_API_KEY: ${EMBED_API_KEY:-}
116
- L5_EMBED_PROVIDER: ${EMBED_PROVIDER:-openai}
117
- L5_EMBED_AUTODETECT: ${EMBED_AUTODETECT:-true}
118
- L5_EMBED_DIM: ${EMBED_DIM:-4096}
119
- L5_OLLAMA_DIM: ${OLLAMA_DIM:-768}
120
- L5_OLLAMA_EMBED_URL: ${L5_OLLAMA_EMBED_URL:-http://host.docker.internal:11434/api/embed}
121
- L5_OLLAMA_EMBED_MODEL: ${L5_OLLAMA_EMBED_MODEL:-nomic-embed-text}
122
- L5_DB_PATH: /data/comms.db
123
- PME_WORKSPACE: /data/workspace
124
- extra_hosts:
125
- - "host.docker.internal:host-gateway"
126
- volumes:
127
- - pme-l5-data:/data
128
-
129
- # --------------------------------------------------------------------
130
- # L6 — Document store + cross-encoder reranker
131
- # --------------------------------------------------------------------
132
- l6:
133
- <<: *engine-base
134
- build:
135
- context: ./engine/services
136
- dockerfile: l6/Dockerfile
137
- container_name: pme-l6
138
- # Default 18037 to avoid colliding with Spark Core L6 doc-store on 8037.
139
- # Override via PME_L6_PORT for bench setups that intentionally replace it.
140
- ports: ["127.0.0.1:${PME_L6_PORT:-18037}:8037"]
141
- environment:
142
- L6_NV_EMBED_URL: ${NV_EMBED_URL:-http://host.docker.internal:8041/v1/embeddings}
143
- L6_EMBED_MODEL: ${EMBED_MODEL_NAME:-nv-embed-v2}
144
- L6_EMBED_API_KEY: ${EMBED_API_KEY:-}
145
- L6_EMBED_PROVIDER: ${EMBED_PROVIDER:-openai}
146
- L6_EMBED_AUTODETECT: ${EMBED_AUTODETECT:-true}
147
- L6_EMBED_DIM: ${EMBED_DIM:-4096}
148
- L6_DATA_DIR: /data
149
- extra_hosts:
150
- - "host.docker.internal:host-gateway"
151
- volumes:
152
- - pme-l6-data:/data
153
-
154
- # --------------------------------------------------------------------
155
- # L2 — HybridRAG orchestrator (RRF fusion across all layers)
156
- # --------------------------------------------------------------------
157
- l2:
158
- <<: *engine-base
159
- build:
160
- context: ./engine/services
161
- dockerfile: l2/Dockerfile
162
- container_name: pme-l2
163
- ports: ["127.0.0.1:${PME_L2_PORT:-8131}:8031"]
164
- environment:
165
- PME_NV_EMBED_URL: ${NV_EMBED_URL:-http://host.docker.internal:8041/v1/embeddings}
166
- PME_EMBED_API_KEY: ${EMBED_API_KEY:-}
167
- PME_EMBED_PROVIDER: ${EMBED_PROVIDER:-openai}
168
- PME_EMBED_AUTODETECT: ${EMBED_AUTODETECT:-true}
169
- PME_NV_EMBED_MODEL: ${EMBED_MODEL_NAME:-nv-embed-v2}
170
- PME_NEO4J_URI: bolt://l3:7687
171
- PME_NEO4J_PASSWORD: ${NEO4J_PASSWORD:-local-dev-pw}
172
- NEO4J_PASSWORD: ${NEO4J_PASSWORD:-local-dev-pw}
173
- PME_L5_URL: http://l5:8034
174
- PME_L6_URL: http://l6:8037
175
- # HyDE off (deliberate — hurts precision on retrieval-graded benches)
176
- PME_HYDE_ENABLED: "false"
177
- # Cross-encoder reranker on (boosts top-K precision)
178
- PME_RERANK_ENABLED: "true"
179
- PME_WORKSPACE: /data/workspace
180
- PME_QMD_DB: /data/qmd.sqlite
181
- PME_MEMORY_DB: /data/workspace.db
182
- extra_hosts:
183
- - "host.docker.internal:host-gateway"
184
- volumes:
185
- - pme-l2-data:/data
186
- depends_on:
187
- l3: { condition: service_healthy }
188
- l5: { condition: service_started }
189
- l6: { condition: service_started }
190
-
191
- # --------------------------------------------------------------------
192
- # Compat shim — exposes pentatonic-memory v0.5 API on :8099
193
- #
194
- # Now routes /search through the L2 7-layer proxy by default. L6-only
195
- # bypass (BYPASS_L2_PROXY=1) is still available for isolated testing.
196
- # --------------------------------------------------------------------
197
- compat:
198
- <<: *engine-base
199
- build:
200
- # Build context is the memory-engine root so the Dockerfile can
201
- # COPY both compat/server.py and engine/services/_shared (shared
202
- # EmbedClient for /store-batch dedup).
203
- context: .
204
- dockerfile: compat/Dockerfile
205
- container_name: pme-compat
206
- ports:
207
- - "127.0.0.1:${PME_PORT:-8099}:8099"
208
- environment:
209
- L0_URL: http://l2:8031
210
- L2_PROXY_URL: http://l2:8031
211
- L3_KG_URL: http://l3:7474
212
- L5_MILVUS_URL: http://l5:8034
213
- L6_DOC_URL: http://l6:8037
214
- NV_EMBED_URL: ${NV_EMBED_URL:-http://host.docker.internal:8041/v1/embeddings}
215
- # PME_ prefix vars feed the shim's EmbedClient for shared-embed
216
- # mode on /store-batch (one embed call across all 3 indexers vs
217
- # 3 redundant calls). Match the L2 config block so both clients
218
- # hit the same gateway with the same model. Set
219
- # PME_SHARE_EMBEDDINGS=false to revert to per-layer embedding.
220
- PME_NV_EMBED_URL: ${NV_EMBED_URL:-http://host.docker.internal:8041/v1/embeddings}
221
- PME_EMBED_API_KEY: ${EMBED_API_KEY:-}
222
- PME_EMBED_PROVIDER: ${EMBED_PROVIDER:-openai}
223
- PME_EMBED_AUTODETECT: ${EMBED_AUTODETECT:-true}
224
- PME_NV_EMBED_MODEL: ${EMBED_MODEL_NAME:-nv-embed-v2}
225
- PME_SHARE_EMBEDDINGS: ${PME_SHARE_EMBEDDINGS:-true}
226
- BYPASS_L2_PROXY: ${BYPASS_L2_PROXY:-0}
227
- extra_hosts:
228
- - "host.docker.internal:host-gateway"
229
- depends_on:
230
- l2: { condition: service_started }
231
- l5: { condition: service_started }
232
- l6: { condition: service_started }
233
- healthcheck:
234
- test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8099/health',timeout=3)"]
235
- interval: 10s
236
- timeout: 5s
237
- retries: 30
238
- # 180s gives L2 enough time to finish Neo4j schema + index creation
239
- # on a cold start before compat's healthcheck starts counting failures.
240
- # Observed concretely on the v0.9.4 deploy (2026-05-14): L2 took
241
- # ~90s to warm up; with start_period: 60s, compat went unhealthy
242
- # mid-startup, cloudflared's `depends_on: condition: service_healthy`
243
- # failed, and `docker compose up` errored out before wait_for_health
244
- # could observe the eventual recovery.
245
- start_period: 180s
246
-
247
- networks:
248
- engine-net:
249
-
250
- volumes:
251
- pme-nv-embed-cache:
252
- pme-l2-data:
253
- pme-l3-data:
254
- pme-l5-data:
255
- pme-l6-data:
@@ -1,52 +0,0 @@
1
- # engine/
2
-
3
- Bundled engine layers for the Pentatonic Memory Engine.
4
-
5
- | File | Layer | LOC | Purpose |
6
- |---|---|---|---|
7
- | `l2-hybridrag-proxy.py` | L2 | ~1.5k | RRF fusion across all layers, exposed on `:8031` |
8
- | `l5-comms-layer.py` | L5 | ~0.7k | Milvus comms layer for chat/email/contact/memory collections, exposed on `:8034` |
9
- | `l6-document-store.py` | L6 | ~1.5k | Document store + cross-encoder reranker, exposed on `:8037` |
10
- | `services/nv-embed/server.py` | — | ~150 | NV-Embed-v2 4096-dim embedding service, exposed on `:8041` |
11
-
12
- ## pme_memory SDK
13
-
14
- The `pme_memory/` package at the repo root is an installable Python SDK for the L5 communications layer. It provides:
15
-
16
- - **store.py** — Milvus client and collection management (chats, emails, contacts, memory)
17
- - **search.py** — Semantic search across collections
18
- - **embed.py** — Dual-stack embedding (NV-Embed-v2 primary, Ollama fallback)
19
- - **indexer.py** — Data ingestion pipeline (JSONL chats, email archives, contacts, memory files)
20
- - **scoring.py** — Pressure scoring for need signals (recency, novelty, centrality, priority)
21
- - **synthesis.py** — Deterministic multi-parent artifact merge
22
- - **artifacts.py** — Append-only artifact DAG store (JSONL)
23
- - **hygiene.py** — DAG maintenance (dedup, conflict detection, orphan pruning)
24
- - **health.py** — L5 health check
25
- - **needs.py** — Need signal indexing
26
- - **provenance.py** — Lineage visualization
27
-
28
- Install: `pip install -e ".[full]"` — CLI: `pme-memory health|stats|index|search|serve`
29
-
30
- ## KG Extraction Scripts
31
-
32
- The `scripts/` directory contains Knowledge Graph population tools:
33
-
34
- - **kg-extractor.py** — spaCy + regex entity/relationship extraction from memory files → Neo4j
35
- - **kg-preflexor-v2.py** — 2-pass concurrent LLM-based extraction via Ollama (14 structured entity types + native graph discovery)
36
-
37
- ## Where L0, L3 and the embedding service live
38
-
39
- - **L0 BM25** — provided by SQLite FTS5; the L2 proxy queries it directly via `sqlite3`. No separate service binary.
40
- - **L3 Knowledge Graph** — provided by Neo4j Community (free, OSS) running in a sibling container. The proxy queries it via the bolt protocol on `:7687`.
41
- - **NV-Embed-v2 embedding service** — see `services/nv-embed/` for the Docker context. Exposes the OpenAI-compatible `/v1/embeddings` endpoint on `:8041`.
42
-
43
- ## Dependencies
44
-
45
- Each service has its own `requirements.txt` in `services/<layer>/`. Common heavy deps:
46
-
47
- - `pymilvus>=2.6.12` (L5)
48
- - `sentence-transformers` (L6 reranker, NV-Embed)
49
- - `httpx`, `fastapi`, `uvicorn` (all)
50
- - `spacy` (L6 entity extraction)
51
-
52
- NV-Embed needs Torch + the model weights (auto-downloaded on first run from Hugging Face).