deepeval 3.5.2__tar.gz → 3.5.3__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 (468) hide show
  1. {deepeval-3.5.2 → deepeval-3.5.3}/PKG-INFO +1 -1
  2. deepeval-3.5.3/deepeval/_version.py +1 -0
  3. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/config/settings.py +94 -2
  4. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/config/utils.py +54 -1
  5. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/constants.py +27 -0
  6. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/pii_leakage/pii_leakage.py +1 -1
  7. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/embedding_models/azure_embedding_model.py +40 -9
  8. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/embedding_models/local_embedding_model.py +52 -9
  9. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/embedding_models/ollama_embedding_model.py +25 -7
  10. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/embedding_models/openai_embedding_model.py +47 -5
  11. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/amazon_bedrock_model.py +31 -4
  12. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/anthropic_model.py +39 -13
  13. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/azure_model.py +37 -38
  14. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/deepseek_model.py +36 -7
  15. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/gemini_model.py +10 -0
  16. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/grok_model.py +50 -3
  17. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/kimi_model.py +37 -7
  18. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/local_model.py +38 -12
  19. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/ollama_model.py +15 -3
  20. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/openai_model.py +37 -44
  21. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/mlllms/gemini_model.py +21 -3
  22. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/mlllms/ollama_model.py +38 -13
  23. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/mlllms/openai_model.py +18 -42
  24. deepeval-3.5.3/deepeval/models/retry_policy.py +764 -0
  25. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/tracing.py +87 -0
  26. {deepeval-3.5.2 → deepeval-3.5.3}/pyproject.toml +1 -1
  27. deepeval-3.5.2/deepeval/_version.py +0 -1
  28. deepeval-3.5.2/deepeval/models/retry_policy.py +0 -280
  29. {deepeval-3.5.2 → deepeval-3.5.3}/LICENSE.md +0 -0
  30. {deepeval-3.5.2 → deepeval-3.5.3}/README.md +0 -0
  31. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/__init__.py +0 -0
  32. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/annotation/__init__.py +0 -0
  33. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/annotation/annotation.py +0 -0
  34. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/annotation/api.py +0 -0
  35. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/__init__.py +0 -0
  36. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/arc/__init__.py +0 -0
  37. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/arc/arc.py +0 -0
  38. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/arc/mode.py +0 -0
  39. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/arc/template.py +0 -0
  40. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/base_benchmark.py +0 -0
  41. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/bbq/__init__.py +0 -0
  42. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/bbq/bbq.py +0 -0
  43. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/bbq/task.py +0 -0
  44. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/bbq/template.py +0 -0
  45. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/__init__.py +0 -0
  46. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/big_bench_hard.py +0 -0
  47. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/__init__.py +0 -0
  48. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/boolean_expressions.txt +0 -0
  49. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/causal_judgement.txt +0 -0
  50. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/date_understanding.txt +0 -0
  51. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/disambiguation_qa.txt +0 -0
  52. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/dyck_languages.txt +0 -0
  53. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/formal_fallacies.txt +0 -0
  54. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/geometric_shapes.txt +0 -0
  55. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/hyperbaton.txt +0 -0
  56. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/logical_deduction_five_objects.txt +0 -0
  57. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/logical_deduction_seven_objects.txt +0 -0
  58. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/logical_deduction_three_objects.txt +0 -0
  59. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/movie_recommendation.txt +0 -0
  60. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/multistep_arithmetic_two.txt +0 -0
  61. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/navigate.txt +0 -0
  62. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/object_counting.txt +0 -0
  63. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/penguins_in_a_table.txt +0 -0
  64. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/reasoning_about_colored_objects.txt +0 -0
  65. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/ruin_names.txt +0 -0
  66. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/salient_translation_error_detection.txt +0 -0
  67. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/snarks.txt +0 -0
  68. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/sports_understanding.txt +0 -0
  69. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/temporal_sequences.txt +0 -0
  70. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/tracking_shuffled_objects_five_objects.txt +0 -0
  71. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/tracking_shuffled_objects_seven_objects.txt +0 -0
  72. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/tracking_shuffled_objects_three_objects.txt +0 -0
  73. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/web_of_lies.txt +0 -0
  74. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/cot_prompts/word_sorting.txt +0 -0
  75. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/__init__.py +0 -0
  76. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/boolean_expressions.txt +0 -0
  77. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/causal_judgement.txt +0 -0
  78. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/date_understanding.txt +0 -0
  79. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/disambiguation_qa.txt +0 -0
  80. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/dyck_languages.txt +0 -0
  81. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/formal_fallacies.txt +0 -0
  82. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/geometric_shapes.txt +0 -0
  83. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/hyperbaton.txt +0 -0
  84. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/logical_deduction_five_objects.txt +0 -0
  85. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/logical_deduction_seven_objects.txt +0 -0
  86. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/logical_deduction_three_objects.txt +0 -0
  87. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/movie_recommendation.txt +0 -0
  88. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/multistep_arithmetic_two.txt +0 -0
  89. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/navigate.txt +0 -0
  90. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/object_counting.txt +0 -0
  91. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/penguins_in_a_table.txt +0 -0
  92. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/reasoning_about_colored_objects.txt +0 -0
  93. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/ruin_names.txt +0 -0
  94. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/salient_translation_error_detection.txt +0 -0
  95. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/snarks.txt +0 -0
  96. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/sports_understanding.txt +0 -0
  97. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/temporal_sequences.txt +0 -0
  98. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/tracking_shuffled_objects_five_objects.txt +0 -0
  99. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/tracking_shuffled_objects_seven_objects.txt +0 -0
  100. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/tracking_shuffled_objects_three_objects.txt +0 -0
  101. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/web_of_lies.txt +0 -0
  102. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/shot_prompts/word_sorting.txt +0 -0
  103. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/task.py +0 -0
  104. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/big_bench_hard/template.py +0 -0
  105. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/bool_q/__init__.py +0 -0
  106. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/bool_q/bool_q.py +0 -0
  107. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/bool_q/template.py +0 -0
  108. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/drop/__init__.py +0 -0
  109. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/drop/drop.py +0 -0
  110. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/drop/task.py +0 -0
  111. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/drop/template.py +0 -0
  112. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/equity_med_qa/__init__.py +0 -0
  113. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/equity_med_qa/equity_med_qa.py +0 -0
  114. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/equity_med_qa/task.py +0 -0
  115. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/equity_med_qa/template.py +0 -0
  116. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/gsm8k/__init__.py +0 -0
  117. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/gsm8k/gsm8k.py +0 -0
  118. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/gsm8k/template.py +0 -0
  119. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/hellaswag/__init__.py +0 -0
  120. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/hellaswag/hellaswag.py +0 -0
  121. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/hellaswag/task.py +0 -0
  122. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/hellaswag/template.py +0 -0
  123. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/human_eval/__init__.py +0 -0
  124. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/human_eval/human_eval.py +0 -0
  125. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/human_eval/task.py +0 -0
  126. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/human_eval/template.py +0 -0
  127. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/ifeval/__init__.py +0 -0
  128. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/ifeval/ifeval.py +0 -0
  129. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/ifeval/template.py +0 -0
  130. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/lambada/__init__.py +0 -0
  131. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/lambada/lambada.py +0 -0
  132. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/lambada/template.py +0 -0
  133. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/logi_qa/__init__.py +0 -0
  134. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/logi_qa/logi_qa.py +0 -0
  135. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/logi_qa/task.py +0 -0
  136. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/logi_qa/template.py +0 -0
  137. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/math_qa/__init__.py +0 -0
  138. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/math_qa/math_qa.py +0 -0
  139. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/math_qa/task.py +0 -0
  140. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/math_qa/template.py +0 -0
  141. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/mmlu/__init__.py +0 -0
  142. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/mmlu/mmlu.py +0 -0
  143. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/mmlu/task.py +0 -0
  144. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/mmlu/template.py +0 -0
  145. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/modes/__init__.py +0 -0
  146. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/results.py +0 -0
  147. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/schema.py +0 -0
  148. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/squad/__init__.py +0 -0
  149. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/squad/squad.py +0 -0
  150. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/squad/task.py +0 -0
  151. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/squad/template.py +0 -0
  152. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/tasks/__init__.py +0 -0
  153. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/truthful_qa/__init__.py +0 -0
  154. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/truthful_qa/mode.py +0 -0
  155. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/truthful_qa/task.py +0 -0
  156. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/truthful_qa/template.py +0 -0
  157. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/truthful_qa/truthful_qa.py +0 -0
  158. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/utils.py +0 -0
  159. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/winogrande/__init__.py +0 -0
  160. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/winogrande/template.py +0 -0
  161. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/benchmarks/winogrande/winogrande.py +0 -0
  162. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/cli/__init__.py +0 -0
  163. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/cli/dotenv_handler.py +0 -0
  164. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/cli/main.py +0 -0
  165. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/cli/server.py +0 -0
  166. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/cli/test.py +0 -0
  167. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/cli/types.py +0 -0
  168. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/cli/utils.py +0 -0
  169. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/confident/__init__.py +0 -0
  170. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/confident/api.py +0 -0
  171. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/confident/types.py +0 -0
  172. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/config/__init__.py +0 -0
  173. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/config/settings_manager.py +0 -0
  174. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/dataset/__init__.py +0 -0
  175. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/dataset/api.py +0 -0
  176. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/dataset/dataset.py +0 -0
  177. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/dataset/golden.py +0 -0
  178. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/dataset/test_run_tracer.py +0 -0
  179. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/dataset/types.py +0 -0
  180. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/dataset/utils.py +0 -0
  181. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/errors.py +0 -0
  182. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/evaluate/__init__.py +0 -0
  183. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/evaluate/api.py +0 -0
  184. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/evaluate/compare.py +0 -0
  185. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/evaluate/configs.py +0 -0
  186. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/evaluate/evaluate.py +0 -0
  187. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/evaluate/execute.py +0 -0
  188. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/evaluate/types.py +0 -0
  189. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/evaluate/utils.py +0 -0
  190. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/__init__.py +0 -0
  191. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/crewai/__init__.py +0 -0
  192. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/crewai/agent.py +0 -0
  193. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/crewai/handler.py +0 -0
  194. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/crewai/patch.py +0 -0
  195. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/hugging_face/__init__.py +0 -0
  196. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/hugging_face/callback.py +0 -0
  197. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/hugging_face/rich_manager.py +0 -0
  198. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/hugging_face/tests/test_callbacks.py +0 -0
  199. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/hugging_face/utils.py +0 -0
  200. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/langchain/__init__.py +0 -0
  201. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/langchain/callback.py +0 -0
  202. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/langchain/patch.py +0 -0
  203. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/langchain/utils.py +0 -0
  204. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/llama_index/__init__.py +0 -0
  205. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/llama_index/agent/patched.py +0 -0
  206. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/llama_index/handler.py +0 -0
  207. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/llama_index/utils.py +0 -0
  208. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/pydantic_ai/__init__.py +0 -0
  209. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/pydantic_ai/otel.py +0 -0
  210. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/pydantic_ai/patcher.py +0 -0
  211. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/integrations/pydantic_ai/utils.py +0 -0
  212. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/key_handler.py +0 -0
  213. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/__init__.py +0 -0
  214. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/answer_relevancy/__init__.py +0 -0
  215. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/answer_relevancy/answer_relevancy.py +0 -0
  216. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/answer_relevancy/schema.py +0 -0
  217. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/answer_relevancy/template.py +0 -0
  218. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/arena_g_eval/__init__.py +0 -0
  219. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/arena_g_eval/arena_g_eval.py +0 -0
  220. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/arena_g_eval/schema.py +0 -0
  221. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/arena_g_eval/template.py +0 -0
  222. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/arena_g_eval/utils.py +0 -0
  223. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/argument_correctness/__init__.py +0 -0
  224. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/argument_correctness/argument_correctness.py +0 -0
  225. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/argument_correctness/schema.py +0 -0
  226. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/argument_correctness/template.py +0 -0
  227. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/base_metric.py +0 -0
  228. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/bias/__init__.py +0 -0
  229. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/bias/bias.py +0 -0
  230. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/bias/schema.py +0 -0
  231. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/bias/template.py +0 -0
  232. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_precision/__init__.py +0 -0
  233. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_precision/contextual_precision.py +0 -0
  234. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_precision/schema.py +0 -0
  235. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_precision/template.py +0 -0
  236. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_recall/__init__.py +0 -0
  237. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_recall/contextual_recall.py +0 -0
  238. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_recall/schema.py +0 -0
  239. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_recall/template.py +0 -0
  240. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_relevancy/__init__.py +0 -0
  241. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_relevancy/contextual_relevancy.py +0 -0
  242. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_relevancy/schema.py +0 -0
  243. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/contextual_relevancy/template.py +0 -0
  244. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversation_completeness/__init__.py +0 -0
  245. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversation_completeness/conversation_completeness.py +0 -0
  246. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversation_completeness/schema.py +0 -0
  247. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversation_completeness/template.py +0 -0
  248. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversational_dag/__init__.py +0 -0
  249. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversational_dag/conversational_dag.py +0 -0
  250. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversational_dag/nodes.py +0 -0
  251. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversational_dag/templates.py +0 -0
  252. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversational_g_eval/__init__.py +0 -0
  253. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversational_g_eval/conversational_g_eval.py +0 -0
  254. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversational_g_eval/schema.py +0 -0
  255. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/conversational_g_eval/template.py +0 -0
  256. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/dag/__init__.py +0 -0
  257. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/dag/dag.py +0 -0
  258. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/dag/graph.py +0 -0
  259. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/dag/nodes.py +0 -0
  260. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/dag/schema.py +0 -0
  261. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/dag/templates.py +0 -0
  262. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/dag/utils.py +0 -0
  263. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/faithfulness/__init__.py +0 -0
  264. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/faithfulness/faithfulness.py +0 -0
  265. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/faithfulness/schema.py +0 -0
  266. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/faithfulness/template.py +0 -0
  267. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/g_eval/__init__.py +0 -0
  268. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/g_eval/g_eval.py +0 -0
  269. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/g_eval/schema.py +0 -0
  270. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/g_eval/template.py +0 -0
  271. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/g_eval/utils.py +0 -0
  272. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/hallucination/__init__.py +0 -0
  273. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/hallucination/hallucination.py +0 -0
  274. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/hallucination/schema.py +0 -0
  275. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/hallucination/template.py +0 -0
  276. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/indicator.py +0 -0
  277. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/json_correctness/__init__.py +0 -0
  278. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/json_correctness/json_correctness.py +0 -0
  279. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/json_correctness/schema.py +0 -0
  280. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/json_correctness/template.py +0 -0
  281. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/knowledge_retention/__init__.py +0 -0
  282. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/knowledge_retention/knowledge_retention.py +0 -0
  283. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/knowledge_retention/schema.py +0 -0
  284. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/knowledge_retention/template.py +0 -0
  285. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/mcp/__init__.py +0 -0
  286. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/mcp/mcp_task_completion.py +0 -0
  287. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/mcp/multi_turn_mcp_use_metric.py +0 -0
  288. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/mcp/schema.py +0 -0
  289. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/mcp/template.py +0 -0
  290. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/mcp_use_metric/__init__.py +0 -0
  291. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/mcp_use_metric/mcp_use_metric.py +0 -0
  292. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/mcp_use_metric/schema.py +0 -0
  293. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/mcp_use_metric/template.py +0 -0
  294. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/misuse/__init__.py +0 -0
  295. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/misuse/misuse.py +0 -0
  296. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/misuse/schema.py +0 -0
  297. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/misuse/template.py +0 -0
  298. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/__init__.py +0 -0
  299. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_coherence/__init__.py +0 -0
  300. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_coherence/image_coherence.py +0 -0
  301. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_coherence/schema.py +0 -0
  302. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_coherence/template.py +0 -0
  303. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_editing/__init__.py +0 -0
  304. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_editing/image_editing.py +0 -0
  305. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_editing/schema.py +0 -0
  306. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_editing/template.py +0 -0
  307. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_helpfulness/__init__.py +0 -0
  308. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_helpfulness/image_helpfulness.py +0 -0
  309. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_helpfulness/schema.py +0 -0
  310. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_helpfulness/template.py +0 -0
  311. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_reference/__init__.py +0 -0
  312. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_reference/image_reference.py +0 -0
  313. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_reference/schema.py +0 -0
  314. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/image_reference/template.py +0 -0
  315. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_answer_relevancy/__init__.py +0 -0
  316. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_answer_relevancy/multimodal_answer_relevancy.py +0 -0
  317. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_answer_relevancy/schema.py +0 -0
  318. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_answer_relevancy/template.py +0 -0
  319. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_precision/__init__.py +0 -0
  320. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_precision/multimodal_contextual_precision.py +0 -0
  321. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_precision/schema.py +0 -0
  322. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_precision/template.py +0 -0
  323. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_recall/__init__.py +0 -0
  324. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_recall/multimodal_contextual_recall.py +0 -0
  325. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_recall/schema.py +0 -0
  326. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_recall/template.py +0 -0
  327. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_relevancy/__init__.py +0 -0
  328. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_relevancy/multimodal_contextual_relevancy.py +0 -0
  329. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_relevancy/schema.py +0 -0
  330. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_contextual_relevancy/template.py +0 -0
  331. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_faithfulness/__init__.py +0 -0
  332. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_faithfulness/multimodal_faithfulness.py +0 -0
  333. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_faithfulness/schema.py +0 -0
  334. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_faithfulness/template.py +0 -0
  335. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_g_eval/__init__.py +0 -0
  336. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_g_eval/multimodal_g_eval.py +0 -0
  337. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_g_eval/schema.py +0 -0
  338. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_g_eval/template.py +0 -0
  339. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_g_eval/utils.py +0 -0
  340. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_tool_correctness/__init__.py +0 -0
  341. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/multimodal_tool_correctness/multimodal_tool_correctness.py +0 -0
  342. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/text_to_image/__init__.py +0 -0
  343. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/text_to_image/schema.py +0 -0
  344. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/text_to_image/template.py +0 -0
  345. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/multimodal_metrics/text_to_image/text_to_image.py +0 -0
  346. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/non_advice/__init__.py +0 -0
  347. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/non_advice/non_advice.py +0 -0
  348. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/non_advice/schema.py +0 -0
  349. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/non_advice/template.py +0 -0
  350. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/pii_leakage/__init__.py +0 -0
  351. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/pii_leakage/schema.py +0 -0
  352. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/pii_leakage/template.py +0 -0
  353. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/prompt_alignment/__init__.py +0 -0
  354. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/prompt_alignment/prompt_alignment.py +0 -0
  355. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/prompt_alignment/schema.py +0 -0
  356. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/prompt_alignment/template.py +0 -0
  357. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/ragas.py +0 -0
  358. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/role_adherence/__init__.py +0 -0
  359. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/role_adherence/role_adherence.py +0 -0
  360. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/role_adherence/schema.py +0 -0
  361. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/role_adherence/template.py +0 -0
  362. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/role_violation/__init__.py +0 -0
  363. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/role_violation/role_violation.py +0 -0
  364. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/role_violation/schema.py +0 -0
  365. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/role_violation/template.py +0 -0
  366. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/summarization/__init__.py +0 -0
  367. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/summarization/schema.py +0 -0
  368. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/summarization/summarization.py +0 -0
  369. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/summarization/template.py +0 -0
  370. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/task_completion/__init__.py +0 -0
  371. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/task_completion/schema.py +0 -0
  372. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/task_completion/task_completion.py +0 -0
  373. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/task_completion/template.py +0 -0
  374. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/tool_correctness/__init__.py +0 -0
  375. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/tool_correctness/tool_correctness.py +0 -0
  376. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/toxicity/__init__.py +0 -0
  377. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/toxicity/schema.py +0 -0
  378. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/toxicity/template.py +0 -0
  379. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/toxicity/toxicity.py +0 -0
  380. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/turn_relevancy/__init__.py +0 -0
  381. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/turn_relevancy/schema.py +0 -0
  382. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/turn_relevancy/template.py +0 -0
  383. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/turn_relevancy/turn_relevancy.py +0 -0
  384. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/metrics/utils.py +0 -0
  385. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/__init__.py +0 -0
  386. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/_summac_model.py +0 -0
  387. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/answer_relevancy_model.py +0 -0
  388. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/base_model.py +0 -0
  389. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/detoxify_model.py +0 -0
  390. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/embedding_models/__init__.py +0 -0
  391. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/hallucination_model.py +0 -0
  392. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/__init__.py +0 -0
  393. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/litellm_model.py +0 -0
  394. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/llms/utils.py +0 -0
  395. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/mlllms/__init__.py +0 -0
  396. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/summac_model.py +0 -0
  397. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/unbias_model.py +0 -0
  398. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/models/utils.py +0 -0
  399. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai/__init__.py +0 -0
  400. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai/extractors.py +0 -0
  401. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai/patch.py +0 -0
  402. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai/utils.py +0 -0
  403. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai_agents/__init__.py +0 -0
  404. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai_agents/agent.py +0 -0
  405. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai_agents/callback_handler.py +0 -0
  406. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai_agents/extractors.py +0 -0
  407. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai_agents/patch.py +0 -0
  408. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/openai_agents/runner.py +0 -0
  409. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/plugins/__init__.py +0 -0
  410. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/plugins/plugin.py +0 -0
  411. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/progress_context.py +0 -0
  412. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/prompt/__init__.py +0 -0
  413. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/prompt/api.py +0 -0
  414. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/prompt/prompt.py +0 -0
  415. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/prompt/utils.py +0 -0
  416. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/py.typed +0 -0
  417. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/red_teaming/README.md +0 -0
  418. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/scorer/__init__.py +0 -0
  419. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/scorer/scorer.py +0 -0
  420. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/simulator/__init__.py +0 -0
  421. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/simulator/conversation_simulator.py +0 -0
  422. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/simulator/schema.py +0 -0
  423. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/simulator/template.py +0 -0
  424. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/singleton.py +0 -0
  425. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/__init__.py +0 -0
  426. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/base_synthesizer.py +0 -0
  427. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/chunking/__init__.py +0 -0
  428. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/chunking/context_generator.py +0 -0
  429. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/chunking/doc_chunker.py +0 -0
  430. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/config.py +0 -0
  431. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/schema.py +0 -0
  432. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/synthesizer.py +0 -0
  433. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/templates/__init__.py +0 -0
  434. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/templates/template.py +0 -0
  435. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/templates/template_extraction.py +0 -0
  436. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/templates/template_prompt.py +0 -0
  437. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/types.py +0 -0
  438. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/synthesizer/utils.py +0 -0
  439. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/telemetry.py +0 -0
  440. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_case/__init__.py +0 -0
  441. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_case/arena_test_case.py +0 -0
  442. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_case/conversational_test_case.py +0 -0
  443. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_case/llm_test_case.py +0 -0
  444. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_case/mcp.py +0 -0
  445. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_case/mllm_test_case.py +0 -0
  446. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_case/utils.py +0 -0
  447. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_run/__init__.py +0 -0
  448. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_run/api.py +0 -0
  449. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_run/cache.py +0 -0
  450. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_run/hooks.py +0 -0
  451. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_run/hyperparameters.py +0 -0
  452. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/test_run/test_run.py +0 -0
  453. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/__init__.py +0 -0
  454. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/api.py +0 -0
  455. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/context.py +0 -0
  456. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/offline_evals/__init__.py +0 -0
  457. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/offline_evals/api.py +0 -0
  458. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/offline_evals/span.py +0 -0
  459. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/offline_evals/thread.py +0 -0
  460. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/offline_evals/trace.py +0 -0
  461. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/otel/__init__.py +0 -0
  462. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/otel/exporter.py +0 -0
  463. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/otel/utils.py +0 -0
  464. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/patchers.py +0 -0
  465. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/perf_epoch_bridge.py +0 -0
  466. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/types.py +0 -0
  467. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/tracing/utils.py +0 -0
  468. {deepeval-3.5.2 → deepeval-3.5.3}/deepeval/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepeval
3
- Version: 3.5.2
3
+ Version: 3.5.3
4
4
  Summary: The LLM Evaluation Framework
5
5
  Home-page: https://github.com/confident-ai/deepeval
6
6
  License: Apache-2.0
@@ -0,0 +1 @@
1
+ __version__: str = "3.5.3"
@@ -9,6 +9,7 @@ Central config for DeepEval.
9
9
  type coercion.
10
10
  """
11
11
 
12
+ import logging
12
13
  import os
13
14
  import re
14
15
 
@@ -16,11 +17,17 @@ from dotenv import dotenv_values
16
17
  from pathlib import Path
17
18
  from pydantic import AnyUrl, SecretStr, field_validator, confloat
18
19
  from pydantic_settings import BaseSettings, SettingsConfigDict
19
- from typing import Any, Dict, Optional, NamedTuple
20
+ from typing import Any, Dict, List, Optional, NamedTuple
20
21
 
21
- from deepeval.config.utils import parse_bool
22
+ from deepeval.config.utils import (
23
+ parse_bool,
24
+ coerce_to_list,
25
+ dedupe_preserve_order,
26
+ )
27
+ from deepeval.constants import SUPPORTED_PROVIDER_SLUGS, slugify
22
28
 
23
29
 
30
+ logger = logging.getLogger(__name__)
24
31
  _SAVE_RE = re.compile(r"^(?P<scheme>dotenv)(?::(?P<path>.+))?$")
25
32
 
26
33
 
@@ -264,6 +271,13 @@ class Settings(BaseSettings):
264
271
  LOCAL_EMBEDDING_MODEL_NAME: Optional[str] = None
265
272
  LOCAL_EMBEDDING_BASE_URL: Optional[AnyUrl] = None
266
273
 
274
+ #
275
+ # Retry Policy
276
+ #
277
+ DEEPEVAL_SDK_RETRY_PROVIDERS: Optional[List[str]] = None
278
+ DEEPEVAL_RETRY_BEFORE_LOG_LEVEL: Optional[int] = None # default -> INFO
279
+ DEEPEVAL_RETRY_AFTER_LOG_LEVEL: Optional[int] = None # default -> ERROR
280
+
267
281
  #
268
282
  # Telemetry and Debug
269
283
  #
@@ -283,6 +297,12 @@ class Settings(BaseSettings):
283
297
  CONFIDENT_SAMPLE_RATE: Optional[float] = 1.0
284
298
  OTEL_EXPORTER_OTLP_ENDPOINT: Optional[AnyUrl] = None
285
299
 
300
+ #
301
+ # Network
302
+ #
303
+ MEDIA_IMAGE_CONNECT_TIMEOUT_SECONDS: float = 3.05
304
+ MEDIA_IMAGE_READ_TIMEOUT_SECONDS: float = 10.0
305
+
286
306
  ##############
287
307
  # Validators #
288
308
  ##############
@@ -401,6 +421,78 @@ class Settings(BaseSettings):
401
421
  return None
402
422
  return s.upper()
403
423
 
424
+ @field_validator("DEEPEVAL_SDK_RETRY_PROVIDERS", mode="before")
425
+ @classmethod
426
+ def _coerce_to_list(cls, v):
427
+ # works with JSON list, comma/space/semicolon separated, or real lists
428
+ return coerce_to_list(v, lower=True)
429
+
430
+ @field_validator("DEEPEVAL_SDK_RETRY_PROVIDERS", mode="after")
431
+ @classmethod
432
+ def _validate_sdk_provider_list(cls, v):
433
+ if v is None:
434
+ return None
435
+
436
+ normalized: list[str] = []
437
+ star = False
438
+
439
+ for item in v:
440
+ s = str(item).strip()
441
+ if not s:
442
+ continue
443
+ if s == "*":
444
+ star = True
445
+ continue
446
+ s = slugify(s)
447
+ if s in SUPPORTED_PROVIDER_SLUGS:
448
+ normalized.append(s)
449
+ else:
450
+ if cls.DEEPEVAL_VERBOSE_MODE:
451
+ logger.warning("Unknown provider slug %r dropped", item)
452
+
453
+ if star:
454
+ return ["*"]
455
+
456
+ # It is important to dedup after normalization to catch variants
457
+ normalized = dedupe_preserve_order(normalized)
458
+ return normalized or None
459
+
460
+ @field_validator(
461
+ "DEEPEVAL_RETRY_BEFORE_LOG_LEVEL",
462
+ "DEEPEVAL_RETRY_AFTER_LOG_LEVEL",
463
+ mode="before",
464
+ )
465
+ @classmethod
466
+ def _coerce_log_level(cls, v):
467
+ if v is None:
468
+ return None
469
+ if isinstance(v, (int, float)):
470
+ return int(v)
471
+
472
+ s = str(v).strip().upper()
473
+ if not s:
474
+ return None
475
+
476
+ import logging
477
+
478
+ # Accept standard names or numeric strings
479
+ name_to_level = {
480
+ "CRITICAL": logging.CRITICAL,
481
+ "ERROR": logging.ERROR,
482
+ "WARNING": logging.WARNING,
483
+ "INFO": logging.INFO,
484
+ "DEBUG": logging.DEBUG,
485
+ "NOTSET": logging.NOTSET,
486
+ }
487
+ if s.isdigit() or (s.startswith("-") and s[1:].isdigit()):
488
+ return int(s)
489
+ if s in name_to_level:
490
+ return name_to_level[s]
491
+ raise ValueError(
492
+ "Retry log level must be one of DEBUG, INFO, WARNING, ERROR, "
493
+ "CRITICAL, NOTSET, or a numeric logging level."
494
+ )
495
+
404
496
  #######################
405
497
  # Persistence support #
406
498
  #######################
@@ -1,8 +1,13 @@
1
+ import json
1
2
  import os
2
- from typing import Any, Optional
3
+ import re
4
+
5
+ from typing import Any, Iterable, List, Optional
6
+
3
7
 
4
8
  _TRUTHY = frozenset({"1", "true", "t", "yes", "y", "on", "enable", "enabled"})
5
9
  _FALSY = frozenset({"0", "false", "f", "no", "n", "off", "disable", "disabled"})
10
+ _LIST_SEP_RE = re.compile(r"[,\s;]+")
6
11
 
7
12
 
8
13
  def parse_bool(value: Any, default: bool = False) -> bool:
@@ -84,3 +89,51 @@ def set_env_bool(key: str, value: Optional[bool] = False) -> None:
84
89
  - Use `get_env_bool` to read back and parse the value safely.
85
90
  """
86
91
  os.environ[key] = bool_to_env_str(bool(value))
92
+
93
+
94
+ def coerce_to_list(
95
+ v,
96
+ *,
97
+ lower: bool = False,
98
+ allow_json: bool = True,
99
+ sep_re: re.Pattern = _LIST_SEP_RE,
100
+ ) -> Optional[List[str]]:
101
+ """
102
+ Coerce None / str / list / tuple / set into a clean List[str].
103
+ - Accepts JSON arrays ("[...]"") or delimited strings (comma/space/semicolon).
104
+ - Strips whitespace, drops empties, optionally lowercases.
105
+ """
106
+ if v is None:
107
+ return None
108
+ if isinstance(v, (list, tuple, set)):
109
+ items = list(v)
110
+ else:
111
+ s = str(v).strip()
112
+ if not s:
113
+ return None
114
+ if allow_json and s.startswith("[") and s.endswith("]"):
115
+ try:
116
+ parsed = json.loads(s)
117
+ items = parsed if isinstance(parsed, list) else [s]
118
+ except Exception:
119
+ items = sep_re.split(s)
120
+ else:
121
+ items = sep_re.split(s)
122
+
123
+ out: List[str] = []
124
+ for item in items:
125
+ s = str(item).strip()
126
+ if not s:
127
+ continue
128
+ out.append(s.lower() if lower else s)
129
+ return out or None
130
+
131
+
132
+ def dedupe_preserve_order(items: Iterable[str]) -> List[str]:
133
+ seen = set()
134
+ out: List[str] = []
135
+ for x in items:
136
+ if x not in seen:
137
+ seen.add(x)
138
+ out.append(x)
139
+ return out
@@ -1,3 +1,5 @@
1
+ from enum import Enum
2
+
1
3
  KEY_FILE: str = ".deepeval"
2
4
  HIDDEN_DIR: str = ".deepeval"
3
5
  PYTEST_RUN_TEST_NAME: str = "CONFIDENT_AI_RUN_TEST_NAME"
@@ -11,3 +13,28 @@ CONFIDENT_TRACE_ENVIRONMENT = "CONFIDENT_TRACE_ENVIRONMENT"
11
13
  CONFIDENT_TRACING_ENABLED = "CONFIDENT_TRACING_ENABLED"
12
14
  CONFIDENT_OPEN_BROWSER = "CONFIDENT_OPEN_BROWSER"
13
15
  CONFIDENT_TEST_CASE_BATCH_SIZE = "CONFIDENT_TEST_CASE_BATCH_SIZE"
16
+
17
+
18
+ class ProviderSlug(str, Enum):
19
+ OPENAI = "openai"
20
+ AZURE = "azure"
21
+ ANTHROPIC = "anthropic"
22
+ BEDROCK = "bedrock"
23
+ DEEPSEEK = "deepseek"
24
+ GOOGLE = "google"
25
+ GROK = "grok"
26
+ KIMI = "kimi"
27
+ LITELLM = "litellm"
28
+ LOCAL = "local"
29
+ OLLAMA = "ollama"
30
+
31
+
32
+ def slugify(value: str | ProviderSlug) -> str:
33
+ return (
34
+ value.value
35
+ if isinstance(value, ProviderSlug)
36
+ else str(value).strip().lower()
37
+ )
38
+
39
+
40
+ SUPPORTED_PROVIDER_SLUGS = frozenset(s.value for s in ProviderSlug)
@@ -284,7 +284,7 @@ class PIILeakageMetric(BaseMetric):
284
284
  no_privacy_count += 1
285
285
 
286
286
  score = no_privacy_count / number_of_verdicts
287
- return 1 if self.strict_mode and score < 1 else score
287
+ return 0 if self.strict_mode and score < self.threshold else score
288
288
 
289
289
  def is_successful(self) -> bool:
290
290
  if self.error is not None:
@@ -1,4 +1,4 @@
1
- from typing import List
1
+ from typing import Dict, List
2
2
  from openai import AzureOpenAI, AsyncAzureOpenAI
3
3
  from deepeval.key_handler import (
4
4
  EmbeddingKeyValues,
@@ -6,10 +6,18 @@ from deepeval.key_handler import (
6
6
  KEY_FILE_HANDLER,
7
7
  )
8
8
  from deepeval.models import DeepEvalBaseEmbeddingModel
9
+ from deepeval.models.retry_policy import (
10
+ create_retry_decorator,
11
+ sdk_retries_for,
12
+ )
13
+ from deepeval.constants import ProviderSlug as PS
14
+
15
+
16
+ retry_azure = create_retry_decorator(PS.AZURE)
9
17
 
10
18
 
11
19
  class AzureOpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
12
- def __init__(self):
20
+ def __init__(self, **kwargs):
13
21
  self.azure_openai_api_key = KEY_FILE_HANDLER.fetch_data(
14
22
  ModelKeyValues.AZURE_OPENAI_API_KEY
15
23
  )
@@ -23,7 +31,9 @@ class AzureOpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
23
31
  ModelKeyValues.AZURE_OPENAI_ENDPOINT
24
32
  )
25
33
  self.model_name = self.azure_embedding_deployment
34
+ self.kwargs = kwargs
26
35
 
36
+ @retry_azure
27
37
  def embed_text(self, text: str) -> List[float]:
28
38
  client = self.load_model(async_mode=False)
29
39
  response = client.embeddings.create(
@@ -32,6 +42,7 @@ class AzureOpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
32
42
  )
33
43
  return response.data[0].embedding
34
44
 
45
+ @retry_azure
35
46
  def embed_texts(self, texts: List[str]) -> List[List[float]]:
36
47
  client = self.load_model(async_mode=False)
37
48
  response = client.embeddings.create(
@@ -40,6 +51,7 @@ class AzureOpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
40
51
  )
41
52
  return [item.embedding for item in response.data]
42
53
 
54
+ @retry_azure
43
55
  async def a_embed_text(self, text: str) -> List[float]:
44
56
  client = self.load_model(async_mode=True)
45
57
  response = await client.embeddings.create(
@@ -48,6 +60,7 @@ class AzureOpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
48
60
  )
49
61
  return response.data[0].embedding
50
62
 
63
+ @retry_azure
51
64
  async def a_embed_texts(self, texts: List[str]) -> List[List[float]]:
52
65
  client = self.load_model(async_mode=True)
53
66
  response = await client.embeddings.create(
@@ -61,15 +74,33 @@ class AzureOpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
61
74
 
62
75
  def load_model(self, async_mode: bool = False):
63
76
  if not async_mode:
64
- return AzureOpenAI(
65
- api_key=self.azure_openai_api_key,
66
- api_version=self.openai_api_version,
67
- azure_endpoint=self.azure_endpoint,
68
- azure_deployment=self.azure_embedding_deployment,
69
- )
70
- return AsyncAzureOpenAI(
77
+ return self._build_client(AzureOpenAI)
78
+ return self._build_client(AsyncAzureOpenAI)
79
+
80
+ def _client_kwargs(self) -> Dict:
81
+ """
82
+ If Tenacity is managing retries, force OpenAI SDK retries off to avoid double retries.
83
+ If the user opts into SDK retries for 'azure' via DEEPEVAL_SDK_RETRY_PROVIDERS,
84
+ leave their retry settings as is.
85
+ """
86
+ kwargs = dict(self.kwargs or {})
87
+ if not sdk_retries_for(PS.AZURE):
88
+ kwargs["max_retries"] = 0
89
+ return kwargs
90
+
91
+ def _build_client(self, cls):
92
+ kw = dict(
71
93
  api_key=self.azure_openai_api_key,
72
94
  api_version=self.openai_api_version,
73
95
  azure_endpoint=self.azure_endpoint,
74
96
  azure_deployment=self.azure_embedding_deployment,
97
+ **self._client_kwargs(),
75
98
  )
99
+ try:
100
+ return cls(**kw)
101
+ except TypeError as e:
102
+ # older OpenAI SDKs may not accept max_retries, in that case remove and retry once
103
+ if "max_retries" in str(e):
104
+ kw.pop("max_retries", None)
105
+ return cls(**kw)
106
+ raise
@@ -1,12 +1,21 @@
1
- from openai import OpenAI
2
- from typing import List
1
+ from openai import OpenAI, AsyncOpenAI
2
+ from typing import Dict, List
3
3
 
4
4
  from deepeval.key_handler import EmbeddingKeyValues, KEY_FILE_HANDLER
5
5
  from deepeval.models import DeepEvalBaseEmbeddingModel
6
+ from deepeval.models.retry_policy import (
7
+ create_retry_decorator,
8
+ sdk_retries_for,
9
+ )
10
+ from deepeval.constants import ProviderSlug as PS
11
+
12
+
13
+ # consistent retry rules
14
+ retry_local = create_retry_decorator(PS.LOCAL)
6
15
 
7
16
 
8
17
  class LocalEmbeddingModel(DeepEvalBaseEmbeddingModel):
9
- def __init__(self, *args, **kwargs):
18
+ def __init__(self, **kwargs):
10
19
  self.base_url = KEY_FILE_HANDLER.fetch_data(
11
20
  EmbeddingKeyValues.LOCAL_EMBEDDING_BASE_URL
12
21
  )
@@ -16,13 +25,10 @@ class LocalEmbeddingModel(DeepEvalBaseEmbeddingModel):
16
25
  self.api_key = KEY_FILE_HANDLER.fetch_data(
17
26
  EmbeddingKeyValues.LOCAL_EMBEDDING_API_KEY
18
27
  )
19
- self.args = args
20
28
  self.kwargs = kwargs
21
29
  super().__init__(model_name)
22
30
 
23
- def load_model(self):
24
- return OpenAI(base_url=self.base_url, api_key=self.api_key)
25
-
31
+ @retry_local
26
32
  def embed_text(self, text: str) -> List[float]:
27
33
  embedding_model = self.load_model()
28
34
  response = embedding_model.embeddings.create(
@@ -31,6 +37,7 @@ class LocalEmbeddingModel(DeepEvalBaseEmbeddingModel):
31
37
  )
32
38
  return response.data[0].embedding
33
39
 
40
+ @retry_local
34
41
  def embed_texts(self, texts: List[str]) -> List[List[float]]:
35
42
  embedding_model = self.load_model()
36
43
  response = embedding_model.embeddings.create(
@@ -39,21 +46,57 @@ class LocalEmbeddingModel(DeepEvalBaseEmbeddingModel):
39
46
  )
40
47
  return [data.embedding for data in response.data]
41
48
 
49
+ @retry_local
42
50
  async def a_embed_text(self, text: str) -> List[float]:
43
- embedding_model = self.load_model()
51
+ embedding_model = self.load_model(async_mode=True)
44
52
  response = await embedding_model.embeddings.create(
45
53
  model=self.model_name,
46
54
  input=[text],
47
55
  )
48
56
  return response.data[0].embedding
49
57
 
58
+ @retry_local
50
59
  async def a_embed_texts(self, texts: List[str]) -> List[List[float]]:
51
- embedding_model = self.load_model()
60
+ embedding_model = self.load_model(async_mode=True)
52
61
  response = await embedding_model.embeddings.create(
53
62
  model=self.model_name,
54
63
  input=texts,
55
64
  )
56
65
  return [data.embedding for data in response.data]
57
66
 
67
+ ###############################################
68
+ # Model
69
+ ###############################################
70
+
58
71
  def get_model_name(self):
59
72
  return self.model_name
73
+
74
+ def load_model(self, async_mode: bool = False):
75
+ if not async_mode:
76
+ return self._build_client(OpenAI)
77
+ return self._build_client(AsyncOpenAI)
78
+
79
+ def _client_kwargs(self) -> Dict:
80
+ """
81
+ If Tenacity manages retries, turn off OpenAI SDK retries to avoid double retrying.
82
+ If users opt into SDK retries via DEEPEVAL_SDK_RETRY_PROVIDERS=local, leave them enabled.
83
+ """
84
+ kwargs = dict(self.kwargs or {})
85
+ if not sdk_retries_for(PS.LOCAL):
86
+ kwargs["max_retries"] = 0
87
+ return kwargs
88
+
89
+ def _build_client(self, cls):
90
+ kw = dict(
91
+ api_key=self.api_key,
92
+ base_url=self.base_url,
93
+ **self._client_kwargs(),
94
+ )
95
+ try:
96
+ return cls(**kw)
97
+ except TypeError as e:
98
+ # Older OpenAI SDKs may not accept max_retries; drop and retry once.
99
+ if "max_retries" in str(e):
100
+ kw.pop("max_retries", None)
101
+ return cls(**kw)
102
+ raise
@@ -3,6 +3,13 @@ from typing import List
3
3
 
4
4
  from deepeval.key_handler import EmbeddingKeyValues, KEY_FILE_HANDLER
5
5
  from deepeval.models import DeepEvalBaseEmbeddingModel
6
+ from deepeval.models.retry_policy import (
7
+ create_retry_decorator,
8
+ )
9
+ from deepeval.constants import ProviderSlug as PS
10
+
11
+
12
+ retry_ollama = create_retry_decorator(PS.OLLAMA)
6
13
 
7
14
 
8
15
  class OllamaEmbeddingModel(DeepEvalBaseEmbeddingModel):
@@ -13,6 +20,7 @@ class OllamaEmbeddingModel(DeepEvalBaseEmbeddingModel):
13
20
  model_name = KEY_FILE_HANDLER.fetch_data(
14
21
  EmbeddingKeyValues.LOCAL_EMBEDDING_MODEL_NAME
15
22
  )
23
+ # TODO: This is not being used. Clean it up in consistency PR
16
24
  self.api_key = KEY_FILE_HANDLER.fetch_data(
17
25
  EmbeddingKeyValues.LOCAL_EMBEDDING_API_KEY
18
26
  )
@@ -20,12 +28,7 @@ class OllamaEmbeddingModel(DeepEvalBaseEmbeddingModel):
20
28
  self.kwargs = kwargs
21
29
  super().__init__(model_name)
22
30
 
23
- def load_model(self, async_mode: bool = False):
24
- if not async_mode:
25
- return Client(host=self.base_url)
26
-
27
- return AsyncClient(host=self.base_url)
28
-
31
+ @retry_ollama
29
32
  def embed_text(self, text: str) -> List[float]:
30
33
  embedding_model = self.load_model()
31
34
  response = embedding_model.embed(
@@ -34,6 +37,7 @@ class OllamaEmbeddingModel(DeepEvalBaseEmbeddingModel):
34
37
  )
35
38
  return response["embeddings"][0]
36
39
 
40
+ @retry_ollama
37
41
  def embed_texts(self, texts: List[str]) -> List[List[float]]:
38
42
  embedding_model = self.load_model()
39
43
  response = embedding_model.embed(
@@ -42,6 +46,7 @@ class OllamaEmbeddingModel(DeepEvalBaseEmbeddingModel):
42
46
  )
43
47
  return response["embeddings"]
44
48
 
49
+ @retry_ollama
45
50
  async def a_embed_text(self, text: str) -> List[float]:
46
51
  embedding_model = self.load_model(async_mode=True)
47
52
  response = await embedding_model.embed(
@@ -50,6 +55,7 @@ class OllamaEmbeddingModel(DeepEvalBaseEmbeddingModel):
50
55
  )
51
56
  return response["embeddings"][0]
52
57
 
58
+ @retry_ollama
53
59
  async def a_embed_texts(self, texts: List[str]) -> List[List[float]]:
54
60
  embedding_model = self.load_model(async_mode=True)
55
61
  response = await embedding_model.embed(
@@ -58,5 +64,17 @@ class OllamaEmbeddingModel(DeepEvalBaseEmbeddingModel):
58
64
  )
59
65
  return response["embeddings"]
60
66
 
67
+ ###############################################
68
+ # Model
69
+ ###############################################
70
+
71
+ def load_model(self, async_mode: bool = False):
72
+ if not async_mode:
73
+ return self._build_client(Client)
74
+ return self._build_client(AsyncClient)
75
+
76
+ def _build_client(self, cls):
77
+ return cls(host=self.base_url, **self.kwargs)
78
+
61
79
  def get_model_name(self):
62
- return self.model_name
80
+ return f"{self.model_name} (Ollama)"
@@ -1,6 +1,14 @@
1
- from typing import Optional, List
1
+ from typing import Dict, Optional, List
2
2
  from openai import OpenAI, AsyncOpenAI
3
3
  from deepeval.models import DeepEvalBaseEmbeddingModel
4
+ from deepeval.models.retry_policy import (
5
+ create_retry_decorator,
6
+ sdk_retries_for,
7
+ )
8
+ from deepeval.constants import ProviderSlug as PS
9
+
10
+
11
+ retry_openai = create_retry_decorator(PS.OPENAI)
4
12
 
5
13
  valid_openai_embedding_models = [
6
14
  "text-embedding-3-small",
@@ -15,6 +23,7 @@ class OpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
15
23
  self,
16
24
  model: Optional[str] = None,
17
25
  _openai_api_key: Optional[str] = None,
26
+ **kwargs,
18
27
  ):
19
28
  model_name = model if model else default_openai_embedding_model
20
29
  if model_name not in valid_openai_embedding_models:
@@ -23,7 +32,9 @@ class OpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
23
32
  )
24
33
  self._openai_api_key = _openai_api_key
25
34
  self.model_name = model_name
35
+ self.kwargs = kwargs
26
36
 
37
+ @retry_openai
27
38
  def embed_text(self, text: str) -> List[float]:
28
39
  client = self.load_model(async_mode=False)
29
40
  response = client.embeddings.create(
@@ -32,6 +43,7 @@ class OpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
32
43
  )
33
44
  return response.data[0].embedding
34
45
 
46
+ @retry_openai
35
47
  def embed_texts(self, texts: List[str]) -> List[List[float]]:
36
48
  client = self.load_model(async_mode=False)
37
49
  response = client.embeddings.create(
@@ -40,6 +52,7 @@ class OpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
40
52
  )
41
53
  return [item.embedding for item in response.data]
42
54
 
55
+ @retry_openai
43
56
  async def a_embed_text(self, text: str) -> List[float]:
44
57
  client = self.load_model(async_mode=True)
45
58
  response = await client.embeddings.create(
@@ -48,6 +61,7 @@ class OpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
48
61
  )
49
62
  return response.data[0].embedding
50
63
 
64
+ @retry_openai
51
65
  async def a_embed_texts(self, texts: List[str]) -> List[List[float]]:
52
66
  client = self.load_model(async_mode=True)
53
67
  response = await client.embeddings.create(
@@ -56,11 +70,39 @@ class OpenAIEmbeddingModel(DeepEvalBaseEmbeddingModel):
56
70
  )
57
71
  return [item.embedding for item in response.data]
58
72
 
59
- def get_model_name(self) -> str:
73
+ ###############################################
74
+ # Model
75
+ ###############################################
76
+
77
+ def get_model_name(self):
60
78
  return self.model_name
61
79
 
62
- def load_model(self, async_mode: bool):
80
+ def load_model(self, async_mode: bool = False):
63
81
  if not async_mode:
64
- return OpenAI(api_key=self._openai_api_key)
82
+ return self._build_client(OpenAI)
83
+ return self._build_client(AsyncOpenAI)
65
84
 
66
- return AsyncOpenAI(api_key=self._openai_api_key)
85
+ def _client_kwargs(self) -> Dict:
86
+ """
87
+ If Tenacity is managing retries, force OpenAI SDK retries off to avoid double retries.
88
+ If the user opts into SDK retries for 'openai' via DEEPEVAL_SDK_RETRY_PROVIDERS,
89
+ leave their retry settings as is.
90
+ """
91
+ kwargs = dict(self.kwargs or {})
92
+ if not sdk_retries_for(PS.OPENAI):
93
+ kwargs["max_retries"] = 0
94
+ return kwargs
95
+
96
+ def _build_client(self, cls):
97
+ kw = dict(
98
+ api_key=self._openai_api_key,
99
+ **self._client_kwargs(),
100
+ )
101
+ try:
102
+ return cls(**kw)
103
+ except TypeError as e:
104
+ # older OpenAI SDKs may not accept max_retries, in that case remove and retry once
105
+ if "max_retries" in str(e):
106
+ kw.pop("max_retries", None)
107
+ return cls(**kw)
108
+ raise