Skip to content

Commit ffecfcd

Browse files
yifanyangcopybara-github
authored andcommitted
fix: raise google.genai.errors.APIError when Agent Engine create or update LROs fail
PiperOrigin-RevId: 995250809
1 parent f6bf219 commit ffecfcd

5 files changed

Lines changed: 79 additions & 12 deletions

File tree

‎agentplatform/_genai/_runtimes_utils.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import proto
5353

5454
from google.api_core import exceptions
55+
from google.genai import errors as google_genai_errors
5556
from google.genai import types as google_genai_types
5657
from google.api import httpbody_pb2
5758
from google.protobuf import struct_pb2
@@ -564,6 +565,23 @@ def _await_operation(
564565
return operation
565566

566567

568+
def _raise_for_operation_error(
569+
*,
570+
operation: Any,
571+
message: str,
572+
) -> None:
573+
"""Raises an APIError for a failed operation with a context note."""
574+
try:
575+
google_genai_errors.APIError.raise_error(
576+
operation.error.get("code"), operation.error, None
577+
)
578+
except google_genai_errors.APIError as e:
579+
# TODO(yifany): Drop guard once Python 3.10 support is removed.
580+
if sys.version_info >= (3, 11):
581+
e.add_note(message)
582+
raise
583+
584+
567585
def _compare_requirements(
568586
*,
569587
requirements: Mapping[str, str],

‎agentplatform/_genai/runtimes.py‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,8 +1944,12 @@ def create(
19441944
f"runtime=client.runtimes.get(name='{runtime.api_resource.name}')"
19451945
)
19461946
elif operation.error:
1947-
raise RuntimeError(
1948-
f"Operation {operation.name} failed to create Agent Runtime: {operation.error}"
1947+
_runtimes_utils._raise_for_operation_error(
1948+
operation=operation,
1949+
message=(
1950+
f"Operation {operation.name} failed to create Agent Runtime:"
1951+
f" {operation.error}"
1952+
),
19491953
)
19501954
else:
19511955
logger.warning("The operation returned an empty response.")
@@ -2747,8 +2751,12 @@ def update(
27472751
f"runtime=client.runtimes.get(name='{runtime.api_resource.name}')"
27482752
)
27492753
elif operation.error:
2750-
raise RuntimeError(
2751-
f"Operation {operation.name} failed to update Agent Runtime: {operation.error}"
2754+
_runtimes_utils._raise_for_operation_error(
2755+
operation=operation,
2756+
message=(
2757+
f"Operation {operation.name} failed to update Agent Runtime:"
2758+
f" {operation.error}"
2759+
),
27522760
)
27532761
if runtime.api_resource.spec:
27542762
self._register_api_methods(runtime=runtime)

‎tests/unit/agentplatform/genai/test_agent_engines.py‎

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from agentplatform._genai import runtimes
3737
from agentplatform._genai import types as _genai_types
3838
from google.genai import client as genai_client
39+
from google.genai import errors as genai_errors
3940
from google.genai import types as genai_types
4041
from google.api import httpbody_pb2
4142
import pytest
@@ -4154,7 +4155,7 @@ def test_create_runtime_error(
41544155
self.client.runtimes._api_client, "request"
41554156
) as request_mock:
41564157
request_mock.return_value = genai_types.HttpResponse(body="")
4157-
with pytest.raises(RuntimeError) as excinfo:
4158+
with pytest.raises(genai_errors.APIError) as excinfo:
41584159
self.client.runtimes.create(
41594160
agent=self.test_agent,
41604161
config=_genai_types.AgentRuntimeConfig(
@@ -4167,7 +4168,14 @@ def test_create_runtime_error(
41674168
env_vars=_TEST_AGENT_ENGINE_ENV_VARS_INPUT,
41684169
),
41694170
)
4170-
assert "failed to create Agent Runtime" in str(excinfo.value)
4171+
assert excinfo.value.code == _TEST_AGENT_ENGINE_ERROR["code"]
4172+
assert excinfo.value.message == _TEST_AGENT_ENGINE_ERROR["message"]
4173+
assert excinfo.value.details == _TEST_AGENT_ENGINE_ERROR
4174+
if sys.version_info >= (3, 11):
4175+
assert any(
4176+
"failed to create Agent Runtime" in note
4177+
for note in excinfo.value.__notes__
4178+
)
41714179

41724180
@mock.patch.object(_runtimes_utils, "_await_operation")
41734181
def test_update_runtime_description(self, mock_await_operation):
@@ -4178,14 +4186,21 @@ def test_update_runtime_description(self, mock_await_operation):
41784186
self.client.runtimes._api_client, "request"
41794187
) as request_mock:
41804188
request_mock.return_value = genai_types.HttpResponse(body="")
4181-
with pytest.raises(RuntimeError) as excinfo:
4189+
with pytest.raises(genai_errors.APIError) as excinfo:
41824190
self.client.runtimes.update(
41834191
name=_TEST_AGENT_ENGINE_RESOURCE_NAME,
41844192
config=_genai_types.AgentRuntimeConfig(
41854193
description=_TEST_AGENT_ENGINE_DESCRIPTION,
41864194
),
41874195
)
4188-
assert "failed to update Agent Runtime" in str(excinfo.value)
4196+
assert excinfo.value.code == _TEST_AGENT_ENGINE_ERROR["code"]
4197+
assert excinfo.value.message == _TEST_AGENT_ENGINE_ERROR["message"]
4198+
assert excinfo.value.details == _TEST_AGENT_ENGINE_ERROR
4199+
if sys.version_info >= (3, 11):
4200+
assert any(
4201+
"failed to update Agent Runtime" in note
4202+
for note in excinfo.value.__notes__
4203+
)
41894204

41904205
@pytest.mark.parametrize(
41914206
"test_case_name, test_operation_schemas, want_log_output",

‎vertexai/_genai/_agent_engines_utils.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import proto
5252

5353
from google.api_core import exceptions
54+
from google.genai import errors as google_genai_errors
5455
from google.genai import types as google_genai_types
5556
from google.protobuf import struct_pb2
5657
from google.protobuf import json_format
@@ -550,6 +551,23 @@ def _await_operation(
550551
return operation
551552

552553

554+
def _raise_for_operation_error(
555+
*,
556+
operation: Any,
557+
message: str,
558+
) -> None:
559+
"""Raises an APIError for a failed operation with a context note."""
560+
try:
561+
google_genai_errors.APIError.raise_error(
562+
operation.error.get("code"), operation.error, None
563+
)
564+
except google_genai_errors.APIError as e:
565+
# TODO(yifany): Drop guard once Python 3.10 support is removed.
566+
if sys.version_info >= (3, 11):
567+
e.add_note(message)
568+
raise
569+
570+
553571
def _compare_requirements(
554572
*,
555573
requirements: Mapping[str, str],

‎vertexai/_genai/agent_engines.py‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2039,8 +2039,12 @@ def create(
20392039
f"agent_engine=client.agent_engines.get(name='{agent_engine.api_resource.name}')"
20402040
)
20412041
elif operation.error:
2042-
raise RuntimeError(
2043-
f"Operation {operation.name} failed to create Agent Engine: {operation.error}"
2042+
_agent_engines_utils._raise_for_operation_error(
2043+
operation=operation,
2044+
message=(
2045+
f"Operation {operation.name} failed to create Agent Engine:"
2046+
f" {operation.error}"
2047+
),
20442048
)
20452049
else:
20462050
logger.warning("The operation returned an empty response.")
@@ -2848,8 +2852,12 @@ def update(
28482852
f"agent_engine=client.agent_engines.get(name='{agent_engine.api_resource.name}')"
28492853
)
28502854
elif operation.error:
2851-
raise RuntimeError(
2852-
f"Operation {operation.name} failed to update Agent Engine: {operation.error}"
2855+
_agent_engines_utils._raise_for_operation_error(
2856+
operation=operation,
2857+
message=(
2858+
f"Operation {operation.name} failed to update Agent Engine:"
2859+
f" {operation.error}"
2860+
),
28532861
)
28542862
if agent_engine.api_resource.spec:
28552863
self._register_api_methods(agent_engine=agent_engine)

0 commit comments

Comments
 (0)