@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.
- 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 +797 -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
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""Tests for noise_filter — entity-name junk drop list.
|
|
2
|
+
|
|
3
|
+
Cases anchored to live-data audit of pentatonic-team (2026-05-25).
|
|
4
|
+
Every reject case below corresponds to a real entity row we found
|
|
5
|
+
in production org_model that should never have been there.
|
|
6
|
+
|
|
7
|
+
Run: pytest packages/memory-engine-v2/extractor-async/test_noise_filter.py
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from noise_filter import is_noise_entity_name
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# --------------------------------------------------------------------
|
|
16
|
+
# Reject cases — these landed in prod and should never recur
|
|
17
|
+
# --------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TestPronounsAreDropped:
|
|
21
|
+
"""First-person + second-person pronouns the LLM treats as entities."""
|
|
22
|
+
|
|
23
|
+
def test_first_person_singular(self):
|
|
24
|
+
for name in ("i", "I", "me", "Me", "my", "myself"):
|
|
25
|
+
assert is_noise_entity_name("person", name), name
|
|
26
|
+
|
|
27
|
+
def test_second_person(self):
|
|
28
|
+
for name in ("you", "You", "your", "yourself"):
|
|
29
|
+
assert is_noise_entity_name("person", name), name
|
|
30
|
+
|
|
31
|
+
def test_first_person_plural(self):
|
|
32
|
+
for name in ("we", "We", "us", "ourselves"):
|
|
33
|
+
assert is_noise_entity_name("person", name), name
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class TestGenericReferentsAreDropped:
|
|
37
|
+
"""LLM fallbacks when there's no real proper noun in scope."""
|
|
38
|
+
|
|
39
|
+
def test_agent_and_user_referents(self):
|
|
40
|
+
for name in ("agent", "the user", "User", "Speaker", "the speaker"):
|
|
41
|
+
assert is_noise_entity_name("person", name), name
|
|
42
|
+
|
|
43
|
+
def test_descriptive_phrases(self):
|
|
44
|
+
# Live-data examples: "the guy who wrote it", "both of you".
|
|
45
|
+
# Anything lowercased with >=4 tokens.
|
|
46
|
+
for name in ("the guy who wrote it", "both of you and me"):
|
|
47
|
+
assert is_noise_entity_name("person", name), name
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class TestTailscaleHostnamesAreDropped:
|
|
51
|
+
"""Tailscale hosts that leak from agent scratchpads."""
|
|
52
|
+
|
|
53
|
+
def test_classic_pin_dev_office(self):
|
|
54
|
+
# Live-data example.
|
|
55
|
+
assert is_noise_entity_name(
|
|
56
|
+
"other", "pin-dev-office-01.tail4aaf0c.ts.net"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
def test_other_ts_net_shapes(self):
|
|
60
|
+
for name in (
|
|
61
|
+
"laptop-mossop.tail123.ts.net",
|
|
62
|
+
"MyMachine.TS.net", # case-insensitive
|
|
63
|
+
):
|
|
64
|
+
assert is_noise_entity_name("other", name), name
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class TestFilesystemPathsAreDropped:
|
|
68
|
+
"""File paths the LLM extracts from agent output."""
|
|
69
|
+
|
|
70
|
+
def test_absolute_unix_paths(self):
|
|
71
|
+
for name in (
|
|
72
|
+
"/Users/admin/cursor/Pip",
|
|
73
|
+
"/etc/passwd",
|
|
74
|
+
"/opt/engine-v2",
|
|
75
|
+
):
|
|
76
|
+
assert is_noise_entity_name("other", name), name
|
|
77
|
+
|
|
78
|
+
def test_repo_relative_paths(self):
|
|
79
|
+
for name in (
|
|
80
|
+
"src/memory-engine/compat/server.py",
|
|
81
|
+
"packages/memory/src/engine.js",
|
|
82
|
+
):
|
|
83
|
+
assert is_noise_entity_name("other", name), name
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class TestAgentWorktreeLabelsAreDropped:
|
|
87
|
+
"""Parallel-agent orchestrator labels that leak into transcripts."""
|
|
88
|
+
|
|
89
|
+
def test_agent_letter_em_dash_label(self):
|
|
90
|
+
for name in (
|
|
91
|
+
"Agent A — L2 provenance taint",
|
|
92
|
+
"Agent B - cross-user dispatcher",
|
|
93
|
+
"Agent C – memory engine",
|
|
94
|
+
):
|
|
95
|
+
assert is_noise_entity_name("person", name), name
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class TestSingleCharIsDropped:
|
|
99
|
+
"""Single-char strings are never useful as entities."""
|
|
100
|
+
|
|
101
|
+
def test_single_char_letters(self):
|
|
102
|
+
for name in ("a", "I", "x", "."):
|
|
103
|
+
assert is_noise_entity_name("person", name), name
|
|
104
|
+
|
|
105
|
+
def test_empty_or_whitespace(self):
|
|
106
|
+
for name in ("", " ", "\t\n"):
|
|
107
|
+
assert is_noise_entity_name("person", name), name
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class TestLowercasePersonsAreDropped:
|
|
111
|
+
"""Person entities without any capital letter are almost always
|
|
112
|
+
junk descriptive phrases, not real names. Exception: anything
|
|
113
|
+
containing '@' (an email signal) is allowed."""
|
|
114
|
+
|
|
115
|
+
def test_lowercase_person_dropped(self):
|
|
116
|
+
for name in ("someone", "anyone", "the boss"):
|
|
117
|
+
assert is_noise_entity_name("person", name), name
|
|
118
|
+
|
|
119
|
+
def test_lowercase_email_kept(self):
|
|
120
|
+
# An email is a strong real-entity signal even when lower-case.
|
|
121
|
+
assert not is_noise_entity_name("person", "philip@pentatonic.com")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# --------------------------------------------------------------------
|
|
125
|
+
# Accept cases — real entities that must NOT be dropped
|
|
126
|
+
# --------------------------------------------------------------------
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class TestRealPeopleAreKept:
|
|
130
|
+
def test_proper_names(self):
|
|
131
|
+
for name in (
|
|
132
|
+
"Philip Mossop",
|
|
133
|
+
"Phil H",
|
|
134
|
+
"Chris Wheeler",
|
|
135
|
+
"Yan Manka",
|
|
136
|
+
"Raakkel Sims",
|
|
137
|
+
):
|
|
138
|
+
assert not is_noise_entity_name("person", name), name
|
|
139
|
+
|
|
140
|
+
def test_single_first_name(self):
|
|
141
|
+
# "Yan" is a real name — single-token title-cased entities
|
|
142
|
+
# are common in conversational extraction.
|
|
143
|
+
for name in ("Yan", "Jamie", "Philip"):
|
|
144
|
+
assert not is_noise_entity_name("person", name), name
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class TestRealCompaniesAreKept:
|
|
148
|
+
def test_brand_names(self):
|
|
149
|
+
for name in (
|
|
150
|
+
"Mastercard",
|
|
151
|
+
"Samsung",
|
|
152
|
+
"Investec",
|
|
153
|
+
"BGI Worldwide",
|
|
154
|
+
"Bethnal Green Ventures",
|
|
155
|
+
):
|
|
156
|
+
assert not is_noise_entity_name("company", name), name
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class TestShortConceptsAreKept:
|
|
160
|
+
def test_two_char_acronyms(self):
|
|
161
|
+
# "AI", "ML", "QA" are legitimate concepts.
|
|
162
|
+
for name in ("AI", "ML", "QA", "VR", "AR"):
|
|
163
|
+
assert not is_noise_entity_name("concept", name), name
|
|
164
|
+
|
|
165
|
+
def test_capitalised_acronyms(self):
|
|
166
|
+
for name in ("OpenHands", "TES", "SaaS", "API", "JSON"):
|
|
167
|
+
assert not is_noise_entity_name("concept", name), name
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class TestNonStringInput:
|
|
171
|
+
"""Defensive: the upstream might hand us None or a number."""
|
|
172
|
+
|
|
173
|
+
def test_none_drops(self):
|
|
174
|
+
assert is_noise_entity_name("person", None) # type: ignore[arg-type]
|
|
175
|
+
|
|
176
|
+
def test_number_drops(self):
|
|
177
|
+
assert is_noise_entity_name("person", 42) # type: ignore[arg-type]
|