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.
Files changed (34) hide show
  1. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/PKG-INFO +1 -1
  2. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/__init__.py +1 -1
  3. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/client.py +8 -1
  4. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/mock.py +7 -1
  5. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/types.py +4 -0
  6. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/pyproject.toml +1 -1
  7. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_client.py +69 -0
  8. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_mock.py +4 -0
  9. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/.gitignore +0 -0
  10. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/CHANGELOG.md +0 -0
  11. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/README.md +0 -0
  12. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/.env.example +0 -0
  13. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/.gitignore +0 -0
  14. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/async_remember_demo.py +0 -0
  15. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/interactive_demo.py +0 -0
  16. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/examples/verify_credentials.py +0 -0
  17. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/compatibility.py +0 -0
  18. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/middleware.py +0 -0
  19. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/memwal/utils.py +0 -0
  20. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/notebooks/walrus_memory_python_sdk.ipynb +0 -0
  21. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/run_tests.py +0 -0
  22. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/__init__.py +0 -0
  23. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_auth_rejected_message.py +0 -0
  24. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_blank_text.py +0 -0
  25. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_env_presets.py +0 -0
  26. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_integration.py +0 -0
  27. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_list_namespaces.py +0 -0
  28. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_middleware.py +0 -0
  29. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_normalize_server_url.py +0 -0
  30. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_polling_delay.py +0 -0
  31. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_remember_derived_key.py +0 -0
  32. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_retry_after_http_date.py +0 -0
  33. {memwal-0.1.11.dev12 → memwal-0.1.11.dev13}/tests/test_signing.py +0 -0
  34. {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.dev12
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
@@ -128,4 +128,4 @@ __all__ = [
128
128
  "RecallManualResult",
129
129
  ]
130
130
 
131
- __version__ = "0.1.11.dev12"
131
+ __version__ = "0.1.11.dev13"
@@ -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(blob_id=h["blob_id"], distance=h["distance"])
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(blob_id=memory.blob_id, text=memory.text, distance=score)
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "memwal"
7
- version = "0.1.11.dev12"
7
+ version = "0.1.11.dev13"
8
8
  description = "Python SDK for Walrus Memory — Privacy-first AI memory with Ed25519 signing"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -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