|
6 | 6 |
|
7 | 7 | import asyncio |
8 | 8 | import re |
9 | | -from collections.abc import AsyncIterator |
| 9 | +from collections.abc import AsyncIterator, Sequence |
10 | 10 | from typing import TYPE_CHECKING, Any, Literal, TypedDict |
11 | 11 |
|
12 | 12 | if TYPE_CHECKING: |
@@ -416,7 +416,7 @@ async def set_working_memory_data( |
416 | 416 | async def add_memories_to_working_memory( |
417 | 417 | self, |
418 | 418 | session_id: str, |
419 | | - memories: list[ClientMemoryRecord | MemoryRecord], |
| 419 | + memories: Sequence[ClientMemoryRecord | MemoryRecord], |
420 | 420 | namespace: str | None = None, |
421 | 421 | replace: bool = False, |
422 | 422 | ) -> WorkingMemoryResponse: |
@@ -482,7 +482,7 @@ async def add_memories_to_working_memory( |
482 | 482 | return await self.put_working_memory(session_id, working_memory) |
483 | 483 |
|
484 | 484 | async def create_long_term_memory( |
485 | | - self, memories: list[ClientMemoryRecord | MemoryRecord] |
| 485 | + self, memories: Sequence[ClientMemoryRecord | MemoryRecord] |
486 | 486 | ) -> AckResponse: |
487 | 487 | """ |
488 | 488 | Create long-term memories for later retrieval. |
@@ -541,6 +541,29 @@ async def create_long_term_memory( |
541 | 541 | self._handle_http_error(e.response) |
542 | 542 | raise |
543 | 543 |
|
| 544 | + async def delete_long_term_memories(self, memory_ids: Sequence[str]) -> AckResponse: |
| 545 | + """ |
| 546 | + Delete long-term memories. |
| 547 | +
|
| 548 | + Args: |
| 549 | + memory_ids: List of memory IDs to delete |
| 550 | +
|
| 551 | + Returns: |
| 552 | + AckResponse indicating success |
| 553 | + """ |
| 554 | + params = {"memory_ids": list(memory_ids)} |
| 555 | + |
| 556 | + try: |
| 557 | + response = await self._client.delete( |
| 558 | + "/v1/long-term-memory", |
| 559 | + params=params, |
| 560 | + ) |
| 561 | + response.raise_for_status() |
| 562 | + return AckResponse(**response.json()) |
| 563 | + except httpx.HTTPStatusError as e: |
| 564 | + self._handle_http_error(e.response) |
| 565 | + raise |
| 566 | + |
544 | 567 | async def search_long_term_memory( |
545 | 568 | self, |
546 | 569 | text: str, |
@@ -666,8 +689,8 @@ async def search_long_term_memory( |
666 | 689 | async def search_memory_tool( |
667 | 690 | self, |
668 | 691 | query: str, |
669 | | - topics: list[str] | None = None, |
670 | | - entities: list[str] | None = None, |
| 692 | + topics: Sequence[str] | None = None, |
| 693 | + entities: Sequence[str] | None = None, |
671 | 694 | memory_type: str | None = None, |
672 | 695 | max_results: int = 5, |
673 | 696 | min_relevance: float | None = None, |
@@ -940,8 +963,8 @@ async def add_memory_tool( |
940 | 963 | session_id: str, |
941 | 964 | text: str, |
942 | 965 | memory_type: str, |
943 | | - topics: list[str] | None = None, |
944 | | - entities: list[str] | None = None, |
| 966 | + topics: Sequence[str] | None = None, |
| 967 | + entities: Sequence[str] | None = None, |
945 | 968 | namespace: str | None = None, |
946 | 969 | user_id: str | None = None, |
947 | 970 | ) -> dict[str, Any]: |
@@ -1172,7 +1195,7 @@ def get_update_memory_data_tool_schema(cls) -> dict[str, Any]: |
1172 | 1195 | } |
1173 | 1196 |
|
1174 | 1197 | @classmethod |
1175 | | - def get_all_memory_tool_schemas(cls) -> list[dict[str, Any]]: |
| 1198 | + def get_all_memory_tool_schemas(cls) -> Sequence[dict[str, Any]]: |
1176 | 1199 | """ |
1177 | 1200 | Get all memory-related tool schemas for easy LLM integration. |
1178 | 1201 |
|
@@ -1200,7 +1223,7 @@ def get_all_memory_tool_schemas(cls) -> list[dict[str, Any]]: |
1200 | 1223 | ] |
1201 | 1224 |
|
1202 | 1225 | @classmethod |
1203 | | - def get_all_memory_tool_schemas_anthropic(cls) -> list[dict[str, Any]]: |
| 1226 | + def get_all_memory_tool_schemas_anthropic(cls) -> Sequence[dict[str, Any]]: |
1204 | 1227 | """ |
1205 | 1228 | Get all memory-related tool schemas in Anthropic format. |
1206 | 1229 |
|
@@ -1470,11 +1493,11 @@ async def resolve_tool_call( |
1470 | 1493 |
|
1471 | 1494 | async def resolve_tool_calls( |
1472 | 1495 | self, |
1473 | | - tool_calls: list[dict[str, Any]], |
| 1496 | + tool_calls: Sequence[dict[str, Any]], |
1474 | 1497 | session_id: str, |
1475 | 1498 | namespace: str | None = None, |
1476 | 1499 | user_id: str | None = None, |
1477 | | - ) -> list[ToolCallResolutionResult]: |
| 1500 | + ) -> Sequence[ToolCallResolutionResult]: |
1478 | 1501 | """ |
1479 | 1502 | Resolve multiple tool calls from any LLM provider format. |
1480 | 1503 |
|
@@ -1713,11 +1736,11 @@ async def _resolve_update_memory_data( |
1713 | 1736 |
|
1714 | 1737 | async def resolve_function_calls( |
1715 | 1738 | self, |
1716 | | - function_calls: list[dict[str, Any]], |
| 1739 | + function_calls: Sequence[dict[str, Any]], |
1717 | 1740 | session_id: str, |
1718 | 1741 | namespace: str | None = None, |
1719 | 1742 | user_id: str | None = None, |
1720 | | - ) -> list[ToolCallResolutionResult]: |
| 1743 | + ) -> Sequence[ToolCallResolutionResult]: |
1721 | 1744 | """ |
1722 | 1745 | Resolve multiple function calls in batch. |
1723 | 1746 |
|
@@ -1765,7 +1788,7 @@ async def resolve_function_calls( |
1765 | 1788 | async def promote_working_memories_to_long_term( |
1766 | 1789 | self, |
1767 | 1790 | session_id: str, |
1768 | | - memory_ids: list[str] | None = None, |
| 1791 | + memory_ids: Sequence[str] | None = None, |
1769 | 1792 | namespace: str | None = None, |
1770 | 1793 | ) -> AckResponse: |
1771 | 1794 | """ |
@@ -1805,10 +1828,10 @@ async def promote_working_memories_to_long_term( |
1805 | 1828 |
|
1806 | 1829 | async def bulk_create_long_term_memories( |
1807 | 1830 | self, |
1808 | | - memory_batches: list[list[ClientMemoryRecord | MemoryRecord]], |
| 1831 | + memory_batches: Sequence[Sequence[ClientMemoryRecord | MemoryRecord]], |
1809 | 1832 | batch_size: int = 100, |
1810 | 1833 | delay_between_batches: float = 0.1, |
1811 | | - ) -> list[AckResponse]: |
| 1834 | + ) -> Sequence[AckResponse]: |
1812 | 1835 | """ |
1813 | 1836 | Create multiple batches of memories with proper rate limiting. |
1814 | 1837 |
|
@@ -2104,6 +2127,8 @@ async def memory_prompt( |
2104 | 2127 | """ |
2105 | 2128 | Hydrate a user query with memory context and return a prompt ready to send to an LLM. |
2106 | 2129 |
|
| 2130 | + NOTE: `long_term_search` uses the same filter options as `search_long_term_memories`. |
| 2131 | +
|
2107 | 2132 | Args: |
2108 | 2133 | query: The input text to find relevant context for |
2109 | 2134 | session_id: Optional session ID to include session messages |
@@ -2163,9 +2188,17 @@ async def memory_prompt( |
2163 | 2188 |
|
2164 | 2189 | # Add long-term search parameters if provided |
2165 | 2190 | if long_term_search is not None: |
| 2191 | + if "namespace" not in long_term_search: |
| 2192 | + if namespace is not None: |
| 2193 | + long_term_search["namespace"] = {"eq": namespace} |
| 2194 | + elif self.config.default_namespace is not None: |
| 2195 | + long_term_search["namespace"] = { |
| 2196 | + "eq": self.config.default_namespace |
| 2197 | + } |
2166 | 2198 | payload["long_term_search"] = long_term_search |
2167 | 2199 |
|
2168 | 2200 | try: |
| 2201 | + print("Payload: ", payload) |
2169 | 2202 | response = await self._client.post( |
2170 | 2203 | "/v1/memory/prompt", |
2171 | 2204 | json=payload, |
|
0 commit comments