verifiers 0.2.1.dev42__tar.gz → 0.2.1.dev44__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.1.dev42 → verifiers-0.2.1.dev44}/PKG-INFO +1 -1
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/dashboard/eval.py +8 -11
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/default/program.py +1 -6
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/interception/server.py +171 -97
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/session.py +18 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/trace.py +23 -22
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/.gitignore +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/LICENSE +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/pyproject.toml +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/AGENTS.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/conftest.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_build_script.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_client_config.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_env_group.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_env_server.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_environment.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_envs.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_imports.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_init_script.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_logging.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_parser.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_rubric.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_types.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_wordle_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/decorators.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/errors.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/types.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/verifiers/v1/utils/sampling.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.1.
|
|
3
|
+
Version: 0.2.1.dev44
|
|
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
|
|
@@ -363,17 +363,14 @@ def _breakdown(done: list[Trace]) -> Table | None:
|
|
|
363
363
|
|
|
364
364
|
def _tokens(trace: Trace) -> tuple[int, int, int | None, int | None, int]:
|
|
365
365
|
"""Input/output tokens summed across all branches: per branch, output is every assistant
|
|
366
|
-
(completion) token generated across its turns and input is
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
endpoint returns no token ids (e.g. plain OpenAI completions), so the counts aren't shown as
|
|
375
|
-
0/0. Returns the branch count from the same derived view so each dashboard tick materializes
|
|
376
|
-
it once."""
|
|
366
|
+
(completion) token generated across its turns and input is the fed-in tokens counted once
|
|
367
|
+
(system + user + tool) — the final sequence minus everything the model generated. A rollout
|
|
368
|
+
yields one training sample per branch (a linear trace is a single branch; compaction and
|
|
369
|
+
subagents add more), so the totals sum them — matching `Trace.num_input_tokens` /
|
|
370
|
+
`Trace.num_output_tokens`, whose sum is `num_total_tokens`.
|
|
371
|
+
|
|
372
|
+
Both counts come from provider-reported usage. Returns the branch count from the same derived
|
|
373
|
+
view so each dashboard tick materializes it once."""
|
|
377
374
|
usage = trace.usage
|
|
378
375
|
cached = usage.cached_input_tokens if usage else None
|
|
379
376
|
reasoning = usage.reasoning_tokens if usage else None
|
|
@@ -260,12 +260,7 @@ async def main() -> None:
|
|
|
260
260
|
payload = path.read_bytes()
|
|
261
261
|
path.unlink()
|
|
262
262
|
initial = json.loads(payload)
|
|
263
|
-
|
|
264
|
-
# re-samples it and forks the trace into an extra dead-end branch. A generous timeout lets a
|
|
265
|
-
# slow turn finish instead of timing out and re-sending; genuine failures surface as error rows.
|
|
266
|
-
client = AsyncOpenAI(
|
|
267
|
-
base_url=args.base_url, api_key=args.api_key, timeout=1800.0, max_retries=0
|
|
268
|
-
)
|
|
263
|
+
client = AsyncOpenAI(base_url=args.base_url, api_key=args.api_key)
|
|
269
264
|
config = json.loads(args.mcp_config or "{}")
|
|
270
265
|
async with AsyncExitStack() as stack:
|
|
271
266
|
mcp_tools, dispatch = (
|
|
@@ -21,6 +21,7 @@ handled out-of-band (run by the harness).
|
|
|
21
21
|
|
|
22
22
|
import asyncio
|
|
23
23
|
import contextlib
|
|
24
|
+
import hashlib
|
|
24
25
|
import json
|
|
25
26
|
import logging
|
|
26
27
|
import secrets
|
|
@@ -49,7 +50,7 @@ from verifiers.v1.interception.tunnel import (
|
|
|
49
50
|
make_tunnel,
|
|
50
51
|
)
|
|
51
52
|
from verifiers.v1.session import RolloutSession
|
|
52
|
-
from verifiers.v1.types import Messages, Tool
|
|
53
|
+
from verifiers.v1.types import Messages, Response, Tool
|
|
53
54
|
|
|
54
55
|
logger = logging.getLogger(__name__)
|
|
55
56
|
|
|
@@ -61,6 +62,23 @@ logger = logging.getLogger(__name__)
|
|
|
61
62
|
_MAX_REQUEST_BODY = 1024**3 # 1 GiB (aiohttp's default is 1 MiB)
|
|
62
63
|
_KEEPALIVE_INTERVAL_SECONDS = 3
|
|
63
64
|
_STREAM_QUEUE_MAXSIZE = 16
|
|
65
|
+
# blake2b saturates ~1.7 GB/s, so a body up to this size hashes inline in well under a
|
|
66
|
+
# millisecond; a larger one (bodies may reach `_MAX_REQUEST_BODY`) is hashed off the event
|
|
67
|
+
# loop instead — see `_request_digest`.
|
|
68
|
+
_HASH_INLINE_MAX = 1024**2 # 1 MiB
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _body_digest(raw: bytes) -> bytes:
|
|
72
|
+
return hashlib.blake2b(raw, digest_size=16).digest()
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
async def _request_digest(raw: bytes) -> bytes:
|
|
76
|
+
"""Digest a request body for the retry-replay guard. Hash a small body inline; offload a
|
|
77
|
+
large one to a thread so it does not stall every multiplexed rollout on the event loop
|
|
78
|
+
(blake2b releases the GIL, so the thread runs the hash off the loop)."""
|
|
79
|
+
if len(raw) <= _HASH_INLINE_MAX:
|
|
80
|
+
return _body_digest(raw)
|
|
81
|
+
return await asyncio.to_thread(_body_digest, raw)
|
|
64
82
|
|
|
65
83
|
|
|
66
84
|
def _completion_response(completion: dict | None) -> web.Response:
|
|
@@ -223,10 +241,38 @@ class InterceptionServer(Interception):
|
|
|
223
241
|
body = from_json(raw)
|
|
224
242
|
except ValueError:
|
|
225
243
|
body = json.loads(raw)
|
|
244
|
+
req_hash = await _request_digest(raw)
|
|
226
245
|
# Keep `read()` for aiohttp's size guard, then release its cache and our local
|
|
227
246
|
# alias after parsing so the wire body does not survive model inference.
|
|
228
247
|
request._read_bytes = None
|
|
229
248
|
del raw
|
|
249
|
+
# Graph atomicity under retries. The harness SDK retries a transient failure by
|
|
250
|
+
# re-sending the byte-identical request; sampling it again would commit a second turn and
|
|
251
|
+
# fork the graph into a dead-end branch. Two cases, both resolved without re-sampling:
|
|
252
|
+
# 1. the first attempt already finished -> replay the recorded response;
|
|
253
|
+
# 2. the first attempt is still computing (a slow turn) -> await it and return its
|
|
254
|
+
# result, so a slow turn is safe without an inflated client timeout.
|
|
255
|
+
# A growing conversation never repeats a body, so these only ever match a real retry; a
|
|
256
|
+
# failed attempt caches nothing and re-runs normally.
|
|
257
|
+
if session.last_request == req_hash and session.last_response is not None:
|
|
258
|
+
logger.debug("intercept replay: id=%s (retried request)", session.trace.id)
|
|
259
|
+
return _completion_response(session.last_response)
|
|
260
|
+
|
|
261
|
+
async def coalesced(inflight: "asyncio.Future[dict | None]") -> web.Response:
|
|
262
|
+
# Await the first attempt instead of re-sampling. None means it produced no servable
|
|
263
|
+
# response (it errored/refused), so let the SDK retry afresh.
|
|
264
|
+
logger.debug(
|
|
265
|
+
"intercept coalesce: id=%s (retry of in-flight turn)", session.trace.id
|
|
266
|
+
)
|
|
267
|
+
completion = await inflight
|
|
268
|
+
if completion is None:
|
|
269
|
+
return web.json_response(
|
|
270
|
+
dialect.error_body("upstream attempt failed"), status=503
|
|
271
|
+
)
|
|
272
|
+
return _completion_response(completion)
|
|
273
|
+
|
|
274
|
+
if (inflight := session.inflight.get(req_hash)) is not None:
|
|
275
|
+
return await coalesced(inflight)
|
|
230
276
|
logger.debug(
|
|
231
277
|
"intercept %s: id=%s stream=%s",
|
|
232
278
|
request.path,
|
|
@@ -256,112 +302,140 @@ class InterceptionServer(Interception):
|
|
|
256
302
|
if dialect.streaming(body):
|
|
257
303
|
return await self._stream(request, session, dialect, body, prompt, tools)
|
|
258
304
|
headers = request.headers.copy()
|
|
305
|
+
# Claim the in-flight slot so a retry arriving mid-flight coalesces onto it (above) rather
|
|
306
|
+
# than starting a second inference. Re-check first: an identical request may have claimed
|
|
307
|
+
# it while we awaited the simulator opening. The get / create / assign below run with no
|
|
308
|
+
# await between them, so two concurrent identical requests can never both become owner.
|
|
309
|
+
if (inflight := session.inflight.get(req_hash)) is not None:
|
|
310
|
+
return await coalesced(inflight)
|
|
311
|
+
fut: asyncio.Future[dict | None] = asyncio.get_running_loop().create_future()
|
|
312
|
+
session.inflight[req_hash] = fut
|
|
313
|
+
|
|
314
|
+
def serve(response: Response) -> web.Response:
|
|
315
|
+
# Record the served turn and hand it to any coalesced retry, so a retried
|
|
316
|
+
# byte-identical request replays instead of re-sampling and forking the graph.
|
|
317
|
+
# `Response.raw` is the full native provider object (or the renderer's synthesized
|
|
318
|
+
# completion) that the server serializes back to the program.
|
|
319
|
+
session.last_request = req_hash
|
|
320
|
+
session.last_response = response.raw
|
|
321
|
+
if not fut.done():
|
|
322
|
+
fut.set_result(response.raw)
|
|
323
|
+
return _completion_response(response.raw)
|
|
324
|
+
|
|
259
325
|
# A user simulator turns one program request into a multi-turn exchange: after each
|
|
260
326
|
# model turn the simulator's reply is injected as a user turn and the model is
|
|
261
327
|
# re-prompted, so a whole game plays out here and only the final assistant message
|
|
262
328
|
# returns to the (simulator-unaware) program. Without a simulator the loop runs once.
|
|
263
|
-
|
|
264
|
-
None # the latest turn
|
|
329
|
+
response: Response | None = (
|
|
330
|
+
None # the latest committed turn (None until the first)
|
|
265
331
|
)
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
332
|
+
try:
|
|
333
|
+
while True:
|
|
334
|
+
try:
|
|
335
|
+
refused = await session.refused()
|
|
336
|
+
except RolloutError as e:
|
|
337
|
+
return self._fail(session, dialect, e)
|
|
338
|
+
except Exception as e:
|
|
339
|
+
return self._fail(
|
|
340
|
+
session,
|
|
341
|
+
dialect,
|
|
342
|
+
TaskError(f"@stop failed: {type(e).__name__}: {e}"),
|
|
343
|
+
)
|
|
344
|
+
if refused is not None:
|
|
345
|
+
# Refuse the first model call to halt the harness; once a simulated
|
|
346
|
+
# conversation is under way, just end it and return the last turn cleanly.
|
|
347
|
+
if response is None:
|
|
348
|
+
return web.json_response(
|
|
349
|
+
dialect.error_body(f"rollout stopped: {refused}"),
|
|
350
|
+
status=400,
|
|
351
|
+
)
|
|
352
|
+
return serve(response)
|
|
353
|
+
turn = graph.prepare_turn(session.trace, prompt)
|
|
354
|
+
session.error = None
|
|
355
|
+
try:
|
|
356
|
+
response = await session.ctx.client.get_response(
|
|
357
|
+
dialect,
|
|
358
|
+
body,
|
|
359
|
+
session.ctx.model,
|
|
360
|
+
session.ctx.sampling,
|
|
361
|
+
headers=headers,
|
|
362
|
+
session_id=session.trace.id,
|
|
363
|
+
turn=turn,
|
|
364
|
+
)
|
|
365
|
+
except OverlongPromptError:
|
|
366
|
+
# An overlong prompt is a budget limit, not a crash: end the rollout cleanly
|
|
367
|
+
# as a truncation — return the last turn if there is one, else refuse to halt
|
|
368
|
+
# the harness (same shape as `refused` above).
|
|
369
|
+
session.trace.stop("context_length")
|
|
370
|
+
logger.debug("prompt too long: id=%s", session.trace.id)
|
|
371
|
+
if response is None:
|
|
372
|
+
return web.json_response(
|
|
373
|
+
dialect.error_body("rollout stopped: context_length"),
|
|
374
|
+
status=400,
|
|
375
|
+
)
|
|
376
|
+
return serve(response)
|
|
377
|
+
except RolloutError as e:
|
|
378
|
+
# Stash the real cause; the rollout re-raises it after the harness returns.
|
|
379
|
+
# Relay the provider's status so the harness SDK retries 5xx/429 and not 4xx.
|
|
380
|
+
session.error = e
|
|
381
|
+
logger.warning(
|
|
382
|
+
"model call failed: id=%s %s: %s",
|
|
383
|
+
session.trace.id,
|
|
384
|
+
type(e).__name__,
|
|
385
|
+
e,
|
|
283
386
|
)
|
|
284
|
-
return _completion_response(completion)
|
|
285
|
-
turn = graph.prepare_turn(session.trace, prompt)
|
|
286
|
-
session.error = None
|
|
287
|
-
try:
|
|
288
|
-
response = await session.ctx.client.get_response(
|
|
289
|
-
dialect,
|
|
290
|
-
body,
|
|
291
|
-
session.ctx.model,
|
|
292
|
-
session.ctx.sampling,
|
|
293
|
-
headers=headers,
|
|
294
|
-
session_id=session.trace.id,
|
|
295
|
-
turn=turn,
|
|
296
|
-
)
|
|
297
|
-
except OverlongPromptError:
|
|
298
|
-
# An overlong prompt is a budget limit, not a crash: end the rollout cleanly
|
|
299
|
-
# as a truncation — return the last turn if there is one, else refuse to halt
|
|
300
|
-
# the harness (same shape as `refused` above).
|
|
301
|
-
session.trace.stop("context_length")
|
|
302
|
-
logger.debug("prompt too long: id=%s", session.trace.id)
|
|
303
|
-
if completion is None:
|
|
304
387
|
return web.json_response(
|
|
305
|
-
dialect.error_body(
|
|
306
|
-
status=
|
|
388
|
+
dialect.error_body(str(e)),
|
|
389
|
+
status=getattr(e, "status_code", 502),
|
|
307
390
|
)
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
)
|
|
319
|
-
return web.json_response(
|
|
320
|
-
dialect.error_body(str(e)), status=getattr(e, "status_code", 502)
|
|
321
|
-
)
|
|
322
|
-
except Exception as e: # surface to the program as an API error
|
|
323
|
-
logger.warning(
|
|
324
|
-
"model call failed: id=%s %s: %s",
|
|
391
|
+
except Exception as e: # surface to the program as an API error
|
|
392
|
+
logger.warning(
|
|
393
|
+
"model call failed: id=%s %s: %s",
|
|
394
|
+
session.trace.id,
|
|
395
|
+
type(e).__name__,
|
|
396
|
+
e,
|
|
397
|
+
)
|
|
398
|
+
return web.json_response(dialect.error_body(str(e)), status=502)
|
|
399
|
+
logger.debug(
|
|
400
|
+
"intercept turn: id=%s tools=%d",
|
|
325
401
|
session.trace.id,
|
|
326
|
-
|
|
327
|
-
e,
|
|
328
|
-
)
|
|
329
|
-
return web.json_response(dialect.error_body(str(e)), status=502)
|
|
330
|
-
# `Response.raw` is the full native provider object, or the renderer's synthesized
|
|
331
|
-
# completion object, that the server serializes for the program.
|
|
332
|
-
completion = response.raw
|
|
333
|
-
logger.debug(
|
|
334
|
-
"intercept turn: id=%s tools=%d",
|
|
335
|
-
session.trace.id,
|
|
336
|
-
len(response.message.tool_calls or []),
|
|
337
|
-
)
|
|
338
|
-
turn.commit(response, tools) # one node per new message;
|
|
339
|
-
# branches fall out of walking the graph (see Trace.branches / verifiers.v1.graph)
|
|
340
|
-
# Hand back to the program when the model wants a tool (the program runs it) or
|
|
341
|
-
# when there's no user simulator to keep the conversation going.
|
|
342
|
-
if response.message.tool_calls or session.user is None:
|
|
343
|
-
return _completion_response(completion)
|
|
344
|
-
try:
|
|
345
|
-
user_messages = await session.user(response.message.content or "")
|
|
346
|
-
except RolloutError as e:
|
|
347
|
-
return self._fail(session, dialect, e)
|
|
348
|
-
except Exception as e:
|
|
349
|
-
return self._fail(
|
|
350
|
-
session,
|
|
351
|
-
dialect,
|
|
352
|
-
UserError(f"user simulator failed: {type(e).__name__}: {e}"),
|
|
402
|
+
len(response.message.tool_calls or []),
|
|
353
403
|
)
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
404
|
+
turn.commit(response, tools) # one node per new message;
|
|
405
|
+
# branches fall out of walking the graph (see Trace.branches / verifiers.v1.graph)
|
|
406
|
+
# Hand back to the program when the model wants a tool (the program runs it) or
|
|
407
|
+
# when there's no user simulator to keep the conversation going.
|
|
408
|
+
if response.message.tool_calls or session.user is None:
|
|
409
|
+
return serve(response)
|
|
410
|
+
try:
|
|
411
|
+
user_messages = await session.user(response.message.content or "")
|
|
412
|
+
except RolloutError as e:
|
|
413
|
+
return self._fail(session, dialect, e)
|
|
414
|
+
except Exception as e:
|
|
415
|
+
return self._fail(
|
|
416
|
+
session,
|
|
417
|
+
dialect,
|
|
418
|
+
UserError(f"user simulator failed: {type(e).__name__}: {e}"),
|
|
419
|
+
)
|
|
420
|
+
# Inject the model turn + the simulator's user turn(s): into the wire request for
|
|
421
|
+
# the next model call (`dialect.extend`, which keeps the model turn verbatim so
|
|
422
|
+
# reasoning survives) and into the typed prompt for the trace. The simulator ends
|
|
423
|
+
# the trajectory through its task's `@stop` (e.g. a `user_finished` flag it set on
|
|
424
|
+
# `self.state`), caught by `refused()` at the top of the next iteration — the
|
|
425
|
+
# interception server holds no opinion about the state's contents.
|
|
426
|
+
body = dialect.extend(body, response.raw, user_messages)
|
|
427
|
+
prompt = [*prompt, response.message, *user_messages]
|
|
428
|
+
# The simulator changed the payload, so this is a new operation not a retry.
|
|
429
|
+
headers.popall("idempotency-key", None)
|
|
430
|
+
headers.popall("x-idempotency-key", None)
|
|
431
|
+
finally:
|
|
432
|
+
# Free the in-flight slot and unblock any coalesced retry; None signals "no servable
|
|
433
|
+
# response" (an error/refuse return above), so the waiter surfaces a retryable error.
|
|
434
|
+
# Only clear our own entry — never one a later owner may have installed.
|
|
435
|
+
if session.inflight.get(req_hash) is fut:
|
|
436
|
+
session.inflight.pop(req_hash, None)
|
|
437
|
+
if not fut.done():
|
|
438
|
+
fut.set_result(None)
|
|
365
439
|
|
|
366
440
|
async def _stream(
|
|
367
441
|
self,
|
|
@@ -8,6 +8,7 @@ injects the user simulator's replies, and stashes the real failure on `error`.
|
|
|
8
8
|
turns.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
+
import asyncio
|
|
11
12
|
import logging
|
|
12
13
|
from collections.abc import Awaitable, Callable
|
|
13
14
|
from dataclasses import dataclass, field
|
|
@@ -81,6 +82,23 @@ class RolloutSession:
|
|
|
81
82
|
(and may swallow it, or exit non-zero), so the rollout re-raises this original error once the
|
|
82
83
|
harness returns — recording the real `ProviderError` instead of a secondary `HarnessError`.
|
|
83
84
|
Reset before each model turn, so a successful retry clears it."""
|
|
85
|
+
last_request: bytes | None = None
|
|
86
|
+
"""Digest of the most recently served request body; with `last_response`, the replay cache
|
|
87
|
+
that keeps the message graph atomic under harness-SDK retries. A retry re-sends the
|
|
88
|
+
byte-identical request; when it matches, the interception server replays the recorded
|
|
89
|
+
response instead of re-sampling and committing a second turn — which would fork the graph
|
|
90
|
+
into a dead-end branch. Only a fully served request is cached, so a genuinely failed attempt
|
|
91
|
+
still re-runs. Turns are issued sequentially (one outstanding request at a time), so a retry
|
|
92
|
+
is always of the most recent request — keeping only the last one is sufficient and bounded."""
|
|
93
|
+
last_response: dict | None = None
|
|
94
|
+
"""The response returned for `last_request`, replayed verbatim on a retry."""
|
|
95
|
+
inflight: dict[bytes, "asyncio.Future[dict | None]"] = field(default_factory=dict)
|
|
96
|
+
"""Body digest -> the future of the attempt currently computing it. A retry that arrives
|
|
97
|
+
while the first attempt is still in flight (a slow turn) awaits this future instead of
|
|
98
|
+
starting a second inference — the other half of retry atomicity (with `last_response`, which
|
|
99
|
+
covers a retry after the attempt finished). Because a slow turn is coalesced rather than
|
|
100
|
+
re-sampled, retries stay safe without an inflated client timeout. The future resolves to the
|
|
101
|
+
served response, or to None if the attempt produced no servable response (error/refuse)."""
|
|
84
102
|
|
|
85
103
|
async def refused(self) -> str | None:
|
|
86
104
|
"""The framework's limits (turns / token budget) and `@stop` checks, run before each
|
|
@@ -167,36 +167,37 @@ class Branch(StrictBaseModel):
|
|
|
167
167
|
)
|
|
168
168
|
return KeptTokens(ids=ids, counts=np.concatenate(counts_parts))
|
|
169
169
|
|
|
170
|
-
@property
|
|
171
|
-
def num_total_tokens(self) -> int:
|
|
172
|
-
return sum(len(n.token_ids) for n in self.nodes)
|
|
173
|
-
|
|
174
170
|
@property
|
|
175
171
|
def usage(self) -> Usage | None:
|
|
176
172
|
return Usage.aggregate(n.usage for n in self.nodes if n.usage is not None)
|
|
177
173
|
|
|
178
174
|
@property
|
|
179
|
-
def
|
|
180
|
-
"""
|
|
181
|
-
|
|
182
|
-
(sum(n.mask) for n in reversed(self.nodes) if any(n.mask)), 0
|
|
183
|
-
)
|
|
184
|
-
token_len = self.num_total_tokens - last_completion
|
|
185
|
-
if token_len:
|
|
186
|
-
return token_len
|
|
187
|
-
last = next(
|
|
175
|
+
def last_usage(self) -> Usage | None:
|
|
176
|
+
"""Provider usage from the final model call on this branch — the full context it saw."""
|
|
177
|
+
return next(
|
|
188
178
|
(n.usage for n in reversed(self.nodes) if n.usage is not None), None
|
|
189
179
|
)
|
|
190
|
-
|
|
180
|
+
|
|
181
|
+
@property
|
|
182
|
+
def num_total_tokens(self) -> int:
|
|
183
|
+
"""Final sequence length: the last call's prompt + completion. Earlier turns' context
|
|
184
|
+
is already contained in that prompt, so re-sent tokens are counted once rather than
|
|
185
|
+
summed per turn."""
|
|
186
|
+
last = self.last_usage
|
|
187
|
+
return last.total_tokens if last is not None else 0
|
|
191
188
|
|
|
192
189
|
@property
|
|
193
190
|
def num_output_tokens(self) -> int:
|
|
194
|
-
"""
|
|
195
|
-
token_len = sum(sum(n.mask) for n in self.nodes)
|
|
196
|
-
if token_len:
|
|
197
|
-
return token_len
|
|
191
|
+
"""Every model-generated token across all turns (completions, reasoning included)."""
|
|
198
192
|
usage = self.usage
|
|
199
|
-
return usage.completion_tokens if usage else 0
|
|
193
|
+
return usage.completion_tokens if usage is not None else 0
|
|
194
|
+
|
|
195
|
+
@property
|
|
196
|
+
def num_input_tokens(self) -> int:
|
|
197
|
+
"""Tokens fed to the model, counted once: the final sequence minus everything the model
|
|
198
|
+
generated (i.e. system + user + tool inputs). Not the last prompt — re-sent context is
|
|
199
|
+
not double-counted."""
|
|
200
|
+
return self.num_total_tokens - self.num_output_tokens
|
|
200
201
|
|
|
201
202
|
|
|
202
203
|
_NODE_DUMP_EXCLUDE: dict = {
|
|
@@ -282,17 +283,17 @@ class Trace(StrictBaseModel, Generic[DataT, StateT]):
|
|
|
282
283
|
|
|
283
284
|
@property
|
|
284
285
|
def num_input_tokens(self) -> int:
|
|
285
|
-
"""
|
|
286
|
+
"""Fed-in tokens (system + user + tool), counted once, summed across branches."""
|
|
286
287
|
return sum(branch.num_input_tokens for branch in self.branches)
|
|
287
288
|
|
|
288
289
|
@property
|
|
289
290
|
def num_output_tokens(self) -> int:
|
|
290
|
-
"""Model-
|
|
291
|
+
"""Model-generated tokens across all turns, summed across branches."""
|
|
291
292
|
return sum(branch.num_output_tokens for branch in self.branches)
|
|
292
293
|
|
|
293
294
|
@property
|
|
294
295
|
def num_total_tokens(self) -> int:
|
|
295
|
-
"""
|
|
296
|
+
"""Final sequence lengths (last prompt + completion) summed across branches."""
|
|
296
297
|
return sum(branch.num_total_tokens for branch in self.branches)
|
|
297
298
|
|
|
298
299
|
@property
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.2.1.dev42 → verifiers-0.2.1.dev44}/tests/test_openai_chat_completions_token_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|