verifiers 0.2.2.dev47__tar.gz → 0.2.2.dev49__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.dev47 → verifiers-0.2.2.dev49}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/pyproject.toml +4 -2
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_e2e.py +20 -20
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_graph.py +16 -6
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_judges.py +4 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_trace.py +4 -1
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/agent.py +12 -12
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/eval.py +13 -16
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/debug.py +4 -11
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/eval/runner.py +3 -3
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/replay.py +3 -9
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/resolve.py +22 -13
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/validate.py +14 -9
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/env.py +1 -1
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/agentic_judge/env.py +1 -1
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/user_sim/env.py +2 -2
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/errors.py +1 -1
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/adapter.py +2 -3
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/legacy.py +6 -2
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/push.py +5 -5
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/retries.py +3 -1
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/rollout.py +23 -20
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/subprocess.py +1 -1
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/task.py +1 -1
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/harbor/taskset.py +4 -4
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/trace.py +135 -238
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/compile.py +8 -8
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/.gitignore +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/LICENSE +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/README.md +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/acp/_runner.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/serve.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/legacy.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/sampling.py +0 -0
- {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/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.dev49
|
|
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
|
|
@@ -136,8 +136,10 @@ kuhn-poker-v1 = { path = "environments/kuhn_poker_v1", editable = true }
|
|
|
136
136
|
|
|
137
137
|
[tool.uv.exclude-newer-package]
|
|
138
138
|
# Bounded cutoffs for the explicitly requested tool upgrades.
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
# Full UTC timestamps: bare dates resolve to local-tz midnight and churn the
|
|
140
|
+
# lockfile across timezones.
|
|
141
|
+
ruff = "2026-07-28T00:00:00Z"
|
|
142
|
+
ty = "2026-07-28T00:00:00Z"
|
|
141
143
|
# PrimeIntellect-published on PyPI (trusted publisher)
|
|
142
144
|
prime-tunnel = false
|
|
143
145
|
prime-sandboxes = false
|
|
@@ -229,7 +229,7 @@ async def test_tool(run_v1, harness_runtime, tool_runtime, tmp_path):
|
|
|
229
229
|
assert trace.reward == 1.0
|
|
230
230
|
# The interception server captured the advertised tools onto the trace (for tool-use SFT):
|
|
231
231
|
# the null harness offered the task's MCP tool as `echo_back`, schema included.
|
|
232
|
-
assert trace.tools
|
|
232
|
+
assert trace.tools
|
|
233
233
|
(echo_tool,) = [t for t in trace.tools if t.name == "echo_back"]
|
|
234
234
|
assert "message" in echo_tool.parameters.get("properties", {})
|
|
235
235
|
|
|
@@ -355,9 +355,9 @@ async def test_multi_agent_env(run_v1, tmp_path):
|
|
|
355
355
|
max_turns=2,
|
|
356
356
|
)
|
|
357
357
|
assert len(traces) == 2 # one episode, one trace per role
|
|
358
|
-
assert sorted(t.
|
|
359
|
-
(b,) = [t for t in traces if t.
|
|
360
|
-
assert b.trainable is False
|
|
358
|
+
assert sorted(t.agent.name for t in traces) == ["a", "b"]
|
|
359
|
+
(b,) = [t for t in traces if t.agent.name == "b"]
|
|
360
|
+
assert b.agent.trainable is False
|
|
361
361
|
for trace in traces:
|
|
362
362
|
assert trace.ok
|
|
363
363
|
assert trace.reward == 1.0 # each seat's own task reward
|
|
@@ -385,7 +385,7 @@ async def test_env_id_best_of_n(run_v1, tmp_path):
|
|
|
385
385
|
max_turns=2,
|
|
386
386
|
)
|
|
387
387
|
assert len(traces) == 2 # one episode, two attempts
|
|
388
|
-
assert all(t.
|
|
388
|
+
assert all(t.agent.name == "agent" and t.ok for t in traces)
|
|
389
389
|
assert any(t.metrics["best"] == 1.0 for t in traces)
|
|
390
390
|
assert all(t.metrics["pass_at_n"] == 1.0 for t in traces) # echo always passes
|
|
391
391
|
|
|
@@ -423,11 +423,11 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
|
|
|
423
423
|
max_turns=10,
|
|
424
424
|
rollout_timeout=600,
|
|
425
425
|
)
|
|
426
|
-
assert sorted(t.
|
|
427
|
-
(solver,) = [t for t in traces if t.
|
|
428
|
-
(judge,) = [t for t in traces if t.
|
|
426
|
+
assert sorted(t.agent.name for t in traces) == ["judge", "solver"]
|
|
427
|
+
(solver,) = [t for t in traces if t.agent.name == "solver"]
|
|
428
|
+
(judge,) = [t for t in traces if t.agent.name == "judge"]
|
|
429
429
|
assert solver.ok and judge.ok
|
|
430
|
-
assert judge.trainable is False
|
|
430
|
+
assert judge.agent.trainable is False
|
|
431
431
|
# The task's own reward keeps its raw score; the rescale lands on the weight.
|
|
432
432
|
assert solver.rewards["echoed"].score == 1.0
|
|
433
433
|
assert solver.rewards["echoed"].weight == 0.5
|
|
@@ -448,11 +448,11 @@ async def test_env_id_user_sim(run_v1, tmp_path):
|
|
|
448
448
|
max_turns=6,
|
|
449
449
|
rollout_timeout=300,
|
|
450
450
|
)
|
|
451
|
-
assert sorted(t.
|
|
452
|
-
(assistant,) = [t for t in traces if t.
|
|
453
|
-
(user,) = [t for t in traces if t.
|
|
451
|
+
assert sorted(t.agent.name for t in traces) == ["assistant", "user"]
|
|
452
|
+
(assistant,) = [t for t in traces if t.agent.name == "assistant"]
|
|
453
|
+
(user,) = [t for t in traces if t.agent.name == "user"]
|
|
454
454
|
assert assistant.ok and user.ok
|
|
455
|
-
assert user.trainable is False
|
|
455
|
+
assert user.agent.trainable is False
|
|
456
456
|
assert user.num_turns >= 1 # the modeled user actually spoke
|
|
457
457
|
assert assistant.metrics["user_turns"] >= 1
|
|
458
458
|
# `mask_prompt`: the scenario is hidden from the assistant's harness (the run's
|
|
@@ -465,7 +465,7 @@ async def test_env_id_user_sim(run_v1, tmp_path):
|
|
|
465
465
|
from verifiers.v1.trace import WireTrace
|
|
466
466
|
|
|
467
467
|
(record,) = read_episodes(tmp_path, WireTrace)
|
|
468
|
-
assert {t.
|
|
468
|
+
assert {t.agent.name for t in record.traces} == {"assistant", "user"}
|
|
469
469
|
assert record.id # both traces are persisted under one durable episode identity
|
|
470
470
|
|
|
471
471
|
|
|
@@ -488,14 +488,14 @@ async def test_env_id_user_sim_with_tools(run_v1, tmp_path):
|
|
|
488
488
|
max_tokens=8192,
|
|
489
489
|
rollout_timeout=300,
|
|
490
490
|
)
|
|
491
|
-
(assistant,) = [t for t in traces if t.
|
|
492
|
-
(user,) = [t for t in traces if t.
|
|
491
|
+
(assistant,) = [t for t in traces if t.agent.name == "assistant"]
|
|
492
|
+
(user,) = [t for t in traces if t.agent.name == "user"]
|
|
493
493
|
assert assistant.ok and user.ok
|
|
494
494
|
assert assistant.task.data.prompt is None # the scenario stayed off the wire
|
|
495
495
|
assert user.num_turns >= 1 # the modeled user actually drove the exchange
|
|
496
496
|
assert assistant.rewards["echoed"].score == 1.0 # the tool ran, mid-conversation
|
|
497
497
|
# The tool was advertised to the masked chat exactly as to any run.
|
|
498
|
-
assert assistant.tools
|
|
498
|
+
assert assistant.tools
|
|
499
499
|
assert any(tool.name == "echo_back" for tool in assistant.tools)
|
|
500
500
|
|
|
501
501
|
|
|
@@ -514,8 +514,8 @@ async def test_kuhn_poker_self_play(run_v1, tmp_path):
|
|
|
514
514
|
max_tokens=8192,
|
|
515
515
|
rollout_timeout=300,
|
|
516
516
|
)
|
|
517
|
-
assert sorted(t.
|
|
518
|
-
payoffs = {t.
|
|
517
|
+
assert sorted(t.agent.name for t in traces) == ["player0", "player1"]
|
|
518
|
+
payoffs = {t.agent.name: t.rewards["payoff"].score for t in traces}
|
|
519
519
|
assert payoffs["player0"] + payoffs["player1"] == 0 # zero-sum
|
|
520
520
|
assert abs(payoffs["player0"]) in (1.0, 2.0)
|
|
521
521
|
for trace in traces:
|
|
@@ -542,7 +542,7 @@ async def test_multi_agent_env_server(run_v1_server, tmp_path):
|
|
|
542
542
|
max_turns=2,
|
|
543
543
|
)
|
|
544
544
|
assert len(traces) == 2
|
|
545
|
-
assert sorted(t.
|
|
545
|
+
assert sorted(t.agent.name for t in traces) == ["a", "b"]
|
|
546
546
|
for trace in traces:
|
|
547
547
|
assert trace.ok
|
|
548
548
|
assert trace.metrics["duet"] == 1.0
|
|
@@ -40,7 +40,8 @@ def test_routed_experts_attributed_and_aligned_across_turns():
|
|
|
40
40
|
concatenates back to a `[tokens, layers, top_k]` array aligned 1:1 with `branch.token_ids` —
|
|
41
41
|
and survives the base64 wire round-trip."""
|
|
42
42
|
trace = vf.Trace(
|
|
43
|
-
|
|
43
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
44
|
+
task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
|
|
44
45
|
)
|
|
45
46
|
user = vf.UserMessage(content="u1")
|
|
46
47
|
graph.prepare_turn(trace, [user]).commit(
|
|
@@ -94,7 +95,8 @@ def test_routed_experts_none_when_absent():
|
|
|
94
95
|
"""No routing captured (engine ran without `enable_return_routed_experts`) -> the branch
|
|
95
96
|
reports None and the trainer simply skips replay."""
|
|
96
97
|
trace = vf.Trace(
|
|
97
|
-
|
|
98
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
99
|
+
task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
|
|
98
100
|
)
|
|
99
101
|
graph.prepare_turn(trace, [vf.UserMessage(content="u1")]).commit(
|
|
100
102
|
vf.Response(
|
|
@@ -128,7 +130,10 @@ def test_tool_call_hash_matches_v0_content_and_arguments_normalization():
|
|
|
128
130
|
|
|
129
131
|
def test_reasoning_content_participates_in_graph_prefix_matching():
|
|
130
132
|
task = vf.TaskData(idx=0, prompt="use a tool")
|
|
131
|
-
trace = vf.Trace(
|
|
133
|
+
trace = vf.Trace(
|
|
134
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
135
|
+
task=vf.TraceTask(type="Task", data=task),
|
|
136
|
+
)
|
|
132
137
|
user = vf.UserMessage(content="use a tool")
|
|
133
138
|
call = vf.ToolCall(id="call_0", name="lookup", arguments="{}")
|
|
134
139
|
|
|
@@ -205,7 +210,8 @@ def test_renderer_level_break_forks_by_token_id():
|
|
|
205
210
|
|
|
206
211
|
# Control: the prior turn re-renders to the same tokens -> stays one linear branch.
|
|
207
212
|
linear = vf.Trace(
|
|
208
|
-
|
|
213
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
214
|
+
task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
|
|
209
215
|
)
|
|
210
216
|
first_turn(linear)
|
|
211
217
|
second_turn(linear, [1, 2, 3, 4, 5, 6, 7])
|
|
@@ -214,7 +220,8 @@ def test_renderer_level_break_forks_by_token_id():
|
|
|
214
220
|
|
|
215
221
|
# Break: the assistant turn retokenizes (4 -> 99), so prompt_ids diverge at that node.
|
|
216
222
|
broken = vf.Trace(
|
|
217
|
-
|
|
223
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
224
|
+
task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
|
|
218
225
|
)
|
|
219
226
|
first_turn(broken)
|
|
220
227
|
second_turn(broken, [1, 2, 3, 99, 5, 6, 7])
|
|
@@ -227,7 +234,10 @@ def test_renderer_level_break_forks_by_token_id():
|
|
|
227
234
|
|
|
228
235
|
def test_prompt_supplied_assistant_messages_are_not_sampled_turns():
|
|
229
236
|
task = vf.TaskData(idx=0, prompt="few-shot")
|
|
230
|
-
trace = vf.Trace(
|
|
237
|
+
trace = vf.Trace(
|
|
238
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
239
|
+
task=vf.TraceTask(type="Task", data=task),
|
|
240
|
+
)
|
|
231
241
|
fabricated = vf.AssistantMessage(
|
|
232
242
|
content=None,
|
|
233
243
|
tool_calls=[vf.ToolCall(id="call_0", name="lookup", arguments="{}")],
|
|
@@ -36,6 +36,7 @@ def make_trace(
|
|
|
36
36
|
task_cls: type[QAData] = QAData,
|
|
37
37
|
) -> vf.Trace:
|
|
38
38
|
return vf.Trace(
|
|
39
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
39
40
|
task=vf.TraceTask(
|
|
40
41
|
type="Task",
|
|
41
42
|
data=task_cls(idx=0, prompt="Capital of France?", answer=answer),
|
|
@@ -244,6 +245,7 @@ async def test_reference_score_messages_prompt(fake_judge_model):
|
|
|
244
245
|
answer="Paris",
|
|
245
246
|
)
|
|
246
247
|
trace = vf.Trace(
|
|
248
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
247
249
|
task=vf.TraceTask(type="Task", data=task),
|
|
248
250
|
nodes=[
|
|
249
251
|
MessageNode(parent=None, message=UserMessage(content="q"), sampled=False),
|
|
@@ -269,6 +271,7 @@ async def test_reference_question_field(fake_judge_model):
|
|
|
269
271
|
answer="Paris",
|
|
270
272
|
)
|
|
271
273
|
trace = vf.Trace(
|
|
274
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
272
275
|
task=vf.TraceTask(type="Task", data=task),
|
|
273
276
|
nodes=[
|
|
274
277
|
MessageNode(parent=None, message=UserMessage(content="q"), sampled=False),
|
|
@@ -293,6 +296,7 @@ def full_trace_fixture() -> vf.Trace:
|
|
|
293
296
|
from verifiers.v1.types import ToolCall, ToolMessage
|
|
294
297
|
|
|
295
298
|
return vf.Trace(
|
|
299
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
296
300
|
task=vf.TraceTask(
|
|
297
301
|
type="Task", data=QAData(idx=0, prompt="Capital of France?", answer="Paris")
|
|
298
302
|
),
|
|
@@ -21,7 +21,8 @@ class MyState(vf.State):
|
|
|
21
21
|
def test_bare_trace_round_trip():
|
|
22
22
|
# The minimal trace: a base task, no nodes, no extras — dump and back into a plain Trace.
|
|
23
23
|
tr = vf.Trace(
|
|
24
|
-
|
|
24
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
25
|
+
task=vf.TraceTask(type="Task", data=vf.TaskData(idx=3, prompt="hello")),
|
|
25
26
|
)
|
|
26
27
|
rt = vf.Trace.model_validate(tr.model_dump())
|
|
27
28
|
assert rt.id == tr.id
|
|
@@ -35,6 +36,7 @@ def test_custom_task_state_round_trip():
|
|
|
35
36
|
# Custom data and state round-trip into the same parameterization. Data fields are
|
|
36
37
|
# typed (not just `model_extra`); `state` is runtime-only and never crosses the wire.
|
|
37
38
|
tr = vf.Trace[MyTask, MyState](
|
|
39
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
38
40
|
task=vf.TraceTask(type="MyTask", data=MyTask(idx=0, prompt="q", answer="gold")),
|
|
39
41
|
state=MyState(score=7),
|
|
40
42
|
nodes=[
|
|
@@ -59,6 +61,7 @@ def test_wire_trace_round_trip():
|
|
|
59
61
|
# Two leaves off one root → 2 branches (a compaction-shaped trace), so the round-trip has to
|
|
60
62
|
# carry node `parent` links for `num_branches` to survive.
|
|
61
63
|
tr = vf.Trace[MyTask, vf.State](
|
|
64
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
62
65
|
task=vf.TraceTask(type="MyTask", data=MyTask(idx=0, prompt="q", answer="a")),
|
|
63
66
|
tools=[vf.Tool(name="echo", description="", parameters={"type": "object"})],
|
|
64
67
|
nodes=[
|
|
@@ -45,7 +45,7 @@ from verifiers.v1.types import (
|
|
|
45
45
|
UserMessage,
|
|
46
46
|
)
|
|
47
47
|
from verifiers.v1.utils.compile import (
|
|
48
|
-
|
|
48
|
+
cap_remote_agent_timeout,
|
|
49
49
|
resolve_runtime_config,
|
|
50
50
|
validate_pairing,
|
|
51
51
|
)
|
|
@@ -390,7 +390,7 @@ class Agent:
|
|
|
390
390
|
attempt + 1,
|
|
391
391
|
retry.max_retries,
|
|
392
392
|
delay,
|
|
393
|
-
trace.
|
|
393
|
+
trace.last_error.type if trace.last_error else "?",
|
|
394
394
|
)
|
|
395
395
|
await asyncio.sleep(delay)
|
|
396
396
|
if history:
|
|
@@ -419,8 +419,8 @@ class Agent:
|
|
|
419
419
|
# close() never runs — free the run's servers and owned runtime first.
|
|
420
420
|
await run.abort()
|
|
421
421
|
raise
|
|
422
|
-
if trace.runtime is not None:
|
|
423
|
-
trace.runtime.borrowed = runtime is not None
|
|
422
|
+
if trace.agent.runtime is not None:
|
|
423
|
+
trace.agent.runtime.borrowed = runtime is not None
|
|
424
424
|
return trace
|
|
425
425
|
|
|
426
426
|
@asynccontextmanager
|
|
@@ -482,8 +482,8 @@ class Agent:
|
|
|
482
482
|
opened = await run.open()
|
|
483
483
|
if not opened:
|
|
484
484
|
trace = await run.close()
|
|
485
|
-
if trace.runtime is not None:
|
|
486
|
-
trace.runtime.borrowed = runtime is not None
|
|
485
|
+
if trace.agent.runtime is not None:
|
|
486
|
+
trace.agent.runtime.borrowed = runtime is not None
|
|
487
487
|
if not opened:
|
|
488
488
|
failure = run.failure
|
|
489
489
|
if failure is None: # `open()` returning False always captures one.
|
|
@@ -499,8 +499,8 @@ class Agent:
|
|
|
499
499
|
raise
|
|
500
500
|
finally:
|
|
501
501
|
trace = run.trace if run.closed else await interaction.close()
|
|
502
|
-
if trace.runtime is not None:
|
|
503
|
-
trace.runtime.borrowed = runtime is not None
|
|
502
|
+
if trace.agent.runtime is not None:
|
|
503
|
+
trace.agent.runtime.borrowed = runtime is not None
|
|
504
504
|
|
|
505
505
|
def _rollout_params(
|
|
506
506
|
self, task: Task, runtime: Runtime | None, shared_tools: dict
|
|
@@ -520,10 +520,10 @@ class Agent:
|
|
|
520
520
|
self.harness, type(task), runtime_config, shared_tools=shared_tools
|
|
521
521
|
)
|
|
522
522
|
# Timeout precedence: agent-level wins, else the task's, else no limit.
|
|
523
|
-
|
|
523
|
+
agent_timeout = (
|
|
524
524
|
self.timeout.rollout
|
|
525
525
|
if self.timeout.rollout is not None
|
|
526
|
-
else task.data.timeout.
|
|
526
|
+
else task.data.timeout.agent
|
|
527
527
|
)
|
|
528
528
|
return {
|
|
529
529
|
"agent_config": self.config,
|
|
@@ -535,8 +535,8 @@ class Agent:
|
|
|
535
535
|
if self.timeout.setup is not None
|
|
536
536
|
else task.data.timeout.setup
|
|
537
537
|
),
|
|
538
|
-
"
|
|
539
|
-
|
|
538
|
+
"agent_timeout": cap_remote_agent_timeout(
|
|
539
|
+
agent_timeout, runtime_config, task
|
|
540
540
|
),
|
|
541
541
|
"finalize_timeout": (
|
|
542
542
|
self.timeout.finalize
|
|
@@ -302,7 +302,7 @@ def Progress(
|
|
|
302
302
|
# run, a modeled user) are `trainable=False` and carry no rewards, so counting
|
|
303
303
|
# them dilutes every mean with structural zeros. An all-untrainable run (every
|
|
304
304
|
# role frozen) falls back to all traces rather than showing nothing.
|
|
305
|
-
scored = [t for t in done_traces if t.trainable] or done_traces
|
|
305
|
+
scored = [t for t in done_traces if t.agent.trainable] or done_traces
|
|
306
306
|
total = len(slots)
|
|
307
307
|
# Headline reward = mean over non-errored traces; when any errored, `format_mean` appends
|
|
308
308
|
# the global avg (errored count as 0) in parens. `err` is the share of episodes that
|
|
@@ -367,13 +367,13 @@ def _breakdown(scored: list[Trace], done: list[Trace]) -> Table | None:
|
|
|
367
367
|
# show); usage/time below still cover errored rollouts (their resources were spent regardless).
|
|
368
368
|
has_clean = any(not t.has_error for t in done)
|
|
369
369
|
score_rows = (("rewards", "rewards"), ("metrics", "metrics")) if has_clean else ()
|
|
370
|
-
by_agent: dict[str
|
|
370
|
+
by_agent: dict[str, list[Trace]] = {}
|
|
371
371
|
for trace in done:
|
|
372
|
-
by_agent.setdefault(trace.
|
|
372
|
+
by_agent.setdefault(trace.agent.name, []).append(trace)
|
|
373
373
|
for label, source in score_rows:
|
|
374
374
|
if len(by_agent) > 1:
|
|
375
375
|
segments = [
|
|
376
|
-
f"[dim]{name
|
|
376
|
+
f"[dim]{name}:[/dim] {means}"
|
|
377
377
|
for name, traces in by_agent.items()
|
|
378
378
|
if (means := _score_segments(traces, source)) is not None
|
|
379
379
|
]
|
|
@@ -505,7 +505,7 @@ def _stage(trace: Trace) -> str:
|
|
|
505
505
|
stage = "boot" # trace minted, first span not yet opened (an instant)
|
|
506
506
|
# A boot stuck on a first-use platform image build reads differently from a
|
|
507
507
|
# normal boot — it can sit there for ~10 minutes (prime runtime only).
|
|
508
|
-
if stage == "boot" and getattr(trace.runtime, "image_cached", None) is False:
|
|
508
|
+
if stage == "boot" and getattr(trace.agent.runtime, "image_cached", None) is False:
|
|
509
509
|
return "build"
|
|
510
510
|
return stage
|
|
511
511
|
|
|
@@ -564,14 +564,14 @@ def Rows(groups: list[list[RunSlot]], now: float, runtime_type: str) -> Table:
|
|
|
564
564
|
group_rows.append(("pending", [f"task {base}", *[""] * 7], "", ""))
|
|
565
565
|
continue
|
|
566
566
|
for t in slot.traces:
|
|
567
|
-
label = f"{base} agent={t.
|
|
567
|
+
label = f"{base} agent={t.agent.name}"
|
|
568
568
|
if slot.done: # fully scored — reward is final
|
|
569
569
|
state = "error" if t.has_error else "success"
|
|
570
570
|
# A trace that recorded nothing shows no reward: a judge or
|
|
571
571
|
# modeled-user seat's `reward=0.00` would read as a score.
|
|
572
572
|
result = (
|
|
573
|
-
t.
|
|
574
|
-
if t.has_error
|
|
573
|
+
t.last_error.type
|
|
574
|
+
if t.has_error and t.last_error
|
|
575
575
|
else (f"reward={t.reward:.2f}" if t.rewards else "")
|
|
576
576
|
)
|
|
577
577
|
if t.has_error:
|
|
@@ -582,7 +582,7 @@ def Rows(groups: list[list[RunSlot]], now: float, runtime_type: str) -> Table:
|
|
|
582
582
|
t.is_truncated
|
|
583
583
|
): # flag a clipped rollout next to its stop condition
|
|
584
584
|
stop = f"{stop} (truncated)".strip()
|
|
585
|
-
elif t.is_completed and (err := t.
|
|
585
|
+
elif t.is_completed and (err := t.last_error) is not None:
|
|
586
586
|
# An errored trace whose episode is still running its other
|
|
587
587
|
# traces (or `score()`) is already a failure — show it, don't
|
|
588
588
|
# let it sit as "scoring" until the whole episode lands.
|
|
@@ -592,12 +592,9 @@ def Rows(groups: list[list[RunSlot]], now: float, runtime_type: str) -> Table:
|
|
|
592
592
|
# The trace's own stamp, not the run-level runtime: a role's harness
|
|
593
593
|
# may resolve elsewhere (the judge env's sandboxed judge on a
|
|
594
594
|
# subprocess run).
|
|
595
|
-
if t.runtime is not None:
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
if t.runtime.id
|
|
599
|
-
else t.runtime.type
|
|
600
|
-
)
|
|
595
|
+
if t.agent.runtime is not None:
|
|
596
|
+
rt = t.agent.runtime
|
|
597
|
+
runtime = f"{rt.type}({rt.id})" if rt.id else rt.type
|
|
601
598
|
else:
|
|
602
599
|
runtime = runtime_type
|
|
603
600
|
turns = t.num_turns
|
|
@@ -635,7 +632,7 @@ def Rows(groups: list[list[RunSlot]], now: float, runtime_type: str) -> Table:
|
|
|
635
632
|
f"{nbranches} branch{'es' * (nbranches != 1)}",
|
|
636
633
|
tokens,
|
|
637
634
|
f"{format_cost_usd(cost)}" if cost is not None else "",
|
|
638
|
-
stop, # stop condition (agent_completed / max_turns /
|
|
635
|
+
stop, # stop condition (agent_completed / max_turns / error), once done
|
|
639
636
|
]
|
|
640
637
|
# No start time yet (queued, not generating) → blank, not `now - 0` (~56 years).
|
|
641
638
|
elapsed = format_time(end - start) if start else ""
|
|
@@ -18,6 +18,7 @@ import verifiers.v1 as vf
|
|
|
18
18
|
from verifiers.v1.cli.output import append_trace, save_config
|
|
19
19
|
from verifiers.v1.cli.resolve import (
|
|
20
20
|
extract_id,
|
|
21
|
+
narrow_taskset_config,
|
|
21
22
|
plugin_errors,
|
|
22
23
|
references_config_file,
|
|
23
24
|
with_positional_taskset,
|
|
@@ -43,15 +44,7 @@ USAGE = (
|
|
|
43
44
|
|
|
44
45
|
def _narrow(argv: list[str]) -> type[DebugConfig]:
|
|
45
46
|
"""`DebugConfig` with `taskset` narrowed to the config type of the id on the CLI."""
|
|
46
|
-
|
|
47
|
-
if not taskset_id:
|
|
48
|
-
return DebugConfig
|
|
49
|
-
ftype = vf.taskset_config_type(taskset_id)
|
|
50
|
-
return type(
|
|
51
|
-
DebugConfig.__name__,
|
|
52
|
-
(DebugConfig,),
|
|
53
|
-
{"__annotations__": {"taskset": ftype}, "taskset": ftype(id=taskset_id)},
|
|
54
|
-
)
|
|
47
|
+
return narrow_taskset_config(DebugConfig, extract_id(argv, "taskset"))
|
|
55
48
|
|
|
56
49
|
|
|
57
50
|
def output_path(config: DebugConfig) -> Path:
|
|
@@ -108,9 +101,9 @@ def error_info(
|
|
|
108
101
|
|
|
109
102
|
|
|
110
103
|
def capture_trace_error(trace: Trace, error: BaseException) -> None:
|
|
111
|
-
# CancelledError is a BaseException; Trace.
|
|
104
|
+
# CancelledError is a BaseException; Trace.record_error accepts Exception.
|
|
112
105
|
if isinstance(error, Exception):
|
|
113
|
-
trace.
|
|
106
|
+
trace.record_error(error)
|
|
114
107
|
return
|
|
115
108
|
trace.errors.append(
|
|
116
109
|
Error(
|
|
@@ -68,7 +68,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
|
|
|
68
68
|
|
|
69
69
|
async def on_complete(episode: Episode) -> None:
|
|
70
70
|
for trace in episode.traces:
|
|
71
|
-
trace.
|
|
71
|
+
trace.record_run(EvalRunInfo(id=config.uuid))
|
|
72
72
|
await append_episode(out, episode, write_lock)
|
|
73
73
|
|
|
74
74
|
# Serving resources (shared tool servers, interception) come up once for the
|
|
@@ -240,7 +240,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
240
240
|
)
|
|
241
241
|
records = []
|
|
242
242
|
for trace in traces:
|
|
243
|
-
trace.
|
|
243
|
+
trace.record_run(EvalRunInfo(id=config.uuid))
|
|
244
244
|
await append_trace(out, trace, write_lock, env=config.env_id)
|
|
245
245
|
records.append(Episode.of(trace))
|
|
246
246
|
return records
|
|
@@ -254,7 +254,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
254
254
|
**payload,
|
|
255
255
|
)
|
|
256
256
|
for trace in episode.traces:
|
|
257
|
-
trace.
|
|
257
|
+
trace.record_run(EvalRunInfo(id=config.uuid))
|
|
258
258
|
await append_episode(out, episode, write_lock)
|
|
259
259
|
return [episode]
|
|
260
260
|
|
|
@@ -27,6 +27,7 @@ from verifiers.v1.cli.output import (
|
|
|
27
27
|
save_config,
|
|
28
28
|
write_config,
|
|
29
29
|
)
|
|
30
|
+
from verifiers.v1.cli.resolve import narrow_taskset_config
|
|
30
31
|
from verifiers.v1.configs.agent import WireAgentConfig
|
|
31
32
|
from verifiers.v1.configs.cli.replay import ReplayConfig
|
|
32
33
|
from verifiers.v1.state import state_cls
|
|
@@ -49,14 +50,7 @@ def _narrow(config_path: Path) -> type[ReplayConfig]:
|
|
|
49
50
|
data = tomllib.loads(config_path.read_text())
|
|
50
51
|
taskset = data.get("taskset") or (data.get("env") or {}).get("taskset") or {}
|
|
51
52
|
taskset_id = taskset.get("id")
|
|
52
|
-
|
|
53
|
-
return ReplayConfig
|
|
54
|
-
ftype = vf.taskset_config_type(taskset_id)
|
|
55
|
-
return type(
|
|
56
|
-
"ReplayConfig",
|
|
57
|
-
(ReplayConfig,),
|
|
58
|
-
{"__annotations__": {"taskset": ftype}, "taskset": ftype(id=taskset_id)},
|
|
59
|
-
)
|
|
53
|
+
return narrow_taskset_config(ReplayConfig, taskset_id)
|
|
60
54
|
|
|
61
55
|
|
|
62
56
|
def output_dir(config: ReplayConfig) -> Path:
|
|
@@ -171,7 +165,7 @@ async def run_replay(config: ReplayConfig, source: Path, out: Path) -> list[Trac
|
|
|
171
165
|
st.state, st.detail = "scored", f"reward {trace.reward:.3f}"
|
|
172
166
|
except Exception as exc:
|
|
173
167
|
st.state, st.detail = "error", type(exc).__name__
|
|
174
|
-
trace.
|
|
168
|
+
trace.record_error(exc)
|
|
175
169
|
if not config.rich:
|
|
176
170
|
logger.warning(
|
|
177
171
|
"replay: scoring failed for task %s",
|
|
@@ -8,9 +8,14 @@ states explicitly is pre-narrowed — never to a type a config file could contra
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import contextlib
|
|
11
|
+
from typing import TypeVar
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, create_model
|
|
11
14
|
|
|
12
15
|
import verifiers.v1 as vf
|
|
13
16
|
|
|
17
|
+
ConfigT = TypeVar("ConfigT", bound=BaseModel)
|
|
18
|
+
|
|
14
19
|
|
|
15
20
|
@contextlib.contextmanager
|
|
16
21
|
def plugin_errors():
|
|
@@ -68,7 +73,19 @@ def extract_id(argv: list[str], field: str, default: str = "") -> str:
|
|
|
68
73
|
return found[0] if found else default
|
|
69
74
|
|
|
70
75
|
|
|
71
|
-
def
|
|
76
|
+
def narrow_taskset_config(base: type[ConfigT], taskset_id: str | None) -> type[ConfigT]:
|
|
77
|
+
"""Narrow a CLI config's taskset field to the selected plugin config."""
|
|
78
|
+
if not taskset_id:
|
|
79
|
+
return base
|
|
80
|
+
taskset_type = vf.taskset_config_type(taskset_id)
|
|
81
|
+
return create_model(
|
|
82
|
+
base.__name__,
|
|
83
|
+
__base__=base,
|
|
84
|
+
taskset=(taskset_type, taskset_type(id=taskset_id)),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def narrow_config(base: type[ConfigT], argv: list[str]) -> type[ConfigT]:
|
|
72
89
|
"""`base` with its `env` field narrowed to the config class of the env the CLI
|
|
73
90
|
names (`--env.id`, else the taskset's own env, else the single-agent env),
|
|
74
91
|
including its `taskset` sub-field. Ids a config file may set are left to the
|
|
@@ -81,18 +98,10 @@ def narrow_config(base: type, argv: list[str]) -> type:
|
|
|
81
98
|
env_type = vf.env_config_type(taskset_id, env_id)
|
|
82
99
|
if taskset_id:
|
|
83
100
|
# Nested narrowing: `--env.taskset.<knob>` parses typed and renders in -h.
|
|
84
|
-
|
|
85
|
-
env_type = type(
|
|
86
|
-
env_type.__name__,
|
|
87
|
-
(env_type,),
|
|
88
|
-
{
|
|
89
|
-
"__annotations__": {"taskset": taskset_type},
|
|
90
|
-
"taskset": taskset_type(id=taskset_id),
|
|
91
|
-
},
|
|
92
|
-
)
|
|
101
|
+
env_type = narrow_taskset_config(env_type, taskset_id)
|
|
93
102
|
default = env_type(id=env_id) if env_id else env_type()
|
|
94
|
-
return
|
|
103
|
+
return create_model(
|
|
95
104
|
base.__name__,
|
|
96
|
-
|
|
97
|
-
|
|
105
|
+
__base__=base,
|
|
106
|
+
env=(env_type, default),
|
|
98
107
|
)
|
|
@@ -14,6 +14,7 @@ import verifiers.v1 as vf
|
|
|
14
14
|
from verifiers.v1.cli.dashboard import TaskProgress, validate_dashboard
|
|
15
15
|
from verifiers.v1.cli.resolve import (
|
|
16
16
|
extract_id,
|
|
17
|
+
narrow_taskset_config,
|
|
17
18
|
plugin_errors,
|
|
18
19
|
references_config_file,
|
|
19
20
|
with_positional_taskset,
|
|
@@ -41,15 +42,7 @@ def _narrow(argv: list[str]) -> type[ValidateConfig]:
|
|
|
41
42
|
"""`ValidateConfig` with `taskset` narrowed to the config type of the id on the CLI — so
|
|
42
43
|
the single `cli()` parse stays typed and `-h` renders the taskset's fields. Absent an id
|
|
43
44
|
(a `@ file.toml` may carry it) the base type is left for the validator to resolve."""
|
|
44
|
-
|
|
45
|
-
if not taskset_id:
|
|
46
|
-
return ValidateConfig
|
|
47
|
-
ftype = vf.taskset_config_type(taskset_id)
|
|
48
|
-
return type(
|
|
49
|
-
ValidateConfig.__name__,
|
|
50
|
-
(ValidateConfig,),
|
|
51
|
-
{"__annotations__": {"taskset": ftype}, "taskset": ftype(id=taskset_id)},
|
|
52
|
-
)
|
|
45
|
+
return narrow_taskset_config(ValidateConfig, extract_id(argv, "taskset"))
|
|
53
46
|
|
|
54
47
|
|
|
55
48
|
ResultRow = dict[str, Any]
|
|
@@ -96,6 +89,12 @@ async def _run_gold(task: Task, config: ValidateConfig) -> ResultRow:
|
|
|
96
89
|
trace = Trace(
|
|
97
90
|
task=TraceTask(type=type(task).__name__, data=task.data),
|
|
98
91
|
state=state_cls(type(task))(),
|
|
92
|
+
# No agent runs here — the info only records the runtime policy.
|
|
93
|
+
agent=vf.AgentInfo(
|
|
94
|
+
config=vf.AgentConfig(runtime=config.runtime),
|
|
95
|
+
name="validate",
|
|
96
|
+
trainable=False,
|
|
97
|
+
),
|
|
99
98
|
)
|
|
100
99
|
await runtime.start()
|
|
101
100
|
await asyncio.wait_for(
|
|
@@ -131,6 +130,12 @@ async def _run_setup(task: Task, config: ValidateConfig) -> ResultRow:
|
|
|
131
130
|
trace = Trace(
|
|
132
131
|
task=TraceTask(type=type(task).__name__, data=task.data),
|
|
133
132
|
state=state_cls(type(task))(),
|
|
133
|
+
# No agent runs here — the info only records the runtime policy.
|
|
134
|
+
agent=vf.AgentInfo(
|
|
135
|
+
config=vf.AgentConfig(runtime=config.runtime),
|
|
136
|
+
name="validate",
|
|
137
|
+
trainable=False,
|
|
138
|
+
),
|
|
134
139
|
)
|
|
135
140
|
await runtime.start()
|
|
136
141
|
await asyncio.wait_for(
|
|
@@ -163,7 +163,7 @@ class Env(ABC, Generic[ConfigT]):
|
|
|
163
163
|
"""Cross-agent judgement — THE programmable judgement surface: plain
|
|
164
164
|
imperative Python over the finished episode (per-trace judgement already
|
|
165
165
|
ran on each trace's own task). `episode.traces` is the flat episode in
|
|
166
|
-
completion order, each trace's `
|
|
166
|
+
completion order, each trace's `agent.name` stamp naming its agent; attach
|
|
167
167
|
signals via `record_reward`/`record_metric`, in program order. A raise
|
|
168
168
|
fails the episode (the retryable unit) — validate strictly, never
|
|
169
169
|
record a guess."""
|
|
@@ -304,7 +304,7 @@ class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
|
|
|
304
304
|
await agents.judge.run(judge_task, runtime=box)
|
|
305
305
|
|
|
306
306
|
async def finalize(self, task: vf.Task, episode: vf.Episode) -> None:
|
|
307
|
-
by_agent = {t.
|
|
307
|
+
by_agent = {t.agent.name: t for t in episode.traces}
|
|
308
308
|
solution, verdict = by_agent["solver"], by_agent["judge"]
|
|
309
309
|
data = verdict.info.get("verdict")
|
|
310
310
|
if not isinstance(data, dict) or not isinstance(data.get("verdicts"), list):
|
|
@@ -89,7 +89,7 @@ class UserSimEnv(vf.Env[UserSimEnvConfig]):
|
|
|
89
89
|
async def finalize(self, task, episode):
|
|
90
90
|
"""One conversation-shape fact about the user's side, recorded on the
|
|
91
91
|
assistant's trace; judgement stays on the task's rewards."""
|
|
92
|
-
(user,) = (t for t in episode.traces if t.
|
|
92
|
+
(user,) = (t for t in episode.traces if t.agent.name == "user")
|
|
93
93
|
for trace in episode.traces:
|
|
94
|
-
if trace.
|
|
94
|
+
if trace.agent.name == "assistant":
|
|
95
95
|
trace.record_metric("user_turns", float(user.num_turns))
|