judgeval 0.1.0__py3-none-any.whl → 0.23.0__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 (234) hide show
  1. judgeval/__init__.py +173 -10
  2. judgeval/api/__init__.py +523 -0
  3. judgeval/api/api_types.py +413 -0
  4. judgeval/cli.py +112 -0
  5. judgeval/constants.py +7 -30
  6. judgeval/data/__init__.py +1 -3
  7. judgeval/data/evaluation_run.py +125 -0
  8. judgeval/data/example.py +14 -40
  9. judgeval/data/judgment_types.py +396 -146
  10. judgeval/data/result.py +11 -18
  11. judgeval/data/scorer_data.py +3 -26
  12. judgeval/data/scripts/openapi_transform.py +5 -5
  13. judgeval/data/trace.py +115 -194
  14. judgeval/dataset/__init__.py +335 -0
  15. judgeval/env.py +55 -0
  16. judgeval/evaluation/__init__.py +346 -0
  17. judgeval/exceptions.py +28 -0
  18. judgeval/integrations/langgraph/__init__.py +13 -0
  19. judgeval/integrations/openlit/__init__.py +51 -0
  20. judgeval/judges/__init__.py +2 -2
  21. judgeval/judges/litellm_judge.py +77 -16
  22. judgeval/judges/together_judge.py +88 -17
  23. judgeval/judges/utils.py +7 -20
  24. judgeval/judgment_attribute_keys.py +55 -0
  25. judgeval/{common/logger.py → logger.py} +24 -8
  26. judgeval/prompt/__init__.py +330 -0
  27. judgeval/scorers/__init__.py +11 -11
  28. judgeval/scorers/agent_scorer.py +15 -19
  29. judgeval/scorers/api_scorer.py +21 -23
  30. judgeval/scorers/base_scorer.py +54 -36
  31. judgeval/scorers/example_scorer.py +1 -3
  32. judgeval/scorers/judgeval_scorers/api_scorers/__init__.py +2 -24
  33. judgeval/scorers/judgeval_scorers/api_scorers/answer_correctness.py +2 -10
  34. judgeval/scorers/judgeval_scorers/api_scorers/answer_relevancy.py +2 -2
  35. judgeval/scorers/judgeval_scorers/api_scorers/faithfulness.py +2 -10
  36. judgeval/scorers/judgeval_scorers/api_scorers/instruction_adherence.py +2 -14
  37. judgeval/scorers/judgeval_scorers/api_scorers/prompt_scorer.py +171 -59
  38. judgeval/scorers/score.py +64 -47
  39. judgeval/scorers/utils.py +2 -107
  40. judgeval/tracer/__init__.py +1111 -2
  41. judgeval/tracer/constants.py +1 -0
  42. judgeval/tracer/exporters/__init__.py +40 -0
  43. judgeval/tracer/exporters/s3.py +119 -0
  44. judgeval/tracer/exporters/store.py +59 -0
  45. judgeval/tracer/exporters/utils.py +32 -0
  46. judgeval/tracer/keys.py +63 -0
  47. judgeval/tracer/llm/__init__.py +7 -0
  48. judgeval/tracer/llm/config.py +78 -0
  49. judgeval/tracer/llm/constants.py +9 -0
  50. judgeval/tracer/llm/llm_anthropic/__init__.py +3 -0
  51. judgeval/tracer/llm/llm_anthropic/config.py +6 -0
  52. judgeval/tracer/llm/llm_anthropic/messages.py +452 -0
  53. judgeval/tracer/llm/llm_anthropic/messages_stream.py +322 -0
  54. judgeval/tracer/llm/llm_anthropic/wrapper.py +59 -0
  55. judgeval/tracer/llm/llm_google/__init__.py +3 -0
  56. judgeval/tracer/llm/llm_google/config.py +6 -0
  57. judgeval/tracer/llm/llm_google/generate_content.py +127 -0
  58. judgeval/tracer/llm/llm_google/wrapper.py +30 -0
  59. judgeval/tracer/llm/llm_openai/__init__.py +3 -0
  60. judgeval/tracer/llm/llm_openai/beta_chat_completions.py +216 -0
  61. judgeval/tracer/llm/llm_openai/chat_completions.py +501 -0
  62. judgeval/tracer/llm/llm_openai/config.py +6 -0
  63. judgeval/tracer/llm/llm_openai/responses.py +506 -0
  64. judgeval/tracer/llm/llm_openai/utils.py +42 -0
  65. judgeval/tracer/llm/llm_openai/wrapper.py +63 -0
  66. judgeval/tracer/llm/llm_together/__init__.py +3 -0
  67. judgeval/tracer/llm/llm_together/chat_completions.py +406 -0
  68. judgeval/tracer/llm/llm_together/config.py +6 -0
  69. judgeval/tracer/llm/llm_together/wrapper.py +52 -0
  70. judgeval/tracer/llm/providers.py +19 -0
  71. judgeval/tracer/managers.py +167 -0
  72. judgeval/tracer/processors/__init__.py +220 -0
  73. judgeval/tracer/utils.py +19 -0
  74. judgeval/trainer/__init__.py +14 -0
  75. judgeval/trainer/base_trainer.py +122 -0
  76. judgeval/trainer/config.py +123 -0
  77. judgeval/trainer/console.py +144 -0
  78. judgeval/trainer/fireworks_trainer.py +392 -0
  79. judgeval/trainer/trainable_model.py +252 -0
  80. judgeval/trainer/trainer.py +70 -0
  81. judgeval/utils/async_utils.py +39 -0
  82. judgeval/utils/decorators/__init__.py +0 -0
  83. judgeval/utils/decorators/dont_throw.py +37 -0
  84. judgeval/utils/decorators/use_once.py +13 -0
  85. judgeval/utils/file_utils.py +74 -28
  86. judgeval/utils/guards.py +36 -0
  87. judgeval/utils/meta.py +27 -0
  88. judgeval/utils/project.py +15 -0
  89. judgeval/utils/serialize.py +253 -0
  90. judgeval/utils/testing.py +70 -0
  91. judgeval/utils/url.py +10 -0
  92. judgeval/{version_check.py → utils/version_check.py} +5 -3
  93. judgeval/utils/wrappers/README.md +3 -0
  94. judgeval/utils/wrappers/__init__.py +15 -0
  95. judgeval/utils/wrappers/immutable_wrap_async.py +74 -0
  96. judgeval/utils/wrappers/immutable_wrap_async_iterator.py +84 -0
  97. judgeval/utils/wrappers/immutable_wrap_sync.py +66 -0
  98. judgeval/utils/wrappers/immutable_wrap_sync_iterator.py +84 -0
  99. judgeval/utils/wrappers/mutable_wrap_async.py +67 -0
  100. judgeval/utils/wrappers/mutable_wrap_sync.py +67 -0
  101. judgeval/utils/wrappers/py.typed +0 -0
  102. judgeval/utils/wrappers/utils.py +35 -0
  103. judgeval/v1/__init__.py +88 -0
  104. judgeval/v1/data/__init__.py +7 -0
  105. judgeval/v1/data/example.py +44 -0
  106. judgeval/v1/data/scorer_data.py +42 -0
  107. judgeval/v1/data/scoring_result.py +44 -0
  108. judgeval/v1/datasets/__init__.py +6 -0
  109. judgeval/v1/datasets/dataset.py +214 -0
  110. judgeval/v1/datasets/dataset_factory.py +94 -0
  111. judgeval/v1/evaluation/__init__.py +6 -0
  112. judgeval/v1/evaluation/evaluation.py +182 -0
  113. judgeval/v1/evaluation/evaluation_factory.py +17 -0
  114. judgeval/v1/instrumentation/__init__.py +6 -0
  115. judgeval/v1/instrumentation/llm/__init__.py +7 -0
  116. judgeval/v1/instrumentation/llm/config.py +78 -0
  117. judgeval/v1/instrumentation/llm/constants.py +11 -0
  118. judgeval/v1/instrumentation/llm/llm_anthropic/__init__.py +5 -0
  119. judgeval/v1/instrumentation/llm/llm_anthropic/config.py +6 -0
  120. judgeval/v1/instrumentation/llm/llm_anthropic/messages.py +414 -0
  121. judgeval/v1/instrumentation/llm/llm_anthropic/messages_stream.py +307 -0
  122. judgeval/v1/instrumentation/llm/llm_anthropic/wrapper.py +61 -0
  123. judgeval/v1/instrumentation/llm/llm_google/__init__.py +5 -0
  124. judgeval/v1/instrumentation/llm/llm_google/config.py +6 -0
  125. judgeval/v1/instrumentation/llm/llm_google/generate_content.py +121 -0
  126. judgeval/v1/instrumentation/llm/llm_google/wrapper.py +30 -0
  127. judgeval/v1/instrumentation/llm/llm_openai/__init__.py +5 -0
  128. judgeval/v1/instrumentation/llm/llm_openai/beta_chat_completions.py +212 -0
  129. judgeval/v1/instrumentation/llm/llm_openai/chat_completions.py +477 -0
  130. judgeval/v1/instrumentation/llm/llm_openai/config.py +6 -0
  131. judgeval/v1/instrumentation/llm/llm_openai/responses.py +472 -0
  132. judgeval/v1/instrumentation/llm/llm_openai/utils.py +41 -0
  133. judgeval/v1/instrumentation/llm/llm_openai/wrapper.py +63 -0
  134. judgeval/v1/instrumentation/llm/llm_together/__init__.py +5 -0
  135. judgeval/v1/instrumentation/llm/llm_together/chat_completions.py +382 -0
  136. judgeval/v1/instrumentation/llm/llm_together/config.py +6 -0
  137. judgeval/v1/instrumentation/llm/llm_together/wrapper.py +57 -0
  138. judgeval/v1/instrumentation/llm/providers.py +19 -0
  139. judgeval/v1/integrations/claude_agent_sdk/__init__.py +119 -0
  140. judgeval/v1/integrations/claude_agent_sdk/wrapper.py +564 -0
  141. judgeval/v1/integrations/langgraph/__init__.py +13 -0
  142. judgeval/v1/integrations/openlit/__init__.py +47 -0
  143. judgeval/v1/internal/api/__init__.py +525 -0
  144. judgeval/v1/internal/api/api_types.py +413 -0
  145. judgeval/v1/prompts/__init__.py +6 -0
  146. judgeval/v1/prompts/prompt.py +29 -0
  147. judgeval/v1/prompts/prompt_factory.py +189 -0
  148. judgeval/v1/py.typed +0 -0
  149. judgeval/v1/scorers/__init__.py +6 -0
  150. judgeval/v1/scorers/api_scorer.py +82 -0
  151. judgeval/v1/scorers/base_scorer.py +17 -0
  152. judgeval/v1/scorers/built_in/__init__.py +17 -0
  153. judgeval/v1/scorers/built_in/answer_correctness.py +28 -0
  154. judgeval/v1/scorers/built_in/answer_relevancy.py +28 -0
  155. judgeval/v1/scorers/built_in/built_in_factory.py +26 -0
  156. judgeval/v1/scorers/built_in/faithfulness.py +28 -0
  157. judgeval/v1/scorers/built_in/instruction_adherence.py +28 -0
  158. judgeval/v1/scorers/custom_scorer/__init__.py +6 -0
  159. judgeval/v1/scorers/custom_scorer/custom_scorer.py +50 -0
  160. judgeval/v1/scorers/custom_scorer/custom_scorer_factory.py +16 -0
  161. judgeval/v1/scorers/prompt_scorer/__init__.py +6 -0
  162. judgeval/v1/scorers/prompt_scorer/prompt_scorer.py +86 -0
  163. judgeval/v1/scorers/prompt_scorer/prompt_scorer_factory.py +85 -0
  164. judgeval/v1/scorers/scorers_factory.py +49 -0
  165. judgeval/v1/tracer/__init__.py +7 -0
  166. judgeval/v1/tracer/base_tracer.py +520 -0
  167. judgeval/v1/tracer/exporters/__init__.py +14 -0
  168. judgeval/v1/tracer/exporters/in_memory_span_exporter.py +25 -0
  169. judgeval/v1/tracer/exporters/judgment_span_exporter.py +42 -0
  170. judgeval/v1/tracer/exporters/noop_span_exporter.py +19 -0
  171. judgeval/v1/tracer/exporters/span_store.py +50 -0
  172. judgeval/v1/tracer/judgment_tracer_provider.py +70 -0
  173. judgeval/v1/tracer/processors/__init__.py +6 -0
  174. judgeval/v1/tracer/processors/_lifecycles/__init__.py +28 -0
  175. judgeval/v1/tracer/processors/_lifecycles/agent_id_processor.py +53 -0
  176. judgeval/v1/tracer/processors/_lifecycles/context_keys.py +11 -0
  177. judgeval/v1/tracer/processors/_lifecycles/customer_id_processor.py +29 -0
  178. judgeval/v1/tracer/processors/_lifecycles/registry.py +18 -0
  179. judgeval/v1/tracer/processors/judgment_span_processor.py +165 -0
  180. judgeval/v1/tracer/processors/noop_span_processor.py +42 -0
  181. judgeval/v1/tracer/tracer.py +67 -0
  182. judgeval/v1/tracer/tracer_factory.py +38 -0
  183. judgeval/v1/trainers/__init__.py +5 -0
  184. judgeval/v1/trainers/base_trainer.py +62 -0
  185. judgeval/v1/trainers/config.py +123 -0
  186. judgeval/v1/trainers/console.py +144 -0
  187. judgeval/v1/trainers/fireworks_trainer.py +392 -0
  188. judgeval/v1/trainers/trainable_model.py +252 -0
  189. judgeval/v1/trainers/trainers_factory.py +37 -0
  190. judgeval/v1/utils.py +18 -0
  191. judgeval/version.py +5 -0
  192. judgeval/warnings.py +4 -0
  193. judgeval-0.23.0.dist-info/METADATA +266 -0
  194. judgeval-0.23.0.dist-info/RECORD +201 -0
  195. judgeval-0.23.0.dist-info/entry_points.txt +2 -0
  196. judgeval/clients.py +0 -34
  197. judgeval/common/__init__.py +0 -13
  198. judgeval/common/api/__init__.py +0 -3
  199. judgeval/common/api/api.py +0 -352
  200. judgeval/common/api/constants.py +0 -165
  201. judgeval/common/exceptions.py +0 -27
  202. judgeval/common/storage/__init__.py +0 -6
  203. judgeval/common/storage/s3_storage.py +0 -98
  204. judgeval/common/tracer/__init__.py +0 -31
  205. judgeval/common/tracer/constants.py +0 -22
  206. judgeval/common/tracer/core.py +0 -1916
  207. judgeval/common/tracer/otel_exporter.py +0 -108
  208. judgeval/common/tracer/otel_span_processor.py +0 -234
  209. judgeval/common/tracer/span_processor.py +0 -37
  210. judgeval/common/tracer/span_transformer.py +0 -211
  211. judgeval/common/tracer/trace_manager.py +0 -92
  212. judgeval/common/utils.py +0 -940
  213. judgeval/data/datasets/__init__.py +0 -4
  214. judgeval/data/datasets/dataset.py +0 -341
  215. judgeval/data/datasets/eval_dataset_client.py +0 -214
  216. judgeval/data/tool.py +0 -5
  217. judgeval/data/trace_run.py +0 -37
  218. judgeval/evaluation_run.py +0 -75
  219. judgeval/integrations/langgraph.py +0 -843
  220. judgeval/judges/mixture_of_judges.py +0 -286
  221. judgeval/judgment_client.py +0 -369
  222. judgeval/rules.py +0 -521
  223. judgeval/run_evaluation.py +0 -684
  224. judgeval/scorers/judgeval_scorers/api_scorers/derailment_scorer.py +0 -14
  225. judgeval/scorers/judgeval_scorers/api_scorers/execution_order.py +0 -52
  226. judgeval/scorers/judgeval_scorers/api_scorers/hallucination.py +0 -28
  227. judgeval/scorers/judgeval_scorers/api_scorers/tool_dependency.py +0 -20
  228. judgeval/scorers/judgeval_scorers/api_scorers/tool_order.py +0 -27
  229. judgeval/utils/alerts.py +0 -93
  230. judgeval/utils/requests.py +0 -50
  231. judgeval-0.1.0.dist-info/METADATA +0 -202
  232. judgeval-0.1.0.dist-info/RECORD +0 -73
  233. {judgeval-0.1.0.dist-info → judgeval-0.23.0.dist-info}/WHEEL +0 -0
  234. {judgeval-0.1.0.dist-info → judgeval-0.23.0.dist-info}/licenses/LICENSE.md +0 -0
@@ -1,52 +0,0 @@
1
- """
2
- `judgeval` tool correctness scorer
3
-
4
- TODO add link to docs page for this scorer
5
-
6
- """
7
-
8
- # Internal imports
9
- from judgeval.scorers.api_scorer import APIScorerConfig
10
- from judgeval.constants import APIScorerType
11
- from typing import Optional, Dict
12
- from judgeval.data import ExampleParams
13
-
14
-
15
- class ExecutionOrderScorer(APIScorerConfig):
16
- kwargs: Optional[Dict] = None
17
-
18
- def __init__(
19
- self,
20
- threshold: float,
21
- should_exact_match: bool = False,
22
- should_consider_ordering: bool = False,
23
- ):
24
- super().__init__(
25
- threshold=threshold,
26
- score_type=APIScorerType.EXECUTION_ORDER,
27
- required_params=[
28
- ExampleParams.ACTUAL_OUTPUT,
29
- ExampleParams.EXPECTED_OUTPUT,
30
- ],
31
- )
32
- self.kwargs = {
33
- "should_exact_match": should_exact_match,
34
- "should_consider_ordering": should_consider_ordering,
35
- }
36
-
37
- @property
38
- def __name__(self):
39
- return "Execution Order"
40
-
41
- def to_dict(self) -> dict:
42
- """
43
- Converts the scorer configuration to a dictionary format.
44
-
45
- Returns:
46
- dict: A dictionary containing the scorer's configuration
47
- """
48
- return {
49
- "score_type": self.score_type,
50
- "threshold": self.threshold,
51
- "kwargs": self.kwargs,
52
- }
@@ -1,28 +0,0 @@
1
- """
2
- `judgeval` hallucination scorer
3
-
4
- TODO add link to docs page for this scorer
5
-
6
- """
7
-
8
- # Internal imports
9
- from judgeval.scorers.api_scorer import APIScorerConfig
10
- from judgeval.constants import APIScorerType
11
- from judgeval.data import ExampleParams
12
-
13
-
14
- class HallucinationScorer(APIScorerConfig):
15
- def __init__(self, threshold: float):
16
- super().__init__(
17
- threshold=threshold,
18
- score_type=APIScorerType.HALLUCINATION,
19
- required_params=[
20
- ExampleParams.INPUT,
21
- ExampleParams.ACTUAL_OUTPUT,
22
- ExampleParams.CONTEXT,
23
- ],
24
- )
25
-
26
- @property
27
- def __name__(self):
28
- return "Hallucination"
@@ -1,20 +0,0 @@
1
- """
2
- `judgeval` tool dependency scorer
3
- """
4
-
5
- # Internal imports
6
- from judgeval.scorers.api_scorer import APIScorerConfig
7
- from judgeval.constants import APIScorerType
8
- from typing import Optional, Dict
9
-
10
-
11
- class ToolDependencyScorer(APIScorerConfig):
12
- kwargs: Optional[Dict] = None
13
-
14
- def __init__(self, threshold: float = 1.0, enable_param_checking: bool = True):
15
- super().__init__(threshold=threshold, score_type=APIScorerType.TOOL_DEPENDENCY)
16
- self.kwargs = {"enable_param_checking": enable_param_checking}
17
-
18
- @property
19
- def __name__(self):
20
- return "Tool Dependency"
@@ -1,27 +0,0 @@
1
- """
2
- `judgeval` tool order scorer
3
- """
4
-
5
- # Internal imports
6
- from judgeval.scorers.api_scorer import APIScorerConfig
7
- from judgeval.constants import APIScorerType
8
- from typing import Dict, Any
9
-
10
-
11
- class ToolOrderScorer(APIScorerConfig):
12
- score_type: APIScorerType = APIScorerType.TOOL_ORDER
13
- threshold: float = 1.0
14
- exact_match: bool = False
15
-
16
- def model_dump(self, *args, **kwargs) -> Dict[str, Any]:
17
- base = super().model_dump(*args, **kwargs)
18
- base_fields = set(APIScorerConfig.model_fields.keys())
19
- all_fields = set(self.__class__.model_fields.keys())
20
-
21
- extra_fields = all_fields - base_fields - {"kwargs"}
22
-
23
- base["kwargs"] = {
24
- k: getattr(self, k) for k in extra_fields if getattr(self, k) is not None
25
- }
26
-
27
- return base
judgeval/utils/alerts.py DELETED
@@ -1,93 +0,0 @@
1
- """
2
- Handling alerts in Judgeval.
3
- """
4
-
5
- from enum import Enum
6
- from typing import Dict, Any, List, Optional
7
- from pydantic import BaseModel
8
-
9
-
10
- class AlertStatus(str, Enum):
11
- """Status of an alert evaluation."""
12
-
13
- TRIGGERED = "triggered"
14
- NOT_TRIGGERED = "not_triggered"
15
-
16
-
17
- class AlertResult(BaseModel):
18
- """
19
- Result of a rule evaluation.
20
-
21
- Attributes:
22
- rule_name: Name of the rule that was evaluated
23
- rule_id: Unique identifier of the rule
24
- status: Status of the alert (triggered or not)
25
- conditions_result: List of condition evaluation results
26
- metadata: Dictionary containing example_id, timestamp, and other metadata
27
- notification: Optional notification configuration for triggered alerts
28
- combine_type: The combination type used ("all" or "any")
29
- project_id: Optional project identifier
30
- trace_span_id: Optional trace span identifier
31
- """
32
-
33
- rule_name: str
34
- rule_id: Optional[str] = None # The unique identifier of the rule
35
- status: AlertStatus
36
- conditions_result: List[Dict[str, Any]] = []
37
- metadata: Dict[str, Any] = {}
38
- notification: Optional[Any] = (
39
- None # NotificationConfig when triggered, None otherwise
40
- )
41
- combine_type: Optional[str] = None # "all" or "any"
42
- project_id: Optional[str] = None # Project identifier
43
- trace_span_id: Optional[str] = None # Trace span identifier
44
-
45
- @property
46
- def example_id(self) -> Optional[str]:
47
- """Get example_id from metadata for backward compatibility"""
48
- return self.metadata.get("example_id")
49
-
50
- @property
51
- def timestamp(self) -> Optional[str]:
52
- """Get timestamp from metadata for backward compatibility"""
53
- return self.metadata.get("timestamp")
54
-
55
- @property
56
- def conditions_results(self) -> List[Dict[str, Any]]:
57
- """Backwards compatibility property for the conditions_result field"""
58
- return self.conditions_result
59
-
60
- def model_dump(self, **kwargs):
61
- """
62
- Convert the AlertResult to a dictionary for JSON serialization.
63
-
64
- Args:
65
- **kwargs: Additional arguments to pass to Pydantic's model_dump
66
-
67
- Returns:
68
- dict: Dictionary representation of the AlertResult
69
- """
70
- data = (
71
- super().model_dump(**kwargs)
72
- if hasattr(super(), "model_dump")
73
- else super().dict(**kwargs)
74
- )
75
-
76
- # Handle the NotificationConfig object if it exists
77
- if hasattr(self, "notification") and self.notification is not None:
78
- if hasattr(self.notification, "model_dump"):
79
- data["notification"] = self.notification.model_dump()
80
- elif hasattr(self.notification, "dict"):
81
- data["notification"] = self.notification.dict()
82
- else:
83
- # Manually convert the notification to a dictionary
84
- notif = self.notification
85
- data["notification"] = {
86
- "enabled": notif.enabled,
87
- "communication_methods": notif.communication_methods,
88
- "email_addresses": notif.email_addresses,
89
- "slack_channels": getattr(notif, "slack_channels", []),
90
- "send_at": notif.send_at,
91
- }
92
-
93
- return data
@@ -1,50 +0,0 @@
1
- import requests as requests_original
2
- from requests.adapters import HTTPAdapter
3
- from urllib3.util.retry import Retry
4
- from http import HTTPStatus
5
-
6
-
7
- class RetrySession(requests_original.Session):
8
- def __init__(
9
- self,
10
- retries=3,
11
- backoff_factor=0.5,
12
- status_forcelist=[HTTPStatus.BAD_GATEWAY, HTTPStatus.SERVICE_UNAVAILABLE],
13
- default_timeout=(10, 60), # (connect_timeout, read_timeout)
14
- ):
15
- super().__init__()
16
-
17
- # Store default timeout
18
- self.default_timeout = default_timeout
19
-
20
- retry_strategy = Retry(
21
- total=retries,
22
- read=retries,
23
- connect=retries,
24
- backoff_factor=backoff_factor,
25
- status_forcelist=status_forcelist,
26
- )
27
-
28
- adapter = HTTPAdapter(max_retries=retry_strategy)
29
- self.mount("http://", adapter)
30
- self.mount("https://", adapter)
31
-
32
- def request(self, method, url, timeout=None, **kwargs):
33
- """
34
- Override request method to add default timeout if not specified.
35
-
36
- Args:
37
- method: HTTP method
38
- url: Request URL
39
- timeout: Timeout value. If None, uses default_timeout.
40
- Can be a float (total timeout) or tuple (connect, read).
41
- **kwargs: Other request arguments
42
- """
43
- # Use default timeout if none specified
44
- if timeout is None:
45
- timeout = self.default_timeout
46
-
47
- return super().request(method, url, timeout=timeout, **kwargs)
48
-
49
-
50
- requests = RetrySession()
@@ -1,202 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: judgeval
3
- Version: 0.1.0
4
- Summary: Judgeval Package
5
- Project-URL: Homepage, https://github.com/JudgmentLabs/judgeval
6
- Project-URL: Issues, https://github.com/JudgmentLabs/judgeval/issues
7
- Author-email: Andrew Li <andrew@judgmentlabs.ai>, Alex Shan <alex@judgmentlabs.ai>, Joseph Camyre <joseph@judgmentlabs.ai>
8
- License-Expression: Apache-2.0
9
- License-File: LICENSE.md
10
- Classifier: Operating System :: OS Independent
11
- Classifier: Programming Language :: Python :: 3
12
- Requires-Python: >=3.11
13
- Requires-Dist: anthropic
14
- Requires-Dist: boto3
15
- Requires-Dist: datamodel-code-generator>=0.31.1
16
- Requires-Dist: google-genai
17
- Requires-Dist: langchain-anthropic
18
- Requires-Dist: langchain-core
19
- Requires-Dist: langchain-huggingface
20
- Requires-Dist: langchain-openai
21
- Requires-Dist: litellm>=1.61.15
22
- Requires-Dist: matplotlib>=3.10.3
23
- Requires-Dist: nest-asyncio
24
- Requires-Dist: openai
25
- Requires-Dist: pandas
26
- Requires-Dist: python-dotenv==1.0.1
27
- Requires-Dist: python-slugify>=8.0.4
28
- Requires-Dist: requests
29
- Requires-Dist: together
30
- Description-Content-Type: text/markdown
31
-
32
- <div align="center">
33
-
34
- <img src="assets/new_lightmode.svg#gh-light-mode-only" alt="Judgment Logo" width="400" />
35
- <img src="assets/new_darkmode.svg#gh-dark-mode-only" alt="Judgment Logo" width="400" />
36
-
37
- <br>
38
- <div style="font-size: 1.5em;">
39
- Enable self-learning agents with traces, evals, and environment data.
40
- </div>
41
-
42
- ## [Docs](https://docs.judgmentlabs.ai/) • [Judgment Cloud](https://app.judgmentlabs.ai/register) • [Self-Host](https://docs.judgmentlabs.ai/documentation/self-hosting/get-started)
43
-
44
- [Demo](https://www.youtube.com/watch?v=1S4LixpVbcc) • [Bug Reports](https://github.com/JudgmentLabs/judgeval/issues) • [Changelog](https://docs.judgmentlabs.ai/changelog/2025-04-21)
45
-
46
- We're hiring! Join us in our mission to enable self-learning agents by providing the data and signals needed for monitoring and post-training.
47
-
48
- [![X](https://img.shields.io/badge/-X/Twitter-000?logo=x&logoColor=white)](https://x.com/JudgmentLabs)
49
- [![LinkedIn](https://custom-icon-badges.demolab.com/badge/LinkedIn%20-0A66C2?logo=linkedin-white&logoColor=fff)](https://www.linkedin.com/company/judgmentlabs)
50
- [![Discord](https://img.shields.io/badge/-Discord-5865F2?logo=discord&logoColor=white)](https://discord.gg/tGVFf8UBUY)
51
-
52
- <img src="assets/product_shot.png" alt="Judgment Platform" width="800" />
53
-
54
- </div>
55
-
56
- Judgeval offers **open-source tooling** for tracing and evaluating autonomous, stateful agents. It **provides runtime data from agent-environment interactions** for continuous learning and self-improvement.
57
-
58
- ## 🎬 See Judgeval in Action
59
-
60
- **[Multi-Agent System](https://github.com/JudgmentLabs/judgment-cookbook/tree/main/cookbooks/agents/multi-agent) with complete observability:** (1) A multi-agent system spawns agents to research topics on the internet. (2) With just **3 lines of code**, Judgeval traces every input/output + environment response across all agent tool calls for debugging. (3) After completion, (4) export all interaction data to enable further environment-specific learning and optimization.
61
-
62
- <table style="width: 100%; max-width: 800px; table-layout: fixed;">
63
- <tr>
64
- <td align="center" style="padding: 8px; width: 50%;">
65
- <img src="assets/agent.gif" alt="Agent Demo" style="width: 100%; max-width: 350px; height: auto;" />
66
- <br><strong>🤖 Agents Running</strong>
67
- </td>
68
- <td align="center" style="padding: 8px; width: 50%;">
69
- <img src="assets/trace.gif" alt="Trace Demo" style="width: 100%; max-width: 350px; height: auto;" />
70
- <br><strong>📊 Real-time Tracing</strong>
71
- </td>
72
- </tr>
73
- <tr>
74
- <td align="center" style="padding: 8px; width: 50%;">
75
- <img src="assets/document.gif" alt="Agent Completed Demo" style="width: 100%; max-width: 350px; height: auto;" />
76
- <br><strong>✅ Agents Completed Running</strong>
77
- </td>
78
- <td align="center" style="padding: 8px; width: 50%;">
79
- <img src="assets/data.gif" alt="Data Export Demo" style="width: 100%; max-width: 350px; height: auto;" />
80
- <br><strong>📤 Exporting Agent Environment Data</strong>
81
- </td>
82
- </tr>
83
-
84
- </table>
85
-
86
- ## 📋 Table of Contents
87
- - [🛠️ Installation](#️-installation)
88
- - [🏁 Quickstarts](#-quickstarts)
89
- - [✨ Features](#-features)
90
- - [🏢 Self-Hosting](#-self-hosting)
91
- - [📚 Cookbooks](#-cookbooks)
92
- - [💻 Development with Cursor](#-development-with-cursor)
93
-
94
- ## 🛠️ Installation
95
-
96
- Get started with Judgeval by installing our SDK using pip:
97
-
98
- ```bash
99
- pip install judgeval
100
- ```
101
-
102
- Ensure you have your `JUDGMENT_API_KEY` and `JUDGMENT_ORG_ID` environment variables set to connect to the [Judgment Platform](https://app.judgmentlabs.ai/).
103
-
104
- ```bash
105
- export JUDGMENT_API_KEY=...
106
- export JUDGMENT_ORG_ID=...
107
- ```
108
-
109
- **If you don't have keys, [create an account](https://app.judgmentlabs.ai/register) on the platform!**
110
-
111
- ## 🏁 Quickstarts
112
-
113
- ### 🛰️ Tracing
114
-
115
- Create a file named `agent.py` with the following code:
116
-
117
- ```python
118
- from judgeval.tracer import Tracer, wrap
119
- from openai import OpenAI
120
-
121
- client = wrap(OpenAI()) # tracks all LLM calls
122
- judgment = Tracer(project_name="my_project")
123
-
124
- @judgment.observe(span_type="tool")
125
- def format_question(question: str) -> str:
126
- # dummy tool
127
- return f"Question : {question}"
128
-
129
- @judgment.observe(span_type="function")
130
- def run_agent(prompt: str) -> str:
131
- task = format_question(prompt)
132
- response = client.chat.completions.create(
133
- model="gpt-4.1",
134
- messages=[{"role": "user", "content": task}]
135
- )
136
- return response.choices[0].message.content
137
-
138
- run_agent("What is the capital of the United States?")
139
- ```
140
- You'll see your trace exported to the Judgment Platform:
141
-
142
- <p align="center"><img src="assets/trace_demo.png" alt="Judgment Platform Trace Example" width="800" /></p>
143
-
144
-
145
- [Click here](https://docs.judgmentlabs.ai/documentation/tracing/introduction) for a more detailed explanation.
146
-
147
-
148
- <!-- Created by https://github.com/ekalinin/github-markdown-toc -->
149
-
150
-
151
- ## ✨ Features
152
-
153
- | | |
154
- |:---|:---:|
155
- | <h3>🔍 Tracing</h3>Automatic agent tracing integrated with common frameworks (LangGraph, OpenAI, Anthropic). **Tracks inputs/outputs, agent tool calls, latency, cost, and custom metadata** at every step.<br><br>**Useful for:**<br>• 🐛 Debugging agent runs <br>• 📋 Collecting agent environment data <br>• 🔬 Pinpointing performance bottlenecks| <p align="center"><img src="assets/trace_screenshot.png" alt="Tracing visualization" width="1200"/></p> |
156
- | <h3>🧪 Evals</h3>Build custom evaluators on top of your agents. Judgeval supports LLM-as-a-judge, manual labeling, and code-based evaluators that connect with our metric-tracking infrastructure. <br><br>**Useful for:**<br>• ⚠️ Unit-testing <br>• 🔬 A/B testing <br>• 🛡️ Online guardrails | <p align="center"><img src="assets/experiments_page.png" alt="Evaluation metrics" width="800"/></p> |
157
- | <h3>📡 Monitoring</h3>Get Slack alerts for agent failures in production. Add custom hooks to address production regressions.<br><br> **Useful for:** <br>• 📉 Identifying degradation early <br>• 📈 Visualizing performance trends across agent versions and time | <p align="center"><img src="assets/error_analysis_dashboard.png" alt="Monitoring Dashboard" width="1200"/></p> |
158
- | <h3>📊 Datasets</h3>Export traces and test cases to datasets for scaled analysis and optimization. Move datasets to/from Parquet, S3, etc. <br><br>Run evals on datasets as unit tests or to A/B test different agent configurations, enabling continuous learning from production interactions. <br><br> **Useful for:**<br>• 🗃️ Agent environment interaction data for optimization<br>• 🔄 Scaled analysis for A/B tests | <p align="center"><img src="assets/datasets_preview_screenshot.png" alt="Dataset management" width="1200"/></p> |
159
-
160
- ## 🏢 Self-Hosting
161
-
162
- Run Judgment on your own infrastructure: we provide comprehensive self-hosting capabilities that give you full control over the backend and data plane that Judgeval interfaces with.
163
-
164
- ### Key Features
165
- * Deploy Judgment on your own AWS account
166
- * Store data in your own Supabase instance
167
- * Access Judgment through your own custom domain
168
-
169
- ### Getting Started
170
- 1. Check out our [self-hosting documentation](https://docs.judgmentlabs.ai/documentation/self-hosting/get-started) for detailed setup instructions, along with how your self-hosted instance can be accessed
171
- 2. Use the [Judgment CLI](https://docs.judgmentlabs.ai/documentation/developer-tools/judgment-cli/installation) to deploy your self-hosted environment
172
- 3. After your self-hosted instance is setup, make sure the `JUDGMENT_API_URL` environmental variable is set to your self-hosted backend endpoint
173
-
174
- ## 📚 Cookbooks
175
-
176
- Have your own? We're happy to feature it if you create a PR or message us on [Discord](https://discord.gg/tGVFf8UBUY).
177
-
178
- You can access our repo of cookbooks [here](https://github.com/JudgmentLabs/judgment-cookbook).
179
-
180
- ## 💻 Development with Cursor
181
- Building agents and LLM workflows in Cursor works best when your coding assistant has the proper context about Judgment integration. The Cursor rules file contains the key information needed for your assistant to implement Judgment features effectively.
182
-
183
- Refer to the official [documentation](https://docs.judgmentlabs.ai/documentation/developer-tools/cursor/cursor-rules) for access to the rules file and more information on integrating this rules file with your codebase.
184
-
185
- ## ⭐ Star Us on GitHub
186
-
187
- If you find Judgeval useful, please consider giving us a star on GitHub! Your support helps us grow our community and continue improving the repository.
188
-
189
- ## ❤️ Contributors
190
-
191
- There are many ways to contribute to Judgeval:
192
-
193
- - Submit [bug reports](https://github.com/JudgmentLabs/judgeval/issues) and [feature requests](https://github.com/JudgmentLabs/judgeval/issues)
194
- - Review the documentation and submit [Pull Requests](https://github.com/JudgmentLabs/judgeval/pulls) to improve it
195
- - Speaking or writing about Judgment and letting us know!
196
-
197
- <!-- Contributors collage -->
198
- [![Contributors](https://contributors-img.web.app/image?repo=JudgmentLabs/judgeval)](https://github.com/JudgmentLabs/judgeval/graphs/contributors)
199
-
200
- ---
201
-
202
- Judgeval is created and maintained by [Judgment Labs](https://judgmentlabs.ai/).
@@ -1,73 +0,0 @@
1
- judgeval/__init__.py,sha256=HM1M8hmqRum6G554QKkXhB4DF4f5eh_xtYo0Kf-t3kw,332
2
- judgeval/clients.py,sha256=JnB8n90GyXiYaGmSEYaA67mdJSnr3SIrzArao7NGebw,980
3
- judgeval/constants.py,sha256=rfl4gW9_4irxgamjTC-jvDj2ATSUrjEu0UAHZ4pLLtY,4081
4
- judgeval/evaluation_run.py,sha256=PZeoKS7JCsO2gzdo8jeq8786yn01Ccrq0xuCNUu9CPo,2797
5
- judgeval/judgment_client.py,sha256=tUgKS2sV8QZUxjdh3mP2PSBnC7Bci1e8ur8muvrgzBM,14011
6
- judgeval/rules.py,sha256=CoQjqmP8daEXewMkplmA-7urubDtweOr5O6z8klVwLI,20031
7
- judgeval/run_evaluation.py,sha256=U-aZyhSryjqzJl5jInc91uY8jIyiY596S6JJO3fH6AI,26105
8
- judgeval/version_check.py,sha256=FoLEtpCjDw2HuDQdpw5yT29UtwumSc6ZZN6AV_c9Mnw,1057
9
- judgeval/common/__init__.py,sha256=KH-QJyWtQ60R6yFIBDYS3WGRiNpEu1guynpxivZvpBQ,309
10
- judgeval/common/exceptions.py,sha256=OkgDznu2wpBQZMXiZarLJYNk1HIcC8qYW7VypDC3Ook,556
11
- judgeval/common/logger.py,sha256=514eFLYWS_UL8VY-zAR2ePUlpQe4rbYlleLASFllLE4,1511
12
- judgeval/common/utils.py,sha256=GhCEv8i_7JK4DJeUlMmibqEUy9ZVHxJAlFO_CriAzg4,34323
13
- judgeval/common/api/__init__.py,sha256=-E7lpZz1fG8puR_aYUMfPmQ-Vyhd0bgzoaU5EhIuFjQ,114
14
- judgeval/common/api/api.py,sha256=BGtAGGRDqxs8DrA0ye8BPZ6KBsgJ2C0Dca4vvA55d6g,13049
15
- judgeval/common/api/constants.py,sha256=azA0eyz4q33SWS795NHhaKDKNmVHBWAAGe5_sk37nDU,4297
16
- judgeval/common/storage/__init__.py,sha256=a-PI7OL-ydyzugGUKmJKRBASnK-Q-gs82L9K9rSyJP8,90
17
- judgeval/common/storage/s3_storage.py,sha256=UvAKGSa0S1BnNprzDKHMAfyT-8zlMAOM5kCrXcVN0HE,3743
18
- judgeval/common/tracer/__init__.py,sha256=tJCJsmVmrL89Phv88gNCJ-j0ITPez6lh8vhMAAlLNSc,795
19
- judgeval/common/tracer/constants.py,sha256=yu5y8gMe5yb1AaBkPtAH-BNwIaAR3NwYCRoSf45wp5U,621
20
- judgeval/common/tracer/core.py,sha256=Ij-KDD3dVXHK_6NPk-VbTH_Mo8GZq5h4Zl5ii5QMjnE,72403
21
- judgeval/common/tracer/otel_exporter.py,sha256=kZLlOQ6afQE4dmb9H1wgU4P3H5PG1D_zKyvnpWcT5Ak,3899
22
- judgeval/common/tracer/otel_span_processor.py,sha256=3cMETvrNlwrTkS_XDdTNRhjVw_6TdgnojpQhDK9sbOs,7484
23
- judgeval/common/tracer/span_processor.py,sha256=eFjTgSWSkM6BWE94CrvgafDg_WkxLsFL_MafwBG-p9M,1145
24
- judgeval/common/tracer/span_transformer.py,sha256=YIHEmr35o6_uX931JbD1PFIcLIWTVumWrJ198Ys391k,7544
25
- judgeval/common/tracer/trace_manager.py,sha256=7KLWBrz5GE_138DHL_eRjhx4-LNfXKz1q_XIDfg6nw8,2992
26
- judgeval/data/__init__.py,sha256=1QagDcSQtfnJ632t9Dnq8d7XjAqhmY4mInOWt8qH9tM,455
27
- judgeval/data/example.py,sha256=6xtPTwWUsZ0HdErU-g954nCv64fsbnS1I5xuEvs14EA,2027
28
- judgeval/data/judgment_types.py,sha256=s1oea01AEBQBdqQntXhTbMiuDGAxvs2iGoxrR2uLnUw,9538
29
- judgeval/data/result.py,sha256=hHKiMMEl9Qv3EvK5UH8Y5YDu8VyvrHzNqlKatrq4UUY,2450
30
- judgeval/data/scorer_data.py,sha256=5QBHtvOIWOq0Rn9_uPJzAMRYMlWxMB-rXnG_6kV4Z4Y,2955
31
- judgeval/data/tool.py,sha256=iWQSdy5uNbIeACu3gQy1DC2oGYxRVYNfkkczWdQMAiA,99
32
- judgeval/data/trace.py,sha256=_cyCsyg2gwG7lyyv186xo4OvGH2QlJDuyIg-qh-CZNA,6994
33
- judgeval/data/trace_run.py,sha256=c6pRSv09Vj016hxM49I3kMftCwWg8hhkfT_1kBXluSI,1600
34
- judgeval/data/datasets/__init__.py,sha256=IdNKhQv9yYZ_op0rdBacrFaFVmiiYQ3JTzXzxOTsEVQ,176
35
- judgeval/data/datasets/dataset.py,sha256=dDmTYSBRj4YEUhgYOebAcDm4N14nj3tcCqHj9y2Z1z0,12725
36
- judgeval/data/datasets/eval_dataset_client.py,sha256=8tiuwRC3oebc19KY-5b99Cxj0qq6ADW1NMDd1R1RhLc,7258
37
- judgeval/data/scripts/fix_default_factory.py,sha256=lvp2JwYZqz-XpD9LZNa3mANZVP-jJSZoNzolI6JWERM,591
38
- judgeval/data/scripts/openapi_transform.py,sha256=Rye-fErFtENAq3KKBKRUVR_oJdjYZtNzKRBKFkYS0XQ,3857
39
- judgeval/integrations/langgraph.py,sha256=kJXLsgBY7DgsUTZyVQ47deDgHm887brFHfyIbuyerGw,29986
40
- judgeval/judges/__init__.py,sha256=6X7VSwrwsdxGBNxCyapVRWGghhKOy3MVxFNMQ62kCXM,308
41
- judgeval/judges/base_judge.py,sha256=_dz0qWsKRxzXxpRY9l6mrxTRYPSF2FE4ZXkrzhZ4gbY,986
42
- judgeval/judges/litellm_judge.py,sha256=LX4_KXb1Jp8IXif3vvOiKfRYH7ZkbQLs9AtWPGmj544,2483
43
- judgeval/judges/mixture_of_judges.py,sha256=wcHwLi9zU0uwKMqRVhcPdjiYKgWflX4dpUbU2kS9yg0,14825
44
- judgeval/judges/together_judge.py,sha256=r5k8ZcC6lnsFttGHhrocFtmglx2Cb3G-4ORKAeK-Nmw,2253
45
- judgeval/judges/utils.py,sha256=0CF9qtIUQUL3-W-qTGpmTjZbkUUBAM6TslDsrCHnTBU,2725
46
- judgeval/scorers/__init__.py,sha256=4H_cinTQ4EogZv59YEV-3U9EOTLppNwgAPTi1-jI9Fw,746
47
- judgeval/scorers/agent_scorer.py,sha256=TjwD_YglSywr3EowEojiCyg5qDgCRa5LRGc5nFdmIBc,703
48
- judgeval/scorers/api_scorer.py,sha256=xlhqkeMUBFxl8daSXOTWOYwZjBAz7o6b4sVD5f8cIHw,2523
49
- judgeval/scorers/base_scorer.py,sha256=eDfQk8N8TQfM1ayJDWr0NTdSQxcbk9-VZHd0Igb9EbI,2878
50
- judgeval/scorers/example_scorer.py,sha256=2n45y3LMV1Q-ARyXLHqvVWETlnY1DqS7OLzPu9IBGz8,716
51
- judgeval/scorers/exceptions.py,sha256=ACDHK5-TWiF3NTk-wycaedpbrdobm-CvvC1JA_iP-Mk,179
52
- judgeval/scorers/score.py,sha256=t9prkpDapcOAyuOXtDHMmwrqVGW0C_Hvx1UIEGyafmI,6610
53
- judgeval/scorers/utils.py,sha256=WM7mTCQSa2Z_rJ-0Iv9dhuBmtkTfV0pFN7XEhxHdzsM,3959
54
- judgeval/scorers/judgeval_scorers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- judgeval/scorers/judgeval_scorers/api_scorers/__init__.py,sha256=GX4KkwPR2p-c0Y5mZingJa8EUfjAbMGhrmRBDBunOGw,1484
56
- judgeval/scorers/judgeval_scorers/api_scorers/answer_correctness.py,sha256=zJsU0VrUmRhY9qav48c6jTyDqUwI3JzhV9ajtlJCe0M,544
57
- judgeval/scorers/judgeval_scorers/api_scorers/answer_relevancy.py,sha256=UDfzTO9Fx0FA5o0wfD8kprrGA4eW-43Rn9Gc0BQtKgY,393
58
- judgeval/scorers/judgeval_scorers/api_scorers/derailment_scorer.py,sha256=mbBvirNcivu9dP6deM7FogDXrdwI9o8yqsO8IeKPSb4,309
59
- judgeval/scorers/judgeval_scorers/api_scorers/execution_order.py,sha256=NABO_iBdkOo3fdPVcoWfUkeN-FTX3t3-bErMjdqBXdk,1361
60
- judgeval/scorers/judgeval_scorers/api_scorers/faithfulness.py,sha256=ps51bTgQsD9xGYsk1v9bx0WxQMqywSllCE9_xlJkLd8,531
61
- judgeval/scorers/judgeval_scorers/api_scorers/hallucination.py,sha256=SnFLvU4FGsMeUVUp0SGHSy_6wgfwr_vHPGnZx5YJl_Q,691
62
- judgeval/scorers/judgeval_scorers/api_scorers/instruction_adherence.py,sha256=aQzu-TiGqG74JDQ927evv5yGmnZw2AOolyHvlIhiUbI,683
63
- judgeval/scorers/judgeval_scorers/api_scorers/prompt_scorer.py,sha256=TS3uZ6YQfMs2yGCwzlz-yxZ3Rid79MGxEQESZkSX_Vo,7038
64
- judgeval/scorers/judgeval_scorers/api_scorers/tool_dependency.py,sha256=Mcp1CjMNyOax9UkvoRdSyUYdO2Os1-Nko43y89m2Luo,594
65
- judgeval/scorers/judgeval_scorers/api_scorers/tool_order.py,sha256=Z2FLGBC7m_CLx-CMgXVuTvYvN0vY5yOcWA0ImBkeBfY,787
66
- judgeval/tracer/__init__.py,sha256=wkuXtOGDCrwgPPXlh_sSJmvGuWaAMHyNzk1TzB5f9aI,148
67
- judgeval/utils/alerts.py,sha256=3w_AjQrgfmOZvfqCridW8WAnHVxHHXokX9jNzVFyGjA,3297
68
- judgeval/utils/file_utils.py,sha256=wIEn8kjM0WrP216RGU_yhZhFOMWIS5ckigyHbzFSOMk,1774
69
- judgeval/utils/requests.py,sha256=K3gUKrwL6TvwYKVYO5OeLWdUHn9NiUPmnIXhZEiEaHU,1534
70
- judgeval-0.1.0.dist-info/METADATA,sha256=B1v_50ikBR0fiojJY97deNf_VvEZn8fQq9qrxBi38ig,10188
71
- judgeval-0.1.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
72
- judgeval-0.1.0.dist-info/licenses/LICENSE.md,sha256=tKmCg7k5QOmxPK19XMfzim04QiQJPmgIm0pAn55IJwk,11352
73
- judgeval-0.1.0.dist-info/RECORD,,