verifiers 0.1.15.dev168__tar.gz → 0.1.15.dev169__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.dev168 → verifiers-0.1.15.dev169}/PKG-INFO +5 -1
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/pyproject.toml +4 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/README.md +35 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/__init__.py +5 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +52 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +5 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +17 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +5 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +275 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +1119 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +1271 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +5 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +15 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +4 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +15 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +7 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +45 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +107 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +106 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +69 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +27 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +153 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +667 -0
- verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +26 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/.gitignore +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/LICENSE +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/README.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/README.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_eval_cli.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_langchain_deep_agents_wikispeedia.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_lean_task.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_mcp_search_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_opencode_harbor.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_bfcl.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_config_extension.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_empty_completions.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_endpoint_protocols.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_example_counts.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_group_reward_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_harbor_cli.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_nemo_gym_harness.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_openenv_taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_openreward_taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_replay_harness.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_rlm_swe.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_runtime_lifecycle.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_scoring_functions.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_taskset_bindings.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_taskset_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_v1_textarena_taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_wiki_search_v1.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_wordle_v1_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/ENVIRONMENT_BEST_PRACTICES.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/RE_MIGRATION.md +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/artifact.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/config.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/model.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/program.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/runtime.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/runtime_handles.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/sandbox.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/toolset.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/user.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/binding_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/config_callable_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/endpoint_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/json_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/judge_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/lifecycle_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/mcp_proxy_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/mcp_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/object_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/program_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/prompt_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/runtime_owner_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/runtime_registry.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/sandbox_program_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/sandbox_python_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/sandbox_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/scoring_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/serialization_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/task_freeze_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/taskset_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/toolset_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/trajectory_utils.py +0 -0
- {verifiers-0.1.15.dev168 → verifiers-0.1.15.dev169}/verifiers/v1/utils/usage_utils.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.dev169
|
|
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
|
|
@@ -22,8 +22,10 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
22
22
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
23
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
24
|
Requires-Python: <3.14,>=3.10
|
|
25
|
+
Requires-Dist: aiohttp>=3.9.0
|
|
25
26
|
Requires-Dist: aiolimiter>=1.2.1
|
|
26
27
|
Requires-Dist: anthropic>=0.78.0
|
|
28
|
+
Requires-Dist: certifi
|
|
27
29
|
Requires-Dist: datasets<4.7.0,>=3.0.0
|
|
28
30
|
Requires-Dist: gepa
|
|
29
31
|
Requires-Dist: httpx>=0.27.0
|
|
@@ -35,10 +37,12 @@ Requires-Dist: nest-asyncio>=1.6.0
|
|
|
35
37
|
Requires-Dist: numpy
|
|
36
38
|
Requires-Dist: openai-agents>=0.0.7
|
|
37
39
|
Requires-Dist: openai>=1.108.1
|
|
40
|
+
Requires-Dist: pillow
|
|
38
41
|
Requires-Dist: prime-pydantic-config[toml]
|
|
39
42
|
Requires-Dist: prime-sandboxes>=0.2.25
|
|
40
43
|
Requires-Dist: prime-tunnel>=0.1.6
|
|
41
44
|
Requires-Dist: pydantic>=2.11.9
|
|
45
|
+
Requires-Dist: pymupdf
|
|
42
46
|
Requires-Dist: pyzmq>=27.1.0
|
|
43
47
|
Requires-Dist: regex<2026.4.4
|
|
44
48
|
Requires-Dist: requests
|
|
@@ -53,6 +53,10 @@ dependencies = [
|
|
|
53
53
|
"setproctitle>=1.3.0",
|
|
54
54
|
"regex<2026.4.4",
|
|
55
55
|
"httpx>=0.27.0",
|
|
56
|
+
"aiohttp>=3.9.0",
|
|
57
|
+
"pymupdf",
|
|
58
|
+
"pillow",
|
|
59
|
+
"certifi",
|
|
56
60
|
"prime-pydantic-config[toml]",
|
|
57
61
|
"uvloop>=0.21.0; sys_platform != 'win32' and sys_platform != 'cygwin' and platform_python_implementation != 'PyPy'",
|
|
58
62
|
]
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
| `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 |
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from verifiers.envs.experimental.composable.tasksets.search import make_search_taskset
|
|
17
|
+
|
|
18
|
+
taskset = make_search_taskset(backend="quest", category="objective")
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`make_search_taskset()` dispatches by backend name. Unknown backends raise `ValueError` with the available backend list.
|
|
22
|
+
|
|
23
|
+
## Output Contract
|
|
24
|
+
|
|
25
|
+
Search tasksets should define their own output contract. The initial `quest` backend expects 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.
|
|
26
|
+
|
|
27
|
+
## Error Handling
|
|
28
|
+
|
|
29
|
+
Search tasksets should use the framework error taxonomy for infrastructure failures:
|
|
30
|
+
|
|
31
|
+
- `vf.SandboxError` for sandbox setup, command, or lifecycle failures.
|
|
32
|
+
- `vf.ModelError` for judge/model provider failures.
|
|
33
|
+
- `vf.InfraError` for dataset, evaluator, or external runtime failures.
|
|
34
|
+
|
|
35
|
+
Incorrect answers should not set `state["error"]`; they should score normally, often as `0.0`.
|
verifiers-0.1.15.dev169/verifiers/envs/experimental/composable/tasksets/search/quest/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# QUEST Search Taskset
|
|
2
|
+
|
|
3
|
+
Objective QUEST tasks ported into the composable search taskset framework.
|
|
4
|
+
|
|
5
|
+
## Source
|
|
6
|
+
|
|
7
|
+
- Dataset: [`osunlp/QUEST-RL-Data`](https://huggingface.co/datasets/osunlp/QUEST-RL-Data)
|
|
8
|
+
- Upstream project: [`OSU-NLP-Group/QUEST`](https://github.com/OSU-NLP-Group/QUEST)
|
|
9
|
+
|
|
10
|
+
The taskset loads the Hugging Face dataset, filters to `rl_task_category == "objective"` by default, and uses the dataset-provided generated evaluation scripts under `eval_scripts/*.py`.
|
|
11
|
+
|
|
12
|
+
## Task Contract
|
|
13
|
+
|
|
14
|
+
Each example is a live research question. The agent should produce one final answer in `/task/answer.txt`.
|
|
15
|
+
|
|
16
|
+
The paired `rlm_search` environment prompts RLM to write this file and provides web search/open-page skills. The rubric can fall back to the final assistant text if the answer file is empty, but agents should still write the file directly.
|
|
17
|
+
|
|
18
|
+
## Scoring
|
|
19
|
+
|
|
20
|
+
`QuestRubric` loads the generated eval script for the example's `task_id` and calls its async `evaluate_answer(...)` entrypoint using the vendored minimal `obj_task_eval` runtime. The rollout reward is `summary["final_score"]`, clipped to `[0.0, 1.0]`.
|
|
21
|
+
|
|
22
|
+
Generated scripts may request URL-backed verification. PDF URLs are detected and parsed with the upstream QUEST PDF parser path before falling back to generic webpage retrieval.
|
|
23
|
+
|
|
24
|
+
This port intentionally preserves upstream QUEST behavior for URL-backed verification semantics. The upstream verifier generally treats invalid, irrelevant, or inaccessible cited webpages as unsupported claims, which can assign `0.0` to the affected verification node even when the immediate cause is source access such as a bot challenge, rate limit, timeout, or parser failure. Future work should consider a finer-grained source-access taxonomy so verifier infrastructure limitations can be distinguished from model-provided bad URLs or unsupported claims.
|
|
25
|
+
|
|
26
|
+
A reward of `0.0` with no `state["error"]` means the QUEST evaluator ran and judged the answer incorrect under the upstream-compatible scoring path. Infrastructure and evaluator failures outside normal QUEST source verification are represented with `vf.Error` subclasses instead of ad hoc success metrics.
|
|
27
|
+
|
|
28
|
+
## Error Handling
|
|
29
|
+
|
|
30
|
+
QUEST uses Verifiers' framework-managed error field for non-answer failures when the failure comes from external runtime systems:
|
|
31
|
+
|
|
32
|
+
- Missing live sandbox or answer-file read failure: `vf.SandboxError`.
|
|
33
|
+
- Transient judge provider/network/rate-limit/server failures: retryable `vf.InfraError`.
|
|
34
|
+
- Empty or invalid judge responses: retryable `vf.InvalidModelResponseError` / `vf.EmptyModelResponseError`.
|
|
35
|
+
- Judge auth, model-not-found, content-filter, or invalid request failures: non-retryable `vf.ModelError`.
|
|
36
|
+
- QUEST eval-script download/cache resolution failure: `vf.InfraError`.
|
|
37
|
+
|
|
38
|
+
Wrong answers, empty answers, and inaccessible or irrelevant cited sources remain ordinary scored outcomes and return `0.0` without setting `state["error"]`. Generated eval-script source errors, missing task metadata, missing eval-script files, import/load failures, and unexpected evaluator runtime bugs are not converted to `vf.Error`; they raise normally so broken evaluator code fails hard.
|
|
39
|
+
|
|
40
|
+
## Common Arguments
|
|
41
|
+
|
|
42
|
+
| Argument | Default | Description |
|
|
43
|
+
|---|---:|---|
|
|
44
|
+
| `dataset_name` | `osunlp/QUEST-RL-Data` | Hugging Face dataset name. |
|
|
45
|
+
| `split` | `train` | Dataset split. |
|
|
46
|
+
| `category` | `objective` | Initial implementation supports objective tasks only. |
|
|
47
|
+
| `answer_file` | `/task/answer.txt` | Final answer path in the sandbox. |
|
|
48
|
+
| `judge_model` | `openai/gpt-5.4-mini` | OpenAI-compatible model for QUEST verifier calls. |
|
|
49
|
+
| `judge_base_url` | `https://api.pinference.ai/api/v1` | Judge API base URL. |
|
|
50
|
+
| `judge_api_key_var` | `PRIME_API_KEY` | Env var containing the judge API key. |
|
|
51
|
+
| `quest_eval_scripts_dir` | HF cache | Optional local directory containing `eval_scripts/*.py`. |
|
|
52
|
+
| `quest_cache_dir` | `~/.cache/verifiers/quest` | Host cache for QUEST verifier state. |
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Vendored QUEST objective evaluation runtime."""
|
|
2
|
+
|
|
3
|
+
from .eval_toolkit import BinaryEvalResult, Extractor, Verifier, create_evaluator
|
|
4
|
+
from .evaluator import Evaluator
|
|
5
|
+
from .utils import CacheFileSys
|
|
6
|
+
from .verification_tree import AggregationStrategy, VerificationNode
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"AggregationStrategy",
|
|
10
|
+
"BinaryEvalResult",
|
|
11
|
+
"CacheFileSys",
|
|
12
|
+
"Evaluator",
|
|
13
|
+
"Extractor",
|
|
14
|
+
"Verifier",
|
|
15
|
+
"VerificationNode",
|
|
16
|
+
"create_evaluator",
|
|
17
|
+
]
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"""Lightweight PDF parser from QUEST objective evaluation.
|
|
2
|
+
|
|
3
|
+
The parser accepts a URL, local path, bytes, or ``BytesIO`` object and returns
|
|
4
|
+
``(imgs, text)``. ``imgs`` is a list of base64-encoded page JPEGs and ``text``
|
|
5
|
+
is extracted page text. Failures return a blank image plus an explanatory text
|
|
6
|
+
message, matching upstream QUEST's tolerant evaluator behavior.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import base64
|
|
11
|
+
import random
|
|
12
|
+
from io import BytesIO
|
|
13
|
+
from logging import Logger
|
|
14
|
+
from typing import List, Optional, Tuple, Union
|
|
15
|
+
from urllib.parse import unquote, urlparse
|
|
16
|
+
|
|
17
|
+
import aiohttp
|
|
18
|
+
import certifi
|
|
19
|
+
import fitz
|
|
20
|
+
import httpx
|
|
21
|
+
import requests
|
|
22
|
+
from PIL import Image
|
|
23
|
+
|
|
24
|
+
from ..utils.url_tools import normalize_url_for_browser
|
|
25
|
+
|
|
26
|
+
PDF_MAGIC = b"%PDF-"
|
|
27
|
+
UA_CHROME = (
|
|
28
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
|
|
29
|
+
"AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
30
|
+
"Chrome/124.0.0.0 Safari/537.36"
|
|
31
|
+
)
|
|
32
|
+
USER_AGENT_STRINGS = [
|
|
33
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
|
|
34
|
+
"(KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
|
|
35
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
|
|
36
|
+
"(KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
|
|
37
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/537.36 "
|
|
38
|
+
"(KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 OPR/109.0.0.0",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def make_blank_png_b64() -> str:
|
|
43
|
+
"""Return a transparent 1x1 PNG as base64."""
|
|
44
|
+
img = Image.new("RGBA", (1, 1), (0, 0, 0, 0))
|
|
45
|
+
buf = BytesIO()
|
|
46
|
+
img.save(buf, format="PNG")
|
|
47
|
+
return base64.b64encode(buf.getvalue()).decode()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def is_pdf_by_suffix(url: str) -> bool:
|
|
51
|
+
"""Check whether a URL likely points to a PDF based on path/query patterns."""
|
|
52
|
+
parsed = urlparse(url.lower())
|
|
53
|
+
path = unquote(parsed.path)
|
|
54
|
+
if path.endswith(".pdf"):
|
|
55
|
+
return True
|
|
56
|
+
|
|
57
|
+
pdf_patterns = [
|
|
58
|
+
"arxiv.org/pdf/",
|
|
59
|
+
"/download/pdf",
|
|
60
|
+
"/fulltext.pdf",
|
|
61
|
+
"/article/pdf",
|
|
62
|
+
"/content/pdf",
|
|
63
|
+
"type=pdf",
|
|
64
|
+
"format=pdf",
|
|
65
|
+
"download=pdf",
|
|
66
|
+
".pdf?",
|
|
67
|
+
"/pdf/",
|
|
68
|
+
"pdfviewer",
|
|
69
|
+
]
|
|
70
|
+
url_lower = url.lower()
|
|
71
|
+
return any(pattern in url_lower for pattern in pdf_patterns)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def is_pdf_by_requests_head(url: str) -> bool:
|
|
75
|
+
"""Check via HEAD request whether a URL is a PDF."""
|
|
76
|
+
try:
|
|
77
|
+
response = requests.head(
|
|
78
|
+
url,
|
|
79
|
+
allow_redirects=True,
|
|
80
|
+
timeout=10,
|
|
81
|
+
verify=certifi.where(),
|
|
82
|
+
)
|
|
83
|
+
content_type = response.headers.get("content-type", "").lower()
|
|
84
|
+
return "pdf" in content_type
|
|
85
|
+
except requests.RequestException:
|
|
86
|
+
return False
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
async def is_pdf_by_httpx_get_range(url: str, timeout: int = 10) -> bool:
|
|
90
|
+
"""Check PDF via a partial GET request to read the file header."""
|
|
91
|
+
try:
|
|
92
|
+
async with httpx.AsyncClient(
|
|
93
|
+
follow_redirects=True,
|
|
94
|
+
timeout=timeout,
|
|
95
|
+
verify=False,
|
|
96
|
+
) as client:
|
|
97
|
+
headers = {
|
|
98
|
+
"User-Agent": random.choice(USER_AGENT_STRINGS),
|
|
99
|
+
"Range": "bytes=0-1023",
|
|
100
|
+
"Accept": "*/*",
|
|
101
|
+
}
|
|
102
|
+
response = await client.get(url, headers=headers)
|
|
103
|
+
content_type = (
|
|
104
|
+
response.headers.get("content-type", "").split(";")[0].strip().lower()
|
|
105
|
+
)
|
|
106
|
+
if "pdf" in content_type:
|
|
107
|
+
return True
|
|
108
|
+
return bool(response.content and response.content.startswith(PDF_MAGIC))
|
|
109
|
+
except (httpx.TimeoutException, httpx.ConnectError, httpx.HTTPError):
|
|
110
|
+
return False
|
|
111
|
+
except Exception:
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
async def is_pdf_by_full_get(url: str, timeout: int = 15) -> bool:
|
|
116
|
+
"""Last-resort PDF detection by streaming the start of the response body."""
|
|
117
|
+
try:
|
|
118
|
+
async with httpx.AsyncClient(
|
|
119
|
+
follow_redirects=True,
|
|
120
|
+
timeout=timeout,
|
|
121
|
+
verify=False,
|
|
122
|
+
) as client:
|
|
123
|
+
headers = {
|
|
124
|
+
"User-Agent": random.choice(USER_AGENT_STRINGS),
|
|
125
|
+
"Accept": "*/*",
|
|
126
|
+
}
|
|
127
|
+
async with client.stream("GET", url, headers=headers) as response:
|
|
128
|
+
chunk_data = b""
|
|
129
|
+
async for chunk in response.aiter_bytes(chunk_size=5):
|
|
130
|
+
chunk_data += chunk
|
|
131
|
+
if len(chunk_data) >= 5:
|
|
132
|
+
break
|
|
133
|
+
if chunk_data and chunk_data.startswith(PDF_MAGIC):
|
|
134
|
+
return True
|
|
135
|
+
content_type = (
|
|
136
|
+
response.headers.get("content-type", "")
|
|
137
|
+
.split(";")[0]
|
|
138
|
+
.strip()
|
|
139
|
+
.lower()
|
|
140
|
+
)
|
|
141
|
+
return "pdf" in content_type
|
|
142
|
+
except Exception:
|
|
143
|
+
return False
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
async def is_pdf(url: str, logger: Optional[Logger] = None) -> bool:
|
|
147
|
+
"""Robustly detect whether a URL points to a PDF file."""
|
|
148
|
+
url = normalize_url_for_browser(url)
|
|
149
|
+
if logger:
|
|
150
|
+
logger.debug(f"Checking if URL is PDF: {url}")
|
|
151
|
+
|
|
152
|
+
if is_pdf_by_suffix(url):
|
|
153
|
+
if logger:
|
|
154
|
+
logger.info(f"URL pattern indicates PDF: {url}")
|
|
155
|
+
return True
|
|
156
|
+
if is_pdf_by_requests_head(url):
|
|
157
|
+
if logger:
|
|
158
|
+
logger.info(f"HEAD request confirms PDF: {url}")
|
|
159
|
+
return True
|
|
160
|
+
if await is_pdf_by_httpx_get_range(url):
|
|
161
|
+
if logger:
|
|
162
|
+
logger.info(f"Partial GET confirms PDF: {url}")
|
|
163
|
+
return True
|
|
164
|
+
if await is_pdf_by_full_get(url):
|
|
165
|
+
if logger:
|
|
166
|
+
logger.info(f"Full GET confirms PDF: {url}")
|
|
167
|
+
return True
|
|
168
|
+
return False
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
class PDFParser:
|
|
172
|
+
"""Download and parse PDFs for QUEST source verification."""
|
|
173
|
+
|
|
174
|
+
MAX_PAGES: int = 100
|
|
175
|
+
MAX_IMAGE_PAGES: int = 50
|
|
176
|
+
RENDER_DPI: int = 144
|
|
177
|
+
JPEG_QUALITY: int = 70
|
|
178
|
+
|
|
179
|
+
async def extract(
|
|
180
|
+
self,
|
|
181
|
+
source: Union[str, bytes, BytesIO],
|
|
182
|
+
) -> Tuple[Optional[List[str]], Optional[str]]:
|
|
183
|
+
"""Extract page screenshots and text from a PDF source."""
|
|
184
|
+
try:
|
|
185
|
+
if isinstance(source, (bytes, BytesIO)):
|
|
186
|
+
data = source.getvalue() if isinstance(source, BytesIO) else source
|
|
187
|
+
elif isinstance(source, str) and source.lower().startswith(
|
|
188
|
+
("http://", "https://")
|
|
189
|
+
):
|
|
190
|
+
data = await self._fetch_pdf_bytes(source)
|
|
191
|
+
else:
|
|
192
|
+
data = await asyncio.to_thread(
|
|
193
|
+
lambda path: open(path, "rb").read(), str(source)
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
if not data.lstrip().startswith(PDF_MAGIC):
|
|
197
|
+
return [
|
|
198
|
+
make_blank_png_b64()
|
|
199
|
+
], "PDF extraction failed: Invalid PDF format"
|
|
200
|
+
|
|
201
|
+
return await asyncio.to_thread(self._extract_from_bytes, data)
|
|
202
|
+
except Exception as exc:
|
|
203
|
+
return [make_blank_png_b64()], f"PDF extraction failed: {exc}"
|
|
204
|
+
|
|
205
|
+
async def parse_url(self, url: str) -> str | None:
|
|
206
|
+
"""Compatibility helper returning text for a PDF URL."""
|
|
207
|
+
_imgs, text = await self.extract(url)
|
|
208
|
+
return text
|
|
209
|
+
|
|
210
|
+
def parse_bytes(self, data: bytes) -> str | None:
|
|
211
|
+
"""Compatibility helper returning text for PDF bytes."""
|
|
212
|
+
_imgs, text = self._extract_from_bytes(data)
|
|
213
|
+
return text
|
|
214
|
+
|
|
215
|
+
async def _fetch_pdf_bytes(self, url: str) -> bytes:
|
|
216
|
+
"""Fetch PDF bytes with a browser user agent and an arXiv backup domain."""
|
|
217
|
+
headers = {
|
|
218
|
+
"User-Agent": UA_CHROME,
|
|
219
|
+
"Accept": "application/pdf,application/octet-stream;q=0.9,*/*;q=0.8",
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
async def download(fetch_url: str) -> bytes:
|
|
223
|
+
async with aiohttp.ClientSession(headers=headers) as session:
|
|
224
|
+
async with session.get(
|
|
225
|
+
fetch_url, allow_redirects=True, timeout=30
|
|
226
|
+
) as response:
|
|
227
|
+
response.raise_for_status()
|
|
228
|
+
return await response.read()
|
|
229
|
+
|
|
230
|
+
data = await download(url)
|
|
231
|
+
if not data.lstrip().startswith(PDF_MAGIC) and "arxiv.org" in url:
|
|
232
|
+
backup = url.replace("://arxiv.org", "://export.arxiv.org")
|
|
233
|
+
try:
|
|
234
|
+
data = await download(backup)
|
|
235
|
+
except Exception:
|
|
236
|
+
pass
|
|
237
|
+
return data
|
|
238
|
+
|
|
239
|
+
def _extract_from_bytes(
|
|
240
|
+
self, data: bytes
|
|
241
|
+
) -> Tuple[Optional[List[str]], Optional[str]]:
|
|
242
|
+
"""Parse PDF bytes into page images and text."""
|
|
243
|
+
if not data.lstrip().startswith(PDF_MAGIC):
|
|
244
|
+
return [make_blank_png_b64()], "PDF extraction failed: Invalid PDF format"
|
|
245
|
+
|
|
246
|
+
try:
|
|
247
|
+
doc = fitz.open(stream=data, filetype="pdf")
|
|
248
|
+
except (fitz.FileDataError, RuntimeError):
|
|
249
|
+
return [
|
|
250
|
+
make_blank_png_b64()
|
|
251
|
+
], "PDF extraction failed: Unable to parse PDF file"
|
|
252
|
+
|
|
253
|
+
imgs: List[str] = []
|
|
254
|
+
texts: List[str] = []
|
|
255
|
+
zoom = self.RENDER_DPI / 72
|
|
256
|
+
max_pages = min(self.MAX_PAGES, doc.page_count)
|
|
257
|
+
max_img_pages = min(self.MAX_IMAGE_PAGES, doc.page_count)
|
|
258
|
+
|
|
259
|
+
for index in range(max_pages):
|
|
260
|
+
page = doc.load_page(index)
|
|
261
|
+
texts.append(page.get_text("text"))
|
|
262
|
+
if index < max_img_pages:
|
|
263
|
+
pix = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom), alpha=False)
|
|
264
|
+
img = Image.frombytes("RGB", (pix.width, pix.height), pix.samples)
|
|
265
|
+
buf = BytesIO()
|
|
266
|
+
img.save(
|
|
267
|
+
buf,
|
|
268
|
+
"JPEG",
|
|
269
|
+
quality=self.JPEG_QUALITY,
|
|
270
|
+
optimize=True,
|
|
271
|
+
progressive=True,
|
|
272
|
+
)
|
|
273
|
+
imgs.append(base64.b64encode(buf.getvalue()).decode())
|
|
274
|
+
doc.close()
|
|
275
|
+
return imgs, "\n".join(texts)
|