Skip to content

Commit 8252b43

Browse files
vertex-sdk-botcopybara-github
authored andcommitted
feat: Initial implementation of the SDK for Memory Revisions
FUTURE_COPYBARA_INTEGRATE_REVIEW=#5883 from googleapis:release-please--branches--main 048acfd PiperOrigin-RevId: 815928067
1 parent 21dac70 commit 8252b43

File tree

4 files changed

+1005
-39
lines changed

4 files changed

+1005
-39
lines changed

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

Lines changed: 88 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,19 @@
1919
from google.genai import types as genai_types
2020

2121

22-
def test_generate_memories(client):
22+
def test_generate_and_rollback_memories(client):
23+
client._api_client._http_options.base_url = (
24+
"https://us-central1-autopush-aiplatform.sandbox.googleapis.com/"
25+
)
2326
agent_engine = client.agent_engines.create()
2427
assert not list(
25-
client.agent_engines.list_memories(
28+
client.agent_engines.memories.list(
2629
name=agent_engine.api_resource.name,
2730
)
2831
)
29-
client.agent_engines.generate_memories(
32+
# Generate memories using source content. This result is non-deterministic,
33+
# because an LLM is used to generate the memories.
34+
client.agent_engines.memories.generate(
3035
name=agent_engine.api_resource.name,
3136
scope={"user_id": "test-user-id"},
3237
direct_contents_source=types.GenerateMemoriesRequestDirectContentsSource(
@@ -43,50 +48,99 @@ def test_generate_memories(client):
4348
)
4449
]
4550
),
51+
config=types.GenerateAgentEngineMemoriesConfig(
52+
revision_labels={"key": "value"}
53+
),
4654
)
47-
assert (
48-
len(
49-
list(
50-
client.agent_engines.list_memories(
51-
name=agent_engine.api_resource.name,
52-
)
53-
)
55+
memories = list(
56+
client.agent_engines.memories.list(
57+
name=agent_engine.api_resource.name,
5458
)
55-
>= 1
5659
)
57-
client.agent_engines.delete(name=agent_engine.api_resource.name, force=True)
60+
assert len(memories) >= 1
5861

62+
# Every action that modifies a memory creates a new revision.
63+
memory_revisions = list(
64+
client.agent_engines.memories.revisions.list(
65+
name=memories[0].name,
66+
)
67+
)
68+
assert len(memory_revisions) >= 1
69+
# The revision's labels depend on the generation request's revision labels.
70+
assert memory_revisions[0].labels == {"key": "value"}
71+
revision_name = memory_revisions[0].name
5972

60-
def test_generate_memories_direct_memories_source(client):
61-
agent_engine = client.agent_engines.create()
62-
client.agent_engines.generate_memories(
73+
# Update the memory.
74+
client.agent_engines.memories._update(
75+
name=memories[0].name,
76+
fact="This is temporary",
77+
scope={"user_id": "test-user-id"},
78+
)
79+
memory = client.agent_engines.memories.get(name=memories[0].name)
80+
assert memory.fact == "This is temporary"
81+
82+
# Rollback to the revision with the original fact that was created by the
83+
# generation request.
84+
client.agent_engines.memories.rollback(
85+
name=memories[0].name,
86+
target_revision_id=revision_name.split("/")[-1],
87+
)
88+
memory = client.agent_engines.memories.get(name=memories[0].name)
89+
assert memory.fact == memory_revisions[0].fact
90+
91+
# Update the memory again using generation. We use the original source
92+
# content to ensure that the original memory is updated. The response should
93+
# refer to the previous revision.
94+
response = client.agent_engines.memories.generate(
6395
name=agent_engine.api_resource.name,
6496
scope={"user_id": "test-user-id"},
65-
direct_memories_source=types.GenerateMemoriesRequestDirectMemoriesSource(
66-
direct_memories=[
67-
types.GenerateMemoriesRequestDirectMemoriesSourceDirectMemory(
68-
fact="I am a software engineer."
69-
),
70-
types.GenerateMemoriesRequestDirectMemoriesSourceDirectMemory(
71-
fact="I like to write replay tests."
72-
),
97+
direct_contents_source=types.GenerateMemoriesRequestDirectContentsSource(
98+
events=[
99+
types.GenerateMemoriesRequestDirectContentsSourceEvent(
100+
content=genai_types.Content(
101+
role="model",
102+
parts=[genai_types.Part(text=memory_revisions[0].fact)],
103+
)
104+
)
73105
]
74106
),
75-
config=types.GenerateAgentEngineMemoriesConfig(wait_for_completion=True),
76-
)
77-
assert (
78-
len(
79-
list(
80-
client.agent_engines.list_memories(
81-
name=agent_engine.api_resource.name,
82-
)
83-
)
84-
)
85-
>= 1
86107
)
108+
# The memory was updated, so the previous revision is set.
109+
assert response.response.generated_memories[0].previous_revision is not None
110+
87111
client.agent_engines.delete(name=agent_engine.api_resource.name, force=True)
88112

89113

114+
# def test_generate_memories_direct_memories_source(client):
115+
# agent_engine = client.agent_engines.create()
116+
# client.agent_engines.memories.generate(
117+
# name=agent_engine.api_resource.name,
118+
# scope={"user_id": "test-user-id"},
119+
# direct_memories_source=types.GenerateMemoriesRequestDirectMemoriesSource(
120+
# direct_memories=[
121+
# types.GenerateMemoriesRequestDirectMemoriesSourceDirectMemory(
122+
# fact="I am a software engineer."
123+
# ),
124+
# types.GenerateMemoriesRequestDirectMemoriesSourceDirectMemory(
125+
# fact="I like to write replay tests."
126+
# ),
127+
# ]
128+
# ),
129+
# config=types.GenerateAgentEngineMemoriesConfig(wait_for_completion=True),
130+
# )
131+
# assert (
132+
# len(
133+
# list(
134+
# client.agent_engines.memories.list(
135+
# name=agent_engine.api_resource.name,
136+
# )
137+
# )
138+
# )
139+
# >= 1
140+
# )
141+
# client.agent_engines.delete(name=agent_engine.api_resource.name, force=True)
142+
143+
90144
pytestmark = pytest_helper.setup(
91145
file=__file__,
92146
globals_for_file=globals(),

0 commit comments

Comments
 (0)