evalrx 0.1.2__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 (345) hide show
  1. evalrx-0.1.2/LICENSE +121 -0
  2. evalrx-0.1.2/PKG-INFO +532 -0
  3. evalrx-0.1.2/README.md +332 -0
  4. evalrx-0.1.2/evalrx/__init__.py +139 -0
  5. evalrx-0.1.2/evalrx/agent_assets/__init__.py +2 -0
  6. evalrx-0.1.2/evalrx/agent_assets/skills/README.md +28 -0
  7. evalrx-0.1.2/evalrx/agent_assets/skills/eval-chart-style/SKILL.md +172 -0
  8. evalrx-0.1.2/evalrx/agent_assets/skills/evalrx-report-ui/SKILL.md +116 -0
  9. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/LICENSE +201 -0
  10. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/README.md +412 -0
  11. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/SKILL.md +60 -0
  12. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/manifest.yaml +59 -0
  13. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/api.md +436 -0
  14. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/backend-selection.md +100 -0
  15. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/chart-types.md +281 -0
  16. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/common-patterns.md +350 -0
  17. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/demos.md +65 -0
  18. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/design-theory.md +439 -0
  19. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/figure-contract.md +93 -0
  20. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/figure-legend-conventions.md +71 -0
  21. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/nature-2026-observations.md +112 -0
  22. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/qa-contract.md +119 -0
  23. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/r-template-index.md +66 -0
  24. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/r-workflow.md +161 -0
  25. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/references/tutorials.md +251 -0
  26. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/static/core/contract.md +29 -0
  27. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/static/core/stance.md +37 -0
  28. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/static/fragments/backend/python.md +37 -0
  29. evalrx-0.1.2/evalrx/agent_assets/skills/nature-figure/static/fragments/backend/r.md +44 -0
  30. evalrx-0.1.2/evalrx/agent_assets/skills/outcome-driver-analysis/SKILL.md +213 -0
  31. evalrx-0.1.2/evalrx/agent_assets/skills/outcome-driver-analysis/assets/analysis_report_template.md +53 -0
  32. evalrx-0.1.2/evalrx/agent_assets/skills/outcome-driver-analysis/references/model_selection.md +72 -0
  33. evalrx-0.1.2/evalrx/agent_assets/skills/outcome-driver-analysis/scripts/explanatory_var_eda.R +130 -0
  34. evalrx-0.1.2/evalrx/agent_assets/skills/outcome-driver-analysis/scripts/explanatory_var_eda.py +150 -0
  35. evalrx-0.1.2/evalrx/agent_assets/skills/outcome-driver-analysis/scripts/fit_outcome_model.R +181 -0
  36. evalrx-0.1.2/evalrx/agent_assets/skills/outcome-driver-analysis/scripts/fit_outcome_model.py +186 -0
  37. evalrx-0.1.2/evalrx/agent_assets/skills/outcome-driver-analysis/scripts/univariate_eda.R +149 -0
  38. evalrx-0.1.2/evalrx/agent_assets/skills/outcome-driver-analysis/scripts/univariate_eda.py +177 -0
  39. evalrx-0.1.2/evalrx/agent_assets/skills.py +27 -0
  40. evalrx-0.1.2/evalrx/agent_runtime/__init__.py +78 -0
  41. evalrx-0.1.2/evalrx/agent_runtime/_docker_runner.py +89 -0
  42. evalrx-0.1.2/evalrx/agent_runtime/cli_runtime.py +103 -0
  43. evalrx-0.1.2/evalrx/agent_runtime/cli_transcript.py +138 -0
  44. evalrx-0.1.2/evalrx/agent_runtime/cli_types.py +68 -0
  45. evalrx-0.1.2/evalrx/agent_runtime/codegen/__init__.py +5 -0
  46. evalrx-0.1.2/evalrx/agent_runtime/codegen/runner.py +94 -0
  47. evalrx-0.1.2/evalrx/agent_runtime/experiment_harness.py +117 -0
  48. evalrx-0.1.2/evalrx/agent_runtime/factory.py +102 -0
  49. evalrx-0.1.2/evalrx/agent_runtime/json_shape.py +44 -0
  50. evalrx-0.1.2/evalrx/agent_runtime/judges/__init__.py +28 -0
  51. evalrx-0.1.2/evalrx/agent_runtime/judges/agy.py +179 -0
  52. evalrx-0.1.2/evalrx/agent_runtime/judges/autodetect.py +135 -0
  53. evalrx-0.1.2/evalrx/agent_runtime/judges/claude.py +159 -0
  54. evalrx-0.1.2/evalrx/agent_runtime/judges/codex.py +120 -0
  55. evalrx-0.1.2/evalrx/agent_runtime/providers/__init__.py +21 -0
  56. evalrx-0.1.2/evalrx/agent_runtime/providers/antigravity.py +31 -0
  57. evalrx-0.1.2/evalrx/agent_runtime/providers/base.py +145 -0
  58. evalrx-0.1.2/evalrx/agent_runtime/providers/claude_code.py +49 -0
  59. evalrx-0.1.2/evalrx/agent_runtime/providers/codex.py +37 -0
  60. evalrx-0.1.2/evalrx/agent_runtime/providers/gemini_cli.py +26 -0
  61. evalrx-0.1.2/evalrx/agent_runtime/providers/kimi_cli.py +27 -0
  62. evalrx-0.1.2/evalrx/agent_runtime/providers/opencode.py +27 -0
  63. evalrx-0.1.2/evalrx/agent_runtime/providers/registry.py +58 -0
  64. evalrx-0.1.2/evalrx/agent_runtime/sandbox.py +517 -0
  65. evalrx-0.1.2/evalrx/agent_runtime/skill_audit.py +143 -0
  66. evalrx-0.1.2/evalrx/agent_runtime/skills/__init__.py +19 -0
  67. evalrx-0.1.2/evalrx/agent_runtime/skills/installer.py +68 -0
  68. evalrx-0.1.2/evalrx/agent_runtime/skills/prompt_policy.py +86 -0
  69. evalrx-0.1.2/evalrx/agent_runtime/skills/resolver.py +19 -0
  70. evalrx-0.1.2/evalrx/analysis/__init__.py +132 -0
  71. evalrx-0.1.2/evalrx/analysis/adjudicate.py +154 -0
  72. evalrx-0.1.2/evalrx/analysis/analysis_module.py +361 -0
  73. evalrx-0.1.2/evalrx/analysis/api.py +171 -0
  74. evalrx-0.1.2/evalrx/analysis/case_studio.py +651 -0
  75. evalrx-0.1.2/evalrx/analysis/cli.py +114 -0
  76. evalrx-0.1.2/evalrx/analysis/dashboard.py +350 -0
  77. evalrx-0.1.2/evalrx/analysis/eval_case_matrix.py +118 -0
  78. evalrx-0.1.2/evalrx/analysis/eval_viz_theme.py +833 -0
  79. evalrx-0.1.2/evalrx/analysis/explore_run.py +333 -0
  80. evalrx-0.1.2/evalrx/analysis/explorer.py +1276 -0
  81. evalrx-0.1.2/evalrx/analysis/failure_modes.py +607 -0
  82. evalrx-0.1.2/evalrx/analysis/fused_pipeline.py +489 -0
  83. evalrx-0.1.2/evalrx/analysis/holdout.py +300 -0
  84. evalrx-0.1.2/evalrx/analysis/hypothesis_agent.py +230 -0
  85. evalrx-0.1.2/evalrx/analysis/narration.py +177 -0
  86. evalrx-0.1.2/evalrx/analysis/operationalize.py +442 -0
  87. evalrx-0.1.2/evalrx/analysis/plain_language.py +42 -0
  88. evalrx-0.1.2/evalrx/analysis/planner.py +283 -0
  89. evalrx-0.1.2/evalrx/analysis/probe_search.py +203 -0
  90. evalrx-0.1.2/evalrx/analysis/profile.py +268 -0
  91. evalrx-0.1.2/evalrx/analysis/prompts/__init__.py +0 -0
  92. evalrx-0.1.2/evalrx/analysis/prompts/explorer.py +417 -0
  93. evalrx-0.1.2/evalrx/analysis/prompts/failure_modes.py +33 -0
  94. evalrx-0.1.2/evalrx/analysis/prompts/holdout.py +27 -0
  95. evalrx-0.1.2/evalrx/analysis/prompts/hypothesis_agent.py +78 -0
  96. evalrx-0.1.2/evalrx/analysis/prompts/run_codebase.py +47 -0
  97. evalrx-0.1.2/evalrx/analysis/prompts/stats_agent.py +72 -0
  98. evalrx-0.1.2/evalrx/analysis/prompts/stats_tool_generator.py +43 -0
  99. evalrx-0.1.2/evalrx/analysis/result_marker.py +47 -0
  100. evalrx-0.1.2/evalrx/analysis/run_codebase.py +242 -0
  101. evalrx-0.1.2/evalrx/analysis/run_view.py +205 -0
  102. evalrx-0.1.2/evalrx/analysis/stage_views.py +93 -0
  103. evalrx-0.1.2/evalrx/analysis/stats_agent.py +944 -0
  104. evalrx-0.1.2/evalrx/analysis/stats_tool_agent.py +261 -0
  105. evalrx-0.1.2/evalrx/analysis/stats_tool_generator.py +415 -0
  106. evalrx-0.1.2/evalrx/analysis/stats_tools.py +1153 -0
  107. evalrx-0.1.2/evalrx/analysis/trajectory_records.py +193 -0
  108. evalrx-0.1.2/evalrx/analysis/workbench.py +431 -0
  109. evalrx-0.1.2/evalrx/analyzers/__init__.py +42 -0
  110. evalrx-0.1.2/evalrx/analyzers/agent/__init__.py +25 -0
  111. evalrx-0.1.2/evalrx/analyzers/agent/counterfactual.py +84 -0
  112. evalrx-0.1.2/evalrx/analyzers/agent/first_error_judge.py +96 -0
  113. evalrx-0.1.2/evalrx/analyzers/agent/ignored_obs.py +81 -0
  114. evalrx-0.1.2/evalrx/analyzers/agent/loop_detect.py +79 -0
  115. evalrx-0.1.2/evalrx/analyzers/agent/reliability.py +165 -0
  116. evalrx-0.1.2/evalrx/analyzers/agent/tool_shap.py +225 -0
  117. evalrx-0.1.2/evalrx/analyzers/agent/trajectory_rubric.py +168 -0
  118. evalrx-0.1.2/evalrx/analyzers/attention/__init__.py +19 -0
  119. evalrx-0.1.2/evalrx/analyzers/attention/relative_attn.py +610 -0
  120. evalrx-0.1.2/evalrx/analyzers/attention/rollout.py +73 -0
  121. evalrx-0.1.2/evalrx/analyzers/attention/sink.py +56 -0
  122. evalrx-0.1.2/evalrx/analyzers/attention/summary.py +190 -0
  123. evalrx-0.1.2/evalrx/analyzers/attribution/__init__.py +6 -0
  124. evalrx-0.1.2/evalrx/analyzers/attribution/generic_attn.py +31 -0
  125. evalrx-0.1.2/evalrx/analyzers/attribution/gradcam.py +30 -0
  126. evalrx-0.1.2/evalrx/analyzers/base.py +12 -0
  127. evalrx-0.1.2/evalrx/analyzers/geometry/__init__.py +6 -0
  128. evalrx-0.1.2/evalrx/analyzers/geometry/cka.py +70 -0
  129. evalrx-0.1.2/evalrx/analyzers/geometry/linear_probe.py +157 -0
  130. evalrx-0.1.2/evalrx/analyzers/hallucination/__init__.py +9 -0
  131. evalrx-0.1.2/evalrx/analyzers/hallucination/chair.py +78 -0
  132. evalrx-0.1.2/evalrx/analyzers/hallucination/opera.py +29 -0
  133. evalrx-0.1.2/evalrx/analyzers/hallucination/pope.py +119 -0
  134. evalrx-0.1.2/evalrx/analyzers/hallucination/selfcheck.py +155 -0
  135. evalrx-0.1.2/evalrx/analyzers/hallucination/vcd.py +29 -0
  136. evalrx-0.1.2/evalrx/analyzers/lens/__init__.py +7 -0
  137. evalrx-0.1.2/evalrx/analyzers/lens/layer_contrast.py +133 -0
  138. evalrx-0.1.2/evalrx/analyzers/lens/logit_lens.py +138 -0
  139. evalrx-0.1.2/evalrx/analyzers/lens/tuned_lens.py +30 -0
  140. evalrx-0.1.2/evalrx/analyzers/patching/__init__.py +5 -0
  141. evalrx-0.1.2/evalrx/analyzers/patching/causal_trace.py +30 -0
  142. evalrx-0.1.2/evalrx/analyzers/perturbation/__init__.py +23 -0
  143. evalrx-0.1.2/evalrx/analyzers/perturbation/_shapley.py +54 -0
  144. evalrx-0.1.2/evalrx/analyzers/perturbation/context_shap.py +174 -0
  145. evalrx-0.1.2/evalrx/analyzers/perturbation/cot_faithfulness.py +239 -0
  146. evalrx-0.1.2/evalrx/analyzers/perturbation/format_sensitivity.py +237 -0
  147. evalrx-0.1.2/evalrx/analyzers/perturbation/mm_shap.py +146 -0
  148. evalrx-0.1.2/evalrx/analyzers/perturbation/modality_ablation.py +196 -0
  149. evalrx-0.1.2/evalrx/analyzers/perturbation/perturbation_battery.py +274 -0
  150. evalrx-0.1.2/evalrx/analyzers/perturbation/prompt_contrast.py +265 -0
  151. evalrx-0.1.2/evalrx/analyzers/perturbation/rise.py +94 -0
  152. evalrx-0.1.2/evalrx/analyzers/perturbation/vl_shap.py +102 -0
  153. evalrx-0.1.2/evalrx/analyzers/reasoning/__init__.py +33 -0
  154. evalrx-0.1.2/evalrx/analyzers/reasoning/_text.py +328 -0
  155. evalrx-0.1.2/evalrx/analyzers/reasoning/answer_extraction_audit.py +327 -0
  156. evalrx-0.1.2/evalrx/analyzers/reasoning/arith_audit.py +226 -0
  157. evalrx-0.1.2/evalrx/analyzers/reasoning/contamination.py +214 -0
  158. evalrx-0.1.2/evalrx/analyzers/reasoning/knowledge_split.py +253 -0
  159. evalrx-0.1.2/evalrx/analyzers/reasoning/self_repair.py +246 -0
  160. evalrx-0.1.2/evalrx/analyzers/reasoning/step_rollout_value.py +216 -0
  161. evalrx-0.1.2/evalrx/analyzers/reasoning/termination_audit.py +258 -0
  162. evalrx-0.1.2/evalrx/analyzers/uncertainty/__init__.py +18 -0
  163. evalrx-0.1.2/evalrx/analyzers/uncertainty/calibration.py +174 -0
  164. evalrx-0.1.2/evalrx/analyzers/uncertainty/coverage_gap.py +199 -0
  165. evalrx-0.1.2/evalrx/analyzers/uncertainty/entropy.py +90 -0
  166. evalrx-0.1.2/evalrx/analyzers/uncertainty/logprob_entropy.py +69 -0
  167. evalrx-0.1.2/evalrx/analyzers/uncertainty/self_consistency.py +204 -0
  168. evalrx-0.1.2/evalrx/analyzers/uncertainty/verbalized_conf.py +64 -0
  169. evalrx-0.1.2/evalrx/cli.py +411 -0
  170. evalrx-0.1.2/evalrx/config.py +77 -0
  171. evalrx-0.1.2/evalrx/contract/__init__.py +179 -0
  172. evalrx-0.1.2/evalrx/contract/common.py +452 -0
  173. evalrx-0.1.2/evalrx/contract/emit.py +948 -0
  174. evalrx-0.1.2/evalrx/contract/export.py +237 -0
  175. evalrx-0.1.2/evalrx/contract/m1.py +325 -0
  176. evalrx-0.1.2/evalrx/contract/m2.py +317 -0
  177. evalrx-0.1.2/evalrx/contract/m3.py +165 -0
  178. evalrx-0.1.2/evalrx/contract/m4.py +130 -0
  179. evalrx-0.1.2/evalrx/contract/m5.py +292 -0
  180. evalrx-0.1.2/evalrx/contract/methodology.py +76 -0
  181. evalrx-0.1.2/evalrx/contract/pre_m1.py +58 -0
  182. evalrx-0.1.2/evalrx/contract/typescript.py +140 -0
  183. evalrx-0.1.2/evalrx/core/__init__.py +85 -0
  184. evalrx-0.1.2/evalrx/core/analyzer.py +174 -0
  185. evalrx-0.1.2/evalrx/core/capability.py +54 -0
  186. evalrx-0.1.2/evalrx/core/case.py +443 -0
  187. evalrx-0.1.2/evalrx/core/experiment.py +106 -0
  188. evalrx-0.1.2/evalrx/core/model.py +198 -0
  189. evalrx-0.1.2/evalrx/core/pipeline.py +42 -0
  190. evalrx-0.1.2/evalrx/core/registry.py +142 -0
  191. evalrx-0.1.2/evalrx/core/result.py +64 -0
  192. evalrx-0.1.2/evalrx/core/spec.py +173 -0
  193. evalrx-0.1.2/evalrx/core/tokentype.py +165 -0
  194. evalrx-0.1.2/evalrx/core/tool.py +92 -0
  195. evalrx-0.1.2/evalrx/datasets/__init__.py +41 -0
  196. evalrx-0.1.2/evalrx/datasets/base.py +68 -0
  197. evalrx-0.1.2/evalrx/datasets/gui_os.py +52 -0
  198. evalrx-0.1.2/evalrx/datasets/llm_qa.py +57 -0
  199. evalrx-0.1.2/evalrx/datasets/pure_qa.py +12 -0
  200. evalrx-0.1.2/evalrx/datasets/vlm_qa.py +695 -0
  201. evalrx-0.1.2/evalrx/datasets/web_search_qa.py +52 -0
  202. evalrx-0.1.2/evalrx/eval_agent/__init__.py +341 -0
  203. evalrx-0.1.2/evalrx/eval_agent/_tools.py +81 -0
  204. evalrx-0.1.2/evalrx/eval_agent/ab_runner.py +50 -0
  205. evalrx-0.1.2/evalrx/eval_agent/agentic/__init__.py +43 -0
  206. evalrx-0.1.2/evalrx/eval_agent/agentic/actions.py +216 -0
  207. evalrx-0.1.2/evalrx/eval_agent/agentic/board.py +107 -0
  208. evalrx-0.1.2/evalrx/eval_agent/agentic/loop.py +190 -0
  209. evalrx-0.1.2/evalrx/eval_agent/agentic/tools.py +538 -0
  210. evalrx-0.1.2/evalrx/eval_agent/checkpoint.py +57 -0
  211. evalrx-0.1.2/evalrx/eval_agent/cli_agent.py +59 -0
  212. evalrx-0.1.2/evalrx/eval_agent/cli_skills.py +5 -0
  213. evalrx-0.1.2/evalrx/eval_agent/evolution.py +396 -0
  214. evalrx-0.1.2/evalrx/eval_agent/git_manager.py +215 -0
  215. evalrx-0.1.2/evalrx/eval_agent/hypothesis.py +172 -0
  216. evalrx-0.1.2/evalrx/eval_agent/label_quarantine.py +209 -0
  217. evalrx-0.1.2/evalrx/eval_agent/legacy.py +530 -0
  218. evalrx-0.1.2/evalrx/eval_agent/log_schema.py +497 -0
  219. evalrx-0.1.2/evalrx/eval_agent/loop.py +2159 -0
  220. evalrx-0.1.2/evalrx/eval_agent/loop_reports.py +116 -0
  221. evalrx-0.1.2/evalrx/eval_agent/model_instrumentation.py +282 -0
  222. evalrx-0.1.2/evalrx/eval_agent/narration.py +193 -0
  223. evalrx-0.1.2/evalrx/eval_agent/nl_runner.py +460 -0
  224. evalrx-0.1.2/evalrx/eval_agent/orchestrator.py +61 -0
  225. evalrx-0.1.2/evalrx/eval_agent/preregister.py +93 -0
  226. evalrx-0.1.2/evalrx/eval_agent/prompts/__init__.py +1 -0
  227. evalrx-0.1.2/evalrx/eval_agent/prompts/agentic.py +46 -0
  228. evalrx-0.1.2/evalrx/eval_agent/prompts/case_discovery.py +25 -0
  229. evalrx-0.1.2/evalrx/eval_agent/prompts/diagnosis.py +125 -0
  230. evalrx-0.1.2/evalrx/eval_agent/prompts/experiment_writer.py +265 -0
  231. evalrx-0.1.2/evalrx/eval_agent/prompts/explore_step.py +37 -0
  232. evalrx-0.1.2/evalrx/eval_agent/prompts/fix_agent.py +257 -0
  233. evalrx-0.1.2/evalrx/eval_agent/prompts/hypothesis_tester.py +15 -0
  234. evalrx-0.1.2/evalrx/eval_agent/prompts/nl_runner.py +38 -0
  235. evalrx-0.1.2/evalrx/eval_agent/prompts/probe_agent.py +25 -0
  236. evalrx-0.1.2/evalrx/eval_agent/prompts/probe_candidate_generator.py +14 -0
  237. evalrx-0.1.2/evalrx/eval_agent/prompts/probe_generator.py +35 -0
  238. evalrx-0.1.2/evalrx/eval_agent/prompts/whitebox_probe_generator.py +38 -0
  239. evalrx-0.1.2/evalrx/eval_agent/report.py +58 -0
  240. evalrx-0.1.2/evalrx/eval_agent/run_context.py +354 -0
  241. evalrx-0.1.2/evalrx/eval_agent/run_log.schema.json +1215 -0
  242. evalrx-0.1.2/evalrx/eval_agent/run_logger_v2.py +1764 -0
  243. evalrx-0.1.2/evalrx/eval_agent/run_metadata.py +208 -0
  244. evalrx-0.1.2/evalrx/eval_agent/stages/__init__.py +56 -0
  245. evalrx-0.1.2/evalrx/eval_agent/stages/case_discovery.py +293 -0
  246. evalrx-0.1.2/evalrx/eval_agent/stages/diagnosis.py +1017 -0
  247. evalrx-0.1.2/evalrx/eval_agent/stages/experiment_writer.py +1634 -0
  248. evalrx-0.1.2/evalrx/eval_agent/stages/fix_agent.py +3916 -0
  249. evalrx-0.1.2/evalrx/eval_agent/stages/fix_internals.py +499 -0
  250. evalrx-0.1.2/evalrx/eval_agent/stages/fix_pipeline.py +725 -0
  251. evalrx-0.1.2/evalrx/eval_agent/stages/fix_tiers.py +187 -0
  252. evalrx-0.1.2/evalrx/eval_agent/stages/fix_tools.py +1034 -0
  253. evalrx-0.1.2/evalrx/eval_agent/stages/hypothesis_tester.py +1014 -0
  254. evalrx-0.1.2/evalrx/eval_agent/stages/probe.py +439 -0
  255. evalrx-0.1.2/evalrx/eval_agent/stages/probe_agent.py +1079 -0
  256. evalrx-0.1.2/evalrx/eval_agent/stages/probe_candidate_generator.py +128 -0
  257. evalrx-0.1.2/evalrx/eval_agent/stages/probe_generator.py +326 -0
  258. evalrx-0.1.2/evalrx/eval_agent/stages/probe_search_agent.py +106 -0
  259. evalrx-0.1.2/evalrx/eval_agent/stages/protocol.py +112 -0
  260. evalrx-0.1.2/evalrx/eval_agent/stages/repair_catalog.py +273 -0
  261. evalrx-0.1.2/evalrx/eval_agent/stages/surgery.py +524 -0
  262. evalrx-0.1.2/evalrx/eval_agent/stages/whitebox_probe_generator.py +351 -0
  263. evalrx-0.1.2/evalrx/eval_agent/store.py +231 -0
  264. evalrx-0.1.2/evalrx/logging_utils.py +112 -0
  265. evalrx-0.1.2/evalrx/models/__init__.py +161 -0
  266. evalrx-0.1.2/evalrx/models/_discover.py +101 -0
  267. evalrx-0.1.2/evalrx/models/agent.py +380 -0
  268. evalrx-0.1.2/evalrx/models/backends/__init__.py +58 -0
  269. evalrx-0.1.2/evalrx/models/backends/api.py +169 -0
  270. evalrx-0.1.2/evalrx/models/backends/base.py +57 -0
  271. evalrx-0.1.2/evalrx/models/backends/gemini_compat.py +579 -0
  272. evalrx-0.1.2/evalrx/models/backends/hf_local.py +2074 -0
  273. evalrx-0.1.2/evalrx/models/backends/openai_compat.py +301 -0
  274. evalrx-0.1.2/evalrx/models/backends/vllm_offline.py +116 -0
  275. evalrx-0.1.2/evalrx/models/base.py +24 -0
  276. evalrx-0.1.2/evalrx/models/blackbox/__init__.py +4 -0
  277. evalrx-0.1.2/evalrx/models/blackbox/agent.py +31 -0
  278. evalrx-0.1.2/evalrx/models/blackbox/base.py +29 -0
  279. evalrx-0.1.2/evalrx/models/blackbox/gemini.py +279 -0
  280. evalrx-0.1.2/evalrx/models/blackbox/llm_api.py +17 -0
  281. evalrx-0.1.2/evalrx/models/blackbox/vlm_api.py +17 -0
  282. evalrx-0.1.2/evalrx/models/compose.py +66 -0
  283. evalrx-0.1.2/evalrx/models/inference.py +88 -0
  284. evalrx-0.1.2/evalrx/models/paper_methods/__init__.py +8 -0
  285. evalrx-0.1.2/evalrx/models/paper_methods/aad.py +53 -0
  286. evalrx-0.1.2/evalrx/models/paper_methods/ifcd.py +204 -0
  287. evalrx-0.1.2/evalrx/models/paper_methods/pai.py +164 -0
  288. evalrx-0.1.2/evalrx/models/paper_methods/tcd.py +202 -0
  289. evalrx-0.1.2/evalrx/models/paper_methods/vcd.py +45 -0
  290. evalrx-0.1.2/evalrx/models/paper_methods/vicrop.py +137 -0
  291. evalrx-0.1.2/evalrx/models/toolcodec.py +143 -0
  292. evalrx-0.1.2/evalrx/models/tools/__init__.py +20 -0
  293. evalrx-0.1.2/evalrx/models/tools/perception.py +300 -0
  294. evalrx-0.1.2/evalrx/models/tools/visual.py +174 -0
  295. evalrx-0.1.2/evalrx/models/whitebox/__init__.py +26 -0
  296. evalrx-0.1.2/evalrx/models/whitebox/agent.py +31 -0
  297. evalrx-0.1.2/evalrx/models/whitebox/base.py +24 -0
  298. evalrx-0.1.2/evalrx/models/whitebox/qwen.py +61 -0
  299. evalrx-0.1.2/evalrx/models/whitebox/qwen2_5_omni.py +29 -0
  300. evalrx-0.1.2/evalrx/models/whitebox/qwen2_audio.py +25 -0
  301. evalrx-0.1.2/evalrx/models/whitebox/qwen_omni.py +53 -0
  302. evalrx-0.1.2/evalrx/models/whitebox/qwen_vl.py +62 -0
  303. evalrx-0.1.2/evalrx/observability/__init__.py +21 -0
  304. evalrx-0.1.2/evalrx/observability/envelope.py +122 -0
  305. evalrx-0.1.2/evalrx/observability/outbox.py +111 -0
  306. evalrx-0.1.2/evalrx/observability/tracer.py +882 -0
  307. evalrx-0.1.2/evalrx/reporting/__init__.py +28 -0
  308. evalrx-0.1.2/evalrx/reporting/case_study.py +947 -0
  309. evalrx-0.1.2/evalrx/reporting/compiler.py +587 -0
  310. evalrx-0.1.2/evalrx/reporting/dynamic.py +1882 -0
  311. evalrx-0.1.2/evalrx/reporting/html_report.py +2225 -0
  312. evalrx-0.1.2/evalrx/reporting/langfuse_exporter.py +38 -0
  313. evalrx-0.1.2/evalrx/reporting/langfuse_source.py +155 -0
  314. evalrx-0.1.2/evalrx/reporting/model.py +151 -0
  315. evalrx-0.1.2/evalrx/reporting/run_events.py +184 -0
  316. evalrx-0.1.2/evalrx/reporting/server.py +557 -0
  317. evalrx-0.1.2/evalrx/reporting/stages.py +58 -0
  318. evalrx-0.1.2/evalrx/reporting/static_export.py +142 -0
  319. evalrx-0.1.2/evalrx/reporting/web_dist/index.html +146 -0
  320. evalrx-0.1.2/evalrx/specs.py +727 -0
  321. evalrx-0.1.2/evalrx/stats/__init__.py +47 -0
  322. evalrx-0.1.2/evalrx/stats/api.py +192 -0
  323. evalrx-0.1.2/evalrx/stats/bootstrap.py +86 -0
  324. evalrx-0.1.2/evalrx/stats/ebh.py +27 -0
  325. evalrx-0.1.2/evalrx/stats/evalue.py +98 -0
  326. evalrx-0.1.2/evalrx/stats/friedman.py +138 -0
  327. evalrx-0.1.2/evalrx/stats/mcnemar.py +40 -0
  328. evalrx-0.1.2/evalrx/stats/multiplicity.py +159 -0
  329. evalrx-0.1.2/evalrx/stats/subset_sampling.py +55 -0
  330. evalrx-0.1.2/evalrx/term_links.py +43 -0
  331. evalrx-0.1.2/evalrx/viz/__init__.py +7 -0
  332. evalrx-0.1.2/evalrx/viz/labels.py +77 -0
  333. evalrx-0.1.2/evalrx/viz/prompts.py +39 -0
  334. evalrx-0.1.2/evalrx/viz/renderer.py +590 -0
  335. evalrx-0.1.2/evalrx/viz/schema.py +36 -0
  336. evalrx-0.1.2/evalrx/viz/style.py +134 -0
  337. evalrx-0.1.2/evalrx.egg-info/PKG-INFO +532 -0
  338. evalrx-0.1.2/evalrx.egg-info/SOURCES.txt +343 -0
  339. evalrx-0.1.2/evalrx.egg-info/dependency_links.txt +1 -0
  340. evalrx-0.1.2/evalrx.egg-info/entry_points.txt +3 -0
  341. evalrx-0.1.2/evalrx.egg-info/requires.txt +69 -0
  342. evalrx-0.1.2/evalrx.egg-info/top_level.txt +1 -0
  343. evalrx-0.1.2/pyproject.toml +171 -0
  344. evalrx-0.1.2/setup.cfg +4 -0
  345. evalrx-0.1.2/tests/test_term_links.py +42 -0
evalrx-0.1.2/LICENSE ADDED
@@ -0,0 +1,121 @@
1
+ Creative Commons Legal Code
2
+
3
+ CC0 1.0 Universal
4
+
5
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12
+ HEREUNDER.
13
+
14
+ Statement of Purpose
15
+
16
+ The laws of most jurisdictions throughout the world automatically confer
17
+ exclusive Copyright and Related Rights (defined below) upon the creator
18
+ and subsequent owner(s) (each and all, an "owner") of an original work of
19
+ authorship and/or a database (each, a "Work").
20
+
21
+ Certain owners wish to permanently relinquish those rights to a Work for
22
+ the purpose of contributing to a commons of creative, cultural and
23
+ scientific works ("Commons") that the public can reliably and without fear
24
+ of later claims of infringement build upon, modify, incorporate in other
25
+ works, reuse and redistribute as freely as possible in any form whatsoever
26
+ and for any purposes, including without limitation commercial purposes.
27
+ These owners may contribute to the Commons to promote the ideal of a free
28
+ culture and the further production of creative, cultural and scientific
29
+ works, or to gain reputation or greater distribution for their Work in
30
+ part through the use and efforts of others.
31
+
32
+ For these and/or other purposes and motivations, and without any
33
+ expectation of additional consideration or compensation, the person
34
+ associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35
+ is an owner of Copyright and Related Rights in the Work, voluntarily
36
+ elects to apply CC0 to the Work and publicly distribute the Work under its
37
+ terms, with knowledge of his or her Copyright and Related Rights in the
38
+ Work and the meaning and intended legal effect of CC0 on those rights.
39
+
40
+ 1. Copyright and Related Rights. A Work made available under CC0 may be
41
+ protected by copyright and related or neighboring rights ("Copyright and
42
+ Related Rights"). Copyright and Related Rights include, but are not
43
+ limited to, the following:
44
+
45
+ i. the right to reproduce, adapt, distribute, perform, display,
46
+ communicate, and translate a Work;
47
+ ii. moral rights retained by the original author(s) and/or performer(s);
48
+ iii. publicity and privacy rights pertaining to a person's image or
49
+ likeness depicted in a Work;
50
+ iv. rights protecting against unfair competition in regards to a Work,
51
+ subject to the limitations in paragraph 4(a), below;
52
+ v. rights protecting the extraction, dissemination, use and reuse of data
53
+ in a Work;
54
+ vi. database rights (such as those arising under Directive 96/9/EC of the
55
+ European Parliament and of the Council of 11 March 1996 on the legal
56
+ protection of databases, and under any national implementation
57
+ thereof, including any amended or successor version of such
58
+ directive); and
59
+ vii. other similar, equivalent or corresponding rights throughout the
60
+ world based on applicable law or treaty, and any national
61
+ implementations thereof.
62
+
63
+ 2. Waiver. To the greatest extent permitted by, but not in contravention
64
+ of, applicable law, Affirmer hereby overtly, fully, permanently,
65
+ irrevocably and unconditionally waives, abandons, and surrenders all of
66
+ Affirmer's Copyright and Related Rights and associated claims and causes
67
+ of action, whether now known or unknown (including existing as well as
68
+ future claims and causes of action), in the Work (i) in all territories
69
+ worldwide, (ii) for the maximum duration provided by applicable law or
70
+ treaty (including future time extensions), (iii) in any current or future
71
+ medium and for any number of copies, and (iv) for any purpose whatsoever,
72
+ including without limitation commercial, advertising or promotional
73
+ purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74
+ member of the public at large and to the detriment of Affirmer's heirs and
75
+ successors, fully intending that such Waiver shall not be subject to
76
+ revocation, rescission, cancellation, termination, or any other legal or
77
+ equitable action to disrupt the quiet enjoyment of the Work by the public
78
+ as contemplated by Affirmer's express Statement of Purpose.
79
+
80
+ 3. Public License Fallback. Should any part of the Waiver for any reason
81
+ be judged legally invalid or ineffective under applicable law, then the
82
+ Waiver shall be preserved to the maximum extent permitted taking into
83
+ account Affirmer's express Statement of Purpose. In addition, to the
84
+ extent the Waiver is so judged Affirmer hereby grants to each affected
85
+ person a royalty-free, non transferable, non sublicensable, non exclusive,
86
+ irrevocable and unconditional license to exercise Affirmer's Copyright and
87
+ Related Rights in the Work (i) in all territories worldwide, (ii) for the
88
+ maximum duration provided by applicable law or treaty (including future
89
+ time extensions), (iii) in any current or future medium and for any number
90
+ of copies, and (iv) for any purpose whatsoever, including without
91
+ limitation commercial, advertising or promotional purposes (the
92
+ "License"). The License shall be deemed effective as of the date CC0 was
93
+ applied by Affirmer to the Work. Should any part of the License for any
94
+ reason be judged legally invalid or ineffective under applicable law, such
95
+ partial invalidity or ineffectiveness shall not invalidate the remainder
96
+ of the License, and in such case Affirmer hereby affirms that he or she
97
+ will not (i) exercise any of his or her remaining Copyright and Related
98
+ Rights in the Work or (ii) assert any associated claims and causes of
99
+ action with respect to the Work, in either case contrary to Affirmer's
100
+ express Statement of Purpose.
101
+
102
+ 4. Limitations and Disclaimers.
103
+
104
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
105
+ surrendered, licensed or otherwise affected by this document.
106
+ b. Affirmer offers the Work as-is and makes no representations or
107
+ warranties of any kind concerning the Work, express, implied,
108
+ statutory or otherwise, including without limitation warranties of
109
+ title, merchantability, fitness for a particular purpose, non
110
+ infringement, or the absence of latent or other defects, accuracy, or
111
+ the present or absence of errors, whether or not discoverable, all to
112
+ the greatest extent permissible under applicable law.
113
+ c. Affirmer disclaims responsibility for clearing rights of other persons
114
+ that may apply to the Work or any use thereof, including without
115
+ limitation any person's Copyright and Related Rights in the Work.
116
+ Further, Affirmer disclaims responsibility for obtaining any necessary
117
+ consents, permissions or other rights required for any use of the
118
+ Work.
119
+ d. Affirmer understands and acknowledges that Creative Commons is not a
120
+ party to this document and has no duty or obligation with respect to
121
+ this CC0 or use of the Work.
evalrx-0.1.2/PKG-INFO ADDED
@@ -0,0 +1,532 @@
1
+ Metadata-Version: 2.4
2
+ Name: evalrx
3
+ Version: 0.1.2
4
+ Summary: Failure case analysis in the era of LLM.
5
+ License: Creative Commons Legal Code
6
+
7
+ CC0 1.0 Universal
8
+
9
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
10
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
11
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
12
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
13
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
14
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
15
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
16
+ HEREUNDER.
17
+
18
+ Statement of Purpose
19
+
20
+ The laws of most jurisdictions throughout the world automatically confer
21
+ exclusive Copyright and Related Rights (defined below) upon the creator
22
+ and subsequent owner(s) (each and all, an "owner") of an original work of
23
+ authorship and/or a database (each, a "Work").
24
+
25
+ Certain owners wish to permanently relinquish those rights to a Work for
26
+ the purpose of contributing to a commons of creative, cultural and
27
+ scientific works ("Commons") that the public can reliably and without fear
28
+ of later claims of infringement build upon, modify, incorporate in other
29
+ works, reuse and redistribute as freely as possible in any form whatsoever
30
+ and for any purposes, including without limitation commercial purposes.
31
+ These owners may contribute to the Commons to promote the ideal of a free
32
+ culture and the further production of creative, cultural and scientific
33
+ works, or to gain reputation or greater distribution for their Work in
34
+ part through the use and efforts of others.
35
+
36
+ For these and/or other purposes and motivations, and without any
37
+ expectation of additional consideration or compensation, the person
38
+ associating CC0 with a Work (the "Affirmer"), to the extent that he or she
39
+ is an owner of Copyright and Related Rights in the Work, voluntarily
40
+ elects to apply CC0 to the Work and publicly distribute the Work under its
41
+ terms, with knowledge of his or her Copyright and Related Rights in the
42
+ Work and the meaning and intended legal effect of CC0 on those rights.
43
+
44
+ 1. Copyright and Related Rights. A Work made available under CC0 may be
45
+ protected by copyright and related or neighboring rights ("Copyright and
46
+ Related Rights"). Copyright and Related Rights include, but are not
47
+ limited to, the following:
48
+
49
+ i. the right to reproduce, adapt, distribute, perform, display,
50
+ communicate, and translate a Work;
51
+ ii. moral rights retained by the original author(s) and/or performer(s);
52
+ iii. publicity and privacy rights pertaining to a person's image or
53
+ likeness depicted in a Work;
54
+ iv. rights protecting against unfair competition in regards to a Work,
55
+ subject to the limitations in paragraph 4(a), below;
56
+ v. rights protecting the extraction, dissemination, use and reuse of data
57
+ in a Work;
58
+ vi. database rights (such as those arising under Directive 96/9/EC of the
59
+ European Parliament and of the Council of 11 March 1996 on the legal
60
+ protection of databases, and under any national implementation
61
+ thereof, including any amended or successor version of such
62
+ directive); and
63
+ vii. other similar, equivalent or corresponding rights throughout the
64
+ world based on applicable law or treaty, and any national
65
+ implementations thereof.
66
+
67
+ 2. Waiver. To the greatest extent permitted by, but not in contravention
68
+ of, applicable law, Affirmer hereby overtly, fully, permanently,
69
+ irrevocably and unconditionally waives, abandons, and surrenders all of
70
+ Affirmer's Copyright and Related Rights and associated claims and causes
71
+ of action, whether now known or unknown (including existing as well as
72
+ future claims and causes of action), in the Work (i) in all territories
73
+ worldwide, (ii) for the maximum duration provided by applicable law or
74
+ treaty (including future time extensions), (iii) in any current or future
75
+ medium and for any number of copies, and (iv) for any purpose whatsoever,
76
+ including without limitation commercial, advertising or promotional
77
+ purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
78
+ member of the public at large and to the detriment of Affirmer's heirs and
79
+ successors, fully intending that such Waiver shall not be subject to
80
+ revocation, rescission, cancellation, termination, or any other legal or
81
+ equitable action to disrupt the quiet enjoyment of the Work by the public
82
+ as contemplated by Affirmer's express Statement of Purpose.
83
+
84
+ 3. Public License Fallback. Should any part of the Waiver for any reason
85
+ be judged legally invalid or ineffective under applicable law, then the
86
+ Waiver shall be preserved to the maximum extent permitted taking into
87
+ account Affirmer's express Statement of Purpose. In addition, to the
88
+ extent the Waiver is so judged Affirmer hereby grants to each affected
89
+ person a royalty-free, non transferable, non sublicensable, non exclusive,
90
+ irrevocable and unconditional license to exercise Affirmer's Copyright and
91
+ Related Rights in the Work (i) in all territories worldwide, (ii) for the
92
+ maximum duration provided by applicable law or treaty (including future
93
+ time extensions), (iii) in any current or future medium and for any number
94
+ of copies, and (iv) for any purpose whatsoever, including without
95
+ limitation commercial, advertising or promotional purposes (the
96
+ "License"). The License shall be deemed effective as of the date CC0 was
97
+ applied by Affirmer to the Work. Should any part of the License for any
98
+ reason be judged legally invalid or ineffective under applicable law, such
99
+ partial invalidity or ineffectiveness shall not invalidate the remainder
100
+ of the License, and in such case Affirmer hereby affirms that he or she
101
+ will not (i) exercise any of his or her remaining Copyright and Related
102
+ Rights in the Work or (ii) assert any associated claims and causes of
103
+ action with respect to the Work, in either case contrary to Affirmer's
104
+ express Statement of Purpose.
105
+
106
+ 4. Limitations and Disclaimers.
107
+
108
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
109
+ surrendered, licensed or otherwise affected by this document.
110
+ b. Affirmer offers the Work as-is and makes no representations or
111
+ warranties of any kind concerning the Work, express, implied,
112
+ statutory or otherwise, including without limitation warranties of
113
+ title, merchantability, fitness for a particular purpose, non
114
+ infringement, or the absence of latent or other defects, accuracy, or
115
+ the present or absence of errors, whether or not discoverable, all to
116
+ the greatest extent permissible under applicable law.
117
+ c. Affirmer disclaims responsibility for clearing rights of other persons
118
+ that may apply to the Work or any use thereof, including without
119
+ limitation any person's Copyright and Related Rights in the Work.
120
+ Further, Affirmer disclaims responsibility for obtaining any necessary
121
+ consents, permissions or other rights required for any use of the
122
+ Work.
123
+ d. Affirmer understands and acknowledges that Creative Commons is not a
124
+ party to this document and has no duty or obligation with respect to
125
+ this CC0 or use of the Work.
126
+
127
+ Project-URL: Homepage, https://github.com/evalvitals/evalrx
128
+ Project-URL: Documentation, https://evalvitals.github.io/evalrx/
129
+ Project-URL: Repository, https://github.com/evalvitals/evalrx
130
+ Project-URL: Issues, https://github.com/evalvitals/evalrx/issues
131
+ Project-URL: Changelog, https://github.com/evalvitals/evalrx/blob/main/CHANGELOG.md
132
+ Keywords: llm,vlm,interpretability,failure-analysis,explainability
133
+ Classifier: Development Status :: 3 - Alpha
134
+ Classifier: Intended Audience :: Science/Research
135
+ Classifier: License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
136
+ Classifier: Programming Language :: Python :: 3
137
+ Classifier: Programming Language :: Python :: 3.10
138
+ Classifier: Programming Language :: Python :: 3.11
139
+ Classifier: Programming Language :: Python :: 3.12
140
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
141
+ Requires-Python: >=3.10
142
+ Description-Content-Type: text/markdown
143
+ License-File: LICENSE
144
+ Requires-Dist: pyyaml>=6.0
145
+ Requires-Dist: numpy>=1.24
146
+ Provides-Extra: local
147
+ Requires-Dist: torch>=2.0.0; extra == "local"
148
+ Requires-Dist: transformers>=4.51.0; extra == "local"
149
+ Requires-Dist: accelerate>=0.26.0; extra == "local"
150
+ Provides-Extra: finetune
151
+ Requires-Dist: peft>=0.10; extra == "finetune"
152
+ Provides-Extra: api
153
+ Requires-Dist: openai>=1.0; extra == "api"
154
+ Provides-Extra: interp
155
+ Requires-Dist: captum>=0.7; extra == "interp"
156
+ Requires-Dist: inseq>=0.6; extra == "interp"
157
+ Requires-Dist: nnsight>=0.3; extra == "interp"
158
+ Provides-Extra: data
159
+ Requires-Dist: datasets>=2.0; extra == "data"
160
+ Requires-Dist: pillow>=9.0; extra == "data"
161
+ Provides-Extra: contract
162
+ Requires-Dist: pydantic>=2.7; extra == "contract"
163
+ Provides-Extra: viz
164
+ Requires-Dist: matplotlib>=3.7; extra == "viz"
165
+ Provides-Extra: observability
166
+ Requires-Dist: langfuse>=4.7; extra == "observability"
167
+ Provides-Extra: ui
168
+ Requires-Dist: fastapi>=0.115; extra == "ui"
169
+ Requires-Dist: uvicorn>=0.30; extra == "ui"
170
+ Requires-Dist: python-multipart>=0.0.9; extra == "ui"
171
+ Provides-Extra: stats
172
+ Requires-Dist: statsmodels>=0.14; extra == "stats"
173
+ Requires-Dist: scikit-learn>=1.3; extra == "stats"
174
+ Provides-Extra: cluster
175
+ Requires-Dist: scikit-learn>=1.3; extra == "cluster"
176
+ Requires-Dist: hdbscan>=0.8.33; extra == "cluster"
177
+ Requires-Dist: langfuse>=4.7; extra == "cluster"
178
+ Provides-Extra: gemini
179
+ Requires-Dist: google-genai>=1.0; extra == "gemini"
180
+ Provides-Extra: all
181
+ Requires-Dist: torch>=2.0.0; extra == "all"
182
+ Requires-Dist: transformers>=4.51.0; extra == "all"
183
+ Requires-Dist: accelerate>=0.26.0; extra == "all"
184
+ Requires-Dist: peft>=0.10; extra == "all"
185
+ Requires-Dist: openai>=1.0; extra == "all"
186
+ Requires-Dist: captum>=0.7; extra == "all"
187
+ Requires-Dist: inseq>=0.6; extra == "all"
188
+ Requires-Dist: nnsight>=0.3; extra == "all"
189
+ Requires-Dist: matplotlib>=3.7; extra == "all"
190
+ Requires-Dist: statsmodels>=0.14; extra == "all"
191
+ Requires-Dist: scikit-learn>=1.3; extra == "all"
192
+ Requires-Dist: hdbscan>=0.8.33; extra == "all"
193
+ Provides-Extra: dev
194
+ Requires-Dist: pytest>=8.0; extra == "dev"
195
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"
196
+ Requires-Dist: ruff>=0.4; extra == "dev"
197
+ Requires-Dist: mypy>=1.8; extra == "dev"
198
+ Requires-Dist: jsonschema>=4.0; extra == "dev"
199
+ Dynamic: license-file
200
+
201
+ <div align="center">
202
+
203
+ # EvalRX
204
+
205
+ ### Your eval tells you *what* failed. EvalRX investigates *why*—and tests what fixes it.
206
+
207
+ <img src="docs/assets/figures/model-health-teaser.svg" alt="A model-health signal enters an auto-research loop that probes, explains and intervenes; only a held-out verified pass updates the model to n+1, which recurs as the next research subject." width="640">
208
+
209
+ [![PyPI version](https://img.shields.io/pypi/v/evalrx?color=3D8DFF)](https://pypi.org/project/evalrx/)
210
+ [![Python versions](https://img.shields.io/pypi/pyversions/evalrx?color=3D8DFF)](https://pypi.org/project/evalrx/)
211
+ [![CI](https://github.com/evalvitals/evalrx/actions/workflows/ci.yml/badge.svg)](https://github.com/evalvitals/evalrx/actions/workflows/ci.yml)
212
+ [![Docs](https://img.shields.io/badge/docs-live-3D8DFF)](https://evalvitals.github.io/evalrx/overview/)
213
+ [![Demo](https://img.shields.io/badge/demo-live-39A96B)](https://evalvitals.github.io/evalrx/demo/)
214
+ [![License: CC0-1.0](https://img.shields.io/badge/license-CC0--1.0-39A96B)](LICENSE)
215
+
216
+ [Get started](#quickstart-analyze-your-eval-logs) · [Documentation](https://evalvitals.github.io/evalrx/overview/) · [Live demo](https://evalvitals.github.io/evalrx/demo/) · [Examples](examples/README.md) · [PyPI](https://pypi.org/project/evalrx/)
217
+
218
+ </div>
219
+
220
+ Every eval stack ends at a score. EvalRX starts there and closes the loop:
221
+ probe the model for failures, find the structure behind them, propose a
222
+ mechanism, **test it on cases the analysis never saw**, then build a repair and
223
+ prove it beats the unmodified baseline. When a repair fails, the loop escalates
224
+ to a more invasive class of fix and tries again.
225
+
226
+ The aim is a model that gets measurably better each time round — without a
227
+ human guessing at the cause.
228
+
229
+ ```mermaid
230
+ flowchart LR
231
+ A[Open-weight model] --> B[Probe]
232
+ B --> C[Explore]
233
+ C --> D[Diagnose]
234
+ D --> E{Held-out<br/>verification}
235
+ E -->|refuted| B
236
+ E -->|supported| F[Repair]
237
+ F --> G{Beats<br/>baseline?}
238
+ G -->|yes| H[Validated fix]
239
+ G -->|no| I[Escalate one tier]
240
+ I --> F
241
+ ```
242
+
243
+ ### The repair ladder
244
+
245
+ "Fix it" is not one action. Repairs are ordered by how deeply they cut into the
246
+ model — each rung buys causal reach and costs deployability:
247
+
248
+ | | Intervention space | Status |
249
+ |---|---|---|
250
+ | **L1** | Prompt and instruction rewrites | ✅ |
251
+ | **L2** | Scaffolds around an unchanged model — multi-call, tools, aggregation | ✅ |
252
+ | **L3a** | Read internals — attention-guided cropping, contrastive decoding | ✅ |
253
+ | **L3b** | Write internals — attention reweighting, activation steering | ✅ |
254
+ | **L4** | **Parameter space — build a dataset, fine-tune, re-test** | ✅ LoRA on the LLM only; other recipe shapes recorded, not yet executed |
255
+
256
+ Escalation is never automatic. The ceiling is yours to set (default L2); when
257
+ every candidate at that ceiling fails paired validation, the loop *recommends*
258
+ raising it rather than climbing on its own. At L4 the system always writes a
259
+ complete fine-tune recipe; it *executes* the one shape v1 supports —
260
+ LoRA on the language model, trained on a diagnosis-only pool you pass as
261
+ `FixAgent(finetune_pool=...)`, and validated through the same paired McNemar
262
+ + e-value machinery as every other tier — see
263
+ [`fix_internals.py`](evalrx/eval_agent/stages/fix_internals.py) and
264
+ [`fix_tiers.py`](evalrx/eval_agent/stages/fix_tiers.py).
265
+
266
+ **L3b and L4 only exist for open weights.** You cannot modify a forward pass or
267
+ fine-tune through somebody's API — which is why this is built on open models.
268
+
269
+ ### One typed shape per stage
270
+
271
+ Every stage validates what it writes against a machine-readable contract
272
+ (`evalrx/contract/`) and drops it in `<run>/contract/`. TypeScript for the
273
+ whole pipeline is generated from the same Python — `python -m
274
+ evalrx.contract.export --out docs/contract` — so a UI decodes a stage
275
+ instead of re-deriving its shape from the event log.
276
+
277
+ Modality lives in that contract as *slots*, never as a model-kind enum: LLM,
278
+ VLM, ALM and AVLM are four subsets of `{text, image, audio, video}`, and
279
+ analyzer routing follows the slots a **batch** fills rather than the ones a
280
+ model declares. An omni model evaluated on an audio benchmark is diagnosed as
281
+ an audio run.
282
+
283
+ ### Why the loop is trustworthy
284
+
285
+ A self-improving system is only as good as its willingness to reject its own
286
+ hypotheses. One that cannot will confidently ship repairs for problems it
287
+ invented.
288
+
289
+ We pointed EvalRX at three Qwen3-VL checkpoints and asked what predicts
290
+ object hallucination. It found that attention focus share separates
291
+ hallucinations from correct rejections at **AUC 0.82** — then, unprompted,
292
+ argued that its *second* strongest signal was an artifact of how attention was
293
+ extracted, not a real effect. It marked its own best number optimistic, because
294
+ the threshold had been chosen on the rows it was scored on.
295
+
296
+ **Most eval tools would have shipped you that second finding.**
297
+
298
+ <img src="examples/m2_m3/deco_hallu_explore/reference_output/figures/attention_geometry_fail_vs_pass.png" alt="Attention geometry of hallucinations vs correct rejections across seven per-case signals, each panel labeled with its AUC and 95% confidence interval" width="100%">
299
+
300
+ <sub>Generated by the run, not by hand. The contrast is drawn only over
301
+ absent-object probes (n=126 FAIL, n=240 PASS) — the whole-sample version would
302
+ have looked stronger and meant less.</sub>
303
+
304
+ Held-out splits are taken *before* exploration, multiplicity is controlled with
305
+ e-BH across the candidate family, and every fix is compared against the
306
+ unchanged baseline. A run may end **inconclusive** — and frequently should.
307
+
308
+ ### Two runs you can read right now
309
+
310
+ No install required — these are real runs, committed unmodified.
311
+
312
+ | Run | What it shows |
313
+ |---|---|
314
+ | [**Attention & hallucination**](examples/m2_m3/deco_hallu_explore/reference_output/) | 606 real VLM cases across three checkpoints. Finds AUC 0.82, then attacks its own result. 1 of 4 candidate signals survives adjudication. |
315
+ | [**The confound catch**](examples/m2_m3/synthetic_yield_explore/reference_output/) | Catalyst looks significant (ANOVA p = 0.080) until the run notices the groups differ by 21° in temperature. **0 of 4 signals confirmed** — the correct answer. |
316
+
317
+ ## Quickstart: Analyze Your Eval Logs
318
+
319
+ Install EvalRX:
320
+
321
+ ```bash
322
+ pip install evalrx
323
+ ```
324
+
325
+ Then point it at a file or directory of JSON/JSONL results:
326
+
327
+ ```bash
328
+ evalrx explore ./results \
329
+ --backend codex \
330
+ -q "What distinguishes failed cases from successful ones?" \
331
+ --serve-report
332
+ ```
333
+
334
+ `codex` can be replaced with `claude_code`, `opencode`, `gemini_cli`,
335
+ `kimi_cli`, or `antigravity`. The selected coding-agent CLI must be installed
336
+ and authenticated separately.
337
+
338
+ Open a finished run in the browser:
339
+
340
+ ```bash
341
+ evalrx serve evalrx_explore_output
342
+ ```
343
+
344
+ `serve` runs the report UI locally as a small server. For a single portable
345
+ file — no server, suitable for sharing — export it instead:
346
+
347
+ ```bash
348
+ evalrx report evalrx_explore_output --out report.html
349
+ ```
350
+
351
+ Both read the same output directory and render the same UI; see the
352
+ [CLI reference](https://evalvitals.github.io/evalrx/cli/) for the rest of the
353
+ command set (Langfuse export, a runs panel over several experiments, …).
354
+
355
+ EvalRX writes an auditable analysis bundle instead of returning only prose:
356
+
357
+ ```text
358
+ evalrx_explore_output/
359
+ ├── exploratory_report.json # observations, candidate signals, hypotheses
360
+ ├── records.json # normalized records used by the analysis
361
+ ├── figures/ # rendered charts
362
+ ├── tables/ # analysis-ready tables
363
+ └── analysis.py # the generated code that was actually run
364
+ ```
365
+
366
+ **A real bundled run:** on the synthetic-yield example, Explore identified
367
+ temperature as the strongest observed correlate (`r = 0.90`, 95% CI 0.81–0.95),
368
+ found pressure flat (`r = -0.14`) without converting that null into evidence of
369
+ absence, and caught that the apparent catalyst effect tracks a 21-unit
370
+ temperature imbalance between groups. Zero of four candidate signals cleared
371
+ adjudication. [Read the committed bundle →](examples/m2_m3/synthetic_yield_explore/reference_output/)
372
+
373
+ Already have your own analysis code? Use the analyzer toolkit directly, or
374
+ feed the resulting cases into the full diagnosis loop. EvalRX does not
375
+ require you to replace your existing eval or observability stack.
376
+
377
+ ## What Makes It Different
378
+
379
+ | Typical eval workflow | EvalRX |
380
+ |---|---|
381
+ | Aggregate a metric | Investigate the cases behind the metric |
382
+ | Browse failures manually | Search for recurring, structured failure modes |
383
+ | Accept an LLM explanation | Turn explanations into falsifiable hypotheses |
384
+ | Test on the same cases used for discovery | Separate exploration from held-out confirmation |
385
+ | Report a promising prompt rewrite | Compare interventions with the unchanged baseline |
386
+ | Choose either API-level or internal analysis | Negotiate black-box and white-box capabilities through one interface |
387
+
388
+ Statistical gates use paired tests and e-values, including multiplicity control
389
+ when several hypotheses or fixes are tried. A run may end **inconclusive**;
390
+ EvalRX does not turn weak evidence into a success verdict.
391
+
392
+ ## Three Ways to Use EvalRX
393
+
394
+ ### 1. Explore — raw results to testable hypotheses
395
+
396
+ `evalrx explore` recursively samples arbitrary JSON/JSONL shapes. The
397
+ coding agent performs exploratory data analysis; the host records generated
398
+ code, adjudicates host-checkable statistics, renders figures, and proposes
399
+ 1–3 falsifiable hypotheses.
400
+
401
+ [Explore guide →](docs/m2_analysis.md)
402
+
403
+ ### 2. Investigate — failures to verified interventions
404
+
405
+ `VLDiagnoseLoop` chains the full workflow:
406
+
407
+ ```text
408
+ M1 targeted probes
409
+ → M2 exploratory and statistical analysis
410
+ → M3 diagnosis hypotheses
411
+ → M4 held-out hypothesis verification
412
+ → M5 surgery and tiered fixes
413
+ ```
414
+
415
+ Interventions can range from prompt changes and scaffolds to read/write access
416
+ to model internals. Each candidate is evaluated against the unmodified
417
+ baseline; automatic escalation happens only when explicitly enabled.
418
+
419
+ [Full-loop quickstart →](docs/quickstart.md#vldiagnoseloop--automated-failure-attribution-current) ·
420
+ [Intervention guide →](docs/intervention.md)
421
+
422
+ ### 3. Analyze — one model, one question
423
+
424
+ Every registered analyzer follows the same call shape:
425
+
426
+ ```python
427
+ from evalrx import Capability, compose
428
+ from evalrx.analyzers.attention.summary import AttentionAnalyzer
429
+
430
+ model = compose(
431
+ "qwen2.5-7b-instruct",
432
+ "hf_local",
433
+ want={Capability.ATTENTION},
434
+ )
435
+
436
+ result = AttentionAnalyzer(layer=-1, top_k=5).run(
437
+ model, "The Eiffel Tower is in"
438
+ )
439
+
440
+ print(result.summary())
441
+ ```
442
+
443
+ The analyzer zoo includes attention, uncertainty, hallucination, attribution,
444
+ logit-lens, representation-geometry, and agent-trajectory analysis.
445
+
446
+ [Browse the Analyzer Zoo →](docs/analyzers.md)
447
+
448
+ ## Installation
449
+
450
+ The core install stays lightweight—no Torch required:
451
+
452
+ ```bash
453
+ pip install evalrx
454
+ ```
455
+
456
+ Add only the capabilities you need:
457
+
458
+ ```bash
459
+ pip install "evalrx[api]" # OpenAI-compatible API models
460
+ pip install "evalrx[local]" # local Hugging Face models + Torch
461
+ pip install "evalrx[interp]" # interpretability toolchains
462
+ pip install "evalrx[viz]" # plots
463
+ pip install "evalrx[stats]" # inferential statistics
464
+ ```
465
+
466
+ For development:
467
+
468
+ ```bash
469
+ git clone https://github.com/evalvitals/evalrx.git
470
+ cd evalrx
471
+ pip install -e ".[dev]"
472
+ pytest -m "not gpu"
473
+ ```
474
+
475
+ ## Architecture in One Minute
476
+
477
+ Model identity is separate from runtime, and analyzers declare the
478
+ capabilities they need. The same model spec can run through a black-box API or
479
+ a white-box local backend; only the available capability set changes.
480
+
481
+ | Contract | Role |
482
+ |---|---|
483
+ | `ModelSpec` | Model identity: family, repository, architecture traits, modalities. |
484
+ | `Backend` | Runtime: local internals, black-box API, or offline batch engine. |
485
+ | `Model` | Runnable model with generation and optional internal capture. |
486
+ | `Analyzer` | `Analyzer(**params).run(model, data) -> Result`. |
487
+ | `Capability` | Matches analyzers to compatible model runtimes before execution. |
488
+ | `FailureCase` | Prompts, labels, provenance, metadata, and agent trajectories. |
489
+ | `Result` | Human-readable summary plus structured, serializable findings. |
490
+
491
+ [Read the architecture guide →](docs/architecture.md)
492
+
493
+ ## Reproducible Examples
494
+
495
+ Two examples ship with **committed output bundles** — readable without
496
+ installing anything, marked 📦 below.
497
+
498
+ | Example | What it demonstrates |
499
+ |---|---|
500
+ | 📦 [`synthetic_yield_explore`](examples/m2_m3/synthetic_yield_explore/reference_output/) | Standalone Explore on structured tabular outcomes — and a confound caught unprompted. |
501
+ | 📦 [`deco_hallu_explore`](examples/m2_m3/deco_hallu_explore/reference_output/) | Explore → held-out hypothesis tests → tiered repair, on 606 real VLM cases. |
502
+ | [`deco_hallu`](examples/m1_m5/deco_hallu/) | Decoupled multimodal hallucination diagnosis and intervention. |
503
+ | [`qwen_attention`](examples/analyzer_demos/qwen_attention/) | White-box attention analysis on a local model. |
504
+
505
+ [See all examples →](examples/README.md)
506
+
507
+ ## Documentation
508
+
509
+ | | |
510
+ |---|---|
511
+ | [Quickstart](docs/quickstart.md) | Runnable examples and common entry points |
512
+ | [Command-Line Interface](docs/cli.md) | Every `evalrx` subcommand — `explore`, `serve`, `report`, and the rest |
513
+ | [Exploratory Analysis](docs/m2_analysis.md) | Standalone `evalrx explore` — descriptive analysis + hypothesis proposal |
514
+ | [Intervention & Verification](docs/intervention.md) | Held-out hypothesis tests and the tiered repair ladder |
515
+ | [Analyzer Zoo](docs/analyzers.md) | Reference tables of implemented analyzers and registered models |
516
+ | [Architecture](docs/architecture.md) | Package structure and design contracts |
517
+ | [Extending EvalRX](docs/extending.md) | How to add analyzers, specs, and backends |
518
+ | [Roadmap](docs/roadmap.md) | Current implementation status and planned surfaces |
519
+
520
+ The full site — same pages, searchable — is live at
521
+ [evalvitals.github.io/evalrx](https://evalvitals.github.io/evalrx/overview/).
522
+
523
+ ## Project Status
524
+
525
+ EvalRX is an early-stage research toolkit. Interfaces may evolve, and some
526
+ full-loop examples require model weights, a GPU, or an external coding-agent
527
+ CLI. Bug reports, reproducible failure cases, analyzer contributions, and
528
+ evaluation integrations are welcome.
529
+
530
+ If EvalRX helps you understand a model failure, consider starring the repo
531
+ and sharing the smallest reproducible case—it makes the toolkit better for the
532
+ next investigation.