Skip to content

Commit 199a406

Browse files
vertex-sdk-botcopybara-github
authored andcommitted
feat: add async wrappers in the GenAI client for the Agent Engine Task Store Service
PiperOrigin-RevId: 878165510
1 parent 10efc13 commit 199a406

File tree

8 files changed

+353
-4
lines changed

8 files changed

+353
-4
lines changed

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from tests.unit.vertexai.genai.replays import pytest_helper
1818
from vertexai._genai import types
19+
import pytest
1920

2021

2122
def test_append_simple_a2a_task_events(client):
@@ -57,3 +58,41 @@ def test_append_simple_a2a_task_events(client):
5758
file=__file__,
5859
globals_for_file=globals(),
5960
)
61+
62+
pytest_plugins = ("pytest_asyncio",)
63+
64+
65+
@pytest.mark.asyncio
66+
async def test_append_simple_a2a_task_events_async(client):
67+
# Use the autopush environment.
68+
client.aio._api_client._http_options.base_url = (
69+
"https://us-central1-autopush-aiplatform.sandbox.googleapis.com/"
70+
)
71+
agent_engine = client.agent_engines.create()
72+
assert isinstance(agent_engine, types.AgentEngine)
73+
assert isinstance(agent_engine.api_resource, types.ReasoningEngine)
74+
# Use the internal API version for internal API access.
75+
client.aio._api_client._http_options.api_version = "internal"
76+
task = await client.aio.agent_engines.a2a_tasks.create(
77+
name=agent_engine.api_resource.name,
78+
a2a_task_id="task123",
79+
config=types.CreateAgentEngineTaskConfig(context_id="context123"),
80+
)
81+
assert isinstance(task, types.A2aTask)
82+
83+
await client.aio.agent_engines.a2a_tasks.events.append(
84+
name=task.name,
85+
task_events=[
86+
types.TaskEvent(
87+
event_data=types.TaskEventData(
88+
metadata_change=types.TaskMetadataChange(
89+
new_metadata={"key1": "value1"}
90+
)
91+
),
92+
event_sequence_number=1,
93+
)
94+
],
95+
)
96+
97+
# Clean up resources.
98+
client.agent_engines.delete(name=agent_engine.api_resource.name, force=True)

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from tests.unit.vertexai.genai.replays import pytest_helper
1818
from vertexai._genai import types
19+
import pytest
1920

2021

2122
def test_create_simple_a2a_task(client):
@@ -94,3 +95,78 @@ def test_create_simple_a2a_task(client):
9495
file=__file__,
9596
globals_for_file=globals(),
9697
)
98+
99+
pytest_plugins = ("pytest_asyncio",)
100+
101+
102+
@pytest.mark.asyncio
103+
async def test_create_simple_a2a_task_async(client):
104+
# Use the autopush environment.
105+
client.aio._api_client._http_options.base_url = (
106+
"https://us-central1-autopush-aiplatform.sandbox.googleapis.com/"
107+
)
108+
agent_engine = client.agent_engines.create()
109+
assert isinstance(agent_engine, types.AgentEngine)
110+
assert isinstance(agent_engine.api_resource, types.ReasoningEngine)
111+
# Use the internal API version for internal API access.
112+
client.aio._api_client._http_options.api_version = "internal"
113+
114+
task = await client.aio.agent_engines.a2a_tasks.create(
115+
name=agent_engine.api_resource.name,
116+
a2a_task_id="task123",
117+
config=types.CreateAgentEngineTaskConfig(
118+
context_id="context123",
119+
metadata={
120+
"key": "value",
121+
"key2": [{"key3": "value3", "key4": "value4"}],
122+
},
123+
status_details=types.TaskStatusDetails(
124+
task_message=types.TaskMessage(
125+
role="user",
126+
message_id="message123",
127+
parts=[
128+
types.Part(
129+
text="hello123",
130+
)
131+
],
132+
metadata={
133+
"key42": "value42",
134+
},
135+
),
136+
),
137+
output=types.TaskOutput(
138+
artifacts=[
139+
types.TaskArtifact(
140+
artifact_id="artifact123",
141+
display_name="display_name123",
142+
description="description123",
143+
parts=[
144+
types.Part(
145+
text="hello456",
146+
)
147+
],
148+
)
149+
],
150+
),
151+
),
152+
)
153+
154+
assert isinstance(task, types.A2aTask)
155+
assert task.name == f"{agent_engine.api_resource.name}/a2aTasks/task123"
156+
assert task.context_id == "context123"
157+
assert task.state == types.State.SUBMITTED
158+
assert task.status_details.task_message.role == "user"
159+
assert task.status_details.task_message.message_id == "message123"
160+
assert task.status_details.task_message.parts[0].text == "hello123"
161+
assert task.status_details.task_message.metadata["key42"] == "value42"
162+
assert task.output.artifacts[0].artifact_id == "artifact123"
163+
assert task.output.artifacts[0].display_name == "display_name123"
164+
assert task.output.artifacts[0].description == "description123"
165+
assert task.output.artifacts[0].parts[0].text == "hello456"
166+
assert task.metadata == {
167+
"key": "value",
168+
"key2": [{"key3": "value3", "key4": "value4"}],
169+
}
170+
171+
# Clean up resources.
172+
client.agent_engines.delete(name=agent_engine.api_resource.name, force=True)

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from tests.unit.vertexai.genai.replays import pytest_helper
1818
from vertexai._genai import types
19+
import pytest
1920

2021

2122
def test_get_a2a_task(client):
@@ -52,3 +53,37 @@ def test_get_a2a_task(client):
5253
file=__file__,
5354
globals_for_file=globals(),
5455
)
56+
57+
58+
pytest_plugins = ("pytest_asyncio",)
59+
60+
61+
@pytest.mark.asyncio
62+
async def test_get_a2a_task_async(client):
63+
# Use the autopush environment.
64+
client.aio._api_client._http_options.base_url = (
65+
"https://us-central1-autopush-aiplatform.sandbox.googleapis.com/"
66+
)
67+
agent_engine = client.agent_engines.create()
68+
assert isinstance(agent_engine, types.AgentEngine)
69+
assert isinstance(agent_engine.api_resource, types.ReasoningEngine)
70+
# Use the internal API version for internal API access.
71+
client.aio._api_client._http_options.api_version = "internal"
72+
73+
created_task = await client.aio.agent_engines.a2a_tasks.create(
74+
name=agent_engine.api_resource.name,
75+
a2a_task_id="task123",
76+
config=types.CreateAgentEngineTaskConfig(context_id="context123"),
77+
)
78+
assert isinstance(created_task, types.A2aTask)
79+
80+
task = await client.aio.agent_engines.a2a_tasks.get(
81+
name=created_task.name,
82+
)
83+
assert isinstance(task, types.A2aTask)
84+
assert task.name == f"{agent_engine.api_resource.name}/a2aTasks/task123"
85+
assert task.context_id == "context123"
86+
assert task.state == types.State.SUBMITTED
87+
88+
# Clean up resources.
89+
client.agent_engines.delete(name=agent_engine.api_resource.name, force=True)

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

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from tests.unit.vertexai.genai.replays import pytest_helper
1818
from vertexai._genai import types
19+
import pytest
1920

2021

2122
def test_list_simple_a2a_task_events(client):
@@ -89,3 +90,71 @@ def test_list_simple_a2a_task_events(client):
8990
file=__file__,
9091
globals_for_file=globals(),
9192
)
93+
94+
95+
@pytest.mark.asyncio
96+
async def test_list_simple_a2a_task_events_async(client):
97+
# Use the autopush environment.
98+
client.aio._api_client._http_options.base_url = (
99+
"https://us-central1-autopush-aiplatform.sandbox.googleapis.com/"
100+
)
101+
agent_engine = client.agent_engines.create()
102+
assert isinstance(agent_engine, types.AgentEngine)
103+
assert isinstance(agent_engine.api_resource, types.ReasoningEngine)
104+
# Use the internal API version for internal API access.
105+
client.aio._api_client._http_options.api_version = "internal"
106+
task = await client.aio.agent_engines.a2a_tasks.create(
107+
name=agent_engine.api_resource.name,
108+
a2a_task_id="task999",
109+
config=types.CreateAgentEngineTaskConfig(context_id="context999"),
110+
)
111+
assert isinstance(task, types.A2aTask)
112+
113+
events = list(
114+
await client.aio.agent_engines.a2a_tasks.events.list(
115+
name=task.name,
116+
)
117+
)
118+
assert len(events) == 1
119+
assert events[0].event_data.state_change.new_state == "SUBMITTED"
120+
121+
await client.aio.agent_engines.a2a_tasks.events.append(
122+
name=task.name,
123+
task_events=[
124+
types.TaskEvent(
125+
event_data=types.TaskEventData(
126+
metadata_change=types.TaskMetadataChange(
127+
new_metadata={"key1": "value1"}
128+
)
129+
),
130+
event_sequence_number=1,
131+
),
132+
types.TaskEvent(
133+
event_data=types.TaskEventData(
134+
metadata_change=types.TaskMetadataChange(
135+
new_metadata={"key2": "value2"}
136+
)
137+
),
138+
event_sequence_number=2,
139+
),
140+
],
141+
)
142+
143+
result = list(
144+
await client.aio.agent_engines.a2a_tasks.events.list(
145+
name=task.name,
146+
config=types.ListAgentEngineTaskEventsConfig(
147+
order_by="create_time desc",
148+
),
149+
)
150+
)
151+
152+
assert len(result) == 3
153+
assert result[0].event_sequence_number == 2
154+
assert result[0].event_data.metadata_change.new_metadata == {"key2": "value2"}
155+
assert result[1].event_sequence_number == 1
156+
assert result[1].event_data.metadata_change.new_metadata == {"key1": "value1"}
157+
assert result[2].event_data.state_change.new_state == "SUBMITTED"
158+
159+
# Clean up resources.
160+
client.agent_engines.delete(name=agent_engine.api_resource.name, force=True)

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from tests.unit.vertexai.genai.replays import pytest_helper
1818
from vertexai._genai import types
19+
import pytest
1920

2021

2122
def test_list_a2a_tasks(client):
@@ -66,3 +67,51 @@ def test_list_a2a_tasks(client):
6667
file=__file__,
6768
globals_for_file=globals(),
6869
)
70+
71+
72+
pytest_plugins = ("pytest_asyncio",)
73+
74+
75+
@pytest.mark.asyncio
76+
async def test_list_a2a_tasks_async(client):
77+
# Use the autopush environment.
78+
client.aio._api_client._http_options.base_url = (
79+
"https://us-central1-autopush-aiplatform.sandbox.googleapis.com/"
80+
)
81+
agent_engine = client.agent_engines.create()
82+
assert isinstance(agent_engine, types.AgentEngine)
83+
assert isinstance(agent_engine.api_resource, types.ReasoningEngine)
84+
# Use the internal API version for internal API access.
85+
client.aio._api_client._http_options.api_version = "internal"
86+
87+
assert not list(
88+
await client.aio.agent_engines.a2a_tasks.list(
89+
name=agent_engine.api_resource.name,
90+
)
91+
)
92+
await client.aio.agent_engines.a2a_tasks.create(
93+
name=agent_engine.api_resource.name,
94+
a2a_task_id="task123",
95+
config=types.CreateAgentEngineTaskConfig(context_id="context123"),
96+
)
97+
await client.aio.agent_engines.a2a_tasks.create(
98+
name=agent_engine.api_resource.name,
99+
a2a_task_id="task456",
100+
config=types.CreateAgentEngineTaskConfig(context_id="context456"),
101+
)
102+
a2a_tasks_list = await client.aio.agent_engines.a2a_tasks.list(
103+
name=agent_engine.api_resource.name,
104+
config=types.ListAgentEngineTasksConfig(
105+
page_size=1,
106+
order_by="create_time asc",
107+
),
108+
)
109+
assert len(a2a_tasks_list) == 1
110+
assert isinstance(a2a_tasks_list[0], types.A2aTask)
111+
assert a2a_tasks_list[0].name == (
112+
f"{agent_engine.api_resource.name}/a2aTasks/task123"
113+
)
114+
assert a2a_tasks_list[0].context_id == "context123"
115+
116+
# Clean up resources.
117+
agent_engine.delete(force=True)

vertexai/_genai/a2a_task_events.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from google.genai import _common
2626
from google.genai._common import get_value_by_path as getv
2727
from google.genai._common import set_value_by_path as setv
28-
from google.genai.pagers import Pager
28+
from google.genai.pagers import AsyncPager, Pager
2929

3030
from . import types
3131

@@ -245,8 +245,6 @@ def _list(
245245
self._api_client._verify_response(return_value)
246246
return return_value
247247

248-
"""Task events."""
249-
250248
def list(
251249
self,
252250
*,
@@ -415,3 +413,28 @@ async def _list(
415413

416414
self._api_client._verify_response(return_value)
417415
return return_value
416+
417+
async def list(
418+
self,
419+
*,
420+
name: str,
421+
config: Optional[types.ListAgentEngineTaskEventsConfigOrDict] = None,
422+
) -> AsyncPager[types.TaskEvent]:
423+
"""Lists the A2A tasks of an Agent Engine.
424+
425+
Args:
426+
name (str):
427+
Required. The name of the agent engine to list tasks for.
428+
config (List):
429+
Optional. The configuration for the tasks to list.
430+
431+
Returns:
432+
AsyncPager[TaskEvent]: An async pager of Task events.
433+
"""
434+
435+
return AsyncPager(
436+
"taskEvents",
437+
functools.partial(self._list, name=name),
438+
await self._list(name=name, config=config),
439+
config,
440+
)

0 commit comments

Comments
 (0)