evalvault 1.75.0__py3-none-any.whl → 1.76.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.
- evalvault/adapters/inbound/api/adapter.py +99 -63
- evalvault/adapters/inbound/api/routers/config.py +3 -1
- evalvault/adapters/inbound/cli/commands/method.py +2 -2
- evalvault/adapters/inbound/cli/commands/run.py +146 -28
- evalvault/adapters/inbound/cli/commands/run_helpers.py +157 -55
- evalvault/adapters/outbound/llm/factory.py +1 -1
- evalvault/adapters/outbound/phoenix/sync_service.py +99 -0
- evalvault/adapters/outbound/tracker/mlflow_adapter.py +209 -54
- evalvault/adapters/outbound/tracker/phoenix_adapter.py +158 -9
- evalvault/config/instrumentation.py +8 -6
- evalvault/config/phoenix_support.py +5 -0
- evalvault/config/settings.py +40 -4
- evalvault/domain/services/evaluator.py +2 -0
- {evalvault-1.75.0.dist-info → evalvault-1.76.0.dist-info}/METADATA +1 -1
- {evalvault-1.75.0.dist-info → evalvault-1.76.0.dist-info}/RECORD +18 -18
- {evalvault-1.75.0.dist-info → evalvault-1.76.0.dist-info}/WHEEL +0 -0
- {evalvault-1.75.0.dist-info → evalvault-1.76.0.dist-info}/entry_points.txt +0 -0
- {evalvault-1.75.0.dist-info → evalvault-1.76.0.dist-info}/licenses/LICENSE.md +0 -0
evalvault/config/settings.py
CHANGED
|
@@ -55,6 +55,33 @@ def _parse_cors_origins(cors_origins: str | None) -> list[str]:
|
|
|
55
55
|
return [origin.strip() for origin in cors_origins.split(",") if origin.strip()]
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
def resolve_tracker_providers(provider: str | None) -> list[str]:
|
|
59
|
+
if not provider:
|
|
60
|
+
return []
|
|
61
|
+
normalized = provider.strip().lower()
|
|
62
|
+
if normalized in {"none", "off", "disabled"}:
|
|
63
|
+
return ["none"]
|
|
64
|
+
aliases = {
|
|
65
|
+
"all": ["mlflow", "phoenix"],
|
|
66
|
+
"default": ["mlflow", "phoenix"],
|
|
67
|
+
}
|
|
68
|
+
if normalized in aliases:
|
|
69
|
+
return aliases[normalized]
|
|
70
|
+
separators = [",", "+", "/", "|"]
|
|
71
|
+
for sep in separators:
|
|
72
|
+
normalized = normalized.replace(sep, ",")
|
|
73
|
+
providers = [p.strip() for p in normalized.split(",") if p.strip()]
|
|
74
|
+
if not providers:
|
|
75
|
+
return []
|
|
76
|
+
if "none" in providers and len(providers) > 1:
|
|
77
|
+
raise ValueError("tracker_provider cannot combine 'none' with other providers")
|
|
78
|
+
deduped: list[str] = []
|
|
79
|
+
for entry in providers:
|
|
80
|
+
if entry not in deduped:
|
|
81
|
+
deduped.append(entry)
|
|
82
|
+
return deduped
|
|
83
|
+
|
|
84
|
+
|
|
58
85
|
SECRET_REFERENCE_FIELDS = (
|
|
59
86
|
"api_auth_tokens",
|
|
60
87
|
"knowledge_read_tokens",
|
|
@@ -83,13 +110,14 @@ def _validate_production_settings(settings: "Settings") -> None:
|
|
|
83
110
|
if settings.llm_provider == "openai" and not settings.openai_api_key:
|
|
84
111
|
missing.append("OPENAI_API_KEY")
|
|
85
112
|
|
|
86
|
-
|
|
113
|
+
providers = resolve_tracker_providers(settings.tracker_provider)
|
|
114
|
+
if "langfuse" in providers:
|
|
87
115
|
if not settings.langfuse_public_key:
|
|
88
116
|
missing.append("LANGFUSE_PUBLIC_KEY")
|
|
89
117
|
if not settings.langfuse_secret_key:
|
|
90
118
|
missing.append("LANGFUSE_SECRET_KEY")
|
|
91
119
|
|
|
92
|
-
if
|
|
120
|
+
if "mlflow" in providers and not settings.mlflow_tracking_uri:
|
|
93
121
|
missing.append("MLFLOW_TRACKING_URI")
|
|
94
122
|
|
|
95
123
|
if (
|
|
@@ -355,6 +383,14 @@ class Settings(BaseSettings):
|
|
|
355
383
|
default="http://localhost:6006/v1/traces",
|
|
356
384
|
description="Phoenix OTLP endpoint for traces",
|
|
357
385
|
)
|
|
386
|
+
phoenix_project_name: str = Field(
|
|
387
|
+
default="evalvault",
|
|
388
|
+
description="Phoenix project name for grouping traces",
|
|
389
|
+
)
|
|
390
|
+
phoenix_annotations_enabled: bool = Field(
|
|
391
|
+
default=True,
|
|
392
|
+
description="Enable automatic Phoenix span annotations",
|
|
393
|
+
)
|
|
358
394
|
phoenix_api_token: str | None = Field(
|
|
359
395
|
default=None,
|
|
360
396
|
description="Phoenix API token for cloud deployments (optional)",
|
|
@@ -372,8 +408,8 @@ class Settings(BaseSettings):
|
|
|
372
408
|
|
|
373
409
|
# Tracker Provider Selection
|
|
374
410
|
tracker_provider: str = Field(
|
|
375
|
-
default="
|
|
376
|
-
description="Tracker provider: 'langfuse', 'mlflow',
|
|
411
|
+
default="mlflow+phoenix",
|
|
412
|
+
description="Tracker provider: 'langfuse', 'mlflow', 'phoenix', 'none', or combinations",
|
|
377
413
|
)
|
|
378
414
|
|
|
379
415
|
# Cluster map configuration
|
|
@@ -1934,6 +1934,8 @@ class RagasEvaluator:
|
|
|
1934
1934
|
|
|
1935
1935
|
def _calculate_cost(self, model_name: str, prompt_tokens: int, completion_tokens: int) -> float:
|
|
1936
1936
|
"""Calculate estimated cost in USD based on model pricing."""
|
|
1937
|
+
if "ollama" in model_name:
|
|
1938
|
+
return 0.0
|
|
1937
1939
|
# Find matching model key (exact or substring match)
|
|
1938
1940
|
price_key = "openai/gpt-4o" # Default fallback
|
|
1939
1941
|
for key in self.MODEL_PRICING:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: evalvault
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.76.0
|
|
4
4
|
Summary: RAG evaluation system using Ragas with Phoenix/Langfuse tracing
|
|
5
5
|
Project-URL: Homepage, https://github.com/ntts9990/EvalVault
|
|
6
6
|
Project-URL: Documentation, https://github.com/ntts9990/EvalVault#readme
|
|
@@ -5,13 +5,13 @@ evalvault/mkdocs_helpers.py,sha256=1AKVQ1W2_VO4qclhfyefyU9Dz1Hzkh1DWDwsFMe24jc,3
|
|
|
5
5
|
evalvault/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
evalvault/adapters/inbound/__init__.py,sha256=SG1svel1PwqetnqVpKFLSv612_WwGwLTbFpYgwk6FMw,166
|
|
7
7
|
evalvault/adapters/inbound/api/__init__.py,sha256=LeVVttCA3tLKoHA2PO4z3y8VkfVcf3Bq8CZSzo91lf4,34
|
|
8
|
-
evalvault/adapters/inbound/api/adapter.py,sha256=
|
|
8
|
+
evalvault/adapters/inbound/api/adapter.py,sha256=wzudfkMALcX3IH7MfG-dYc5j-nzxBdDBT1X8_vJWick,86848
|
|
9
9
|
evalvault/adapters/inbound/api/main.py,sha256=QgLxzHEy7aycGKIFLtN12tWTjnpWLtQ2XDXKV_2FDvg,7531
|
|
10
10
|
evalvault/adapters/inbound/api/routers/__init__.py,sha256=q07_YF9TnBl68bqcRCvhPU4-zRTyvmPoHVehwO6W7QM,19
|
|
11
11
|
evalvault/adapters/inbound/api/routers/benchmark.py,sha256=yevntbZcNtMvbVODsITUBgR1Ka4pdFQrXBJJ4K4Jyr4,4477
|
|
12
12
|
evalvault/adapters/inbound/api/routers/calibration.py,sha256=FzEOe7KqDtfGDlOKREsAoYId1jTILyqkDm_Y3LyHk54,4130
|
|
13
13
|
evalvault/adapters/inbound/api/routers/chat.py,sha256=N6lTO_rAswtpL0xusnZk-Gh_ShjlJgM8haRMynwNxVo,42023
|
|
14
|
-
evalvault/adapters/inbound/api/routers/config.py,sha256=
|
|
14
|
+
evalvault/adapters/inbound/api/routers/config.py,sha256=U6dLwJTT2m54yTC5dK8Pi2FWJfclEGP947Mo24sBWZM,4155
|
|
15
15
|
evalvault/adapters/inbound/api/routers/domain.py,sha256=Yc94E_lEEB5LERsBRwYeKXnou8PFaysLXauBbtTzfGM,3826
|
|
16
16
|
evalvault/adapters/inbound/api/routers/knowledge.py,sha256=yb_e7OEPtwldOAzHTGiWe7jShHw2JdpOFnzGPMceRsg,7109
|
|
17
17
|
evalvault/adapters/inbound/api/routers/mcp.py,sha256=yHANV7qIXig-7YSiQgXzSTuabqFStH5yT3URyQGY2W4,4764
|
|
@@ -39,15 +39,15 @@ evalvault/adapters/inbound/cli/commands/history.py,sha256=dGkoRz59FZCbs-Af29MxgV
|
|
|
39
39
|
evalvault/adapters/inbound/cli/commands/init.py,sha256=7q86fUeBVA08fU_N0lAV6Lakxirq4val2jIyALlDy3E,8822
|
|
40
40
|
evalvault/adapters/inbound/cli/commands/kg.py,sha256=ycV9Xj6SUUJLTyTfLZcjXDVLcZqwo7Gw878ZhZAeDoc,19155
|
|
41
41
|
evalvault/adapters/inbound/cli/commands/langfuse.py,sha256=aExhZ5WYT0FzJI4v1sF-a1jqy9b1BF46_HBtfiQjVGI,4085
|
|
42
|
-
evalvault/adapters/inbound/cli/commands/method.py,sha256=
|
|
42
|
+
evalvault/adapters/inbound/cli/commands/method.py,sha256=2DuMD1AMaQr9gl6xAQty_YKdq5MA9Y-FMYMmERnf9-4,19090
|
|
43
43
|
evalvault/adapters/inbound/cli/commands/ops.py,sha256=jh0ryYIDvj2VDhOR6bESPHnyogtzAfSs81gKMGlOczs,4042
|
|
44
44
|
evalvault/adapters/inbound/cli/commands/phoenix.py,sha256=LQi3KTLq1ybjjBuz92oQ6lYyBS3mHrCHk0qe-7bqB4U,15611
|
|
45
45
|
evalvault/adapters/inbound/cli/commands/pipeline.py,sha256=nBsgSG9RvwDRy_X-01DqZe0jS9zpp1j4hkccni3sruc,12253
|
|
46
46
|
evalvault/adapters/inbound/cli/commands/profile_difficulty.py,sha256=PF8MbYzufbNVlKKnBp6JF9PrBe-ncGDOe8JHWW0L278,6329
|
|
47
47
|
evalvault/adapters/inbound/cli/commands/prompts.py,sha256=ExbTG_8yZupuw6em6OPOdTOMc4T-YPc7tUx5_cbXeiU,26708
|
|
48
48
|
evalvault/adapters/inbound/cli/commands/regress.py,sha256=VzwTucxJav71Xmd18qCb93XG_mTvfjmW52SQRv8Sgu4,19082
|
|
49
|
-
evalvault/adapters/inbound/cli/commands/run.py,sha256=
|
|
50
|
-
evalvault/adapters/inbound/cli/commands/run_helpers.py,sha256
|
|
49
|
+
evalvault/adapters/inbound/cli/commands/run.py,sha256=H65pQ_bbUST_d6_OdUDU9ZS-FMLE8FMy4KXLWj11Qzg,136577
|
|
50
|
+
evalvault/adapters/inbound/cli/commands/run_helpers.py,sha256=yFt7jzZX8NEClCJdwOt9LfrpIhD5J_m9HD-XSrSLP0I,47994
|
|
51
51
|
evalvault/adapters/inbound/cli/commands/stage.py,sha256=XiPfJrdtUWrdSw5EzLgvz5WEEBW1qz1FALEhDYamMjE,23236
|
|
52
52
|
evalvault/adapters/inbound/cli/utils/__init__.py,sha256=QPNKneZS-Z-tTnYYxtgJXgcJWY6puUlRQcKrn7Mlv1M,685
|
|
53
53
|
evalvault/adapters/inbound/cli/utils/analysis_io.py,sha256=RHkKEq4e-PtbtRDlXAJWU80RYHNPw-O5V9_GujdaGfc,13393
|
|
@@ -162,7 +162,7 @@ evalvault/adapters/outbound/llm/__init__.py,sha256=MZODPJbwpMuuubG7cxXEh75V3e0r6
|
|
|
162
162
|
evalvault/adapters/outbound/llm/anthropic_adapter.py,sha256=LTU3RhtgaKNLvMpwj1-GGCclsBZM2dzVJ1OIMO9BHqI,8162
|
|
163
163
|
evalvault/adapters/outbound/llm/azure_adapter.py,sha256=FR9Gimy-jonzQjtILGHKXAY_ycbjGKbKLFiD-OZ8EVs,3033
|
|
164
164
|
evalvault/adapters/outbound/llm/base.py,sha256=c4cJJTKwJiBlGNCV7qomq5mQCrbc48Yi7c3vjlat7Q0,7674
|
|
165
|
-
evalvault/adapters/outbound/llm/factory.py,sha256=
|
|
165
|
+
evalvault/adapters/outbound/llm/factory.py,sha256=Ee8VTIDK46JmfQ7nqxQd1onr0qizA7pzU8l9_7L3qsE,3496
|
|
166
166
|
evalvault/adapters/outbound/llm/instructor_factory.py,sha256=6iJIjZbCJwDYEpV673R3lQOupzeWlvjCmhjYqthrueY,4497
|
|
167
167
|
evalvault/adapters/outbound/llm/llm_relation_augmenter.py,sha256=B22CJB66Vfh_SK_11J8jlfIhjDmY_7FXp-bTL2YGWGw,4848
|
|
168
168
|
evalvault/adapters/outbound/llm/ollama_adapter.py,sha256=HuPjX9rhBn95OzwNNXOgD-FIOKSUNuHEcNKDeHxw8kA,11481
|
|
@@ -186,7 +186,7 @@ evalvault/adapters/outbound/nlp/korean/toolkit.py,sha256=iMaY5VueC5P0rxm5SCdz69C
|
|
|
186
186
|
evalvault/adapters/outbound/nlp/korean/toolkit_factory.py,sha256=x3v-AAkVInOabC4PtOtStsZrFnHun0IOqZDyQGaQVm8,586
|
|
187
187
|
evalvault/adapters/outbound/ops/__init__.py,sha256=_QiDVPuiYWkIwW_ELEVKD_v6dLojjyvIJWs4qVNxehw,164
|
|
188
188
|
evalvault/adapters/outbound/ops/report_renderer.py,sha256=mezVKdIsnJSNvBW6xkhpNG3MOFXHZLZspmHk5o-e8Cg,6354
|
|
189
|
-
evalvault/adapters/outbound/phoenix/sync_service.py,sha256=
|
|
189
|
+
evalvault/adapters/outbound/phoenix/sync_service.py,sha256=3rNtolFzwbRbmsP7fCh6lMDcpEf428mLqpZuw1tYW3M,13271
|
|
190
190
|
evalvault/adapters/outbound/report/__init__.py,sha256=8VeMrfj63mDR-xUHct-drNNBA5M-m-B7sgC1qUJF7g4,660
|
|
191
191
|
evalvault/adapters/outbound/report/ci_report_formatter.py,sha256=5YD8BwtOjLnHcNbbG0HJziOifD9BDhBtZT1oItd6zJE,1233
|
|
192
192
|
evalvault/adapters/outbound/report/dashboard_generator.py,sha256=g0SANOrOS_mSfLfKbfbxflxZmCNbZGrGzA0g03_Yb48,8356
|
|
@@ -213,17 +213,17 @@ evalvault/adapters/outbound/tracer/phoenix_tracer_adapter.py,sha256=inmTAolAVsm0
|
|
|
213
213
|
evalvault/adapters/outbound/tracker/__init__.py,sha256=Suu5BznOK5uTuD5_jS8JMZd8RPfQNlddLxHCBvMTm_4,358
|
|
214
214
|
evalvault/adapters/outbound/tracker/langfuse_adapter.py,sha256=uI-t5v9AC5VUMYsIc1FHYImourZeErGMXB0_prOMErc,18839
|
|
215
215
|
evalvault/adapters/outbound/tracker/log_sanitizer.py,sha256=ilKTTSzsHslQYc-elnWu0Z3HKNNw1D1iI0_cCvYbo1M,2653
|
|
216
|
-
evalvault/adapters/outbound/tracker/mlflow_adapter.py,sha256=
|
|
217
|
-
evalvault/adapters/outbound/tracker/phoenix_adapter.py,sha256=
|
|
216
|
+
evalvault/adapters/outbound/tracker/mlflow_adapter.py,sha256=8vo53d2ZpcYDz3J798iru7Sk-Wm3XhARJMVmS5d6pRE,13495
|
|
217
|
+
evalvault/adapters/outbound/tracker/phoenix_adapter.py,sha256=EXEhoOFTFNSVuSnN2wFIH3H1kq4T14601sGIcRIy8hs,32947
|
|
218
218
|
evalvault/config/__init__.py,sha256=UCgeDx62M2gOuFvdN29wWwny2fdH4bPY_uUC3-42eDw,1297
|
|
219
219
|
evalvault/config/agent_types.py,sha256=EP2Pv3ZtOzDXIvIa-Hnd1to9JIbMUtGitrlwzZtx0Ys,13418
|
|
220
220
|
evalvault/config/domain_config.py,sha256=rOgNA2T8NWlDzcEFC0shdUCCww0lI1E5fUm5QrKQSZI,9264
|
|
221
|
-
evalvault/config/instrumentation.py,sha256=
|
|
221
|
+
evalvault/config/instrumentation.py,sha256=BW2a3OqHH6aQNjjlL0oyEI6K3pXuORy6x__-Zfm0ocY,5403
|
|
222
222
|
evalvault/config/langfuse_support.py,sha256=DEzVMfMGGf1V45W_2oUG-NCDfsYI4UUdnYJIgBSrN2o,582
|
|
223
223
|
evalvault/config/model_config.py,sha256=KlzDbGyDLeOGE7ElekFFk5YjjT5u8i6KO2B4EyZkLnI,3542
|
|
224
|
-
evalvault/config/phoenix_support.py,sha256=
|
|
224
|
+
evalvault/config/phoenix_support.py,sha256=w2W8UQTprac8BWdIfV9kPjr2sEj7EF9pNBXX2JB1x4M,13810
|
|
225
225
|
evalvault/config/secret_manager.py,sha256=YjPMuNqeBrAR2BzCJvsBNUExaU4TBSFyZ8kVYZZifqA,4172
|
|
226
|
-
evalvault/config/settings.py,sha256=
|
|
226
|
+
evalvault/config/settings.py,sha256=2EoO6WutkwD2F7rkyECxx5-VenivntOXPZwemVQ9ZtU,20696
|
|
227
227
|
evalvault/config/playbooks/improvement_playbook.yaml,sha256=9F9WVVCydFfz6zUuGYzZ4PKdW1LLtcBKVF36T7xT764,26965
|
|
228
228
|
evalvault/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
229
229
|
evalvault/domain/entities/__init__.py,sha256=7adWG4vwr67fC_ysT1rSvYG5U7qVc2CfWfUf7gDhx-k,4244
|
|
@@ -284,7 +284,7 @@ evalvault/domain/services/document_versioning.py,sha256=M1qZaMpQ2exVT1wkVAmvEPPu
|
|
|
284
284
|
evalvault/domain/services/domain_learning_hook.py,sha256=fNbOQmQ7nsQJMpfWqEOcLxOiWG0deCkjBOOZZFOsIvk,7268
|
|
285
285
|
evalvault/domain/services/embedding_overlay.py,sha256=ZTNxUPXpHGbQ3Uri5DD3feTUFn7qrhuNshhyCQEvRuM,3559
|
|
286
286
|
evalvault/domain/services/entity_extractor.py,sha256=f3Rf5saK8QsgetLNK1Hbxzt8PtttJZCicSR63S8DJ5k,14141
|
|
287
|
-
evalvault/domain/services/evaluator.py,sha256=
|
|
287
|
+
evalvault/domain/services/evaluator.py,sha256=aJp-vgJxlXPHMMjcnjcVDoq8gcwdNb1IfVN8sup7u7M,78979
|
|
288
288
|
evalvault/domain/services/experiment_comparator.py,sha256=IBrxIwux-8GucwlLx6e5lUqB9miSPvBLGJK9ctoW7Y0,3299
|
|
289
289
|
evalvault/domain/services/experiment_manager.py,sha256=2k-qGiAUyZuqqmcp4P-M3Z9HTXwwcqW5HQYKNkcIHuI,4863
|
|
290
290
|
evalvault/domain/services/experiment_reporter.py,sha256=QYlVmCFSx8hKTPMezc7QjJE07b3MSQ82Q4QVucSHLVY,1420
|
|
@@ -364,8 +364,8 @@ evalvault/reports/__init__.py,sha256=Bb1X4871msAN8I6PM6nKGED3psPwZt88hXZBAOdH06Y
|
|
|
364
364
|
evalvault/reports/release_notes.py,sha256=pZj0PBFT-4F_Ty-Kv5P69BuoOnmTCn4kznDcORFJd0w,4011
|
|
365
365
|
evalvault/scripts/__init__.py,sha256=NwEeIFQbkX4ml2R_PhtIoNtArDSX_suuoymgG_7Kwso,89
|
|
366
366
|
evalvault/scripts/regression_runner.py,sha256=SxZori5BZ8jVQ057Mf5V5FPgIVDccrV5oRONmnhuk8w,8438
|
|
367
|
-
evalvault-1.
|
|
368
|
-
evalvault-1.
|
|
369
|
-
evalvault-1.
|
|
370
|
-
evalvault-1.
|
|
371
|
-
evalvault-1.
|
|
367
|
+
evalvault-1.76.0.dist-info/METADATA,sha256=HleQUSCdC3UNzeCVN4PdvcOG5Jx-dYfMgaq8VwRnlYQ,8752
|
|
368
|
+
evalvault-1.76.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
369
|
+
evalvault-1.76.0.dist-info/entry_points.txt,sha256=Oj9Xc5gYcyUYYNmQfWI8NYGw7nN-3M-h2ipHIMlVn6o,65
|
|
370
|
+
evalvault-1.76.0.dist-info/licenses/LICENSE.md,sha256=3RNWY4jjtrQ_yYa-D-7I3XO12Ti7YzxsLV_dpykujvo,11358
|
|
371
|
+
evalvault-1.76.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|