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.
Files changed (280) hide show
  1. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/PKG-INFO +1 -1
  2. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/grid.py +23 -1
  3. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_agent_user.py +2 -7
  4. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_multi_turn.py +2 -2
  5. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_multi_turn_tool.py +2 -2
  6. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_network_policy.py +2 -7
  7. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_resume_tool.py +2 -2
  8. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_skills.py +2 -2
  9. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_user_echo.py +2 -2
  10. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/openclaw/harness.py +41 -8
  11. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/.gitignore +0 -0
  12. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/LICENSE +0 -0
  13. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/README.md +0 -0
  14. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/pyproject.toml +0 -0
  15. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/conftest.py +0 -0
  16. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/agent_user.py +0 -0
  17. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/agent_user_harness.py +0 -0
  18. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/counter_tool.py +0 -0
  19. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/duet.py +0 -0
  20. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo.py +0 -0
  21. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_acp_resume.py +0 -0
  22. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_agentic.py +0 -0
  23. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_tool.py +0 -0
  24. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_tool_compose/docker-compose.yaml +0 -0
  25. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_user_sim.py +0 -0
  26. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/fetch_tool.py +0 -0
  27. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/network_policy.py +0 -0
  28. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/parallel.py +0 -0
  29. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/pyproject.toml +0 -0
  30. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/skill_codeword.py +0 -0
  31. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
  32. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/fixtures/tool_response_image.py +0 -0
  33. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_agentic_judge.py +0 -0
  34. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_compose_scoring.py +0 -0
  35. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_examples.py +0 -0
  36. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_limits.py +0 -0
  37. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_multi_agent.py +0 -0
  38. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_multimodal_tool.py +0 -0
  39. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_parallel.py +0 -0
  40. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_rubric_judge.py +0 -0
  41. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_sampling.py +0 -0
  42. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_scoring_network.py +0 -0
  43. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_shared_tool.py +0 -0
  44. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_single_turn.py +0 -0
  45. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_stateful_tool.py +0 -0
  46. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_tool_vms.py +0 -0
  47. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/integration/test_user_sim.py +0 -0
  48. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/cli/test_replay.py +0 -0
  49. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/conftest.py +0 -0
  50. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/harnesses/test_core.py +0 -0
  51. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/harnesses/test_rlm.py +0 -0
  52. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/interception/test_tunnel.py +0 -0
  53. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/judges/conftest.py +0 -0
  54. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/judges/test_judge.py +0 -0
  55. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/judges/test_reference.py +0 -0
  56. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/judges/test_rubric.py +0 -0
  57. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/runtimes/test_e2b.py +0 -0
  58. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/runtimes/test_private_network.py +0 -0
  59. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/serve/test_client.py +0 -0
  60. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/serve/test_delta.py +0 -0
  61. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/serve/test_pool.py +0 -0
  62. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_agent.py +0 -0
  63. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_dialects.py +0 -0
  64. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_graph.py +0 -0
  65. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_harbor_grading_network.py +0 -0
  66. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_scoring_network.py +0 -0
  67. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_semantic.py +0 -0
  68. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_task.py +0 -0
  69. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_taskset.py +0 -0
  70. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/test_trace.py +0 -0
  71. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/utils/test_compile.py +0 -0
  72. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/utils/test_loaders.py +0 -0
  73. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/utils/test_platform.py +0 -0
  74. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/tests/unit/utils/test_score.py +0 -0
  75. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/__init__.py +0 -0
  76. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/__init__.py +0 -0
  77. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/acp/__init__.py +0 -0
  78. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/acp/runner.py +0 -0
  79. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/agent.py +0 -0
  80. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/__init__.py +0 -0
  81. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  82. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/base.py +0 -0
  83. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/eval.py +0 -0
  84. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/replay.py +0 -0
  85. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/validate.py +0 -0
  86. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/debug.py +0 -0
  87. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/__init__.py +0 -0
  88. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/hint.py +0 -0
  89. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/main.py +0 -0
  90. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/resume.py +0 -0
  91. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/runner.py +0 -0
  92. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/gepa.py +0 -0
  93. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/output.py +0 -0
  94. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/replay.py +0 -0
  95. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/resolve.py +0 -0
  96. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/resume.py +0 -0
  97. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/cli/validate.py +0 -0
  98. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/__init__.py +0 -0
  99. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/base.py +0 -0
  100. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/client.py +0 -0
  101. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/eval.py +0 -0
  102. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/clients/train.py +0 -0
  103. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/__init__.py +0 -0
  104. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/agent.py +0 -0
  105. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/__init__.py +0 -0
  106. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/debug.py +0 -0
  107. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/env.py +0 -0
  108. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/eval.py +0 -0
  109. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/replay.py +0 -0
  110. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/validate.py +0 -0
  111. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/client.py +0 -0
  112. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/env.py +0 -0
  113. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/harness.py +0 -0
  114. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/judge.py +0 -0
  115. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/retries.py +0 -0
  116. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/runtime.py +0 -0
  117. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/scoring.py +0 -0
  118. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/select.py +0 -0
  119. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/serve.py +0 -0
  120. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/task.py +0 -0
  121. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/configs/taskset.py +0 -0
  122. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/__init__.py +0 -0
  123. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/anthropic.py +0 -0
  124. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/base.py +0 -0
  125. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/chat.py +0 -0
  126. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/responses.py +0 -0
  127. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/env.py +0 -0
  128. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/__init__.py +0 -0
  129. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  130. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  131. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  132. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/best_of_n/env.py +0 -0
  133. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  134. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/single_agent/env.py +0 -0
  135. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  136. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/envs/user_sim/env.py +0 -0
  137. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/episode.py +0 -0
  138. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/errors.py +0 -0
  139. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/__init__.py +0 -0
  140. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/adapter.py +0 -0
  141. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/config.py +0 -0
  142. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/dataset.py +0 -0
  143. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/reflection.py +0 -0
  144. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/runner.py +0 -0
  145. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/grading.py +0 -0
  146. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/graph.py +0 -0
  147. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harness.py +0 -0
  148. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/__init__.py +0 -0
  149. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  150. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/bash/harness.py +0 -0
  151. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  152. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  153. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  154. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  155. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  156. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  157. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  158. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/codex/harness.py +0 -0
  159. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/__init__.py +0 -0
  160. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/gate.mjs +0 -0
  161. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/harness.py +0 -0
  162. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/usage.mjs +0 -0
  163. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  164. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  165. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  166. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  167. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  168. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  169. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  170. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  171. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/node.py +0 -0
  172. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/null/__init__.py +0 -0
  173. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/null/harness.py +0 -0
  174. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  175. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/opencode/__init__.py +0 -0
  176. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/opencode/harness.py +0 -0
  177. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/opencode/mcp-ready.js +0 -0
  178. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  179. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  180. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/pi/harness.py +0 -0
  181. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  182. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  183. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  184. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  185. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  186. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  187. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  188. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  189. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  190. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/core.py +0 -0
  191. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/install.py +0 -0
  192. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/launch.py +0 -0
  193. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  194. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/replay.py +0 -0
  195. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/__init__.py +0 -0
  196. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/base.py +0 -0
  197. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/pool.py +0 -0
  198. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/server.py +0 -0
  199. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  200. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/base.py +0 -0
  201. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/custom.py +0 -0
  202. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/prime.py +0 -0
  203. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judge.py +0 -0
  204. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/__init__.py +0 -0
  205. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/decision.py +0 -0
  206. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/reference.py +0 -0
  207. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/reference.txt +0 -0
  208. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/rubric.py +0 -0
  209. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/judges/rubric.txt +0 -0
  210. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/__init__.py +0 -0
  211. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/launch.py +0 -0
  212. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/server.py +0 -0
  213. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/toolset.py +0 -0
  214. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/rollout.py +0 -0
  215. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/__init__.py +0 -0
  216. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/apptainer.py +0 -0
  217. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/base.py +0 -0
  218. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/compose.py +0 -0
  219. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/container.py +0 -0
  220. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/deployment.py +0 -0
  221. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  222. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/docker/egress.py +0 -0
  223. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/e2b.py +0 -0
  224. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/limiters.py +0 -0
  225. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/modal.py +0 -0
  226. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/prime.py +0 -0
  227. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/private_network.py +0 -0
  228. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/runtime.py +0 -0
  229. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/strategies.py +0 -0
  230. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/subprocess.py +0 -0
  231. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/semantic.py +0 -0
  232. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/__init__.py +0 -0
  233. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/client.py +0 -0
  234. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/delta.py +0 -0
  235. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/encoding.py +0 -0
  236. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/pool.py +0 -0
  237. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/server.py +0 -0
  238. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/serve/types.py +0 -0
  239. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/session.py +0 -0
  240. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/state.py +0 -0
  241. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/task.py +0 -0
  242. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/taskset.py +0 -0
  243. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/__init__.py +0 -0
  244. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  245. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  246. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  247. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  248. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  249. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  250. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  251. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  252. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  253. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  254. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  255. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  256. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/trace.py +0 -0
  257. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/types.py +0 -0
  258. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/__init__.py +0 -0
  259. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/aio.py +0 -0
  260. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/artifacts.py +0 -0
  261. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/compile.py +0 -0
  262. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/decorators.py +0 -0
  263. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/env.py +0 -0
  264. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/eval.py +0 -0
  265. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/format.py +0 -0
  266. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/generic.py +0 -0
  267. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/git.py +0 -0
  268. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/image.py +0 -0
  269. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/interrupt.py +0 -0
  270. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/loaders.py +0 -0
  271. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/logging.py +0 -0
  272. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/memory.py +0 -0
  273. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/paths.py +0 -0
  274. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/platform.py +0 -0
  275. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/prime.py +0 -0
  276. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/retries.py +0 -0
  277. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/scope.py +0 -0
  278. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/score.py +0 -0
  279. {verifiers-0.4.1.dev50 → verifiers-0.4.1.dev51}/verifiers/v1/utils/trace_store.py +0 -0
  280. {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.dev50
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
- # mini-swe-agent only acts through tool calls: it drops a tool-less reply (the
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
- assert trace.num_branches == 1
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
- assert trace.num_branches == 1
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
- # mini-swe-agent only acts through tool calls: it drops a tool-less reply
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
- assert trace.num_branches == 1
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
- assert trace.num_branches == 1
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
- assert trace.num_branches == 1
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, _, _ = ctx.model.partition("/")
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