verifiers 0.1.15.dev414__tar.gz → 0.1.15.dev416__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 (406) hide show
  1. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/PKG-INFO +1 -1
  2. verifiers-0.1.15.dev416/tests/v1/test_scoring.py +33 -0
  3. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/__init__.py +15 -0
  4. verifiers-0.1.15.dev416/verifiers/v1/cli/dashboard/base.py +108 -0
  5. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/dashboard/eval.py +48 -11
  6. verifiers-0.1.15.dev416/verifiers/v1/scoring.py +166 -0
  7. verifiers-0.1.15.dev414/verifiers/v1/cli/dashboard/base.py +0 -32
  8. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/.gitignore +0 -0
  9. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/LICENSE +0 -0
  10. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/README.md +0 -0
  11. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/pyproject.toml +0 -0
  12. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/AGENTS.md +0 -0
  13. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/README.md +0 -0
  14. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/__init__.py +0 -0
  15. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/conftest.py +0 -0
  16. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_browser_env.py +0 -0
  17. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_build_script.py +0 -0
  18. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_cli_agent_env.py +0 -0
  19. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_client_auth_errors.py +0 -0
  20. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_client_config.py +0 -0
  21. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_client_multimodal_types.py +0 -0
  22. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_composable_env.py +0 -0
  23. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_context_token_metrics.py +0 -0
  24. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_decorator_ranks.py +0 -0
  25. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_endpoint_registry.py +0 -0
  26. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_env_group.py +0 -0
  27. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_env_server.py +0 -0
  28. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_environment.py +0 -0
  29. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_environment_extra.py +0 -0
  30. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_envs.py +0 -0
  31. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_error_chain.py +0 -0
  32. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_eval_display.py +0 -0
  33. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_eval_utils.py +0 -0
  34. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_gepa_cli.py +0 -0
  35. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_gepa_utils.py +0 -0
  36. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_gym_env.py +0 -0
  37. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_harbor_env_mcp.py +0 -0
  38. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_imports.py +0 -0
  39. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_init_script.py +0 -0
  40. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_install_utils.py +0 -0
  41. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_interception_utils.py +0 -0
  42. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_logging.py +0 -0
  43. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_math_rubric.py +0 -0
  44. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_maybe_think_parser.py +0 -0
  45. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_message_utils.py +0 -0
  46. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_message_utils_multimodal.py +0 -0
  47. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_multiturn_env.py +0 -0
  48. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_nemorl_client.py +0 -0
  49. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_openai_chat_completions_token_client.py +0 -0
  50. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_openai_responses_client.py +0 -0
  51. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_opencode_rlm_env.py +0 -0
  52. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_openenv_client.py +0 -0
  53. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_parser.py +0 -0
  54. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_path_utils.py +0 -0
  55. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_per_turn_timing.py +0 -0
  56. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_pricing_utils.py +0 -0
  57. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_prime_plugin.py +0 -0
  58. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_renderer_client.py +0 -0
  59. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_renderer_e2e.py +0 -0
  60. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_rlm_composable_env.py +0 -0
  61. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_rubric.py +0 -0
  62. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_rubric_group.py +0 -0
  63. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_sandbox_debug_env.py +0 -0
  64. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_sandbox_env.py +0 -0
  65. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_sandbox_mixin.py +0 -0
  66. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_save_utils.py +0 -0
  67. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_setup_script.py +0 -0
  68. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_singleturn_env.py +0 -0
  69. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_stateful_tool_env.py +0 -0
  70. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_think_parser.py +0 -0
  71. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_tool_env.py +0 -0
  72. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_tool_utils.py +0 -0
  73. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_trajectory_processing.py +0 -0
  74. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_tui_info_formatting.py +0 -0
  75. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_types.py +0 -0
  76. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_wordle_env.py +0 -0
  77. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_xml_parser.py +0 -0
  78. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/conftest.py +0 -0
  79. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  80. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  81. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  82. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  83. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  84. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_v0.py +0 -0
  85. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_v1.py +0 -0
  86. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/pyproject.toml +0 -0
  87. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  88. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_color_codeword_tasks.py +0 -0
  89. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_configs.py +0 -0
  90. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_e2e.py +0 -0
  91. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_envs.py +0 -0
  92. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_graph.py +0 -0
  93. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_legacy.py +0 -0
  94. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_trace.py +0 -0
  95. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/AGENTS.md +0 -0
  96. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/__init__.py +0 -0
  97. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/__init__.py +0 -0
  98. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/__init__.py +0 -0
  99. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/build.py +0 -0
  100. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/eval.py +0 -0
  101. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/gepa.py +0 -0
  102. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/init.py +0 -0
  103. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/install.py +0 -0
  104. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/setup.py +0 -0
  105. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/plugins/__init__.py +0 -0
  106. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/plugins/prime.py +0 -0
  107. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/tui.py +0 -0
  108. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/__init__.py +0 -0
  109. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/anthropic_messages_client.py +0 -0
  110. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/client.py +0 -0
  111. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  112. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/openai_chat_completions_client.py +0 -0
  113. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  114. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/openai_completions_client.py +0 -0
  115. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/openai_responses_client.py +0 -0
  116. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/renderer_client.py +0 -0
  117. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/decorators.py +0 -0
  118. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/AGENTS.md +0 -0
  119. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/__init__.py +0 -0
  120. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/env_group.py +0 -0
  121. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/environment.py +0 -0
  122. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/README.md +0 -0
  123. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/__init__.py +0 -0
  124. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  125. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/README.md +0 -0
  126. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/__init__.py +0 -0
  127. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/_filter.py +0 -0
  128. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  129. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harness.py +0 -0
  130. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  131. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  132. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  133. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  134. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  135. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  136. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  137. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/task.py +0 -0
  138. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  139. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  140. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  141. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  142. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  143. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  144. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  145. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  146. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  147. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  148. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  149. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  150. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  151. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  152. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  153. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  154. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  155. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  156. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  157. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  158. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  159. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  160. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  161. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  162. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  163. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  164. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  165. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  166. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  167. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  168. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  169. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  170. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  171. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  172. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  173. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  174. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  175. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  176. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  177. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  178. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  179. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  180. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  181. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  182. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  183. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  184. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  185. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  186. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  187. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  188. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  189. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  190. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  191. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  192. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  193. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  194. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  195. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  196. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  197. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  198. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  199. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  200. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  201. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/gym_env.py +0 -0
  202. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  203. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  204. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  205. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/mcp_env.py +0 -0
  206. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/opencode_env.py +0 -0
  207. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  208. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  209. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  210. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/utils/__init__.py +0 -0
  211. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  212. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  213. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/README.md +0 -0
  214. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/__init__.py +0 -0
  215. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/README.md +0 -0
  216. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  217. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  218. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  219. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  220. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  221. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  222. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/openenv_env.py +0 -0
  223. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  224. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/textarena_env.py +0 -0
  225. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/multiturn_env.py +0 -0
  226. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/python_env.py +0 -0
  227. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/sandbox_env.py +0 -0
  228. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/singleturn_env.py +0 -0
  229. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/stateful_tool_env.py +0 -0
  230. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/tool_env.py +0 -0
  231. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/errors.py +0 -0
  232. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/__init__.py +0 -0
  233. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/adapter.py +0 -0
  234. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/config.py +0 -0
  235. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/display.py +0 -0
  236. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/gepa_utils.py +0 -0
  237. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/__init__.py +0 -0
  238. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/maybe_think_parser.py +0 -0
  239. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/parser.py +0 -0
  240. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/think_parser.py +0 -0
  241. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/xml_parser.py +0 -0
  242. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/README.md +0 -0
  243. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/__init__.py +0 -0
  244. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/inference/__init__.py +0 -0
  245. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/inference/client.py +0 -0
  246. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/inference/server.py +0 -0
  247. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/__init__.py +0 -0
  248. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/config.py +0 -0
  249. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/orchestrator.py +0 -0
  250. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/trainer.py +0 -0
  251. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/utils.py +0 -0
  252. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/__init__.py +0 -0
  253. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  254. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/judge_rubric.py +0 -0
  255. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/math_rubric.py +0 -0
  256. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/rubric.py +0 -0
  257. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/rubric_group.py +0 -0
  258. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/__init__.py +0 -0
  259. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/build.py +0 -0
  260. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/eval.py +0 -0
  261. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/gepa.py +0 -0
  262. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/init.py +0 -0
  263. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/install.py +0 -0
  264. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/rl.py +0 -0
  265. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/setup.py +0 -0
  266. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/train.py +0 -0
  267. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/tui.py +0 -0
  268. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/vllm.py +0 -0
  269. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/__init__.py +0 -0
  270. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/client/env_client.py +0 -0
  271. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/client/zmq_env_client.py +0 -0
  272. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/__init__.py +0 -0
  273. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/env_router.py +0 -0
  274. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/env_server.py +0 -0
  275. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/env_worker.py +0 -0
  276. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/zmq_env_server.py +0 -0
  277. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/types.py +0 -0
  278. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/types.py +0 -0
  279. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/__init__.py +0 -0
  280. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/async_utils.py +0 -0
  281. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/client_utils.py +0 -0
  282. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/config_utils.py +0 -0
  283. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/data_utils.py +0 -0
  284. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/display_utils.py +0 -0
  285. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/env_config_utils.py +0 -0
  286. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/env_utils.py +0 -0
  287. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/error_utils.py +0 -0
  288. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/eval_display.py +0 -0
  289. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/eval_utils.py +0 -0
  290. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/heartbeat.py +0 -0
  291. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/import_utils.py +0 -0
  292. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/install_utils.py +0 -0
  293. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/interception_utils.py +0 -0
  294. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/logging_utils.py +0 -0
  295. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/message_utils.py +0 -0
  296. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/metric_utils.py +0 -0
  297. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/path_utils.py +0 -0
  298. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/pricing_utils.py +0 -0
  299. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/process_utils.py +0 -0
  300. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/response_utils.py +0 -0
  301. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/save_utils.py +0 -0
  302. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/serve_utils.py +0 -0
  303. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/thread_utils.py +0 -0
  304. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/threaded_sandbox_client.py +0 -0
  305. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/tool_utils.py +0 -0
  306. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/usage_utils.py +0 -0
  307. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/version_utils.py +0 -0
  308. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/ARCHITECTURE.md +0 -0
  309. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/GUIDE.md +0 -0
  310. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/README.md +0 -0
  311. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/__init__.py +0 -0
  312. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  313. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/dashboard/validate.py +0 -0
  314. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/eval/__init__.py +0 -0
  315. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/eval/main.py +0 -0
  316. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/eval/resume.py +0 -0
  317. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/eval/runner.py +0 -0
  318. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/init.py +0 -0
  319. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/output.py +0 -0
  320. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/resolve.py +0 -0
  321. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/serve.py +0 -0
  322. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/validate.py +0 -0
  323. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/__init__.py +0 -0
  324. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/client.py +0 -0
  325. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/config.py +0 -0
  326. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/eval.py +0 -0
  327. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/train.py +0 -0
  328. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/__init__.py +0 -0
  329. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/eval.py +0 -0
  330. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/init.py +0 -0
  331. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/serve.py +0 -0
  332. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/validate.py +0 -0
  333. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/decorators.py +0 -0
  334. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/__init__.py +0 -0
  335. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/anthropic.py +0 -0
  336. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/base.py +0 -0
  337. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/chat.py +0 -0
  338. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/responses.py +0 -0
  339. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/env.py +0 -0
  340. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/episode.py +0 -0
  341. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/errors.py +0 -0
  342. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/graph.py +0 -0
  343. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harness.py +0 -0
  344. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/__init__.py +0 -0
  345. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  346. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/codex/harness.py +0 -0
  347. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/default/__init__.py +0 -0
  348. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/default/harness.py +0 -0
  349. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/default/program.py +0 -0
  350. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  351. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  352. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  353. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  354. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  355. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/null/__init__.py +0 -0
  356. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/null/harness.py +0 -0
  357. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/null/program.py +0 -0
  358. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  359. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  360. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  361. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  362. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  363. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/interception/__init__.py +0 -0
  364. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/interception/pool.py +0 -0
  365. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/interception/server.py +0 -0
  366. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/judge.py +0 -0
  367. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/legacy.py +0 -0
  368. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/loaders.py +0 -0
  369. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/__init__.py +0 -0
  370. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/launch.py +0 -0
  371. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/multiplex.py +0 -0
  372. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/server.py +0 -0
  373. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/toolset.py +0 -0
  374. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/user.py +0 -0
  375. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/retries.py +0 -0
  376. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/rollout.py +0 -0
  377. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/__init__.py +0 -0
  378. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/base.py +0 -0
  379. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/docker.py +0 -0
  380. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/limiters.py +0 -0
  381. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/modal.py +0 -0
  382. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/prime.py +0 -0
  383. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/subprocess.py +0 -0
  384. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/__init__.py +0 -0
  385. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/client.py +0 -0
  386. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/pool.py +0 -0
  387. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/server.py +0 -0
  388. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/types.py +0 -0
  389. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/state.py +0 -0
  390. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/task.py +0 -0
  391. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/taskset.py +0 -0
  392. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/__init__.py +0 -0
  393. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  394. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  395. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  396. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  397. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  398. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  399. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  400. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/trace.py +0 -0
  401. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/types.py +0 -0
  402. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/utils/__init__.py +0 -0
  403. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/utils/format.py +0 -0
  404. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/utils/install.py +0 -0
  405. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/utils/logging.py +0 -0
  406. {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/utils/memory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.1.15.dev414
3
+ Version: 0.1.15.dev416
4
4
  Summary: Verifiers: Environments for LLM Reinforcement Learning
5
5
  Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
6
6
  Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
@@ -0,0 +1,33 @@
1
+ import verifiers.v1 as vf
2
+
3
+
4
+ def test_compare_stdout_results_accepts_token_equal_text() -> None:
5
+ assert vf.compare_stdout_results("hello world\n", "hello world\n")
6
+
7
+
8
+ def test_compare_stdout_results_keeps_numeric_tolerance() -> None:
9
+ assert vf.compare_stdout_results("1.0001 2.0\n", "1.0002 2.0009\n")
10
+
11
+
12
+ def test_parse_pytest_outcomes_strips_xfail_xpass_reasons() -> None:
13
+ output = "\n".join(
14
+ [
15
+ "XFAIL tests/test_mod.py::test_xfail - known bug - still tracked",
16
+ "XPASS tests/test_mod.py::test_xpass - always xfail - unexpectedly passed",
17
+ "FAILED tests/test_mod.py::test_param[a - b] - assert left - right",
18
+ "PASSED tests/test_mod.py::test_ok",
19
+ ]
20
+ )
21
+
22
+ assert vf.parse_pytest_outcomes(output) == {
23
+ "tests/test_mod.py::test_xfail": "XFAIL",
24
+ "tests/test_mod.py::test_xpass": "XPASS",
25
+ "tests/test_mod.py::test_param[a - b]": "FAILED",
26
+ "tests/test_mod.py::test_ok": "PASSED",
27
+ }
28
+
29
+
30
+ def test_parse_judge_choice_uses_first_choice_after_verdict_marker() -> None:
31
+ response = "Final Judgment: B because it is a better answer"
32
+
33
+ assert vf.parse_judge_choice(response, choices=("A", "B")) == "B"
@@ -49,6 +49,14 @@ from verifiers.v1.loaders import (
49
49
  task_type,
50
50
  taskset_config_type,
51
51
  )
52
+ from verifiers.v1.scoring import (
53
+ compare_stdout_results as compare_stdout_results,
54
+ extract_boxed_answer as extract_boxed_answer,
55
+ parse_judge_choice as parse_judge_choice,
56
+ parse_pytest_outcomes as parse_pytest_outcomes,
57
+ read_answer_file_or_last_reply as read_answer_file_or_last_reply,
58
+ verify_boxed_math_answer as verify_boxed_math_answer,
59
+ )
52
60
  from verifiers.v1.retries import RetryConfig, RolloutRetryConfig
53
61
  from verifiers.v1.rollout import Rollout
54
62
  from verifiers.v1.runtimes import (
@@ -195,6 +203,13 @@ __all__ = [
195
203
  "JudgeConfig",
196
204
  "JudgeSamplingConfig",
197
205
  "JudgeResponse",
206
+ # scoring
207
+ "compare_stdout_results",
208
+ "extract_boxed_answer",
209
+ "parse_judge_choice",
210
+ "parse_pytest_outcomes",
211
+ "read_answer_file_or_last_reply",
212
+ "verify_boxed_math_answer",
198
213
  # mcp
199
214
  "Toolset",
200
215
  "ToolsetConfig",
@@ -0,0 +1,108 @@
1
+ """The shared dashboard engine: a rich `Live` view on a fixed refresh tick.
2
+
3
+ The eval and validate dashboards each build their own frame; `live_view` just drives whichever
4
+ `render` it's given — refreshing on a timer and drawing a final frame on exit. When given an
5
+ `on_key` handler it also reads left/right arrow presses from the terminal (see `_key_reader`).
6
+ """
7
+
8
+ import asyncio
9
+ import contextlib
10
+ import os
11
+ import sys
12
+ from collections.abc import Callable, Iterator
13
+
14
+ from rich.console import Group
15
+ from rich.live import Live
16
+
17
+ try: # POSIX-only terminal control; absent on Windows, where key reading is skipped.
18
+ import termios
19
+ import tty
20
+
21
+ _HAS_TTY = True
22
+ except ImportError:
23
+ _HAS_TTY = False
24
+
25
+ # Arrow-key escape sequences → direction, covering both the normal (`ESC [`) and application
26
+ # (`ESC O`) cursor-key modes a terminal might send.
27
+ _ARROWS = {
28
+ b"\x1b[C": "right",
29
+ b"\x1bOC": "right",
30
+ b"\x1b[D": "left",
31
+ b"\x1bOD": "left",
32
+ }
33
+
34
+
35
+ @contextlib.contextmanager
36
+ def _key_reader(
37
+ on_key: Callable[[str], None] | None, refresh: Callable[[], None]
38
+ ) -> Iterator[None]:
39
+ """Dispatch left/right arrow presses to `on_key`, redrawing immediately after each so the
40
+ view feels instant rather than waiting for the next refresh tick. A no-op unless `on_key` is
41
+ given and stdin is a real terminal. Puts stdin in cbreak mode (char-at-a-time, no echo, Ctrl+C
42
+ still interrupts) and reads it via the event loop — no extra thread — restoring the terminal on
43
+ exit."""
44
+ if on_key is None or not _HAS_TTY or not sys.stdin.isatty():
45
+ yield
46
+ return
47
+ fd = sys.stdin.fileno()
48
+ loop = asyncio.get_running_loop()
49
+ old = termios.tcgetattr(fd)
50
+ # carries a partial escape across reads — cbreak can split a key's 3 bytes over callbacks
51
+ buf = bytearray()
52
+
53
+ def _read() -> None:
54
+ try:
55
+ data = os.read(fd, 32)
56
+ except OSError:
57
+ return
58
+ if not data:
59
+ return
60
+ buf.extend(data)
61
+ fired = False
62
+ i = 0
63
+ while i < len(buf): # a chunk may hold several presses; scan the whole buffer
64
+ if key := _ARROWS.get(bytes(buf[i : i + 3])):
65
+ on_key(key)
66
+ fired = True
67
+ i += 3
68
+ elif buf[i] == 0x1B and len(buf) - i < 3:
69
+ break # incomplete escape at the tail — hold it for the next read
70
+ else:
71
+ i += 1
72
+ del buf[:i]
73
+ if fired:
74
+ refresh()
75
+
76
+ # setcbreak inside the try so the finally always restores the terminal, even if it (or
77
+ # add_reader) raises — otherwise stdin could be left in cbreak with echo off after we exit.
78
+ try:
79
+ tty.setcbreak(fd)
80
+ loop.add_reader(fd, _read)
81
+ yield
82
+ finally:
83
+ loop.remove_reader(fd)
84
+ termios.tcsetattr(fd, termios.TCSADRAIN, old)
85
+
86
+
87
+ @contextlib.asynccontextmanager
88
+ async def live_view(
89
+ render: Callable[[], Group], on_key: Callable[[str], None] | None = None
90
+ ):
91
+ """Refresh `render()` every 0.25s until the block exits, then draw one final frame. When
92
+ `on_key` is given, left/right arrow presses are dispatched to it (and redraw at once)."""
93
+ with Live(render(), auto_refresh=False) as live:
94
+
95
+ async def loop() -> None:
96
+ while True:
97
+ await asyncio.sleep(0.25)
98
+ live.update(render(), refresh=True)
99
+
100
+ task = asyncio.create_task(loop())
101
+ with _key_reader(on_key, lambda: live.update(render(), refresh=True)):
102
+ try:
103
+ yield
104
+ finally:
105
+ task.cancel()
106
+ with contextlib.suppress(asyncio.CancelledError):
107
+ await task
108
+ live.update(render(), refresh=True)
@@ -220,8 +220,8 @@ def Progress(
220
220
  f"{len(done)}/{len(rollouts)} · {format_time(time.time() - start)} · "
221
221
  f"reward {reward} · err {err}"
222
222
  )
223
- if page is not None: # rollouts overflow the screen — show which page is on screen
224
- stats += f" (page {page[0]}/{page[1]})"
223
+ if page is not None: # overflowing — show which page, and that the arrows page
224
+ stats += f" (page {page[0]}/{page[1]} ◄ ►)"
225
225
  row = Table.grid(expand=True, padding=(0, 1))
226
226
  row.add_column(ratio=1) # bar stretches to fill the width left of the stats
227
227
  row.add_column(justify="right", no_wrap=True)
@@ -495,13 +495,42 @@ def Rows(groups: list[list[Rollout]], now: float, runtime_type: str) -> Table:
495
495
  return grid
496
496
 
497
497
 
498
+ class Pager:
499
+ """Which page of overflowing rollout rows is on screen. Auto-advances on a timer until the
500
+ user takes over with the left/right arrows, after which it stays where they leave it. `count`
501
+ (the page count, set each render by `_paginate`) gates the arrows: they're inert while a single
502
+ page fits, so a stray press before rollouts overflow can't switch off auto-advance or offset the
503
+ starting page once paging begins. The chosen page is clamped to `count` (it can shrink on a
504
+ resize; it otherwise only grows, as rollouts are never removed)."""
505
+
506
+ def __init__(self) -> None:
507
+ self.page = 0
508
+ self.manual = False
509
+ self.count = 1
510
+
511
+ def on_key(self, key: str) -> None:
512
+ if key in ("left", "right") and self.count > 1:
513
+ self.manual = True
514
+ self.page += 1 if key == "right" else -1
515
+
516
+ def index(self, now: float) -> int:
517
+ # Track the auto page while it drives, so the first arrow continues from what's on screen
518
+ # rather than jumping back to page 1. Clamp in manual mode (count can shrink on resize).
519
+ if not self.manual:
520
+ self.page = int(now / _PAGE_SECONDS) % self.count
521
+ else:
522
+ self.page = max(0, min(self.page, self.count - 1))
523
+ return self.page
524
+
525
+
498
526
  def _paginate(
499
- groups: list[list[Rollout]], rows_per_page: int, now: float
527
+ groups: list[list[Rollout]], rows_per_page: int, pager: Pager, now: float
500
528
  ) -> tuple[list[list[Rollout]], int, int]:
501
529
  """Pack groups (a task's rollouts kept together) into pages of at most `rows_per_page` rows,
502
- cycling to the next page every `_PAGE_SECONDS`. Returns (this page's groups, 0-based index,
503
- page count) — a single page when everything already fits."""
530
+ selecting the one `pager` points at. Returns (this page's groups, 0-based index, page count) —
531
+ a single page when everything already fits."""
504
532
  if sum(len(g) for g in groups) <= rows_per_page:
533
+ pager.count = 1 # everything fits on one page — arrows stay inert
505
534
  return groups, 0, 1
506
535
  pages: list[list[list[Rollout]]] = []
507
536
  current: list[list[Rollout]] = []
@@ -514,20 +543,24 @@ def _paginate(
514
543
  used += len(group)
515
544
  if current:
516
545
  pages.append(current)
517
- index = int(now / _PAGE_SECONDS) % len(pages)
546
+ pager.count = len(pages)
547
+ index = pager.index(now)
518
548
  return pages[index], index, len(pages)
519
549
 
520
550
 
521
- def _render(rollouts: list[Rollout], config: EvalConfig, start: float) -> Group:
551
+ def _render(
552
+ rollouts: list[Rollout], config: EvalConfig, start: float, pager: Pager
553
+ ) -> Group:
522
554
  now = time.time()
523
555
  warning = _warning(config)
524
556
  # `{warning}\n\n{overview}` — the caution sits at the very top, blank line, then the overview.
525
557
  header = Group(warning, Text(""), Overview(config)) if warning else Overview(config)
526
558
  # Measure the fixed top (header + progress + rule) so the rollout rows fill the rest of the
527
- # screen; page through them on a timer when they'd overflow (rich would otherwise truncate).
559
+ # screen; page through them (timer, or the left/right arrows) when they'd overflow (rich would
560
+ # otherwise truncate).
528
561
  top = Group(header, Progress(rollouts, start), Rule(style="dim"))
529
562
  rows_per_page = max(1, _CONSOLE.size.height - len(_CONSOLE.render_lines(top)) - 1)
530
- page_groups, index, count = _paginate(_groups(rollouts), rows_per_page, now)
563
+ page_groups, index, count = _paginate(_groups(rollouts), rows_per_page, pager, now)
531
564
  progress = Progress(rollouts, start, page=(index + 1, count) if count > 1 else None)
532
565
  return Group(
533
566
  header,
@@ -539,6 +572,10 @@ def _render(rollouts: list[Rollout], config: EvalConfig, start: float) -> Group:
539
572
 
540
573
  @contextlib.asynccontextmanager
541
574
  async def dashboard(rollouts: list[Rollout], config: EvalConfig, start: float):
542
- """Refresh the live eval view until the `with` block exits, then a final frame."""
543
- async with live_view(lambda: _render(rollouts, config, start)):
575
+ """Refresh the live eval view until the `with` block exits, then a final frame. Left/right
576
+ arrows page through rollout rows when they overflow the screen."""
577
+ pager = Pager()
578
+ async with live_view(
579
+ lambda: _render(rollouts, config, start, pager), on_key=pager.on_key
580
+ ):
544
581
  yield
@@ -0,0 +1,166 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from collections.abc import Sequence
5
+ from decimal import Decimal, InvalidOperation
6
+ from typing import TYPE_CHECKING
7
+
8
+ from math_verify import parse, verify
9
+ from math_verify.errors import TimeoutException as MathVerifyTimeout
10
+
11
+ from verifiers.v1.errors import SandboxError
12
+
13
+ if TYPE_CHECKING:
14
+ from verifiers.v1.runtimes import Runtime
15
+ from verifiers.v1.trace import Trace
16
+
17
+ BOXED_START = "\\boxed{"
18
+ ANSI_RE = re.compile(r"\x1b\[[0-?]*[ -/]*[@-~]")
19
+ PYTEST_OUTCOMES = ("PASSED", "FAILED", "ERROR", "SKIPPED", "XFAIL", "XPASS")
20
+
21
+
22
+ def extract_boxed_answer(text: str, strict: bool = False) -> str:
23
+ start = text.rfind(BOXED_START)
24
+ if start == -1:
25
+ return "" if strict else text
26
+
27
+ # Regex is the wrong tool for nested braces, so walk the final box by hand.
28
+ answer_start = start + len(BOXED_START)
29
+ depth = 1
30
+ for index, char in enumerate(text[answer_start:], start=answer_start):
31
+ if char == "{":
32
+ depth += 1
33
+ elif char == "}":
34
+ depth -= 1
35
+ if depth == 0:
36
+ return text[answer_start:index]
37
+
38
+ return "" if strict else text
39
+
40
+
41
+ async def read_answer_file_or_last_reply(
42
+ runtime: "Runtime", path: str, trace: "Trace"
43
+ ) -> str:
44
+ try:
45
+ answer = (await runtime.read(path)).decode(errors="replace").strip()
46
+ except (FileNotFoundError, OSError, SandboxError):
47
+ answer = ""
48
+ return answer or trace.last_reply
49
+
50
+
51
+ def parse_judge_choice(
52
+ content: str | None, choices: Sequence[str] = ("A", "B", "C")
53
+ ) -> str | None:
54
+ if not content or ("<think>" in content and "</think>" not in content):
55
+ return None
56
+
57
+ text = content.rsplit("</think>", 1)[-1].strip()
58
+ text = extract_boxed_answer(text, strict=True).strip() or text
59
+
60
+ text_upper = text.upper()
61
+ choices_by_upper = {choice.upper(): choice for choice in choices}
62
+ allowed = "|".join(re.escape(choice) for choice in choices_by_upper)
63
+ choice_re = rf"(?<!\w)({allowed})(?!\w)"
64
+ verdict_re = (
65
+ r"(?:^|\n)\s*(?:FINAL\s+JUDGMENT|FINAL\s+ANSWER|FINAL\s+VERDICT|"
66
+ r"JUDGMENT|VERDICT|ANSWER)\s*(?:IS\s*)?[:\-]?\s*"
67
+ )
68
+
69
+ verdict = re.search(verdict_re, text_upper)
70
+ if verdict:
71
+ match = re.search(choice_re, text_upper[verdict.end() :])
72
+ return choices_by_upper.get(match.group(1)) if match else None
73
+
74
+ matches = re.findall(choice_re, text_upper)
75
+ return choices_by_upper.get(matches[-1]) if matches else None
76
+
77
+
78
+ def verify_boxed_math_answer(
79
+ response: str | None, answer: str, *, timeout_seconds: int = 5
80
+ ) -> float:
81
+ if not response or ("<think>" in response and "</think>" not in response):
82
+ return 0.0
83
+
84
+ prediction_text = response.rsplit("</think>", 1)[-1]
85
+ prediction = extract_boxed_answer(prediction_text, strict=True).strip()
86
+ gold = (extract_boxed_answer(answer, strict=True) or answer).strip()
87
+ if not prediction or not gold:
88
+ return 0.0
89
+
90
+ # math-verify expects both sides as boxed math expressions.
91
+ try:
92
+ parsed_gold = parse(f"\\boxed{{{gold}}}", parsing_timeout=timeout_seconds)
93
+ parsed_prediction = parse(
94
+ f"\\boxed{{{prediction}}}",
95
+ parsing_timeout=timeout_seconds,
96
+ )
97
+ return float(
98
+ verify(
99
+ parsed_gold,
100
+ parsed_prediction,
101
+ timeout_seconds=timeout_seconds,
102
+ )
103
+ )
104
+ except (Exception, MathVerifyTimeout):
105
+ return 0.0
106
+
107
+
108
+ def compare_stdout_results(
109
+ exec_stdout: str, expected: str, *, tolerance: float = 1e-3
110
+ ) -> bool:
111
+ if exec_stdout.strip() == expected.strip():
112
+ return True
113
+
114
+ actual_lines = [line.strip() for line in exec_stdout.splitlines() if line.strip()]
115
+ expected_lines = [line.strip() for line in expected.splitlines() if line.strip()]
116
+ if actual_lines == expected_lines:
117
+ return True
118
+
119
+ actual_tokens = [token for line in actual_lines for token in line.split()]
120
+ expected_tokens = [token for line in expected_lines for token in line.split()]
121
+ if actual_tokens == expected_tokens:
122
+ return True
123
+ if len(actual_tokens) != len(expected_tokens) or not actual_tokens:
124
+ return False
125
+
126
+ # Code datasets often allow tiny floating-point drift in stdout.
127
+ try:
128
+ actual_numbers = [Decimal(token) for token in actual_tokens]
129
+ expected_numbers = [Decimal(token) for token in expected_tokens]
130
+ except (InvalidOperation, ValueError):
131
+ return False
132
+ if not all(number.is_finite() for number in actual_numbers + expected_numbers):
133
+ return False
134
+
135
+ limit = Decimal(str(tolerance))
136
+ return all(
137
+ abs(actual - expected) <= limit
138
+ for actual, expected in zip(actual_numbers, expected_numbers)
139
+ )
140
+
141
+
142
+ def parse_pytest_outcomes(output: str | None) -> dict[str, str]:
143
+ outcomes: dict[str, str] = {}
144
+ for raw_line in ANSI_RE.sub("", output or "").splitlines():
145
+ parts = raw_line.strip().split(maxsplit=1)
146
+ if len(parts) != 2:
147
+ continue
148
+
149
+ outcome, test_id = parts
150
+ if outcome not in PYTEST_OUTCOMES:
151
+ continue
152
+
153
+ # SKIPPED short-summary rows use "[N] file.py:line: reason", not a node id.
154
+ if test_id.startswith("["):
155
+ continue
156
+
157
+ # These summary rows append " - <reason>"; passing node ids do not.
158
+ if outcome in ("FAILED", "ERROR", "XFAIL", "XPASS") and " - " in test_id:
159
+ parts = test_id.split(" - ")
160
+ for index in range(1, len(parts)):
161
+ node_id = " - ".join(parts[:index])
162
+ if node_id.count("[") == node_id.count("]"):
163
+ test_id = node_id
164
+ break
165
+ outcomes[test_id.rstrip()] = outcome
166
+ return outcomes
@@ -1,32 +0,0 @@
1
- """The shared dashboard engine: a rich `Live` view on a fixed refresh tick.
2
-
3
- The eval and validate dashboards each build their own frame; `live_view` just drives whichever
4
- `render` it's given — refreshing on a timer and drawing a final frame on exit.
5
- """
6
-
7
- import asyncio
8
- import contextlib
9
- from collections.abc import Callable
10
-
11
- from rich.console import Group
12
- from rich.live import Live
13
-
14
-
15
- @contextlib.asynccontextmanager
16
- async def live_view(render: Callable[[], Group]):
17
- """Refresh `render()` every 0.25s until the block exits, then draw one final frame."""
18
- with Live(render(), auto_refresh=False) as live:
19
-
20
- async def loop() -> None:
21
- while True:
22
- await asyncio.sleep(0.25)
23
- live.update(render(), refresh=True)
24
-
25
- task = asyncio.create_task(loop())
26
- try:
27
- yield
28
- finally:
29
- task.cancel()
30
- with contextlib.suppress(asyncio.CancelledError):
31
- await task
32
- live.update(render(), refresh=True)