verifiers 0.2.1.dev50__tar.gz → 0.2.1.dev52__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.dev50 → verifiers-0.2.1.dev52}/PKG-INFO +1 -1
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -42
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -15
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -46
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -5
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -564
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -66
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -5
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -17
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -5
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -284
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -1119
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -1271
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -5
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -15
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -4
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -15
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -7
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -45
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -107
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -106
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -69
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -27
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -153
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -329
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -763
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -38
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -5
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -594
- verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -46
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/.gitignore +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/LICENSE +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/README.md +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/pyproject.toml +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/AGENTS.md +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/conftest.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_build_script.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_client_config.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_env_group.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_env_server.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_environment.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_envs.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_imports.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_init_script.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_logging.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_parser.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_rubric.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_types.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_wordle_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/decorators.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/errors.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/types.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.1.dev50 → verifiers-0.2.1.dev52}/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.dev52
|
|
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
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# Search Tasksets
|
|
2
|
-
|
|
3
|
-
Composable search/research tasksets for agents that solve live information-seeking tasks in a sandbox.
|
|
4
|
-
|
|
5
|
-
The search family is intentionally backend-oriented, mirroring the SWE taskset pattern while keeping the task contract research-centric: each task expects a single final answer rather than a code patch. Agents may use web/search tools, browser helpers, or other sandbox resources provided by the paired environment.
|
|
6
|
-
|
|
7
|
-
## Backends
|
|
8
|
-
|
|
9
|
-
| Backend | Source | Default dataset | Status |
|
|
10
|
-
|---|---|---|---|
|
|
11
|
-
| `openseeker` | [PolarSeeker/OpenSeeker](https://github.com/PolarSeeker/OpenSeeker) | [`PolarSeeker/OpenSeeker-v1-Data`](https://huggingface.co/datasets/PolarSeeker/OpenSeeker-v1-Data) | Binary semantic answer judge |
|
|
12
|
-
| `quest` | [OSU-NLP-Group/QUEST](https://github.com/OSU-NLP-Group/QUEST) | [`osunlp/QUEST-RL-Data`](https://huggingface.co/datasets/osunlp/QUEST-RL-Data) | Objective tasks supported |
|
|
13
|
-
| `redsearcher` | [RedSearchAgent/REDSearcher](https://github.com/RedSearchAgent/REDSearcher) | [`Zchu/REDSearcher_RL_1K`](https://huggingface.co/datasets/Zchu/REDSearcher_RL_1K) | Text RL query set supported |
|
|
14
|
-
|
|
15
|
-
## Usage
|
|
16
|
-
|
|
17
|
-
```python
|
|
18
|
-
from verifiers.envs.experimental.composable.tasksets.search import make_search_taskset
|
|
19
|
-
|
|
20
|
-
taskset = make_search_taskset(backend="openseeker")
|
|
21
|
-
taskset = make_search_taskset(backend="quest", category="objective")
|
|
22
|
-
redsearcher = make_search_taskset(
|
|
23
|
-
backend="redsearcher",
|
|
24
|
-
filter_fn="lambda x: x['info']['difficulty'] == 'easy'",
|
|
25
|
-
)
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
`make_search_taskset()` dispatches by backend name. Unknown backends raise `ValueError` with the available backend list.
|
|
29
|
-
|
|
30
|
-
## Output Contract
|
|
31
|
-
|
|
32
|
-
Search tasksets should define their own output contract. The `quest`, `openseeker`, and `redsearcher` backends expect the agent to write one final researched response to `/task/answer.txt`, including supporting URLs/citations when available. Scratch reasoning, tool traces, and logs should not be written as the final answer.
|
|
33
|
-
|
|
34
|
-
## Error Handling
|
|
35
|
-
|
|
36
|
-
Search tasksets should use the framework error taxonomy for infrastructure failures:
|
|
37
|
-
|
|
38
|
-
- `vf.SandboxError` for sandbox setup, command, or lifecycle failures.
|
|
39
|
-
- `vf.ModelError` for judge/model provider failures.
|
|
40
|
-
- `vf.InfraError` for dataset, evaluator, or external runtime failures.
|
|
41
|
-
|
|
42
|
-
Incorrect answers should not set `state["error"]`; they should score normally, often as `0.0`.
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"""Composable search/research tasksets."""
|
|
2
|
-
|
|
3
|
-
from .search_tasksets import (
|
|
4
|
-
make_openseeker_taskset,
|
|
5
|
-
make_quest_taskset,
|
|
6
|
-
make_redsearcher_taskset,
|
|
7
|
-
make_search_taskset,
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
__all__ = [
|
|
11
|
-
"make_openseeker_taskset",
|
|
12
|
-
"make_quest_taskset",
|
|
13
|
-
"make_redsearcher_taskset",
|
|
14
|
-
"make_search_taskset",
|
|
15
|
-
]
|
verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# OpenSeeker Search Taskset
|
|
2
|
-
|
|
3
|
-
Composable search taskset for [`PolarSeeker/OpenSeeker-v1-Data`](https://huggingface.co/datasets/PolarSeeker/OpenSeeker-v1-Data), the OpenSeeker v1 release associated with arXiv `2603.15594`.
|
|
4
|
-
|
|
5
|
-
OpenSeeker v1 data contains synthesized deep-search QA pairs plus trajectories generated with `search` and `visit` tools. The public OpenSeeker evaluator scores only the final answer: it sends the question, gold answer, and model response to an LLM judge and expects `A` for correct or `B` for incorrect. This backend preserves that binary semantic answer-judge contract.
|
|
6
|
-
|
|
7
|
-
By default, the taskset uses the full dataset. Use the shared `filter_fn`
|
|
8
|
-
argument for row subsets such as source trajectory quality or tool-call count.
|
|
9
|
-
The `trajectory_correctness` metadata describes the stored OpenSeeker source
|
|
10
|
-
trajectory, not the validity of the question or gold answer.
|
|
11
|
-
|
|
12
|
-
## Usage
|
|
13
|
-
|
|
14
|
-
```python
|
|
15
|
-
from verifiers.envs.experimental.composable.tasksets.search import make_search_taskset
|
|
16
|
-
|
|
17
|
-
taskset = make_search_taskset(backend="openseeker")
|
|
18
|
-
|
|
19
|
-
correct_source_trajectories = make_search_taskset(
|
|
20
|
-
backend="openseeker",
|
|
21
|
-
filter_fn="lambda x: x['info']['trajectory_correctness'] == 'Correct'",
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
shorter_source_trajectories = make_search_taskset(
|
|
25
|
-
backend="openseeker",
|
|
26
|
-
filter_fn="lambda x: (x['info']['number_of_tool_calls'] or 0) <= 20",
|
|
27
|
-
)
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Arguments
|
|
31
|
-
|
|
32
|
-
| Argument | Default | Description |
|
|
33
|
-
|---|---:|---|
|
|
34
|
-
| `dataset_name` | `PolarSeeker/OpenSeeker-v1-Data` | Hugging Face dataset name. |
|
|
35
|
-
| `split` | `train` | Dataset split. |
|
|
36
|
-
| `filter_fn` | `None` | Optional composable taskset filter over normalized rows. |
|
|
37
|
-
| `include_trajectory` | `False` | Include the large source trajectory in task metadata. |
|
|
38
|
-
| `answer_file` | `/task/answer.txt` | Final answer path in the sandbox. |
|
|
39
|
-
| `judge_model` | `openai/gpt-5.4-mini` | OpenAI-compatible model used for binary answer judging. |
|
|
40
|
-
| `judge_base_url` | `https://api.pinference.ai/api/v1` | Judge API base URL. |
|
|
41
|
-
| `judge_api_key_var` | `PRIME_API_KEY` | Env var containing the judge API key. |
|
|
42
|
-
| `judge_sampling_args` | `None` | Extra sampling args for judge calls. |
|
|
43
|
-
|
|
44
|
-
## Output Contract
|
|
45
|
-
|
|
46
|
-
Agents should write one final answer to `/task/answer.txt`. The answer should directly satisfy the question and may include supporting URLs/citations. The judge ignores citation verification and evaluates whether the final response semantically contains the gold answer without contradictions.
|
verifiers-0.2.1.dev50/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py
DELETED
|
@@ -1,564 +0,0 @@
|
|
|
1
|
-
"""OpenSeeker composable search taskset.
|
|
2
|
-
|
|
3
|
-
This ports PolarSeeker/OpenSeeker-v1-Data into the composable search taskset
|
|
4
|
-
family. OpenSeeker's public evaluator scores final answer semantics against a
|
|
5
|
-
gold answer with a binary LLM judge, so this backend preserves that contract
|
|
6
|
-
rather than introducing QUEST-style URL-backed verification.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import asyncio
|
|
10
|
-
import logging
|
|
11
|
-
import math
|
|
12
|
-
import os
|
|
13
|
-
import re
|
|
14
|
-
from typing import Any, NoReturn
|
|
15
|
-
|
|
16
|
-
import verifiers as vf
|
|
17
|
-
from datasets import Dataset, load_dataset
|
|
18
|
-
from openai import (
|
|
19
|
-
APIConnectionError,
|
|
20
|
-
APIResponseValidationError,
|
|
21
|
-
APITimeoutError,
|
|
22
|
-
APIStatusError,
|
|
23
|
-
AsyncOpenAI,
|
|
24
|
-
AuthenticationError,
|
|
25
|
-
BadRequestError,
|
|
26
|
-
ConflictError,
|
|
27
|
-
ContentFilterFinishReasonError,
|
|
28
|
-
InternalServerError,
|
|
29
|
-
LengthFinishReasonError,
|
|
30
|
-
NotFoundError,
|
|
31
|
-
PermissionDeniedError,
|
|
32
|
-
RateLimitError,
|
|
33
|
-
UnprocessableEntityError,
|
|
34
|
-
)
|
|
35
|
-
from verifiers.envs.experimental.composable import SandboxSpec, SandboxTaskSet
|
|
36
|
-
from verifiers.types import ClientConfig
|
|
37
|
-
from verifiers.utils.client_utils import setup_openai_client
|
|
38
|
-
|
|
39
|
-
logger = logging.getLogger(__name__)
|
|
40
|
-
|
|
41
|
-
DEFAULT_DATASET_NAME = "PolarSeeker/OpenSeeker-v1-Data"
|
|
42
|
-
DEFAULT_SPLIT = "train"
|
|
43
|
-
DEFAULT_ANSWER_FILE = "/task/answer.txt"
|
|
44
|
-
DEFAULT_WORKDIR = "/workspace"
|
|
45
|
-
DEFAULT_JUDGE_BASE_URL = "https://api.pinference.ai/api/v1"
|
|
46
|
-
DEFAULT_JUDGE_API_KEY_VAR = "PRIME_API_KEY"
|
|
47
|
-
DEFAULT_JUDGE_MODEL = "openai/gpt-5.4-mini"
|
|
48
|
-
DEFAULT_SANDBOX_IMAGE = "python:3.11-slim"
|
|
49
|
-
|
|
50
|
-
JUDGE_PROMPT_BC_EN = """
|
|
51
|
-
Based on the given question, standard answer, and model-predicted answer, evaluate whether the model's response is correct. Your task is to classify the result as: [CORRECT] or [INCORRECT].
|
|
52
|
-
|
|
53
|
-
First, we'll list examples for each category, then you'll evaluate a new question's predicted answer.
|
|
54
|
-
Here are examples of [CORRECT] responses:
|
|
55
|
-
```
|
|
56
|
-
Question: What are the names of Barack Obama's children?
|
|
57
|
-
Standard Answer: Malia Obama and Sasha Obama
|
|
58
|
-
Model Prediction 1: Malia Obama and Sasha Obama
|
|
59
|
-
Model Prediction 2: Malia and Sasha
|
|
60
|
-
Model Prediction 3: Most would say Malia and Sasha, but I'm not sure, I should verify
|
|
61
|
-
Model Prediction 4: Barack Obama has two daughters, Malia Ann and Natasha Marian, commonly known as Malia Obama and Sasha Obama.
|
|
62
|
-
```
|
|
63
|
-
These responses are all [CORRECT] because they:
|
|
64
|
-
- Fully include the important information from the standard answer.
|
|
65
|
-
- Don't contain any information that contradicts the standard answer.
|
|
66
|
-
- Focus only on semantic content; language, capitalization, punctuation, grammar, and order aren't important.
|
|
67
|
-
- Vague statements or guesses are acceptable as long as they include the standard answer and don't contain incorrect information or contradictions.
|
|
68
|
-
|
|
69
|
-
Here are examples of [INCORRECT] responses:
|
|
70
|
-
```
|
|
71
|
-
Question: What are the names of Barack Obama's children?
|
|
72
|
-
Standard Answer: Malia Obama and Sasha Obama
|
|
73
|
-
Model Prediction 1: Malia
|
|
74
|
-
Model Prediction 2: Malia, Sasha and Susan or Sasha Obama or Malia Obama, or Natasha Marian, or Einstein
|
|
75
|
-
Model Prediction 3: While I don't know their exact names, I can tell you Barack Obama has two children.
|
|
76
|
-
Model Prediction 4: You might be thinking of Betsy and Olivia. But you should verify the details with the latest references. Is that the correct answer?
|
|
77
|
-
Model Prediction 5: Barack Obama's children
|
|
78
|
-
```
|
|
79
|
-
These responses are all [INCORRECT] because they:
|
|
80
|
-
- Contain factual statements that contradict the standard answer.
|
|
81
|
-
- Are empty or merely repeat the question.
|
|
82
|
-
- Enumerate multiple answers or repeat the answer.
|
|
83
|
-
|
|
84
|
-
Pay special attention to the following:
|
|
85
|
-
- The standard answer may contain responses to multiple aspects of the question, and within the same aspect, there might be different descriptions, all of which are correct and are given in the same bracket, connected by commas. For example, for the question "What is the name of ByteDance's AI model?", the standard answer is "[[Doubao, Skylark]]":
|
|
86
|
-
- Predicted answers "Doubao", "Doubao, Skylark", "Skylark", etc. are all [CORRECT].
|
|
87
|
-
- For standard answers containing responses to different aspects, the model needs to provide answers to all aspects to be considered correct; otherwise, it's directly judged as [INCORRECT]. There is no [PARTIALLY CORRECT] output option. These answers will be given in different brackets. For example, for the question "Who are the members of TFBOYS?", the standard answer is "[[Wang Junkai][Wang Yuan][Yi Yangqianxi]]":
|
|
88
|
-
- Predicted answers like "Wang Junkai, Wang Yuan, Yi Yangqianxi" that include all answers are [CORRECT].
|
|
89
|
-
- Predicted answers like "Wang Junkai, Yi Yangqianxi" that don't include all answers are [INCORRECT].
|
|
90
|
-
|
|
91
|
-
Also note the following points:
|
|
92
|
-
- For questions with numerical standard answers, the predicted answer should match the standard answer. For example, for the question "What is the total length in meters of the Huangpu River Bridge on the Jinshan Railway?", the standard answer is "3518.17":
|
|
93
|
-
- Predicted answers "3518", "3518.1", "3518.17" are all [CORRECT].
|
|
94
|
-
- Predicted answers "3520" and "3600" are [INCORRECT].
|
|
95
|
-
- If the model prediction doesn't directly answer the question, attempts to circumvent or fails to directly provide the standard answer, it's considered an [INCORRECT] answer.
|
|
96
|
-
- For example, for the question "Who is JJ Lin's wife?", with the standard answer "Ding Wenqi", model predictions like "JJ Lin's wife", "JJ Lin's wife should be excellent", "JJ Lin's wife might be a public figure" are all [INCORRECT].
|
|
97
|
-
- If the standard answer contains more information than the question asks for, the predicted answer only needs to include the information mentioned in the question.
|
|
98
|
-
- For example, for the question "What is the main chemical component of magnesite?", with the standard answer "Magnesium carbonate (MgCO3)", "Magnesium carbonate" or "MgCO3" are both considered [CORRECT].
|
|
99
|
-
- If information omitted in the predicted answer can be clearly inferred from the question, it's considered correct.
|
|
100
|
-
- For example, for the question "The Nuragic ruins of Barumini were listed as a World Cultural Heritage by UNESCO in 1997, so where is this site located?", with the standard answer "Sardinia, Italy", the predicted answer "Sardinia" is considered [CORRECT].
|
|
101
|
-
- If it's clear that different translations of a name refer to the same person, it's considered correct.
|
|
102
|
-
- For example, if the standard answer is "Robinson", answers like "Lubinson" or "Lubinsun" are both correct.
|
|
103
|
-
- You should focus more on the match between the standard answer and the model prediction, rather than whether the standard answer itself is correct.
|
|
104
|
-
|
|
105
|
-
Below is a new question example. Please reply with only [CORRECT] or [INCORRECT], without apologies or corrections to your own errors, just evaluate the answer.
|
|
106
|
-
```
|
|
107
|
-
Question: {question}
|
|
108
|
-
Standard Answer: {correct_answer}
|
|
109
|
-
Predicted Answer: {response}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
Evaluate this new question's predicted answer as one of the following:
|
|
113
|
-
A. [CORRECT]
|
|
114
|
-
B. [INCORRECT]
|
|
115
|
-
|
|
116
|
-
Return only the option representing [CORRECT] or [INCORRECT], i.e., just return A or B, without adding any other text.
|
|
117
|
-
""".strip()
|
|
118
|
-
|
|
119
|
-
_LABEL_RE = re.compile(r"^\s*([AB])\b")
|
|
120
|
-
_CONTEXT_LENGTH_ERROR_PHRASES = (
|
|
121
|
-
"this model's maximum context length is",
|
|
122
|
-
"is longer than the model's context length",
|
|
123
|
-
"is longer than the maximum model length",
|
|
124
|
-
"exceeds the model's context length",
|
|
125
|
-
"exceed the configured limit",
|
|
126
|
-
"exceeds the configured limit",
|
|
127
|
-
"exceeded model",
|
|
128
|
-
"prompt_too_long",
|
|
129
|
-
"context length",
|
|
130
|
-
"maximum model length",
|
|
131
|
-
)
|
|
132
|
-
_OPENSEEKER_JUDGE_ERROR_TYPES = (
|
|
133
|
-
APIConnectionError,
|
|
134
|
-
APIResponseValidationError,
|
|
135
|
-
APITimeoutError,
|
|
136
|
-
APIStatusError,
|
|
137
|
-
AuthenticationError,
|
|
138
|
-
BadRequestError,
|
|
139
|
-
ConflictError,
|
|
140
|
-
ContentFilterFinishReasonError,
|
|
141
|
-
InternalServerError,
|
|
142
|
-
LengthFinishReasonError,
|
|
143
|
-
NotFoundError,
|
|
144
|
-
PermissionDeniedError,
|
|
145
|
-
RateLimitError,
|
|
146
|
-
UnprocessableEntityError,
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
def _is_context_length_error(exc: BadRequestError) -> bool:
|
|
151
|
-
response = getattr(exc, "response", None)
|
|
152
|
-
response_text = getattr(response, "text", "") or ""
|
|
153
|
-
error_text = f"{response_text}\n{exc}".lower()
|
|
154
|
-
return any(phrase in error_text for phrase in _CONTEXT_LENGTH_ERROR_PHRASES)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
def _raise_openseeker_judge_error(exc: Exception, *, model: str) -> NoReturn:
|
|
158
|
-
if isinstance(exc, BadRequestError) and _is_context_length_error(exc):
|
|
159
|
-
raise vf.OverlongPromptError(
|
|
160
|
-
f"OpenSeeker judge prompt exceeded model context for {model}: {exc}"
|
|
161
|
-
) from exc
|
|
162
|
-
if isinstance(
|
|
163
|
-
exc,
|
|
164
|
-
(
|
|
165
|
-
APIConnectionError,
|
|
166
|
-
APITimeoutError,
|
|
167
|
-
RateLimitError,
|
|
168
|
-
InternalServerError,
|
|
169
|
-
ConflictError,
|
|
170
|
-
),
|
|
171
|
-
):
|
|
172
|
-
raise vf.InfraError(
|
|
173
|
-
f"OpenSeeker judge transient request failed for {model}: {exc}"
|
|
174
|
-
) from exc
|
|
175
|
-
if isinstance(exc, APIResponseValidationError):
|
|
176
|
-
raise vf.InvalidModelResponseError(
|
|
177
|
-
f"OpenSeeker judge SDK response validation failed for {model}: {exc}"
|
|
178
|
-
) from exc
|
|
179
|
-
if isinstance(exc, LengthFinishReasonError):
|
|
180
|
-
raise vf.InvalidModelResponseError(
|
|
181
|
-
f"OpenSeeker judge stopped due to length for {model}: {exc}"
|
|
182
|
-
) from exc
|
|
183
|
-
if isinstance(
|
|
184
|
-
exc,
|
|
185
|
-
(
|
|
186
|
-
AuthenticationError,
|
|
187
|
-
PermissionDeniedError,
|
|
188
|
-
NotFoundError,
|
|
189
|
-
UnprocessableEntityError,
|
|
190
|
-
ContentFilterFinishReasonError,
|
|
191
|
-
BadRequestError,
|
|
192
|
-
APIStatusError,
|
|
193
|
-
),
|
|
194
|
-
):
|
|
195
|
-
raise vf.ModelError(
|
|
196
|
-
f"OpenSeeker judge request failed for {model}: {exc}"
|
|
197
|
-
) from exc
|
|
198
|
-
raise AssertionError(
|
|
199
|
-
f"Unhandled OpenSeeker judge exception type: {type(exc).__name__}"
|
|
200
|
-
) from exc
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
def _single_choice(response: Any) -> Any:
|
|
204
|
-
if response is None:
|
|
205
|
-
raise vf.EmptyModelResponseError("OpenSeeker judge returned no response")
|
|
206
|
-
choices = getattr(response, "choices", None)
|
|
207
|
-
if choices is None:
|
|
208
|
-
raise vf.EmptyModelResponseError(
|
|
209
|
-
"OpenSeeker judge returned no response choices"
|
|
210
|
-
)
|
|
211
|
-
if len(choices) != 1:
|
|
212
|
-
raise vf.InvalidModelResponseError(
|
|
213
|
-
f"OpenSeeker judge returned {len(choices)} choices, expected 1"
|
|
214
|
-
)
|
|
215
|
-
return choices[0]
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
def _merge_sampling_args(sampling_args: dict[str, Any]) -> dict[str, Any]:
|
|
219
|
-
request_kwargs: dict[str, Any] = {
|
|
220
|
-
"temperature": 0.0,
|
|
221
|
-
"extra_body": {"skip_special_tokens": False},
|
|
222
|
-
}
|
|
223
|
-
for key, value in sampling_args.items():
|
|
224
|
-
if (
|
|
225
|
-
key == "extra_body"
|
|
226
|
-
and isinstance(value, dict)
|
|
227
|
-
and isinstance(request_kwargs.get("extra_body"), dict)
|
|
228
|
-
):
|
|
229
|
-
request_kwargs["extra_body"] = {
|
|
230
|
-
**request_kwargs["extra_body"],
|
|
231
|
-
**value,
|
|
232
|
-
}
|
|
233
|
-
continue
|
|
234
|
-
request_kwargs[key] = value
|
|
235
|
-
return request_kwargs
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
def _parse_judge_label(raw: str | None) -> int | None:
|
|
239
|
-
if raw is None:
|
|
240
|
-
return None
|
|
241
|
-
text = str(raw).strip()
|
|
242
|
-
match = _LABEL_RE.match(text)
|
|
243
|
-
if match:
|
|
244
|
-
return 1 if match.group(1) == "A" else 0
|
|
245
|
-
if "</think>" in text:
|
|
246
|
-
after_tag = text.split("</think>", 1)[-1].strip()
|
|
247
|
-
match = _LABEL_RE.match(after_tag)
|
|
248
|
-
if match:
|
|
249
|
-
return 1 if match.group(1) == "A" else 0
|
|
250
|
-
return None
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
def _completion_text(state: vf.State) -> str:
|
|
254
|
-
completion = state.get("completion")
|
|
255
|
-
if isinstance(completion, str):
|
|
256
|
-
return completion.strip()
|
|
257
|
-
if not isinstance(completion, list):
|
|
258
|
-
return ""
|
|
259
|
-
parts: list[str] = []
|
|
260
|
-
for message in completion:
|
|
261
|
-
role = None
|
|
262
|
-
content = None
|
|
263
|
-
if isinstance(message, dict):
|
|
264
|
-
role = message.get("role")
|
|
265
|
-
content = message.get("content")
|
|
266
|
-
else:
|
|
267
|
-
role = getattr(message, "role", None)
|
|
268
|
-
content = getattr(message, "content", None)
|
|
269
|
-
if role == "assistant" and isinstance(content, str) and content.strip():
|
|
270
|
-
parts.append(content.strip())
|
|
271
|
-
return "\n\n".join(parts).strip()
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
class OpenSeekerTaskSet(SandboxTaskSet):
|
|
275
|
-
"""OpenSeeker v1 search/research taskset."""
|
|
276
|
-
|
|
277
|
-
default_workdir = DEFAULT_WORKDIR
|
|
278
|
-
|
|
279
|
-
def __init__(
|
|
280
|
-
self,
|
|
281
|
-
dataset_name: str = DEFAULT_DATASET_NAME,
|
|
282
|
-
split: str = DEFAULT_SPLIT,
|
|
283
|
-
include_trajectory: bool = False,
|
|
284
|
-
filter_fn: str | None = None,
|
|
285
|
-
ds_keep_in_memory: bool | None = False,
|
|
286
|
-
ds_num_proc: int | None = None,
|
|
287
|
-
sandbox_image: str = DEFAULT_SANDBOX_IMAGE,
|
|
288
|
-
sandbox_cpu_cores: int = 2,
|
|
289
|
-
sandbox_memory_gb: int = 2,
|
|
290
|
-
sandbox_disk_size_gb: int = 5,
|
|
291
|
-
sandbox_timeout_minutes: int | None = None,
|
|
292
|
-
answer_file: str = DEFAULT_ANSWER_FILE,
|
|
293
|
-
judge_model: str = DEFAULT_JUDGE_MODEL,
|
|
294
|
-
judge_base_url: str | None = DEFAULT_JUDGE_BASE_URL,
|
|
295
|
-
judge_api_key_var: str = DEFAULT_JUDGE_API_KEY_VAR,
|
|
296
|
-
judge_sampling_args: dict[str, Any] | None = None,
|
|
297
|
-
) -> None:
|
|
298
|
-
self.dataset_name = dataset_name
|
|
299
|
-
self.split = split
|
|
300
|
-
self.include_trajectory = include_trajectory
|
|
301
|
-
self.ds_keep_in_memory = ds_keep_in_memory
|
|
302
|
-
self.ds_num_proc = ds_num_proc
|
|
303
|
-
self.answer_file = answer_file
|
|
304
|
-
self._sandbox_spec = SandboxSpec(
|
|
305
|
-
image=sandbox_image,
|
|
306
|
-
cpu_cores=sandbox_cpu_cores,
|
|
307
|
-
memory_gb=sandbox_memory_gb,
|
|
308
|
-
disk_size_gb=sandbox_disk_size_gb,
|
|
309
|
-
timeout_minutes=sandbox_timeout_minutes,
|
|
310
|
-
)
|
|
311
|
-
self._judge_model = judge_model
|
|
312
|
-
self._judge_base_url = judge_base_url
|
|
313
|
-
self._judge_api_key_var = judge_api_key_var
|
|
314
|
-
self._judge_sampling_args = dict(judge_sampling_args or {})
|
|
315
|
-
super().__init__(
|
|
316
|
-
dataset=self._build_dataset,
|
|
317
|
-
name="search/openseeker",
|
|
318
|
-
filter_fn=filter_fn,
|
|
319
|
-
)
|
|
320
|
-
|
|
321
|
-
def _build_dataset(self) -> Dataset:
|
|
322
|
-
raw = load_dataset(
|
|
323
|
-
self.dataset_name,
|
|
324
|
-
split=self.split,
|
|
325
|
-
keep_in_memory=self.ds_keep_in_memory,
|
|
326
|
-
num_proc=self.ds_num_proc,
|
|
327
|
-
)
|
|
328
|
-
columns = [
|
|
329
|
-
"question",
|
|
330
|
-
"answer",
|
|
331
|
-
"number of tool calls",
|
|
332
|
-
"trajectory correctness",
|
|
333
|
-
]
|
|
334
|
-
if self.include_trajectory:
|
|
335
|
-
columns.append("trajectory")
|
|
336
|
-
raw = raw.select_columns([col for col in columns if col in raw.column_names])
|
|
337
|
-
|
|
338
|
-
rows: list[dict[str, Any]] = []
|
|
339
|
-
for row_index, row in enumerate(raw):
|
|
340
|
-
correctness = row.get("trajectory correctness")
|
|
341
|
-
tool_calls = row.get("number of tool calls")
|
|
342
|
-
if not isinstance(tool_calls, int):
|
|
343
|
-
tool_calls = None
|
|
344
|
-
question = str(row.get("question") or "").strip()
|
|
345
|
-
answer = str(row.get("answer") or "").strip()
|
|
346
|
-
if not question or not answer:
|
|
347
|
-
continue
|
|
348
|
-
info: dict[str, Any] = {
|
|
349
|
-
"question": question,
|
|
350
|
-
"answer": answer,
|
|
351
|
-
"source_dataset": self.dataset_name,
|
|
352
|
-
"split": self.split,
|
|
353
|
-
"row_index": row_index,
|
|
354
|
-
"number_of_tool_calls": tool_calls,
|
|
355
|
-
"trajectory_correctness": correctness,
|
|
356
|
-
"answer_file": self.answer_file,
|
|
357
|
-
}
|
|
358
|
-
if self.include_trajectory:
|
|
359
|
-
info["trajectory"] = row.get("trajectory")
|
|
360
|
-
rows.append({"question": question, "answer": answer, "info": info})
|
|
361
|
-
return Dataset.from_list(rows)
|
|
362
|
-
|
|
363
|
-
def get_instruction(self, info: dict) -> str:
|
|
364
|
-
question = str(info.get("question") or "")
|
|
365
|
-
return (
|
|
366
|
-
f"{question}\n\n"
|
|
367
|
-
f"When you have the final response, write it to {self.answer_file} using a tool call, "
|
|
368
|
-
"then stop. The task is incomplete unless that file exists. Provide the requested answer "
|
|
369
|
-
"directly, include supporting URLs/citations when useful, and do not include scratch "
|
|
370
|
-
"reasoning or tool traces."
|
|
371
|
-
)
|
|
372
|
-
|
|
373
|
-
def get_sandbox_spec(self, info: dict) -> SandboxSpec:
|
|
374
|
-
return self._sandbox_spec
|
|
375
|
-
|
|
376
|
-
def get_workdir(self, info: dict) -> str:
|
|
377
|
-
return self.default_workdir
|
|
378
|
-
|
|
379
|
-
def get_env_vars(self) -> dict[str, str]:
|
|
380
|
-
env_vars: dict[str, str] = {}
|
|
381
|
-
value = os.environ.get("SERPER_API_KEY")
|
|
382
|
-
if value:
|
|
383
|
-
env_vars["SERPER_API_KEY"] = value
|
|
384
|
-
return env_vars
|
|
385
|
-
|
|
386
|
-
async def setup(self, state: vf.State) -> None:
|
|
387
|
-
sandbox_client = state["sandbox_client"]
|
|
388
|
-
sandbox_id = state["sandbox_id"]
|
|
389
|
-
await sandbox_client.execute_command(
|
|
390
|
-
sandbox_id, f"mkdir -p {self.default_workdir} /task", timeout=10
|
|
391
|
-
)
|
|
392
|
-
|
|
393
|
-
def get_rubric(self) -> vf.Rubric:
|
|
394
|
-
return OpenSeekerRubric(
|
|
395
|
-
answer_file=self.answer_file,
|
|
396
|
-
judge_model=self._judge_model,
|
|
397
|
-
judge_base_url=self._judge_base_url,
|
|
398
|
-
judge_api_key_var=self._judge_api_key_var,
|
|
399
|
-
judge_sampling_args=self._judge_sampling_args,
|
|
400
|
-
)
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
class OpenSeekerRubric(vf.Rubric):
|
|
404
|
-
"""Scores OpenSeeker answers with the upstream binary semantic judge prompt."""
|
|
405
|
-
|
|
406
|
-
def __init__(
|
|
407
|
-
self,
|
|
408
|
-
*,
|
|
409
|
-
answer_file: str = DEFAULT_ANSWER_FILE,
|
|
410
|
-
judge_model: str = DEFAULT_JUDGE_MODEL,
|
|
411
|
-
judge_base_url: str | None = DEFAULT_JUDGE_BASE_URL,
|
|
412
|
-
judge_api_key_var: str = DEFAULT_JUDGE_API_KEY_VAR,
|
|
413
|
-
judge_sampling_args: dict[str, Any] | None = None,
|
|
414
|
-
) -> None:
|
|
415
|
-
super().__init__()
|
|
416
|
-
self.answer_file = answer_file
|
|
417
|
-
self.judge_model = judge_model
|
|
418
|
-
self.judge_base_url = judge_base_url
|
|
419
|
-
self.judge_api_key_var = judge_api_key_var
|
|
420
|
-
self.judge_sampling_args = dict(judge_sampling_args or {})
|
|
421
|
-
self._client: AsyncOpenAI | None = None
|
|
422
|
-
self.add_reward_func(self.answer_reward, weight=1.0)
|
|
423
|
-
|
|
424
|
-
async def _answer_score_for_state(self, state: vf.State) -> float:
|
|
425
|
-
if state.get("error") is not None:
|
|
426
|
-
return 0.0
|
|
427
|
-
try:
|
|
428
|
-
return await self.answer_reward(state)
|
|
429
|
-
except vf.Error as exc:
|
|
430
|
-
state["error"] = exc
|
|
431
|
-
return 0.0
|
|
432
|
-
|
|
433
|
-
async def score_rollout(self, state: vf.State) -> None:
|
|
434
|
-
score = await self._answer_score_for_state(state)
|
|
435
|
-
state["reward"] = score
|
|
436
|
-
state["metrics"] = {"openseeker_reward": score}
|
|
437
|
-
|
|
438
|
-
async def score_group(self, states: list[vf.State]) -> None:
|
|
439
|
-
if not states:
|
|
440
|
-
logger.warning("No states to score")
|
|
441
|
-
return
|
|
442
|
-
scores = await asyncio.gather(
|
|
443
|
-
*(self._answer_score_for_state(state) for state in states)
|
|
444
|
-
)
|
|
445
|
-
avg_score = sum(scores) / len(scores)
|
|
446
|
-
for state, score in zip(states, scores):
|
|
447
|
-
state["reward"] = score
|
|
448
|
-
state["advantage"] = score - avg_score
|
|
449
|
-
for turn in state.get("trajectory", []):
|
|
450
|
-
if isinstance(turn, dict):
|
|
451
|
-
if turn.get("advantage") is None:
|
|
452
|
-
turn["advantage"] = state["advantage"]
|
|
453
|
-
if turn.get("reward") is None:
|
|
454
|
-
turn["reward"] = state["reward"]
|
|
455
|
-
state["metrics"] = {"openseeker_reward": score}
|
|
456
|
-
|
|
457
|
-
async def answer_reward(self, state: vf.State, **_: Any) -> float:
|
|
458
|
-
sandbox_client = state.get("sandbox_client")
|
|
459
|
-
sandbox_id = state.get("sandbox_id")
|
|
460
|
-
if not sandbox_client or not sandbox_id:
|
|
461
|
-
raise vf.SandboxError("OpenSeeker scoring requires a live sandbox")
|
|
462
|
-
try:
|
|
463
|
-
result = await sandbox_client.execute_command(
|
|
464
|
-
sandbox_id,
|
|
465
|
-
f"cat {self.answer_file} 2>/dev/null || true",
|
|
466
|
-
working_dir=None,
|
|
467
|
-
)
|
|
468
|
-
except Exception as exc:
|
|
469
|
-
raise vf.SandboxError(
|
|
470
|
-
f"Failed to read OpenSeeker answer file {self.answer_file}"
|
|
471
|
-
) from exc
|
|
472
|
-
answer = (result.stdout or "").strip()
|
|
473
|
-
answer_source = "answer_file"
|
|
474
|
-
if not answer:
|
|
475
|
-
answer = _completion_text(state)
|
|
476
|
-
answer_source = "completion_fallback" if answer else "missing"
|
|
477
|
-
state["openseeker_answer"] = answer
|
|
478
|
-
state["openseeker_answer_source"] = answer_source
|
|
479
|
-
if not answer:
|
|
480
|
-
state["openseeker_eval_error"] = "empty_answer"
|
|
481
|
-
return 0.0
|
|
482
|
-
|
|
483
|
-
info = state.get("info") or {}
|
|
484
|
-
question = str(info.get("question") or "").strip()
|
|
485
|
-
gold_answer = str(info.get("answer") or "").strip()
|
|
486
|
-
if not question or not gold_answer:
|
|
487
|
-
raise vf.InfraError(
|
|
488
|
-
"OpenSeeker task is missing question or answer metadata"
|
|
489
|
-
)
|
|
490
|
-
state["openseeker_gold_answer"] = gold_answer
|
|
491
|
-
state["openseeker_question"] = question
|
|
492
|
-
|
|
493
|
-
raw = await self._judge(
|
|
494
|
-
question=question, correct_answer=gold_answer, response=answer
|
|
495
|
-
)
|
|
496
|
-
label = _parse_judge_label(raw)
|
|
497
|
-
state["openseeker_judge_raw"] = raw
|
|
498
|
-
state["openseeker_judge_label"] = label
|
|
499
|
-
if label is None:
|
|
500
|
-
raise vf.InvalidModelResponseError(
|
|
501
|
-
f"OpenSeeker judge returned an invalid label: {raw!r}"
|
|
502
|
-
)
|
|
503
|
-
score = float(label)
|
|
504
|
-
if not math.isfinite(score):
|
|
505
|
-
score = 0.0
|
|
506
|
-
score = max(0.0, min(1.0, score))
|
|
507
|
-
state["openseeker_final_score"] = score
|
|
508
|
-
return score
|
|
509
|
-
|
|
510
|
-
async def _judge(self, *, question: str, correct_answer: str, response: str) -> str:
|
|
511
|
-
client = self._get_client()
|
|
512
|
-
prompt = JUDGE_PROMPT_BC_EN.format(
|
|
513
|
-
question=question,
|
|
514
|
-
correct_answer=correct_answer,
|
|
515
|
-
response=response,
|
|
516
|
-
)
|
|
517
|
-
request_kwargs = _merge_sampling_args(self.judge_sampling_args)
|
|
518
|
-
try:
|
|
519
|
-
completion = await client.chat.completions.create(
|
|
520
|
-
model=self.judge_model,
|
|
521
|
-
messages=[
|
|
522
|
-
{"role": "system", "content": "Judge the response objectively."},
|
|
523
|
-
{"role": "user", "content": prompt},
|
|
524
|
-
],
|
|
525
|
-
**request_kwargs,
|
|
526
|
-
)
|
|
527
|
-
except _OPENSEEKER_JUDGE_ERROR_TYPES as exc:
|
|
528
|
-
_raise_openseeker_judge_error(exc, model=self.judge_model)
|
|
529
|
-
choice = _single_choice(completion)
|
|
530
|
-
content = choice.message.content
|
|
531
|
-
if content is None:
|
|
532
|
-
raise vf.EmptyModelResponseError(
|
|
533
|
-
f"OpenSeeker judge returned no text content for {self.judge_model}"
|
|
534
|
-
)
|
|
535
|
-
return content.strip()
|
|
536
|
-
|
|
537
|
-
def _get_client(self) -> AsyncOpenAI:
|
|
538
|
-
if self._client is not None:
|
|
539
|
-
return self._client
|
|
540
|
-
api_base_url = self.judge_base_url or "https://api.openai.com/v1"
|
|
541
|
-
self._client = setup_openai_client(
|
|
542
|
-
ClientConfig(
|
|
543
|
-
api_key_var=self.judge_api_key_var,
|
|
544
|
-
api_base_url=api_base_url,
|
|
545
|
-
timeout=1200.0,
|
|
546
|
-
)
|
|
547
|
-
)
|
|
548
|
-
return self._client
|
|
549
|
-
|
|
550
|
-
@vf.cleanup
|
|
551
|
-
async def cleanup(self, state: vf.State) -> None:
|
|
552
|
-
sandbox_client = state.get("sandbox_client")
|
|
553
|
-
sandbox_id = state.get("sandbox_id")
|
|
554
|
-
if sandbox_client and sandbox_id:
|
|
555
|
-
try:
|
|
556
|
-
await sandbox_client.delete(sandbox_id)
|
|
557
|
-
except Exception:
|
|
558
|
-
pass
|
|
559
|
-
|
|
560
|
-
@vf.teardown
|
|
561
|
-
async def teardown(self) -> None:
|
|
562
|
-
if self._client is not None:
|
|
563
|
-
await self._client.close()
|
|
564
|
-
self._client = None
|