verifiers 0.4.1.dev50__tar.gz → 0.4.1.dev51__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.4.1.dev50 → verifiers-0.4.1.dev51}/PKG-INFO +1 -1
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/grid.py +23 -1
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_agent_user.py +2 -7
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_multi_turn.py +2 -2
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_multi_turn_tool.py +2 -2
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_network_policy.py +2 -7
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_resume_tool.py +2 -2
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_skills.py +2 -2
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_user_echo.py +2 -2
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/openclaw/harness.py +41 -8
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/.gitignore +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/LICENSE +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/README.md +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/pyproject.toml +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/conftest.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/agent_user.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/agent_user_harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/counter_tool.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/duet.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_acp_resume.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_agentic.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_tool.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_tool_compose/docker-compose.yaml +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_user_sim.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/fetch_tool.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/network_policy.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/parallel.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/pyproject.toml +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/skill_codeword.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/tool_response_image.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_agentic_judge.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_compose_scoring.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_examples.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_limits.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_multi_agent.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_multimodal_tool.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_parallel.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_rubric_judge.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_sampling.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_scoring_network.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_shared_tool.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_single_turn.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_stateful_tool.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_tool_vms.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_user_sim.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/cli/test_replay.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/conftest.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/harnesses/test_core.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/harnesses/test_rlm.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/interception/test_tunnel.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/judges/conftest.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/judges/test_judge.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/judges/test_reference.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/judges/test_rubric.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/runtimes/test_e2b.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/runtimes/test_private_network.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/serve/test_client.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/serve/test_delta.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/serve/test_pool.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_agent.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_dialects.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_graph.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_harbor_grading_network.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_scoring_network.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_semantic.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_task.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_taskset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_trace.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/utils/test_compile.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/utils/test_loaders.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/utils/test_platform.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/utils/test_score.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/agent.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/scoring.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/select.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/env.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/episode.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/errors.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/grading.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/graph.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/gate.mjs +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/usage.mjs +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/opencode/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/opencode/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/opencode/mcp-ready.js +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/replay.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judge.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/decision.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/apptainer.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/compose.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/container.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/deployment.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/e2b.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/private_network.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/runtime.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/strategies.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/delta.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/session.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/state.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/task.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/trace.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/types.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/env.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/eval.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/scope.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/trace_store.py +0 -0
- {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.4.1.
|
|
3
|
+
Version: 0.4.1.dev51
|
|
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
|
|
@@ -68,10 +68,32 @@ COMPOSE_VMS = ("prime", "modal")
|
|
|
68
68
|
# TODO: drop each entry once its fix lands.
|
|
69
69
|
CI_MODEL_GAPS = {
|
|
70
70
|
"kimi-code": "Prime chat completions rejects kimi-code's prompt_cache_key",
|
|
71
|
-
"openclaw": "openclaw cannot load the custom `internal/` model provider",
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
|
|
74
|
+
# Harnesses whose program rewrites earlier turns by design, so a rollout can record
|
|
75
|
+
# several branches. Each test names the ones it lets fork. Recheck on version bumps.
|
|
76
|
+
FORKS = {
|
|
77
|
+
# Acts only through tool calls: it drops a tool-less reply from its history and
|
|
78
|
+
# resends only its format error.
|
|
79
|
+
"mini-swe-agent": "https://github.com/SWE-agent/mini-swe-agent/blob/v2.4.6/src/minisweagent/agents/default.py#L114",
|
|
80
|
+
# Moves its runtime-context message to the tail of every request and drops the
|
|
81
|
+
# earlier one, unless the provider's replay policy is append-only.
|
|
82
|
+
"openclaw": "https://github.com/openclaw/openclaw/blob/v2026.9.5/src/agents/internal-runtime-context.ts#L402-L408",
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def assert_one_branch(
|
|
87
|
+
trace: vf.Trace, harness: vf.HarnessConfig, forks: Sequence[str] = ()
|
|
88
|
+
) -> None:
|
|
89
|
+
"""A rollout records one branch, unless its harness is one of `forks` (see `FORKS`)."""
|
|
90
|
+
assert set(forks) <= FORKS.keys(), (
|
|
91
|
+
f"no FORKS reason for {set(forks) - FORKS.keys()}"
|
|
92
|
+
)
|
|
93
|
+
if harness.id not in forks:
|
|
94
|
+
assert trace.num_branches == 1, f"{trace.num_branches} branches"
|
|
95
|
+
|
|
96
|
+
|
|
75
97
|
def agent_seats(taskset: str, env_id: str = "") -> list[str]:
|
|
76
98
|
"""The agent seats the env declares for `taskset`: `agent` for a plain taskset, its
|
|
77
99
|
own roles for a recipe env."""
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
upstream (agent-user-harness), on the runtimes that can switch users."""
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
|
-
from grid import grid, runtimes_grid
|
|
6
|
+
from grid import assert_one_branch, grid, runtimes_grid
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
@pytest.mark.parametrize(
|
|
@@ -52,11 +52,6 @@ async def test_agent_user_harness(run, harness, harness_runtime, scripted_model)
|
|
|
52
52
|
client=scripted_model,
|
|
53
53
|
)
|
|
54
54
|
(trace,) = episode.traces
|
|
55
|
-
|
|
56
|
-
# scripted "OK") from its history and resends only its format error, so the
|
|
57
|
-
# trace forks by design. Recheck on version bumps:
|
|
58
|
-
# https://github.com/SWE-agent/mini-swe-agent/blob/v2.4.6/src/minisweagent/agents/default.py#L114
|
|
59
|
-
if harness.id != "mini-swe-agent":
|
|
60
|
-
assert trace.num_branches == 1
|
|
55
|
+
assert_one_branch(trace, harness, forks=("mini-swe-agent",))
|
|
61
56
|
assert trace.ok, [error.message for error in trace.errors]
|
|
62
57
|
assert trace.num_turns >= 1
|
|
@@ -4,7 +4,7 @@ every other `dialect` a harness config can select. A turn the harness re-sends
|
|
|
4
4
|
differently, beyond what its `replay_view` declares, forks the trace."""
|
|
5
5
|
|
|
6
6
|
import pytest
|
|
7
|
-
from grid import dialect_grid, grid, mark
|
|
7
|
+
from grid import assert_one_branch, dialect_grid, grid, mark
|
|
8
8
|
|
|
9
9
|
MULTI_TURN = [
|
|
10
10
|
*grid(needs=("shell",)),
|
|
@@ -28,7 +28,7 @@ async def test_multi_turn(run, harness, harness_runtime):
|
|
|
28
28
|
max_tokens=8192,
|
|
29
29
|
)
|
|
30
30
|
(trace,) = episode.traces
|
|
31
|
-
|
|
31
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
32
32
|
assert trace.ok, [error.message for error in trace.errors]
|
|
33
33
|
assert trace.num_turns >= 1 # ran a command, then finished
|
|
34
34
|
assert trace.reward == 1.0
|
|
@@ -5,7 +5,7 @@ placements (colocated in the harness's box, in a Compose service beside it, or i
|
|
|
5
5
|
runtime) on the runtime x runtime grid."""
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
|
-
from grid import RUNTIMES, grid, placements
|
|
8
|
+
from grid import RUNTIMES, assert_one_branch, grid, placements
|
|
9
9
|
|
|
10
10
|
import verifiers.v1 as vf
|
|
11
11
|
|
|
@@ -22,7 +22,7 @@ async def test_tool(run, harness, harness_runtime):
|
|
|
22
22
|
taskset_overrides={"task": {"tools": {"colocated": True}}},
|
|
23
23
|
)
|
|
24
24
|
(trace,) = episode.traces
|
|
25
|
-
|
|
25
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
26
26
|
assert trace.ok, [error.message for error in trace.errors]
|
|
27
27
|
assert trace.num_turns >= 1
|
|
28
28
|
# Reward 1.0 is the proof the tool ran. How a program surfaces an MCP tool to the
|
|
@@ -4,7 +4,7 @@ agent runs an egress probe under each policy the task data declares
|
|
|
4
4
|
on prime."""
|
|
5
5
|
|
|
6
6
|
import pytest
|
|
7
|
-
from grid import grid
|
|
7
|
+
from grid import assert_one_branch, grid
|
|
8
8
|
|
|
9
9
|
from verifiers.v1.utils.loaders import harness_class
|
|
10
10
|
|
|
@@ -54,12 +54,7 @@ async def test_network_policy(run, harness, harness_runtime, notice):
|
|
|
54
54
|
assert set(by_name) == set(NOTICES)
|
|
55
55
|
for name, episode in by_name.items():
|
|
56
56
|
[trace] = episode.traces
|
|
57
|
-
|
|
58
|
-
# (the probe output as a final answer) from its history, so the trace forks
|
|
59
|
-
# by design. Recheck on version bumps:
|
|
60
|
-
# https://github.com/SWE-agent/mini-swe-agent/blob/v2.4.6/src/minisweagent/agents/default.py#L114
|
|
61
|
-
if harness.id != "mini-swe-agent":
|
|
62
|
-
assert trace.num_branches == 1
|
|
57
|
+
assert_one_branch(trace, harness, forks=("mini-swe-agent", "openclaw"))
|
|
63
58
|
assert trace.ok, [error.message for error in trace.errors]
|
|
64
59
|
prompt = prompt_text(trace)
|
|
65
60
|
if notice and NOTICES[name]:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
exchange (echo-acp-resume), across the harness x runtime grid."""
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
|
-
from grid import grid
|
|
5
|
+
from grid import assert_one_branch, grid
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@pytest.mark.parametrize(
|
|
@@ -19,7 +19,7 @@ async def test_resume_tool(run, harness, harness_runtime):
|
|
|
19
19
|
rollout_timeout=600,
|
|
20
20
|
)
|
|
21
21
|
(trace,) = episode.traces
|
|
22
|
-
|
|
22
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
23
23
|
assert trace.ok, [error.message for error in trace.errors]
|
|
24
24
|
assert trace.stop_condition == "user_closed"
|
|
25
25
|
assert trace.rewards["resumed"].score == 1.0
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
installs (skill-codeword), across the harness x runtime grid."""
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
|
-
from grid import grid
|
|
5
|
+
from grid import assert_one_branch, grid
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@pytest.mark.parametrize(
|
|
@@ -17,6 +17,6 @@ async def test_skills(run, harness, harness_runtime):
|
|
|
17
17
|
max_tokens=8192,
|
|
18
18
|
)
|
|
19
19
|
(trace,) = episode.traces
|
|
20
|
-
|
|
20
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
21
21
|
assert trace.ok, [error.message for error in trace.errors]
|
|
22
22
|
assert trace.reward == 1.0, trace.last_reply
|
|
@@ -3,7 +3,7 @@ conversation each turn (echo-user-sim), across the harness x runtime grid; and t
|
|
|
3
3
|
caller drives an agent turn by turn through `agent.interaction`."""
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
|
-
from grid import grid
|
|
6
|
+
from grid import assert_one_branch, grid
|
|
7
7
|
|
|
8
8
|
import verifiers.v1 as vf
|
|
9
9
|
|
|
@@ -25,7 +25,7 @@ async def test_user(run, harness, harness_runtime):
|
|
|
25
25
|
max_tokens=8192,
|
|
26
26
|
)
|
|
27
27
|
(trace,) = episode.traces
|
|
28
|
-
|
|
28
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
29
29
|
assert trace.ok, [error.message for error in trace.errors]
|
|
30
30
|
assert trace.num_turns >= 2 # genuinely multi-turn
|
|
31
31
|
assert trace.stop_condition == "user_closed" # leaving the interaction ended it
|
|
@@ -61,6 +61,14 @@ if (patched !== source) {
|
|
|
61
61
|
NODE
|
|
62
62
|
"""
|
|
63
63
|
|
|
64
|
+
# OpenClaw rejects a model it cannot resolve as the primary model, which makes setting
|
|
65
|
+
# it in a scratch config a check for whether its catalog knows the model.
|
|
66
|
+
CATALOG_CHECK = r"""
|
|
67
|
+
mkdir -p "$OPENCLAW_STATE_DIR"
|
|
68
|
+
printf '{}' >"$OPENCLAW_CONFIG_PATH"
|
|
69
|
+
exec "$VF_OPENCLAW_BIN" config set agents.defaults.model.primary "$VF_OPENCLAW_MODEL"
|
|
70
|
+
"""
|
|
71
|
+
|
|
64
72
|
OPENCLAW_COMMAND = [
|
|
65
73
|
"sh",
|
|
66
74
|
"-c",
|
|
@@ -130,6 +138,10 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
130
138
|
SUPPORTS_MCP = True
|
|
131
139
|
SUPPORTS_SKILLS = True
|
|
132
140
|
|
|
141
|
+
def __init__(self, config: OpenClawHarnessConfig) -> None:
|
|
142
|
+
super().__init__(config)
|
|
143
|
+
self._cataloged: dict[str, bool] = {}
|
|
144
|
+
|
|
133
145
|
async def setup(self, runtime: Runtime) -> None:
|
|
134
146
|
directory = OPENCLAW_DIR.format(version=self.config.version)
|
|
135
147
|
binary = OPENCLAW_BIN.format(version=self.config.version)
|
|
@@ -151,6 +163,23 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
151
163
|
)
|
|
152
164
|
await super().setup(runtime)
|
|
153
165
|
|
|
166
|
+
async def _in_catalog(self, runtime: Runtime, model: str, state_dir: str) -> bool:
|
|
167
|
+
"""Whether OpenClaw's model catalog knows `model`, checked once per model."""
|
|
168
|
+
if model not in self._cataloged:
|
|
169
|
+
check_dir = f"{state_dir}/catalog-check"
|
|
170
|
+
result = await runtime.run(
|
|
171
|
+
["sh", "-c", CATALOG_CHECK],
|
|
172
|
+
{
|
|
173
|
+
**self.config.resolved_env,
|
|
174
|
+
"OPENCLAW_STATE_DIR": check_dir,
|
|
175
|
+
"OPENCLAW_CONFIG_PATH": f"{check_dir}/openclaw.json",
|
|
176
|
+
"VF_OPENCLAW_BIN": OPENCLAW_BIN.format(version=self.config.version),
|
|
177
|
+
"VF_OPENCLAW_MODEL": json.dumps(model),
|
|
178
|
+
},
|
|
179
|
+
)
|
|
180
|
+
self._cataloged[model] = result.exit_code == 0
|
|
181
|
+
return self._cataloged[model]
|
|
182
|
+
|
|
154
183
|
async def prepare_acp(
|
|
155
184
|
self,
|
|
156
185
|
ctx: ModelContext,
|
|
@@ -162,10 +191,20 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
162
191
|
data: TaskData,
|
|
163
192
|
) -> ACPConfig:
|
|
164
193
|
system_prompt, prompt = self.resolve_prompt(data)
|
|
165
|
-
provider, _,
|
|
194
|
+
provider, _, model_id = ctx.model.partition("/")
|
|
166
195
|
state_dir = f".vf-openclaw/{trace.id}"
|
|
167
196
|
config_path = f"{state_dir}/openclaw.json"
|
|
168
197
|
skills_dir = f"{state_dir}/skills"
|
|
198
|
+
provider_config = {
|
|
199
|
+
"baseUrl": endpoint,
|
|
200
|
+
"apiKey": "${OPENCLAW_INTERCEPT_KEY}",
|
|
201
|
+
"request": {"allowPrivateNetwork": True},
|
|
202
|
+
}
|
|
203
|
+
if not await self._in_catalog(runtime, ctx.model, state_dir):
|
|
204
|
+
# Catalog models keep OpenClaw's defaults. Others need a declared model, and
|
|
205
|
+
# OpenClaw's chat completions default for them rewrites replayed turns.
|
|
206
|
+
provider_config["api"] = "openai-responses"
|
|
207
|
+
provider_config["models"] = [{"id": model_id, "name": model_id}]
|
|
169
208
|
config = {
|
|
170
209
|
"gateway": {
|
|
171
210
|
"mode": "local",
|
|
@@ -193,13 +232,7 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
193
232
|
"deny": self.config.disabled_tools or [],
|
|
194
233
|
},
|
|
195
234
|
"models": {
|
|
196
|
-
"providers": {
|
|
197
|
-
provider: {
|
|
198
|
-
"baseUrl": endpoint,
|
|
199
|
-
"apiKey": "${OPENCLAW_INTERCEPT_KEY}",
|
|
200
|
-
"request": {"allowPrivateNetwork": True},
|
|
201
|
-
}
|
|
202
|
-
},
|
|
235
|
+
"providers": {provider: provider_config},
|
|
203
236
|
},
|
|
204
237
|
"mcp": {
|
|
205
238
|
"servers": {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/agent_user_harness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_acp_resume.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/network_policy.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/skill_codeword.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/tool_response_image.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
|
|
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
|