Skip to content

Commit ed777f8

Browse files
authored
Merge branch 'main' into feature/custom_chat_template
2 parents f1afde5 + f80867a commit ed777f8

File tree

7 files changed

+246
-81
lines changed

7 files changed

+246
-81
lines changed

ads/aqua/extension/common_handler.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#!/usr/bin/env python
22
# Copyright (c) 2025 Oracle and/or its affiliates.
33
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
4-
5-
4+
import json
5+
import os
66
from importlib import metadata
77

88
import huggingface_hub
@@ -18,6 +18,10 @@
1818
)
1919
from ads.aqua.extension.base_handler import AquaAPIhandler
2020
from ads.aqua.extension.errors import Errors
21+
from ads.common.object_storage_details import ObjectStorageDetails
22+
from ads.common.utils import read_file
23+
from ads.config import CONDA_BUCKET_NAME, CONDA_BUCKET_NS
24+
from ads.opctl.operator.common.utils import default_signer
2125

2226

2327
class ADSVersionHandler(AquaAPIhandler):
@@ -28,6 +32,46 @@ def get(self):
2832
self.finish({"data": metadata.version("oracle_ads")})
2933

3034

35+
class AquaVersionHandler(AquaAPIhandler):
36+
@handle_exceptions
37+
def get(self):
38+
"""
39+
Returns the current and latest deployed version of AQUA
40+
41+
{
42+
"installed": {
43+
"aqua": "0.1.3.0",
44+
"ads": "2.14.2"
45+
},
46+
"latest": {
47+
"aqua": "0.1.4.0",
48+
"ads": "2.14.4"
49+
}
50+
}
51+
52+
"""
53+
54+
current_aqua_version_path = os.path.join(
55+
os.path.dirname(os.path.abspath(__file__)), "..", "version.json"
56+
)
57+
current_aqua_version = json.loads(read_file(current_aqua_version_path))
58+
current_ads_version = {"ads": metadata.version("oracle_ads")}
59+
current_version = {"installed": {**current_aqua_version, **current_ads_version}}
60+
try:
61+
latest_version_artifact_path = ObjectStorageDetails(
62+
CONDA_BUCKET_NAME,
63+
CONDA_BUCKET_NS,
64+
"service_pack/aqua_latest_version.json",
65+
).path
66+
latest_version = json.loads(
67+
read_file(latest_version_artifact_path, auth=default_signer())
68+
)
69+
except Exception:
70+
latest_version = {"latest": current_version["installed"]}
71+
response = {**current_version, **latest_version}
72+
return self.finish(response)
73+
74+
3175
class CompatibilityCheckHandler(AquaAPIhandler):
3276
"""The handler to check if the extension is compatible."""
3377

@@ -118,4 +162,5 @@ def get(self):
118162
("network_status", NetworkStatusHandler),
119163
("hf_login", HFLoginHandler),
120164
("hf_logged_in", HFUserStatusHandler),
165+
("aqua_version", AquaVersionHandler),
121166
]

ads/aqua/modeldeployment/deployment.py

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55

66
import json
7+
import re
78
import shlex
89
import threading
910
from datetime import datetime, timedelta
@@ -752,14 +753,16 @@ def _create_deployment(
752753
).deploy(wait_for_completion=False)
753754

754755
deployment_id = deployment.id
756+
755757
logger.info(
756758
f"Aqua model deployment {deployment_id} created for model {aqua_model_id}. Work request Id is {deployment.dsc_model_deployment.workflow_req_id}"
757759
)
760+
status_list = []
758761

759762
progress_thread = threading.Thread(
760763
target=self.get_deployment_status,
761764
args=(
762-
deployment_id,
765+
deployment,
763766
deployment.dsc_model_deployment.workflow_req_id,
764767
model_type,
765768
model_name,
@@ -1265,7 +1268,7 @@ def list_shapes(self, **kwargs) -> List[ComputeShapeSummary]:
12651268

12661269
def get_deployment_status(
12671270
self,
1268-
model_deployment_id: str,
1271+
deployment: ModelDeployment,
12691272
work_request_id: str,
12701273
model_type: str,
12711274
model_name: str,
@@ -1287,37 +1290,60 @@ def get_deployment_status(
12871290
AquaDeployment
12881291
An Aqua deployment instance.
12891292
"""
1290-
ocid = get_ocid_substring(model_deployment_id, key_len=8)
1291-
telemetry_kwargs = {"ocid": ocid}
1292-
1293+
ocid = get_ocid_substring(deployment.id, key_len=8)
12931294
data_science_work_request: DataScienceWorkRequest = DataScienceWorkRequest(
12941295
work_request_id
12951296
)
1296-
12971297
try:
12981298
data_science_work_request.wait_work_request(
12991299
progress_bar_description="Creating model deployment",
13001300
max_wait_time=DEFAULT_WAIT_TIME,
13011301
poll_interval=DEFAULT_POLL_INTERVAL,
13021302
)
13031303
except Exception:
1304+
status = ""
1305+
logs = deployment.show_logs().sort_values(by="time", ascending=False)
1306+
1307+
if logs and len(logs) > 0:
1308+
status = logs.iloc[0]["message"]
1309+
1310+
status = re.sub(r"[^a-zA-Z0-9]", " ", status)
1311+
13041312
if data_science_work_request._error_message:
13051313
error_str = ""
13061314
for error in data_science_work_request._error_message:
13071315
error_str = error_str + " " + error.message
13081316

1309-
self.telemetry.record_event(
1310-
category=f"aqua/{model_type}/deployment/status",
1311-
action="FAILED",
1312-
detail=error_str,
1313-
value=model_name,
1314-
**telemetry_kwargs,
1315-
)
1317+
error_str = re.sub(r"[^a-zA-Z0-9]", " ", error_str)
1318+
telemetry_kwargs = {
1319+
"ocid": ocid,
1320+
"model_name": model_name,
1321+
"work_request_error": error_str,
1322+
"status": status,
1323+
}
1324+
1325+
self.telemetry.record_event(
1326+
category=f"aqua/{model_type}/deployment/status",
1327+
action="FAILED",
1328+
**telemetry_kwargs,
1329+
)
1330+
else:
1331+
telemetry_kwargs = {
1332+
"ocid": ocid,
1333+
"model_name": model_name,
1334+
"status": status,
1335+
}
1336+
1337+
self.telemetry.record_event(
1338+
category=f"aqua/{model_type}/deployment/status",
1339+
action="FAILED",
1340+
**telemetry_kwargs,
1341+
)
13161342

13171343
else:
1318-
self.telemetry.record_event_async(
1344+
telemetry_kwargs = {"ocid": ocid, "model_name": model_name}
1345+
self.telemetry.record_event(
13191346
category=f"aqua/{model_type}/deployment/status",
13201347
action="SUCCEEDED",
1321-
value=model_name,
13221348
**telemetry_kwargs,
13231349
)

ads/aqua/version.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"aqua": "1.0.7"
3+
}

ads/common/oci_logging.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
#!/usr/bin/env python
2-
# -*- coding: utf-8; -*-
32

43
# Copyright (c) 2021, 2024 Oracle and/or its affiliates.
54
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
65

76
import datetime
87
import logging
98
import time
10-
from typing import Dict, Union, List
9+
from typing import Dict, List, Union
1110

11+
import oci.exceptions
1212
import oci.logging
1313
import oci.loggingsearch
14-
import oci.exceptions
14+
1515
from ads.common.decorator.utils import class_or_instance_method
1616
from ads.common.oci_mixin import OCIModelMixin, OCIWorkRequestMixin
1717
from ads.common.oci_resource import OCIResource, ResourceNotFoundError
1818

19-
2019
logger = logging.getLogger(__name__)
2120

2221
# Maximum number of log records to be returned by default.
@@ -862,9 +861,7 @@ def tail(
862861
time_start=time_start,
863862
log_filter=log_filter,
864863
)
865-
self._print(
866-
sorted(tail_logs, key=lambda log: log["time"])
867-
)
864+
self._print(sorted(tail_logs, key=lambda log: log["time"]))
868865

869866
def head(
870867
self,

0 commit comments

Comments
 (0)