verifiers 0.1.15.dev435__tar.gz → 0.1.15.dev437__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.1.15.dev435 → verifiers-0.1.15.dev437}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/ARCHITECTURE.md +1 -1
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/GUIDE.md +4 -4
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/dashboard/eval.py +40 -8
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/eval/main.py +4 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/eval/resume.py +7 -7
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/eval/runner.py +19 -3
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/output.py +15 -11
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/replay.py +8 -2
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/configs/debug.py +1 -1
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/configs/eval.py +5 -1
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/configs/replay.py +1 -1
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/legacy.py +1 -1
- verifiers-0.1.15.dev437/verifiers/v1/push.py +209 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/state.py +1 -1
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/trace.py +3 -3
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/.gitignore +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/LICENSE +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/test_judges.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/judge.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev435 → verifiers-0.1.15.dev437}/verifiers/v1/utils/memory.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.1.15.
|
|
3
|
+
Version: 0.1.15.dev437
|
|
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
|
|
@@ -69,7 +69,7 @@ several. A branch *is* a training sample: concatenating its nodes' `token_ids` r
|
|
|
69
69
|
end to end: each surviving context window is just another root→leaf path.
|
|
70
70
|
|
|
71
71
|
`Trace.to_record()` (`trace.py`) is the JSON record dump (`model_dump(mode="json")`) for
|
|
72
|
-
`
|
|
72
|
+
`traces.jsonl` / W&B tables, minus the per-node training tensors (`MessageNode.multi_modal_data`,
|
|
73
73
|
`routed_experts`, via `_NODE_DUMP_EXCLUDE`): those hold raw numpy bytes that can't round-trip JSON
|
|
74
74
|
(the dump raises `UnicodeDecodeError` on real expert ids) and bloat every line. Computed views
|
|
75
75
|
(`reward`, `branches`, `num_turns`, per-span `duration`) are pydantic properties, so they're never
|
|
@@ -369,7 +369,7 @@ Good to know:
|
|
|
369
369
|
- **What lands on the trace:** the weighted verdict in `trace.rewards[<reward key>]`; rubric's
|
|
370
370
|
raw per-criterion verdicts in `trace.metrics`; every call's `JudgeResponse` in
|
|
371
371
|
`trace.info["judge"]` with its tokens + cost in `trace.extra_usage` (shown as `+judge` in the
|
|
372
|
-
dashboard). All persisted to `
|
|
372
|
+
dashboard). All persisted to `traces.jsonl`.
|
|
373
373
|
|
|
374
374
|
Writing your own pluggable judge is the same recipe as any plugin: a package exporting a `Judge`
|
|
375
375
|
subclass via `__all__` that implements `score` — declare any subset of `task` / `trace` / `runtime`
|
|
@@ -468,7 +468,7 @@ class SWETaskset(vf.Taskset[SWETask, SWEConfig]):
|
|
|
468
468
|
`trace.info` is a free-form, **JSON-serializable** dict for per-rollout artifacts that are neither a
|
|
469
469
|
reward nor a metric — the diff above, captured logs, command output, file paths. Write to it from
|
|
470
470
|
`finalize` or a `@reward`/`@metric` by assigning into the dict; it is persisted with the trace
|
|
471
|
-
(dumped to `
|
|
471
|
+
(dumped to `traces.jsonl` and sent over the wire), so every value must be JSON-serializable — a
|
|
472
472
|
non-serializable value fails the trace dump rather than being silently dropped.
|
|
473
473
|
|
|
474
474
|
```python
|
|
@@ -815,7 +815,7 @@ client-side so each node carries the exact `token_ids` / `mask` / `logprobs` (th
|
|
|
815
815
|
— point it at a vLLM engine with `--client.base-url`.
|
|
816
816
|
|
|
817
817
|
**What it writes** (into `--output-dir`, default `outputs/<taskset>--<model>--<harness>/<uuid>`):
|
|
818
|
-
`config.toml` (the resolved config, re-runnable via `@ config.toml`), `
|
|
818
|
+
`config.toml` (the resolved config, re-runnable via `@ config.toml`), `traces.jsonl` (one full
|
|
819
819
|
trace per line, appended as each rollout finishes — durable mid-run), and `eval.log`.
|
|
820
820
|
|
|
821
821
|
**`--dry-run`** writes `config.toml` and exits (resolve + validate, no run). **`--resume
|
|
@@ -869,7 +869,7 @@ uv run debug swebench-v1 -n 1 --runtime.type prime --script-path ./inspect.sh
|
|
|
869
869
|
| `--runtime.type` | `docker` | runtime for setup + the debug action |
|
|
870
870
|
| `--timeout.setup` / `--timeout.total` | None | per-task wall-clock caps for `setup` and the debug action |
|
|
871
871
|
| `-n`/`--num-tasks`, `-s`/`--shuffle`, `-c`/`--max-concurrent` (128) | | task selection + concurrency |
|
|
872
|
-
| `-o`/`--output-dir` | fresh debug run dir | where `config.toml` and `
|
|
872
|
+
| `-o`/`--output-dir` | fresh debug run dir | where `config.toml` and `traces.jsonl` are written |
|
|
873
873
|
|
|
874
874
|
Each saved trace has command/script metadata, exit status, elapsed time, timeout/error fields,
|
|
875
875
|
and the full stdout/stderr under `trace.info["debug"]`.
|
|
@@ -13,6 +13,7 @@ overview + progress sit on top, above a rule.
|
|
|
13
13
|
|
|
14
14
|
import contextlib
|
|
15
15
|
import time
|
|
16
|
+
from typing import TYPE_CHECKING
|
|
16
17
|
|
|
17
18
|
from pydantic import BaseModel
|
|
18
19
|
from rich.console import Console, Group
|
|
@@ -36,6 +37,9 @@ from verifiers.v1.utils.format import (
|
|
|
36
37
|
)
|
|
37
38
|
from verifiers.utils.pricing_utils import format_cost_usd
|
|
38
39
|
|
|
40
|
+
if TYPE_CHECKING:
|
|
41
|
+
from verifiers.v1.push import PushState
|
|
42
|
+
|
|
39
43
|
# For sizing pages to the terminal: detects the real terminal height/width each access (the live
|
|
40
44
|
# view writes to the same terminal). Reused so we don't rebuild it every refresh tick.
|
|
41
45
|
_CONSOLE = Console()
|
|
@@ -208,6 +212,21 @@ def Overview(config: EvalConfig) -> Table:
|
|
|
208
212
|
return grid
|
|
209
213
|
|
|
210
214
|
|
|
215
|
+
def _push_footer(push: "PushState | None") -> Group | None:
|
|
216
|
+
"""The `--push` status line under the rollouts, shown once the run finishes and the upload
|
|
217
|
+
begins: dim `Pushing traces...` while it runs, then white `Traces pushed (<url>)` or red
|
|
218
|
+
`Trace push failed (<err>)`. `None` (no line) until the upload starts and when `--push` is off."""
|
|
219
|
+
if push is None or not push.started:
|
|
220
|
+
return None
|
|
221
|
+
if not push.done:
|
|
222
|
+
line = Text("Pushing traces...", style="dim")
|
|
223
|
+
elif push.url:
|
|
224
|
+
line = Text(f"Traces pushed ({push.url})", style="white", overflow="fold")
|
|
225
|
+
else:
|
|
226
|
+
line = Text(f"Trace push failed ({push.error})", style="red", overflow="fold")
|
|
227
|
+
return Group(Rule(style="dim"), line)
|
|
228
|
+
|
|
229
|
+
|
|
211
230
|
def Progress(
|
|
212
231
|
rollouts: list[Rollout],
|
|
213
232
|
start: float,
|
|
@@ -576,16 +595,22 @@ def _render(
|
|
|
576
595
|
start: float,
|
|
577
596
|
pager: Pager,
|
|
578
597
|
finished: list[Trace] | None = None,
|
|
598
|
+
push: "PushState | None" = None,
|
|
579
599
|
) -> Group:
|
|
580
600
|
now = time.time()
|
|
581
601
|
warning = _warning(config)
|
|
582
602
|
# `{warning}\n\n{overview}` — the caution sits at the very top, blank line, then the overview.
|
|
583
603
|
header = Group(warning, Text(""), Overview(config)) if warning else Overview(config)
|
|
584
|
-
#
|
|
585
|
-
#
|
|
586
|
-
#
|
|
604
|
+
# The --push status line appears under the rollouts once the upload starts (None during the run
|
|
605
|
+
# / when off). Measure the fixed top (header + progress + rule) and the footer so the rollout
|
|
606
|
+
# rows fill what's left; page through them (timer / arrows) when they'd overflow (else rich
|
|
607
|
+
# truncates).
|
|
608
|
+
footer = _push_footer(push)
|
|
587
609
|
top = Group(header, Progress(rollouts, start, finished=finished), Rule(style="dim"))
|
|
588
|
-
|
|
610
|
+
reserved = len(_CONSOLE.render_lines(top))
|
|
611
|
+
if footer is not None:
|
|
612
|
+
reserved += len(_CONSOLE.render_lines(footer))
|
|
613
|
+
rows_per_page = max(1, _CONSOLE.size.height - reserved - 1)
|
|
589
614
|
page_groups, index, count = _paginate(_groups(rollouts), rows_per_page, pager, now)
|
|
590
615
|
progress = Progress(
|
|
591
616
|
rollouts,
|
|
@@ -593,12 +618,15 @@ def _render(
|
|
|
593
618
|
page=(index + 1, count) if count > 1 else None,
|
|
594
619
|
finished=finished,
|
|
595
620
|
)
|
|
596
|
-
|
|
621
|
+
parts = [
|
|
597
622
|
header,
|
|
598
623
|
progress,
|
|
599
624
|
Rule(style="dim"),
|
|
600
625
|
Rows(page_groups, now, config.harness.runtime.type),
|
|
601
|
-
|
|
626
|
+
]
|
|
627
|
+
if footer is not None:
|
|
628
|
+
parts.append(footer)
|
|
629
|
+
return Group(*parts)
|
|
602
630
|
|
|
603
631
|
|
|
604
632
|
@contextlib.asynccontextmanager
|
|
@@ -607,13 +635,17 @@ async def dashboard(
|
|
|
607
635
|
config: EvalConfig,
|
|
608
636
|
start: float,
|
|
609
637
|
finished: list[Trace] | None = None,
|
|
638
|
+
push: "PushState | None" = None,
|
|
610
639
|
):
|
|
611
640
|
"""Refresh the live eval view until the `with` block exits, then a final frame. Left/right
|
|
612
641
|
arrows page through rollout rows when they overflow the screen. On resume, `finished` carries
|
|
613
642
|
the kept on-disk rollouts (reloaded as finished traces) so the counts and scores cover the
|
|
614
|
-
whole run, not just this session's re-run rollouts.
|
|
643
|
+
whole run, not just this session's re-run rollouts. `push` is the shared `--push` status the
|
|
644
|
+
view renders as a line under the rollouts once the upload starts (dim -> white URL / red error),
|
|
645
|
+
updated by the caller as the inline upload runs and lands."""
|
|
615
646
|
pager = Pager()
|
|
616
647
|
async with live_view(
|
|
617
|
-
lambda: _render(rollouts, config, start, pager, finished),
|
|
648
|
+
lambda: _render(rollouts, config, start, pager, finished, push),
|
|
649
|
+
on_key=pager.on_key,
|
|
618
650
|
):
|
|
619
651
|
yield
|
|
@@ -105,6 +105,10 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
105
105
|
else: # in-process (default), with or without the live dashboard
|
|
106
106
|
env = vf.Environment(config)
|
|
107
107
|
traces = asyncio.run(run_eval(env, config))
|
|
108
|
+
if config.push and not rich:
|
|
109
|
+
from verifiers.v1.push import push_traces
|
|
110
|
+
|
|
111
|
+
push_traces(traces, config)
|
|
108
112
|
if not rich: # --rich is the whole output; otherwise dump each trace as JSON
|
|
109
113
|
for trace in traces:
|
|
110
114
|
print(trace.model_dump_json(indent=2, exclude_none=True))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Resume an interrupted eval: re-run only the rollouts a previous run didn't finish.
|
|
2
2
|
|
|
3
|
-
A run writes `config.toml` + `
|
|
3
|
+
A run writes `config.toml` + `traces.jsonl` into its output dir. `--resume <dir>` reloads
|
|
4
4
|
that config verbatim (so it takes no other flags) and writes back into the same dir, running
|
|
5
5
|
only the rollouts still owed: the *missing* ones (never written — the run was interrupted) and
|
|
6
6
|
the *errored* ones (written with an error). Good rollouts are kept; errored ones are dropped
|
|
@@ -16,7 +16,7 @@ from pathlib import Path
|
|
|
16
16
|
|
|
17
17
|
from pydantic_core import from_json
|
|
18
18
|
|
|
19
|
-
from verifiers.v1.cli.output import read_traces
|
|
19
|
+
from verifiers.v1.cli.output import CONFIG_FILE, TRACES_FILE, read_traces
|
|
20
20
|
from verifiers.v1.configs.eval import EvalConfig
|
|
21
21
|
from verifiers.v1.state import state_cls
|
|
22
22
|
from verifiers.v1.task import WireTask
|
|
@@ -41,8 +41,8 @@ def split_resume(argv: list[str]) -> tuple[Path | None, list[str]]:
|
|
|
41
41
|
|
|
42
42
|
def load_resume_config(resume_dir: Path) -> EvalConfig:
|
|
43
43
|
"""Rebuild the run's `EvalConfig` from its saved `config.toml`, pointed back at its own
|
|
44
|
-
output dir so the resumed rollouts append to the same `
|
|
45
|
-
config_path = resume_dir /
|
|
44
|
+
output dir so the resumed rollouts append to the same `traces.jsonl`."""
|
|
45
|
+
config_path = resume_dir / CONFIG_FILE
|
|
46
46
|
if not config_path.exists():
|
|
47
47
|
raise SystemExit(
|
|
48
48
|
f"--resume: no config.toml in {resume_dir} - not an eval output dir"
|
|
@@ -81,7 +81,7 @@ def plan(
|
|
|
81
81
|
# Retain only the offsets resume can reuse; trace payloads stay on disk.
|
|
82
82
|
selected = set(selected_idxs)
|
|
83
83
|
by_idx: dict[int, list[int]] = defaultdict(list)
|
|
84
|
-
for offset, idx, errored in _read_results(resume_dir /
|
|
84
|
+
for offset, idx, errored in _read_results(resume_dir / TRACES_FILE):
|
|
85
85
|
if idx in selected and not errored and len(by_idx[idx]) < num_rollouts:
|
|
86
86
|
by_idx[idx].append(offset)
|
|
87
87
|
keep: list[int] = []
|
|
@@ -102,9 +102,9 @@ def plan(
|
|
|
102
102
|
|
|
103
103
|
|
|
104
104
|
def rewrite_results(resume_dir: Path, keep: list[int]) -> None:
|
|
105
|
-
"""Replace `
|
|
105
|
+
"""Replace `traces.jsonl` with just the kept (good) traces; resumed rollouts append. Via a
|
|
106
106
|
temp file + atomic rename, so an interrupted resume can't corrupt the prior good results."""
|
|
107
|
-
path = resume_dir /
|
|
107
|
+
path = resume_dir / TRACES_FILE
|
|
108
108
|
tmp = path.with_suffix(".jsonl.tmp")
|
|
109
109
|
if not keep:
|
|
110
110
|
tmp.write_bytes(b"")
|
|
@@ -89,8 +89,17 @@ async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
|
|
|
89
89
|
for task in tasks
|
|
90
90
|
]
|
|
91
91
|
rollouts = [rollout for episode in episodes for rollout in episode.rollouts]
|
|
92
|
+
# --push in the live dashboard: share a status the dashboard renders as a line under the
|
|
93
|
+
# rollouts once the run finishes and the upload begins (dim -> green URL / red error), and
|
|
94
|
+
# do the upload inline below so it resolves on screen. Only the rich path has a dashboard;
|
|
95
|
+
# every other path uploads (+ logs the URL) from `main`.
|
|
96
|
+
push_state = None
|
|
97
|
+
if config.push and config.rich:
|
|
98
|
+
from verifiers.v1.push import PushState
|
|
99
|
+
|
|
100
|
+
push_state = PushState()
|
|
92
101
|
display = (
|
|
93
|
-
dashboard(rollouts, config, start, finished=finished)
|
|
102
|
+
dashboard(rollouts, config, start, finished=finished, push=push_state)
|
|
94
103
|
if config.rich
|
|
95
104
|
else contextlib.nullcontext()
|
|
96
105
|
)
|
|
@@ -98,7 +107,14 @@ async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
|
|
|
98
107
|
results = await asyncio.gather(
|
|
99
108
|
*(episode.run(semaphore, on_complete) for episode in episodes)
|
|
100
109
|
)
|
|
101
|
-
|
|
110
|
+
traces = [trace for episode_traces in results for trace in episode_traces]
|
|
111
|
+
if (
|
|
112
|
+
push_state is not None
|
|
113
|
+
): # upload off the event loop so the view keeps refreshing
|
|
114
|
+
from verifiers.v1.push import push_traces
|
|
115
|
+
|
|
116
|
+
push_state.started = True
|
|
117
|
+
await asyncio.to_thread(push_traces, traces, config, push_state)
|
|
102
118
|
await client.close()
|
|
103
119
|
return traces
|
|
104
120
|
|
|
@@ -107,7 +123,7 @@ async def run_eval_server(config: EvalConfig) -> list[Trace]:
|
|
|
107
123
|
"""Eval through the env-server worker pool (`--num-workers > 0`). Spawns the pool
|
|
108
124
|
(works for v1 and the v0 bridge), then drives rollouts by task idx over an
|
|
109
125
|
`EnvClient` — the same path prime-rl trains through, so it exercises the
|
|
110
|
-
router + workers end-to-end. Output matches `run_eval` (config.toml +
|
|
126
|
+
router + workers end-to-end. Output matches `run_eval` (config.toml + traces.jsonl)."""
|
|
111
127
|
import multiprocessing as mp
|
|
112
128
|
from functools import partial
|
|
113
129
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""On-disk output:
|
|
1
|
+
"""On-disk output: traces.jsonl (one full trace per line) + config.toml.
|
|
2
2
|
|
|
3
3
|
The trace is the full data dump — written verbatim, consumed by the platform
|
|
4
4
|
(visualization) and prime-rl (training). config.toml is the run's resolved EvalConfig,
|
|
@@ -7,7 +7,7 @@ its own output. Aggregates (avg reward, etc.) are cheap to recompute from result
|
|
|
7
7
|
they aren't stored.
|
|
8
8
|
|
|
9
9
|
The runner writes `config.toml` once up front (`save_config`) and then appends each
|
|
10
|
-
trace to `
|
|
10
|
+
trace to `traces.jsonl` as it completes (`append_trace`), so a long run's results are
|
|
11
11
|
durable as they land rather than only at the end.
|
|
12
12
|
"""
|
|
13
13
|
|
|
@@ -22,6 +22,12 @@ from verifiers.v1.configs.eval import EvalConfig
|
|
|
22
22
|
from verifiers.v1.trace import Trace
|
|
23
23
|
from verifiers.v1.utils.aio import run_shielded
|
|
24
24
|
|
|
25
|
+
TRACES_FILE = "traces.jsonl"
|
|
26
|
+
"""Filename each run's full per-rollout traces are written to (one JSON trace per line)."""
|
|
27
|
+
|
|
28
|
+
CONFIG_FILE = "config.toml"
|
|
29
|
+
"""Filename a run's resolved config is written to (re-runnable via `@ config.toml`)."""
|
|
30
|
+
|
|
25
31
|
|
|
26
32
|
def output_path(config: EvalConfig) -> Path:
|
|
27
33
|
"""Where this run writes: `outputs/<taskset>--<model>--<harness>/<uuid>` (or the explicit
|
|
@@ -38,35 +44,33 @@ def write_config(config: BaseModel, results_dir: Path) -> Path:
|
|
|
38
44
|
nulls TOML can't represent."""
|
|
39
45
|
results_dir.mkdir(parents=True, exist_ok=True)
|
|
40
46
|
toml = tomli_w.dumps(config.model_dump(mode="json", exclude_none=True))
|
|
41
|
-
config_path = results_dir /
|
|
47
|
+
config_path = results_dir / CONFIG_FILE
|
|
42
48
|
config_path.write_text(toml)
|
|
43
49
|
return config_path
|
|
44
50
|
|
|
45
51
|
|
|
46
52
|
def save_config(config: BaseModel, results_dir: Path) -> None:
|
|
47
53
|
"""Set up the run's output dir: write `config.toml` and start a fresh (empty)
|
|
48
|
-
`
|
|
54
|
+
`traces.jsonl`. Call once up front, before traces start landing."""
|
|
49
55
|
write_config(config, results_dir)
|
|
50
|
-
(results_dir /
|
|
51
|
-
""
|
|
52
|
-
) # fresh; appended to as traces complete
|
|
56
|
+
(results_dir / TRACES_FILE).write_text("") # fresh; appended to as traces complete
|
|
53
57
|
|
|
54
58
|
|
|
55
59
|
def write_trace(results_dir: Path, trace: Trace) -> None:
|
|
56
60
|
"""Serialize and append one trace in the worker thread."""
|
|
57
61
|
data = TypeAdapter(type(trace)).dump_json(trace, exclude_none=True)
|
|
58
|
-
with (results_dir /
|
|
62
|
+
with (results_dir / TRACES_FILE).open("ab") as f:
|
|
59
63
|
f.write(data + b"\n")
|
|
60
64
|
|
|
61
65
|
|
|
62
66
|
def read_traces(results_dir: Path, trace_type: type) -> list[Trace]:
|
|
63
|
-
"""Load a run's saved traces from `
|
|
67
|
+
"""Load a run's saved traces from `traces.jsonl`, typed as `trace_type` — the inverse of
|
|
64
68
|
`write_trace`. Used by `replay` to re-score finished rollouts (pass the taskset's typed
|
|
65
69
|
`Trace[...]`, or `Trace[WireTask, ...]` to read any taskset's traces without importing it).
|
|
66
|
-
Streams line-by-line so a large (multi-GB)
|
|
70
|
+
Streams line-by-line so a large (multi-GB) traces file isn't loaded into memory at once."""
|
|
67
71
|
adapter = TypeAdapter(trace_type)
|
|
68
72
|
traces: list[Trace] = []
|
|
69
|
-
with (results_dir /
|
|
73
|
+
with (results_dir / TRACES_FILE).open(encoding="utf-8") as f:
|
|
70
74
|
for line in f:
|
|
71
75
|
if line.strip():
|
|
72
76
|
traces.append(adapter.validate_python(json.loads(line)))
|
|
@@ -23,7 +23,13 @@ from pydantic_config import cli
|
|
|
23
23
|
|
|
24
24
|
import verifiers.v1 as vf
|
|
25
25
|
from verifiers.v1.cli.dashboard.replay import ReplayProgress, replay_dashboard
|
|
26
|
-
from verifiers.v1.cli.output import
|
|
26
|
+
from verifiers.v1.cli.output import (
|
|
27
|
+
CONFIG_FILE,
|
|
28
|
+
append_trace,
|
|
29
|
+
read_traces,
|
|
30
|
+
save_config,
|
|
31
|
+
write_config,
|
|
32
|
+
)
|
|
27
33
|
from verifiers.v1.configs.replay import ReplayConfig
|
|
28
34
|
from verifiers.v1.state import state_cls
|
|
29
35
|
from verifiers.v1.task import WireTask
|
|
@@ -138,7 +144,7 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
138
144
|
cli(ReplayConfig) # full, typed pydantic-config option help
|
|
139
145
|
return
|
|
140
146
|
source = Path(argv.pop(0)) # the finished run dir to replay
|
|
141
|
-
config_path = source /
|
|
147
|
+
config_path = source / CONFIG_FILE
|
|
142
148
|
if not config_path.exists():
|
|
143
149
|
raise SystemExit(f"{USAGE}\nno config.toml in {source}")
|
|
144
150
|
|
|
@@ -46,7 +46,7 @@ class DebugConfig(BaseConfig):
|
|
|
46
46
|
output_dir: Path | None = Field(
|
|
47
47
|
None, validation_alias=AliasChoices("output_dir", "o")
|
|
48
48
|
)
|
|
49
|
-
"""Where to write `config.toml` and `
|
|
49
|
+
"""Where to write `config.toml` and `traces.jsonl`. None = a fresh per-run dir."""
|
|
50
50
|
|
|
51
51
|
@property
|
|
52
52
|
def name(self) -> str:
|
|
@@ -54,10 +54,14 @@ class EvalConfig(EnvServerConfig):
|
|
|
54
54
|
server: bool = False
|
|
55
55
|
"""Drive rollouts through the env-server worker pool (sized by `--pool.*`) instead of
|
|
56
56
|
in-process — the path prime-rl trains through. Incompatible with `--rich`."""
|
|
57
|
+
push: bool = True
|
|
58
|
+
"""Upload the finished run to the Prime Intellect platform (the private Evaluations
|
|
59
|
+
tab) at the end of the eval. On by default; disable with `--no-push`. Needs
|
|
60
|
+
`$PRIME_API_KEY` or `prime login`."""
|
|
57
61
|
output_dir: Path | None = Field(
|
|
58
62
|
None, validation_alias=AliasChoices("output_dir", "o")
|
|
59
63
|
)
|
|
60
|
-
"""Where to write the run (config.toml +
|
|
64
|
+
"""Where to write the run (config.toml + traces.jsonl). None = a fresh per-run dir
|
|
61
65
|
under `outputs/<env>--<model>--<harness>/<uuid>` (so runs never overwrite each other)."""
|
|
62
66
|
resume: Path | None = Field(None, exclude=True)
|
|
63
67
|
"""Set by `--resume <dir>`: re-run only the rollouts a previous run left missing or
|
|
@@ -49,7 +49,7 @@ class ReplayConfig(BaseConfig):
|
|
|
49
49
|
output_dir: Path | None = Field(
|
|
50
50
|
None, validation_alias=AliasChoices("output_dir", "o")
|
|
51
51
|
)
|
|
52
|
-
"""Where to write the re-scored run (config.toml +
|
|
52
|
+
"""Where to write the re-scored run (config.toml + traces.jsonl). None = a fresh per-run
|
|
53
53
|
dir under `outputs/<taskset>--replay/<uuid>` (so a replay never overwrites the source run)."""
|
|
54
54
|
|
|
55
55
|
@property
|
|
@@ -435,7 +435,7 @@ async def run_legacy_eval(config) -> list[Trace]:
|
|
|
435
435
|
|
|
436
436
|
Loads the v0 env, runs `num_rollouts` per task with bounded concurrency, maps each v0
|
|
437
437
|
`RolloutOutput` to a v1 `Trace` (`rollout_output_to_trace`), persists results as they
|
|
438
|
-
land (the same `
|
|
438
|
+
land (the same `traces.jsonl` / `config.toml` a native run writes), and returns the
|
|
439
439
|
traces. The v0 env is run directly (`env.run_rollout`, no env server), so this needs no
|
|
440
440
|
runtime / interception server. All v0 specifics live here; the CLI only branches on
|
|
441
441
|
`config.is_legacy`."""
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"""Push a finished eval run to the Prime Intellect platform (`uv run eval`, `--no-push` to skip).
|
|
2
|
+
|
|
3
|
+
On by default. Converts each in-memory v1 `Trace` to the platform's (v0) eval-sample schema
|
|
4
|
+
(`trace_to_sample`) and uploads the run over the `/evaluations/` API (create -> push samples ->
|
|
5
|
+
finalize) — the same contract
|
|
6
|
+
`prime eval push` uploads a saved run through, done inline at the end of a run rather than
|
|
7
|
+
later from disk. Auth + base URL come from `$PRIME_API_KEY` / `~/.prime/config.json`
|
|
8
|
+
(written by `prime login`), like the rest of the CLI.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
import os
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
import httpx
|
|
17
|
+
|
|
18
|
+
from verifiers.utils.client_utils import load_prime_config
|
|
19
|
+
from verifiers.v1.configs.eval import EvalConfig
|
|
20
|
+
from verifiers.v1.trace import Trace
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
DEFAULT_API_URL = "https://api.primeintellect.ai"
|
|
25
|
+
DEFAULT_FRONTEND_URL = "https://app.primeintellect.ai"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class PushState:
|
|
30
|
+
"""Live status of the push, shared with the v1 `--rich` dashboard so it can show a status line
|
|
31
|
+
under the rollouts once the run finishes and the upload begins: dim while uploading, then the
|
|
32
|
+
viewer URL (green) or the error (red). `started` flips true when the upload begins (the caller
|
|
33
|
+
sets it), `done` when it returns; `url` is set on success and `error` on a skip/failure. No line
|
|
34
|
+
is shown until `started`. Populated by `push_traces` (pass the state in)."""
|
|
35
|
+
|
|
36
|
+
started: bool = False
|
|
37
|
+
done: bool = False
|
|
38
|
+
url: str | None = None
|
|
39
|
+
error: str | None = None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def trace_to_sample(trace: Trace, rollout_number: int = 1) -> dict[str, Any]:
|
|
43
|
+
"""One rollout -> the platform's sample dict (the "old" v0 eval-sample format).
|
|
44
|
+
|
|
45
|
+
The conversation is the unit — no prompt/completion split (meaningless mid-branch):
|
|
46
|
+
`completion` is the final branch's messages and `trajectory` carries one message list per
|
|
47
|
+
branch. `rollout_number` is this rollout's 1-based index within its task's group (callers that
|
|
48
|
+
don't group rollouts can leave it at the default)."""
|
|
49
|
+
|
|
50
|
+
def dump(messages):
|
|
51
|
+
return [m.model_dump(mode="json", exclude_none=True) for m in messages]
|
|
52
|
+
|
|
53
|
+
task = trace.task.model_dump(mode="json", exclude_none=True)
|
|
54
|
+
branches = trace.branches
|
|
55
|
+
sample = {
|
|
56
|
+
"sample_id": trace.id,
|
|
57
|
+
"example_id": trace.task.idx,
|
|
58
|
+
"rollout_number": rollout_number,
|
|
59
|
+
"task": task,
|
|
60
|
+
"prompt": [],
|
|
61
|
+
"completion": dump(branches[-1].messages) if branches else [],
|
|
62
|
+
"answer": task.get("answer"),
|
|
63
|
+
"reward": trace.reward,
|
|
64
|
+
"timing": trace.timing.model_dump(mode="json", exclude_none=True),
|
|
65
|
+
"is_completed": trace.is_completed,
|
|
66
|
+
"is_truncated": trace.is_truncated,
|
|
67
|
+
"metrics": trace.metrics,
|
|
68
|
+
"error": trace.error.model_dump(mode="json", exclude_none=True)
|
|
69
|
+
if trace.error
|
|
70
|
+
else None,
|
|
71
|
+
"stop_condition": trace.stop_condition,
|
|
72
|
+
"trajectory": [
|
|
73
|
+
{
|
|
74
|
+
"messages": dump(branch.messages),
|
|
75
|
+
"num_input_tokens": branch.num_input_tokens,
|
|
76
|
+
"num_output_tokens": branch.num_output_tokens,
|
|
77
|
+
}
|
|
78
|
+
for branch in branches
|
|
79
|
+
],
|
|
80
|
+
"token_usage": trace.usage.model_dump(mode="json", exclude_none=True)
|
|
81
|
+
if trace.usage
|
|
82
|
+
else None,
|
|
83
|
+
"info": dict(trace.info) or None,
|
|
84
|
+
}
|
|
85
|
+
# Flatten each sub-reward onto the sample as a top-level key, the way v0's `state_to_output`
|
|
86
|
+
# does. Env metrics stay in the nested `metrics` field.
|
|
87
|
+
for name, value in trace.rewards.items():
|
|
88
|
+
sample.setdefault(name, value)
|
|
89
|
+
return sample
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _creds() -> tuple[str | None, str, str, str | None]:
|
|
93
|
+
"""(api_key, api_base, frontend_url, team_id) from env vars / `~/.prime/config.json`."""
|
|
94
|
+
cfg = load_prime_config()
|
|
95
|
+
api_key = os.getenv("PRIME_API_KEY") or cfg.get("api_key")
|
|
96
|
+
base = (
|
|
97
|
+
os.getenv("PRIME_API_BASE_URL")
|
|
98
|
+
or os.getenv("PRIME_BASE_URL")
|
|
99
|
+
or cfg.get("base_url")
|
|
100
|
+
or DEFAULT_API_URL
|
|
101
|
+
)
|
|
102
|
+
base = base.rstrip("/").removesuffix("/api/v1")
|
|
103
|
+
frontend = (
|
|
104
|
+
os.getenv("PRIME_FRONTEND_URL")
|
|
105
|
+
or cfg.get("frontend_url")
|
|
106
|
+
or DEFAULT_FRONTEND_URL
|
|
107
|
+
)
|
|
108
|
+
team_id = os.getenv("PRIME_TEAM_ID") or cfg.get("team_id")
|
|
109
|
+
return api_key, base, frontend, team_id
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def push_traces(
|
|
113
|
+
traces: list[Trace], config: EvalConfig, state: "PushState | None" = None
|
|
114
|
+
) -> str | None:
|
|
115
|
+
"""Upload a finished run to the platform; return the viewer URL (None if skipped/failed).
|
|
116
|
+
|
|
117
|
+
Resolves the env (get-or-create) by name so a local run uploads without a prior
|
|
118
|
+
`prime env push`, then create evaluation -> push samples -> finalize. When `state` is given
|
|
119
|
+
(the v1 `--rich` path), record the outcome on it (`url` on success, `error` on skip/failure,
|
|
120
|
+
`done` when finished) so the dashboard's status line resolves."""
|
|
121
|
+
|
|
122
|
+
def finish(url: str | None = None, error: str | None = None) -> str | None:
|
|
123
|
+
if state is not None:
|
|
124
|
+
state.url = url
|
|
125
|
+
state.error = error
|
|
126
|
+
state.done = True
|
|
127
|
+
return url
|
|
128
|
+
|
|
129
|
+
api_key, base, frontend, team_id = _creds()
|
|
130
|
+
if not api_key:
|
|
131
|
+
logger.warning(
|
|
132
|
+
"--push: no PRIME_API_KEY (set it or run `prime login`); skipping upload"
|
|
133
|
+
)
|
|
134
|
+
return finish(error="no PRIME_API_KEY (run `prime login`)")
|
|
135
|
+
|
|
136
|
+
def compute_metrics() -> dict[str, Any]:
|
|
137
|
+
"""Run-level aggregates as v0's `GenerateMetadata`: `avg_reward` (mean over all traces),
|
|
138
|
+
`avg_metrics` (each sub-reward and env-metric averaged over the traces that recorded it),
|
|
139
|
+
and `avg_error` (errored fraction) — what the overview renders."""
|
|
140
|
+
sums: dict[str, float] = {}
|
|
141
|
+
counts: dict[str, int] = {}
|
|
142
|
+
for trace in traces:
|
|
143
|
+
for name, value in {**trace.rewards, **trace.metrics}.items():
|
|
144
|
+
sums[name] = sums.get(name, 0.0) + value
|
|
145
|
+
counts[name] = counts.get(name, 0) + 1
|
|
146
|
+
n = len(traces)
|
|
147
|
+
return {
|
|
148
|
+
"avg_reward": sum(t.reward for t in traces) / n if n else 0.0,
|
|
149
|
+
"avg_metrics": {name: sums[name] / counts[name] for name in sums},
|
|
150
|
+
"avg_error": sum(t.has_error for t in traces) / n if n else 0.0,
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
env_name = config.taskset.id or config.id
|
|
154
|
+
metrics = compute_metrics()
|
|
155
|
+
counts: dict[int, int] = {}
|
|
156
|
+
samples = []
|
|
157
|
+
for trace in traces:
|
|
158
|
+
counts[trace.task.idx] = counts.get(trace.task.idx, 0) + 1
|
|
159
|
+
samples.append(trace_to_sample(trace, counts[trace.task.idx]))
|
|
160
|
+
|
|
161
|
+
metadata = {
|
|
162
|
+
"framework": "verifiers",
|
|
163
|
+
"run_id": config.uuid,
|
|
164
|
+
"model": config.model,
|
|
165
|
+
"num_examples": len(counts),
|
|
166
|
+
"rollouts_per_example": config.num_rollouts,
|
|
167
|
+
**metrics,
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
team = {"team_id": team_id} if team_id else {}
|
|
171
|
+
api = f"{base}/api/v1"
|
|
172
|
+
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
|
|
173
|
+
# The run is already done and its results saved; a network blip or platform error here must
|
|
174
|
+
# not crash the run (or, on the non-rich path, swallow the final per-trace output that prints
|
|
175
|
+
# after this) — log and skip the upload instead.
|
|
176
|
+
try:
|
|
177
|
+
with httpx.Client(headers=headers, timeout=300.0) as client:
|
|
178
|
+
|
|
179
|
+
def post(path: str, body: dict) -> dict:
|
|
180
|
+
resp = client.post(f"{api}{path}", json=body)
|
|
181
|
+
resp.raise_for_status()
|
|
182
|
+
return resp.json()
|
|
183
|
+
|
|
184
|
+
env_id = post("/environmentshub/resolve", {"name": env_name, **team})[
|
|
185
|
+
"data"
|
|
186
|
+
]["id"]
|
|
187
|
+
eval_id = post(
|
|
188
|
+
"/evaluations/",
|
|
189
|
+
{
|
|
190
|
+
"name": f"{env_name}--{config.model}--{config.uuid[:8]}",
|
|
191
|
+
"environments": [{"id": env_id}],
|
|
192
|
+
"model_name": config.model,
|
|
193
|
+
"dataset": env_name,
|
|
194
|
+
"framework": "verifiers",
|
|
195
|
+
"metadata": metadata,
|
|
196
|
+
"metrics": metrics,
|
|
197
|
+
"tags": [],
|
|
198
|
+
**team,
|
|
199
|
+
},
|
|
200
|
+
)["evaluation_id"]
|
|
201
|
+
post(f"/evaluations/{eval_id}/samples", {"samples": samples})
|
|
202
|
+
post(f"/evaluations/{eval_id}/finalize", {"metrics": metrics})
|
|
203
|
+
except Exception as e:
|
|
204
|
+
logger.warning("--push: upload failed (%s: %s); skipping", type(e).__name__, e)
|
|
205
|
+
return finish(error=f"{type(e).__name__}: {e}")
|
|
206
|
+
|
|
207
|
+
url = f"{frontend}/dashboard/evaluations/{eval_id}"
|
|
208
|
+
logger.info("--push: uploaded %d samples -> %s", len(samples), url)
|
|
209
|
+
return finish(url=url)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
`Trace.state` is a typed, mutable `State` that a rollout's tool servers (`@vf.tool`) and user
|
|
4
4
|
simulator (`respond`) read+write as `self.state` (synced over the interception server per call), and
|
|
5
5
|
that `@reward`/`@metric`/`finalize` read+write directly off the trace. Unlike `Trace.info` — the
|
|
6
|
-
free-form artifact bag persisted to `
|
|
6
|
+
free-form artifact bag persisted to `traces.jsonl` — `state` is transient runtime scratch (counters,
|
|
7
7
|
game progress, an end-of-trajectory flag): never written to disk or sent over the wire.
|
|
8
8
|
|
|
9
9
|
The base `State` is empty — the framework holds no opinion about its contents. Subclass it to declare
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
A `Trace[TaskT]` carries the typed task plus everything produced during a
|
|
4
4
|
rollout (conversation, per-turn responses, reward, metrics, timing, error). It is
|
|
5
|
-
the canonical full data dump — written to disk (`
|
|
5
|
+
the canonical full data dump — written to disk (`traces.jsonl`) and consumed by
|
|
6
6
|
the platform (visualization) and prime-rl (training). Environments subclass it to
|
|
7
7
|
add typed scratch/result fields. The rollout mutates it directly; this replaces
|
|
8
8
|
v1's 600-line `dict`-subclass `State` and its dual "contract version" machinery.
|
|
@@ -234,7 +234,7 @@ class Trace(StrictBaseModel, Generic[TaskT, StateT]):
|
|
|
234
234
|
a reward nor a metric — anything an author wants to scrape off the live runtime and persist
|
|
235
235
|
with the trace (captured logs, command output, container/runtime state, artifact paths).
|
|
236
236
|
Populate it from the runtime in `finalize` (or a `@reward`/`@metric`) by assigning into the
|
|
237
|
-
dict (`trace.info["build_log"] = ...`); it round-trips through the wire to `
|
|
237
|
+
dict (`trace.info["build_log"] = ...`); it round-trips through the wire to `traces.jsonl`.
|
|
238
238
|
Use `metrics` for numbers that aggregate, this for everything else. Values must be
|
|
239
239
|
JSON-serializable — a non-serializable value fails the trace dump rather than being dropped."""
|
|
240
240
|
state: StateT = Field(default_factory=State, exclude=True)
|
|
@@ -464,7 +464,7 @@ class Trace(StrictBaseModel, Generic[TaskT, StateT]):
|
|
|
464
464
|
self.stop("error")
|
|
465
465
|
|
|
466
466
|
def to_record(self) -> dict[str, Any]:
|
|
467
|
-
"""A JSON-serializable record of this rollout for `
|
|
467
|
+
"""A JSON-serializable record of this rollout for `traces.jsonl` / W&B tables.
|
|
468
468
|
|
|
469
469
|
`model_dump(mode="json")` minus the per-node training tensors (`_NODE_DUMP_EXCLUDE`):
|
|
470
470
|
those carry raw numpy bytes that JSON can't encode (the plain dump raises
|