validmind 2.7.12__py3-none-any.whl → 2.8.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. validmind/__init__.py +58 -10
  2. validmind/__version__.py +1 -1
  3. validmind/ai/test_descriptions.py +17 -73
  4. validmind/api_client.py +18 -1
  5. validmind/models/r_model.py +5 -1
  6. validmind/tests/comparison.py +28 -2
  7. validmind/tests/data_validation/ACFandPACFPlot.py +4 -1
  8. validmind/tests/data_validation/AutoMA.py +1 -1
  9. validmind/tests/data_validation/BivariateScatterPlots.py +5 -1
  10. validmind/tests/data_validation/BoxPierce.py +3 -1
  11. validmind/tests/data_validation/ClassImbalance.py +1 -1
  12. validmind/tests/data_validation/DatasetDescription.py +1 -1
  13. validmind/tests/data_validation/DickeyFullerGLS.py +1 -1
  14. validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +5 -10
  15. validmind/tests/data_validation/HighCardinality.py +5 -1
  16. validmind/tests/data_validation/HighPearsonCorrelation.py +1 -1
  17. validmind/tests/data_validation/IQROutliersBarPlot.py +5 -3
  18. validmind/tests/data_validation/IQROutliersTable.py +5 -2
  19. validmind/tests/data_validation/IsolationForestOutliers.py +5 -4
  20. validmind/tests/data_validation/JarqueBera.py +2 -2
  21. validmind/tests/data_validation/LJungBox.py +2 -2
  22. validmind/tests/data_validation/LaggedCorrelationHeatmap.py +1 -1
  23. validmind/tests/data_validation/MissingValues.py +14 -10
  24. validmind/tests/data_validation/MissingValuesBarPlot.py +3 -1
  25. validmind/tests/data_validation/MutualInformation.py +2 -1
  26. validmind/tests/data_validation/PearsonCorrelationMatrix.py +1 -1
  27. validmind/tests/data_validation/ProtectedClassesCombination.py +2 -0
  28. validmind/tests/data_validation/ProtectedClassesDescription.py +2 -2
  29. validmind/tests/data_validation/ProtectedClassesDisparity.py +9 -5
  30. validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +10 -2
  31. validmind/tests/data_validation/RollingStatsPlot.py +2 -1
  32. validmind/tests/data_validation/ScoreBandDefaultRates.py +4 -2
  33. validmind/tests/data_validation/SeasonalDecompose.py +1 -1
  34. validmind/tests/data_validation/ShapiroWilk.py +2 -2
  35. validmind/tests/data_validation/SpreadPlot.py +1 -1
  36. validmind/tests/data_validation/TabularCategoricalBarPlots.py +1 -1
  37. validmind/tests/data_validation/TabularDateTimeHistograms.py +1 -1
  38. validmind/tests/data_validation/TargetRateBarPlots.py +4 -1
  39. validmind/tests/data_validation/TimeSeriesFrequency.py +1 -1
  40. validmind/tests/data_validation/TimeSeriesOutliers.py +7 -2
  41. validmind/tests/data_validation/WOEBinPlots.py +1 -1
  42. validmind/tests/data_validation/WOEBinTable.py +1 -1
  43. validmind/tests/data_validation/ZivotAndrewsArch.py +5 -2
  44. validmind/tests/data_validation/nlp/CommonWords.py +1 -1
  45. validmind/tests/data_validation/nlp/Hashtags.py +1 -1
  46. validmind/tests/data_validation/nlp/LanguageDetection.py +1 -1
  47. validmind/tests/data_validation/nlp/Mentions.py +1 -1
  48. validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +5 -1
  49. validmind/tests/data_validation/nlp/Punctuations.py +1 -1
  50. validmind/tests/data_validation/nlp/Sentiment.py +3 -1
  51. validmind/tests/data_validation/nlp/TextDescription.py +1 -1
  52. validmind/tests/data_validation/nlp/Toxicity.py +1 -1
  53. validmind/tests/model_validation/BertScore.py +7 -1
  54. validmind/tests/model_validation/BleuScore.py +7 -1
  55. validmind/tests/model_validation/ClusterSizeDistribution.py +3 -1
  56. validmind/tests/model_validation/ContextualRecall.py +9 -1
  57. validmind/tests/model_validation/FeaturesAUC.py +1 -1
  58. validmind/tests/model_validation/MeteorScore.py +7 -1
  59. validmind/tests/model_validation/ModelPredictionResiduals.py +5 -1
  60. validmind/tests/model_validation/RegardScore.py +6 -1
  61. validmind/tests/model_validation/RegressionResidualsPlot.py +10 -1
  62. validmind/tests/model_validation/RougeScore.py +3 -1
  63. validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +2 -0
  64. validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +10 -2
  65. validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +6 -2
  66. validmind/tests/model_validation/TokenDisparity.py +5 -1
  67. validmind/tests/model_validation/ToxicityScore.py +3 -1
  68. validmind/tests/model_validation/embeddings/ClusterDistribution.py +1 -1
  69. validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +5 -1
  70. validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +5 -1
  71. validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +5 -1
  72. validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +2 -0
  73. validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +5 -1
  74. validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +6 -2
  75. validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +3 -1
  76. validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +4 -1
  77. validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +5 -1
  78. validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +5 -1
  79. validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +5 -1
  80. validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +5 -1
  81. validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +6 -1
  82. validmind/tests/model_validation/embeddings/utils.py +6 -9
  83. validmind/tests/model_validation/ragas/AnswerCorrectness.py +1 -1
  84. validmind/tests/model_validation/ragas/AspectCritic.py +4 -1
  85. validmind/tests/model_validation/ragas/ContextEntityRecall.py +1 -1
  86. validmind/tests/model_validation/ragas/ContextPrecision.py +1 -1
  87. validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +1 -1
  88. validmind/tests/model_validation/ragas/ContextRecall.py +1 -1
  89. validmind/tests/model_validation/ragas/Faithfulness.py +1 -1
  90. validmind/tests/model_validation/ragas/NoiseSensitivity.py +1 -1
  91. validmind/tests/model_validation/ragas/ResponseRelevancy.py +1 -1
  92. validmind/tests/model_validation/ragas/SemanticSimilarity.py +1 -1
  93. validmind/tests/model_validation/ragas/utils.py +8 -7
  94. validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +9 -9
  95. validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +9 -9
  96. validmind/tests/model_validation/sklearn/CalibrationCurve.py +5 -2
  97. validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +15 -2
  98. validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +5 -1
  99. validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +24 -14
  100. validmind/tests/model_validation/sklearn/CompletenessScore.py +8 -9
  101. validmind/tests/model_validation/sklearn/ConfusionMatrix.py +22 -3
  102. validmind/tests/model_validation/sklearn/FeatureImportance.py +6 -2
  103. validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +12 -9
  104. validmind/tests/model_validation/sklearn/HomogeneityScore.py +14 -9
  105. validmind/tests/model_validation/sklearn/HyperParametersTuning.py +4 -2
  106. validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +6 -1
  107. validmind/tests/model_validation/sklearn/MinimumAccuracy.py +12 -7
  108. validmind/tests/model_validation/sklearn/MinimumF1Score.py +12 -7
  109. validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +18 -7
  110. validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +8 -2
  111. validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +5 -1
  112. validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +5 -1
  113. validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +6 -1
  114. validmind/tests/model_validation/sklearn/ROCCurve.py +3 -1
  115. validmind/tests/model_validation/sklearn/RegressionErrors.py +6 -2
  116. validmind/tests/model_validation/sklearn/RegressionPerformance.py +13 -8
  117. validmind/tests/model_validation/sklearn/RegressionR2Square.py +8 -5
  118. validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +5 -1
  119. validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +6 -1
  120. validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +10 -2
  121. validmind/tests/model_validation/sklearn/SilhouettePlot.py +5 -1
  122. validmind/tests/model_validation/sklearn/VMeasure.py +12 -9
  123. validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +5 -1
  124. validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +6 -1
  125. validmind/tests/model_validation/statsmodels/GINITable.py +8 -1
  126. validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +2 -2
  127. validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +6 -2
  128. validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +8 -2
  129. validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +3 -1
  130. validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +7 -2
  131. validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +2 -0
  132. validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +2 -0
  133. validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +11 -9
  134. validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +3 -1
  135. validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +11 -1
  136. validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +10 -2
  137. validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +8 -1
  138. validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +18 -2
  139. validmind/tests/ongoing_monitoring/FeatureDrift.py +9 -2
  140. validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +8 -2
  141. validmind/tests/ongoing_monitoring/PredictionCorrelation.py +13 -2
  142. validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +13 -2
  143. validmind/tests/ongoing_monitoring/ROCCurveDrift.py +16 -2
  144. validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +11 -2
  145. validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +13 -2
  146. validmind/tests/prompt_validation/Clarity.py +1 -1
  147. validmind/tests/prompt_validation/NegativeInstruction.py +1 -1
  148. validmind/tests/prompt_validation/Robustness.py +6 -1
  149. validmind/tests/prompt_validation/Specificity.py +1 -1
  150. validmind/tests/prompt_validation/ai_powered_test.py +5 -4
  151. validmind/tests/run.py +5 -1
  152. validmind/utils.py +13 -0
  153. validmind/vm_models/result/result.py +43 -2
  154. {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/METADATA +3 -2
  155. {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/RECORD +158 -163
  156. validmind/ai/test_result_description/config.yaml +0 -29
  157. validmind/ai/test_result_description/context.py +0 -73
  158. validmind/ai/test_result_description/image_processing.py +0 -124
  159. validmind/ai/test_result_description/system.jinja +0 -39
  160. validmind/ai/test_result_description/user.jinja +0 -30
  161. {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/LICENSE +0 -0
  162. {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/WHEEL +0 -0
  163. {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/entry_points.txt +0 -0
@@ -8,7 +8,7 @@ import numpy as np
8
8
  import plotly.graph_objects as go
9
9
  from sklearn.metrics import roc_auc_score, roc_curve
10
10
 
11
- from validmind import tags, tasks
11
+ from validmind import RawData, tags, tasks
12
12
  from validmind.errors import SkipTestError
13
13
  from validmind.vm_models import VMDataset, VMModel
14
14
 
@@ -147,4 +147,18 @@ def ROCCurveDrift(datasets: List[VMDataset], model: VMModel):
147
147
  height=500,
148
148
  )
149
149
 
150
- return fig1, fig2
150
+ return (
151
+ fig1,
152
+ fig2,
153
+ RawData(
154
+ fpr_ref=fpr_ref,
155
+ tpr_ref=tpr_ref,
156
+ auc_ref=auc_ref,
157
+ fpr_mon=fpr_mon,
158
+ tpr_mon=tpr_mon,
159
+ auc_mon=auc_mon,
160
+ model=model.input_id,
161
+ dataset_reference=datasets[0].input_id,
162
+ dataset_monitoring=datasets[1].input_id,
163
+ ),
164
+ )
@@ -7,7 +7,7 @@ from typing import List
7
7
  import numpy as np
8
8
  import pandas as pd
9
9
 
10
- from validmind import tags, tasks
10
+ from validmind import RawData, tags, tasks
11
11
  from validmind.vm_models import VMDataset, VMModel
12
12
 
13
13
 
@@ -209,4 +209,13 @@ def ScoreBandsDrift(
209
209
  tables[table_name] = pd.DataFrame(rows)
210
210
  all_passed &= metric_passed
211
211
 
212
- return tables, all_passed
212
+ # Collect raw data
213
+ raw_data = RawData(
214
+ ref_results=ref_results,
215
+ mon_results=mon_results,
216
+ model=model.input_id,
217
+ dataset_reference=datasets[0].input_id,
218
+ dataset_monitoring=datasets[1].input_id,
219
+ )
220
+
221
+ return tables, all_passed, raw_data
@@ -7,7 +7,7 @@ import plotly.figure_factory as ff
7
7
  import plotly.graph_objects as go
8
8
  from scipy.stats import kurtosis, skew
9
9
 
10
- from validmind import tags, tasks
10
+ from validmind import RawData, tags, tasks
11
11
 
12
12
 
13
13
  @tags("visualization")
@@ -142,4 +142,15 @@ def TargetPredictionDistributionPlot(datasets, model, drift_pct_threshold=20):
142
142
 
143
143
  pass_fail_bool = (moments["Pass/Fail"] == "Pass").all()
144
144
 
145
- return ({"Distribution Moments": moments}, fig, pass_fail_bool)
145
+ return (
146
+ {"Distribution Moments": moments},
147
+ fig,
148
+ pass_fail_bool,
149
+ RawData(
150
+ pred_ref=pred_ref,
151
+ pred_monitor=pred_monitor,
152
+ model=model.input_id,
153
+ dataset_reference=datasets[0].input_id,
154
+ dataset_monitoring=datasets[1].input_id,
155
+ ),
156
+ )
@@ -106,5 +106,5 @@ def Clarity(model, min_threshold=7):
106
106
  }
107
107
  ],
108
108
  passed,
109
- RawData(response=response),
109
+ RawData(response=response, model=model.input_id),
110
110
  )
@@ -117,5 +117,5 @@ def NegativeInstruction(model, min_threshold=7):
117
117
  }
118
118
  ],
119
119
  passed,
120
- RawData(model_response=response),
120
+ RawData(model_response=response, model=model.input_id),
121
121
  )
@@ -130,5 +130,10 @@ def Robustness(model, dataset, num_tests=10):
130
130
  return (
131
131
  results,
132
132
  all(result["Pass/Fail"] == "Pass" for result in results),
133
- RawData(generated_inputs=generated_inputs, responses=responses),
133
+ RawData(
134
+ generated_inputs=generated_inputs,
135
+ responses=responses,
136
+ model=model.input_id,
137
+ dataset=dataset.input_id,
138
+ ),
134
139
  )
@@ -113,5 +113,5 @@ def Specificity(model, min_threshold=7):
113
113
  }
114
114
  ],
115
115
  passed,
116
- RawData(response=response),
116
+ RawData(response=response, model=model.input_id),
117
117
  )
@@ -4,8 +4,7 @@
4
4
 
5
5
  import re
6
6
 
7
- from validmind.ai.utils import get_client_and_model
8
- from validmind.client_config import client_config
7
+ from validmind.ai.utils import get_client_and_model, is_configured
9
8
 
10
9
  missing_prompt_message = """
11
10
  Cannot run prompt validation tests on a model with no prompt.
@@ -25,9 +24,11 @@ def call_model(
25
24
  system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42
26
25
  ):
27
26
  """Call LLM with the given prompts and return the response"""
28
- if not client_config.can_generate_llm_test_descriptions():
27
+ if not is_configured():
29
28
  raise ValueError(
30
- "LLM based descriptions are not enabled for your organization."
29
+ "LLM is not configured. Please set an `OPENAI_API_KEY` environment variable "
30
+ "or ensure that you are connected to the ValidMind API and ValidMind AI is "
31
+ "enabled for your account."
31
32
  )
32
33
 
33
34
  client, model = get_client_and_model()
validmind/tests/run.py CHANGED
@@ -256,7 +256,7 @@ def _run_comparison_test(
256
256
  combined_outputs, combined_inputs, combined_params = combine_results(results)
257
257
 
258
258
  return build_test_result(
259
- outputs=tuple(combined_outputs),
259
+ outputs=combined_outputs,
260
260
  test_id=test_id,
261
261
  test_doc=test_doc,
262
262
  inputs=combined_inputs,
@@ -400,5 +400,9 @@ def run_test( # noqa: C901
400
400
 
401
401
 
402
402
  def print_env():
403
+ """Prints a log of the running environment for debugging.
404
+
405
+ Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation.
406
+ """
403
407
  e = _get_run_metadata()
404
408
  pprint.pp(e)
validmind/utils.py CHANGED
@@ -60,6 +60,19 @@ pylab.rcParams.update(params)
60
60
  logger = get_logger(__name__)
61
61
 
62
62
 
63
+ def parse_version(version: str) -> tuple[int, ...]:
64
+ """
65
+ Parse a semver version string into a tuple of major, minor, patch integers
66
+
67
+ Args:
68
+ version (str): The semantic version string to parse
69
+
70
+ Returns:
71
+ tuple[int, ...]: A tuple of major, minor, patch integers
72
+ """
73
+ return tuple(int(x) for x in version.split(".")[:3])
74
+
75
+
63
76
  def is_notebook() -> bool:
64
77
  """
65
78
  Checks if the code is running in a Jupyter notebook or IPython shell
@@ -171,6 +171,7 @@ class TestResult(Result):
171
171
  metadata: Optional[Dict[str, Any]] = None
172
172
  _was_description_generated: bool = False
173
173
  _unsafe: bool = False
174
+ _client_config_cache: Optional[Any] = None
174
175
 
175
176
  def __post_init__(self):
176
177
  if self.ref_id is None:
@@ -329,13 +330,50 @@ class TestResult(Result):
329
330
 
330
331
  return VBox(widgets)
331
332
 
333
+ @classmethod
334
+ def _get_client_config(cls):
335
+ """Get the client config, loading it if not cached"""
336
+ if cls._client_config_cache is None:
337
+ api_client.reload()
338
+ cls._client_config_cache = api_client.client_config
339
+
340
+ if cls._client_config_cache is None:
341
+ raise ValueError(
342
+ "Failed to load client config: api_client.client_config is None"
343
+ )
344
+
345
+ if not hasattr(cls._client_config_cache, "documentation_template"):
346
+ raise ValueError(
347
+ "Invalid client config: missing documentation_template"
348
+ )
349
+
350
+ return cls._client_config_cache
351
+
352
+ def check_result_id_exist(self):
353
+ """Check if the result_id exists in any test block across all sections"""
354
+ client_config = self._get_client_config()
355
+
356
+ # Iterate through all sections
357
+ for section in client_config.documentation_template["sections"]:
358
+ blocks = section.get("contents", [])
359
+ # Check each block in the section
360
+ for block in blocks:
361
+ if (
362
+ block.get("content_type") == "test"
363
+ and block.get("content_id") == self.result_id
364
+ ):
365
+ return
366
+
367
+ logger.info(
368
+ f"Test driven block with result_id {self.result_id} does not exist in model's document"
369
+ )
370
+
332
371
  def _validate_section_id_for_block(
333
372
  self, section_id: str, position: Union[int, None] = None
334
373
  ):
335
374
  """Validate the section_id exits on the template before logging"""
336
- api_client.reload()
375
+ client_config = self._get_client_config()
337
376
  found = False
338
- client_config = api_client.client_config
339
377
 
340
378
  for section in client_config.documentation_template["sections"]:
341
379
  if section["id"] == section_id:
@@ -440,6 +478,9 @@ class TestResult(Result):
440
478
  unsafe (bool): If True, log the result even if it contains sensitive data
441
479
  i.e. raw data from input datasets
442
480
  """
481
+
482
+ self.check_result_id_exist()
483
+
443
484
  if not unsafe:
444
485
  for table in self.tables or []:
445
486
  check_for_sensitive_data(table.data, self._get_flat_inputs())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: validmind
3
- Version: 2.7.12
3
+ Version: 2.8.12
4
4
  Summary: ValidMind Library
5
5
  License: Commercial License
6
6
  Author: Andres Rodriguez
@@ -131,6 +131,7 @@ The ValidMind Library has optional dependencies that can be installed separately
131
131
  - **R Models**: To use R models with the ValidMind Library, install the `r` extra:
132
132
 
133
133
  ```bash
134
- pip install validmind[r-support]
134
+ pip install validmind
135
+ pip install rpy2
135
136
  ```
136
137