verifiers 0.2.2.dev79__tar.gz → 0.2.2.dev81__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.
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_judges.py +24 -4
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/eval/runner.py +6 -8
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/output.py +6 -2
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/judge.py +2 -2
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/envs/agentic_judge/env.py +13 -82
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/episode.py +16 -2
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/rlm/harness.py +5 -13
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/interception/server.py +3 -3
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/judges/rubric.py +76 -62
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/legacy.py +13 -13
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/session.py +8 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/trace.py +0 -9
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/.gitignore +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/LICENSE +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/README.md +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/pyproject.toml +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/acp/_runner.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/agent.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/legacy.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/harbor/env.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.2.2.dev79 → verifiers-0.2.2.dev81}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.dev81
|
|
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
|
|
@@ -9,6 +9,7 @@ import pytest
|
|
|
9
9
|
from pydantic import Field
|
|
10
10
|
|
|
11
11
|
import verifiers.v1 as vf
|
|
12
|
+
from verifiers.v1.envs.agentic_judge import ScoreConfig
|
|
12
13
|
from verifiers.v1.graph import MessageNode
|
|
13
14
|
from verifiers.v1.judge import Judge, JudgeResponse
|
|
14
15
|
from verifiers.v1.types import AssistantMessage, UserMessage
|
|
@@ -480,10 +481,14 @@ def test_rubric_criteria_toml_and_json(tmp_path):
|
|
|
480
481
|
toml = rubric_judge(tmp_path).criteria
|
|
481
482
|
assert [c.name for c in toml] == ["mentions_paris", "is_polite"]
|
|
482
483
|
assert [c.weight for c in toml] == [3.0, 1.0]
|
|
483
|
-
# JSON
|
|
484
|
+
# JSON accepts a metadata-bearing object or a bare criteria list.
|
|
484
485
|
items = [c.model_dump() for c in toml]
|
|
485
486
|
assert (
|
|
486
|
-
rubric_judge(
|
|
487
|
+
rubric_judge(
|
|
488
|
+
tmp_path,
|
|
489
|
+
json.dumps({"title": "Safety", "criteria": items}),
|
|
490
|
+
".json",
|
|
491
|
+
).criteria
|
|
487
492
|
== toml
|
|
488
493
|
)
|
|
489
494
|
assert rubric_judge(tmp_path, json.dumps(items), ".json").criteria == toml
|
|
@@ -511,8 +516,23 @@ def test_rubric_rejects_bad_files(tmp_path):
|
|
|
511
516
|
).criteria
|
|
512
517
|
# negative/NaN/inf weights would invert a criterion or corrupt the weighted mean
|
|
513
518
|
for weight in (-1.0, float("nan"), float("inf")):
|
|
514
|
-
with pytest.raises(
|
|
519
|
+
with pytest.raises(
|
|
520
|
+
ValueError, match="greater than or equal to 0|finite number"
|
|
521
|
+
):
|
|
515
522
|
_ = rubric_judge(tmp_path, weights={"mentions_paris": weight}).criteria
|
|
523
|
+
with pytest.raises(ValueError, match="non-finite total"):
|
|
524
|
+
_ = rubric_judge(
|
|
525
|
+
tmp_path, weights={"mentions_paris": 1e308, "is_polite": 1e308}
|
|
526
|
+
).criteria
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
@pytest.mark.parametrize("weight", [float("nan"), float("inf"), float("-inf")])
|
|
530
|
+
def test_judge_composition_weights_are_finite(weight):
|
|
531
|
+
with pytest.raises(ValueError, match="finite number"):
|
|
532
|
+
vf.JudgeConfig(weight=weight)
|
|
533
|
+
for field in ("task_weight", "judge_weight"):
|
|
534
|
+
with pytest.raises(ValueError, match="finite number"):
|
|
535
|
+
ScoreConfig.model_validate({field: weight})
|
|
516
536
|
|
|
517
537
|
|
|
518
538
|
async def test_rubric_score(tmp_path, fake_judge_model):
|
|
@@ -569,7 +589,7 @@ async def test_rubric_off_menu_answer_raises(tmp_path, monkeypatch):
|
|
|
569
589
|
|
|
570
590
|
|
|
571
591
|
def test_rubric_choices_validation(tmp_path):
|
|
572
|
-
with pytest.raises(ValueError, match="at least
|
|
592
|
+
with pytest.raises(ValueError, match="at least 2"):
|
|
573
593
|
_ = rubric_judge(
|
|
574
594
|
tmp_path, body='[[criteria]]\nname = "x"\ntext = "t"\nchoices = ["only"]\n'
|
|
575
595
|
).criteria
|
|
@@ -10,7 +10,6 @@ from verifiers.v1.cli.dashboard import dashboard
|
|
|
10
10
|
from verifiers.v1.cli.eval import resume
|
|
11
11
|
from verifiers.v1.cli.output import (
|
|
12
12
|
append_episode,
|
|
13
|
-
append_trace,
|
|
14
13
|
output_path,
|
|
15
14
|
save_config,
|
|
16
15
|
)
|
|
@@ -77,8 +76,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
|
|
|
77
76
|
write_lock = asyncio.Lock()
|
|
78
77
|
|
|
79
78
|
async def on_complete(episode: Episode) -> None:
|
|
80
|
-
|
|
81
|
-
trace.record_run(EvalRunInfo(id=config.uuid))
|
|
79
|
+
episode.record_run(EvalRunInfo(id=config.uuid))
|
|
82
80
|
await append_episode(out, episode, write_lock)
|
|
83
81
|
|
|
84
82
|
# Serving resources (shared tool servers, interception) come up once for the
|
|
@@ -258,9 +256,10 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
258
256
|
)
|
|
259
257
|
records = []
|
|
260
258
|
for trace in traces:
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
259
|
+
record = Episode.of(trace, env=config.env_id)
|
|
260
|
+
record.record_run(EvalRunInfo(id=config.uuid))
|
|
261
|
+
await append_episode(out, record, write_lock)
|
|
262
|
+
records.append(record)
|
|
264
263
|
return records
|
|
265
264
|
|
|
266
265
|
async def run_unit(payload: dict) -> list[Episode]:
|
|
@@ -271,8 +270,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
271
270
|
sampling=config.sampling,
|
|
272
271
|
**payload,
|
|
273
272
|
)
|
|
274
|
-
|
|
275
|
-
trace.record_run(EvalRunInfo(id=config.uuid))
|
|
273
|
+
episode.record_run(EvalRunInfo(id=config.uuid))
|
|
276
274
|
await append_episode(out, episode, write_lock)
|
|
277
275
|
return [episode]
|
|
278
276
|
|
|
@@ -12,6 +12,7 @@ before the episode atom (one bare trace per line) are still readable:
|
|
|
12
12
|
|
|
13
13
|
import asyncio
|
|
14
14
|
import json
|
|
15
|
+
from functools import cache
|
|
15
16
|
from pathlib import Path
|
|
16
17
|
|
|
17
18
|
import tomli_w
|
|
@@ -29,6 +30,9 @@ TRACES_FILE = "traces.jsonl"
|
|
|
29
30
|
CONFIG_FILE = "config.toml"
|
|
30
31
|
"""Filename a run's resolved config is written to (re-runnable via `@ config.toml`)."""
|
|
31
32
|
|
|
33
|
+
# Compiling an adapter is the expensive part; run output reuses only a few model classes.
|
|
34
|
+
type_adapter = cache(TypeAdapter)
|
|
35
|
+
|
|
32
36
|
|
|
33
37
|
def output_path(config: EvalConfig) -> Path:
|
|
34
38
|
"""Where this run writes: `outputs/<env>--<model>--<harness>/<uuid>` (or the explicit
|
|
@@ -72,7 +76,7 @@ def save_config(config: BaseModel, results_dir: Path) -> None:
|
|
|
72
76
|
def write_episode(results_dir: Path, episode: Episode) -> None:
|
|
73
77
|
"""Serialize and append one rollout episode in the worker thread."""
|
|
74
78
|
# Preserve fields declared by typed Trace subclasses nested in the episode.
|
|
75
|
-
data =
|
|
79
|
+
data = type_adapter(type(episode)).dump_json(episode, exclude_none=True)
|
|
76
80
|
with (results_dir / TRACES_FILE).open("ab") as f:
|
|
77
81
|
f.write(data + b"\n")
|
|
78
82
|
|
|
@@ -88,7 +92,7 @@ def read_episodes(results_dir: Path, trace_type: type) -> list[Episode]:
|
|
|
88
92
|
`trace_type` (`Trace[WireTaskData, ...]` reads any taskset's file without
|
|
89
93
|
importing it). A pre-episode line (one bare trace) is wrapped as a single-trace
|
|
90
94
|
record, so both file generations read uniformly."""
|
|
91
|
-
trace_adapter =
|
|
95
|
+
trace_adapter = type_adapter(trace_type)
|
|
92
96
|
episodes: list[Episode] = []
|
|
93
97
|
with (results_dir / TRACES_FILE).open(encoding="utf-8") as f:
|
|
94
98
|
for line in f:
|
|
@@ -5,7 +5,7 @@ from collections.abc import Sequence
|
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
|
-
from pydantic import BaseModel, SerializeAsAny
|
|
8
|
+
from pydantic import BaseModel, FiniteFloat, SerializeAsAny
|
|
9
9
|
|
|
10
10
|
from verifiers.v1.clients import BaseClientConfig
|
|
11
11
|
from verifiers.v1.types import ID, SamplingConfig
|
|
@@ -17,7 +17,7 @@ class JudgeConfig(BaseClientConfig):
|
|
|
17
17
|
"""Plugin id; empty for a judge called directly by task code."""
|
|
18
18
|
name: str = ""
|
|
19
19
|
"""Reward key override for a plugged judge."""
|
|
20
|
-
weight:
|
|
20
|
+
weight: FiniteFloat = 1.0
|
|
21
21
|
model: str = "openai/gpt-5.4-nano"
|
|
22
22
|
sampling: SamplingConfig = SamplingConfig()
|
|
23
23
|
prompt: Path | None = None
|
|
@@ -14,14 +14,18 @@ task's collected artifacts.
|
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
import json
|
|
17
|
-
import math
|
|
18
17
|
import re
|
|
19
|
-
import tomllib
|
|
20
18
|
from pathlib import Path
|
|
21
19
|
|
|
22
|
-
from pydantic import
|
|
20
|
+
from pydantic import FiniteFloat
|
|
23
21
|
|
|
24
22
|
import verifiers.v1 as vf
|
|
23
|
+
from verifiers.v1.judges.rubric import (
|
|
24
|
+
Criterion,
|
|
25
|
+
RubricVerdicts,
|
|
26
|
+
load_criteria,
|
|
27
|
+
score_verdicts,
|
|
28
|
+
)
|
|
25
29
|
from verifiers.v1.utils.compile import validate_pairing
|
|
26
30
|
|
|
27
31
|
VERDICT_FILE = "/tmp/verdict.json"
|
|
@@ -38,29 +42,6 @@ TASK_SECTION = """\
|
|
|
38
42
|
{prompt}"""
|
|
39
43
|
|
|
40
44
|
|
|
41
|
-
class Criterion(BaseModel):
|
|
42
|
-
"""One rubric criterion — the plugged rubric judge's format, mirrored so the
|
|
43
|
-
same `criteria` files grade both judges."""
|
|
44
|
-
|
|
45
|
-
name: str
|
|
46
|
-
"""Key for the criterion's metric (`judge/<name>`)."""
|
|
47
|
-
text: str
|
|
48
|
-
weight: float = 1.0
|
|
49
|
-
"""The criterion's share of the reward."""
|
|
50
|
-
choices: list[str] = Field(default_factory=lambda: ["no", "yes"])
|
|
51
|
-
"""Allowed answers, ordered **worst → best**: the first scores 0.0, the last 1.0, the rest
|
|
52
|
-
evenly spaced by rank. Default `["no", "yes"]` is a binary check. Needs >= 2, no duplicates."""
|
|
53
|
-
|
|
54
|
-
@field_validator("choices")
|
|
55
|
-
@classmethod
|
|
56
|
-
def _check_choices(cls, v: list[str]) -> list[str]:
|
|
57
|
-
if len(v) < 2:
|
|
58
|
-
raise ValueError(f"`choices` needs at least two options, got {v}")
|
|
59
|
-
if len(set(v)) != len(v):
|
|
60
|
-
raise ValueError(f"`choices` has duplicate options: {v}")
|
|
61
|
-
return v
|
|
62
|
-
|
|
63
|
-
|
|
64
45
|
SOLVED = Criterion(
|
|
65
46
|
name="solved",
|
|
66
47
|
text="The task is fully solved: what the task asked for is achieved, and "
|
|
@@ -210,7 +191,7 @@ class JudgeTask(vf.Task):
|
|
|
210
191
|
f"the judge wrote no verdict to {VERDICT_FILE}; its final act must "
|
|
211
192
|
'be writing {"verdicts": [{"name", "reason", "verdict"}, ...]} there'
|
|
212
193
|
) from e
|
|
213
|
-
trace.info["verdict"] =
|
|
194
|
+
trace.info["verdict"] = RubricVerdicts.model_validate_json(raw).model_dump()
|
|
214
195
|
|
|
215
196
|
|
|
216
197
|
class TextFile(vf.BaseConfig):
|
|
@@ -259,38 +240,16 @@ class JudgeTaskConfig(vf.BaseConfig):
|
|
|
259
240
|
def criteria(self) -> list[Criterion]:
|
|
260
241
|
if self.rubric is None:
|
|
261
242
|
return [SOLVED]
|
|
262
|
-
|
|
263
|
-
data = (
|
|
264
|
-
tomllib.loads(text)
|
|
265
|
-
if self.rubric.suffix.lower() == ".toml"
|
|
266
|
-
else json.loads(text)
|
|
267
|
-
)
|
|
268
|
-
items = data.get("criteria", []) if isinstance(data, dict) else data
|
|
269
|
-
criteria = [Criterion.model_validate(item) for item in items]
|
|
270
|
-
if not criteria:
|
|
271
|
-
raise ValueError(f"rubric file '{self.rubric}' lists no criteria")
|
|
272
|
-
names = [criterion.name for criterion in criteria]
|
|
273
|
-
if len(set(names)) != len(names):
|
|
274
|
-
raise ValueError(
|
|
275
|
-
f"rubric file '{self.rubric}' has duplicate criterion names"
|
|
276
|
-
)
|
|
277
|
-
if bad := [c.name for c in criteria if not 0 <= c.weight < math.inf]:
|
|
278
|
-
raise ValueError(
|
|
279
|
-
f"rubric '{self.rubric}' has negative or non-finite criterion "
|
|
280
|
-
f"weights: {bad}"
|
|
281
|
-
)
|
|
282
|
-
if sum(criterion.weight for criterion in criteria) <= 0:
|
|
283
|
-
raise ValueError(f"rubric '{self.rubric}' has no positive criterion weight")
|
|
284
|
-
return criteria
|
|
243
|
+
return load_criteria(self.rubric)
|
|
285
244
|
|
|
286
245
|
|
|
287
246
|
class ScoreConfig(vf.BaseConfig):
|
|
288
247
|
"""How the judge's verdict composes with the taskset's own rewards on the
|
|
289
248
|
solver's trace. Judge-only by default."""
|
|
290
249
|
|
|
291
|
-
task_weight:
|
|
250
|
+
task_weight: FiniteFloat = 0.0
|
|
292
251
|
"""Scale applied to the taskset's own rewards; 1 keeps them next to the verdict."""
|
|
293
|
-
judge_weight:
|
|
252
|
+
judge_weight: FiniteFloat = 1.0
|
|
294
253
|
"""Weight of the judge's verdict in the solver's reward."""
|
|
295
254
|
|
|
296
255
|
|
|
@@ -363,37 +322,9 @@ class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
|
|
|
363
322
|
if "judge" not in by_agent:
|
|
364
323
|
return
|
|
365
324
|
solution, verdict = by_agent["solver"], by_agent["judge"]
|
|
366
|
-
|
|
367
|
-
if not isinstance(data, dict) or not isinstance(data.get("verdicts"), list):
|
|
368
|
-
raise TypeError(
|
|
369
|
-
f"no verdicts on the judge's trace (expected {VERDICT_FILE} with a "
|
|
370
|
-
'"verdicts" list)'
|
|
371
|
-
)
|
|
325
|
+
verdicts = RubricVerdicts.model_validate(verdict.info.get("verdict")).verdicts
|
|
372
326
|
criteria = self.config.task.criteria()
|
|
373
|
-
|
|
374
|
-
answers: dict[str, str] = {}
|
|
375
|
-
for entry in data["verdicts"]:
|
|
376
|
-
if not isinstance(entry, dict):
|
|
377
|
-
raise TypeError(f"verdict entry {entry!r} is not an object")
|
|
378
|
-
name = str(entry.get("name"))
|
|
379
|
-
if name in answers:
|
|
380
|
-
# Contradictory duplicates must not collapse to whichever came last.
|
|
381
|
-
raise ValueError(f"judge answered criterion {name!r} more than once")
|
|
382
|
-
answers[name] = str(entry.get("verdict"))
|
|
383
|
-
if sorted(answers) != sorted(by_criterion):
|
|
384
|
-
raise ValueError(
|
|
385
|
-
f"judge verdicts name {sorted(answers)}, expected the rubric's "
|
|
386
|
-
f"{sorted(by_criterion)}"
|
|
387
|
-
)
|
|
388
|
-
scores: dict[str, float] = {}
|
|
389
|
-
for name, answer in answers.items():
|
|
390
|
-
choices = by_criterion[name].choices
|
|
391
|
-
# An off-menu answer is a judge failure, not a zero score.
|
|
392
|
-
if answer not in choices:
|
|
393
|
-
raise ValueError(
|
|
394
|
-
f"judge answered {answer!r} for '{name}', expected one of {choices}"
|
|
395
|
-
)
|
|
396
|
-
scores[name] = choices.index(answer) / (len(choices) - 1)
|
|
327
|
+
scores = score_verdicts(verdicts, criteria, "the rubric's")
|
|
397
328
|
for criterion in criteria:
|
|
398
329
|
solution.record_metric(f"judge/{criterion.name}", scores[criterion.name])
|
|
399
330
|
if self.config.score.task_weight != 1.0:
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"""The episode — one run's traces plus their shared standing, whole."""
|
|
2
2
|
|
|
3
3
|
import uuid
|
|
4
|
-
from typing import Generic
|
|
4
|
+
from typing import Any, Generic
|
|
5
5
|
|
|
6
6
|
from pydantic import BaseModel, Field
|
|
7
7
|
|
|
8
8
|
from verifiers.v1.configs.agent import WireAgentConfig
|
|
9
9
|
from verifiers.v1.state import State, StateT
|
|
10
10
|
from verifiers.v1.task import DataT, WireTaskData
|
|
11
|
-
from verifiers.v1.trace import AgentConfigT, Error, Trace
|
|
11
|
+
from verifiers.v1.trace import AgentConfigT, Error, RunInfo, Trace
|
|
12
12
|
from verifiers.v1.types import Usage
|
|
13
13
|
|
|
14
14
|
|
|
@@ -26,12 +26,19 @@ class Episode(BaseModel, Generic[DataT, StateT, AgentConfigT]):
|
|
|
26
26
|
|
|
27
27
|
env: EnvInfo = Field(default_factory=EnvInfo)
|
|
28
28
|
"""The env that produced this episode."""
|
|
29
|
+
run: RunInfo | None = None
|
|
30
|
+
"""The run this episode belongs to (eval or train), consumer-stamped. It lives here rather than
|
|
31
|
+
on each trace because the episode is what a consumer dispatches, and an episode that produced
|
|
32
|
+
no traces would otherwise have nowhere to say which run it was."""
|
|
29
33
|
ok: bool = False
|
|
30
34
|
"""Whether the episode completed successfully."""
|
|
31
35
|
errors: list[Error] = Field(default_factory=list)
|
|
32
36
|
"""Every error captured across attempts, oldest to newest."""
|
|
33
37
|
traces: list[Trace[DataT, StateT, AgentConfigT]] = Field(default_factory=list)
|
|
34
38
|
"""Every agent's trace, in completion order."""
|
|
39
|
+
info: dict[str, Any] = Field(default_factory=dict)
|
|
40
|
+
"""Scratch space for episode-level metadata, the counterpart to `Trace.info`. What describes
|
|
41
|
+
the whole episode belongs here rather than repeated on each of its traces."""
|
|
35
42
|
|
|
36
43
|
@property
|
|
37
44
|
def last_error(self) -> Error | None:
|
|
@@ -72,6 +79,13 @@ class Episode(BaseModel, Generic[DataT, StateT, AgentConfigT]):
|
|
|
72
79
|
grouped.setdefault(trace.agent.name, []).append(trace)
|
|
73
80
|
return grouped
|
|
74
81
|
|
|
82
|
+
def record_run(self, run: RunInfo | None = None, **info: Any) -> None:
|
|
83
|
+
"""Record the run identity and any extra metadata about this episode. Both describe the
|
|
84
|
+
episode as a whole, so they are recorded once here rather than repeated on every trace."""
|
|
85
|
+
if run is not None:
|
|
86
|
+
self.run = run
|
|
87
|
+
self.info.update(info)
|
|
88
|
+
|
|
75
89
|
@classmethod
|
|
76
90
|
def of(cls, trace: Trace, env: str = "") -> "Episode":
|
|
77
91
|
"""The single-agent record: one trace as its own episode."""
|
|
@@ -6,7 +6,7 @@ import random
|
|
|
6
6
|
import shlex
|
|
7
7
|
from typing import Literal
|
|
8
8
|
|
|
9
|
-
from pydantic import Field, model_validator
|
|
9
|
+
from pydantic import Field, PositiveInt, model_validator
|
|
10
10
|
|
|
11
11
|
from verifiers.v1.clients import ModelContext
|
|
12
12
|
from verifiers.v1.configs.harness import HarnessConfig
|
|
@@ -38,26 +38,18 @@ class RLMHarnessConfig(HarnessConfig):
|
|
|
38
38
|
builtin_skills: list[BuiltinSkill] = Field(default_factory=list)
|
|
39
39
|
"""Built-in rlm skills to enable (RLM_SKILLS), e.g. `["edit"]`; empty enables none.
|
|
40
40
|
The tool set is fixed (ipython); the base `skills` field takes SKILL.md paths."""
|
|
41
|
-
summarize_at_tokens:
|
|
41
|
+
summarize_at_tokens: PositiveInt | tuple[PositiveInt, PositiveInt] | None = None
|
|
42
42
|
"""Auto-compaction threshold (RLM_SUMMARIZE_AT_TOKENS): compact the context once it grows
|
|
43
43
|
past this many tokens. An int is a fixed threshold; a `(lo, hi)` pair draws a per-group
|
|
44
44
|
threshold (seeded by the task index, so a task's rollouts share one draw and tasks vary).
|
|
45
45
|
`None` disables auto-compaction; ints must be positive."""
|
|
46
46
|
|
|
47
47
|
@model_validator(mode="after")
|
|
48
|
-
def
|
|
48
|
+
def validate_range(self) -> "RLMHarnessConfig":
|
|
49
49
|
value = self.summarize_at_tokens
|
|
50
|
-
if isinstance(value, tuple):
|
|
51
|
-
lo, hi = value
|
|
52
|
-
if lo <= 0 or hi <= 0:
|
|
53
|
-
raise ValueError("`summarize_at_tokens` range bounds must be positive.")
|
|
54
|
-
if lo > hi:
|
|
55
|
-
raise ValueError(
|
|
56
|
-
"`summarize_at_tokens` range must be (lo, hi) with lo <= hi."
|
|
57
|
-
)
|
|
58
|
-
elif value is not None and value <= 0:
|
|
50
|
+
if isinstance(value, tuple) and value[0] > value[1]:
|
|
59
51
|
raise ValueError(
|
|
60
|
-
"`summarize_at_tokens` must be
|
|
52
|
+
"`summarize_at_tokens` range must be (lo, hi) with lo <= hi."
|
|
61
53
|
)
|
|
62
54
|
return self
|
|
63
55
|
|
|
@@ -30,7 +30,7 @@ from contextlib import asynccontextmanager
|
|
|
30
30
|
from typing import Literal
|
|
31
31
|
|
|
32
32
|
from aiohttp import web
|
|
33
|
-
from pydantic import
|
|
33
|
+
from pydantic import ValidationError
|
|
34
34
|
from pydantic_core import PydanticSerializationError, from_json, to_json
|
|
35
35
|
|
|
36
36
|
from verifiers.v1 import graph
|
|
@@ -737,7 +737,7 @@ class InterceptionServer(Interception):
|
|
|
737
737
|
state = session.trace.state
|
|
738
738
|
return web.Response(
|
|
739
739
|
# TypeAdapter emits UTF-8 bytes directly, avoiding a JSON str copy in aiohttp.
|
|
740
|
-
body=
|
|
740
|
+
body=session.state_adapter.dump_json(state),
|
|
741
741
|
content_type="application/json",
|
|
742
742
|
charset="utf-8",
|
|
743
743
|
)
|
|
@@ -768,7 +768,7 @@ class InterceptionServer(Interception):
|
|
|
768
768
|
state_cls = type(session.trace.state)
|
|
769
769
|
raw = await request.read()
|
|
770
770
|
try:
|
|
771
|
-
new_state =
|
|
771
|
+
new_state = session.state_adapter.validate_json(raw)
|
|
772
772
|
except ValidationError as e:
|
|
773
773
|
# Reject malformed, over-nested, or mismatched state before it enters the shared channel.
|
|
774
774
|
logger.warning("state PUT rejected: id=%s %s", session.trace.id, e)
|
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import json
|
|
5
|
-
import math
|
|
6
5
|
import re
|
|
7
6
|
import tomllib
|
|
8
7
|
from functools import cached_property
|
|
9
8
|
from pathlib import Path
|
|
10
|
-
from typing import cast
|
|
9
|
+
from typing import Annotated, cast
|
|
11
10
|
|
|
12
|
-
from pydantic import BaseModel, Field, field_validator
|
|
11
|
+
from pydantic import BaseModel, Field, TypeAdapter, field_validator
|
|
13
12
|
|
|
14
13
|
from verifiers.v1.configs.judge import JudgeConfig
|
|
15
14
|
from verifiers.v1.judge import Judge, JudgeView, judge_question, judge_response
|
|
@@ -17,6 +16,8 @@ from verifiers.v1.task import TaskData
|
|
|
17
16
|
from verifiers.v1.trace import Trace
|
|
18
17
|
from verifiers.v1.types import ID
|
|
19
18
|
|
|
19
|
+
CriterionWeight = Annotated[float, Field(ge=0, allow_inf_nan=False)]
|
|
20
|
+
|
|
20
21
|
RUBRIC_PROMPT = (Path(__file__).resolve().parent / "rubric.txt").read_text(
|
|
21
22
|
encoding="utf-8"
|
|
22
23
|
)
|
|
@@ -60,29 +61,62 @@ class Criterion(BaseModel):
|
|
|
60
61
|
name: str
|
|
61
62
|
"""Key for the criterion's metric (`<judge name>/<name>`) and its `weights` override."""
|
|
62
63
|
text: str
|
|
63
|
-
weight:
|
|
64
|
+
weight: CriterionWeight = 1.0
|
|
64
65
|
"""The criterion's share of the reward (overridable per name via `weights` in config)."""
|
|
65
|
-
choices: list[str] = Field(default_factory=lambda: ["no", "yes"])
|
|
66
|
+
choices: list[str] = Field(default_factory=lambda: ["no", "yes"], min_length=2)
|
|
66
67
|
"""Allowed answers, ordered **worst → best**: the first scores 0.0, the last 1.0, the rest
|
|
67
68
|
evenly spaced by rank. Default `["no", "yes"]` is a binary check. Needs >= 2, no duplicates."""
|
|
68
69
|
|
|
69
70
|
@field_validator("choices")
|
|
70
71
|
@classmethod
|
|
71
72
|
def _check_choices(cls, v: list[str]) -> list[str]:
|
|
72
|
-
if len(v) < 2:
|
|
73
|
-
raise ValueError(f"`choices` needs at least two options, got {v}")
|
|
74
73
|
if len(set(v)) != len(v):
|
|
75
74
|
raise ValueError(f"`choices` has duplicate options: {v}")
|
|
76
75
|
return v
|
|
77
76
|
|
|
78
77
|
|
|
78
|
+
CRITERIA_ADAPTER = TypeAdapter(list[Criterion])
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def load_criteria(
|
|
82
|
+
path: Path, weights: dict[str, CriterionWeight] | None = None
|
|
83
|
+
) -> list[Criterion]:
|
|
84
|
+
"""Load a JSON or TOML rubric and apply validated config overrides."""
|
|
85
|
+
text = path.read_text(encoding="utf-8")
|
|
86
|
+
data = tomllib.loads(text) if path.suffix.lower() == ".toml" else json.loads(text)
|
|
87
|
+
items = data.get("criteria", []) if isinstance(data, dict) else data
|
|
88
|
+
criteria = CRITERIA_ADAPTER.validate_python(items)
|
|
89
|
+
if not criteria:
|
|
90
|
+
raise ValueError(f"rubric file '{path}' lists no criteria")
|
|
91
|
+
names = [criterion.name for criterion in criteria]
|
|
92
|
+
if len(set(names)) != len(names):
|
|
93
|
+
raise ValueError(f"rubric file '{path}' has duplicate criterion names")
|
|
94
|
+
overrides = weights or {}
|
|
95
|
+
if unknown := set(overrides) - set(names):
|
|
96
|
+
raise ValueError(
|
|
97
|
+
f"`weights` overrides name no criterion in '{path}': {sorted(unknown)}"
|
|
98
|
+
)
|
|
99
|
+
criteria = [
|
|
100
|
+
criterion.model_copy(
|
|
101
|
+
update={"weight": overrides.get(criterion.name, criterion.weight)}
|
|
102
|
+
)
|
|
103
|
+
for criterion in criteria
|
|
104
|
+
]
|
|
105
|
+
total = sum(criterion.weight for criterion in criteria)
|
|
106
|
+
if total == float("inf"):
|
|
107
|
+
raise ValueError(f"rubric '{path}' has a non-finite total criterion weight")
|
|
108
|
+
if total <= 0:
|
|
109
|
+
raise ValueError(f"rubric '{path}' has no positive criterion weight")
|
|
110
|
+
return criteria
|
|
111
|
+
|
|
112
|
+
|
|
79
113
|
class RubricJudgeConfig(JudgeConfig):
|
|
80
114
|
id: ID = "rubric"
|
|
81
115
|
"""Pinned to the built-in, so a code-level default entry needs no explicit id."""
|
|
82
116
|
path: Path
|
|
83
117
|
"""A `.toml` or `.json` file containing a `criteria` list. Relative paths resolve
|
|
84
118
|
against the evaluation's working directory."""
|
|
85
|
-
weights: dict[str,
|
|
119
|
+
weights: dict[str, CriterionWeight] = Field(default_factory=dict)
|
|
86
120
|
"""Per-criterion weight overrides by criterion name (config wins over the file)."""
|
|
87
121
|
question_field: str = ""
|
|
88
122
|
"""Task field to fill the prompt's `{question}`; empty = the task's prompt rendered as
|
|
@@ -96,7 +130,7 @@ class RubricJudgeConfig(JudgeConfig):
|
|
|
96
130
|
"""How much of the rollout fills `{response}` (see `JudgeView`). Defaults to the whole
|
|
97
131
|
transcript — rubric criteria typically grade the process (tool use, citations,
|
|
98
132
|
intermediate steps), not just the final answer."""
|
|
99
|
-
max_criteria: int | None = None
|
|
133
|
+
max_criteria: int | None = Field(default=None, ge=1)
|
|
100
134
|
"""How many criteria to grade per judge call. `None` (default) grades all criteria in one
|
|
101
135
|
call. `1` sends one call per criterion (n independent judges); `k` batches them k-at-a-time.
|
|
102
136
|
Batches are graded concurrently and merged. Smaller batches trade more calls for focus/
|
|
@@ -119,45 +153,43 @@ class RubricVerdicts(BaseModel):
|
|
|
119
153
|
verdicts: list[CriterionVerdict]
|
|
120
154
|
|
|
121
155
|
|
|
156
|
+
def score_verdicts(
|
|
157
|
+
verdicts: list[CriterionVerdict],
|
|
158
|
+
criteria: list[Criterion],
|
|
159
|
+
expected: str,
|
|
160
|
+
) -> dict[str, float]:
|
|
161
|
+
"""Validate a complete named verdict set and normalize its ordered choices."""
|
|
162
|
+
by_criterion = {criterion.name: criterion for criterion in criteria}
|
|
163
|
+
answers: dict[str, str] = {}
|
|
164
|
+
for verdict in verdicts:
|
|
165
|
+
if verdict.name in answers:
|
|
166
|
+
raise ValueError(
|
|
167
|
+
f"judge answered criterion {verdict.name!r} more than once"
|
|
168
|
+
)
|
|
169
|
+
answers[verdict.name] = verdict.verdict
|
|
170
|
+
if sorted(answers) != sorted(by_criterion):
|
|
171
|
+
raise ValueError(
|
|
172
|
+
f"judge verdicts name {sorted(answers)}, expected {expected} "
|
|
173
|
+
f"{sorted(by_criterion)}"
|
|
174
|
+
)
|
|
175
|
+
scores: dict[str, float] = {}
|
|
176
|
+
for name, answer in answers.items():
|
|
177
|
+
choices = by_criterion[name].choices
|
|
178
|
+
if answer not in choices:
|
|
179
|
+
raise ValueError(
|
|
180
|
+
f"judge answered {answer!r} for '{name}', expected one of {choices}"
|
|
181
|
+
)
|
|
182
|
+
scores[name] = normalize_choice(answer, choices)
|
|
183
|
+
return scores
|
|
184
|
+
|
|
185
|
+
|
|
122
186
|
class RubricJudge(Judge[RubricVerdicts, RubricJudgeConfig]):
|
|
123
187
|
prompt = RUBRIC_PROMPT
|
|
124
188
|
schema = RubricVerdicts
|
|
125
189
|
|
|
126
190
|
@cached_property
|
|
127
191
|
def criteria(self) -> list[Criterion]:
|
|
128
|
-
path
|
|
129
|
-
text = path.read_text(encoding="utf-8")
|
|
130
|
-
data = (
|
|
131
|
-
tomllib.loads(text) if path.suffix.lower() == ".toml" else json.loads(text)
|
|
132
|
-
)
|
|
133
|
-
items = data.get("criteria", []) if isinstance(data, dict) else data
|
|
134
|
-
criteria = [Criterion.model_validate(item) for item in items]
|
|
135
|
-
if not criteria:
|
|
136
|
-
raise ValueError(f"rubric file '{path}' lists no criteria")
|
|
137
|
-
names = [criterion.name for criterion in criteria]
|
|
138
|
-
if len(set(names)) != len(names):
|
|
139
|
-
raise ValueError(f"rubric file '{path}' has duplicate criterion names")
|
|
140
|
-
if unknown := set(self.config.weights) - set(names):
|
|
141
|
-
raise ValueError(
|
|
142
|
-
f"`weights` overrides name no criterion in '{path}': {sorted(unknown)}"
|
|
143
|
-
)
|
|
144
|
-
criteria = [
|
|
145
|
-
criterion.model_copy(
|
|
146
|
-
update={
|
|
147
|
-
"weight": self.config.weights.get(criterion.name, criterion.weight)
|
|
148
|
-
}
|
|
149
|
-
)
|
|
150
|
-
for criterion in criteria
|
|
151
|
-
]
|
|
152
|
-
if bad := [c.name for c in criteria if not 0 <= c.weight < math.inf]:
|
|
153
|
-
# A negative weight would invert a criterion (pushing the reward out of [0, 1]);
|
|
154
|
-
# NaN/inf (which json.loads accepts) would corrupt the weighted mean.
|
|
155
|
-
raise ValueError(
|
|
156
|
-
f"rubric '{path}' has negative or non-finite criterion weights: {bad}"
|
|
157
|
-
)
|
|
158
|
-
if sum(criterion.weight for criterion in criteria) <= 0:
|
|
159
|
-
raise ValueError(f"rubric '{path}' has no positive criterion weight")
|
|
160
|
-
return criteria
|
|
192
|
+
return load_criteria(self.config.path, self.config.weights)
|
|
161
193
|
|
|
162
194
|
async def grade_batch(
|
|
163
195
|
self, task: TaskData, trace: Trace, batch: list[Criterion]
|
|
@@ -205,30 +237,12 @@ class RubricJudge(Judge[RubricVerdicts, RubricJudgeConfig]):
|
|
|
205
237
|
f"judge returned no verdicts JSON object: {result.text!r}"
|
|
206
238
|
)
|
|
207
239
|
verdicts = RubricVerdicts.model_validate(obj).verdicts
|
|
208
|
-
#
|
|
209
|
-
|
|
210
|
-
by_criterion = {c.name: c for c in batch}
|
|
211
|
-
if sorted(v.name for v in verdicts) != sorted(by_criterion):
|
|
212
|
-
raise ValueError(
|
|
213
|
-
f"judge verdicts name {sorted(v.name for v in verdicts)}, expected the "
|
|
214
|
-
f"batch's {sorted(by_criterion)}"
|
|
215
|
-
)
|
|
216
|
-
scores: dict[str, float] = {}
|
|
217
|
-
for v in verdicts:
|
|
218
|
-
choices = by_criterion[v.name].choices
|
|
219
|
-
# An off-menu answer is a judge failure, not a zero score.
|
|
220
|
-
if v.verdict not in choices:
|
|
221
|
-
raise ValueError(
|
|
222
|
-
f"judge answered {v.verdict!r} for '{v.name}', expected one of {choices}"
|
|
223
|
-
)
|
|
224
|
-
scores[v.name] = normalize_choice(v.verdict, choices)
|
|
225
|
-
return scores
|
|
240
|
+
# A malformed verdict is a judge failure and must error the rollout, not score the model.
|
|
241
|
+
return score_verdicts(verdicts, batch, "the batch's")
|
|
226
242
|
|
|
227
243
|
async def score(self, task: TaskData, trace: Trace) -> float:
|
|
228
244
|
criteria = self.criteria
|
|
229
245
|
k = self.config.max_criteria
|
|
230
|
-
if k is not None and k < 1:
|
|
231
|
-
raise ValueError(f"`max_criteria` must be >= 1 or None, got {k}")
|
|
232
246
|
batches = (
|
|
233
247
|
[criteria]
|
|
234
248
|
if k is None
|