From 8f944fc383cb6ea2ee279fbbfe9d26164598bced Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 25 May 2026 11:17:56 +0530 Subject: [PATCH 01/39] update: shift true label and uid check to backend --- lexsi_sdk/core/tabular.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index cc2bdb6..66a5da0 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -328,10 +328,6 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: f"Project Config is required, since no config is set for project \n {json.dumps(config,indent=1)}" ) - Validate.check_for_missing_keys( - config, ["unique_identifier", "true_label"] - ) - # Validate.value_against_list( # "project_type", config, ["classification", "regression"] # ) From fed839cb4bc245898b466b4d0b951ee098cd69f4 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 25 May 2026 12:13:18 +0530 Subject: [PATCH 02/39] update: removed uid check with delete file from sdk --- lexsi_sdk/core/tabular.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 66a5da0..223c517 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -340,13 +340,6 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: column_names = file_info.get("details").get("column_names") - Validate.value_against_list( - "unique_identifier", - config["unique_identifier"], - column_names, - lambda: self.delete_file(uploaded_path), - ) - if config.get("feature_exclude"): Validate.value_against_list( "feature_exclude", From 629df97fd86616685f1ffaae3ab7d30dbdab6468 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 25 May 2026 12:27:23 +0530 Subject: [PATCH 03/39] update: removed feature_exclude check with delete file from sdk --- lexsi_sdk/core/tabular.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 223c517..65e2a5a 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -340,14 +340,6 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: column_names = file_info.get("details").get("column_names") - if config.get("feature_exclude"): - Validate.value_against_list( - "feature_exclude", - config["feature_exclude"], - column_names, - lambda: self.delete_file(uploaded_path), - ) - feature_exclude = [ config["unique_identifier"], config["true_label"], From 03350c5160bbc819cd7b6d3c81406352fb258ef9 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 25 May 2026 12:50:23 +0530 Subject: [PATCH 04/39] update: shifted feature encoding check to backend --- lexsi_sdk/core/tabular.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 65e2a5a..f26546f 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -353,17 +353,6 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: ] feature_encodings = config.get("feature_encodings", {}) - if feature_encodings: - Validate.value_against_list( - "feature_encodings_feature", - list(feature_encodings.keys()), - column_names, - ) - Validate.value_against_list( - "feature_encodings_feature", - list(feature_encodings.values()), - ["labelencode", "countencode", "onehotencode"], - ) custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) available_custom_batch_servers = custom_batch_servers.get("details", []) + custom_batch_servers.get("available_gpu_custom_servers", []) From 9f47499648a41d3a57dd52c843ac1c84c4869cee Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 25 May 2026 14:30:48 +0530 Subject: [PATCH 05/39] update: shifted tunning strategy check to backend --- lexsi_sdk/core/tabular.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index f26546f..f8cf9a5 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -364,16 +364,6 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: self.delete_file(uploaded_path) raise Exception(f"For Foundational models compute_type is mandatory. select from \n {valid_list}") - if tunning_strategy != "inference" and compute_type and "gova" not in compute_type: - Validate.value_against_list( - "pod", - compute_type, - [ - server["instance_name"] - for server in available_custom_batch_servers - ], - ) - payload = { "project_name": self.project_name, "unique_identifier": config["unique_identifier"], From 7f4b52585d91280785df4efec6e1dbc359838216 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 25 May 2026 15:15:22 +0530 Subject: [PATCH 06/39] update: shifted no compute_type check for foundational models --- lexsi_sdk/core/tabular.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index f8cf9a5..e8e21e2 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -355,14 +355,6 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: feature_encodings = config.get("feature_encodings", {}) custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) available_custom_batch_servers = custom_batch_servers.get("details", []) + custom_batch_servers.get("available_gpu_custom_servers", []) - - if config.get("model_name") and config.get("model_name") in ["TabPFN","TabICL","TabDPT","OrionMSP", "OrionBix","Mitra", "ContextTab"] and not compute_type: - valid_list = [ - server["instance_name"] - for server in available_custom_batch_servers - ] - self.delete_file(uploaded_path) - raise Exception(f"For Foundational models compute_type is mandatory. select from \n {valid_list}") payload = { "project_name": self.project_name, From ba9883fc0d9866ed45e877c1645d9bb159f0c9f3 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 12:29:18 +0530 Subject: [PATCH 07/39] update: removed project type occurences --- lexsi_sdk/common/types.py | 3 --- lexsi_sdk/core/tabular.py | 13 ------------- 2 files changed, 16 deletions(-) diff --git a/lexsi_sdk/common/types.py b/lexsi_sdk/common/types.py index 2bcc7cb..6b43f80 100644 --- a/lexsi_sdk/common/types.py +++ b/lexsi_sdk/common/types.py @@ -162,9 +162,6 @@ class ProjectConfig(TypedDict): """ Configuration keys required to describe a project. - :param project_type: Project type identifier. - :type project_type: Optional[str] - :param model_name: Model name associated with the project. :type model_name: Optional[str] diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index e8e21e2..b905d34 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -315,7 +315,6 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: if project_config == "Not Found": if not config: config = { - "project_type": "", "unique_identifier": "", "true_label": "", "pred_label": "", @@ -328,10 +327,6 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: f"Project Config is required, since no config is set for project \n {json.dumps(config,indent=1)}" ) - # Validate.value_against_list( - # "project_type", config, ["classification", "regression"] - # ) - uploaded_path = upload_file_and_return_path(data, "data", tag) file_info = self.api_client.post( @@ -451,7 +446,6 @@ def upload_data_dataconnectors( :param file_path: filepath from the bucket for the data to read :param config: project config { - "project_type": "", "unique_identifier": "", "true_label": "", "pred_label": "", @@ -555,11 +549,8 @@ def upload_file_and_return_path(file_path, data_type, tag=None) -> str: project_config = self.config() if project_config == "Not Found": - if not config.get("project_type"): - config["project_type"] = self.metadata.get("project_type") if not config: config = { - "project_type": "", "unique_identifier": "", "true_label": "", "pred_label": "", @@ -575,10 +566,6 @@ def upload_file_and_return_path(file_path, data_type, tag=None) -> str: config, ["project_type", "unique_identifier", "true_label"] ) - Validate.value_against_list( - "project_type", config, ["classification", "regression"] - ) - uploaded_path = upload_file_and_return_path(file_path, "data", tag) file_info = self.api_client.post( From 891c522777927b1ecb1e315b538884e2b6374956 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 12:32:58 +0530 Subject: [PATCH 08/39] update: removed all validation from upload_data_dataconnectors just like upload_data function --- lexsi_sdk/core/tabular.py | 48 --------------------------------------- 1 file changed, 48 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index b905d34..4642c66 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -562,10 +562,6 @@ def upload_file_and_return_path(file_path, data_type, tag=None) -> str: f"Project Config is required, since no config is set for project \n {json.dumps(config,indent=1)}" ) - Validate.check_for_missing_keys( - config, ["project_type", "unique_identifier", "true_label"] - ) - uploaded_path = upload_file_and_return_path(file_path, "data", tag) file_info = self.api_client.post( @@ -574,21 +570,6 @@ def upload_file_and_return_path(file_path, data_type, tag=None) -> str: column_names = file_info.get("details").get("column_names") - Validate.value_against_list( - "unique_identifier", - config["unique_identifier"], - column_names, - lambda: self.delete_file(uploaded_path), - ) - - if config.get("feature_exclude"): - Validate.value_against_list( - "feature_exclude", - config["feature_exclude"], - column_names, - lambda: self.delete_file(uploaded_path), - ) - feature_exclude = [ config["unique_identifier"], config["true_label"], @@ -602,38 +583,9 @@ def upload_file_and_return_path(file_path, data_type, tag=None) -> str: ] feature_encodings = config.get("feature_encodings", {}) - if feature_encodings: - Validate.value_against_list( - "feature_encodings_feature", - list(feature_encodings.keys()), - column_names, - ) - Validate.value_against_list( - "feature_encodings_feature", - list(feature_encodings.values()), - ["labelencode", "countencode", "onehotencode"], - ) custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) available_custom_batch_servers = custom_batch_servers.get("details", []) + custom_batch_servers.get("available_gpu_custom_servers", []) - - if config.get("model_name") and config.get("model_name") in ["TabPFN","TabICL","TabDPT","OrionMSP", "OrionBix","Mitra", "ContextTab"] and not compute_type: - valid_list = [ - server["instance_name"] - for server in available_custom_batch_servers - ] - self.delete_file(uploaded_path) - raise Exception(f"For Foundational models compute_type is mandatory. select from \n {valid_list}") - - if tunning_strategy != "inference" and compute_type and "gova" not in compute_type: - Validate.value_against_list( - "pod", - compute_type, - [ - server["instance_name"] - for server in available_custom_batch_servers - ], - ) payload = { "project_name": self.project_name, From 0f3ade7718647a82ea7a0b02db2300de498c2e4e Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 13:12:10 +0530 Subject: [PATCH 09/39] update: remove model architecture validation since its there in backend --- lexsi_sdk/core/tabular.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 4642c66..df7f4b1 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -701,15 +701,6 @@ def upload_file_and_return_path() -> str: return uploaded_path - model_types = self.api_client.get(GET_MODEL_TYPES_URI) - valid_model_architecture = model_types.get("model_architecture").keys() - Validate.value_against_list( - "model_achitecture", model_architecture, valid_model_architecture - ) - - valid_model_types = model_types.get("model_architecture")[model_architecture] - Validate.value_against_list("model_type", model_type, valid_model_types) - tags = self.tags() Validate.value_against_list("model_train", model_train, tags) From a47161a929893cd47434c9f78cf42b209fac25c1 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 14:39:43 +0530 Subject: [PATCH 10/39] update: removed tag validation from model train and model test --- lexsi_sdk/core/tabular.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index df7f4b1..5020305 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -701,12 +701,6 @@ def upload_file_and_return_path() -> str: return uploaded_path - tags = self.tags() - Validate.value_against_list("model_train", model_train, tags) - - if model_test: - Validate.value_against_list("model_test", model_test, tags) - uploaded_path = upload_file_and_return_path() if pod: From 5f8aa7327475662f4165bf4619cf82fde3fa8c11 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 15:33:29 +0530 Subject: [PATCH 11/39] update: removed pod validation from sdk --- lexsi_sdk/core/tabular.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 5020305..b2997d9 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -703,17 +703,6 @@ def upload_file_and_return_path() -> str: uploaded_path = upload_file_and_return_path() - if pod: - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in custom_batch_servers.get("details", []) - ], - ) - if xai_method: Validate.value_against_list( "explainability_method", xai_method, ["shap", "lime", "ig", "dlb"] From 7c8d0f7fac7adac21aefda6b2bb2df6042eac9e8 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 15:43:54 +0530 Subject: [PATCH 12/39] update: removed xai_method check from sdk --- lexsi_sdk/core/tabular.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index b2997d9..c23b88f 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -703,11 +703,6 @@ def upload_file_and_return_path() -> str: uploaded_path = upload_file_and_return_path() - if xai_method: - Validate.value_against_list( - "explainability_method", xai_method, ["shap", "lime", "ig", "dlb"] - ) - payload = { "project_name": self.project_name, "model_name": model_name, From 0b19977262a95535a7eb1ab4cac9d33b9420ea98 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 15:49:46 +0530 Subject: [PATCH 13/39] update: remove all vaidation checks from upload_model_dataconnectors --- lexsi_sdk/core/tabular.py | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index c23b88f..1803ec2 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -812,39 +812,8 @@ def upload_file_and_return_path() -> str: return uploaded_path - model_types = self.api_client.get(GET_MODEL_TYPES_URI) - valid_model_architecture = model_types.get("model_architecture").keys() - Validate.value_against_list( - "model_achitecture", model_architecture, valid_model_architecture - ) - - valid_model_types = model_types.get("model_architecture")[model_architecture] - Validate.value_against_list("model_type", model_type, valid_model_types) - - tags = self.tags() - Validate.value_against_list("model_train", model_train, tags) - - if model_test: - Validate.value_against_list("model_test", model_test, tags) - uploaded_path = upload_file_and_return_path() - if pod: - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in custom_batch_servers.get("details", []) - ], - ) - - if xai_method: - Validate.value_against_list( - "explainability_method", xai_method, ["shap", "lime"] - ) - payload = { "project_name": self.project_name, "model_name": model_name, From fac2081d6c82edabfa8fea4f71a0c428db264f74 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 16:00:52 +0530 Subject: [PATCH 14/39] update: removed dashbaord type validation since its there in backend --- lexsi_sdk/core/tabular.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 1803ec2..21db670 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -872,12 +872,6 @@ def get_all_dashboards(self, type: str, page: Optional[int] = 1) -> pd.DataFrame :return: Result DataFrame """ - Validate.value_against_list( - "type", - type, - DASHBOARD_TYPES, - ) - res = self.api_client.get( f"{DASHBOARD_LOGS_URI}?project_name={self.project_name}&type={type}&page={page}", ) From 9bf11bbd87e220ea7ec47a23abd2ba74e7369671 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 16:09:44 +0530 Subject: [PATCH 15/39] update: removed dashboard type validation --- lexsi_sdk/core/tabular.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 21db670..8852862 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -911,11 +911,6 @@ def get_dashboard_metadata(self, type: str, dashboard_id: str) -> Dashboard: - print_config(): Pretty-print the dashboard configuration :rtype: Dashboard """ - Validate.value_against_list( - "type", - type, - DASHBOARD_TYPES, - ) res = self.api_client.get( f"{GET_DASHBOARD_URI}?type={type}&project_name={self.project_name}&dashboard_id={dashboard_id}" @@ -941,11 +936,6 @@ def get_dashboard(self, type: str, dashboard_id: str) -> Dashboard: - print_config(): Pretty-print the dashboard configuration :rtype: Dashboard """ - Validate.value_against_list( - "type", - type, - DASHBOARD_TYPES, - ) res = self.api_client.get( f"{GET_DASHBOARD_URI}?type={type}&project_name={self.project_name}&dashboard_id={dashboard_id}" From a6febb952fc93259ea1a46ca70d08e286c925aad Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 16:54:36 +0530 Subject: [PATCH 16/39] update: removed create trigger checks from sdk, already there in backend --- lexsi_sdk/core/tabular.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 8852862..96730a5 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -1061,16 +1061,7 @@ def create_monitor(self, payload: dict) -> str: :return: response """ payload["project_name"] = self.project_name - - required_payload_keys = [ - "trigger_type", - "priority", - "mail_list", - "frequency", - "trigger_name", - ] - - Validate.check_for_missing_keys(payload, required_payload_keys) + if payload.get("pod", None): payload["instance_type"] = payload["pod"] payload = { From ef9def071dbfc211b9745990e773ee1d4e565365 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 17:28:30 +0530 Subject: [PATCH 17/39] update: removed pod validation from data drift api from sdk --- lexsi_sdk/core/tabular.py | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 96730a5..794424b 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -1061,7 +1061,7 @@ def create_monitor(self, payload: dict) -> str: :return: response """ payload["project_name"] = self.project_name - + if payload.get("pod", None): payload["instance_type"] = payload["pod"] payload = { @@ -1503,7 +1503,7 @@ def data_observations(self, tag: str) -> pd.DataFrame: raise Exception("Data summary not available, please upload data first.") if tag not in valid_tags: - raise Exception(f"Not a vaild tag. Pick a valid tag from {valid_tags}") + raise Exception(f"Not a valid tag. Pick a valid tag from {valid_tags}") data = { "Total Data Volume": res["data"]["overview"]["Total Data Volumn"], @@ -1560,21 +1560,6 @@ def data_drift_diagnosis( """ if baseline_tags and current_tags: - if pod not in [ - "small", - "xsmall", - "2xsmall", - "3xsmall", - "medium", - "xmedium", - "2xmedium", - "3xmedium", - "large", - "xlarge", - "2xlarge", - "3xlarge", - ]: - return "pod is not valid. Valid types are small, xsmall, 2xsmall, 3xsmall, medium, xmedium, 2xmedium, 3xmedium, large, xlarge, 2xlarge, 3xlarge" payload = { "project_name": self.project_name, From 0fdd199e664360047d1d027b4a286b254cf51b2d Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 18:25:51 +0530 Subject: [PATCH 18/39] update: removed tag validation from generate dashboard from sdk --- lexsi_sdk/core/tabular.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 794424b..4540604 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -1661,25 +1661,6 @@ def get_data_drift_dashboard( payload["project_name"] = self.project_name - # validate required fields - Validate.check_for_missing_keys(payload, DATA_DRIFT_DASHBOARD_REQUIRED_FIELDS) - - # validate tags and labels - tags_info = self.available_tags() - all_tags = tags_info["alltags"] - - Validate.value_against_list("base_line_tag", payload["base_line_tag"], all_tags) - Validate.value_against_list("current_tag", payload["current_tag"], all_tags) - - Validate.validate_date_feature_val(payload, tags_info["alldatetimefeatures"]) - - if payload.get("features_to_use"): - Validate.value_against_list( - "features_to_use", - payload.get("features_to_use", []), - tags_info["alluniquefeatures"], - ) - Validate.value_against_list( "stat_test_name", payload["stat_test_name"], DATA_DRIFT_STAT_TESTS ) From b3319853742d58ca49daeadb6e4ae2c7859226ef Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 18:42:26 +0530 Subject: [PATCH 19/39] update: shifted remaining 2 checks to backend from generate data drift dashboard --- lexsi_sdk/core/tabular.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 4540604..8011da3 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -1661,20 +1661,6 @@ def get_data_drift_dashboard( payload["project_name"] = self.project_name - Validate.value_against_list( - "stat_test_name", payload["stat_test_name"], DATA_DRIFT_STAT_TESTS - ) - - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in custom_batch_servers.get("details", []) - ], - ) - if payload.get("pod", None): payload["instance_type"] = payload["pod"] if pod: From 55b5c2820b92e42a6a270f1b52f81cf456ea1e31 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 26 May 2026 19:06:49 +0530 Subject: [PATCH 20/39] update: removed generate dashboard validation checks from sdk --- lexsi_sdk/core/tabular.py | 139 -------------------------------------- 1 file changed, 139 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 8011da3..d0b5a84 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -1743,46 +1743,6 @@ def get_target_drift_dashboard( payload["project_name"] = self.project_name - # validate required fields - Validate.check_for_missing_keys(payload, TARGET_DRIFT_DASHBOARD_REQUIRED_FIELDS) - - # validate tags and labels - tags_info = self.available_tags() - all_tags = tags_info["alltags"] - - Validate.value_against_list("base_line_tag", payload["base_line_tag"], all_tags) - Validate.value_against_list("current_tag", payload["current_tag"], all_tags) - - Validate.validate_date_feature_val(payload, tags_info["alldatetimefeatures"]) - - Validate.value_against_list("model_type", payload["model_type"], MODEL_TYPES) - - Validate.value_against_list( - "stat_test_name", payload["stat_test_name"], TARGET_DRIFT_STAT_TESTS - ) - - Validate.value_against_list( - "baseline_true_label", - [payload["baseline_true_label"]], - tags_info["alluniquefeatures"], - ) - - Validate.value_against_list( - "current_true_label", - [payload["current_true_label"]], - tags_info["alluniquefeatures"], - ) - - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in custom_batch_servers.get("details", []) - ], - ) - if payload.get("pod", None): payload["instance_type"] = payload["pod"] if pod: @@ -1836,50 +1796,6 @@ def get_bias_monitoring_dashboard( payload["project_name"] = self.project_name - # validate required fields - Validate.check_for_missing_keys( - payload, BIAS_MONITORING_DASHBOARD_REQUIRED_FIELDS - ) - - # validate tags and labels - tags_info = self.available_tags() - all_tags = tags_info["alltags"] - - Validate.value_against_list("base_line_tag", payload["base_line_tag"], all_tags) - - Validate.validate_date_feature_val(payload, tags_info["alldatetimefeatures"]) - - Validate.value_against_list("model_type", payload["model_type"], MODEL_TYPES) - - Validate.value_against_list( - "baseline_true_label", - [payload["baseline_true_label"]], - tags_info["alluniquefeatures"], - ) - - Validate.value_against_list( - "baseline_pred_label", - [payload["baseline_pred_label"]], - tags_info["alluniquefeatures"], - ) - - if payload.get("features_to_use"): - Validate.value_against_list( - "features_to_use", - payload.get("features_to_use", []), - tags_info["alluniquefeatures"], - ) - - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in custom_batch_servers.get("details", []) - ], - ) - if payload.get("pod", None): payload["instance_type"] = payload["pod"] if pod: @@ -1935,61 +1851,6 @@ def get_model_performance_dashboard( payload["project_name"] = self.project_name - tags_info = self.available_tags() - all_tags = tags_info["alltags"] - - if self.metadata.get("modality") == "image": - Validate.check_for_missing_keys(payload, ["base_line_tag", "current_tag"]) - - Validate.value_against_list("base_line_tag", payload["base_line_tag"], all_tags) - Validate.value_against_list("current_tag", payload["current_tag"], all_tags) - - if self.metadata.get("modality") == "tabular": - Validate.check_for_missing_keys( - payload, MODEL_PERF_DASHBOARD_REQUIRED_FIELDS - ) - Validate.validate_date_feature_val( - payload, tags_info["alldatetimefeatures"] - ) - - Validate.value_against_list( - "model_type", payload["model_type"], MODEL_TYPES - ) - - Validate.value_against_list( - "baseline_true_label", - [payload["baseline_true_label"]], - tags_info["alluniquefeatures"], - ) - - Validate.value_against_list( - "baseline_pred_label", - [payload["baseline_pred_label"]], - tags_info["alluniquefeatures"], - ) - - Validate.value_against_list( - "current_true_label", - [payload["current_true_label"]], - tags_info["alluniquefeatures"], - ) - - Validate.value_against_list( - "current_pred_label", - [payload["current_pred_label"]], - tags_info["alluniquefeatures"], - ) - - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in custom_batch_servers.get("details", []) - ], - ) - if payload.get("pod", None): payload["instance_type"] = payload["pod"] if pod: From 39867b79c50542dfecf8d20fc581aab770c34118 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Thu, 28 May 2026 15:10:28 +0530 Subject: [PATCH 21/39] update: removed dashboardtype validation from get_dashboard_log_data function from sdk --- lexsi_sdk/core/tabular.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index d0b5a84..36ba9c8 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -1877,11 +1877,6 @@ def get_dashboard_log_data(self, type: str): :return: DataFrame :rtype: pd.DataFrame """ - Validate.value_against_list( - "type", - type, - DASHBOARD_TYPES, - ) self.api_client.refresh_bearer_token() auth_token = self.api_client.get_auth_token() query_params = ( From d460ee8e3b6f121a46969f4250dcff667f0180a9 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Thu, 28 May 2026 16:20:09 +0530 Subject: [PATCH 22/39] update: removed model_name validation from model_inference --- lexsi_sdk/core/tabular.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 36ba9c8..5d3491d 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -1949,11 +1949,6 @@ def model_inference( models = self.models() - available_models = models["model_name"].to_list() - - if model_name: - Validate.value_against_list("model_name", model_name, available_models) - model = ( model_name or models.loc[models["status"] == "active"]["model_name"].values[0] From df12dd60dcb50d6f80734e2fe1c3cb2f4636200b Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 1 Jun 2026 15:43:43 +0530 Subject: [PATCH 23/39] update: removed validation checks from model_inference --- lexsi_sdk/core/tabular.py | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 5d3491d..67d6e70 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -1903,10 +1903,10 @@ def get_dashboard_log_data(self, type: str): def model_inference( self, + pod: str, tag: Optional[str] = None, file_name: Optional[str] = None, model_name: Optional[str] = None, - pod: Optional[str] = None ) -> pd.DataFrame: """Run model inference on tag or file_name data. Either tag or file_name is required for running inference @@ -1954,32 +1954,11 @@ def model_inference( or models.loc[models["status"] == "active"]["model_name"].values[0] ) - if pod and self.metadata.get("modality") == "tabular": - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - available_custom_batch_servers = custom_batch_servers.get("details", []) + custom_batch_servers.get("available_gpu_custom_servers", []) - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in available_custom_batch_servers - ], - ) - else: - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in custom_batch_servers.get("details", []) - ], - ) - run_model_payload = { "project_name": self.project_name, "model_name": model, "tags": tag, - "instance_type": pod + "instance_type": pod, } if filepath: run_model_payload["filepath"] = filepath From 042f248226fa6998f6cf2b2cc963fa6b313bdc43 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 1 Jun 2026 16:13:11 +0530 Subject: [PATCH 24/39] update: removed sdk checks from train_model from sdk --- lexsi_sdk/core/tabular.py | 162 +++----------------------------------- 1 file changed, 10 insertions(+), 152 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 67d6e70..8bb54f5 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -2182,158 +2182,11 @@ def train_model( if project_config == "Not Found": raise Exception("Upload files first") - available_models = self.available_models() - - Validate.value_against_list("model_type", model_type, available_models) - all_unique_features = [ *project_config["metadata"]["feature_exclude"], *project_config["metadata"]["feature_include"], ] - if tunning_strategy != "inference" and compute_type and "gova" not in compute_type: - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - available_custom_batch_servers = custom_batch_servers.get("details", []) + custom_batch_servers.get("available_gpu_custom_servers", []) - Validate.value_against_list( - "pod", - compute_type, - [ - server["instance_name"] - for server in available_custom_batch_servers - ], - ) - - if data_config: - if data_config.get("feature_exclude"): - Validate.value_against_list( - "feature_exclude", - data_config["feature_exclude"], - all_unique_features, - ) - - if data_config.get("tags"): - available_tags = self.tags() - Validate.value_against_list("tags", data_config["tags"], available_tags) - - if data_config.get("test_tags"): - available_tags = self.tags() - Validate.value_against_list( - "test_tags", data_config["test_tags"], available_tags - ) - - if data_config.get("feature_encodings"): - Validate.value_against_list( - "feature_encodings_feature", - list(data_config["feature_encodings"].keys()), - list(project_config["metadata"]["feature_encodings"].keys()), - ) - Validate.value_against_list( - "feature_encodings_feature", - list(data_config["feature_encodings"].values()), - ["labelencode", "countencode", "onehotencode"], - ) - - if data_config.get("sample_percentage"): - if ( - data_config["sample_percentage"] < 0 - or data_config["sample_percentage"] > 1 - ): - raise Exception( - "Data sample percentage is invalid, select between 0 and 1" - ) - - if data_config.get("explainability_sample_percentage"): - if ( - data_config["explainability_sample_percentage"] < 0 - or data_config["explainability_sample_percentage"] > 1 - ): - raise Exception( - "Explainability sample percentage is invalid, select between 0 and 1" - ) - - if data_config.get("lime_explainability_iterations"): - if ( - data_config["lime_explainability_iterations"] < 1 - or data_config["lime_explainability_iterations"] > 10000 - ): - raise Exception( - "Lime explainability iterations is invalid, select between 1 and 10000" - ) - - if data_config.get("xai_method"): - Validate.value_against_list( - "xai_method", - data_config["xai_method"], - ["shap", "lime"], - ) - - if model_config: - model_params = self.api_client.get(MODEL_PARAMETERS_URI) - model_name = f"{model_type}_{project_config['project_type']}".lower() - model_parameters = model_params.get(model_name) - - if model_parameters: - - def validate_params(param_group, config_group): - """Validate config values against model parameter constraints. - Checks select options and numeric min/max bounds, raising exceptions on invalid values. - - :param param_group: Parameter definition dict (select/input types with constraints). - :param config_group: User-supplied config dict to validate against `param_group`. - :raises Exception: If any value violates the declared constraints. - """ - if config_group: - for param_name, param_value in config_group.items(): - model_param = param_group.get(param_name) - if not model_param: - # raise Exception( - # f"Invalid model config for {model_type} \n {json.dumps(model_parameters)}" - # ) - continue - - param_type = model_param["type"] - - if param_type == "select": - Validate.value_against_list( - param_name, param_value, model_param["value"] - ) - elif param_type == "input": - if param_value > model_param["max"]: - raise Exception( - f"{param_name} value cannot be greater than {model_param['max']}" - ) - if param_value < model_param["min"]: - raise Exception( - f"{param_name} value cannot be less than {model_param['min']}" - ) - - if model_type in ["TabPFN","TabICL","TabDPT","OrionMSP", "OrionBix","Mitra", "ContextTab"]: - validate_params( - model_parameters.get("model_params", {}), model_config - ) - validate_params( - model_parameters.get("tunning_params", {}), tunning_config - ) - validate_params( - model_parameters.get("processor_params", {}), processor_config - ) - validate_params( - model_parameters.get("peft_params", {}), peft_config - ) - else: - validate_params(model_parameters, model_config) - if finetune_mode: - Validate.value_against_list( - "finetune_mode", - finetune_mode, - ["meta-learning", "sft"], - ) - if tunning_strategy: - Validate.value_against_list( - "tunning_strategy", - tunning_strategy, - ["base-ft", "inference", "peft", "finetune"], - ) data_conf = data_config or {} feature_exclude = [ @@ -2355,10 +2208,10 @@ def validate_params(param_group, config_group): ) explainability_method = ( - data_conf.get("explainability_method") + data_conf.get("explainability_method") or data_conf.get("xai_method") - or project_config.get("metadata", {}).get("xai_method") - or project_config.get("metadata", {}).get("explainability_method") + or project_config.get("metadata", {}).get("xai_method") + or project_config.get("metadata", {}).get("explainability_method") ) tags = data_conf.get("tags") or project_config["metadata"]["tags"] @@ -2376,10 +2229,15 @@ def validate_params(param_group, config_group): or False ) + unique_identifier = data_conf.get("unique_identifier") or project_config["unique_identifier"] + true_label = data_conf.get("true_label") or project_config["true_label"] + pred_label = data_conf.get("pred_label") or project_config.get("pred_label") + payload = { "project_name": self.project_name, - "unique_identifier": project_config["unique_identifier"], - "true_label": project_config["true_label"], + "unique_identifier": unique_identifier, + "true_label": true_label, + "pred_label": pred_label, "metadata": { "model_name": model_type, "model_parameters": model_config, From 0ca7010e86a5e651578e81c8ee21b9ff23de9a0f Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 1 Jun 2026 16:19:05 +0530 Subject: [PATCH 25/39] update: removed check from delete cases --- lexsi_sdk/core/tabular.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 8bb54f5..3c5a775 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -2429,9 +2429,6 @@ def delete_cases( :param tag: tag of case, defaults to None :return: response """ - if tag: - all_tags = self.all_tags() - Validate.value_against_list("tag", tag, all_tags) paylod = { "project_name": self.project_name, From 94f73de48452adbfc6eb88e6635a60d82e8bd09b Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 1 Jun 2026 16:23:42 +0530 Subject: [PATCH 26/39] update: removed checks from model_inference_settings function --- lexsi_sdk/core/tabular.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 3c5a775..f74a3c0 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -2515,19 +2515,11 @@ def model_inference_settings( server_config = inference_compute.get("custom_server_config", {}) server_config["start"] = normalize_time(server_config.get("start")) server_config["stop"] = normalize_time(server_config.get("stop")) - if server_config["start"] and not server_config["stop"]: - raise ValueError("If start is provided, stop cannot be None.") - - if server_config["stop"] and not server_config["start"]: - raise ValueError("If stop is provided, start cannot be None.") if server_config["start"] and server_config["stop"]: start_dt = datetime.fromisoformat(server_config["start"]) stop_dt = datetime.fromisoformat(server_config["stop"]) - if stop_dt - start_dt < timedelta(minutes=15): - raise ValueError("Stop time must be at least 15 minutes greater than start time.") - if not server_config.get("op_hours") and server_config.get("auto_start"): server_config["op_hours"] = True From 0822a659b63ab94d5876a19b3524e16570d8c1c3 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 1 Jun 2026 16:35:42 +0530 Subject: [PATCH 27/39] update: removed create observations checks --- lexsi_sdk/core/tabular.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index f74a3c0..2b2a3cd 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -2708,14 +2708,7 @@ def create_observation( ) Validate.string("expression", expression) - - Validate.string("statement", statement) - - Validate.value_against_list( - "linked_feature", - linked_features, - list(observation_params["details"]["features"].keys()), - ) + configuration, expression = build_expression(expression) validate_configuration( From 84379e9cb39a0c826338b6ae75d131b843dcd4f5 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 1 Jun 2026 16:40:42 +0530 Subject: [PATCH 28/39] update: removed checks from update observation --- lexsi_sdk/core/tabular.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 2b2a3cd..665601d 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -2708,7 +2708,7 @@ def create_observation( ) Validate.string("expression", expression) - + configuration, expression = build_expression(expression) validate_configuration( @@ -2763,8 +2763,6 @@ def update_observation( :param linked_features: new linked features for observation, defaults to None :return: response """ - if not status and not expression and not statement and not linked_features: - raise Exception("update parameters for observation not passed") payload = { "project_name": self.project_name, @@ -2790,19 +2788,12 @@ def update_observation( payload["update_keys"]["metadata"] = {"expression": expression} if linked_features: - Validate.value_against_list( - "linked_feature", - linked_features, - list(observation_params["details"]["features"].keys()), - ) payload["update_keys"]["linked_features"] = linked_features if statement: - Validate.string("statement", statement) payload["update_keys"]["statement"] = [statement] if status: - Validate.value_against_list("status", status, ["active", "inactive"]) payload["update_keys"]["status"] = status res = self.api_client.post(UPDATE_OBSERVATION_URI, payload) From 5e49a17bfe5921bb0735604f0dc01912c7db0ca3 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 1 Jun 2026 16:52:41 +0530 Subject: [PATCH 29/39] update: removed checks from create and update policy --- lexsi_sdk/core/tabular.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 665601d..2caa453 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -3014,13 +3014,6 @@ def create_policy( configuration, policy_params["details"], self.project_name, self.api_client ) - Validate.value_against_list( - "decision", decision, list(policy_params["details"]["decision"].values())[0] - ) - - if decision == "input": - Validate.string("Decision input", input) - payload = { "project_name": self.project_name, "policy_name": policy_name, @@ -3073,8 +3066,6 @@ def update_policy( :param priority: Priority of the policy. Lower number indicates higher priority. Defaults to 5 :return: response """ - if not status and not expression and not statement and not decision: - raise Exception("update parameters for policy not passed") payload = { "project_name": self.project_name, @@ -3100,21 +3091,12 @@ def update_policy( payload["update_keys"]["metadata"] = {"expression": expression} if statement: - Validate.string("statement", statement) payload["update_keys"]["statement"] = [statement] if status: - Validate.value_against_list("status", status, ["active", "inactive"]) payload["update_keys"]["status"] = status if decision: - Validate.value_against_list( - "decision", - decision, - list(policy_params["details"]["decision"].values())[0], - ) - if decision == "input": - Validate.string("Decision input", input) payload["update_keys"]["decision"] = ( input if decision == "input" else decision ) From f8496bbb7e46cb0e511eecd65159ef7070de2970 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 1 Jun 2026 17:08:16 +0530 Subject: [PATCH 30/39] update: removed train synthetic model checks --- lexsi_sdk/core/tabular.py | 46 +-------------------------------------- 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 2caa453..49e03e0 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -3202,42 +3202,20 @@ def train_synthetic_model( servers = list( map(lambda instance: instance["instance_name"], available_servers) ) - Validate.value_against_list("instance_type", pod, servers) - - all_models_param = self.get_synthetic_model_params() - - try: - model_params = all_models_param[model_name] - except KeyError as e: - availabel_models = list(all_models_param.keys()) - Validate.value_against_list("model", [model_name], availabel_models) # validate and prepare data config data_config["model_name"] = model_name - available_tags = self.tags() - tags = data_config.get("tags", available_tags) - - Validate.value_against_list("tag", tags, available_tags) + tags = data_config.get("tags", []) feature_exclude = data_config.get( "feature_exclude", project_config["feature_exclude"] ) - Validate.value_against_list( - "feature_exclude", feature_exclude, project_config["avaialble_options"] - ) - feature_include = data_config.get( "feature_include", project_config["feature_include"] ) - Validate.value_against_list( - "feature_include", - feature_include, - project_config["avaialble_options"], - ) - drop_duplicate_uid = data_config.get( "drop_duplicate_uid", project_config["drop_duplicate_uid"] ) @@ -3245,28 +3223,6 @@ def train_synthetic_model( SYNTHETIC_MODELS_DEFAULT_HYPER_PARAMS[model_name].update(hyper_params) hyper_params = SYNTHETIC_MODELS_DEFAULT_HYPER_PARAMS[model_name] - # validate model hyper parameters - for key, value in hyper_params.items(): - model_param = model_params.get(key, None) - - if model_param: - if model_param["type"] == "input": - if model_param["value"] == "int": - if not isinstance(value, int): - raise Exception(f"{key} value should be integer") - elif model_param["value"] == "float": - if not isinstance(value, float): - raise Exception(f"{key} value should be float") - - if value < model_param["min"] or value > model_param["max"]: - raise Exception( - f"{key} value should be between {model_param['min']} and {model_param['max']}" - ) - elif model_param["type"] == "select": - Validate.value_against_list( - "value", [value], model_param["value"] - ) - print(f"Using data config: {json.dumps(data_config, indent=4)}") print(f"Using hyper params: {json.dumps(hyper_params, indent=4)}") From c3fbd3fcabf75bba53c86ba2331532b84e3adfbb Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Mon, 1 Jun 2026 17:14:22 +0530 Subject: [PATCH 31/39] fixed pod issue in image --- lexsi_sdk/core/image.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lexsi_sdk/core/image.py b/lexsi_sdk/core/image.py index d2e9f88..b75545a 100644 --- a/lexsi_sdk/core/image.py +++ b/lexsi_sdk/core/image.py @@ -562,10 +562,10 @@ def update_inference_model_status(self, model_name: str, activate: bool) -> str: def model_inference( self, + pod: str, tag: Optional[str] = None, file_name: Optional[str] = None, model_name: Optional[str] = None, - pod: Optional[str] = None ) -> pd.DataFrame: """Run model inference on tag or file_name data. Either tag or file_name is required for running inference @@ -622,9 +622,8 @@ def model_inference( "project_name": self.project_name, "model_name": model, "tags": tag, + "instance_type": pod, } - if pod: - run_model_payload["instance_type"] = pod if filepath: run_model_payload["filepath"] = filepath From 1cbe002e61755746f16328c584cd06d0f1d9a718 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 2 Jun 2026 14:36:14 +0530 Subject: [PATCH 32/39] update: removed check from remove synthetic model --- lexsi_sdk/core/tabular.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 49e03e0..4eafad6 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -3257,13 +3257,6 @@ def remove_synthetic_model(self, model_name: str) -> str: :raises Exception: _description_ :return: response message """ - models_df = self.synthetic_models() - valid_models = models_df["model_name"].tolist() - - if model_name not in valid_models: - raise ValueError( - f"{model_name} is not valid. Pick a valid value from {valid_models}" - ) payload = {"project_name": self.project_name, "model_name": model_name} From fdc0c459a347cc080c006be214ad427c874014ec Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Tue, 2 Jun 2026 15:15:40 +0530 Subject: [PATCH 33/39] update: removed synthetic checks --- lexsi_sdk/core/tabular.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 4eafad6..58731d2 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -3292,13 +3292,6 @@ def synthetic_model(self, model_name: str) -> SyntheticModel: :raises Exception: _description_ :return: _description_ """ - models_df = self.synthetic_models() - valid_models = models_df["model_name"].tolist() - - if model_name not in valid_models: - raise ValueError( - f"{model_name} is not valid. Pick a valid value from {valid_models}" - ) url = f"{GET_SYNTHETIC_MODEL_DETAILS_URI}?project_name={self.project_name}&model_name={model_name}" @@ -3388,13 +3381,6 @@ def synthetic_tag_datapoints(self, tag: str) -> pd.DataFrame: :raises Exception: _description_ :return: datapoints """ - all_tags = self.all_tags() - - Validate.value_against_list( - "tag", - tag, - all_tags, - ) res = self.api_client.base_request( "GET", @@ -3412,13 +3398,6 @@ def remove_synthetic_tag(self, tag: str) -> str: :raises Exception: _description_ :return: response messsage """ - all_tags = self.all_tags() - - Validate.value_against_list( - "tag", - tag, - all_tags, - ) payload = { "project_name": self.project_name, From 323b4edd92c3b0b802d2d0d0cb2ee1167a549697 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Wed, 3 Jun 2026 13:33:07 +0530 Subject: [PATCH 34/39] update: reverted upload data checks --- lexsi_sdk/core/tabular.py | 54 ++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 58731d2..7976a1f 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -327,6 +327,38 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: f"Project Config is required, since no config is set for project \n {json.dumps(config,indent=1)}" ) + Validate.check_for_missing_keys( + config, ["unique_identifier", "true_label"] + ) + + feature_encodings = config.get("feature_encodings", {}) + if feature_encodings: + Validate.value_against_list( + "feature_encodings_feature", + list(feature_encodings.values()), + ["labelencode", "countencode", "onehotencode"], + ) + + custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) + available_custom_batch_servers = custom_batch_servers.get("details", []) + custom_batch_servers.get("available_gpu_custom_servers", []) + + if config.get("model_name") and config.get("model_name") in ["TabPFN","TabICL","TabDPT","OrionMSP", "OrionBix","Mitra", "ContextTab"] and not compute_type: + valid_list = [ + server["instance_name"] + for server in available_custom_batch_servers + ] + raise Exception(f"For Foundational models compute_type is mandatory. select from \n {valid_list}") + + if tunning_strategy != "inference" and compute_type and "gova" not in compute_type: + Validate.value_against_list( + "pod", + compute_type, + [ + server["instance_name"] + for server in available_custom_batch_servers + ], + ) + uploaded_path = upload_file_and_return_path(data, "data", tag) file_info = self.api_client.post( @@ -347,14 +379,10 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: if feature not in feature_exclude ] - feature_encodings = config.get("feature_encodings", {}) - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - available_custom_batch_servers = custom_batch_servers.get("details", []) + custom_batch_servers.get("available_gpu_custom_servers", []) - payload = { "project_name": self.project_name, - "unique_identifier": config["unique_identifier"], - "true_label": config["true_label"], + "unique_identifier": config.get("unique_identifier"), + "true_label": config.get("true_label"), "pred_label": config.get("pred_label"), "metadata": { "path": uploaded_path, @@ -393,7 +421,11 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: payload["metadata"]["finetune_mode"] = finetune_mode if tunning_strategy: payload["metadata"]["tunning_strategy"] = tunning_strategy - res = self.api_client.post(UPLOAD_DATA_WITH_CHECK_URI, payload) + try: + res = self.api_client.post(UPLOAD_DATA_WITH_CHECK_URI, payload) + except Exception as e: + self.delete_file(uploaded_path) + raise e if not res["success"]: self.delete_file(uploaded_path) @@ -416,14 +448,18 @@ def upload_file_and_return_path(data, data_type, tag=None) -> str: "type": "data", "project_name": self.project_name, } - res = self.api_client.post(UPLOAD_DATA_URI, payload) + try: + res = self.api_client.post(UPLOAD_DATA_URI, payload) + except Exception as e: + self.delete_file(uploaded_path) + raise e if not res["success"]: self.delete_file(uploaded_path) raise Exception(res.get("details")) return res.get("details") - + def upload_data_dataconnectors( self, data_connector_name: str, From 784128ee0d54b81aa77b9b596d5e8d89c48993f4 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Wed, 3 Jun 2026 14:28:40 +0530 Subject: [PATCH 35/39] update: reverted changes for upload data with connectors, upload model and upload model with connectors --- lexsi_sdk/core/tabular.py | 117 +++++++++++++++++++++++++++++++++++--- 1 file changed, 109 insertions(+), 8 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 7976a1f..a05455d 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -598,6 +598,38 @@ def upload_file_and_return_path(file_path, data_type, tag=None) -> str: f"Project Config is required, since no config is set for project \n {json.dumps(config,indent=1)}" ) + Validate.check_for_missing_keys( + config, ["unique_identifier", "true_label"] + ) + + feature_encodings = config.get("feature_encodings", {}) + if feature_encodings: + Validate.value_against_list( + "feature_encodings_feature", + list(feature_encodings.values()), + ["labelencode", "countencode", "onehotencode"], + ) + + custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) + available_custom_batch_servers = custom_batch_servers.get("details", []) + custom_batch_servers.get("available_gpu_custom_servers", []) + + if config.get("model_name") and config.get("model_name") in ["TabPFN","TabICL","TabDPT","OrionMSP", "OrionBix","Mitra", "ContextTab"] and not compute_type: + valid_list = [ + server["instance_name"] + for server in available_custom_batch_servers + ] + raise Exception(f"For Foundational models compute_type is mandatory. select from \n {valid_list}") + + if tunning_strategy != "inference" and compute_type and "gova" not in compute_type: + Validate.value_against_list( + "pod", + compute_type, + [ + server["instance_name"] + for server in available_custom_batch_servers + ], + ) + uploaded_path = upload_file_and_return_path(file_path, "data", tag) file_info = self.api_client.post( @@ -618,11 +650,6 @@ def upload_file_and_return_path(file_path, data_type, tag=None) -> str: if feature not in feature_exclude ] - feature_encodings = config.get("feature_encodings", {}) - - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - available_custom_batch_servers = custom_batch_servers.get("details", []) + custom_batch_servers.get("available_gpu_custom_servers", []) - payload = { "project_name": self.project_name, "unique_identifier": config["unique_identifier"], @@ -656,13 +683,21 @@ def upload_file_and_return_path(file_path, data_type, tag=None) -> str: if tunning_strategy: payload["metadata"]["tunning_strategy"] = tunning_strategy - res = self.api_client.post(UPLOAD_DATA_WITH_CHECK_URI, payload) + try: + res = self.api_client.post(UPLOAD_DATA_WITH_CHECK_URI, payload) + except Exception as e: + self.delete_file(uploaded_path) + raise e if not res["success"]: self.delete_file(uploaded_path) raise Exception(res.get("details")) - poll_events(self.api_client, self.project_name, res["event_id"]) + try: + poll_events(self.api_client, self.project_name, res["event_id"]) + except Exception as e: + self.delete_file(uploaded_path) + raise e return res.get("details") @@ -677,7 +712,11 @@ def upload_file_and_return_path(file_path, data_type, tag=None) -> str: "type": "data", "project_name": self.project_name, } - res = self.api_client.post(UPLOAD_DATA_URI, payload) + try: + res = self.api_client.post(UPLOAD_DATA_URI, payload) + except Exception as e: + self.delete_file(uploaded_path) + raise e if not res["success"]: self.delete_file(uploaded_path) @@ -737,6 +776,37 @@ def upload_file_and_return_path() -> str: return uploaded_path + model_types = self.api_client.get(GET_MODEL_TYPES_URI) + valid_model_architecture = model_types.get("model_architecture").keys() + Validate.value_against_list( + "model_achitecture", model_architecture, valid_model_architecture + ) + + valid_model_types = model_types.get("model_architecture")[model_architecture] + Validate.value_against_list("model_type", model_type, valid_model_types) + + tags = self.tags() + Validate.value_against_list("model_train", model_train, tags) + + if model_test: + Validate.value_against_list("model_test", model_test, tags) + + if pod: + custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) + Validate.value_against_list( + "pod", + pod, + [ + server["instance_name"] + for server in custom_batch_servers.get("details", []) + ], + ) + + if xai_method: + Validate.value_against_list( + "explainability_method", xai_method, ["shap", "lime", "ig", "dlb"] + ) + uploaded_path = upload_file_and_return_path() payload = { @@ -847,6 +917,37 @@ def upload_file_and_return_path() -> str: uploaded_path = res.get("metadata").get("filepath") return uploaded_path + + model_types = self.api_client.get(GET_MODEL_TYPES_URI) + valid_model_architecture = model_types.get("model_architecture").keys() + Validate.value_against_list( + "model_achitecture", model_architecture, valid_model_architecture + ) + + valid_model_types = model_types.get("model_architecture")[model_architecture] + Validate.value_against_list("model_type", model_type, valid_model_types) + + tags = self.tags() + Validate.value_against_list("model_train", model_train, tags) + + if model_test: + Validate.value_against_list("model_test", model_test, tags) + + if pod: + custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) + Validate.value_against_list( + "pod", + pod, + [ + server["instance_name"] + for server in custom_batch_servers.get("details", []) + ], + ) + + if xai_method: + Validate.value_against_list( + "explainability_method", xai_method, ["shap", "lime"] + ) uploaded_path = upload_file_and_return_path() From ec5fd8082c83513326e920d2642fe06b6c4c6c43 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Wed, 3 Jun 2026 16:30:42 +0530 Subject: [PATCH 36/39] update: made pod required in upload model apis --- lexsi_sdk/core/tabular.py | 62 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index a05455d..d3ebcc2 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -741,8 +741,8 @@ def upload_model( model_type: str, model_name: str, model_train: list, - model_test: Optional[list], - pod: Optional[str] = None, + pod: str, + model_test: Optional[list] = None, xai_method: Optional[list] = ["shap"], feature_list: Optional[list] = None, ): @@ -754,8 +754,8 @@ def upload_model( use upload_model_types() method to get all allowed model_types :param model_name: name of the model :param model_train: data tags for model + :param pod: pod to be used for uploading model (required) :param model_test: test tags for model (optional) - :param pod: pod to be used for uploading model (optional) :param xai_method: xai method to be used while uploading model ["shap", "lime"] (optional) :param feature_list: list of features in sequence which are to be passed in the model (optional) """ @@ -791,16 +791,18 @@ def upload_file_and_return_path() -> str: if model_test: Validate.value_against_list("model_test", model_test, tags) - if pod: - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in custom_batch_servers.get("details", []) - ], - ) + if not pod: + raise Exception("pod is required to upload a model.") + + custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) + Validate.value_against_list( + "pod", + pod, + [ + server["instance_name"] + for server in custom_batch_servers.get("details", []) + ], + ) if xai_method: Validate.value_against_list( @@ -819,11 +821,9 @@ def upload_file_and_return_path() -> str: "model_test_tags": model_test, "explainability_method": xai_method, "feature_list": feature_list, + "instance_type": pod, } - if pod: - payload["instance_type"] = pod - res = self.api_client.post(UPLOAD_MODEL_URI, payload) if not res.get("success"): @@ -844,7 +844,7 @@ def upload_model_dataconnectors( model_name: str, model_train: list, model_test: Optional[list], - pod: Optional[str] = None, + pod: str, xai_method: Optional[list] = ["shap"], bucket_name: Optional[str] = None, file_path: Optional[str] = None, @@ -858,7 +858,7 @@ def upload_model_dataconnectors( :param model_name: name of the model :param model_train: data tags for model :param model_test: test tags for model (optional) - :param pod: pod to be used for uploading model (optional) + :param pod: pod to be used for uploading model (required) :param xai_method: explainability method to be used while uploading model ["shap", "lime"] (optional) :param bucket_name: if data connector has buckets # Example: s3/gcs buckets :param file_path: filepath from the bucket for the data to read @@ -933,16 +933,18 @@ def upload_file_and_return_path() -> str: if model_test: Validate.value_against_list("model_test", model_test, tags) - if pod: - custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) - Validate.value_against_list( - "pod", - pod, - [ - server["instance_name"] - for server in custom_batch_servers.get("details", []) - ], - ) + if not pod: + raise Exception("pod is required to upload a model.") + + custom_batch_servers = self.api_client.get(AVAILABLE_BATCH_SERVERS_URI) + Validate.value_against_list( + "pod", + pod, + [ + server["instance_name"] + for server in custom_batch_servers.get("details", []) + ], + ) if xai_method: Validate.value_against_list( @@ -960,11 +962,9 @@ def upload_file_and_return_path() -> str: "model_data_tags": model_train, "model_test_tags": model_test, "explainability_method": xai_method, + "instance_type": pod, } - if pod: - payload["instance_type"] = pod - res = self.api_client.post(UPLOAD_MODEL_URI, payload) if not res.get("success"): From 34ae7862c042551a1060aee6ccae0450a1b6ce02 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Thu, 4 Jun 2026 11:55:59 +0530 Subject: [PATCH 37/39] refactor: drop client-side expression validation, now enforced on backend --- lexsi_sdk/core/project.py | 78 +-------------------------------------- lexsi_sdk/core/tabular.py | 49 +----------------------- 2 files changed, 3 insertions(+), 124 deletions(-) diff --git a/lexsi_sdk/core/project.py b/lexsi_sdk/core/project.py index 79c426c..e32313c 100755 --- a/lexsi_sdk/core/project.py +++ b/lexsi_sdk/core/project.py @@ -12,7 +12,7 @@ GDriveConfig, SFTPConfig, ) -from lexsi_sdk.common.utils import normalize_time, parse_datetime, parse_float, poll_events +from lexsi_sdk.common.utils import normalize_time, parse_float, poll_events from lexsi_sdk.common.validation import Validate import pandas as pd from lexsi_sdk.common.xai_uris import ( @@ -46,7 +46,6 @@ LIST_FILEPATHS, UPLOAD_FILE_DATA_CONNECTORS, DROPBOX_OAUTH, - VALIDATE_POLICY_URI, ) import io from lexsi_sdk.core.alert import Alert @@ -1062,78 +1061,3 @@ def build_expression(expression_string): configuration.append(logical_operators[log_operator]) return configuration, metadata_expression - - -def validate_configuration( - configuration, params, project_name="", api_client=APIClient(), observations=False -): - """Validate an expression provided configuration against allowed features/operators. - Raises exceptions for invalid columns/operators/values and can validate observation comparisons. - - :param configuration: Configuration token list (from `build_expression`). - :param params: Allowed features/operators payload fetched from the backend. - :param project_name: Project name used for backend validation calls. - :param api_client: API client used for optional backend validation. - :param observations: If True, validate observation column-vs-column comparisons. - :raises Exception: If the configuration is invalid.""" - for expression in configuration: - if isinstance(expression, str): - if expression not in ["(", ")", *params.get("logical_operators")]: - raise Exception(f"{expression} not a valid logical operator") - - if isinstance(expression, dict): - # validate column name - Validate.value_against_list( - "feature", - expression.get("column"), - list(params.get("features", {}).keys()), - ) - - # validate operator - Validate.value_against_list( - "condition_operator", - expression.get("expression"), - params.get("condition_operators"), - ) - - # validate value(s) - expression_value = expression.get("value") - valid_feature_values = params.get("features").get(expression.get("column")) - if observations and isinstance(valid_feature_values, list): - condition_operators = { - "_NOTEQ": "!==", - "_ISEQ": "==", - "_GRT": ">", - "_LST": "<", - } - res = api_client.get( - f"{VALIDATE_POLICY_URI}?project_name={project_name}&column1_name={expression.get('column')}&column2_name={expression.get('value')}&operation={condition_operators[expression.get('expression')]}" - ) - if not res.get("success"): - raise Exception(res.get("message")) - if isinstance(valid_feature_values, str): - # if valid_feature_values == "input" and not parse_float( - # expression_value - # ): - # raise Exception( - # f"Invalid value comparison with {expression_value} for {expression.get('column')}" - # ) - if valid_feature_values == "datetime" and not parse_datetime( - expression_value - ): - raise Exception( - f"Invalid value comparison with {expression_value} for {expression.get('column')}" - ) - - else: - condition_operators = { - "_NOTEQ": "!==", - "_ISEQ": "==", - "_GRT": ">", - "_LST": "<", - } - res = api_client.get( - f"{VALIDATE_POLICY_URI}?project_name={project_name}&column1_name={expression.get('column')}&column2_name={expression.get('value')}&operation={condition_operators[expression.get('expression')]}" - ) - if not res.get("success"): - raise Exception(res.get("message")) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index d3ebcc2..2304941 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -11,9 +11,9 @@ from lexsi_sdk.common.types import CatBoostParams, DataConfig, FoundationalModelParams, InferenceCompute, LightGBMParams, PEFTParams, ProcessorParams, ProjectConfig, RandomForestParams, SyntheticDataConfig, SyntheticModelHyperParams, TuningParams, XGBoostParams from lexsi_sdk.common.utils import normalize_time, poll_events from lexsi_sdk.common.validation import Validate -from lexsi_sdk.common.xai_uris import ALL_DATA_FILE_URI, AVAILABLE_BATCH_SERVERS_URI, AVAILABLE_SYNTHETIC_CUSTOM_SERVERS_URI, CASE_DTREE_URI, CASE_INFO_TEXT_URI, CASE_INFO_URI, CREATE_OBSERVATION_URI, CREATE_POLICY_URI, CREATE_SYNTHETIC_PROMPT_URI, DELETE_CASE_URI, DELETE_SYNTHETIC_MODEL_URI, DELETE_SYNTHETIC_TAG_URI, DOWNLOAD_DASHBOARD_LOGS_URI, DOWNLOAD_SYNTHETIC_DATA_URI, DOWNLOAD_TAG_DATA_URI, DUPLICATE_OBSERVATION_URI, DUPLICATE_POLICY_URI, GENERATE_DASHBOARD_URI, GET_CASES_URI, GET_DASHBOARD_SCORE_URI, GET_DATA_DIAGNOSIS_URI, GET_DATA_DRIFT_DIAGNOSIS_URI, GET_DATA_SUMMARY_URI, GET_FEATURE_IMPORTANCE_URI, GET_LABELS_URI, GET_MODELS_URI, GET_OBSERVATION_PARAMS_URI, GET_OBSERVATIONS_URI, GET_POLICIES_URI, GET_POLICY_PARAMS_URI, GET_PROJECT_CONFIG, GET_SYNTHETIC_DATA_TAGS_URI, GET_SYNTHETIC_MODEL_DETAILS_URI, GET_SYNTHETIC_MODEL_PARAMS_URI, GET_SYNTHETIC_MODELS_URI, GET_SYNTHETIC_PROMPT_URI, LIST_DATA_CONNECTORS, MODEL_INFERENCE_SETTINGS_URI, MODEL_INFERENCES_URI, MODEL_PARAMETERS_URI, MODEL_SUMMARY_URI, PROJECT_OVERVIEW_TEXT_URI, RUN_DATA_DRIFT_DIAGNOSIS_URI, RUN_MODEL_ON_DATA_URI, SEARCH_CASE_URI, TABULAR_ML, TEXT_MODEL_INFERENCE_SETTINGS_URI, TRAIN_MODEL_URI, TRAIN_SYNTHETIC_MODEL_URI, UPDATE_ACTIVE_INFERENCE_MODEL_URI, UPDATE_OBSERVATION_URI, UPDATE_POLICY_URI, UPDATE_SYNTHETIC_PROMPT_URI, UPLOAD_DATA_FILE_URI, UPLOAD_DATA_PROJECT_URI, UPLOAD_DATA_URI, UPLOAD_FILE_DATA_CONNECTORS, AVAILABLE_BATCH_SERVERS_URI, CREATE_TRIGGER_URI, DASHBOARD_LOGS_URI, DELETE_TRIGGER_URI, DUPLICATE_MONITORS_URI, EXECUTED_TRIGGER_URI, GENERATE_DASHBOARD_URI, GET_DASHBOARD_SCORE_URI, GET_DASHBOARD_URI, GET_EXECUTED_TRIGGER_INFO, GET_MODEL_TYPES_URI, GET_MODELS_URI, GET_MONITORS_ALERTS, GET_PROJECT_CONFIG, GET_TRIGGERS_URI, LIST_DATA_CONNECTORS, MODEL_PARAMETERS_URI, MODEL_PERFORMANCE_DASHBOARD_URI, UPLOAD_DATA_FILE_INFO_URI, UPLOAD_DATA_FILE_URI, UPLOAD_DATA_URI, UPLOAD_DATA_WITH_CHECK_URI, UPLOAD_FILE_DATA_CONNECTORS, UPLOAD_MODEL_URI, EXPLAINABILITY_SUMMARY, GET_TRIGGERS_DAYS_URI +from lexsi_sdk.common.xai_uris import ALL_DATA_FILE_URI, AVAILABLE_BATCH_SERVERS_URI, AVAILABLE_SYNTHETIC_CUSTOM_SERVERS_URI, CASE_DTREE_URI, CASE_INFO_TEXT_URI, CASE_INFO_URI, CREATE_OBSERVATION_URI, CREATE_POLICY_URI, CREATE_SYNTHETIC_PROMPT_URI, DELETE_CASE_URI, DELETE_SYNTHETIC_MODEL_URI, DELETE_SYNTHETIC_TAG_URI, DOWNLOAD_DASHBOARD_LOGS_URI, DOWNLOAD_SYNTHETIC_DATA_URI, DOWNLOAD_TAG_DATA_URI, DUPLICATE_OBSERVATION_URI, DUPLICATE_POLICY_URI, GENERATE_DASHBOARD_URI, GET_CASES_URI, GET_DASHBOARD_SCORE_URI, GET_DATA_DIAGNOSIS_URI, GET_DATA_DRIFT_DIAGNOSIS_URI, GET_DATA_SUMMARY_URI, GET_FEATURE_IMPORTANCE_URI, GET_LABELS_URI, GET_MODELS_URI, GET_OBSERVATION_PARAMS_URI, GET_OBSERVATIONS_URI, GET_POLICIES_URI, GET_PROJECT_CONFIG, GET_SYNTHETIC_DATA_TAGS_URI, GET_SYNTHETIC_MODEL_DETAILS_URI, GET_SYNTHETIC_MODEL_PARAMS_URI, GET_SYNTHETIC_MODELS_URI, GET_SYNTHETIC_PROMPT_URI, LIST_DATA_CONNECTORS, MODEL_INFERENCE_SETTINGS_URI, MODEL_INFERENCES_URI, MODEL_PARAMETERS_URI, MODEL_SUMMARY_URI, PROJECT_OVERVIEW_TEXT_URI, RUN_DATA_DRIFT_DIAGNOSIS_URI, RUN_MODEL_ON_DATA_URI, SEARCH_CASE_URI, TABULAR_ML, TEXT_MODEL_INFERENCE_SETTINGS_URI, TRAIN_MODEL_URI, TRAIN_SYNTHETIC_MODEL_URI, UPDATE_ACTIVE_INFERENCE_MODEL_URI, UPDATE_OBSERVATION_URI, UPDATE_POLICY_URI, UPDATE_SYNTHETIC_PROMPT_URI, UPLOAD_DATA_FILE_URI, UPLOAD_DATA_PROJECT_URI, UPLOAD_DATA_URI, UPLOAD_FILE_DATA_CONNECTORS, AVAILABLE_BATCH_SERVERS_URI, CREATE_TRIGGER_URI, DASHBOARD_LOGS_URI, DELETE_TRIGGER_URI, DUPLICATE_MONITORS_URI, EXECUTED_TRIGGER_URI, GENERATE_DASHBOARD_URI, GET_DASHBOARD_SCORE_URI, GET_DASHBOARD_URI, GET_EXECUTED_TRIGGER_INFO, GET_MODEL_TYPES_URI, GET_MODELS_URI, GET_MONITORS_ALERTS, GET_PROJECT_CONFIG, GET_TRIGGERS_URI, LIST_DATA_CONNECTORS, MODEL_PARAMETERS_URI, MODEL_PERFORMANCE_DASHBOARD_URI, UPLOAD_DATA_FILE_INFO_URI, UPLOAD_DATA_FILE_URI, UPLOAD_DATA_URI, UPLOAD_DATA_WITH_CHECK_URI, UPLOAD_FILE_DATA_CONNECTORS, UPLOAD_MODEL_URI, EXPLAINABILITY_SUMMARY, GET_TRIGGERS_DAYS_URI from lexsi_sdk.core.dashboard import DASHBOARD_TYPES, Dashboard -from lexsi_sdk.core.project import Project, build_expression, generate_expression, validate_configuration +from lexsi_sdk.core.project import Project, build_expression, generate_expression from lexsi_sdk.core.synthetic import SyntheticDataTag, SyntheticModel, SyntheticPrompt from lexsi_sdk.core.utils import build_list_data_connector_url from pydantic import BaseModel, ConfigDict @@ -2840,22 +2840,10 @@ def create_observation( :param linked_features: linked features of observation :return: response """ - observation_params = self.api_client.get( - f"{GET_OBSERVATION_PARAMS_URI}?project_name={self.project_name}" - ) - Validate.string("expression", expression) configuration, expression = build_expression(expression) - validate_configuration( - configuration, - observation_params["details"], - self.project_name, - self.api_client, - True, - ) - payload = { "project_name": self.project_name, "observation_name": observation_name, @@ -2908,19 +2896,9 @@ def update_observation( "update_keys": {}, } - observation_params = self.api_client.get( - f"{GET_OBSERVATION_PARAMS_URI}?project_name={self.project_name}" - ) - if expression: Validate.string("expression", expression) configuration, expression = build_expression(expression) - validate_configuration( - configuration, - observation_params["details"], - self.project_name, - self.api_client, - ) payload["update_keys"]["configuration"] = configuration payload["update_keys"]["metadata"] = {"expression": expression} @@ -3143,14 +3121,6 @@ def create_policy( """ configuration, expression = build_expression(expression) - policy_params = self.api_client.get( - f"{GET_POLICY_PARAMS_URI}?project_name={self.project_name}" - ) - - validate_configuration( - configuration, policy_params["details"], self.project_name, self.api_client - ) - payload = { "project_name": self.project_name, "policy_name": policy_name, @@ -3211,19 +3181,9 @@ def update_policy( "update_keys": {}, } - policy_params = self.api_client.get( - f"{GET_POLICY_PARAMS_URI}?project_name={self.project_name}" - ) - if expression: Validate.string("expression", expression) configuration, expression = build_expression(expression) - validate_configuration( - configuration, - policy_params["details"], - self.project_name, - self.api_client, - ) payload["update_keys"]["configuration"] = configuration payload["update_keys"]["metadata"] = {"expression": expression} @@ -3578,11 +3538,6 @@ def create_synthetic_prompt(self, name: str, expression: str) -> str: configuration, expression = build_expression(expression) - prompt_params = self.get_observation_params() - validate_configuration( - configuration, prompt_params, self.project_name, self.api_client - ) - payload = { "prompt_name": name, "project_name": self.project_name, From d4dd2302d780327e69d2e3ed707ec88b82a4294a Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Thu, 4 Jun 2026 16:01:51 +0530 Subject: [PATCH 38/39] fix(data_drift_diagnosis): surface backend error when details is a string instead of assuming a dict --- lexsi_sdk/core/tabular.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 2304941..314ccd8 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -1707,10 +1707,10 @@ def data_drift_diagnosis( res = self.api_client.post(RUN_DATA_DRIFT_DIAGNOSIS_URI, payload) if not res["success"]: - if res.get("details").get("reason"): - raise Exception(res.get("details").get("reason")) - else: - raise Exception(res.get("message")) + details = res.get("details") + if isinstance(details, dict) and details.get("reason"): + raise Exception(details.get("reason")) + raise Exception(details or res.get("message")) poll_events(self.api_client, self.project_name, res["task_id"]) res = self.api_client.post( From 263f803606570616532c42178825db255d4bb471 Mon Sep 17 00:00:00 2001 From: Jenish-Lexsi Date: Thu, 4 Jun 2026 16:42:51 +0530 Subject: [PATCH 39/39] minor change --- lexsi_sdk/core/tabular.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lexsi_sdk/core/tabular.py b/lexsi_sdk/core/tabular.py index 314ccd8..18cab86 100644 --- a/lexsi_sdk/core/tabular.py +++ b/lexsi_sdk/core/tabular.py @@ -2024,11 +2024,13 @@ def get_dashboard_log_data(self, type: str): res = self.api_client.base_request("GET", uri) if res.status_code != 200: - raise Exception( - res.get( - "details", f"Error Downloading Dasboard Logs, {res.status_code}" + try: + details = res.json().get( + "details", f"Error Downloading Dashboard Logs, {res.status_code}" ) - ) + except Exception: + details = f"Error Downloading Dashboard Logs, {res.status_code}" + raise Exception(details) try: df = pd.read_csv(io.StringIO(res.text))