From e5742ec16b9c48ad74a8a78792f1de2034ab3563 Mon Sep 17 00:00:00 2001 From: xainaz Date: Fri, 16 Aug 2024 19:29:14 +0300 Subject: [PATCH 01/11] Fixing mixup --- aixplain/modules/model/__init__.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/aixplain/modules/model/__init__.py b/aixplain/modules/model/__init__.py index 4be40225..6ce76a0d 100644 --- a/aixplain/modules/model/__init__.py +++ b/aixplain/modules/model/__init__.py @@ -247,7 +247,20 @@ def run_async(self, data: Union[Text, Dict], name: Text = "model_process", param except Exception: response = {"status": "FAILED"} msg = f"Error in request for {name} - {traceback.format_exc()}" - logging.error(f"Model Run Async: Error in running for {name}: {resp}") + if r.status_code == 401: + error_msg = "Unauthorized API key" + elif 460 <= r.status_code < 470: + error_msg = "Subscription-related error" + elif 470 <= r.status_code < 480: + error_msg = "Billing-related error" + elif 480 <= r.status_code < 490: + error_msg = "Supplier-related error" + elif 490 <= r.status_code < 500: + error_msg = "Validation-related error" + else: + status_code = str(r.status_code) + error_msg = f"Status {status_code}: Unspecified error" + logging.error(f"Model Run Async: Error in running for {name}: {resp}, Status {r.status_code} : {error_msg}") if resp is not None: response["error"] = msg return response From e02195fab3301658d0194cf8f91765ec2302c996 Mon Sep 17 00:00:00 2001 From: xainaz Date: Fri, 16 Aug 2024 19:31:20 +0300 Subject: [PATCH 02/11] Fixing mixup --- aixplain/modules/model/llm_model.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/aixplain/modules/model/llm_model.py b/aixplain/modules/model/llm_model.py index 5c5c4140..e727d515 100644 --- a/aixplain/modules/model/llm_model.py +++ b/aixplain/modules/model/llm_model.py @@ -222,7 +222,20 @@ def run_async( except Exception: response = {"status": "FAILED"} msg = f"Error in request for {name} - {traceback.format_exc()}" - logging.error(f"Model Run Async: Error in running for {name}: {resp}") + if r.status_code == 401: + error_msg = "Unauthorized API key" + elif 460 <= r.status_code < 470: + error_msg = "Subscription-related error" + elif 470 <= r.status_code < 480: + error_msg = "Billing-related error" + elif 480 <= r.status_code < 490: + error_msg = "Supplier-related error" + elif 490 <= r.status_code < 500: + error_msg = "Validation-related error" + else: + status_code = str(r.status_code) + error_msg = f"Status {status_code}: Unspecified error" + logging.error(f"Model Run Async: Error in running for {name}: {resp}, Status {r.status_code} : {error_msg}") if resp is not None: response["error"] = msg return response From e6907fcae6c6c98a419ad4a3f5912c3f33be8a55 Mon Sep 17 00:00:00 2001 From: xainaz Date: Fri, 16 Aug 2024 19:37:51 +0300 Subject: [PATCH 03/11] Fixing mixup --- aixplain/modules/pipeline/asset.py | 110 +++++++++-------------------- 1 file changed, 34 insertions(+), 76 deletions(-) diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index ce168036..5132daf1 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -24,7 +24,6 @@ import time import json import os -import uuid import logging from aixplain.modules.asset import Asset from aixplain.utils import config @@ -101,9 +100,7 @@ def __polling( while not completed and (end - start) < timeout: try: response_body = self.poll(poll_url, name=name) - logging.debug( - f"Polling for Pipeline: Status of polling for {name} : {response_body}" - ) + logging.debug(f"Polling for Pipeline: Status of polling for {name} : {response_body}") completed = response_body["completed"] end = time.time() @@ -112,18 +109,12 @@ def __polling( if wait_time < 60: wait_time *= 1.1 except Exception: - logging.error( - f"Polling for Pipeline: polling for {name} : Continue" - ) + logging.error(f"Polling for Pipeline: polling for {name} : Continue") if response_body and response_body["status"] == "SUCCESS": try: - logging.debug( - f"Polling for Pipeline: Final status of polling for {name} : SUCCESS - {response_body}" - ) + logging.debug(f"Polling for Pipeline: Final status of polling for {name} : SUCCESS - {response_body}") except Exception: - logging.error( - f"Polling for Pipeline: Final status of polling for {name} : ERROR - {response_body}" - ) + logging.error(f"Polling for Pipeline: Final status of polling for {name} : ERROR - {response_body}") else: logging.error( f"Polling for Pipeline: Final status of polling for {name} : No response in {timeout} seconds - {response_body}" @@ -148,9 +139,7 @@ def poll(self, poll_url: Text, name: Text = "pipeline_process") -> Dict: r = _request_with_retry("get", poll_url, headers=headers) try: resp = r.json() - logging.info( - f"Single Poll for Pipeline: Status of polling for {name} : {resp}" - ) + logging.info(f"Single Poll for Pipeline: Status of polling for {name} : {resp}") except Exception: resp = {"status": "FAILED"} return resp @@ -179,18 +168,14 @@ def run( """ start = time.time() try: - response = self.run_async( - data, data_asset=data_asset, name=name, **kwargs - ) + response = self.run_async(data, data_asset=data_asset, name=name, **kwargs) if response["status"] == "FAILED": end = time.time() response["elapsed_time"] = end - start return response poll_url = response["url"] end = time.time() - response = self.__polling( - poll_url, name=name, timeout=timeout, wait_time=wait_time - ) + response = self.__polling(poll_url, name=name, timeout=timeout, wait_time=wait_time) return response except Exception as e: error_message = f"Error in request for {name}: {str(e)}" @@ -240,10 +225,7 @@ def __prepare_payload( try: payload = json.loads(data) if isinstance(payload, dict) is False: - if ( - isinstance(payload, int) is True - or isinstance(payload, float) is True - ): + if isinstance(payload, int) is True or isinstance(payload, float) is True: payload = str(payload) payload = {"data": payload} except Exception: @@ -273,33 +255,15 @@ def __prepare_payload( try: dasset = CorpusFactory.get(str(data_asset[node_label])) asset_payload["dataAsset"]["corpus_id"] = dasset.id - if ( - len( - [ - d - for d in dasset.data - if d.id == data[node_label] - ] - ) - > 0 - ): + if len([d for d in dasset.data if d.id == data[node_label]]) > 0: data_found = True except Exception: try: - dasset = DatasetFactory.get( - str(data_asset[node_label]) - ) + dasset = DatasetFactory.get(str(data_asset[node_label])) asset_payload["dataAsset"]["dataset_id"] = dasset.id if ( - len( - [ - dfield - for dfield in dasset.source_data - if dasset.source_data[dfield].id - == data[node_label] - ] - ) + len([dfield for dfield in dasset.source_data if dasset.source_data[dfield].id == data[node_label]]) > 0 ): data_found = True @@ -332,11 +296,7 @@ def __prepare_payload( return payload def run_async( - self, - data: Union[Text, Dict], - data_asset: Optional[Union[Text, Dict]] = None, - name: Text = "pipeline_process", - **kwargs + self, data: Union[Text, Dict], data_asset: Optional[Union[Text, Dict]] = None, name: Text = "pipeline_process", **kwargs ) -> Dict: """Runs asynchronously a pipeline call. @@ -359,21 +319,31 @@ def run_async( payload = json.dumps(payload) call_url = f"{self.url}/{self.id}" logging.info(f"Start service for {name} - {call_url} - {payload}") - r = _request_with_retry( - "post", call_url, headers=headers, data=payload - ) + r = _request_with_retry("post", call_url, headers=headers, data=payload) resp = None try: resp = r.json() - logging.info( - f"Result of request for {name} - {r.status_code} - {resp}" - ) + logging.info(f"Result of request for {name} - {r.status_code} - {resp}") poll_url = resp["url"] response = {"status": "IN_PROGRESS", "url": poll_url} except Exception: response = {"status": "FAILED"} + if r.status_code == 401: + error_msg = "Unauthorized API key" + elif 460 <= r.status_code < 470: + error_msg = "Subscription-related error" + elif 470 <= r.status_code < 480: + error_msg = "Billing-related error" + elif 480 <= r.status_code < 490: + error_msg = "Supplier-related error" + elif 490 <= r.status_code < 500: + error_msg = "Validation-related error" + else: + status_code = str(r.status_code) + error_msg = f"Status {status_code}: Unspecified error" + logging.error(f"Pipeline Run Async: Error in running for {name}: {resp}, Status {r.status_code} : {error_msg}") if resp is not None: response["error"] = resp return response @@ -405,9 +375,7 @@ def update( for i, node in enumerate(pipeline["nodes"]): if "functionType" in node and node["functionType"] == "AI": - pipeline["nodes"][i]["functionType"] = pipeline["nodes"][ - i - ]["functionType"].lower() + pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i]["functionType"].lower() # prepare payload status = "draft" if save_as_asset is True: @@ -423,9 +391,7 @@ def update( "Authorization": f"Token {api_key}", "Content-Type": "application/json", } - logging.info( - f"Start service for PUT Update Pipeline - {url} - {headers} - {json.dumps(payload)}" - ) + logging.info(f"Start service for PUT Update Pipeline - {url} - {headers} - {json.dumps(payload)}") r = _request_with_retry("put", url, headers=headers, json=payload) response = r.json() logging.info(f"Pipeline {response['id']} Updated.") @@ -440,9 +406,7 @@ def delete(self) -> None: "Authorization": f"Token {config.TEAM_API_KEY}", "Content-Type": "application/json", } - logging.info( - f"Start service for DELETE Pipeline - {url} - {headers}" - ) + logging.info(f"Start service for DELETE Pipeline - {url} - {headers}") r = _request_with_retry("delete", url, headers=headers) if r.status_code != 200: raise Exception() @@ -451,9 +415,7 @@ def delete(self) -> None: logging.error(message) raise Exception(f"{message}") - def save( - self, save_as_asset: bool = False, api_key: Optional[Text] = None - ): + def save(self, save_as_asset: bool = False, api_key: Optional[Text] = None): """Save Pipeline Args: @@ -468,9 +430,7 @@ def save( for i, node in enumerate(pipeline["nodes"]): if "functionType" in node and node["functionType"] == "AI": - pipeline["nodes"][i]["functionType"] = pipeline["nodes"][ - i - ]["functionType"].lower() + pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i]["functionType"].lower() # prepare payload status = "draft" if save_as_asset is True: @@ -492,9 +452,7 @@ def save( "Authorization": f"Token {api_key}", "Content-Type": "application/json", } - logging.info( - f"Start service for Save Pipeline - {url} - {headers} - {json.dumps(payload)}" - ) + logging.info(f"Start service for Save Pipeline - {url} - {headers} - {json.dumps(payload)}") r = _request_with_retry(method, url, headers=headers, json=payload) response = r.json() self.id = response["id"] From 3531ae645c6e42b678e9b2f05dc51d794727c801 Mon Sep 17 00:00:00 2001 From: xainaz Date: Mon, 19 Aug 2024 15:44:58 +0300 Subject: [PATCH 04/11] Put conditions inside try statements according to changes required. --- .gitignore | 2 ++ aixplain/modules/model/__init__.py | 16 ++++++---------- aixplain/modules/model/llm_model.py | 16 ++++++---------- aixplain/modules/pipeline/asset.py | 14 +++++--------- 4 files changed, 19 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index 843c6556..3a5b1ef6 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,5 @@ dmypy.json # Vscode .vscode + +.DS_Store \ No newline at end of file diff --git a/aixplain/modules/model/__init__.py b/aixplain/modules/model/__init__.py index 6ce76a0d..43cdd18b 100644 --- a/aixplain/modules/model/__init__.py +++ b/aixplain/modules/model/__init__.py @@ -240,13 +240,6 @@ def run_async(self, data: Union[Text, Dict], name: Text = "model_process", param resp = None try: resp = r.json() - logging.info(f"Result of request for {name} - {r.status_code} - {resp}") - - poll_url = resp["data"] - response = {"status": "IN_PROGRESS", "url": poll_url} - except Exception: - response = {"status": "FAILED"} - msg = f"Error in request for {name} - {traceback.format_exc()}" if r.status_code == 401: error_msg = "Unauthorized API key" elif 460 <= r.status_code < 470: @@ -260,9 +253,12 @@ def run_async(self, data: Union[Text, Dict], name: Text = "model_process", param else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" - logging.error(f"Model Run Async: Error in running for {name}: {resp}, Status {r.status_code} : {error_msg}") - if resp is not None: - response["error"] = msg + logging.info(f"Result of request for {name} - {r.status_code} - {resp}") + poll_url = resp["data"] + response = {"status": "IN_PROGRESS", "url": poll_url} + except Exception: + logging.error(f"Model Run Async: Error in running for {name}: {resp}") + response = {"status": "FAILED" , "error": error_msg} return response def check_finetune_status(self, after_epoch: Optional[int] = None): diff --git a/aixplain/modules/model/llm_model.py b/aixplain/modules/model/llm_model.py index e727d515..ac630d87 100644 --- a/aixplain/modules/model/llm_model.py +++ b/aixplain/modules/model/llm_model.py @@ -215,13 +215,6 @@ def run_async( resp = None try: resp = r.json() - logging.info(f"Result of request for {name} - {r.status_code} - {resp}") - - poll_url = resp["data"] - response = {"status": "IN_PROGRESS", "url": poll_url} - except Exception: - response = {"status": "FAILED"} - msg = f"Error in request for {name} - {traceback.format_exc()}" if r.status_code == 401: error_msg = "Unauthorized API key" elif 460 <= r.status_code < 470: @@ -235,7 +228,10 @@ def run_async( else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" - logging.error(f"Model Run Async: Error in running for {name}: {resp}, Status {r.status_code} : {error_msg}") - if resp is not None: - response["error"] = msg + logging.info(f"Result of request for {name} - {r.status_code} - {resp}") + poll_url = resp["data"] + response = {"status": "IN_PROGRESS", "url": poll_url} + except Exception: + logging.error(f"Model Run Async: Error in running for {name}: {resp}") + response = {"status": "FAILED" , "error": error_msg} return response diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index 5132daf1..f06d2256 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -324,12 +324,6 @@ def run_async( resp = None try: resp = r.json() - logging.info(f"Result of request for {name} - {r.status_code} - {resp}") - - poll_url = resp["url"] - response = {"status": "IN_PROGRESS", "url": poll_url} - except Exception: - response = {"status": "FAILED"} if r.status_code == 401: error_msg = "Unauthorized API key" elif 460 <= r.status_code < 470: @@ -343,9 +337,11 @@ def run_async( else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" - logging.error(f"Pipeline Run Async: Error in running for {name}: {resp}, Status {r.status_code} : {error_msg}") - if resp is not None: - response["error"] = resp + logging.info(f"Result of request for {name} - {r.status_code} - {resp}") + poll_url = resp["url"] + response = {"status": "IN_PROGRESS", "url": poll_url} + except Exception: + response = {"status": "FAILED", "error": error_msg} return response def update( From 569de4ae68667c6025a0fff46ff9dc42cb636ca0 Mon Sep 17 00:00:00 2001 From: xainaz Date: Mon, 19 Aug 2024 17:22:28 +0300 Subject: [PATCH 05/11] Changes made --- .gitignore | 3 +-- aixplain/modules/model/__init__.py | 17 ++++++++++++----- aixplain/modules/model/llm_model.py | 17 ++++++++++++----- aixplain/modules/pipeline/asset.py | 15 ++++++++++----- 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 3a5b1ef6..3ec74da5 100644 --- a/.gitignore +++ b/.gitignore @@ -130,5 +130,4 @@ dmypy.json # Vscode .vscode - -.DS_Store \ No newline at end of file +.DS_Store diff --git a/aixplain/modules/model/__init__.py b/aixplain/modules/model/__init__.py index 43cdd18b..87ac8ebc 100644 --- a/aixplain/modules/model/__init__.py +++ b/aixplain/modules/model/__init__.py @@ -239,7 +239,6 @@ def run_async(self, data: Union[Text, Dict], name: Text = "model_process", param resp = None try: - resp = r.json() if r.status_code == 401: error_msg = "Unauthorized API key" elif 460 <= r.status_code < 470: @@ -253,12 +252,20 @@ def run_async(self, data: Union[Text, Dict], name: Text = "model_process", param else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" - logging.info(f"Result of request for {name} - {r.status_code} - {resp}") - poll_url = resp["data"] - response = {"status": "IN_PROGRESS", "url": poll_url} + + if 401 <= r.status_code < 500: + response = {"status": "FAILED", "error_message": error_msg} + else: + resp = r.json() + logging.info(f"Result of request for {name} - {r.status_code} - {resp}") + poll_url = resp["data"] + response = {"status": "IN_PROGRESS", "url": poll_url} except Exception: + response = {"status": "FAILED"} + msg = f"Error in request for {name} - {traceback.format_exc()}" logging.error(f"Model Run Async: Error in running for {name}: {resp}") - response = {"status": "FAILED" , "error": error_msg} + if resp is not None: + response["error"] = msg return response def check_finetune_status(self, after_epoch: Optional[int] = None): diff --git a/aixplain/modules/model/llm_model.py b/aixplain/modules/model/llm_model.py index ac630d87..9ebbd59c 100644 --- a/aixplain/modules/model/llm_model.py +++ b/aixplain/modules/model/llm_model.py @@ -214,7 +214,6 @@ def run_async( resp = None try: - resp = r.json() if r.status_code == 401: error_msg = "Unauthorized API key" elif 460 <= r.status_code < 470: @@ -228,10 +227,18 @@ def run_async( else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" - logging.info(f"Result of request for {name} - {r.status_code} - {resp}") - poll_url = resp["data"] - response = {"status": "IN_PROGRESS", "url": poll_url} + + if 401 <= r.status_code < 500: + response = {"status": "FAILED", "error_message": error_msg} + else: + resp = r.json() + logging.info(f"Result of request for {name} - {r.status_code} - {resp}") + poll_url = resp["data"] + response = {"status": "IN_PROGRESS", "url": poll_url} except Exception: + response = {"status": "FAILED"} + msg = f"Error in request for {name} - {traceback.format_exc()}" logging.error(f"Model Run Async: Error in running for {name}: {resp}") - response = {"status": "FAILED" , "error": error_msg} + if resp is not None: + response["error"] = msg return response diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index f06d2256..2abc2a10 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -323,7 +323,6 @@ def run_async( resp = None try: - resp = r.json() if r.status_code == 401: error_msg = "Unauthorized API key" elif 460 <= r.status_code < 470: @@ -337,11 +336,17 @@ def run_async( else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" - logging.info(f"Result of request for {name} - {r.status_code} - {resp}") - poll_url = resp["url"] - response = {"status": "IN_PROGRESS", "url": poll_url} + if 401 <= r.status_code < 500: + response = {"status": "FAILED", "error_message": error_msg} + else: + resp = r.json() + logging.info(f"Result of request for {name} - {r.status_code} - {resp}") + poll_url = resp["url"] + response = {"status": "IN_PROGRESS", "url": poll_url} except Exception: - response = {"status": "FAILED", "error": error_msg} + response = {"status": "FAILED"} + if resp is not None: + response["error"] = resp return response def update( From e39465d07f2b2562c041a9fef28189060d17ba60 Mon Sep 17 00:00:00 2001 From: zaina826 Date: Mon, 19 Aug 2024 22:12:47 +0300 Subject: [PATCH 06/11] Logging the error + changing the range of error codes --- aixplain/modules/model/__init__.py | 34 ++++++++++++++-------------- aixplain/modules/model/llm_model.py | 35 +++++++++++++++-------------- aixplain/modules/pipeline/asset.py | 34 +++++++++++++++------------- 3 files changed, 53 insertions(+), 50 deletions(-) diff --git a/aixplain/modules/model/__init__.py b/aixplain/modules/model/__init__.py index 87ac8ebc..b2dc15f7 100644 --- a/aixplain/modules/model/__init__.py +++ b/aixplain/modules/model/__init__.py @@ -239,27 +239,27 @@ def run_async(self, data: Union[Text, Dict], name: Text = "model_process", param resp = None try: - if r.status_code == 401: - error_msg = "Unauthorized API key" - elif 460 <= r.status_code < 470: - error_msg = "Subscription-related error" - elif 470 <= r.status_code < 480: - error_msg = "Billing-related error" - elif 480 <= r.status_code < 490: - error_msg = "Supplier-related error" - elif 490 <= r.status_code < 500: - error_msg = "Validation-related error" - else: - status_code = str(r.status_code) - error_msg = f"Status {status_code}: Unspecified error" - - if 401 <= r.status_code < 500: - response = {"status": "FAILED", "error_message": error_msg} - else: + if 200 <= r.status_code < 300: resp = r.json() logging.info(f"Result of request for {name} - {r.status_code} - {resp}") poll_url = resp["data"] response = {"status": "IN_PROGRESS", "url": poll_url} + else: + if r.status_code == 401: + error_msg = "Unauthorized API key" + elif 460 <= r.status_code < 470: + error_msg = "Subscription-related error" + elif 470 <= r.status_code < 480: + error_msg = "Billing-related error" + elif 480 <= r.status_code < 490: + error_msg = "Supplier-related error" + elif 490 <= r.status_code < 500: + error_msg = "Validation-related error" + else: + status_code = str(r.status_code) + error_msg = f"Status {status_code}: Unspecified error" + response = {"status": "FAILED", "error_message": error_msg} + logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") except Exception: response = {"status": "FAILED"} msg = f"Error in request for {name} - {traceback.format_exc()}" diff --git a/aixplain/modules/model/llm_model.py b/aixplain/modules/model/llm_model.py index 9ebbd59c..4ed83144 100644 --- a/aixplain/modules/model/llm_model.py +++ b/aixplain/modules/model/llm_model.py @@ -214,27 +214,28 @@ def run_async( resp = None try: - if r.status_code == 401: - error_msg = "Unauthorized API key" - elif 460 <= r.status_code < 470: - error_msg = "Subscription-related error" - elif 470 <= r.status_code < 480: - error_msg = "Billing-related error" - elif 480 <= r.status_code < 490: - error_msg = "Supplier-related error" - elif 490 <= r.status_code < 500: - error_msg = "Validation-related error" - else: - status_code = str(r.status_code) - error_msg = f"Status {status_code}: Unspecified error" - - if 401 <= r.status_code < 500: - response = {"status": "FAILED", "error_message": error_msg} - else: + if 200 <= r.status_code < 300: resp = r.json() logging.info(f"Result of request for {name} - {r.status_code} - {resp}") poll_url = resp["data"] response = {"status": "IN_PROGRESS", "url": poll_url} + else: + if r.status_code == 401: + error_msg = "Unauthorized API key" + elif 460 <= r.status_code < 470: + error_msg = "Subscription-related error" + elif 470 <= r.status_code < 480: + error_msg = "Billing-related error" + elif 480 <= r.status_code < 490: + error_msg = "Supplier-related error" + elif 490 <= r.status_code < 500: + error_msg = "Validation-related error" + else: + status_code = str(r.status_code) + error_msg = f"Status {status_code}: Unspecified error" + + response = {"status": "FAILED", "error_message": error_msg} + logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") except Exception: response = {"status": "FAILED"} msg = f"Error in request for {name} - {traceback.format_exc()}" diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index 2abc2a10..c4519fad 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -323,26 +323,28 @@ def run_async( resp = None try: - if r.status_code == 401: - error_msg = "Unauthorized API key" - elif 460 <= r.status_code < 470: - error_msg = "Subscription-related error" - elif 470 <= r.status_code < 480: - error_msg = "Billing-related error" - elif 480 <= r.status_code < 490: - error_msg = "Supplier-related error" - elif 490 <= r.status_code < 500: - error_msg = "Validation-related error" - else: - status_code = str(r.status_code) - error_msg = f"Status {status_code}: Unspecified error" - if 401 <= r.status_code < 500: - response = {"status": "FAILED", "error_message": error_msg} - else: + if 200 <= r.status_code < 300: resp = r.json() logging.info(f"Result of request for {name} - {r.status_code} - {resp}") poll_url = resp["url"] response = {"status": "IN_PROGRESS", "url": poll_url} + else: + if r.status_code == 401: + error_msg = "Unauthorized API key" + elif 460 <= r.status_code < 470: + error_msg = "Subscription-related error" + elif 470 <= r.status_code < 480: + error_msg = "Billing-related error" + elif 480 <= r.status_code < 490: + error_msg = "Supplier-related error" + elif 490 <= r.status_code < 500: + error_msg = "Validation-related error" + else: + status_code = str(r.status_code) + error_msg = f"Status {status_code}: Unspecified error" + + response = {"status": "FAILED", "error_message": error_msg} + logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") except Exception: response = {"status": "FAILED"} if resp is not None: From e5714ca1bcdcefe78e179420088439cb1f4c804d Mon Sep 17 00:00:00 2001 From: xainaz Date: Mon, 19 Aug 2024 22:17:10 +0300 Subject: [PATCH 07/11] Logging the error + changing the range of error codes --- aixplain/modules/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aixplain/modules/model/__init__.py b/aixplain/modules/model/__init__.py index b2dc15f7..382a8bce 100644 --- a/aixplain/modules/model/__init__.py +++ b/aixplain/modules/model/__init__.py @@ -258,6 +258,7 @@ def run_async(self, data: Union[Text, Dict], name: Text = "model_process", param else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" + response = {"status": "FAILED", "error_message": error_msg} logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") except Exception: From 050e31bd556d9cd7086dcd3304314361cdc96dbf Mon Sep 17 00:00:00 2001 From: xainaz Date: Mon, 19 Aug 2024 22:19:07 +0300 Subject: [PATCH 08/11] Logging the error + Account --- aixplain/modules/model/__init__.py | 1 - aixplain/modules/model/llm_model.py | 1 - aixplain/modules/pipeline/asset.py | 1 - 3 files changed, 3 deletions(-) diff --git a/aixplain/modules/model/__init__.py b/aixplain/modules/model/__init__.py index 382a8bce..b2dc15f7 100644 --- a/aixplain/modules/model/__init__.py +++ b/aixplain/modules/model/__init__.py @@ -258,7 +258,6 @@ def run_async(self, data: Union[Text, Dict], name: Text = "model_process", param else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" - response = {"status": "FAILED", "error_message": error_msg} logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") except Exception: diff --git a/aixplain/modules/model/llm_model.py b/aixplain/modules/model/llm_model.py index 4ed83144..1c03e7c2 100644 --- a/aixplain/modules/model/llm_model.py +++ b/aixplain/modules/model/llm_model.py @@ -233,7 +233,6 @@ def run_async( else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" - response = {"status": "FAILED", "error_message": error_msg} logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") except Exception: diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index c4519fad..c2c9d553 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -342,7 +342,6 @@ def run_async( else: status_code = str(r.status_code) error_msg = f"Status {status_code}: Unspecified error" - response = {"status": "FAILED", "error_message": error_msg} logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") except Exception: From 18eaf9cca3f552cc250eb448741cc52d10b6b57d Mon Sep 17 00:00:00 2001 From: xainaz Date: Wed, 21 Aug 2024 18:33:58 +0300 Subject: [PATCH 09/11] Added elaborative error messages --- aixplain/modules/model/__init__.py | 16 ++++++++-------- aixplain/modules/model/llm_model.py | 16 ++++++++-------- aixplain/modules/pipeline/asset.py | 16 ++++++++-------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/aixplain/modules/model/__init__.py b/aixplain/modules/model/__init__.py index b2dc15f7..8fcd80d2 100644 --- a/aixplain/modules/model/__init__.py +++ b/aixplain/modules/model/__init__.py @@ -246,20 +246,20 @@ def run_async(self, data: Union[Text, Dict], name: Text = "model_process", param response = {"status": "IN_PROGRESS", "url": poll_url} else: if r.status_code == 401: - error_msg = "Unauthorized API key" + error = "Unauthorized API key: Please verify the spelling of the API key and its current validity." elif 460 <= r.status_code < 470: - error_msg = "Subscription-related error" + error = "Subscription-related error: Please ensure that your subscription is active and has not expired." elif 470 <= r.status_code < 480: - error_msg = "Billing-related error" + error = "Billing-related error: Please ensure you have enough credits to run this model. " elif 480 <= r.status_code < 490: - error_msg = "Supplier-related error" + error = "Supplier-related error: Please ensure that the selected supplier provides the model you are trying to access." elif 490 <= r.status_code < 500: - error_msg = "Validation-related error" + error = "Validation-related error: Please ensure all required fields are provided and correctly formatted." else: status_code = str(r.status_code) - error_msg = f"Status {status_code}: Unspecified error" - response = {"status": "FAILED", "error_message": error_msg} - logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") + error = f"Status {status_code}: Unspecified error: An unspecified error occurred while processing your request." + response = {"status": "FAILED", "error_message": error} + logging.error(f"Error in request for {name} - {r.status_code}: {error}") except Exception: response = {"status": "FAILED"} msg = f"Error in request for {name} - {traceback.format_exc()}" diff --git a/aixplain/modules/model/llm_model.py b/aixplain/modules/model/llm_model.py index 1c03e7c2..c595d207 100644 --- a/aixplain/modules/model/llm_model.py +++ b/aixplain/modules/model/llm_model.py @@ -221,20 +221,20 @@ def run_async( response = {"status": "IN_PROGRESS", "url": poll_url} else: if r.status_code == 401: - error_msg = "Unauthorized API key" + error = "Unauthorized API key: Please verify the spelling of the API key and its current validity." elif 460 <= r.status_code < 470: - error_msg = "Subscription-related error" + error = "Subscription-related error: Please ensure that your subscription is active and has not expired." elif 470 <= r.status_code < 480: - error_msg = "Billing-related error" + error = "Billing-related error: Please ensure you have enough credits to run this model. " elif 480 <= r.status_code < 490: - error_msg = "Supplier-related error" + error = "Supplier-related error: Please ensure that the selected supplier provides the model you are trying to access." elif 490 <= r.status_code < 500: - error_msg = "Validation-related error" + error = "Validation-related error: Please ensure all required fields are provided and correctly formatted." else: status_code = str(r.status_code) - error_msg = f"Status {status_code}: Unspecified error" - response = {"status": "FAILED", "error_message": error_msg} - logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") + error = f"Status {status_code}: Unspecified error: An unspecified error occurred while processing your request." + response = {"status": "FAILED", "error_message": error} + logging.error(f"Error in request for {name} - {r.status_code}: {error}") except Exception: response = {"status": "FAILED"} msg = f"Error in request for {name} - {traceback.format_exc()}" diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index c2c9d553..20b5de83 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -330,20 +330,20 @@ def run_async( response = {"status": "IN_PROGRESS", "url": poll_url} else: if r.status_code == 401: - error_msg = "Unauthorized API key" + error = "Unauthorized API key: Please verify the spelling of the API key and its current validity." elif 460 <= r.status_code < 470: - error_msg = "Subscription-related error" + error = "Subscription-related error: Please ensure that your subscription is active and has not expired." elif 470 <= r.status_code < 480: - error_msg = "Billing-related error" + error = "Billing-related error: Please ensure you have enough credits to run this model. " elif 480 <= r.status_code < 490: - error_msg = "Supplier-related error" + error = "Supplier-related error: Please ensure that the selected supplier provides the model you are trying to access." elif 490 <= r.status_code < 500: - error_msg = "Validation-related error" + error = "Validation-related error: Please ensure all required fields are provided and correctly formatted." else: status_code = str(r.status_code) - error_msg = f"Status {status_code}: Unspecified error" - response = {"status": "FAILED", "error_message": error_msg} - logging.error(f"Error in request for {name} - {r.status_code}: {error_msg}") + error = f"Status {status_code}: Unspecified error: An unspecified error occurred while processing your request." + response = {"status": "FAILED", "error_message": error} + logging.error(f"Error in request for {name} - {r.status_code}: {error}") except Exception: response = {"status": "FAILED"} if resp is not None: From ae3960a85d293dafe1b49464c2b9f7b0c8b3ff85 Mon Sep 17 00:00:00 2001 From: xainaz Date: Wed, 21 Aug 2024 23:55:21 +0300 Subject: [PATCH 10/11] Added test for model errors --- tests/unit/model_test.py | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/tests/unit/model_test.py b/tests/unit/model_test.py index 269c821e..4aa64392 100644 --- a/tests/unit/model_test.py +++ b/tests/unit/model_test.py @@ -17,6 +17,8 @@ """ from dotenv import load_dotenv +from urllib.parse import urljoin +import requests_mock load_dotenv() import re @@ -57,3 +59,81 @@ def test_failed_poll(): assert hyp_response["error"] == ref_response["error"] assert hyp_response["supplierError"] == ref_response["supplierError"] assert hyp_response["status"] == "FAILED" + +def test_run_async_unauthorized_error(): + base_url = config.MODELS_RUN_URL + model_id = "model-id" + execute_url = urljoin(base_url, f"execute/{model_id}") + + with requests_mock.Mocker() as mock: + mock.post(execute_url, status_code=401) + test_model = Model(id=model_id, name="Test Model",url=base_url) + response = test_model.run_async(data="input_data") + assert response["status"] == "FAILED" + assert response["error_message"] == "Unauthorized API key: Please verify the spelling of the API key and its current validity." + +def test_run_async_subscription_error(): + base_url = config.MODELS_RUN_URL + model_id = "model-id" + execute_url = urljoin(base_url, f"execute/{model_id}") + + with requests_mock.Mocker() as mock: + mock.post(execute_url, status_code=465) + test_model = Model(id=model_id, name="Test Model",url=base_url) + response = test_model.run_async(data="input_data") + assert response["status"] == "FAILED" + assert response["error_message"] == "Subscription-related error: Please ensure that your subscription is active and has not expired." + +def test_run_async_billing_error(): + base_url = config.MODELS_RUN_URL + model_id = "model-id" + execute_url = urljoin(base_url, f"execute/{model_id}") + + with requests_mock.Mocker() as mock: + mock.post(execute_url, status_code=475) + test_model = Model(id=model_id, name="Test Model",url=base_url) + response = test_model.run_async(data="input_data") + assert response["status"] == "FAILED" + assert response["error_message"] == "Billing-related error: Please ensure you have enough credits to run this model. " + +def test_run_async_supplier_error(): + base_url = config.MODELS_RUN_URL + model_id = "model-id" + execute_url = urljoin(base_url, f"execute/{model_id}") + + with requests_mock.Mocker() as mock: + mock.post(execute_url, status_code=485) + test_model = Model(id=model_id, name="Test Model",url=base_url) + response = test_model.run_async(data="input_data") + assert response["status"] == "FAILED" + assert response["error_message"] == "Supplier-related error: Please ensure that the selected supplier provides the model you are trying to access." + + +def test_run_async_validation_error(): + base_url = config.MODELS_RUN_URL + model_id = "model-id" + execute_url = urljoin(base_url, f"execute/{model_id}") + + with requests_mock.Mocker() as mock: + mock.post(execute_url, status_code=495) + test_model = Model(id=model_id, name="Test Model",url=base_url) + response = test_model.run_async(data="input_data") + assert response["status"] == "FAILED" + assert response["error_message"] == "Validation-related error: Please ensure all required fields are provided and correctly formatted." + + +def test_run_async_unspecified_error(): + base_url = config.MODELS_RUN_URL + model_id = "model-id" + execute_url = urljoin(base_url, f"execute/{model_id}") + + with requests_mock.Mocker() as mock: + mock.post(execute_url, status_code=501) + test_model = Model(id=model_id, name="Test Model",url=base_url) + response = test_model.run_async(data="input_data") + assert response["status"] == "FAILED" + assert response["error_message"] == "Status 501: Unspecified error: An unspecified error occurred while processing your request." + + + + From 6848dfea3e50bf2a6270dbf4327650f0b344b426 Mon Sep 17 00:00:00 2001 From: xainaz Date: Thu, 22 Aug 2024 00:49:12 +0300 Subject: [PATCH 11/11] Added all tests --- aixplain/modules/pipeline/asset.py | 4 +- tests/unit/llm_test.py | 36 +++++++++++++ tests/unit/model_test.py | 81 ++++++------------------------ tests/unit/pipeline_test.py | 26 ++++++++++ 4 files changed, 78 insertions(+), 69 deletions(-) create mode 100644 tests/unit/llm_test.py diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index 20b5de83..860a08a5 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -334,9 +334,9 @@ def run_async( elif 460 <= r.status_code < 470: error = "Subscription-related error: Please ensure that your subscription is active and has not expired." elif 470 <= r.status_code < 480: - error = "Billing-related error: Please ensure you have enough credits to run this model. " + error = "Billing-related error: Please ensure you have enough credits to run this pipeline. " elif 480 <= r.status_code < 490: - error = "Supplier-related error: Please ensure that the selected supplier provides the model you are trying to access." + error = "Supplier-related error: Please ensure that the selected supplier provides the pipeline you are trying to access." elif 490 <= r.status_code < 500: error = "Validation-related error: Please ensure all required fields are provided and correctly formatted." else: diff --git a/tests/unit/llm_test.py b/tests/unit/llm_test.py new file mode 100644 index 00000000..430fc338 --- /dev/null +++ b/tests/unit/llm_test.py @@ -0,0 +1,36 @@ + +from dotenv import load_dotenv +from urllib.parse import urljoin +import requests_mock +from aixplain.enums import Function + +load_dotenv() +from aixplain.utils import config +from aixplain.modules import LLM + +import pytest + +@pytest.mark.parametrize( + "status_code,error_message", + [ + (401,"Unauthorized API key: Please verify the spelling of the API key and its current validity."), + (465,"Subscription-related error: Please ensure that your subscription is active and has not expired."), + (475,"Billing-related error: Please ensure you have enough credits to run this model. "), + (485, "Supplier-related error: Please ensure that the selected supplier provides the model you are trying to access."), + (495, "Validation-related error: Please ensure all required fields are provided and correctly formatted."), + (501, "Status 501: Unspecified error: An unspecified error occurred while processing your request."), + + ], +) + +def test_run_async_errors(status_code, error_message): + base_url = config.MODELS_RUN_URL + llm_id = "llm-id" + execute_url = urljoin(base_url, f"execute/{llm_id}") + + with requests_mock.Mocker() as mock: + mock.post(execute_url, status_code=status_code) + test_llm = LLM(id=llm_id, name="Test llm",url=base_url, function=Function.TEXT_GENERATION) + response = test_llm.run_async(data="input_data") + assert response["status"] == "FAILED" + assert response["error_message"] == error_message \ No newline at end of file diff --git a/tests/unit/model_test.py b/tests/unit/model_test.py index 4aa64392..cd6f7a5a 100644 --- a/tests/unit/model_test.py +++ b/tests/unit/model_test.py @@ -22,7 +22,6 @@ load_dotenv() import re -import requests_mock from aixplain.utils import config from aixplain.modules import Model @@ -60,80 +59,28 @@ def test_failed_poll(): assert hyp_response["supplierError"] == ref_response["supplierError"] assert hyp_response["status"] == "FAILED" -def test_run_async_unauthorized_error(): - base_url = config.MODELS_RUN_URL - model_id = "model-id" - execute_url = urljoin(base_url, f"execute/{model_id}") - - with requests_mock.Mocker() as mock: - mock.post(execute_url, status_code=401) - test_model = Model(id=model_id, name="Test Model",url=base_url) - response = test_model.run_async(data="input_data") - assert response["status"] == "FAILED" - assert response["error_message"] == "Unauthorized API key: Please verify the spelling of the API key and its current validity." -def test_run_async_subscription_error(): - base_url = config.MODELS_RUN_URL - model_id = "model-id" - execute_url = urljoin(base_url, f"execute/{model_id}") - - with requests_mock.Mocker() as mock: - mock.post(execute_url, status_code=465) - test_model = Model(id=model_id, name="Test Model",url=base_url) - response = test_model.run_async(data="input_data") - assert response["status"] == "FAILED" - assert response["error_message"] == "Subscription-related error: Please ensure that your subscription is active and has not expired." +@pytest.mark.parametrize( + "status_code,error_message", + [ + (401,"Unauthorized API key: Please verify the spelling of the API key and its current validity."), + (465,"Subscription-related error: Please ensure that your subscription is active and has not expired."), + (475,"Billing-related error: Please ensure you have enough credits to run this model. "), + (485, "Supplier-related error: Please ensure that the selected supplier provides the model you are trying to access."), + (495, "Validation-related error: Please ensure all required fields are provided and correctly formatted."), + (501, "Status 501: Unspecified error: An unspecified error occurred while processing your request."), -def test_run_async_billing_error(): - base_url = config.MODELS_RUN_URL - model_id = "model-id" - execute_url = urljoin(base_url, f"execute/{model_id}") - - with requests_mock.Mocker() as mock: - mock.post(execute_url, status_code=475) - test_model = Model(id=model_id, name="Test Model",url=base_url) - response = test_model.run_async(data="input_data") - assert response["status"] == "FAILED" - assert response["error_message"] == "Billing-related error: Please ensure you have enough credits to run this model. " + ], +) -def test_run_async_supplier_error(): +def test_run_async_errors(status_code, error_message): base_url = config.MODELS_RUN_URL model_id = "model-id" execute_url = urljoin(base_url, f"execute/{model_id}") with requests_mock.Mocker() as mock: - mock.post(execute_url, status_code=485) + mock.post(execute_url, status_code=status_code) test_model = Model(id=model_id, name="Test Model",url=base_url) response = test_model.run_async(data="input_data") assert response["status"] == "FAILED" - assert response["error_message"] == "Supplier-related error: Please ensure that the selected supplier provides the model you are trying to access." - - -def test_run_async_validation_error(): - base_url = config.MODELS_RUN_URL - model_id = "model-id" - execute_url = urljoin(base_url, f"execute/{model_id}") - - with requests_mock.Mocker() as mock: - mock.post(execute_url, status_code=495) - test_model = Model(id=model_id, name="Test Model",url=base_url) - response = test_model.run_async(data="input_data") - assert response["status"] == "FAILED" - assert response["error_message"] == "Validation-related error: Please ensure all required fields are provided and correctly formatted." - - -def test_run_async_unspecified_error(): - base_url = config.MODELS_RUN_URL - model_id = "model-id" - execute_url = urljoin(base_url, f"execute/{model_id}") - - with requests_mock.Mocker() as mock: - mock.post(execute_url, status_code=501) - test_model = Model(id=model_id, name="Test Model",url=base_url) - response = test_model.run_async(data="input_data") - assert response["status"] == "FAILED" - assert response["error_message"] == "Status 501: Unspecified error: An unspecified error occurred while processing your request." - - - - + assert response["error_message"] == error_message \ No newline at end of file diff --git a/tests/unit/pipeline_test.py b/tests/unit/pipeline_test.py index e983a298..d3c1c725 100644 --- a/tests/unit/pipeline_test.py +++ b/tests/unit/pipeline_test.py @@ -17,6 +17,7 @@ """ from dotenv import load_dotenv +import pytest load_dotenv() import requests_mock @@ -36,3 +37,28 @@ def test_create_pipeline(): hyp_pipeline = PipelineFactory.create(pipeline={"nodes": []}, name="Pipeline Test") assert hyp_pipeline.id == ref_pipeline.id assert hyp_pipeline.name == ref_pipeline.name + +@pytest.mark.parametrize( + "status_code,error_message", + [ + (401,"Unauthorized API key: Please verify the spelling of the API key and its current validity."), + (465,"Subscription-related error: Please ensure that your subscription is active and has not expired."), + (475,"Billing-related error: Please ensure you have enough credits to run this pipeline. "), + (485, "Supplier-related error: Please ensure that the selected supplier provides the pipeline you are trying to access."), + (495, "Validation-related error: Please ensure all required fields are provided and correctly formatted."), + (501, "Status 501: Unspecified error: An unspecified error occurred while processing your request."), + + ], +) + +def test_run_async_errors(status_code, error_message): + base_url = config.BACKEND_URL + pipeline_id = "pipeline_id" + execute_url = f"{base_url}/assets/pipeline/execution/run/{pipeline_id}" + + with requests_mock.Mocker() as mock: + mock.post(execute_url, status_code=status_code) + test_pipeline = Pipeline(id=pipeline_id, api_key=config.TEAM_API_KEY, name="Test Pipeline", url=base_url) + response = test_pipeline.run_async(data="input_data") + assert response["status"] == "FAILED" + assert response["error_message"] == error_message \ No newline at end of file