Skip to content

Commit 5c5b49b

Browse files
vertex-sdk-botcopybara-github
authored andcommitted
feat: GenAI SDK client(memory): Add filter to RetrieveMemories
feat: GenAI SDK client(memory): Add extracted memories to MemoryRevision resources PiperOrigin-RevId: 824672802
1 parent 458fa3f commit 5c5b49b

File tree

5 files changed

+104
-10
lines changed

5 files changed

+104
-10
lines changed

tests/unit/vertexai/genai/replays/test_generate_agent_engine_memories.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,23 +95,26 @@ def test_generate_and_rollback_memories(client):
9595
# Update the memory again using generation. We use the original source
9696
# content to ensure that the original memory is updated. The response should
9797
# refer to the previous revision.
98+
pre_extracted_fact = "I am a software engineer focusing in security"
9899
response = client.agent_engines.memories.generate(
99100
name=agent_engine.api_resource.name,
100101
scope={"user_id": "test-user-id"},
101-
direct_contents_source=types.GenerateMemoriesRequestDirectContentsSource(
102-
events=[
103-
types.GenerateMemoriesRequestDirectContentsSourceEvent(
104-
content=genai_types.Content(
105-
role="model",
106-
parts=[genai_types.Part(text=memory_revisions[0].fact)],
107-
)
102+
direct_memories_source=types.GenerateMemoriesRequestDirectMemoriesSource(
103+
direct_memories=[
104+
types.GenerateMemoriesRequestDirectMemoriesSourceDirectMemory(
105+
fact=pre_extracted_fact
108106
)
109107
]
110108
),
111109
)
112110
# The memory was updated, so the previous revision is set.
113111
assert response.response.generated_memories[0].previous_revision is not None
114-
112+
memory_revisions = list(
113+
client.agent_engines.memories.revisions.list(name=memories[0].name))
114+
# Memory Revisions are returned in descending order by revision create time.
115+
# We can't make an assertion on the actual value, since it's
116+
# generated and thus non-deterministic.
117+
assert memory_revisions[0].extracted_memories[0].fact is not None
115118
client.agent_engines.delete(name=agent_engine.api_resource.name, force=True)
116119

117120

tests/unit/vertexai/genai/replays/test_retrieve_agent_engine_memories.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,33 @@ def test_retrieve_memories_with_simple_retrieval_params(client):
9292
assert isinstance(memories, pagers.Pager)
9393
assert isinstance(memories.page[0], types.RetrieveMemoriesResponseRetrievedMemory)
9494
assert memories.page_size == 1
95+
96+
client.agent_engines.memories.create(
97+
name=agent_engine.api_resource.name,
98+
fact="memory_fact_2",
99+
scope={"user_id": "123"},
100+
)
101+
memories = client.agent_engines.memories.retrieve(
102+
name=agent_engine.api_resource.name, scope={"user_id": "123"}
103+
)
104+
assert memories.page_size == 2
105+
106+
memories = client.agent_engines.memories.retrieve(
107+
name=agent_engine.api_resource.name,
108+
scope={"user_id": "123"},
109+
config={"filter": "fact=\"memory_fact_2\""},
110+
)
111+
assert memories.page_size == 1
112+
assert memories.page[0].memory.fact == "memory_fact_2"
113+
95114
# Clean up resources.
96115
agent_engine.delete(force=True)
97116

98117

99118
pytestmark = pytest_helper.setup(
100119
file=__file__,
101120
globals_for_file=globals(),
102-
test_method="agent_engines.create_memory",
121+
test_method="agent_engines.memories.retrieve",
103122
)
104123

105124

vertexai/_genai/memories.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,18 @@ def _ListAgentEngineMemoryRequestParameters_to_vertex(
287287
return to_object
288288

289289

290+
def _RetrieveAgentEngineMemoriesConfig_to_vertex(
291+
from_object: Union[dict[str, Any], object],
292+
parent_object: Optional[dict[str, Any]] = None,
293+
) -> dict[str, Any]:
294+
to_object: dict[str, Any] = {}
295+
296+
if getv(from_object, ["filter"]) is not None:
297+
setv(parent_object, ["filter"], getv(from_object, ["filter"]))
298+
299+
return to_object
300+
301+
290302
def _RetrieveAgentEngineMemoriesRequestParameters_to_vertex(
291303
from_object: Union[dict[str, Any], object],
292304
parent_object: Optional[dict[str, Any]] = None,
@@ -313,7 +325,13 @@ def _RetrieveAgentEngineMemoriesRequestParameters_to_vertex(
313325
)
314326

315327
if getv(from_object, ["config"]) is not None:
316-
setv(to_object, ["config"], getv(from_object, ["config"]))
328+
setv(
329+
to_object,
330+
["config"],
331+
_RetrieveAgentEngineMemoriesConfig_to_vertex(
332+
getv(from_object, ["config"]), to_object
333+
),
334+
)
317335

318336
return to_object
319337

vertexai/_genai/types/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,9 @@
433433
from .common import GetPromptConfigDict
434434
from .common import GetPromptConfigOrDict
435435
from .common import Importance
436+
from .common import IntermediateExtractedMemory
437+
from .common import IntermediateExtractedMemoryDict
438+
from .common import IntermediateExtractedMemoryOrDict
436439
from .common import JobState
437440
from .common import Language
438441
from .common import ListAgentEngineConfig
@@ -1480,6 +1483,9 @@
14801483
"GetAgentEngineMemoryRevisionConfig",
14811484
"GetAgentEngineMemoryRevisionConfigDict",
14821485
"GetAgentEngineMemoryRevisionConfigOrDict",
1486+
"IntermediateExtractedMemory",
1487+
"IntermediateExtractedMemoryDict",
1488+
"IntermediateExtractedMemoryOrDict",
14831489
"MemoryRevision",
14841490
"MemoryRevisionDict",
14851491
"MemoryRevisionOrDict",

vertexai/_genai/types/common.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7269,6 +7269,17 @@ class RetrieveAgentEngineMemoriesConfig(_common.BaseModel):
72697269
http_options: Optional[genai_types.HttpOptions] = Field(
72707270
default=None, description="""Used to override HTTP request options."""
72717271
)
7272+
filter: Optional[str] = Field(
7273+
default=None,
7274+
description="""The standard list filter that will be applied to the retrieved
7275+
memories. More detail in [AIP-160](https://google.aip.dev/160).
7276+
7277+
Supported fields:
7278+
* `fact`
7279+
* `create_time`
7280+
* `update_time`
7281+
""",
7282+
)
72727283

72737284

72747285
class RetrieveAgentEngineMemoriesConfigDict(TypedDict, total=False):
@@ -7277,6 +7288,16 @@ class RetrieveAgentEngineMemoriesConfigDict(TypedDict, total=False):
72777288
http_options: Optional[genai_types.HttpOptionsDict]
72787289
"""Used to override HTTP request options."""
72797290

7291+
filter: Optional[str]
7292+
"""The standard list filter that will be applied to the retrieved
7293+
memories. More detail in [AIP-160](https://google.aip.dev/160).
7294+
7295+
Supported fields:
7296+
* `fact`
7297+
* `create_time`
7298+
* `update_time`
7299+
"""
7300+
72807301

72817302
RetrieveAgentEngineMemoriesConfigOrDict = Union[
72827303
RetrieveAgentEngineMemoriesConfig, RetrieveAgentEngineMemoriesConfigDict
@@ -7695,6 +7716,26 @@ class _GetAgentEngineMemoryRevisionRequestParametersDict(TypedDict, total=False)
76957716
]
76967717

76977718

7719+
class IntermediateExtractedMemory(_common.BaseModel):
7720+
"""An extracted memory that is the intermediate result before consolidation."""
7721+
7722+
fact: Optional[str] = Field(
7723+
default=None, description="""Output only. The fact of the extracted memory."""
7724+
)
7725+
7726+
7727+
class IntermediateExtractedMemoryDict(TypedDict, total=False):
7728+
"""An extracted memory that is the intermediate result before consolidation."""
7729+
7730+
fact: Optional[str]
7731+
"""Output only. The fact of the extracted memory."""
7732+
7733+
7734+
IntermediateExtractedMemoryOrDict = Union[
7735+
IntermediateExtractedMemory, IntermediateExtractedMemoryDict
7736+
]
7737+
7738+
76987739
class MemoryRevision(_common.BaseModel):
76997740
"""A memory revision."""
77007741

@@ -7718,6 +7759,10 @@ class MemoryRevision(_common.BaseModel):
77187759
default=None,
77197760
description="""Output only. The labels of the Memory Revision. These labels are applied to the MemoryRevision when it is created based on `GenerateMemoriesRequest.revision_labels`.""",
77207761
)
7762+
extracted_memories: Optional[list[IntermediateExtractedMemory]] = Field(
7763+
default=None,
7764+
description="""Output only. The extracted memories from the source content before consolidation when the memory was updated via GenerateMemories. This information was used to modify an existing Memory via Consolidation.""",
7765+
)
77217766

77227767

77237768
class MemoryRevisionDict(TypedDict, total=False):
@@ -7738,6 +7783,9 @@ class MemoryRevisionDict(TypedDict, total=False):
77387783
labels: Optional[dict[str, str]]
77397784
"""Output only. The labels of the Memory Revision. These labels are applied to the MemoryRevision when it is created based on `GenerateMemoriesRequest.revision_labels`."""
77407785

7786+
extracted_memories: Optional[list[IntermediateExtractedMemoryDict]]
7787+
"""Output only. The extracted memories from the source content before consolidation when the memory was updated via GenerateMemories. This information was used to modify an existing Memory via Consolidation."""
7788+
77417789

77427790
MemoryRevisionOrDict = Union[MemoryRevision, MemoryRevisionDict]
77437791

0 commit comments

Comments
 (0)