verifiers 0.3.2.dev101__tar.gz → 0.3.2.dev103__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.dev101 → verifiers-0.3.2.dev103}/PKG-INFO +1 -1
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_graph.py +76 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_serve_delta.py +14 -1
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/graph.py +41 -5
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/delta.py +49 -4
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/.gitignore +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/LICENSE +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/README.md +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/pyproject.toml +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/conftest.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_configs.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_envs.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_judges.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_platform_run.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_trace.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/agent.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/env.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/episode.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/errors.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tool.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judge.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/session.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/state.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/task.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/harbor/env.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/trace.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/types.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/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.dev103
|
|
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
|
|
@@ -91,6 +91,82 @@ def test_routed_experts_attributed_and_aligned_across_turns():
|
|
|
91
91
|
)
|
|
92
92
|
|
|
93
93
|
|
|
94
|
+
def test_bridged_turn_recovers_the_prior_turn_unforwarded_row():
|
|
95
|
+
"""A turn never forwards its own final sampled token, so the engine returns one routing row
|
|
96
|
+
fewer than the turn has prompt plus completion positions, and that final position is filled
|
|
97
|
+
with a copy of its predecessor: a placeholder, effectively. The next turn's prefill does
|
|
98
|
+
forward it and reports it as row 0, so the placeholder must be replaced by that real row
|
|
99
|
+
rather than discarded."""
|
|
100
|
+
trace = vf.Trace(
|
|
101
|
+
agent=vf.AgentInfo(config=vf.AgentConfig()),
|
|
102
|
+
task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
|
|
103
|
+
)
|
|
104
|
+
user = vf.UserMessage(content="u1")
|
|
105
|
+
|
|
106
|
+
# Start first turn
|
|
107
|
+
graph.prepare_turn(trace, [user]).commit(
|
|
108
|
+
vf.Response(
|
|
109
|
+
id="a",
|
|
110
|
+
created=0,
|
|
111
|
+
model="t",
|
|
112
|
+
message=vf.AssistantMessage(content="a1"),
|
|
113
|
+
finish_reason="stop",
|
|
114
|
+
tokens=TurnTokens(
|
|
115
|
+
prompt_ids=[10, 11, 12],
|
|
116
|
+
completion_ids=[20, 21],
|
|
117
|
+
message_spans=[(0, 2)],
|
|
118
|
+
routed_experts=_routed_payload(4, 0, 0),
|
|
119
|
+
),
|
|
120
|
+
)
|
|
121
|
+
)
|
|
122
|
+
sampled_node = trace.nodes[-1]
|
|
123
|
+
assert sampled_node.routed_experts is not None
|
|
124
|
+
# First turn has the placeholder routing assignments:
|
|
125
|
+
assert bool(
|
|
126
|
+
(sampled_node.routed_experts[-1] == sampled_node.routed_experts[-2]).all()
|
|
127
|
+
)
|
|
128
|
+
forwarded_rows = sampled_node.routed_experts[:-1].copy()
|
|
129
|
+
|
|
130
|
+
# Start second turn
|
|
131
|
+
bridged = _routed_payload(4, 4, 100)
|
|
132
|
+
true_row = np.frombuffer(base64.b64decode(bridged["data"]), dtype=np.uint8).reshape(
|
|
133
|
+
bridged["shape"]
|
|
134
|
+
)[0]
|
|
135
|
+
graph.prepare_turn(
|
|
136
|
+
trace,
|
|
137
|
+
[user, vf.AssistantMessage(content="a1"), vf.UserMessage(content="u2")],
|
|
138
|
+
).commit(
|
|
139
|
+
vf.Response(
|
|
140
|
+
id="b",
|
|
141
|
+
created=0,
|
|
142
|
+
model="t",
|
|
143
|
+
message=vf.AssistantMessage(content="a2"),
|
|
144
|
+
finish_reason="stop",
|
|
145
|
+
tokens=TurnTokens(
|
|
146
|
+
prompt_ids=[10, 11, 12, 20, 21, 30, 31],
|
|
147
|
+
completion_ids=[40, 41],
|
|
148
|
+
message_spans=[(0, 2), None, (5, 7)],
|
|
149
|
+
routed_experts=bridged,
|
|
150
|
+
),
|
|
151
|
+
)
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
recovered = sampled_node.routed_experts
|
|
155
|
+
assert recovered is not None
|
|
156
|
+
# Did the first turn's final placeholder get corrected?
|
|
157
|
+
assert bool((recovered[-1] == true_row).all()), (
|
|
158
|
+
f"expected turn 1's final position to hold {true_row.tolist()}, "
|
|
159
|
+
f"got {recovered[-1].tolist()}"
|
|
160
|
+
)
|
|
161
|
+
assert bool((recovered[:-1] == forwarded_rows).all()), (
|
|
162
|
+
"only the fabricated final row may change"
|
|
163
|
+
)
|
|
164
|
+
assert recovered.flags.owndata
|
|
165
|
+
branch = trace.branches[-1]
|
|
166
|
+
assert branch.routed_experts is not None
|
|
167
|
+
assert branch.routed_experts.shape[0] == len(branch.token_ids)
|
|
168
|
+
|
|
169
|
+
|
|
94
170
|
def test_routed_experts_none_when_absent():
|
|
95
171
|
"""No routing captured (engine ran without `enable_return_routed_experts`) -> the branch
|
|
96
172
|
reports None and the trainer simply skips replay."""
|
|
@@ -4,6 +4,7 @@ the episode the worker finished with."""
|
|
|
4
4
|
import asyncio
|
|
5
5
|
import copy
|
|
6
6
|
|
|
7
|
+
import numpy as np
|
|
7
8
|
import pytest
|
|
8
9
|
|
|
9
10
|
import verifiers.v1 as vf
|
|
@@ -176,7 +177,8 @@ async def test_pending_preview_streams_and_clears_on_commit():
|
|
|
176
177
|
|
|
177
178
|
|
|
178
179
|
@pytest.mark.asyncio
|
|
179
|
-
|
|
180
|
+
@pytest.mark.parametrize("routing_dtype", [np.uint8, np.uint16])
|
|
181
|
+
async def test_deltas_stream_once_and_reassemble_the_episode(routing_dtype):
|
|
180
182
|
slot = Slot()
|
|
181
183
|
frames: list[bytes] = []
|
|
182
184
|
|
|
@@ -192,8 +194,15 @@ async def test_deltas_stream_once_and_reassemble_the_episode():
|
|
|
192
194
|
await settle()
|
|
193
195
|
assert len(frames) == 1, "the mint and the boot span coalesce into one delta"
|
|
194
196
|
add_turn(trace, "a1")
|
|
197
|
+
trace.nodes[1].routed_experts = np.arange(6, dtype=np.uint8).reshape(3, 2, 1)
|
|
195
198
|
await settle()
|
|
196
199
|
add_turn(trace, "a2")
|
|
200
|
+
# The next prefill corrects the previous turn's last routing row, potentially
|
|
201
|
+
# widening its dtype. The previous node has already crossed the wire.
|
|
202
|
+
trace.nodes[1].routed_experts = np.array(
|
|
203
|
+
[[[0], [1]], [[2], [3]], [[100], [np.iinfo(routing_dtype).max]]],
|
|
204
|
+
dtype=routing_dtype,
|
|
205
|
+
)
|
|
197
206
|
trace.nodes[0].semantic_parents.append(ParentLink(node=1, type="reply"))
|
|
198
207
|
await settle()
|
|
199
208
|
trace.record_reward("match", 1.0)
|
|
@@ -224,6 +233,10 @@ async def test_deltas_stream_once_and_reassemble_the_episode():
|
|
|
224
233
|
rebuilt = WireEpisode.model_validate(unpack(pack(assembly.finish(head, summaries))))
|
|
225
234
|
assert rebuilt.ok and rebuilt.traces[0].id == trace.id
|
|
226
235
|
assert rebuilt.traces[0].messages == trace.messages
|
|
236
|
+
np.testing.assert_array_equal(
|
|
237
|
+
rebuilt.traces[0].nodes[1].routed_experts, trace.nodes[1].routed_experts
|
|
238
|
+
)
|
|
239
|
+
assert rebuilt.traces[0].nodes[1].routed_experts.dtype == routing_dtype
|
|
227
240
|
assert (
|
|
228
241
|
rebuilt.traces[0].nodes[0].semantic_parents == trace.nodes[0].semantic_parents
|
|
229
242
|
)
|
|
@@ -673,8 +673,41 @@ def _attribute_mm(
|
|
|
673
673
|
)
|
|
674
674
|
|
|
675
675
|
|
|
676
|
+
def _replace_placeholder_routing_row(
|
|
677
|
+
trace: Trace, prefix_node_ids: list[int], arr: np.ndarray, off: int
|
|
678
|
+
) -> None:
|
|
679
|
+
"""Replace the prefix's placeholder routing row with the one this turn's prefill forwarded."""
|
|
680
|
+
if not 1 <= off <= arr.shape[0]:
|
|
681
|
+
return
|
|
682
|
+
# Only assistant (`sampled`) nodes are affected: the model forward isn't run on the final
|
|
683
|
+
# generated token for such turns, meaning its routing decisions are fundamentally unavailable.
|
|
684
|
+
# But, because routing needs one row per token, that row instead receives an inaccurate
|
|
685
|
+
# placeholder, attempt to fix up below.
|
|
686
|
+
node_with_placeholder = None
|
|
687
|
+
for nid in reversed(prefix_node_ids):
|
|
688
|
+
if trace.nodes[nid].token_ids:
|
|
689
|
+
node_with_placeholder = trace.nodes[nid]
|
|
690
|
+
break
|
|
691
|
+
if node_with_placeholder is None or not node_with_placeholder.sampled:
|
|
692
|
+
return
|
|
693
|
+
node_rows = node_with_placeholder.routed_experts
|
|
694
|
+
if (
|
|
695
|
+
node_rows is None
|
|
696
|
+
or node_rows.shape[0] == 0
|
|
697
|
+
or node_rows.shape[1:] != arr.shape[1:]
|
|
698
|
+
):
|
|
699
|
+
return
|
|
700
|
+
# Row `i` of this turn's array is sequence position `start + i`, so the prefix's final position
|
|
701
|
+
# is `arr[off - 1]`. Concatenating widens the node when this turn serialized `uint16`, where an
|
|
702
|
+
# in-place write would truncate.
|
|
703
|
+
node_with_placeholder.routed_experts = np.concatenate(
|
|
704
|
+
[node_rows[:-1], arr[off - 1 : off]], axis=0
|
|
705
|
+
)
|
|
706
|
+
|
|
707
|
+
|
|
676
708
|
def _attribute_routed_experts(
|
|
677
709
|
trace: Trace,
|
|
710
|
+
prefix_node_ids: list[int],
|
|
678
711
|
new_node_ids: list[int],
|
|
679
712
|
path_len: int,
|
|
680
713
|
payload: Any,
|
|
@@ -683,7 +716,8 @@ def _attribute_routed_experts(
|
|
|
683
716
|
payload's array covers the turn's prompt+completion from `payload["start"]` (0 = from token
|
|
684
717
|
0); the nodes created this turn tile sequence positions `[path_len:]` in creation order, so
|
|
685
718
|
we hand each node `arr[off : off+len(node.token_ids)]` and advance. Reused-prefix nodes keep
|
|
686
|
-
the routing attributed when they were first created
|
|
719
|
+
the routing attributed when they were first created, except for the one position this turn
|
|
720
|
+
corrects (see `_replace_placeholder_routing_row`). A node whose slice falls outside the
|
|
687
721
|
array (a `start` past `path_len`, e.g. an unexpected prefix-cache delta) is left unset — the
|
|
688
722
|
branch then reports no routing rather than misaligning."""
|
|
689
723
|
if payload is None:
|
|
@@ -693,6 +727,7 @@ def _attribute_routed_experts(
|
|
|
693
727
|
payload["shape"]
|
|
694
728
|
)
|
|
695
729
|
off = path_len - int(payload.get("start", 0) or 0)
|
|
730
|
+
_replace_placeholder_routing_row(trace, prefix_node_ids, arr, off)
|
|
696
731
|
needed = off + sum(len(trace.nodes[nid].token_ids) for nid in new_node_ids)
|
|
697
732
|
for nid in new_node_ids:
|
|
698
733
|
n = len(trace.nodes[nid].token_ids)
|
|
@@ -701,8 +736,8 @@ def _attribute_routed_experts(
|
|
|
701
736
|
# Own only this node's rows; a view would retain the turn's full-context array.
|
|
702
737
|
trace.nodes[nid].routed_experts = arr[off:end].copy()
|
|
703
738
|
elif n and arr.shape[0] and 0 <= off and end == needed == arr.shape[0] + 1:
|
|
704
|
-
#
|
|
705
|
-
#
|
|
739
|
+
# No forward pass follows the turn's final position, so it gets a placeholder: a
|
|
740
|
+
# copy of the previous row, appended to this node's slice of the array.
|
|
706
741
|
trace.nodes[nid].routed_experts = np.concatenate(
|
|
707
742
|
[arr[off:], arr[-1:]], axis=0
|
|
708
743
|
)
|
|
@@ -813,7 +848,7 @@ def _commit_turn(turn: PendingTurn, response: Response) -> int:
|
|
|
813
848
|
parent = prefix[-1] if prefix else None
|
|
814
849
|
# cursor: in prompt_ids, the end of the previous *new* message's tokens
|
|
815
850
|
cursor: int | None = None
|
|
816
|
-
# Track new nodes separately so routed-expert attribution
|
|
851
|
+
# Track new nodes separately so routed-expert attribution needs only node ids, not this path.
|
|
817
852
|
new_node_ids: list[int] = []
|
|
818
853
|
# Materialize the reused message path only for multimodal cursor attribution.
|
|
819
854
|
mm_path: list[tuple[int, Message]] | None = None
|
|
@@ -874,8 +909,9 @@ def _commit_turn(turn: PendingTurn, response: Response) -> int:
|
|
|
874
909
|
|
|
875
910
|
# Attribute this turn's expert-routing array onto the nodes created this turn (new input
|
|
876
911
|
# nodes in creation order, then the assistant node), each getting the routing for its tokens.
|
|
912
|
+
# The prefix goes in too, so the position the previous turn could only pad can be corrected.
|
|
877
913
|
_attribute_routed_experts(
|
|
878
|
-
trace, new_node_ids, path_len, tokens.routed_experts if tokens else None
|
|
914
|
+
trace, prefix, new_node_ids, path_len, tokens.routed_experts if tokens else None
|
|
879
915
|
)
|
|
880
916
|
|
|
881
917
|
# Sampling masks are completion-aligned, so only the sampled node carries them.
|
|
@@ -4,12 +4,12 @@ The worker streams a served episode as it grows. Each trace announces its own ch
|
|
|
4
4
|
(`Trace.notify`, fired by the rollout at every phase change and by the interception proxy
|
|
5
5
|
after every recorded turn); the `DeltaStreamer` then diffs the run's live traces against
|
|
6
6
|
what it has already sent and ships only the new part — the trace header once, then
|
|
7
|
-
appended nodes / calls / errors, semantic links
|
|
7
|
+
appended nodes / calls / errors, semantic links and routing-row repairs on earlier nodes, the scalar
|
|
8
8
|
fields whose value changed (timing spans, stop condition, rewards, ...), and the
|
|
9
9
|
`pending` preview — the messages of the request in flight that no node holds yet, so a
|
|
10
10
|
watcher sees a tool result before the model has answered it. The `Trace` is
|
|
11
|
-
append-only at turn granularity
|
|
12
|
-
|
|
11
|
+
append-only at turn granularity except for links and the last routing row of a node,
|
|
12
|
+
which the next prefill can repair. Apart from these and the preview, every byte of the
|
|
13
13
|
episode crosses the wire once and the stream costs about what a single reply would; the
|
|
14
14
|
reply that ends the run carries only the episode head and per-trace counts the client
|
|
15
15
|
checks its assembly against. A cursor advances only once its delta is on the wire, so a
|
|
@@ -29,8 +29,10 @@ from collections.abc import Awaitable, Callable
|
|
|
29
29
|
from typing import TYPE_CHECKING, Any, Self
|
|
30
30
|
|
|
31
31
|
import msgpack
|
|
32
|
+
import numpy as np
|
|
32
33
|
from pydantic import BaseModel
|
|
33
34
|
|
|
35
|
+
from verifiers.v1.graph import _decode_ndarray, _encode_ndarray
|
|
34
36
|
from verifiers.v1.serve.encoding import msgpack_encoder
|
|
35
37
|
|
|
36
38
|
if TYPE_CHECKING:
|
|
@@ -73,7 +75,7 @@ def pack(payload: Any) -> bytes:
|
|
|
73
75
|
|
|
74
76
|
|
|
75
77
|
def unpack(data: bytes) -> Any:
|
|
76
|
-
#
|
|
78
|
+
# Node updates are keyed by node index (int).
|
|
77
79
|
return msgpack.unpackb(data, raw=False, strict_map_key=False)
|
|
78
80
|
|
|
79
81
|
|
|
@@ -90,6 +92,8 @@ class TraceCursor:
|
|
|
90
92
|
self.sent = dict.fromkeys(LIST_FIELDS, 0)
|
|
91
93
|
self.links: list[int] = []
|
|
92
94
|
"""Per sent node, how many of its semantic links went out with or after it."""
|
|
95
|
+
self.final_rows: dict[int, bytes] = {}
|
|
96
|
+
"""Per node that carries routing, its final row as packed when last sent."""
|
|
93
97
|
self.scalars: dict[str, bytes] = {}
|
|
94
98
|
self.pending: bytes = pack([])
|
|
95
99
|
|
|
@@ -157,6 +161,31 @@ class DeltaStreamer:
|
|
|
157
161
|
else:
|
|
158
162
|
self.cursors[trace_id] = cursor
|
|
159
163
|
|
|
164
|
+
def _maybe_add_routing_repairs(
|
|
165
|
+
self,
|
|
166
|
+
delta: dict[str, Any],
|
|
167
|
+
trace: Trace,
|
|
168
|
+
cursor: TraceCursor,
|
|
169
|
+
sent_nodes: int,
|
|
170
|
+
) -> None:
|
|
171
|
+
"""Add final rows repaired since they were sent, keyed by node index.
|
|
172
|
+
|
|
173
|
+
Record every node's current row on the cursor. `sent_nodes` is the pre-flush
|
|
174
|
+
count, so a node first sent in this delta is never reported as a repair.
|
|
175
|
+
"""
|
|
176
|
+
repairs: dict[int, dict] = {}
|
|
177
|
+
for index, node in enumerate(trace.nodes):
|
|
178
|
+
if node.routed_experts is None:
|
|
179
|
+
continue
|
|
180
|
+
row = _encode_ndarray(node.routed_experts[-1:])
|
|
181
|
+
packed = pack(row)
|
|
182
|
+
if cursor.final_rows.get(index) != packed:
|
|
183
|
+
cursor.final_rows[index] = packed
|
|
184
|
+
if index < sent_nodes:
|
|
185
|
+
repairs[index] = row
|
|
186
|
+
if repairs:
|
|
187
|
+
delta["routing_repairs"] = repairs
|
|
188
|
+
|
|
160
189
|
def diff(self) -> list[tuple[str, dict, TraceCursor | None]]:
|
|
161
190
|
"""Each trace's delta against its sent cursor, with the cursor as it stands once
|
|
162
191
|
that delta is sent (None for a discard). Nothing here is committed: `flush`
|
|
@@ -183,6 +212,7 @@ class DeltaStreamer:
|
|
|
183
212
|
cursor.links[index] = len(node_links)
|
|
184
213
|
if links:
|
|
185
214
|
delta["links"] = links
|
|
215
|
+
self._maybe_add_routing_repairs(delta, trace, cursor, cursor.sent["nodes"])
|
|
186
216
|
for field in LIST_FIELDS:
|
|
187
217
|
items = getattr(trace, field)
|
|
188
218
|
sent = cursor.sent[field]
|
|
@@ -220,6 +250,20 @@ class EpisodeAssembly:
|
|
|
220
250
|
def __init__(self) -> None:
|
|
221
251
|
self.traces: dict[str, dict] = {}
|
|
222
252
|
|
|
253
|
+
def _maybe_apply_routing_repairs(self, delta: dict[str, Any], trace: dict) -> None:
|
|
254
|
+
"""Replace repaired final rows in nodes the client already holds.
|
|
255
|
+
|
|
256
|
+
Rebuild each array: a repair can widen its dtype, and decoded rows alias
|
|
257
|
+
the original delta's bytes, which must remain unchanged for consumers.
|
|
258
|
+
"""
|
|
259
|
+
for index, row in (delta.get("routing_repairs") or {}).items():
|
|
260
|
+
node = trace["nodes"][int(index)]
|
|
261
|
+
node["routed_experts"] = _encode_ndarray(
|
|
262
|
+
np.concatenate(
|
|
263
|
+
[_decode_ndarray(node["routed_experts"])[:-1], _decode_ndarray(row)]
|
|
264
|
+
)
|
|
265
|
+
)
|
|
266
|
+
|
|
223
267
|
def apply(self, delta: dict) -> None:
|
|
224
268
|
trace_id = delta["trace"]
|
|
225
269
|
if delta.get("discard"):
|
|
@@ -234,6 +278,7 @@ class EpisodeAssembly:
|
|
|
234
278
|
}
|
|
235
279
|
for index, links in (delta.get("links") or {}).items():
|
|
236
280
|
trace["nodes"][int(index)]["semantic_parents"].extend(links)
|
|
281
|
+
self._maybe_apply_routing_repairs(delta, trace)
|
|
237
282
|
# a later `links` delta grows a node's semantic_parents in place, so the node
|
|
238
283
|
# is copied: the delta stays as it was when the caller received it
|
|
239
284
|
if "nodes" in delta:
|
|
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.dev101 → verifiers-0.3.2.dev103}/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.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/agentic_judge/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/isolated_verifier/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/isolated_verifier/env.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/shared_agentic_judge/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/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
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/browser_use/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/browser_use/harness.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/browser_use/program.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/claude_code/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/claude_code/harness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/hermes_agent/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/hermes_agent/harness.py
RENAMED
|
File without changes
|