Skip to content

Commit aa06ba2

Browse files
Aayush KatariaAayush Kataria
authored andcommitted
code improvements
1 parent 19cc78d commit aa06ba2

10 files changed

Lines changed: 69 additions & 56 deletions

Samples/Demo.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2879,7 +2879,7 @@
28792879
"stored = memory.get_user_summary(user_id=user_id)\n",
28802880
"if stored:\n",
28812881
" print(\"User Summary for\", user_id)\n",
2882-
" print(stored[0][\"content\"])\n",
2882+
" print(stored[\"content\"])\n",
28832883
"else:\n",
28842884
" print(\"No user summary found — run the generate_user_summary cell first.\")\n"
28852885
]

Samples/Demo_async.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2765,7 +2765,7 @@
27652765
"stored = await memory.get_user_summary(user_id=user_id)\n",
27662766
"if stored:\n",
27672767
" print(\"User Summary for\", user_id)\n",
2768-
" print(stored[0][\"content\"])\n",
2768+
" print(stored[\"content\"])\n",
27692769
"else:\n",
27702770
" print(\"No user summary found — run the generate_user_summary cell first.\")\n"
27712771
]

Samples/processing_user_profile.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,11 @@ def main() -> None:
101101
print(json.dumps(doc.get("metadata", {}).get("structured_summary"), indent=2))
102102

103103
_banner("Read profile back from Cosmos")
104-
for s in mem.get_user_summary(user_id):
105-
print(f" • {s['content'][:200]}…")
104+
summary = mem.get_user_summary(user_id)
105+
if summary:
106+
print(f" • {summary['content'][:200]}…")
107+
else:
108+
print(" (no summary stored yet)")
106109

107110
print("\nDone.")
108111

Samples/scenario_customer_support.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def _run_ticket_3_greeting(mem: CosmosMemoryClient, user_id: str, ticket: str) -
8080
facts = mem.get_memories(user_id=user_id, memory_types=["fact"])
8181
print("Profile content (truncated):")
8282
if profile:
83-
print(f" {profile[0]['content'][:200]}…")
83+
print(f" {profile['content'][:200]}…")
8484
print("\nKnown facts:")
8585
for f in facts[:8]:
8686
print(f" • {f['content']}")

Samples/scenario_rag_with_memory.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,8 @@ def run_demo() -> None:
182182

183183
summaries = mem.get_user_summary(user_id=user_id)
184184
if summaries:
185-
print(f" Found {len(summaries)} summary document(s):")
186-
for s in summaries:
187-
print(f" • {s.get('content', '')[:120]}")
185+
print(" Found user summary:")
186+
print(f" • {summaries.get('content', '')[:120]}")
188187
else:
189188
print(" No summary available yet (generate one via generate_thread_summary).")
190189

@@ -204,7 +203,7 @@ def run_demo() -> None:
204203

205204
# 4c. User summary context
206205
summary_context = (
207-
summaries[0].get("content", "") if summaries else "No summary available."
206+
summaries.get("content", "") if summaries else "No summary available."
208207
)
209208

210209
augmented_prompt = textwrap.dedent(f"""\

agent_memory_toolkit/aio/cosmos_memory_client.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,24 +1136,21 @@ async def get_thread(
11361136
items.reverse()
11371137
return items
11381138

1139-
async def get_user_summary(self, user_id: str) -> list[dict[str, Any]]:
1140-
"""Retrieve user summary documents from Cosmos DB, newest first."""
1141-
await self._require_cosmos()
1139+
async def get_user_summary(self, user_id: str) -> Optional[dict[str, Any]]:
1140+
"""Retrieve the user's summary document from Cosmos DB, or ``None`` if absent."""
1141+
from azure.cosmos.exceptions import CosmosResourceNotFoundError
11421142

1143-
query = (
1144-
"SELECT c.id, c.user_id, c.thread_id, c.role, c.type, "
1145-
"c.content, c.metadata, c.created_at "
1146-
"FROM c WHERE c.user_id = @user_id AND c.type = 'user_summary' "
1147-
"ORDER BY c.created_at DESC"
1148-
)
1149-
parameters = [{"name": "@user_id", "value": user_id}]
1150-
logger.debug("async get_user_summary query: %s", query)
1143+
await self._require_cosmos()
11511144

11521145
try:
1153-
items_iter = self._container_client.query_items(query=query, parameters=parameters)
1154-
return [item async for item in items_iter]
1146+
return await self._container_client.read_item(
1147+
item=f"user_summary_{user_id}",
1148+
partition_key=[user_id, "__user_summary__"],
1149+
)
1150+
except CosmosResourceNotFoundError:
1151+
return None
11551152
except Exception as exc:
1156-
raise CosmosOperationError(f"async get_user_summary query failed: {exc}") from exc
1153+
raise CosmosOperationError(f"async get_user_summary read failed: {exc}") from exc
11571154

11581155
# ------------------------------------------------------------------
11591156
# Tag operations

agent_memory_toolkit/cosmos_memory_client.py

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,29 +1386,21 @@ def get_thread(
13861386
items.reverse()
13871387
return items
13881388

1389-
def get_user_summary(self, user_id: str) -> list[dict[str, Any]]:
1390-
"""Retrieve user summary documents from Cosmos DB, newest first."""
1391-
self._require_cosmos()
1389+
def get_user_summary(self, user_id: str) -> Optional[dict[str, Any]]:
1390+
"""Retrieve the user's summary document from Cosmos DB, or ``None`` if absent."""
1391+
from azure.cosmos.exceptions import CosmosResourceNotFoundError
13921392

1393-
query = (
1394-
"SELECT c.id, c.user_id, c.thread_id, c.role, c.type, "
1395-
"c.content, c.metadata, c.created_at "
1396-
"FROM c WHERE c.user_id = @user_id AND c.type = 'user_summary' "
1397-
"ORDER BY c.created_at DESC"
1398-
)
1399-
parameters = [{"name": "@user_id", "value": user_id}]
1400-
logger.debug("get_user_summary query: %s", query)
1393+
self._require_cosmos()
14011394

14021395
try:
1403-
return list(
1404-
self._container_client.query_items(
1405-
query=query,
1406-
parameters=parameters,
1407-
enable_cross_partition_query=True,
1408-
)
1396+
return self._container_client.read_item(
1397+
item=f"user_summary_{user_id}",
1398+
partition_key=[user_id, "__user_summary__"],
14091399
)
1400+
except CosmosResourceNotFoundError:
1401+
return None
14101402
except Exception as exc:
1411-
raise CosmosOperationError(f"get_user_summary query failed: {exc}") from exc
1403+
raise CosmosOperationError(f"get_user_summary read failed: {exc}") from exc
14121404

14131405
# ------------------------------------------------------------------
14141406
# Tag operations

tests/integration/test_full_pipeline.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,9 @@ def test_multi_thread_user_summary(self, agent_memory, unique_user_id):
212212
assert doc.get("id"), f"Expected user_summary doc with id, got {doc}"
213213
assert doc.get("type") == "user_summary"
214214

215-
summaries = agent_memory.get_user_summary(unique_user_id)
216-
assert len(summaries) >= 1
217-
combined = " ".join(s.get("content", "") for s in summaries).lower()
215+
summary = agent_memory.get_user_summary(unique_user_id)
216+
assert summary is not None, "Expected user_summary doc to be readable after generation"
217+
combined = summary.get("content", "").lower()
218218
assert any(t in combined for t in ("pasta", "italian", "cooking", "fettuccine"))
219219
assert any(t in combined for t in ("running", "run", "morning"))
220220
finally:

tests/unit/aio/test_cosmos_memory_client.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -502,16 +502,27 @@ async def test_not_found(self):
502502

503503

504504
class TestGetUserSummary:
505-
async def test_filters_by_type(self):
505+
async def test_returns_doc_when_present(self):
506506
mem, container = _connected_client()
507-
doc = _make_doc(type="user_summary")
508-
container.query_items = MagicMock(return_value=AsyncIterator([doc]))
507+
doc = _make_doc(type="user_summary", id="user_summary_u1")
508+
container.read_item = AsyncMock(return_value=doc)
509509

510510
result = await mem.get_user_summary(user_id="u1")
511511

512-
call_kwargs = container.query_items.call_args.kwargs
513-
assert "user_summary" in call_kwargs["query"]
514-
assert result == [doc]
512+
call_kwargs = container.read_item.call_args.kwargs
513+
assert call_kwargs["item"] == "user_summary_u1"
514+
assert call_kwargs["partition_key"] == ["u1", "__user_summary__"]
515+
assert result == doc
516+
517+
async def test_returns_none_when_absent(self):
518+
from azure.cosmos.exceptions import CosmosResourceNotFoundError
519+
520+
mem, container = _connected_client()
521+
container.read_item = AsyncMock(side_effect=CosmosResourceNotFoundError(message="404"))
522+
523+
result = await mem.get_user_summary(user_id="u1")
524+
525+
assert result is None
515526

516527

517528
# ===================================================================

tests/unit/test_cosmos_memory_client.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -581,16 +581,27 @@ def test_not_found(self):
581581

582582

583583
class TestGetUserSummary:
584-
def test_filters_by_type(self):
584+
def test_returns_doc_when_present(self):
585585
mem, container = _connected_client()
586-
doc = _make_doc(type="user_summary")
587-
container.query_items.return_value = [doc]
586+
doc = _make_doc(type="user_summary", id="user_summary_u1")
587+
container.read_item.return_value = doc
588588

589589
result = mem.get_user_summary(user_id="u1")
590590

591-
call_kwargs = container.query_items.call_args.kwargs
592-
assert "user_summary" in call_kwargs["query"]
593-
assert result == [doc]
591+
call_kwargs = container.read_item.call_args.kwargs
592+
assert call_kwargs["item"] == "user_summary_u1"
593+
assert call_kwargs["partition_key"] == ["u1", "__user_summary__"]
594+
assert result == doc
595+
596+
def test_returns_none_when_absent(self):
597+
from azure.cosmos.exceptions import CosmosResourceNotFoundError
598+
599+
mem, container = _connected_client()
600+
container.read_item.side_effect = CosmosResourceNotFoundError(message="404")
601+
602+
result = mem.get_user_summary(user_id="u1")
603+
604+
assert result is None
594605

595606

596607
# ===================================================================

0 commit comments

Comments
 (0)