memwal 0.1.11.dev12__tar.gz → 0.1.11.dev13__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/PKG-INFO +1 -1
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/__init__.py +1 -1
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/client.py +8 -1
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/mock.py +7 -1
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/types.py +4 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/pyproject.toml +1 -1
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_client.py +69 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_mock.py +4 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/.gitignore +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/CHANGELOG.md +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/README.md +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/.env.example +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/.gitignore +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/async_remember_demo.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/interactive_demo.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/verify_credentials.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/compatibility.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/middleware.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/utils.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/notebooks/walrus_memory_python_sdk.ipynb +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/run_tests.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/__init__.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_auth_rejected_message.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_blank_text.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_env_presets.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_integration.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_list_namespaces.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_middleware.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_normalize_server_url.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_polling_delay.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_remember_derived_key.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_retry_after_http_date.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_signing.py +0 -0
- {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_transport_retry.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: memwal
|
|
3
|
-
Version: 0.1.11.
|
|
3
|
+
Version: 0.1.11.dev13
|
|
4
4
|
Summary: Python SDK for Walrus Memory — Privacy-first AI memory with Ed25519 signing
|
|
5
5
|
Project-URL: Homepage, https://memory.walrus.xyz
|
|
6
6
|
Project-URL: Documentation, https://memory.walrus.xyz
|
|
@@ -1055,6 +1055,8 @@ class MemWal:
|
|
|
1055
1055
|
blob_id=m["blob_id"],
|
|
1056
1056
|
text=m["text"],
|
|
1057
1057
|
distance=m["distance"],
|
|
1058
|
+
score=m.get("score"),
|
|
1059
|
+
created_at=m.get("created_at"),
|
|
1058
1060
|
)
|
|
1059
1061
|
for m in data.get("results", [])
|
|
1060
1062
|
]
|
|
@@ -1453,7 +1455,12 @@ class MemWal:
|
|
|
1453
1455
|
include_seal_session=False,
|
|
1454
1456
|
)
|
|
1455
1457
|
hits = [
|
|
1456
|
-
RecallManualHit(
|
|
1458
|
+
RecallManualHit(
|
|
1459
|
+
blob_id=h["blob_id"],
|
|
1460
|
+
distance=h["distance"],
|
|
1461
|
+
created_at=h.get("created_at"),
|
|
1462
|
+
importance=h.get("importance"),
|
|
1463
|
+
)
|
|
1457
1464
|
for h in data.get("results", [])
|
|
1458
1465
|
]
|
|
1459
1466
|
return RecallManualResult(results=hits, total=data.get("total", len(hits)))
|
|
@@ -283,7 +283,13 @@ class MemWalMock:
|
|
|
283
283
|
if max_distance is not None:
|
|
284
284
|
page = [item for item in page if item[1] < max_distance]
|
|
285
285
|
results = [
|
|
286
|
-
RecallMemory(
|
|
286
|
+
RecallMemory(
|
|
287
|
+
blob_id=memory.blob_id,
|
|
288
|
+
text=memory.text,
|
|
289
|
+
distance=score,
|
|
290
|
+
score=1.0 - score,
|
|
291
|
+
created_at=_mock_timestamp(memory.sequence),
|
|
292
|
+
)
|
|
287
293
|
for memory, score in page
|
|
288
294
|
]
|
|
289
295
|
return RecallResult(results=results, total=len(ranked[:limit]))
|
|
@@ -88,6 +88,8 @@ class RecallMemory:
|
|
|
88
88
|
blob_id: str
|
|
89
89
|
text: str
|
|
90
90
|
distance: float
|
|
91
|
+
score: Optional[float] = None
|
|
92
|
+
created_at: Optional[str] = None
|
|
91
93
|
|
|
92
94
|
|
|
93
95
|
@dataclass
|
|
@@ -328,6 +330,8 @@ class RecallManualHit:
|
|
|
328
330
|
|
|
329
331
|
blob_id: str
|
|
330
332
|
distance: float
|
|
333
|
+
created_at: Optional[str] = None
|
|
334
|
+
importance: Optional[float] = None
|
|
331
335
|
|
|
332
336
|
|
|
333
337
|
@dataclass
|
|
@@ -841,6 +841,40 @@ class TestRecall:
|
|
|
841
841
|
assert result.results == []
|
|
842
842
|
assert result.dropped_count == 3
|
|
843
843
|
|
|
844
|
+
@respx.mock
|
|
845
|
+
async def test_recall_preserves_score_and_created_at(
|
|
846
|
+
self, memwal_client: MemWal
|
|
847
|
+
) -> None:
|
|
848
|
+
mock_seal_session_prereqs()
|
|
849
|
+
respx.post(f"{_TEST_SERVER}/api/recall").mock(
|
|
850
|
+
return_value=httpx.Response(
|
|
851
|
+
200,
|
|
852
|
+
json={
|
|
853
|
+
"results": [
|
|
854
|
+
{
|
|
855
|
+
"blob_id": "b1",
|
|
856
|
+
"text": "Fact with metadata",
|
|
857
|
+
"distance": 0.1,
|
|
858
|
+
"score": 0.95,
|
|
859
|
+
"created_at": "2026-03-30T12:00:00Z",
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
"blob_id": "b2",
|
|
863
|
+
"text": "Legacy fact",
|
|
864
|
+
"distance": 0.3,
|
|
865
|
+
},
|
|
866
|
+
],
|
|
867
|
+
"total": 2,
|
|
868
|
+
},
|
|
869
|
+
)
|
|
870
|
+
)
|
|
871
|
+
result = await memwal_client.recall("test")
|
|
872
|
+
assert len(result.results) == 2
|
|
873
|
+
assert result.results[0].score == 0.95
|
|
874
|
+
assert result.results[0].created_at == "2026-03-30T12:00:00Z"
|
|
875
|
+
assert result.results[1].score is None
|
|
876
|
+
assert result.results[1].created_at is None
|
|
877
|
+
|
|
844
878
|
@respx.mock
|
|
845
879
|
async def test_accepts_recall_params_object(
|
|
846
880
|
self, memwal_client: MemWal
|
|
@@ -1475,6 +1509,41 @@ class TestManualAPI:
|
|
|
1475
1509
|
assert len(result.results) == 1
|
|
1476
1510
|
assert result.results[0].blob_id == "b1"
|
|
1477
1511
|
|
|
1512
|
+
@respx.mock
|
|
1513
|
+
async def test_recall_manual_preserves_created_at_and_importance(
|
|
1514
|
+
self, memwal_client: MemWal
|
|
1515
|
+
) -> None:
|
|
1516
|
+
_mock_version()
|
|
1517
|
+
respx.post(f"{_TEST_SERVER}/api/recall/manual").mock(
|
|
1518
|
+
return_value=httpx.Response(
|
|
1519
|
+
200,
|
|
1520
|
+
json={
|
|
1521
|
+
"results": [
|
|
1522
|
+
{
|
|
1523
|
+
"blob_id": "b1",
|
|
1524
|
+
"distance": 0.15,
|
|
1525
|
+
"created_at": "2026-03-30T12:00:00Z",
|
|
1526
|
+
"importance": 0.85,
|
|
1527
|
+
},
|
|
1528
|
+
{
|
|
1529
|
+
"blob_id": "b2",
|
|
1530
|
+
"distance": 0.4,
|
|
1531
|
+
},
|
|
1532
|
+
],
|
|
1533
|
+
"total": 2,
|
|
1534
|
+
},
|
|
1535
|
+
)
|
|
1536
|
+
)
|
|
1537
|
+
|
|
1538
|
+
opts = RecallManualOptions(vector=[0.1, 0.2, 0.3], limit=5)
|
|
1539
|
+
result = await memwal_client.recall_manual(opts)
|
|
1540
|
+
|
|
1541
|
+
assert len(result.results) == 2
|
|
1542
|
+
assert result.results[0].created_at == "2026-03-30T12:00:00Z"
|
|
1543
|
+
assert result.results[0].importance == 0.85
|
|
1544
|
+
assert result.results[1].created_at is None
|
|
1545
|
+
assert result.results[1].importance is None
|
|
1546
|
+
|
|
1478
1547
|
@respx.mock
|
|
1479
1548
|
async def test_recall_manual_forwards_scoring_weights(self, memwal_client: MemWal) -> None:
|
|
1480
1549
|
_mock_version()
|
|
@@ -39,7 +39,11 @@ async def test_mock_remember_and_recall_are_deterministic_and_offline(monkeypatc
|
|
|
39
39
|
"I drink tea at night",
|
|
40
40
|
]
|
|
41
41
|
assert recalled.results[0].distance == 0
|
|
42
|
+
assert recalled.results[0].score == 1.0
|
|
43
|
+
assert recalled.results[0].created_at == "2026-01-01T00:00:01.000Z"
|
|
42
44
|
assert recalled.results[1].distance == 1
|
|
45
|
+
assert recalled.results[1].score == 0.0
|
|
46
|
+
assert recalled.results[1].created_at == "2026-01-01T00:00:02.000Z"
|
|
43
47
|
|
|
44
48
|
|
|
45
49
|
@pytest.mark.asyncio
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|