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.
@@ -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
- if settings.tracker_provider == "langfuse":
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 settings.tracker_provider == "mlflow" and not settings.mlflow_tracking_uri:
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="langfuse",
376
- description="Tracker provider: 'langfuse', 'mlflow', or 'phoenix'",
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.75.0
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=AQ6-4_wzvszIPlq61y4V9MOZyuM-hvhrw0wVrFPHLUk,85145
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=LygN0fVMr8NFtj5zuQXnVFhoafx56Txa98vpwtPa4Jc,4104
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=s4O4nM0IMT5-VAkpesSQlJWXvvkz_ztUUkNaGDwWNGA,19088
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=BkuOFHZISJ_aO_0Sy-xNPdbqSEDbT2PXLllGhbeuggk,130710
50
- evalvault/adapters/inbound/cli/commands/run_helpers.py,sha256=-1d7GTnCnSz1DwmuwRy5E2_WNU_B0x0wvLnohU1kIWk,43739
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=TTpbyDQH9TCr1wmajSkLgkF_fHGv6sX0hZOEqIWZudU,3509
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=i6gHpNiZXKQ5yzV9B2TPb-P1N45k_Ck5ruzh3oqp4d8,9122
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=6pSxbxSDZE7jN7uSMU6VFg0JlO7cBiMLYcd53NYpfcY,7350
217
- evalvault/adapters/outbound/tracker/phoenix_adapter.py,sha256=8p2qJeKn6OvIxNbD16h_QrhmCzKIBIf8_ej535MNn_A,26443
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=L8on9HjB6Ji8cSOJ6Pepsopfg9okDNMWF7LKZiCA6Ro,5266
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=e6RPWd6Qb7KU6Q8pLaYTpJGWULtvEEU6B0xHWyVyOH0,13604
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=yBntqR4PsznvARCRyP_1sMC53x2EziZhT5BWV_3qtGA,19455
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=Iud5KWompKyMm59qsaH0jWkNL4nl_A7UI3pES-rCjcA,78921
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.75.0.dist-info/METADATA,sha256=Jb-JFy3QXbPR4UpLR-TgNRhhnDTn604-zH6lFiq3Fvc,8752
368
- evalvault-1.75.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
369
- evalvault-1.75.0.dist-info/entry_points.txt,sha256=Oj9Xc5gYcyUYYNmQfWI8NYGw7nN-3M-h2ipHIMlVn6o,65
370
- evalvault-1.75.0.dist-info/licenses/LICENSE.md,sha256=3RNWY4jjtrQ_yYa-D-7I3XO12Ti7YzxsLV_dpykujvo,11358
371
- evalvault-1.75.0.dist-info/RECORD,,
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,,