verifiers 0.3.2.dev156__tar.gz → 0.3.2.dev158__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.3.2.dev156 → verifiers-0.3.2.dev158}/PKG-INFO +1 -1
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/__init__.py +2 -2
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/env.py +5 -30
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/artifacts.py +61 -2
- verifiers-0.3.2.dev158/verifiers/v1/utils/generic.py +105 -0
- verifiers-0.3.2.dev156/verifiers/v1/utils/generic.py +0 -53
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/.gitignore +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/LICENSE +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/README.md +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/pyproject.toml +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/conftest.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_configs.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_envs.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_graph.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_judges.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_platform_run.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_serve_delta.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_trace.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/agent.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/select.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/env.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/episode.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/errors.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/graph.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judge.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/apptainer.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/container.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/delta.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/session.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/state.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/task.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/compose.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/env.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/trace.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/types.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/scope.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/trace_store.py +0 -0
- {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.3.2.
|
|
3
|
+
Version: 0.3.2.dev158
|
|
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
|
|
@@ -15,7 +15,6 @@ from verifiers.v1.clients import (
|
|
|
15
15
|
)
|
|
16
16
|
from verifiers.v1.configs.agent import AgentConfig
|
|
17
17
|
from verifiers.v1.configs.cli.env import (
|
|
18
|
-
merge_env_defaults,
|
|
19
18
|
narrowed_env_annotation,
|
|
20
19
|
resolve_env_field,
|
|
21
20
|
)
|
|
@@ -153,6 +152,7 @@ from verifiers.v1.utils.decorators import (
|
|
|
153
152
|
stop,
|
|
154
153
|
tool,
|
|
155
154
|
)
|
|
155
|
+
from verifiers.v1.utils.generic import merge_defaults
|
|
156
156
|
from verifiers.v1.utils.git import (
|
|
157
157
|
PATCH_CAP_BYTES as PATCH_CAP_BYTES,
|
|
158
158
|
)
|
|
@@ -321,7 +321,7 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
|
|
|
321
321
|
"SharedEnvConfig",
|
|
322
322
|
"ServeConfig",
|
|
323
323
|
"resolve_env_field",
|
|
324
|
-
"
|
|
324
|
+
"merge_defaults",
|
|
325
325
|
"narrowed_env_annotation",
|
|
326
326
|
"SingleAgentEnvConfig",
|
|
327
327
|
"AgentConfig",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Run-config plumbing around the `[env]` block: narrowing the `env` field of
|
|
2
|
-
every config that owns one
|
|
2
|
+
every config that owns one. `merge_defaults` (`utils/generic.py`) layers shared env
|
|
3
|
+
defaults under it.
|
|
3
4
|
|
|
4
5
|
A run composes the blocks it needs — `[env]` (what runs, `configs/env.py`),
|
|
5
6
|
`[serve]` (how it's hosted, `configs/serve.py`) — plus its own fields. Nothing here is a base class: the eval
|
|
@@ -10,11 +11,11 @@ single_agent_env_config)`. The `SerializeAsAny` is load-bearing: pydantic serial
|
|
|
10
11
|
by declared type, so a plain `EnvConfig` silently drops a narrowed subclass's agents
|
|
11
12
|
and knobs from `model_dump()` — the env-server wire's payload."""
|
|
12
13
|
|
|
13
|
-
from pydantic import
|
|
14
|
+
from pydantic import ValidationError
|
|
14
15
|
from pydantic_config import BaseConfig
|
|
15
16
|
|
|
16
|
-
from verifiers.v1.configs.env import EnvConfig
|
|
17
|
-
from verifiers.v1.utils.generic import
|
|
17
|
+
from verifiers.v1.configs.env import EnvConfig
|
|
18
|
+
from verifiers.v1.utils.generic import prefix_validation_error
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
def resolve_env_field(data: dict, narrowed: "type[EnvConfig] | None" = None) -> dict:
|
|
@@ -45,32 +46,6 @@ def resolve_env_field(data: dict, narrowed: "type[EnvConfig] | None" = None) ->
|
|
|
45
46
|
return data
|
|
46
47
|
|
|
47
48
|
|
|
48
|
-
def merge_env_defaults(defaults: SharedEnvConfig, env: dict | None) -> dict:
|
|
49
|
-
"""A raw `env` block over `defaults`, the knobs that several envs of one run share
|
|
50
|
-
(e.g. the retries of every eval source). Only the fields set in `defaults` apply,
|
|
51
|
-
and the env's own values win. A subtree whose `id`/`type` differs from the
|
|
52
|
-
default's is the env's alone, so one plugin's knobs never leak into another's."""
|
|
53
|
-
return deep_merge(_dump_set(defaults), env or {})
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def _dump_set(config: BaseModel) -> dict:
|
|
57
|
-
"""`config`'s set fields, including those set on a sub-config after construction
|
|
58
|
-
(which leaves the parent's field unmarked). Each dumped sub-config keeps its
|
|
59
|
-
`id`/`type` even at the default: `deep_merge` detects a plugin switch only when
|
|
60
|
-
both sides name it."""
|
|
61
|
-
dump = {}
|
|
62
|
-
for name in type(config).model_fields:
|
|
63
|
-
value = getattr(config, name)
|
|
64
|
-
if isinstance(value, BaseModel):
|
|
65
|
-
nested = _dump_set(value)
|
|
66
|
-
if nested or name in config.model_fields_set:
|
|
67
|
-
keys = [k for k in ("id", "type") if k in type(value).model_fields]
|
|
68
|
-
dump[name] = {**{k: getattr(value, k) for k in keys}, **nested}
|
|
69
|
-
elif name in config.model_fields_set:
|
|
70
|
-
dump[name] = config.model_dump(include={name})[name]
|
|
71
|
-
return dump
|
|
72
|
-
|
|
73
|
-
|
|
74
49
|
def narrowed_env_annotation(cls) -> "type[EnvConfig] | None":
|
|
75
50
|
"""The env field's annotation when the CLI pre-narrowed it (`narrow_config`
|
|
76
51
|
swaps in a concrete subclass). The base declaration reads as `EnvConfig` itself
|
|
@@ -141,7 +141,8 @@ async def restore(runtime: Runtime, collected: dict[str, bytes | None]) -> None:
|
|
|
141
141
|
|
|
142
142
|
Archive bytes are untrusted: the agent controls both their source files and the
|
|
143
143
|
runtime tooling that creates them. Every archive is therefore validated on the host
|
|
144
|
-
before the grading runtime is changed.
|
|
144
|
+
before the grading runtime is changed. Regular files, directories, and confined links
|
|
145
|
+
can travel; link chains and extraction through symlinks cannot.
|
|
145
146
|
"""
|
|
146
147
|
if not collected:
|
|
147
148
|
return
|
|
@@ -214,6 +215,9 @@ def _validate_restore(root: str, archive: bytes | None) -> None:
|
|
|
214
215
|
|
|
215
216
|
try:
|
|
216
217
|
with tarfile.open(fileobj=io.BytesIO(archive), mode="r:") as tar:
|
|
218
|
+
regular_files: set[PurePosixPath] = set()
|
|
219
|
+
members: set[PurePosixPath] = set()
|
|
220
|
+
symlinks: dict[PurePosixPath, str] = {}
|
|
217
221
|
for member in tar:
|
|
218
222
|
member_path = PurePosixPath(member.name)
|
|
219
223
|
destination = PurePosixPath("/") / member_path
|
|
@@ -227,10 +231,65 @@ def _validate_restore(root: str, archive: bytes | None) -> None:
|
|
|
227
231
|
f"artifact member {member.name!r} is outside declared root "
|
|
228
232
|
f"{root!r}"
|
|
229
233
|
)
|
|
230
|
-
if
|
|
234
|
+
if member_path in members:
|
|
235
|
+
raise RuntimeError(f"duplicate artifact member {member.name!r}")
|
|
236
|
+
members.add(member_path)
|
|
237
|
+
if member.issym():
|
|
238
|
+
symlinks[member_path] = member.linkname
|
|
239
|
+
elif member.islnk():
|
|
240
|
+
# Tar deduplicates hard-linked build outputs (e.g. Cargo's build
|
|
241
|
+
# scripts). A target must already be a regular member of this
|
|
242
|
+
# archive, never a path supplied by the verifier image.
|
|
243
|
+
target = PurePosixPath(member.linkname)
|
|
244
|
+
if (
|
|
245
|
+
not member.linkname
|
|
246
|
+
or target.is_absolute()
|
|
247
|
+
or ".." in target.parts
|
|
248
|
+
or target not in regular_files
|
|
249
|
+
or target == member_path
|
|
250
|
+
):
|
|
251
|
+
raise RuntimeError(
|
|
252
|
+
f"artifact hard link {member.name!r} has unsafe target "
|
|
253
|
+
f"{member.linkname!r}"
|
|
254
|
+
)
|
|
255
|
+
elif not (member.isfile() or member.isdir()):
|
|
231
256
|
raise RuntimeError(
|
|
232
257
|
f"artifact member {member.name!r} is a link or special file"
|
|
233
258
|
)
|
|
259
|
+
if member.isfile():
|
|
260
|
+
regular_files.add(member_path)
|
|
261
|
+
# Check after reading the whole archive, so a later symlink cannot
|
|
262
|
+
# turn an earlier member's parent or a link target into a redirection.
|
|
263
|
+
for member_path in members:
|
|
264
|
+
if any(parent in symlinks for parent in member_path.parents):
|
|
265
|
+
raise RuntimeError(
|
|
266
|
+
f"artifact member {str(member_path)!r} traverses a symlink"
|
|
267
|
+
)
|
|
268
|
+
relative_root = root_path.relative_to("/")
|
|
269
|
+
for member_path, linkname in symlinks.items():
|
|
270
|
+
target = PurePosixPath(linkname)
|
|
271
|
+
if not linkname or target.is_absolute():
|
|
272
|
+
raise RuntimeError(
|
|
273
|
+
f"artifact symlink {str(member_path)!r} has unsafe target "
|
|
274
|
+
f"{linkname!r}"
|
|
275
|
+
)
|
|
276
|
+
resolved = member_path.parent
|
|
277
|
+
if not resolved.is_relative_to(relative_root):
|
|
278
|
+
raise RuntimeError(
|
|
279
|
+
f"artifact symlink {str(member_path)!r} has unsafe target "
|
|
280
|
+
f"{linkname!r}"
|
|
281
|
+
)
|
|
282
|
+
# Walk before normalizing '..': a/../b is unsafe if a is itself
|
|
283
|
+
# a symlink. Missing internal targets are safe (e.g. build outputs).
|
|
284
|
+
for part in target.parts:
|
|
285
|
+
resolved = resolved.parent if part == ".." else resolved / part
|
|
286
|
+
if not resolved.is_relative_to(relative_root) or any(
|
|
287
|
+
path in symlinks for path in (resolved, *resolved.parents)
|
|
288
|
+
):
|
|
289
|
+
raise RuntimeError(
|
|
290
|
+
f"artifact symlink {str(member_path)!r} has unsafe target "
|
|
291
|
+
f"{linkname!r}"
|
|
292
|
+
)
|
|
234
293
|
except tarfile.TarError as exc:
|
|
235
294
|
raise RuntimeError(f"unreadable artifact archive for {root!r}: {exc}") from exc
|
|
236
295
|
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""Generic helpers shared across v1 modules."""
|
|
2
|
+
|
|
3
|
+
from typing import TypeVar, get_args, get_origin
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, ValidationError
|
|
6
|
+
|
|
7
|
+
T = TypeVar("T")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def prefix_validation_error(e: ValidationError, prefix: tuple) -> ValidationError:
|
|
11
|
+
"""`e` with `prefix` prepended to every error's loc. A sub-model validated
|
|
12
|
+
inside a `mode="before"` validator surfaces its errors at the validator's own
|
|
13
|
+
loc, so without re-raising prefixed the CLI renders a flag path missing the
|
|
14
|
+
segments the user actually typed."""
|
|
15
|
+
return ValidationError.from_exception_data(
|
|
16
|
+
e.title,
|
|
17
|
+
[
|
|
18
|
+
{**err, "loc": prefix + tuple(err["loc"])}
|
|
19
|
+
for err in e.errors(include_url=False)
|
|
20
|
+
],
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def deep_merge(base: dict, override: dict) -> dict:
|
|
25
|
+
"""`override` onto `base`, recursing into dicts, so a partial nested override
|
|
26
|
+
keeps the untouched keys of the declared default. An override that switches a
|
|
27
|
+
subtree's discriminator (`id`/`type`) replaces the subtree wholesale — the old
|
|
28
|
+
plugin's fields must not leak into the new type's validation."""
|
|
29
|
+
merged = dict(base)
|
|
30
|
+
for key, value in override.items():
|
|
31
|
+
if isinstance(value, dict) and isinstance(merged.get(key), dict):
|
|
32
|
+
switched = any(
|
|
33
|
+
k in value and k in merged[key] and value[k] != merged[key][k]
|
|
34
|
+
for k in ("id", "type")
|
|
35
|
+
)
|
|
36
|
+
merged[key] = value if switched else deep_merge(merged[key], value)
|
|
37
|
+
else:
|
|
38
|
+
merged[key] = value
|
|
39
|
+
return merged
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def merge_defaults(defaults: BaseModel, raw: dict | None) -> dict:
|
|
43
|
+
"""Fill in a raw config block with the values that `defaults` sets, e.g. a
|
|
44
|
+
group's shared knobs under each member's own block.
|
|
45
|
+
|
|
46
|
+
- Only fields that were set on `defaults` are filled in; its plain defaults are not.
|
|
47
|
+
- Nested blocks are filled in key by key; a value already in `raw` is kept.
|
|
48
|
+
- If `raw` names a different `id`/`type` for a block (at any depth), that block is
|
|
49
|
+
taken from `raw` alone, so one plugin's fields never leak into another's.
|
|
50
|
+
|
|
51
|
+
For example, with `defaults` set to `algo = {type = "grpo", kl = 0.1}`:
|
|
52
|
+
`{}` becomes `{type = "grpo", kl = 0.1}`, `{kl = 0.5}` becomes
|
|
53
|
+
`{type = "grpo", kl = 0.5}`, and `{type = "max_rl"}` stays `{type = "max_rl"}`.
|
|
54
|
+
"""
|
|
55
|
+
# `deep_merge` detects an `id`/`type` switch only on nested blocks, so wrap the
|
|
56
|
+
# block once to detect a switch of the block itself too.
|
|
57
|
+
identity = {
|
|
58
|
+
k: getattr(defaults, k)
|
|
59
|
+
for k in ("id", "type")
|
|
60
|
+
if k in type(defaults).model_fields
|
|
61
|
+
}
|
|
62
|
+
block = {**identity, **_dump_set(defaults)}
|
|
63
|
+
return deep_merge({"block": block}, {"block": raw or {}})["block"]
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _dump_set(config: BaseModel) -> dict:
|
|
67
|
+
"""The fields set on `config`, including extra fields, as a nested dict. A
|
|
68
|
+
sub-config the parent did not set still counts when its own fields changed after
|
|
69
|
+
construction (pydantic then leaves the parent's field unmarked), but not when it
|
|
70
|
+
only matches the field's default, which may itself be built with arguments. A
|
|
71
|
+
dumped sub-config always includes its `id`/`type`, because `deep_merge` detects a
|
|
72
|
+
switch only when both sides name it."""
|
|
73
|
+
dump = {}
|
|
74
|
+
for name, field in type(config).model_fields.items():
|
|
75
|
+
value = getattr(config, name)
|
|
76
|
+
if isinstance(value, BaseModel):
|
|
77
|
+
nested = _dump_set(value)
|
|
78
|
+
if name not in config.model_fields_set:
|
|
79
|
+
default = field.get_default(
|
|
80
|
+
call_default_factory=True, validated_data=config.__dict__
|
|
81
|
+
)
|
|
82
|
+
if isinstance(default, BaseModel) and nested == _dump_set(default):
|
|
83
|
+
continue
|
|
84
|
+
if nested or name in config.model_fields_set:
|
|
85
|
+
keys = [k for k in ("id", "type") if k in type(value).model_fields]
|
|
86
|
+
dump[name] = {**{k: getattr(value, k) for k in keys}, **nested}
|
|
87
|
+
elif name in config.model_fields_set:
|
|
88
|
+
dump[name] = config.model_dump(include={name})[name]
|
|
89
|
+
# Extra fields of an `extra="allow"` model exist only because they were set.
|
|
90
|
+
dump.update(config.model_dump(include=set(config.model_extra or {})))
|
|
91
|
+
return dump
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def concrete_type(
|
|
95
|
+
cls: type, bound: type[T], *, origin: type | None = None
|
|
96
|
+
) -> type[T] | None:
|
|
97
|
+
"""Find a concrete bounded type through `cls`'s MRO, most-derived first."""
|
|
98
|
+
for klass in cls.__mro__:
|
|
99
|
+
for base in getattr(klass, "__orig_bases__", ()):
|
|
100
|
+
if origin is not None and get_origin(base) is not origin:
|
|
101
|
+
continue
|
|
102
|
+
for arg in get_args(base):
|
|
103
|
+
if isinstance(arg, type) and issubclass(arg, bound):
|
|
104
|
+
return arg
|
|
105
|
+
return None
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"""Generic helpers shared across v1 modules."""
|
|
2
|
-
|
|
3
|
-
from typing import TypeVar, get_args, get_origin
|
|
4
|
-
|
|
5
|
-
from pydantic import ValidationError
|
|
6
|
-
|
|
7
|
-
T = TypeVar("T")
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def prefix_validation_error(e: ValidationError, prefix: tuple) -> ValidationError:
|
|
11
|
-
"""`e` with `prefix` prepended to every error's loc. A sub-model validated
|
|
12
|
-
inside a `mode="before"` validator surfaces its errors at the validator's own
|
|
13
|
-
loc, so without re-raising prefixed the CLI renders a flag path missing the
|
|
14
|
-
segments the user actually typed."""
|
|
15
|
-
return ValidationError.from_exception_data(
|
|
16
|
-
e.title,
|
|
17
|
-
[
|
|
18
|
-
{**err, "loc": prefix + tuple(err["loc"])}
|
|
19
|
-
for err in e.errors(include_url=False)
|
|
20
|
-
],
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def deep_merge(base: dict, override: dict) -> dict:
|
|
25
|
-
"""`override` onto `base`, recursing into dicts, so a partial nested override
|
|
26
|
-
keeps the untouched keys of the declared default. An override that switches a
|
|
27
|
-
subtree's discriminator (`id`/`type`) replaces the subtree wholesale — the old
|
|
28
|
-
plugin's fields must not leak into the new type's validation."""
|
|
29
|
-
merged = dict(base)
|
|
30
|
-
for key, value in override.items():
|
|
31
|
-
if isinstance(value, dict) and isinstance(merged.get(key), dict):
|
|
32
|
-
switched = any(
|
|
33
|
-
k in value and k in merged[key] and value[k] != merged[key][k]
|
|
34
|
-
for k in ("id", "type")
|
|
35
|
-
)
|
|
36
|
-
merged[key] = value if switched else deep_merge(merged[key], value)
|
|
37
|
-
else:
|
|
38
|
-
merged[key] = value
|
|
39
|
-
return merged
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def concrete_type(
|
|
43
|
-
cls: type, bound: type[T], *, origin: type | None = None
|
|
44
|
-
) -> type[T] | None:
|
|
45
|
-
"""Find a concrete bounded type through `cls`'s MRO, most-derived first."""
|
|
46
|
-
for klass in cls.__mro__:
|
|
47
|
-
for base in getattr(klass, "__orig_bases__", ()):
|
|
48
|
-
if origin is not None and get_origin(base) is not origin:
|
|
49
|
-
continue
|
|
50
|
-
for arg in get_args(base):
|
|
51
|
-
if isinstance(arg, type) and issubclass(arg, bound):
|
|
52
|
-
return arg
|
|
53
|
-
return None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/tool_response_image_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/agentic_judge/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/isolated_verifier/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/isolated_verifier/env.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/shared_agentic_judge/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/single_agent/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/browser_use/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/browser_use/harness.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/browser_use/program.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/claude_code/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/claude_code/harness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|