fiddler-evals 0.1.1.dev2__tar.gz → 0.1.1.dev9__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 (96) hide show
  1. {fiddler_evals-0.1.1.dev2/fiddler_evals.egg-info → fiddler_evals-0.1.1.dev9}/PKG-INFO +2 -2
  2. fiddler_evals-0.1.1.dev9/fiddler_evals/VERSION +1 -0
  3. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/runner/evaluation.py +2 -12
  4. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/runner/experiment_runner.py +71 -1
  5. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9/fiddler_evals.egg-info}/PKG-INFO +2 -2
  6. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/pyproject.toml +4 -2
  7. fiddler_evals-0.1.1.dev2/fiddler_evals/VERSION +0 -1
  8. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/MANIFEST.in +0 -0
  9. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/PUBLIC.md +0 -0
  10. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/README.md +0 -0
  11. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/__init__.py +0 -0
  12. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/configs.py +0 -0
  13. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/conftest.py +0 -0
  14. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/connection.py +0 -0
  15. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/constants.py +0 -0
  16. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/decorators.py +0 -0
  17. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/__init__.py +0 -0
  18. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/application.py +0 -0
  19. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/base.py +0 -0
  20. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/dataset.py +0 -0
  21. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/experiment.py +0 -0
  22. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/project.py +0 -0
  23. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/tests/__init__.py +0 -0
  24. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/tests/test_application.py +0 -0
  25. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/tests/test_dataset.py +0 -0
  26. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/tests/test_dataset_items.py +0 -0
  27. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/tests/test_experiment.py +0 -0
  28. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/tests/test_experiment_items.py +0 -0
  29. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/tests/test_experiment_results.py +0 -0
  30. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/entities/tests/test_project.py +0 -0
  31. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/__init__.py +0 -0
  32. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/answer_relevance.py +0 -0
  33. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/base.py +0 -0
  34. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/coherence.py +0 -0
  35. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/conciseness.py +0 -0
  36. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/eval_fn.py +0 -0
  37. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/ftl_prompt_safety.py +0 -0
  38. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/ftl_response_faithfulness.py +0 -0
  39. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/regex.py +0 -0
  40. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/sentiment.py +0 -0
  41. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/__init__.py +0 -0
  42. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_answer_relevance.py +0 -0
  43. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_coherence.py +0 -0
  44. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_conciseness.py +0 -0
  45. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_eval_fn.py +0 -0
  46. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_ftl_prompt_safety.py +0 -0
  47. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_ftl_response_faithfulness.py +0 -0
  48. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_regex.py +0 -0
  49. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_sentiment.py +0 -0
  50. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_topic_classification.py +0 -0
  51. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/tests/test_toxicity.py +0 -0
  52. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/topic.py +0 -0
  53. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/evaluators/toxicity.py +0 -0
  54. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/exceptions.py +0 -0
  55. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/libs/__init__.py +0 -0
  56. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/libs/http_client.py +0 -0
  57. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/libs/json_encoder.py +0 -0
  58. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/libs/semver.py +0 -0
  59. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/libs/tests/__init__.py +0 -0
  60. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/libs/tests/test_json_encoder.py +0 -0
  61. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/libs/tests/test_request_client.py +0 -0
  62. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/__init__.py +0 -0
  63. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/application.py +0 -0
  64. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/base.py +0 -0
  65. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/compact.py +0 -0
  66. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/dataset.py +0 -0
  67. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/error.py +0 -0
  68. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/evaluator.py +0 -0
  69. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/experiment.py +0 -0
  70. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/filter_query.py +0 -0
  71. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/project.py +0 -0
  72. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/response.py +0 -0
  73. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/score.py +0 -0
  74. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/pydantic_models/server_info.py +0 -0
  75. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/runner/__init__.py +0 -0
  76. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/runner/executor.py +0 -0
  77. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/runner/experiment_result_publisher.py +0 -0
  78. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/runner/tests/__init__.py +0 -0
  79. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/runner/tests/test_evaluate.py +0 -0
  80. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/runner/tests/test_experiment_result_publisher.py +0 -0
  81. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/tests/__init__.py +0 -0
  82. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/tests/constants.py +0 -0
  83. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/tests/test_connection.py +0 -0
  84. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/tests/test_decorators.py +0 -0
  85. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/utils/__init__.py +0 -0
  86. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/utils/environment.py +0 -0
  87. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/utils/pd.py +0 -0
  88. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/utils/tests/__init__.py +0 -0
  89. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/utils/tests/test_environment.py +0 -0
  90. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/utils/tqdm.py +0 -0
  91. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals/version.py +0 -0
  92. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals.egg-info/SOURCES.txt +0 -0
  93. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals.egg-info/dependency_links.txt +0 -0
  94. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals.egg-info/requires.txt +0 -0
  95. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/fiddler_evals.egg-info/top_level.txt +0 -0
  96. {fiddler_evals-0.1.1.dev2 → fiddler_evals-0.1.1.dev9}/setup.cfg +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fiddler-evals
3
- Version: 0.1.1.dev2
3
+ Version: 0.1.1.dev9
4
4
  Summary: Python SDK for evaluating LLM Applications
5
5
  Author-email: Fiddler AI <support@fiddler.ai>
6
+ Maintainer-email: Fiddler AI <support@fiddler.ai>
6
7
  Project-URL: Homepage, https://fiddler.ai
7
- Project-URL: Repository, https://github.com/fiddler-labs/fiddler-evals-sdk
8
8
  Project-URL: Documentation, https://docs.fiddler.ai/
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Operating System :: OS Independent
@@ -0,0 +1 @@
1
+ 0.1.1.dev9
@@ -5,7 +5,7 @@ from datetime import datetime
5
5
  from typing import Callable
6
6
 
7
7
  from fiddler_evals.entities.dataset import Dataset
8
- from fiddler_evals.entities.experiment import Experiment, ExperimentStatus
8
+ from fiddler_evals.entities.experiment import Experiment
9
9
  from fiddler_evals.evaluators.base import Evaluator
10
10
  from fiddler_evals.evaluators.eval_fn import EvalFn
11
11
  from fiddler_evals.runner.experiment_runner import (
@@ -161,17 +161,7 @@ def evaluate(
161
161
  max_workers=max_workers,
162
162
  )
163
163
 
164
- try:
165
- return runner()
166
- except KeyboardInterrupt:
167
- # Set experiment status to cancelled if interrupted by the user
168
- experiment.update(
169
- status=ExperimentStatus.CANCELLED,
170
- error_reason="KeyboardInterrupt",
171
- error_message="Experiment cancelled by the user",
172
- traceback=None,
173
- )
174
- raise
164
+ return runner()
175
165
 
176
166
 
177
167
  # Alias
@@ -2,9 +2,10 @@ from __future__ import annotations
2
2
 
3
3
  import inspect
4
4
  import logging
5
+ import signal
5
6
  import time
6
7
  from dataclasses import dataclass
7
- from functools import cached_property
8
+ from functools import cached_property, wraps
8
9
  from typing import Any, Callable, Dict, Union
9
10
 
10
11
  from tqdm.autonotebook import tqdm
@@ -32,6 +33,37 @@ from fiddler_evals.utils.tqdm import thread_map
32
33
 
33
34
  logger = logging.getLogger(__name__)
34
35
 
36
+
37
+ def with_signal_handlers(func: Callable) -> Callable:
38
+ """Decorator to setup and cleanup signal handlers for experiment execution.
39
+
40
+ This decorator automatically:
41
+ 1. Sets up SIGINT and SIGTERM handlers before execution
42
+ 2. Cleans up signal handlers after execution (success or failure)
43
+ 3. Ensures proper resource cleanup
44
+
45
+ Args:
46
+ func: The method to decorate (typically the run method)
47
+
48
+ Returns:
49
+ The decorated method with signal handling
50
+ """
51
+
52
+ @wraps(func)
53
+ def wrapper(self: ExperimentRunner, *args: Any, **kwargs: Any) -> Any:
54
+ # Setup signal handlers
55
+ self._setup_signal_handlers()
56
+
57
+ try:
58
+ # Execute the original method
59
+ return func(self, *args, **kwargs)
60
+ finally:
61
+ # Always cleanup signal handlers
62
+ self._cleanup_signal_handlers()
63
+
64
+ return wrapper
65
+
66
+
35
67
  # Function(inputs, extras, metadata) -> outputs
36
68
  EvalTaskType = Callable[
37
69
  [Dict[str, Any], Dict[str, Any], Dict[str, Any]], Dict[str, Any]
@@ -145,6 +177,43 @@ class ExperimentRunner:
145
177
  """Get the HTTP client for making API requests."""
146
178
  return get_connection().client
147
179
 
180
+ def _setup_signal_handlers(self) -> None:
181
+ """Register signal handlers for graceful shutdown on SIGTERM/SIGINT."""
182
+ signal.signal(signal.SIGTERM, self._handle_shutdown)
183
+ signal.signal(signal.SIGINT, self._handle_shutdown)
184
+
185
+ def _cleanup_signal_handlers(self) -> None:
186
+ """Restore default signal handlers after experiment completion."""
187
+ signal.signal(signal.SIGINT, signal.SIG_DFL)
188
+ signal.signal(signal.SIGTERM, signal.SIG_DFL)
189
+
190
+ def _handle_shutdown(self, signum: int, _frame: Any) -> None:
191
+ """Handle shutdown signal by cancelling the running experiment.
192
+
193
+ :param signum: Signal number received
194
+ :param _frame: Signal frame (unused)
195
+ """
196
+ logger.info(
197
+ "Received shutdown signal %s(%d), cancelling experiment - %s",
198
+ self._experiment.name,
199
+ signal.Signals(signum).name,
200
+ signum,
201
+ )
202
+
203
+ self._result_publisher.flush()
204
+
205
+ self._experiment.update(
206
+ status=ExperimentStatus.CANCELLED,
207
+ error_reason=f"Received shutdown signal {signal.Signals(signum).name}({signum})",
208
+ error_message="Experiment cancelled due to user interruption or system termination",
209
+ traceback=None,
210
+ )
211
+
212
+ # Use KeyboardInterrupt for both signals (consistent)
213
+ raise KeyboardInterrupt(
214
+ f"Experiment cancelled due to {signal.Signals(signum).name}({signum})"
215
+ )
216
+
148
217
  def _run_eval_task(
149
218
  self,
150
219
  dataset_item: DatasetItem,
@@ -521,6 +590,7 @@ class ExperimentRunner:
521
590
  f"Expected: {expected_params}. Original error: {str(e)}"
522
591
  ) from e
523
592
 
593
+ @with_signal_handlers
524
594
  def run(
525
595
  self,
526
596
  ) -> ExperimentResult:
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fiddler-evals
3
- Version: 0.1.1.dev2
3
+ Version: 0.1.1.dev9
4
4
  Summary: Python SDK for evaluating LLM Applications
5
5
  Author-email: Fiddler AI <support@fiddler.ai>
6
+ Maintainer-email: Fiddler AI <support@fiddler.ai>
6
7
  Project-URL: Homepage, https://fiddler.ai
7
- Project-URL: Repository, https://github.com/fiddler-labs/fiddler-evals-sdk
8
8
  Project-URL: Documentation, https://docs.fiddler.ai/
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Operating System :: OS Independent
@@ -1,9 +1,12 @@
1
1
  [project]
2
2
  name = "fiddler-evals"
3
- version = "0.1.1.dev2"
3
+ version = "0.1.1.dev9"
4
4
  authors = [
5
5
  { name = "Fiddler AI", email = "support@fiddler.ai" },
6
6
  ]
7
+ maintainers = [
8
+ { name = "Fiddler AI", email = "support@fiddler.ai" },
9
+ ]
7
10
  classifiers = [
8
11
  "Programming Language :: Python :: 3",
9
12
  "Operating System :: OS Independent",
@@ -26,7 +29,6 @@ pandas = ["pandas>=1.2.5"]
26
29
 
27
30
  [project.urls]
28
31
  Homepage = "https://fiddler.ai"
29
- Repository = "https://github.com/fiddler-labs/fiddler-evals-sdk"
30
32
  Documentation = "https://docs.fiddler.ai/"
31
33
 
32
34
  [build-system]
@@ -1 +0,0 @@
1
- 0.1.1.dev2