Skip to content

Commit aed8c76

Browse files
sararobcopybara-github
authored andcommitted
fix: require model name in ModelEvaluation.list()
PiperOrigin-RevId: 548190073
1 parent 4aa7745 commit aed8c76

File tree

3 files changed

+125
-1
lines changed

3 files changed

+125
-1
lines changed

google/cloud/aiplatform/base.py

+4
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,7 @@ def _list_with_local_order(
11431143
project: Optional[str] = None,
11441144
location: Optional[str] = None,
11451145
credentials: Optional[auth_credentials.Credentials] = None,
1146+
parent: Optional[str] = None,
11461147
) -> List[VertexAiResourceNoun]:
11471148
"""Private method to list all instances of this Vertex AI Resource,
11481149
takes a `cls_filter` arg to filter to a particular SDK resource
@@ -1179,6 +1180,8 @@ def _list_with_local_order(
11791180
credentials (auth_credentials.Credentials):
11801181
Optional. Custom credentials to use to retrieve list. Overrides
11811182
credentials set in aiplatform.init.
1183+
parent (str):
1184+
Optional. The parent resource name if any to retrieve resource list from.
11821185
11831186
Returns:
11841187
List[VertexAiResourceNoun] - A list of SDK resource objects
@@ -1192,6 +1195,7 @@ def _list_with_local_order(
11921195
project=project,
11931196
location=location,
11941197
credentials=credentials,
1198+
parent=parent,
11951199
)
11961200

11971201
if order_by:

google/cloud/aiplatform/model_evaluation/model_evaluation.py

+61-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from google.cloud.aiplatform import models
2323
from google.protobuf import struct_pb2
2424

25-
from typing import Optional
25+
from typing import List, Optional
2626

2727

2828
class ModelEvaluation(base.VertexAiResourceNounWithFutureManager):
@@ -91,3 +91,63 @@ def delete(self):
9191
raise NotImplementedError(
9292
"Deleting a model evaluation has not been implemented yet."
9393
)
94+
95+
@classmethod
96+
def list(
97+
cls,
98+
model: str,
99+
filter: Optional[str] = None,
100+
order_by: Optional[str] = None,
101+
enable_simple_view: bool = False,
102+
project: Optional[str] = None,
103+
location: Optional[str] = None,
104+
credentials: Optional[auth_credentials.Credentials] = None,
105+
) -> List["ModelEvaluation"]:
106+
"""List all ModelEvaluation resources on the provided model.
107+
108+
Example Usage:
109+
110+
aiplatform.ModelEvaluation.list(
111+
model="projects/123/locations/us-central1/models/456",
112+
)
113+
114+
aiplatform.Model.list(
115+
model="projects/123/locations/us-central1/models/456",
116+
order_by="create_time desc, display_name"
117+
)
118+
119+
Args:
120+
model (str):
121+
Required. The resource name of the model to list evaluations for.
122+
For example: "projects/123/locations/us-central1/models/456".
123+
filter (str):
124+
Optional. An expression for filtering the results of the request.
125+
For field names both snake_case and camelCase are supported.
126+
order_by (str):
127+
Optional. A comma-separated list of fields to order by, sorted in
128+
ascending order. Use "desc" after a field name for descending.
129+
Supported fields: `display_name`, `create_time`, `update_time`
130+
project (str):
131+
Optional. Project to retrieve list from. If not set, project
132+
set in aiplatform.init will be used.
133+
location (str):
134+
Optional. Location to retrieve list from. If not set, location
135+
set in aiplatform.init will be used.
136+
credentials (auth_credentials.Credentials):
137+
Optional. Custom credentials to use to retrieve list. Overrides
138+
credentials set in aiplatform.init.
139+
parent (str):
140+
Optional. The parent resource name if any to retrieve list from.
141+
142+
Returns:
143+
List[VertexAiResourceNoun] - A list of SDK resource objects
144+
"""
145+
146+
return super()._list_with_local_order(
147+
filter=filter,
148+
order_by=order_by,
149+
project=project,
150+
location=location,
151+
credentials=credentials,
152+
parent=model,
153+
)

tests/unit/aiplatform/test_model_evaluation.py

+60
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
# limitations under the License.
1616
#
1717

18+
import datetime
1819
import pytest
1920

2021
from unittest import mock
2122

23+
from google.api_core import datetime_helpers
24+
2225
from google.cloud import aiplatform
2326
from google.cloud.aiplatform import base
2427
from google.cloud.aiplatform import models
@@ -96,6 +99,37 @@ def mock_model_eval_get():
9699
yield mock_get_model_eval
97100

98101

102+
_TEST_MODEL_EVAL_LIST = [
103+
gca_model_evaluation.ModelEvaluation(
104+
name=_TEST_MODEL_EVAL_RESOURCE_NAME,
105+
create_time=datetime_helpers.DatetimeWithNanoseconds(
106+
2023, 5, 14, 16, 24, 3, 299558, tzinfo=datetime.timezone.utc
107+
),
108+
),
109+
gca_model_evaluation.ModelEvaluation(
110+
name=_TEST_MODEL_EVAL_RESOURCE_NAME,
111+
create_time=datetime_helpers.DatetimeWithNanoseconds(
112+
2023, 6, 14, 16, 24, 3, 299558, tzinfo=datetime.timezone.utc
113+
),
114+
),
115+
gca_model_evaluation.ModelEvaluation(
116+
name=_TEST_MODEL_EVAL_RESOURCE_NAME,
117+
create_time=datetime_helpers.DatetimeWithNanoseconds(
118+
2023, 7, 14, 16, 24, 3, 299558, tzinfo=datetime.timezone.utc
119+
),
120+
),
121+
]
122+
123+
124+
@pytest.fixture
125+
def list_model_evaluations_mock():
126+
with mock.patch.object(
127+
model_service_client.ModelServiceClient, "list_model_evaluations"
128+
) as list_model_evaluations_mock:
129+
list_model_evaluations_mock.return_value = _TEST_MODEL_EVAL_LIST
130+
yield list_model_evaluations_mock
131+
132+
99133
@pytest.mark.usefixtures("google_auth_mock")
100134
class TestModelEvaluation:
101135
def test_init_model_evaluation_with_only_resource_name(self, mock_model_eval_get):
@@ -156,3 +190,29 @@ def test_no_delete_model_evaluation_method(self, mock_model_eval_get):
156190

157191
with pytest.raises(NotImplementedError):
158192
my_eval.delete()
193+
194+
def test_list_model_evaluations(
195+
self,
196+
mock_model_eval_get,
197+
get_model_mock,
198+
list_model_evaluations_mock,
199+
):
200+
aiplatform.init(project=_TEST_PROJECT)
201+
202+
metrics_list = aiplatform.ModelEvaluation.list(model=_TEST_MODEL_RESOURCE_NAME)
203+
204+
assert isinstance(metrics_list[0], aiplatform.ModelEvaluation)
205+
206+
def test_list_model_evaluations_with_order_by(
207+
self,
208+
mock_model_eval_get,
209+
get_model_mock,
210+
list_model_evaluations_mock,
211+
):
212+
aiplatform.init(project=_TEST_PROJECT)
213+
214+
metrics_list = aiplatform.ModelEvaluation.list(
215+
model=_TEST_MODEL_RESOURCE_NAME, order_by="create_time desc"
216+
)
217+
218+
assert metrics_list[0].create_time > metrics_list[1].create_time

0 commit comments

Comments
 (0)