validmind 2.8.10__tar.gz → 2.8.20__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 (330) hide show
  1. {validmind-2.8.10 → validmind-2.8.20}/PKG-INFO +4 -5
  2. {validmind-2.8.10 → validmind-2.8.20}/README.pypi.md +1 -1
  3. {validmind-2.8.10 → validmind-2.8.20}/pyproject.toml +6 -4
  4. {validmind-2.8.10 → validmind-2.8.20}/validmind/__init__.py +6 -5
  5. validmind-2.8.20/validmind/__version__.py +1 -0
  6. {validmind-2.8.10 → validmind-2.8.20}/validmind/ai/test_descriptions.py +17 -11
  7. {validmind-2.8.10 → validmind-2.8.20}/validmind/ai/utils.py +2 -2
  8. {validmind-2.8.10 → validmind-2.8.20}/validmind/api_client.py +75 -32
  9. {validmind-2.8.10 → validmind-2.8.20}/validmind/client.py +108 -100
  10. {validmind-2.8.10 → validmind-2.8.20}/validmind/client_config.py +3 -3
  11. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/classification/__init__.py +7 -3
  12. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/credit_risk/lending_club.py +28 -16
  13. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/nlp/cnn_dailymail.py +10 -4
  14. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/__init__.py +22 -5
  15. {validmind-2.8.10 → validmind-2.8.20}/validmind/errors.py +17 -7
  16. {validmind-2.8.10 → validmind-2.8.20}/validmind/input_registry.py +1 -1
  17. {validmind-2.8.10 → validmind-2.8.20}/validmind/logging.py +44 -35
  18. {validmind-2.8.10 → validmind-2.8.20}/validmind/models/foundation.py +2 -2
  19. {validmind-2.8.10 → validmind-2.8.20}/validmind/models/function.py +10 -3
  20. {validmind-2.8.10 → validmind-2.8.20}/validmind/template.py +30 -22
  21. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/__init__.py +2 -2
  22. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/_store.py +13 -4
  23. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/comparison.py +65 -33
  24. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ACFandPACFPlot.py +4 -1
  25. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/AutoMA.py +1 -1
  26. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/BivariateScatterPlots.py +5 -1
  27. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/BoxPierce.py +3 -1
  28. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ClassImbalance.py +4 -2
  29. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/DatasetDescription.py +3 -24
  30. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/DescriptiveStatistics.py +1 -1
  31. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/DickeyFullerGLS.py +1 -1
  32. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +1 -1
  33. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/HighCardinality.py +5 -1
  34. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/HighPearsonCorrelation.py +1 -1
  35. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/IQROutliersBarPlot.py +5 -3
  36. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/IQROutliersTable.py +5 -2
  37. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/IsolationForestOutliers.py +5 -4
  38. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/JarqueBera.py +2 -2
  39. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/LJungBox.py +2 -2
  40. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/LaggedCorrelationHeatmap.py +1 -1
  41. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/MissingValues.py +14 -10
  42. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/MissingValuesBarPlot.py +3 -1
  43. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/MutualInformation.py +2 -1
  44. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/PearsonCorrelationMatrix.py +1 -1
  45. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ProtectedClassesCombination.py +2 -0
  46. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ProtectedClassesDescription.py +2 -2
  47. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ProtectedClassesDisparity.py +9 -5
  48. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +10 -2
  49. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/RollingStatsPlot.py +2 -1
  50. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ScoreBandDefaultRates.py +4 -2
  51. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/SeasonalDecompose.py +1 -1
  52. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ShapiroWilk.py +2 -2
  53. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/Skewness.py +7 -6
  54. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/SpreadPlot.py +1 -1
  55. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TabularCategoricalBarPlots.py +1 -1
  56. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TabularDateTimeHistograms.py +1 -1
  57. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TargetRateBarPlots.py +4 -1
  58. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TimeSeriesFrequency.py +1 -1
  59. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TimeSeriesOutliers.py +7 -2
  60. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/WOEBinPlots.py +1 -1
  61. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/WOEBinTable.py +1 -1
  62. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ZivotAndrewsArch.py +5 -2
  63. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/CommonWords.py +1 -1
  64. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/Hashtags.py +1 -1
  65. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/LanguageDetection.py +1 -1
  66. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/Mentions.py +1 -1
  67. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +5 -1
  68. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/Punctuations.py +1 -1
  69. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/Sentiment.py +3 -1
  70. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/TextDescription.py +1 -1
  71. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/Toxicity.py +1 -1
  72. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/decorator.py +14 -11
  73. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/load.py +38 -24
  74. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/BertScore.py +7 -1
  75. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/BleuScore.py +7 -1
  76. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ClusterSizeDistribution.py +3 -1
  77. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ContextualRecall.py +9 -1
  78. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/FeaturesAUC.py +1 -1
  79. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/MeteorScore.py +7 -1
  80. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ModelPredictionResiduals.py +5 -1
  81. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/RegardScore.py +6 -1
  82. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/RegressionResidualsPlot.py +10 -1
  83. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/RougeScore.py +3 -1
  84. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +2 -0
  85. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +10 -2
  86. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +6 -2
  87. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/TokenDisparity.py +5 -1
  88. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ToxicityScore.py +2 -0
  89. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/ClusterDistribution.py +1 -1
  90. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +5 -1
  91. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +5 -1
  92. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +5 -1
  93. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +2 -0
  94. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +5 -1
  95. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +6 -2
  96. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +3 -1
  97. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +4 -1
  98. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +5 -1
  99. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +5 -1
  100. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +5 -1
  101. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +5 -1
  102. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +6 -1
  103. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/AnswerCorrectness.py +5 -3
  104. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/AspectCritic.py +4 -1
  105. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/ContextEntityRecall.py +5 -3
  106. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/ContextPrecision.py +5 -3
  107. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +5 -3
  108. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/ContextRecall.py +5 -3
  109. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/Faithfulness.py +5 -3
  110. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/NoiseSensitivity.py +1 -1
  111. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/ResponseRelevancy.py +5 -3
  112. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/SemanticSimilarity.py +5 -3
  113. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +9 -9
  114. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +9 -9
  115. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/CalibrationCurve.py +5 -2
  116. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +28 -5
  117. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +5 -1
  118. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +24 -14
  119. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/CompletenessScore.py +8 -9
  120. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py +22 -3
  121. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/FeatureImportance.py +6 -2
  122. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +12 -9
  123. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/HomogeneityScore.py +14 -9
  124. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/HyperParametersTuning.py +4 -2
  125. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +6 -1
  126. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/MinimumAccuracy.py +12 -7
  127. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/MinimumF1Score.py +12 -7
  128. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +21 -6
  129. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +11 -3
  130. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +5 -1
  131. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +5 -1
  132. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +6 -1
  133. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/ROCCurve.py +3 -1
  134. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/RegressionErrors.py +6 -2
  135. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/RegressionPerformance.py +13 -8
  136. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/RegressionR2Square.py +8 -5
  137. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +5 -1
  138. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +34 -26
  139. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +10 -2
  140. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/SilhouettePlot.py +5 -1
  141. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/VMeasure.py +12 -9
  142. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +15 -10
  143. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +5 -1
  144. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +6 -1
  145. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/GINITable.py +8 -1
  146. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +2 -2
  147. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +6 -2
  148. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +8 -2
  149. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +3 -1
  150. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +7 -2
  151. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +2 -0
  152. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +2 -0
  153. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +4 -2
  154. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +3 -1
  155. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +11 -1
  156. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +10 -2
  157. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +8 -1
  158. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +18 -2
  159. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/FeatureDrift.py +9 -2
  160. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +8 -2
  161. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/PredictionCorrelation.py +13 -2
  162. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +13 -2
  163. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/ROCCurveDrift.py +16 -2
  164. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +11 -2
  165. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +13 -2
  166. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/output.py +66 -11
  167. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/prompt_validation/Clarity.py +1 -1
  168. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/prompt_validation/NegativeInstruction.py +1 -1
  169. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/prompt_validation/Robustness.py +6 -1
  170. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/prompt_validation/Specificity.py +1 -1
  171. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/run.py +28 -14
  172. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/test_providers.py +28 -35
  173. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/utils.py +17 -4
  174. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/__init__.py +1 -1
  175. {validmind-2.8.10 → validmind-2.8.20}/validmind/utils.py +295 -31
  176. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/dataset/dataset.py +19 -16
  177. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/dataset/utils.py +5 -3
  178. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/figure.py +6 -6
  179. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/input.py +6 -5
  180. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/model.py +5 -5
  181. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/result/result.py +122 -43
  182. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/result/utils.py +9 -28
  183. validmind-2.8.20/validmind/vm_models/test_suite/__init__.py +5 -0
  184. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/test_suite/runner.py +5 -5
  185. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/test_suite/summary.py +20 -2
  186. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/test_suite/test.py +6 -6
  187. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/test_suite/test_suite.py +10 -10
  188. validmind-2.8.10/validmind/__version__.py +0 -1
  189. {validmind-2.8.10 → validmind-2.8.20}/LICENSE +0 -0
  190. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/__init__.py +0 -0
  191. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/classification/customer_churn.py +0 -0
  192. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/classification/datasets/bank_customer_churn.csv +0 -0
  193. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/classification/datasets/taiwan_credit.csv +0 -0
  194. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/classification/taiwan_credit.py +0 -0
  195. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/cluster/digits.py +0 -0
  196. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/credit_risk/__init__.py +0 -0
  197. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/credit_risk/datasets/lending_club_biased.csv.gz +0 -0
  198. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/credit_risk/datasets/lending_club_loan_data_2007_2014_clean.csv.gz +0 -0
  199. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/credit_risk/lending_club_bias.py +0 -0
  200. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/llm/rag/__init__.py +0 -0
  201. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_1.csv +0 -0
  202. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_2.csv +0 -0
  203. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_3.csv +0 -0
  204. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_4.csv +0 -0
  205. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_5.csv +0 -0
  206. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/llm/rag/rfp.py +0 -0
  207. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/nlp/__init__.py +0 -0
  208. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/nlp/datasets/Covid_19.csv +0 -0
  209. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/nlp/datasets/cnn_dailymail_100_with_predictions.csv +0 -0
  210. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/nlp/datasets/cnn_dailymail_500_with_predictions.csv +0 -0
  211. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/nlp/datasets/sentiments_with_predictions.csv +0 -0
  212. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/nlp/twitter_covid_19.py +0 -0
  213. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/california_housing.py +0 -0
  214. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/CPIAUCSL.csv +0 -0
  215. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/CSUSHPISA.csv +0 -0
  216. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/DRSFRMACBS.csv +0 -0
  217. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/FEDFUNDS.csv +0 -0
  218. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/GDP.csv +0 -0
  219. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/GDPC1.csv +0 -0
  220. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/GS10.csv +0 -0
  221. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/GS3.csv +0 -0
  222. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/GS5.csv +0 -0
  223. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/MORTGAGE30US.csv +0 -0
  224. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred/UNRATE.csv +0 -0
  225. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred_loan_rates.csv +0 -0
  226. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred_loan_rates_test_1.csv +0 -0
  227. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred_loan_rates_test_2.csv +0 -0
  228. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred_loan_rates_test_3.csv +0 -0
  229. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred_loan_rates_test_4.csv +0 -0
  230. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/fred_loan_rates_test_5.csv +0 -0
  231. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/datasets/leanding_club_loan_rates.csv +0 -0
  232. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/fred.py +0 -0
  233. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/fred_timeseries.py +0 -0
  234. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/lending_club.py +0 -0
  235. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/models/fred_loan_rates_model_1.pkl +0 -0
  236. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/models/fred_loan_rates_model_2.pkl +0 -0
  237. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/models/fred_loan_rates_model_3.pkl +0 -0
  238. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/models/fred_loan_rates_model_4.pkl +0 -0
  239. {validmind-2.8.10 → validmind-2.8.20}/validmind/datasets/regression/models/fred_loan_rates_model_5.pkl +0 -0
  240. {validmind-2.8.10 → validmind-2.8.20}/validmind/html_templates/__init__.py +0 -0
  241. {validmind-2.8.10 → validmind-2.8.20}/validmind/html_templates/content_blocks.py +0 -0
  242. {validmind-2.8.10 → validmind-2.8.20}/validmind/models/__init__.py +0 -0
  243. {validmind-2.8.10 → validmind-2.8.20}/validmind/models/huggingface.py +0 -0
  244. {validmind-2.8.10 → validmind-2.8.20}/validmind/models/metadata.py +0 -0
  245. {validmind-2.8.10 → validmind-2.8.20}/validmind/models/pipeline.py +0 -0
  246. {validmind-2.8.10 → validmind-2.8.20}/validmind/models/pytorch.py +0 -0
  247. {validmind-2.8.10 → validmind-2.8.20}/validmind/models/r_model.py +0 -0
  248. {validmind-2.8.10 → validmind-2.8.20}/validmind/models/sklearn.py +0 -0
  249. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/classifier.py +0 -0
  250. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/cluster.py +0 -0
  251. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/embeddings.py +0 -0
  252. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/llm.py +0 -0
  253. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/nlp.py +0 -0
  254. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/parameters_optimization.py +0 -0
  255. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/regression.py +0 -0
  256. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/statsmodels_timeseries.py +0 -0
  257. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/summarization.py +0 -0
  258. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/tabular_datasets.py +0 -0
  259. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/text_data.py +0 -0
  260. {validmind-2.8.10 → validmind-2.8.20}/validmind/test_suites/time_series.py +0 -0
  261. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/__init__.py +0 -0
  262. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/__types__.py +0 -0
  263. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ADF.py +0 -0
  264. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/AutoAR.py +0 -0
  265. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/AutoStationarity.py +0 -0
  266. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ChiSquaredFeaturesTable.py +0 -0
  267. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/DatasetSplit.py +0 -0
  268. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/Duplicates.py +0 -0
  269. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/EngleGrangerCoint.py +0 -0
  270. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/KPSS.py +0 -0
  271. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/PhillipsPerronArch.py +0 -0
  272. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/RunsTest.py +0 -0
  273. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/ScatterPlot.py +0 -0
  274. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TabularDescriptionTables.py +0 -0
  275. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TabularNumericalHistograms.py +0 -0
  276. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TimeSeriesDescription.py +0 -0
  277. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.py +0 -0
  278. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TimeSeriesHistogram.py +0 -0
  279. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TimeSeriesLinePlot.py +0 -0
  280. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TimeSeriesMissingValues.py +0 -0
  281. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/TooManyZeroValues.py +0 -0
  282. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/UniqueRows.py +0 -0
  283. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/__init__.py +0 -0
  284. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/StopWords.py +0 -0
  285. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/data_validation/nlp/__init__.py +0 -0
  286. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ModelMetadata.py +0 -0
  287. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/__init__.py +0 -0
  288. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/embeddings/utils.py +0 -0
  289. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/ragas/utils.py +0 -0
  290. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/ClassifierPerformance.py +0 -0
  291. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/ModelParameters.py +0 -0
  292. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +0 -0
  293. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py +0 -0
  294. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py +0 -0
  295. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +0 -0
  296. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/sklearn/__init__.py +0 -0
  297. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/AutoARIMA.py +0 -0
  298. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/Lilliefors.py +0 -0
  299. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +0 -0
  300. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/__init__.py +0 -0
  301. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/model_validation/statsmodels/statsutils.py +0 -0
  302. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py +0 -0
  303. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py +0 -0
  304. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py +0 -0
  305. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py +0 -0
  306. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/prompt_validation/Bias.py +0 -0
  307. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/prompt_validation/Conciseness.py +0 -0
  308. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/prompt_validation/Delimitation.py +0 -0
  309. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/prompt_validation/__init__.py +0 -0
  310. {validmind-2.8.10 → validmind-2.8.20}/validmind/tests/prompt_validation/ai_powered_test.py +0 -0
  311. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/classification/Accuracy.py +0 -0
  312. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/classification/F1.py +0 -0
  313. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/classification/Precision.py +0 -0
  314. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/classification/ROC_AUC.py +0 -0
  315. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/classification/Recall.py +0 -0
  316. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/AdjustedRSquaredScore.py +0 -0
  317. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/GiniCoefficient.py +0 -0
  318. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/HuberLoss.py +0 -0
  319. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +0 -0
  320. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/MeanAbsoluteError.py +0 -0
  321. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +0 -0
  322. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/MeanBiasDeviation.py +0 -0
  323. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/MeanSquaredError.py +0 -0
  324. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/QuantileLoss.py +0 -0
  325. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/RSquaredScore.py +0 -0
  326. {validmind-2.8.10 → validmind-2.8.20}/validmind/unit_metrics/regression/RootMeanSquaredError.py +0 -0
  327. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/__init__.py +0 -0
  328. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/dataset/__init__.py +0 -0
  329. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/result/__init__.py +0 -0
  330. {validmind-2.8.10 → validmind-2.8.20}/validmind/vm_models/result/result.jinja +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: validmind
3
- Version: 2.8.10
3
+ Version: 2.8.20
4
4
  Summary: ValidMind Library
5
5
  License: Commercial License
6
6
  Author: Andres Rodriguez
@@ -35,12 +35,12 @@ Requires-Dist: numba (<0.59.0)
35
35
  Requires-Dist: numpy
36
36
  Requires-Dist: openai (>=1)
37
37
  Requires-Dist: pandas (>=1.1,<=2.0.3)
38
- Requires-Dist: plotly
38
+ Requires-Dist: plotly (<6.0.0)
39
39
  Requires-Dist: plotly-express
40
40
  Requires-Dist: polars
41
41
  Requires-Dist: pycocoevalcap (>=1.2,<2.0) ; extra == "all" or extra == "llm"
42
42
  Requires-Dist: python-dotenv
43
- Requires-Dist: ragas (>=0.2.3) ; extra == "all" or extra == "llm"
43
+ Requires-Dist: ragas (>=0.2.3,<=0.2.7) ; extra == "all" or extra == "llm"
44
44
  Requires-Dist: rouge (>=1)
45
45
  Requires-Dist: scikit-learn (<1.6.0)
46
46
  Requires-Dist: scipy
@@ -57,7 +57,6 @@ Requires-Dist: torch (>=1.10.0) ; extra == "all" or extra == "llm" or extra == "
57
57
  Requires-Dist: tqdm
58
58
  Requires-Dist: transformers (>=4.32.0,<5.0.0) ; extra == "all" or extra == "huggingface" or extra == "llm"
59
59
  Requires-Dist: xgboost (>=1.5.2,<3)
60
- Requires-Dist: ydata-profiling
61
60
  Requires-Dist: yfinance (>=0.2.48,<0.3.0)
62
61
  Description-Content-Type: text/markdown
63
62
 
@@ -84,7 +83,7 @@ ValidMind helps developers, data scientists and risk and compliance stakeholders
84
83
  >
85
84
  > Signing up is FREE — **[Register with ValidMind](https://docs.validmind.ai/guide/configuration/register-with-validmind.html)**
86
85
 
87
- That's right — you can run tests and log documentation even if you don't have a model available, so go ahead and [**Get started with the ValidMind Library**](https://docs.validmind.ai/developer/get-started-validmind-library.html)!
86
+ That's right — you can run tests and log documentation even if you don't have a model available, so go ahead and get started with the [**ValidMind Library**](https://docs.validmind.ai/developer/validmind-library.html)!
88
87
 
89
88
  ### How do I do more with the ValidMind Library?
90
89
 
@@ -21,7 +21,7 @@ ValidMind helps developers, data scientists and risk and compliance stakeholders
21
21
  >
22
22
  > Signing up is FREE — **[Register with ValidMind](https://docs.validmind.ai/guide/configuration/register-with-validmind.html)**
23
23
 
24
- That's right — you can run tests and log documentation even if you don't have a model available, so go ahead and [**Get started with the ValidMind Library**](https://docs.validmind.ai/developer/get-started-validmind-library.html)!
24
+ That's right — you can run tests and log documentation even if you don't have a model available, so go ahead and get started with the [**ValidMind Library**](https://docs.validmind.ai/developer/validmind-library.html)!
25
25
 
26
26
  ### How do I do more with the ValidMind Library?
27
27
 
@@ -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.10"
13
+ version = "2.8.20"
14
14
 
15
15
  [tool.poetry.dependencies]
16
16
  aiohttp = {extras = ["speedups"], version = "*"}
@@ -33,13 +33,13 @@ numba = "<0.59.0" # TODO: https://github.com/validmind/validmind-library/pull/28
33
33
  numpy = "*"
34
34
  openai = ">=1"
35
35
  pandas = ">=1.1,<=2.0.3"
36
- plotly = "*"
36
+ plotly = "<6.0.0"
37
37
  plotly-express = "*"
38
38
  polars = "*"
39
39
  pycocoevalcap = {version = "^1.2", optional = true}
40
40
  python = ">=3.8.1,<3.12"
41
41
  python-dotenv = "*"
42
- ragas = {version = ">=0.2.3", optional = true}
42
+ ragas = {version = ">=0.2.3,<=0.2.7", optional = true}
43
43
  rouge = ">=1"
44
44
  scikit-learn = "*,<1.6.0"
45
45
  scipy = "*"
@@ -56,17 +56,19 @@ torch = {version = ">=1.10.0", optional = true}
56
56
  tqdm = "*"
57
57
  transformers = {version = "^4.32.0", optional = true}
58
58
  xgboost = ">=1.5.2,<3"
59
- ydata-profiling = "*"
60
59
  yfinance = "^0.2.48"
61
60
 
62
61
  [tool.poetry.group.dev.dependencies]
63
62
  black = "^22.1.0"
64
63
  click = "*"
65
64
  cython = "^0.29.34"
65
+ docstring_parser = "*"
66
66
  flake8 = "^4.0.1"
67
+ griffe = "*"
67
68
  ipykernel = "^6.22.0"
68
69
  isort = "^5.12.0"
69
70
  jupyter = "^1.0.0"
71
+ mdformat = "*"
70
72
  papermill = "^2.4.0"
71
73
  pdoc = "^14.4.0"
72
74
  pre-commit = "^3.3.3"
@@ -43,7 +43,7 @@ warnings.simplefilter("ignore", category=NumbaDeprecationWarning)
43
43
  warnings.simplefilter("ignore", category=NumbaPendingDeprecationWarning)
44
44
 
45
45
  from .__version__ import __version__ # noqa: E402
46
- from .api_client import init, log_metric, reload
46
+ from .api_client import init, log_metric, log_text, reload
47
47
  from .client import ( # noqa: E402
48
48
  get_test_suite,
49
49
  init_dataset,
@@ -99,19 +99,19 @@ __all__ = [ # noqa
99
99
  "__version__",
100
100
  # main library API
101
101
  "init",
102
- "reload",
103
102
  "init_dataset",
104
103
  "init_model",
105
104
  "init_r_model",
105
+ "get_test_suite",
106
+ "log_metric",
106
107
  "preview_template",
108
+ "print_env",
109
+ "reload",
107
110
  "run_documentation_tests",
108
111
  # log metric function (for direct/bulk/retroactive logging of metrics)
109
- "log_metric",
110
112
  # test suite functions (less common)
111
- "get_test_suite",
112
113
  "run_test_suite",
113
114
  # helper functions (for troubleshooting)
114
- "print_env",
115
115
  # decorators (for building tests
116
116
  "tags",
117
117
  "tasks",
@@ -125,4 +125,5 @@ __all__ = [ # noqa
125
125
  "tests",
126
126
  "unit_metrics",
127
127
  "test_suites",
128
+ "log_text",
128
129
  ]
@@ -0,0 +1 @@
1
+ __version__ = "2.8.20"
@@ -37,8 +37,10 @@ def _get_llm_global_context():
37
37
  return context if context_enabled and context else None
38
38
 
39
39
 
40
- def _truncate_summary(summary: str, test_id: str, max_tokens: int = 100_000):
41
- if len(summary) < max_tokens:
40
+ def _truncate_summary(
41
+ summary: Union[str, None], test_id: str, max_tokens: int = 100_000
42
+ ):
43
+ if summary is None or len(summary) < max_tokens:
42
44
  # since string itself is less than max_tokens, definitely small enough
43
45
  return summary
44
46
 
@@ -68,7 +70,7 @@ def generate_description(
68
70
  figures: List[Figure] = None,
69
71
  title: Optional[str] = None,
70
72
  ):
71
- """Generate the description for the test results"""
73
+ """Generate the description for the test results."""
72
74
  from validmind.api_client import generate_test_result_description
73
75
 
74
76
  if not tables and not figures and not metric:
@@ -136,6 +138,10 @@ def background_generate_description(
136
138
  logger.warning(
137
139
  f"Test result {test_id} is too large to generate a description"
138
140
  )
141
+ elif "Too many images" in str(e):
142
+ logger.warning(
143
+ f"Test result {test_id} has too many figures to generate a description"
144
+ )
139
145
  else:
140
146
  logger.warning(f"Failed to generate description for {test_id}: {e}")
141
147
  logger.warning(f"Using default description for {test_id}")
@@ -154,7 +160,7 @@ def get_result_description(
154
160
  should_generate: bool = True,
155
161
  title: Optional[str] = None,
156
162
  ):
157
- """Get Metadata Dictionary for a Test or Metric Result
163
+ """Get the metadata dictionary for a test or metric result.
158
164
 
159
165
  Generates an LLM interpretation of the test results or uses the default
160
166
  description and returns a metadata object that can be logged with the test results.
@@ -168,15 +174,15 @@ def get_result_description(
168
174
  Note: Either the tables or figures must be provided to generate the description.
169
175
 
170
176
  Args:
171
- test_id (str): The test ID
172
- test_description (str): The default description for the test
173
- tables (Any): The test tables or results to interpret
174
- figures (List[Figure]): The figures to attach to the test suite result
175
- metric (Union[int, float]): Unit metrics attached to the test result
176
- should_generate (bool): Whether to generate the description or not (Default: True)
177
+ test_id (str): The test ID.
178
+ test_description (str): The default description for the test.
179
+ tables (Any): The test tables or results to interpret.
180
+ figures (List[Figure]): The figures to attach to the test suite result.
181
+ metric (Union[int, float]): Unit metrics attached to the test result.
182
+ should_generate (bool): Whether to generate the description or not. Defaults to True.
177
183
 
178
184
  Returns:
179
- str: The description to be logged with the test results
185
+ str: The description to be logged with the test results.
180
186
  """
181
187
  # Check the feature flag first, then the environment variable
182
188
  llm_descriptions_enabled = (
@@ -24,7 +24,7 @@ class DescriptionFuture:
24
24
  the tests can continue to be run in parallel while the description is
25
25
  retrieved asynchronously.
26
26
 
27
- The value will be retrieved later and if its not ready yet, it should
27
+ The value will be retrieved later and, if it is not ready yet, it should
28
28
  block until it is.
29
29
  """
30
30
 
@@ -42,7 +42,7 @@ class DescriptionFuture:
42
42
 
43
43
 
44
44
  def get_client_and_model():
45
- """Get model and client to use for generating interpretations
45
+ """Get model and client to use for generating interpretations.
46
46
 
47
47
  On first call, it will look in the environment for the API key endpoint, model etc.
48
48
  and store them in a global variable to avoid loading them up again.
@@ -18,11 +18,12 @@ from urllib.parse import urlencode, urljoin
18
18
  import aiohttp
19
19
  import requests
20
20
  from aiohttp import FormData
21
+ from ipywidgets import HTML, Accordion
21
22
 
22
23
  from .client_config import client_config
23
24
  from .errors import MissingAPICredentialsError, MissingModelIdError, raise_api_error
24
25
  from .logging import get_logger, init_sentry, send_single_error
25
- from .utils import NumpyEncoder, run_async
26
+ from .utils import NumpyEncoder, is_html, md_to_html, run_async
26
27
  from .vm_models import Figure
27
28
 
28
29
  logger = get_logger(__name__)
@@ -38,7 +39,7 @@ __api_session: Optional[aiohttp.ClientSession] = None
38
39
 
39
40
  @atexit.register
40
41
  def _close_session():
41
- """Closes the async client session at exit"""
42
+ """Closes the async client session at exit."""
42
43
  global __api_session
43
44
 
44
45
  if __api_session and not __api_session.closed:
@@ -78,7 +79,7 @@ def _get_api_headers() -> Dict[str, str]:
78
79
 
79
80
 
80
81
  def _get_session() -> aiohttp.ClientSession:
81
- """Initializes the async client session"""
82
+ """Initializes the async client session."""
82
83
  global __api_session
83
84
 
84
85
  if not __api_session or __api_session.closed:
@@ -156,7 +157,7 @@ async def _post(
156
157
 
157
158
 
158
159
  def _ping() -> Dict[str, Any]:
159
- """Validates that we can connect to the ValidMind API (does not use the async session)"""
160
+ """Validates that we can connect to the ValidMind API (does not use the async session)."""
160
161
  r = requests.get(
161
162
  url=_get_url("ping"),
162
163
  headers=_get_api_headers(),
@@ -243,7 +244,7 @@ def init(
243
244
 
244
245
 
245
246
  def reload():
246
- """Reconnect to the ValidMind API and reload the project configuration"""
247
+ """Reconnect to the ValidMind API and reload the project configuration."""
247
248
 
248
249
  try:
249
250
  _ping()
@@ -258,13 +259,13 @@ async def aget_metadata(content_id: str) -> Dict[str, Any]:
258
259
  """Gets a metadata object from ValidMind API.
259
260
 
260
261
  Args:
261
- content_id (str): Unique content identifier for the metadata
262
+ content_id (str): Unique content identifier for the metadata.
262
263
 
263
264
  Raises:
264
- Exception: If the API call fails
265
+ Exception: If the API call fails.
265
266
 
266
267
  Returns:
267
- dict: Metadata object
268
+ dict: Metadata object.
268
269
  """
269
270
  return await _get(f"get_metadata/{content_id}")
270
271
 
@@ -277,15 +278,15 @@ async def alog_metadata(
277
278
  """Logs free-form metadata to ValidMind API.
278
279
 
279
280
  Args:
280
- content_id (str): Unique content identifier for the metadata
281
+ content_id (str): Unique content identifier for the metadata.
281
282
  text (str, optional): Free-form text to assign to the metadata. Defaults to None.
282
283
  _json (dict, optional): Free-form key-value pairs to assign to the metadata. Defaults to None.
283
284
 
284
285
  Raises:
285
- Exception: If the API call fails
286
+ Exception: If the API call fails.
286
287
 
287
288
  Returns:
288
- dict: The response from the API
289
+ dict: The response from the API.
289
290
  """
290
291
  metadata_dict = {"content_id": content_id}
291
292
  if text is not None:
@@ -304,16 +305,16 @@ async def alog_metadata(
304
305
 
305
306
 
306
307
  async def alog_figure(figure: Figure) -> Dict[str, Any]:
307
- """Logs a figure
308
+ """Logs a figure.
308
309
 
309
310
  Args:
310
- figure (Figure): The Figure object wrapper
311
+ figure (Figure): The Figure object wrapper.
311
312
 
312
313
  Raises:
313
- Exception: If the API call fails
314
+ Exception: If the API call fails.
314
315
 
315
316
  Returns:
316
- dict: The response from the API
317
+ dict: The response from the API.
317
318
  """
318
319
  try:
319
320
  return await _post(
@@ -330,22 +331,24 @@ async def alog_test_result(
330
331
  result: Dict[str, Any],
331
332
  section_id: str = None,
332
333
  position: int = None,
334
+ unsafe: bool = False,
335
+ config: Dict[str, bool] = None,
333
336
  ) -> Dict[str, Any]:
334
- """Logs test results information
337
+ """Logs test results information.
335
338
 
336
339
  This method will be called automatically from any function running tests but
337
340
  can also be called directly if the user wants to run tests on their own.
338
341
 
339
342
  Args:
340
- result (dict): A dictionary representing the test result
341
- section_id (str, optional): The section ID add a test driven block to the documentation
342
- position (int): The position in the section to add the test driven block
343
+ result (dict): A dictionary representing the test result.
344
+ section_id (str, optional): The section ID add a test driven block to the documentation.
345
+ position (int): The position in the section to add the test driven block.
343
346
 
344
347
  Raises:
345
- Exception: If the API call fails
348
+ Exception: If the API call fails.
346
349
 
347
350
  Returns:
348
- dict: The response from the API
351
+ dict: The response from the API.
349
352
  """
350
353
  request_params = {}
351
354
  if section_id:
@@ -357,7 +360,7 @@ async def alog_test_result(
357
360
  "log_test_results",
358
361
  params=request_params,
359
362
  data=json.dumps(
360
- result,
363
+ {**result, "config": config},
361
364
  cls=NumpyEncoder,
362
365
  allow_nan=False,
363
366
  ),
@@ -405,6 +408,39 @@ def log_input(input_id: str, type: str, metadata: Dict[str, Any]) -> Dict[str, A
405
408
  return run_async(alog_input, input_id, type, metadata)
406
409
 
407
410
 
411
+ def log_text(
412
+ content_id: str, text: str, _json: Optional[Dict[str, Any]] = None
413
+ ) -> Dict[str, Any]:
414
+ """Logs free-form text to ValidMind API.
415
+
416
+ Args:
417
+ content_id (str): Unique content identifier for the text.
418
+ text (str): The text to log. Will be converted to HTML with MathML support.
419
+ _json (dict, optional): Additional metadata to associate with the text. Defaults to None.
420
+
421
+ Raises:
422
+ ValueError: If content_id or text are empty or not strings.
423
+ Exception: If the API call fails.
424
+
425
+ Returns:
426
+ ipywidgets.Accordion: An accordion widget containing the logged text as HTML.
427
+ """
428
+ if not content_id or not isinstance(content_id, str):
429
+ raise ValueError("`content_id` must be a non-empty string")
430
+ if not text or not isinstance(text, str):
431
+ raise ValueError("`text` must be a non-empty string")
432
+
433
+ if not is_html(text):
434
+ text = md_to_html(text, mathml=True)
435
+
436
+ log_text = run_async(alog_metadata, content_id, text, _json)
437
+
438
+ return Accordion(
439
+ children=[HTML(log_text["text"])],
440
+ titles=[f"Text Block: '{log_text['content_id']}'"],
441
+ )
442
+
443
+
408
444
  async def alog_metric(
409
445
  key: str,
410
446
  value: Union[int, float],
@@ -413,7 +449,7 @@ async def alog_metric(
413
449
  recorded_at: Optional[str] = None,
414
450
  thresholds: Optional[Dict[str, Any]] = None,
415
451
  ):
416
- """See log_metric for details"""
452
+ """See log_metric for details."""
417
453
  if not key or not isinstance(key, str):
418
454
  raise ValueError("`key` must be a non-empty string")
419
455
 
@@ -458,7 +494,7 @@ def log_metric(
458
494
  recorded_at: Optional[str] = None,
459
495
  thresholds: Optional[Dict[str, Any]] = None,
460
496
  ):
461
- """Logs a unit metric
497
+ """Logs a unit metric.
462
498
 
463
499
  Unit metrics are key-value pairs where the key is the metric name and the value is
464
500
  a scalar (int or float). These key-value pairs are associated with the currently
@@ -468,18 +504,25 @@ def log_metric(
468
504
 
469
505
  Args:
470
506
  key (str): The metric key
471
- value (float): The metric value
472
- inputs (list, optional): A list of input IDs that were used to compute the metric.
473
- params (dict, optional): Dictionary of parameters used to compute the metric.
474
- recorded_at (str, optional): The timestamp of the metric. Server will use
475
- current time if not provided.
476
- thresholds (dict, optional): Dictionary of thresholds for the metric.
507
+ value (Union[int, float]): The metric value
508
+ inputs (List[str], optional): List of input IDs
509
+ params (Dict[str, Any], optional): Parameters used to generate the metric
510
+ recorded_at (str, optional): Timestamp when the metric was recorded
511
+ thresholds (Dict[str, Any], optional): Thresholds for the metric
477
512
  """
478
- run_async(alog_metric, key, value, inputs, params, recorded_at, thresholds)
513
+ return run_async(
514
+ alog_metric,
515
+ key=key,
516
+ value=value,
517
+ inputs=inputs,
518
+ params=params,
519
+ recorded_at=recorded_at,
520
+ thresholds=thresholds,
521
+ )
479
522
 
480
523
 
481
524
  def get_ai_key() -> Dict[str, Any]:
482
- """Calls the api to get an api key for our LLM proxy"""
525
+ """Calls the API to get an API key for our LLM proxy."""
483
526
  r = requests.get(
484
527
  url=_get_url("ai/key"),
485
528
  headers=_get_api_headers(),