validmind 2.8.29__tar.gz → 2.9.1__tar.gz

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 (353) hide show
  1. {validmind-2.8.29 → validmind-2.9.1}/PKG-INFO +2 -2
  2. {validmind-2.8.29 → validmind-2.9.1}/pyproject.toml +2 -2
  3. validmind-2.9.1/validmind/__version__.py +1 -0
  4. {validmind-2.8.29 → validmind-2.9.1}/validmind/ai/utils.py +4 -24
  5. {validmind-2.8.29 → validmind-2.9.1}/validmind/api_client.py +6 -17
  6. {validmind-2.8.29 → validmind-2.9.1}/validmind/logging.py +48 -0
  7. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/__init__.py +2 -0
  8. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/__types__.py +18 -0
  9. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/output.py +9 -2
  10. validmind-2.9.1/validmind/tests/plots/BoxPlot.py +260 -0
  11. validmind-2.9.1/validmind/tests/plots/CorrelationHeatmap.py +235 -0
  12. validmind-2.9.1/validmind/tests/plots/HistogramPlot.py +233 -0
  13. validmind-2.9.1/validmind/tests/plots/ViolinPlot.py +125 -0
  14. validmind-2.9.1/validmind/tests/prompt_validation/__init__.py +0 -0
  15. validmind-2.9.1/validmind/tests/stats/CorrelationAnalysis.py +251 -0
  16. validmind-2.9.1/validmind/tests/stats/DescriptiveStats.py +197 -0
  17. validmind-2.9.1/validmind/tests/stats/NormalityTests.py +147 -0
  18. validmind-2.9.1/validmind/tests/stats/OutlierDetection.py +173 -0
  19. validmind-2.9.1/validmind/tests/stats/__init__.py +0 -0
  20. validmind-2.9.1/validmind/unit_metrics/classification/individual/AbsoluteError.py +42 -0
  21. validmind-2.9.1/validmind/unit_metrics/classification/individual/BrierScore.py +56 -0
  22. validmind-2.9.1/validmind/unit_metrics/classification/individual/CalibrationError.py +77 -0
  23. validmind-2.9.1/validmind/unit_metrics/classification/individual/ClassBalance.py +65 -0
  24. validmind-2.9.1/validmind/unit_metrics/classification/individual/Confidence.py +52 -0
  25. validmind-2.9.1/validmind/unit_metrics/classification/individual/Correctness.py +41 -0
  26. validmind-2.9.1/validmind/unit_metrics/classification/individual/LogLoss.py +61 -0
  27. validmind-2.9.1/validmind/unit_metrics/classification/individual/OutlierScore.py +86 -0
  28. validmind-2.9.1/validmind/unit_metrics/classification/individual/ProbabilityError.py +54 -0
  29. validmind-2.9.1/validmind/unit_metrics/classification/individual/Uncertainty.py +60 -0
  30. validmind-2.9.1/validmind/unit_metrics/classification/individual/__init__.py +0 -0
  31. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/dataset/dataset.py +147 -1
  32. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/result/result.py +26 -4
  33. validmind-2.8.29/validmind/__version__.py +0 -1
  34. {validmind-2.8.29 → validmind-2.9.1}/LICENSE +0 -0
  35. {validmind-2.8.29 → validmind-2.9.1}/README.pypi.md +0 -0
  36. {validmind-2.8.29 → validmind-2.9.1}/validmind/__init__.py +0 -0
  37. {validmind-2.8.29 → validmind-2.9.1}/validmind/ai/test_descriptions.py +0 -0
  38. {validmind-2.8.29 → validmind-2.9.1}/validmind/client.py +0 -0
  39. {validmind-2.8.29 → validmind-2.9.1}/validmind/client_config.py +0 -0
  40. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/__init__.py +0 -0
  41. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/classification/__init__.py +0 -0
  42. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/classification/customer_churn.py +0 -0
  43. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/classification/datasets/bank_customer_churn.csv +0 -0
  44. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/classification/datasets/taiwan_credit.csv +0 -0
  45. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/classification/taiwan_credit.py +0 -0
  46. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/cluster/digits.py +0 -0
  47. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/credit_risk/__init__.py +0 -0
  48. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/credit_risk/datasets/lending_club_biased.csv.gz +0 -0
  49. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/credit_risk/datasets/lending_club_loan_data_2007_2014_clean.csv.gz +0 -0
  50. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/credit_risk/lending_club.py +0 -0
  51. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/credit_risk/lending_club_bias.py +0 -0
  52. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/llm/rag/__init__.py +0 -0
  53. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_1.csv +0 -0
  54. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_2.csv +0 -0
  55. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_3.csv +0 -0
  56. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_4.csv +0 -0
  57. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_5.csv +0 -0
  58. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/llm/rag/rfp.py +0 -0
  59. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/nlp/__init__.py +0 -0
  60. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/nlp/cnn_dailymail.py +0 -0
  61. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/nlp/datasets/Covid_19.csv +0 -0
  62. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/nlp/datasets/cnn_dailymail_100_with_predictions.csv +0 -0
  63. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/nlp/datasets/cnn_dailymail_500_with_predictions.csv +0 -0
  64. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/nlp/datasets/sentiments_with_predictions.csv +0 -0
  65. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/nlp/twitter_covid_19.py +0 -0
  66. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/__init__.py +0 -0
  67. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/california_housing.py +0 -0
  68. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/CPIAUCSL.csv +0 -0
  69. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/CSUSHPISA.csv +0 -0
  70. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/DRSFRMACBS.csv +0 -0
  71. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/FEDFUNDS.csv +0 -0
  72. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/GDP.csv +0 -0
  73. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/GDPC1.csv +0 -0
  74. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/GS10.csv +0 -0
  75. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/GS3.csv +0 -0
  76. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/GS5.csv +0 -0
  77. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/MORTGAGE30US.csv +0 -0
  78. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred/UNRATE.csv +0 -0
  79. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred_loan_rates.csv +0 -0
  80. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred_loan_rates_test_1.csv +0 -0
  81. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred_loan_rates_test_2.csv +0 -0
  82. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred_loan_rates_test_3.csv +0 -0
  83. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred_loan_rates_test_4.csv +0 -0
  84. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/fred_loan_rates_test_5.csv +0 -0
  85. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/datasets/leanding_club_loan_rates.csv +0 -0
  86. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/fred.py +0 -0
  87. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/fred_timeseries.py +0 -0
  88. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/lending_club.py +0 -0
  89. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/models/fred_loan_rates_model_1.pkl +0 -0
  90. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/models/fred_loan_rates_model_2.pkl +0 -0
  91. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/models/fred_loan_rates_model_3.pkl +0 -0
  92. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/models/fred_loan_rates_model_4.pkl +0 -0
  93. {validmind-2.8.29 → validmind-2.9.1}/validmind/datasets/regression/models/fred_loan_rates_model_5.pkl +0 -0
  94. {validmind-2.8.29 → validmind-2.9.1}/validmind/errors.py +0 -0
  95. {validmind-2.8.29 → validmind-2.9.1}/validmind/experimental/__init__.py +0 -0
  96. {validmind-2.8.29 → validmind-2.9.1}/validmind/experimental/agents.py +0 -0
  97. {validmind-2.8.29 → validmind-2.9.1}/validmind/html_templates/__init__.py +0 -0
  98. {validmind-2.8.29 → validmind-2.9.1}/validmind/html_templates/content_blocks.py +0 -0
  99. {validmind-2.8.29 → validmind-2.9.1}/validmind/input_registry.py +0 -0
  100. {validmind-2.8.29 → validmind-2.9.1}/validmind/models/__init__.py +0 -0
  101. {validmind-2.8.29 → validmind-2.9.1}/validmind/models/foundation.py +0 -0
  102. {validmind-2.8.29 → validmind-2.9.1}/validmind/models/function.py +0 -0
  103. {validmind-2.8.29 → validmind-2.9.1}/validmind/models/huggingface.py +0 -0
  104. {validmind-2.8.29 → validmind-2.9.1}/validmind/models/metadata.py +0 -0
  105. {validmind-2.8.29 → validmind-2.9.1}/validmind/models/pipeline.py +0 -0
  106. {validmind-2.8.29 → validmind-2.9.1}/validmind/models/pytorch.py +0 -0
  107. {validmind-2.8.29 → validmind-2.9.1}/validmind/models/r_model.py +0 -0
  108. {validmind-2.8.29 → validmind-2.9.1}/validmind/models/sklearn.py +0 -0
  109. {validmind-2.8.29 → validmind-2.9.1}/validmind/template.py +0 -0
  110. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/__init__.py +0 -0
  111. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/classifier.py +0 -0
  112. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/cluster.py +0 -0
  113. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/embeddings.py +0 -0
  114. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/llm.py +0 -0
  115. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/nlp.py +0 -0
  116. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/parameters_optimization.py +0 -0
  117. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/regression.py +0 -0
  118. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/statsmodels_timeseries.py +0 -0
  119. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/summarization.py +0 -0
  120. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/tabular_datasets.py +0 -0
  121. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/text_data.py +0 -0
  122. {validmind-2.8.29 → validmind-2.9.1}/validmind/test_suites/time_series.py +0 -0
  123. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/_store.py +0 -0
  124. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/comparison.py +0 -0
  125. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ACFandPACFPlot.py +0 -0
  126. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ADF.py +0 -0
  127. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/AutoAR.py +0 -0
  128. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/AutoMA.py +0 -0
  129. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/AutoStationarity.py +0 -0
  130. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/BivariateScatterPlots.py +0 -0
  131. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/BoxPierce.py +0 -0
  132. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ChiSquaredFeaturesTable.py +0 -0
  133. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ClassImbalance.py +0 -0
  134. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/DatasetDescription.py +0 -0
  135. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/DatasetSplit.py +0 -0
  136. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/DescriptiveStatistics.py +0 -0
  137. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/DickeyFullerGLS.py +0 -0
  138. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/Duplicates.py +0 -0
  139. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/EngleGrangerCoint.py +0 -0
  140. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +0 -0
  141. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/HighCardinality.py +0 -0
  142. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/HighPearsonCorrelation.py +0 -0
  143. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/IQROutliersBarPlot.py +0 -0
  144. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/IQROutliersTable.py +0 -0
  145. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/IsolationForestOutliers.py +0 -0
  146. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/JarqueBera.py +0 -0
  147. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/KPSS.py +0 -0
  148. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/LJungBox.py +0 -0
  149. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/LaggedCorrelationHeatmap.py +0 -0
  150. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/MissingValues.py +0 -0
  151. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/MissingValuesBarPlot.py +0 -0
  152. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/MutualInformation.py +0 -0
  153. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/PearsonCorrelationMatrix.py +0 -0
  154. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/PhillipsPerronArch.py +0 -0
  155. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ProtectedClassesCombination.py +0 -0
  156. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ProtectedClassesDescription.py +0 -0
  157. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ProtectedClassesDisparity.py +0 -0
  158. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +0 -0
  159. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/RollingStatsPlot.py +0 -0
  160. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/RunsTest.py +0 -0
  161. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ScatterPlot.py +0 -0
  162. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ScoreBandDefaultRates.py +0 -0
  163. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/SeasonalDecompose.py +0 -0
  164. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ShapiroWilk.py +0 -0
  165. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/Skewness.py +0 -0
  166. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/SpreadPlot.py +0 -0
  167. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TabularCategoricalBarPlots.py +0 -0
  168. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TabularDateTimeHistograms.py +0 -0
  169. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TabularDescriptionTables.py +0 -0
  170. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TabularNumericalHistograms.py +0 -0
  171. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TargetRateBarPlots.py +0 -0
  172. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TimeSeriesDescription.py +0 -0
  173. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.py +0 -0
  174. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TimeSeriesFrequency.py +0 -0
  175. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TimeSeriesHistogram.py +0 -0
  176. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TimeSeriesLinePlot.py +0 -0
  177. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TimeSeriesMissingValues.py +0 -0
  178. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TimeSeriesOutliers.py +0 -0
  179. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/TooManyZeroValues.py +0 -0
  180. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/UniqueRows.py +0 -0
  181. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/WOEBinPlots.py +0 -0
  182. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/WOEBinTable.py +0 -0
  183. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/ZivotAndrewsArch.py +0 -0
  184. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/__init__.py +0 -0
  185. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/CommonWords.py +0 -0
  186. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/Hashtags.py +0 -0
  187. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/LanguageDetection.py +0 -0
  188. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/Mentions.py +0 -0
  189. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +0 -0
  190. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/Punctuations.py +0 -0
  191. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/Sentiment.py +0 -0
  192. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/StopWords.py +0 -0
  193. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/TextDescription.py +0 -0
  194. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/Toxicity.py +0 -0
  195. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/data_validation/nlp/__init__.py +0 -0
  196. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/decorator.py +0 -0
  197. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/load.py +0 -0
  198. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/BertScore.py +0 -0
  199. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/BleuScore.py +0 -0
  200. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ClusterSizeDistribution.py +0 -0
  201. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ContextualRecall.py +0 -0
  202. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/FeaturesAUC.py +0 -0
  203. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/MeteorScore.py +0 -0
  204. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ModelMetadata.py +0 -0
  205. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ModelPredictionResiduals.py +0 -0
  206. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/RegardScore.py +0 -0
  207. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/RegressionResidualsPlot.py +0 -0
  208. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/RougeScore.py +0 -0
  209. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +0 -0
  210. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +0 -0
  211. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +0 -0
  212. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/TokenDisparity.py +0 -0
  213. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ToxicityScore.py +0 -0
  214. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/__init__.py +0 -0
  215. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/ClusterDistribution.py +0 -0
  216. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +0 -0
  217. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +0 -0
  218. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +0 -0
  219. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +0 -0
  220. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +0 -0
  221. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +0 -0
  222. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +0 -0
  223. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +0 -0
  224. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +0 -0
  225. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +0 -0
  226. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +0 -0
  227. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +0 -0
  228. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +0 -0
  229. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/embeddings/utils.py +0 -0
  230. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/AnswerCorrectness.py +0 -0
  231. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/AspectCritic.py +0 -0
  232. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/ContextEntityRecall.py +0 -0
  233. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/ContextPrecision.py +0 -0
  234. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +0 -0
  235. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/ContextRecall.py +0 -0
  236. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/Faithfulness.py +0 -0
  237. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/NoiseSensitivity.py +0 -0
  238. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/ResponseRelevancy.py +0 -0
  239. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/SemanticSimilarity.py +0 -0
  240. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/ragas/utils.py +0 -0
  241. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +0 -0
  242. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +0 -0
  243. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/CalibrationCurve.py +0 -0
  244. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/ClassifierPerformance.py +0 -0
  245. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +0 -0
  246. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +0 -0
  247. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +0 -0
  248. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/CompletenessScore.py +0 -0
  249. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py +0 -0
  250. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/FeatureImportance.py +0 -0
  251. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +0 -0
  252. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/HomogeneityScore.py +0 -0
  253. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/HyperParametersTuning.py +0 -0
  254. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +0 -0
  255. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/MinimumAccuracy.py +0 -0
  256. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/MinimumF1Score.py +0 -0
  257. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +0 -0
  258. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/ModelParameters.py +0 -0
  259. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +0 -0
  260. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +0 -0
  261. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +0 -0
  262. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +0 -0
  263. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +0 -0
  264. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/ROCCurve.py +0 -0
  265. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/RegressionErrors.py +0 -0
  266. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py +0 -0
  267. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/RegressionPerformance.py +0 -0
  268. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/RegressionR2Square.py +0 -0
  269. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py +0 -0
  270. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +0 -0
  271. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +0 -0
  272. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +0 -0
  273. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/SilhouettePlot.py +0 -0
  274. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +0 -0
  275. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/VMeasure.py +0 -0
  276. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +0 -0
  277. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/sklearn/__init__.py +0 -0
  278. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/AutoARIMA.py +0 -0
  279. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +0 -0
  280. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +0 -0
  281. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/GINITable.py +0 -0
  282. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +0 -0
  283. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/Lilliefors.py +0 -0
  284. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +0 -0
  285. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +0 -0
  286. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +0 -0
  287. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +0 -0
  288. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +0 -0
  289. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +0 -0
  290. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +0 -0
  291. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +0 -0
  292. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +0 -0
  293. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/__init__.py +0 -0
  294. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/model_validation/statsmodels/statsutils.py +0 -0
  295. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +0 -0
  296. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py +0 -0
  297. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py +0 -0
  298. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +0 -0
  299. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +0 -0
  300. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +0 -0
  301. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/FeatureDrift.py +0 -0
  302. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +0 -0
  303. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/PredictionCorrelation.py +0 -0
  304. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +0 -0
  305. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py +0 -0
  306. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/ROCCurveDrift.py +0 -0
  307. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +0 -0
  308. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py +0 -0
  309. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +0 -0
  310. {validmind-2.8.29/validmind/tests/prompt_validation → validmind-2.9.1/validmind/tests/plots}/__init__.py +0 -0
  311. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/prompt_validation/Bias.py +0 -0
  312. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/prompt_validation/Clarity.py +0 -0
  313. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/prompt_validation/Conciseness.py +0 -0
  314. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/prompt_validation/Delimitation.py +0 -0
  315. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/prompt_validation/NegativeInstruction.py +0 -0
  316. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/prompt_validation/Robustness.py +0 -0
  317. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/prompt_validation/Specificity.py +0 -0
  318. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/prompt_validation/ai_powered_test.py +0 -0
  319. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/run.py +0 -0
  320. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/test_providers.py +0 -0
  321. {validmind-2.8.29 → validmind-2.9.1}/validmind/tests/utils.py +0 -0
  322. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/__init__.py +0 -0
  323. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/classification/Accuracy.py +0 -0
  324. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/classification/F1.py +0 -0
  325. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/classification/Precision.py +0 -0
  326. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/classification/ROC_AUC.py +0 -0
  327. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/classification/Recall.py +0 -0
  328. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/AdjustedRSquaredScore.py +0 -0
  329. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/GiniCoefficient.py +0 -0
  330. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/HuberLoss.py +0 -0
  331. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +0 -0
  332. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/MeanAbsoluteError.py +0 -0
  333. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +0 -0
  334. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/MeanBiasDeviation.py +0 -0
  335. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/MeanSquaredError.py +0 -0
  336. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/QuantileLoss.py +0 -0
  337. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/RSquaredScore.py +0 -0
  338. {validmind-2.8.29 → validmind-2.9.1}/validmind/unit_metrics/regression/RootMeanSquaredError.py +0 -0
  339. {validmind-2.8.29 → validmind-2.9.1}/validmind/utils.py +0 -0
  340. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/__init__.py +0 -0
  341. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/dataset/__init__.py +0 -0
  342. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/dataset/utils.py +0 -0
  343. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/figure.py +0 -0
  344. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/input.py +0 -0
  345. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/model.py +0 -0
  346. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/result/__init__.py +0 -0
  347. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/result/result.jinja +0 -0
  348. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/result/utils.py +0 -0
  349. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/test_suite/__init__.py +0 -0
  350. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/test_suite/runner.py +0 -0
  351. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/test_suite/summary.py +0 -0
  352. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/test_suite/test.py +0 -0
  353. {validmind-2.8.29 → validmind-2.9.1}/validmind/vm_models/test_suite/test_suite.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: validmind
3
- Version: 2.8.29
3
+ Version: 2.9.1
4
4
  Summary: ValidMind Library
5
5
  License: Commercial License
6
6
  Author: Andres Rodriguez
@@ -24,7 +24,7 @@ Requires-Dist: datasets (>=2.10.0,<3.0.0)
24
24
  Requires-Dist: evaluate
25
25
  Requires-Dist: h11 (>=0.16.0)
26
26
  Requires-Dist: ipywidgets
27
- Requires-Dist: kaleido (>=0.2.1,!=0.2.1.post1)
27
+ Requires-Dist: kaleido (>=0.2.1,!=0.2.1.post1,<1.0.0)
28
28
  Requires-Dist: langchain-openai (>=0.1.8) ; extra == "all" or extra == "llm"
29
29
  Requires-Dist: langdetect
30
30
  Requires-Dist: llvmlite ; python_version >= "3.8" and python_full_version <= "3.11.0"
@@ -10,7 +10,7 @@ description = "ValidMind Library"
10
10
  license = "Commercial License"
11
11
  name = "validmind"
12
12
  readme = "README.pypi.md"
13
- version = "2.8.29"
13
+ version = "2.9.1"
14
14
 
15
15
  [tool.poetry.dependencies]
16
16
  aiohttp = {extras = ["speedups"], version = "*"}
@@ -22,7 +22,7 @@ datasets = "^2.10.0"
22
22
  evaluate = "*"
23
23
  h11 = ">=0.16.0"
24
24
  ipywidgets = "*"
25
- kaleido = ">=0.2.1,!=0.2.1.post1"
25
+ kaleido = ">=0.2.1,!=0.2.1.post1,<1.0.0"
26
26
  langchain-openai = {version = ">=0.1.8", optional = true}
27
27
  langdetect = "*"
28
28
  llvmlite = {version = "*", python = ">=3.8,<=3.11"}
@@ -0,0 +1 @@
1
+ __version__ = "2.9.1"
@@ -3,9 +3,8 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
4
4
 
5
5
  import os
6
- from urllib.parse import urljoin
7
6
 
8
- from openai import AzureOpenAI, Client, OpenAI
7
+ from openai import AzureOpenAI, OpenAI
9
8
 
10
9
  from ..logging import get_logger
11
10
  from ..utils import md_to_html
@@ -83,28 +82,9 @@ def get_client_and_model():
83
82
  logger.debug(f"Using Azure OpenAI {__model} for generating descriptions")
84
83
 
85
84
  else:
86
- try:
87
- # TODO: fix circular import
88
- from ..api_client import get_ai_key, get_api_host
89
-
90
- response = get_ai_key()
91
- __client = Client(
92
- base_url=(
93
- # TODO: improve this to be a bit more dynamic
94
- "http://localhost:4000/genai"
95
- if "localhost" in get_api_host()
96
- else urljoin(get_api_host(), "/genai")
97
- ),
98
- api_key=response["key"],
99
- )
100
- __model = "gpt-4o" # TODO: backend should tell us which model to use
101
- logger.debug(f"Using ValidMind {__model} for generating descriptions")
102
- except Exception as e:
103
- logger.debug(f"Failed to get API key: {e}")
104
- raise ValueError(
105
- "OPENAI_API_KEY, AZURE_OPENAI_KEY must be set, or your account "
106
- "must be setup to use ValidMind's LLM in order to use LLM features"
107
- )
85
+ raise ValueError(
86
+ "OPENAI_API_KEY, AZURE_OPENAI_KEY must be setup to use LLM features"
87
+ )
108
88
 
109
89
  return __client, __model
110
90
 
@@ -22,7 +22,7 @@ from ipywidgets import HTML, Accordion
22
22
 
23
23
  from .client_config import client_config
24
24
  from .errors import MissingAPICredentialsError, MissingModelIdError, raise_api_error
25
- from .logging import get_logger, init_sentry, send_single_error
25
+ from .logging import get_logger, init_sentry, log_api_operation, send_single_error
26
26
  from .utils import NumpyEncoder, is_html, md_to_html, run_async
27
27
  from .vm_models import Figure
28
28
 
@@ -85,7 +85,7 @@ def _get_session() -> aiohttp.ClientSession:
85
85
  if not __api_session or __api_session.closed:
86
86
  __api_session = aiohttp.ClientSession(
87
87
  headers=_get_api_headers(),
88
- timeout=aiohttp.ClientTimeout(total=30),
88
+ timeout=aiohttp.ClientTimeout(total=int(os.getenv("VM_API_TIMEOUT", 30))),
89
89
  )
90
90
 
91
91
  return __api_session
@@ -304,6 +304,10 @@ async def alog_metadata(
304
304
  raise e
305
305
 
306
306
 
307
+ @log_api_operation(
308
+ operation_name="Sending figure to ValidMind API",
309
+ extract_key=lambda figure: figure.key,
310
+ )
307
311
  async def alog_figure(figure: Figure) -> Dict[str, Any]:
308
312
  """Logs a figure.
309
313
 
@@ -525,21 +529,6 @@ def log_metric(
525
529
  )
526
530
 
527
531
 
528
- def get_ai_key() -> Dict[str, Any]:
529
- """Calls the API to get an API key for our LLM proxy."""
530
- r = requests.get(
531
- url=_get_url("ai/key"),
532
- headers=_get_api_headers(),
533
- )
534
-
535
- if r.status_code != 200:
536
- # TODO: improve error handling when there's no Open AI API or AI key available
537
- # logger.error("Could not get AI key from ValidMind API")
538
- raise_api_error(r.text)
539
-
540
- return r.json()
541
-
542
-
543
532
  def generate_test_result_description(test_result_data: Dict[str, Any]) -> str:
544
533
  r = requests.post(
545
534
  url=_get_url("ai/generate/test_result_description"),
@@ -170,6 +170,54 @@ async def log_performance_async(
170
170
  return wrap
171
171
 
172
172
 
173
+ def log_api_operation(
174
+ operation_name: Optional[str] = None,
175
+ logger: Optional[logging.Logger] = None,
176
+ extract_key: Optional[Callable] = None,
177
+ force: bool = False,
178
+ ) -> Callable[[F], F]:
179
+ """Decorator to log API operations like figure uploads.
180
+
181
+ Args:
182
+ operation_name (str, optional): The name of the operation. Defaults to function name.
183
+ logger (logging.Logger, optional): The logger to use. Defaults to None.
184
+ extract_key (Callable, optional): Function to extract a key from args for logging.
185
+ force (bool, optional): Whether to force logging even if env var is off.
186
+
187
+ Returns:
188
+ Callable: The decorated function.
189
+ """
190
+
191
+ def decorator(func: F) -> F:
192
+ # check if log level is set to debug
193
+ if _get_log_level() != logging.DEBUG and not force:
194
+ return func
195
+
196
+ nonlocal logger
197
+ if logger is None:
198
+ logger = get_logger()
199
+
200
+ nonlocal operation_name
201
+ if operation_name is None:
202
+ operation_name = func.__name__
203
+
204
+ async def wrapped(*args: Any, **kwargs: Any) -> Any:
205
+ # Try to extract a meaningful identifier from the arguments
206
+ identifier = ""
207
+ if extract_key and args:
208
+ try:
209
+ identifier = f": {extract_key(args[0])}"
210
+ except (AttributeError, IndexError):
211
+ pass
212
+
213
+ logger.debug(f"{operation_name}{identifier}")
214
+ return await func(*args, **kwargs)
215
+
216
+ return wrapped
217
+
218
+ return decorator
219
+
220
+
173
221
  def send_single_error(error: Exception) -> None:
174
222
  """Send a single error to Sentry.
175
223
 
@@ -43,6 +43,8 @@ __all__ = [
43
43
  "data_validation",
44
44
  "model_validation",
45
45
  "prompt_validation",
46
+ "plots",
47
+ "stats",
46
48
  "list_tests",
47
49
  "load_test",
48
50
  "describe_test",
@@ -187,6 +187,10 @@ TestID = Union[
187
187
  "validmind.ongoing_monitoring.ScoreBandsDrift",
188
188
  "validmind.ongoing_monitoring.ScorecardHistogramDrift",
189
189
  "validmind.ongoing_monitoring.TargetPredictionDistributionPlot",
190
+ "validmind.plots.BoxPlot",
191
+ "validmind.plots.CorrelationHeatmap",
192
+ "validmind.plots.HistogramPlot",
193
+ "validmind.plots.ViolinPlot",
190
194
  "validmind.prompt_validation.Bias",
191
195
  "validmind.prompt_validation.Clarity",
192
196
  "validmind.prompt_validation.Conciseness",
@@ -194,11 +198,25 @@ TestID = Union[
194
198
  "validmind.prompt_validation.NegativeInstruction",
195
199
  "validmind.prompt_validation.Robustness",
196
200
  "validmind.prompt_validation.Specificity",
201
+ "validmind.stats.CorrelationAnalysis",
202
+ "validmind.stats.DescriptiveStats",
203
+ "validmind.stats.NormalityTests",
204
+ "validmind.stats.OutlierDetection",
197
205
  "validmind.unit_metrics.classification.Accuracy",
198
206
  "validmind.unit_metrics.classification.F1",
199
207
  "validmind.unit_metrics.classification.Precision",
200
208
  "validmind.unit_metrics.classification.ROC_AUC",
201
209
  "validmind.unit_metrics.classification.Recall",
210
+ "validmind.unit_metrics.classification.individual.AbsoluteError",
211
+ "validmind.unit_metrics.classification.individual.BrierScore",
212
+ "validmind.unit_metrics.classification.individual.CalibrationError",
213
+ "validmind.unit_metrics.classification.individual.ClassBalance",
214
+ "validmind.unit_metrics.classification.individual.Confidence",
215
+ "validmind.unit_metrics.classification.individual.Correctness",
216
+ "validmind.unit_metrics.classification.individual.LogLoss",
217
+ "validmind.unit_metrics.classification.individual.OutlierScore",
218
+ "validmind.unit_metrics.classification.individual.ProbabilityError",
219
+ "validmind.unit_metrics.classification.individual.Uncertainty",
202
220
  "validmind.unit_metrics.regression.AdjustedRSquaredScore",
203
221
  "validmind.unit_metrics.regression.GiniCoefficient",
204
222
  "validmind.unit_metrics.regression.HuberLoss",
@@ -45,7 +45,13 @@ class BooleanOutputHandler(OutputHandler):
45
45
 
46
46
  class MetricOutputHandler(OutputHandler):
47
47
  def can_handle(self, item: Any) -> bool:
48
- return isinstance(item, (int, float))
48
+ # Accept individual numbers
49
+ if isinstance(item, (int, float)):
50
+ return True
51
+ # Accept lists/arrays of numbers for per-row metrics
52
+ if isinstance(item, (list, tuple, np.ndarray)):
53
+ return all(isinstance(x, (int, float, np.number)) for x in item)
54
+ return False
49
55
 
50
56
  def process(self, item: Any, result: TestResult) -> None:
51
57
  if result.metric is not None:
@@ -169,11 +175,12 @@ def process_output(item: Any, result: TestResult) -> None:
169
175
  """Process a single test output item and update the TestResult."""
170
176
  handlers = [
171
177
  BooleanOutputHandler(),
172
- MetricOutputHandler(),
173
178
  FigureOutputHandler(),
174
179
  TableOutputHandler(),
175
180
  RawDataOutputHandler(),
176
181
  StringOutputHandler(),
182
+ # Unit metrics should be processed last
183
+ MetricOutputHandler(),
177
184
  ]
178
185
 
179
186
  for handler in handlers:
@@ -0,0 +1,260 @@
1
+ # Copyright © 2023-2024 ValidMind Inc. All rights reserved.
2
+ # See the LICENSE file in the root of this repository for details.
3
+ # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
4
+
5
+ from typing import List, Optional
6
+
7
+ import plotly.graph_objects as go
8
+ from plotly.subplots import make_subplots
9
+
10
+ from validmind import tags, tasks
11
+ from validmind.errors import SkipTestError
12
+ from validmind.vm_models import VMDataset
13
+
14
+
15
+ def _validate_inputs(
16
+ dataset: VMDataset, columns: Optional[List[str]], group_by: Optional[str]
17
+ ):
18
+ """Validate inputs and return validated columns."""
19
+ if columns is None:
20
+ columns = dataset.feature_columns_numeric
21
+ else:
22
+ available_columns = set(dataset.feature_columns_numeric)
23
+ columns = [col for col in columns if col in available_columns]
24
+
25
+ if not columns:
26
+ raise SkipTestError("No numerical columns found for box plotting")
27
+
28
+ if group_by is not None:
29
+ if group_by not in dataset.df.columns:
30
+ raise SkipTestError(f"Group column '{group_by}' not found in dataset")
31
+ if group_by in columns:
32
+ columns.remove(group_by)
33
+
34
+ return columns
35
+
36
+
37
+ def _create_grouped_boxplot(
38
+ dataset, columns, group_by, colors, show_outliers, title_prefix, width, height
39
+ ):
40
+ """Create grouped box plots."""
41
+ fig = go.Figure()
42
+ groups = dataset.df[group_by].dropna().unique()
43
+
44
+ for col_idx, column in enumerate(columns):
45
+ for group_idx, group_value in enumerate(groups):
46
+ data_subset = dataset.df[dataset.df[group_by] == group_value][
47
+ column
48
+ ].dropna()
49
+
50
+ if len(data_subset) > 0:
51
+ color = colors[group_idx % len(colors)]
52
+ fig.add_trace(
53
+ go.Box(
54
+ y=data_subset,
55
+ name=f"{group_value}",
56
+ marker_color=color,
57
+ boxpoints="outliers" if show_outliers else False,
58
+ jitter=0.3,
59
+ pointpos=-1.8,
60
+ legendgroup=f"{group_value}",
61
+ showlegend=(col_idx == 0),
62
+ offsetgroup=group_idx,
63
+ x=[column] * len(data_subset),
64
+ )
65
+ )
66
+
67
+ fig.update_layout(
68
+ title=f"{title_prefix} Features by {group_by}",
69
+ xaxis_title="Features",
70
+ yaxis_title="Values",
71
+ boxmode="group",
72
+ width=width,
73
+ height=height,
74
+ template="plotly_white",
75
+ )
76
+ return fig
77
+
78
+
79
+ def _create_single_boxplot(
80
+ dataset, column, colors, show_outliers, title_prefix, width, height
81
+ ):
82
+ """Create single column box plot."""
83
+ data = dataset.df[column].dropna()
84
+ if len(data) == 0:
85
+ raise SkipTestError(f"No data available for column {column}")
86
+
87
+ fig = go.Figure()
88
+ fig.add_trace(
89
+ go.Box(
90
+ y=data,
91
+ name=column,
92
+ marker_color=colors[0],
93
+ boxpoints="outliers" if show_outliers else False,
94
+ jitter=0.3,
95
+ pointpos=-1.8,
96
+ )
97
+ )
98
+
99
+ fig.update_layout(
100
+ title=f"{title_prefix} {column}",
101
+ yaxis_title=column,
102
+ width=width,
103
+ height=height,
104
+ template="plotly_white",
105
+ showlegend=False,
106
+ )
107
+ return fig
108
+
109
+
110
+ def _create_multiple_boxplots(
111
+ dataset, columns, colors, show_outliers, title_prefix, width, height
112
+ ):
113
+ """Create multiple column box plots in subplot layout."""
114
+ n_cols = min(3, len(columns))
115
+ n_rows = (len(columns) + n_cols - 1) // n_cols
116
+
117
+ subplot_titles = [f"{title_prefix} {col}" for col in columns]
118
+ fig = make_subplots(
119
+ rows=n_rows,
120
+ cols=n_cols,
121
+ subplot_titles=subplot_titles,
122
+ vertical_spacing=0.1,
123
+ horizontal_spacing=0.1,
124
+ )
125
+
126
+ for idx, column in enumerate(columns):
127
+ row = (idx // n_cols) + 1
128
+ col = (idx % n_cols) + 1
129
+ data = dataset.df[column].dropna()
130
+
131
+ if len(data) > 0:
132
+ color = colors[idx % len(colors)]
133
+ fig.add_trace(
134
+ go.Box(
135
+ y=data,
136
+ name=column,
137
+ marker_color=color,
138
+ boxpoints="outliers" if show_outliers else False,
139
+ jitter=0.3,
140
+ pointpos=-1.8,
141
+ showlegend=False,
142
+ ),
143
+ row=row,
144
+ col=col,
145
+ )
146
+ fig.update_yaxes(title_text=column, row=row, col=col)
147
+ else:
148
+ fig.add_annotation(
149
+ text=f"No data available<br>for {column}",
150
+ x=0.5,
151
+ y=0.5,
152
+ xref=f"x{idx+1} domain" if idx > 0 else "x domain",
153
+ yref=f"y{idx+1} domain" if idx > 0 else "y domain",
154
+ showarrow=False,
155
+ row=row,
156
+ col=col,
157
+ )
158
+
159
+ fig.update_layout(
160
+ title="Dataset Feature Distributions",
161
+ width=width,
162
+ height=height,
163
+ template="plotly_white",
164
+ showlegend=False,
165
+ )
166
+ return fig
167
+
168
+
169
+ @tags("tabular_data", "visualization", "data_quality")
170
+ @tasks("classification", "regression", "clustering")
171
+ def BoxPlot(
172
+ dataset: VMDataset,
173
+ columns: Optional[List[str]] = None,
174
+ group_by: Optional[str] = None,
175
+ width: int = 1200,
176
+ height: int = 600,
177
+ colors: Optional[List[str]] = None,
178
+ show_outliers: bool = True,
179
+ title_prefix: str = "Box Plot of",
180
+ ) -> go.Figure:
181
+ """
182
+ Generates customizable box plots for numerical features in a dataset with optional grouping using Plotly.
183
+
184
+ ### Purpose
185
+
186
+ This test provides a flexible way to visualize the distribution of numerical features
187
+ through interactive box plots, with optional grouping by categorical variables. Box plots are
188
+ effective for identifying outliers, comparing distributions across groups, and
189
+ understanding the spread and central tendency of the data.
190
+
191
+ ### Test Mechanism
192
+
193
+ The test creates interactive box plots for specified numerical columns (or all numerical columns
194
+ if none specified). It supports various customization options including:
195
+ - Grouping by categorical variables
196
+ - Customizable colors and styling
197
+ - Outlier display options
198
+ - Interactive hover information
199
+ - Zoom and pan capabilities
200
+
201
+ ### Signs of High Risk
202
+
203
+ - Presence of many outliers indicating data quality issues
204
+ - Highly skewed distributions
205
+ - Large differences in variance across groups
206
+ - Unexpected patterns in grouped data
207
+
208
+ ### Strengths
209
+
210
+ - Clear visualization of distribution statistics (median, quartiles, outliers)
211
+ - Interactive Plotly plots with hover information and zoom capabilities
212
+ - Effective for comparing distributions across groups
213
+ - Handles missing values appropriately
214
+ - Highly customizable appearance
215
+
216
+ ### Limitations
217
+
218
+ - Limited to numerical features only
219
+ - May not be suitable for continuous variables with many unique values
220
+ - Visual interpretation may be subjective
221
+ - Less effective with very large datasets
222
+ """
223
+ # Validate inputs
224
+ columns = _validate_inputs(dataset, columns, group_by)
225
+
226
+ # Set default colors
227
+ if colors is None:
228
+ colors = [
229
+ "steelblue",
230
+ "orange",
231
+ "green",
232
+ "red",
233
+ "purple",
234
+ "brown",
235
+ "pink",
236
+ "gray",
237
+ "olive",
238
+ "cyan",
239
+ ]
240
+
241
+ # Create appropriate plot type
242
+ if group_by is not None:
243
+ return _create_grouped_boxplot(
244
+ dataset,
245
+ columns,
246
+ group_by,
247
+ colors,
248
+ show_outliers,
249
+ title_prefix,
250
+ width,
251
+ height,
252
+ )
253
+ elif len(columns) == 1:
254
+ return _create_single_boxplot(
255
+ dataset, columns[0], colors, show_outliers, title_prefix, width, height
256
+ )
257
+ else:
258
+ return _create_multiple_boxplots(
259
+ dataset, columns, colors, show_outliers, title_prefix, width, height
260
+ )