deepeval 3.7.3__py3-none-any.whl → 3.7.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. deepeval/_version.py +1 -1
  2. deepeval/cli/test.py +1 -1
  3. deepeval/config/settings.py +102 -13
  4. deepeval/evaluate/configs.py +1 -1
  5. deepeval/evaluate/execute.py +4 -1
  6. deepeval/metrics/answer_relevancy/template.py +4 -4
  7. deepeval/metrics/argument_correctness/template.py +2 -2
  8. deepeval/metrics/bias/template.py +3 -3
  9. deepeval/metrics/contextual_precision/template.py +6 -6
  10. deepeval/metrics/contextual_recall/template.py +2 -2
  11. deepeval/metrics/contextual_relevancy/template.py +3 -3
  12. deepeval/metrics/conversation_completeness/template.py +2 -2
  13. deepeval/metrics/conversational_dag/templates.py +4 -4
  14. deepeval/metrics/conversational_g_eval/template.py +4 -3
  15. deepeval/metrics/dag/templates.py +4 -4
  16. deepeval/metrics/faithfulness/template.py +4 -4
  17. deepeval/metrics/hallucination/template.py +4 -4
  18. deepeval/metrics/misuse/template.py +2 -2
  19. deepeval/metrics/multimodal_metrics/multimodal_answer_relevancy/template.py +7 -7
  20. deepeval/metrics/multimodal_metrics/multimodal_contextual_precision/template.py +6 -6
  21. deepeval/metrics/multimodal_metrics/multimodal_contextual_recall/template.py +2 -2
  22. deepeval/metrics/multimodal_metrics/multimodal_contextual_relevancy/template.py +3 -3
  23. deepeval/metrics/multimodal_metrics/multimodal_faithfulness/template.py +9 -9
  24. deepeval/metrics/multimodal_metrics/multimodal_g_eval/template.py +4 -4
  25. deepeval/metrics/non_advice/template.py +2 -2
  26. deepeval/metrics/pii_leakage/template.py +2 -2
  27. deepeval/metrics/prompt_alignment/template.py +4 -4
  28. deepeval/metrics/role_violation/template.py +2 -2
  29. deepeval/metrics/step_efficiency/step_efficiency.py +1 -1
  30. deepeval/metrics/toxicity/template.py +4 -4
  31. deepeval/metrics/turn_relevancy/template.py +2 -2
  32. deepeval/models/embedding_models/azure_embedding_model.py +28 -15
  33. deepeval/models/embedding_models/local_embedding_model.py +23 -10
  34. deepeval/models/embedding_models/ollama_embedding_model.py +8 -6
  35. deepeval/models/embedding_models/openai_embedding_model.py +18 -2
  36. deepeval/models/llms/anthropic_model.py +17 -5
  37. deepeval/models/llms/azure_model.py +30 -18
  38. deepeval/models/llms/deepseek_model.py +22 -12
  39. deepeval/models/llms/gemini_model.py +120 -87
  40. deepeval/models/llms/grok_model.py +23 -16
  41. deepeval/models/llms/kimi_model.py +23 -12
  42. deepeval/models/llms/litellm_model.py +63 -25
  43. deepeval/models/llms/local_model.py +26 -18
  44. deepeval/models/llms/ollama_model.py +17 -7
  45. deepeval/models/llms/openai_model.py +22 -17
  46. deepeval/models/llms/portkey_model.py +132 -0
  47. deepeval/models/mlllms/azure_model.py +28 -19
  48. deepeval/models/mlllms/gemini_model.py +102 -73
  49. deepeval/models/mlllms/ollama_model.py +40 -9
  50. deepeval/models/mlllms/openai_model.py +65 -14
  51. deepeval/models/utils.py +48 -3
  52. deepeval/optimization/__init__.py +13 -0
  53. deepeval/optimization/adapters/__init__.py +2 -0
  54. deepeval/optimization/adapters/deepeval_scoring_adapter.py +588 -0
  55. deepeval/optimization/aggregates.py +14 -0
  56. deepeval/optimization/configs.py +34 -0
  57. deepeval/optimization/copro/configs.py +31 -0
  58. deepeval/optimization/copro/loop.py +837 -0
  59. deepeval/optimization/gepa/__init__.py +7 -0
  60. deepeval/optimization/gepa/configs.py +115 -0
  61. deepeval/optimization/gepa/loop.py +677 -0
  62. deepeval/optimization/miprov2/configs.py +134 -0
  63. deepeval/optimization/miprov2/loop.py +785 -0
  64. deepeval/optimization/mutations/__init__.py +0 -0
  65. deepeval/optimization/mutations/prompt_rewriter.py +458 -0
  66. deepeval/optimization/policies/__init__.py +16 -0
  67. deepeval/optimization/policies/selection.py +166 -0
  68. deepeval/optimization/policies/tie_breaker.py +67 -0
  69. deepeval/optimization/prompt_optimizer.py +462 -0
  70. deepeval/optimization/simba/__init__.py +0 -0
  71. deepeval/optimization/simba/configs.py +33 -0
  72. deepeval/optimization/simba/loop.py +983 -0
  73. deepeval/optimization/simba/types.py +15 -0
  74. deepeval/optimization/types.py +361 -0
  75. deepeval/optimization/utils.py +598 -0
  76. deepeval/prompt/prompt.py +10 -5
  77. deepeval/test_run/cache.py +2 -0
  78. deepeval/test_run/test_run.py +6 -1
  79. deepeval/utils.py +24 -0
  80. {deepeval-3.7.3.dist-info → deepeval-3.7.4.dist-info}/METADATA +1 -1
  81. {deepeval-3.7.3.dist-info → deepeval-3.7.4.dist-info}/RECORD +84 -59
  82. {deepeval-3.7.3.dist-info → deepeval-3.7.4.dist-info}/LICENSE.md +0 -0
  83. {deepeval-3.7.3.dist-info → deepeval-3.7.4.dist-info}/WHEEL +0 -0
  84. {deepeval-3.7.3.dist-info → deepeval-3.7.4.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,7 @@
1
+ from .configs import GEPAConfig
2
+ from .loop import GEPARunner
3
+
4
+ __all__ = [
5
+ "GEPAConfig",
6
+ "GEPARunner",
7
+ ]
@@ -0,0 +1,115 @@
1
+ from __future__ import annotations
2
+ import time
3
+ from typing import Optional
4
+ from pydantic import (
5
+ BaseModel,
6
+ confloat,
7
+ conint,
8
+ Field,
9
+ field_validator,
10
+ PositiveInt,
11
+ )
12
+
13
+ from deepeval.optimization.policies.tie_breaker import (
14
+ TieBreaker as TieBreakerPolicy,
15
+ )
16
+
17
+
18
+ class GEPAConfig(BaseModel):
19
+ """
20
+ Core configuration for the GEPA optimization loop.
21
+
22
+ This controls:
23
+ - The iteration budget and acceptance threshold (iterations, min_delta).
24
+ - How D_train is split into a Pareto validation subset (D_pareto)
25
+ versus a feedback subset (D_feedback) (pareto_size).
26
+ - How minibatches are drawn from D_feedback, either with a fixed size
27
+ or dynamically from a ratio and min/max bounds (minibatch_* fields).
28
+ - How ties on aggregate scores are treated (tie_tolerance, tie_breaker).
29
+ - Randomness and rewrite instruction length (random_seed,
30
+ rewrite_instruction_max_chars).
31
+
32
+ See individual field descriptions for precise behavior.
33
+ """
34
+
35
+ iterations: PositiveInt = Field(
36
+ default=5,
37
+ description="Total number of GEPA loop iterations (mutation attempts). "
38
+ "This acts as the optimization budget B in the GEPA paper.",
39
+ )
40
+ minibatch_size: Optional[conint(ge=1)] = Field(
41
+ default=None,
42
+ description="Fixed minibatch size drawn from D_feedback. When set, this "
43
+ "overrides dynamic sizing based on `minibatch_ratio`, "
44
+ "`minibatch_min_size`, and `minibatch_max_size`.",
45
+ )
46
+ minibatch_min_size: conint(ge=1) = Field(
47
+ default=4,
48
+ description="Hard lower bound on the minibatch size used for D_feedback "
49
+ "when dynamic sizing is in effect.",
50
+ )
51
+ minibatch_max_size: PositiveInt = Field(
52
+ default=32,
53
+ description="Hard upper bound on the minibatch size used for D_feedback "
54
+ "when dynamic sizing is in effect.",
55
+ )
56
+ minibatch_ratio: confloat(gt=0.0, le=1.0) = Field(
57
+ default=0.05,
58
+ description=(
59
+ "Target fraction of |D_feedback| used to compute a dynamic "
60
+ "minibatch size when `minibatch_size` is None. The effective "
61
+ "size is round(len(D_feedback) * minibatch_ratio) bounded "
62
+ "between `minibatch_min_size` and `minibatch_max_size` and not "
63
+ "exceeding len(D_feedback). D_feedback is the subset of the "
64
+ "provided goldens that is not allocated to D_pareto by "
65
+ "`split_goldens(...)`."
66
+ ),
67
+ )
68
+ pareto_size: conint(ge=1) = Field(
69
+ default=3,
70
+ description="Size of the Pareto validation subset D_pareto. The splitter "
71
+ "will bind this between [0, len(goldens)], and the runner requires "
72
+ "at least 2 total goldens to run GEPA.",
73
+ )
74
+ random_seed: conint(ge=0) = Field(
75
+ default=0,
76
+ description="Non-negative RNG seed for reproducibility. "
77
+ "If you explicitly pass None, it is replaced with a seed "
78
+ "derived from time.time_ns() via the field validator.",
79
+ )
80
+ min_delta: confloat(ge=0.0) = Field(
81
+ default=0.0,
82
+ description="Minimum improvement required for a child configuration to be "
83
+ "accepted, e.g. σ_child >= σ_parent + min_delta. A small jitter "
84
+ "is applied internally to avoid floating-point edge cases.",
85
+ )
86
+ # Two candidates are considered tied if their aggregate scores are within tie_tolerance.
87
+ tie_tolerance: confloat(ge=0.0) = Field(
88
+ 1e-9,
89
+ description="Two candidates are considered tied on aggregate score if "
90
+ "their values differ by at most this tolerance.",
91
+ )
92
+ tie_breaker: TieBreakerPolicy = Field(
93
+ TieBreakerPolicy.PREFER_CHILD,
94
+ description="Policy used to break ties when multiple prompt configurations "
95
+ "share the best aggregate score. See `GEPAConfig.TieBreaker` "
96
+ "for the available options. ",
97
+ )
98
+ rewrite_instruction_max_chars: PositiveInt = Field(
99
+ default=4096,
100
+ description=(
101
+ "Maximum number of characters from prompt, feedback, and related text "
102
+ "included in rewrite instructions."
103
+ ),
104
+ )
105
+
106
+ @field_validator("random_seed", mode="before")
107
+ @classmethod
108
+ def _coerce_random_seed(cls, seed):
109
+ if seed is None:
110
+ return time.time_ns()
111
+ else:
112
+ return seed
113
+
114
+
115
+ GEPAConfig.TieBreaker = TieBreakerPolicy