2020from botocore .config import Config
2121from botocore .exceptions import ClientError
2222
23+ from bedrock_agentcore ._utils .namespace import build_namespace_params
2324from bedrock_agentcore ._utils .snake_case import accept_snake_case_kwargs
2425from bedrock_agentcore ._utils .user_agent import build_user_agent_suffix
2526
@@ -126,8 +127,11 @@ def __getattr__(self, name: str):
126127 # Access any boto3 method directly
127128 client = MemoryClient()
128129
129- # These calls are forwarded to the appropriate boto3 client
130- response = client.list_memory_records(memoryId="mem-123", namespace="test/")
130+ # These calls are forwarded to the appropriate boto3 client.
131+ # Use `namespace` for exact match, or `namespace_path` for
132+ # hierarchical path-prefix retrieval.
133+ response = client.list_memory_records(memoryId="mem-123", namespace="/actor/Jane/")
134+ response = client.list_memory_records(memoryId="mem-123", namespace_path="/org/MyOrg/")
131135 metadata = client.get_memory_metadata(memoryId="mem-123")
132136 """
133137 if name in self ._ALLOWED_GMDP_METHODS and hasattr (self .gmdp_client , name ):
@@ -307,46 +311,48 @@ def create_memory_and_wait(
307311 raise TimeoutError ("Memory %s did not become ACTIVE within %d seconds" % (memory_id , max_wait ))
308312
309313 def retrieve_memories (
310- self , memory_id : str , namespace : str , query : str , actor_id : Optional [str ] = None , top_k : int = 3
314+ self ,
315+ memory_id : str ,
316+ namespace : Optional [str ] = None ,
317+ query : str = None ,
318+ actor_id : Optional [str ] = None ,
319+ top_k : int = 3 ,
320+ namespace_path : Optional [str ] = None ,
311321 ) -> List [Dict [str , Any ]]:
312- """Retrieve relevant memories from a namespace .
322+ """Retrieve relevant memories using exact match or hierarchical path prefix .
313323
314- Note: Wildcards (*) are NOT supported in namespaces. You must provide the
315- exact namespace path with all variables resolved.
324+ Exactly one of ``namespace`` or ``namespace_path`` must be provided.
316325
317326 Args:
318327 memory_id: Memory resource ID
319- namespace: Exact namespace path (no wildcards )
320- query: Search query
328+ namespace: Exact namespace to match (e.g., "/actor/Jane/" )
329+ query: Search query (required)
321330 actor_id: Optional actor ID (deprecated, use namespace)
322331 top_k: Number of results to return
332+ namespace_path: Hierarchical path prefix (e.g., "/org/team/")
323333
324334 Returns:
325- List of memory records
326-
327- Example:
328- # Correct - exact namespace
329- memories = client.retrieve_memories(
330- memory_id="mem-123",
331- namespace="support/facts/session-456/",
332- query="customer preferences"
333- )
334-
335- # Incorrect - wildcards not supported
336- # memories = client.retrieve_memories(..., namespace="support/facts/*/", ...)
335+ List of memory records. Returns an empty list if the namespace
336+ arguments are invalid (both provided, neither provided, or contain
337+ wildcards) or if the service call fails.
337338 """
338- if "*" in namespace :
339- logger .error ("Wildcards are not supported in namespaces. Please provide exact namespace." )
339+ if query is None :
340+ raise TypeError ("retrieve_memories() missing required argument: 'query'" )
341+
342+ try :
343+ ns_params = build_namespace_params (namespace , namespace_path )
344+ except ValueError as e :
345+ logger .error (str (e ))
340346 return []
341347
348+ ns_value = namespace or namespace_path
349+
342350 try :
343- # Let service handle all namespace validation
344351 response = self .gmdp_client .retrieve_memory_records (
345- memoryId = memory_id , namespace = namespace , searchCriteria = {"searchQuery" : query , "topK" : top_k }
352+ memoryId = memory_id , searchCriteria = {"searchQuery" : query , "topK" : top_k }, ** ns_params
346353 )
347-
348354 memories = response .get ("memoryRecordSummaries" , [])
349- logger .info ("Retrieved %d memories from namespace: %s" , len (memories ), namespace )
355+ logger .info ("Retrieved %d memories from namespace: %s" , len (memories ), ns_value )
350356 return memories
351357
352358 except ClientError as e :
@@ -357,7 +363,7 @@ def retrieve_memories(
357363 logger .warning (
358364 "Memory or namespace not found. Ensure memory %s exists and namespace '%s' is configured" ,
359365 memory_id ,
360- namespace ,
366+ ns_value ,
361367 )
362368 elif error_code == "ValidationException" :
363369 logger .warning ("Invalid search parameters: %s" , error_msg )
@@ -662,6 +668,7 @@ def process_turn_with_llm(
662668 retrieval_query : Optional [str ] = None ,
663669 top_k : int = 3 ,
664670 event_timestamp : Optional [datetime ] = None ,
671+ retrieval_namespace_path : Optional [str ] = None ,
665672 ) -> Tuple [List [Dict [str , Any ]], str , Dict [str , Any ]]:
666673 r"""Complete conversation turn with LLM callback integration.
667674
@@ -676,10 +683,11 @@ def process_turn_with_llm(
676683 llm_callback: Function that takes (user_input, memories) and returns agent_response
677684 The callback receives the user input and retrieved memories,
678685 and should return the agent's response string
679- retrieval_namespace: Namespace to search for memories (optional)
686+ retrieval_namespace: Namespace for exact match retrieval (optional)
680687 retrieval_query: Custom search query (defaults to user_input)
681688 top_k: Number of memories to retrieve
682689 event_timestamp: Optional timestamp for the event
690+ retrieval_namespace_path: Namespace path for hierarchical prefix retrieval (optional)
683691
684692 Returns:
685693 Tuple of (retrieved_memories, agent_response, created_event)
@@ -709,10 +717,14 @@ def my_llm(user_input: str, memories: List[Dict]) -> str:
709717 """
710718 # Step 1: Retrieve relevant memories
711719 retrieved_memories = []
712- if retrieval_namespace :
720+ if retrieval_namespace or retrieval_namespace_path :
713721 search_query = retrieval_query or user_input
714722 retrieved_memories = self .retrieve_memories (
715- memory_id = memory_id , namespace = retrieval_namespace , query = search_query , top_k = top_k
723+ memory_id = memory_id ,
724+ namespace = retrieval_namespace ,
725+ namespace_path = retrieval_namespace_path ,
726+ query = search_query ,
727+ top_k = top_k ,
716728 )
717729 logger .info ("Retrieved %d memories for LLM context" , len (retrieved_memories ))
718730
0 commit comments