verifiers 0.4.1.dev46__tar.gz → 0.4.1.dev47__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 (277) hide show
  1. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/PKG-INFO +1 -1
  2. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/grid.py +15 -14
  3. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_multi_turn.py +3 -3
  4. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/test_graph.py +8 -0
  5. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/utils/test_loaders.py +2 -2
  6. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/harness.py +4 -1
  7. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/bash/harness.py +2 -0
  8. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/browser_use/harness.py +1 -0
  9. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/claude_code/harness.py +2 -0
  10. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/codex/harness.py +4 -0
  11. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/deepseek/harness.py +4 -0
  12. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/hermes_agent/harness.py +8 -1
  13. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/kimi_code/harness.py +3 -4
  14. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/mini_swe_agent/harness.py +2 -0
  15. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/null/harness.py +3 -1
  16. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/openclaw/harness.py +3 -0
  17. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/opencode/harness.py +2 -3
  18. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/pi/harness.py +5 -6
  19. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/prime_agent/harness.py +11 -2
  20. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/rlm/harness.py +1 -0
  21. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/terminus_2/harness.py +2 -0
  22. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/utils/replay.py +11 -1
  23. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/types.py +2 -2
  24. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/loaders.py +2 -1
  25. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/.gitignore +0 -0
  26. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/LICENSE +0 -0
  27. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/README.md +0 -0
  28. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/pyproject.toml +0 -0
  29. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/conftest.py +0 -0
  30. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/agent_user.py +0 -0
  31. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/agent_user_harness.py +0 -0
  32. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/counter_tool.py +0 -0
  33. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/duet.py +0 -0
  34. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/echo.py +0 -0
  35. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/echo_acp_resume.py +0 -0
  36. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/echo_agentic.py +0 -0
  37. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/echo_tool.py +0 -0
  38. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/echo_tool_compose/docker-compose.yaml +0 -0
  39. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/echo_user_sim.py +0 -0
  40. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/fetch_tool.py +0 -0
  41. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/network_policy.py +0 -0
  42. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/parallel.py +0 -0
  43. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/pyproject.toml +0 -0
  44. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/skill_codeword.py +0 -0
  45. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
  46. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/fixtures/tool_response_image.py +0 -0
  47. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_agent_user.py +0 -0
  48. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_agentic_judge.py +0 -0
  49. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_compose_scoring.py +0 -0
  50. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_examples.py +0 -0
  51. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_limits.py +0 -0
  52. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_multi_agent.py +0 -0
  53. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_multi_turn_tool.py +0 -0
  54. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_multimodal_tool.py +0 -0
  55. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_network_policy.py +0 -0
  56. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_parallel.py +0 -0
  57. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_resume_tool.py +0 -0
  58. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_rubric_judge.py +0 -0
  59. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_sampling.py +0 -0
  60. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_shared_tool.py +0 -0
  61. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_single_turn.py +0 -0
  62. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_skills.py +0 -0
  63. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_stateful_tool.py +0 -0
  64. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_tool_vms.py +0 -0
  65. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_user_echo.py +0 -0
  66. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/integration/test_user_sim.py +0 -0
  67. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/cli/test_replay.py +0 -0
  68. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/conftest.py +0 -0
  69. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/harnesses/test_core.py +0 -0
  70. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/harnesses/test_rlm.py +0 -0
  71. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/interception/test_tunnel.py +0 -0
  72. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/judges/conftest.py +0 -0
  73. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/judges/test_judge.py +0 -0
  74. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/judges/test_reference.py +0 -0
  75. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/judges/test_rubric.py +0 -0
  76. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/runtimes/test_e2b.py +0 -0
  77. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/runtimes/test_private_network.py +0 -0
  78. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/serve/test_client.py +0 -0
  79. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/serve/test_delta.py +0 -0
  80. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/serve/test_pool.py +0 -0
  81. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/test_agent.py +0 -0
  82. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/test_dialects.py +0 -0
  83. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/test_semantic.py +0 -0
  84. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/test_task.py +0 -0
  85. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/test_taskset.py +0 -0
  86. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/test_trace.py +0 -0
  87. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/utils/test_compile.py +0 -0
  88. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/utils/test_platform.py +0 -0
  89. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/tests/unit/utils/test_score.py +0 -0
  90. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/__init__.py +0 -0
  91. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/__init__.py +0 -0
  92. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/acp/__init__.py +0 -0
  93. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/acp/runner.py +0 -0
  94. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/agent.py +0 -0
  95. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/__init__.py +0 -0
  96. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  97. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/dashboard/base.py +0 -0
  98. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/dashboard/eval.py +0 -0
  99. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/dashboard/replay.py +0 -0
  100. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/dashboard/validate.py +0 -0
  101. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/debug.py +0 -0
  102. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/eval/__init__.py +0 -0
  103. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/eval/hint.py +0 -0
  104. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/eval/main.py +0 -0
  105. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/eval/resume.py +0 -0
  106. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/eval/runner.py +0 -0
  107. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/gepa.py +0 -0
  108. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/output.py +0 -0
  109. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/replay.py +0 -0
  110. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/resolve.py +0 -0
  111. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/resume.py +0 -0
  112. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/cli/validate.py +0 -0
  113. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/clients/__init__.py +0 -0
  114. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/clients/base.py +0 -0
  115. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/clients/client.py +0 -0
  116. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/clients/eval.py +0 -0
  117. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/clients/train.py +0 -0
  118. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/__init__.py +0 -0
  119. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/agent.py +0 -0
  120. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/cli/__init__.py +0 -0
  121. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/cli/debug.py +0 -0
  122. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/cli/env.py +0 -0
  123. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/cli/eval.py +0 -0
  124. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/cli/replay.py +0 -0
  125. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/cli/validate.py +0 -0
  126. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/client.py +0 -0
  127. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/env.py +0 -0
  128. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/judge.py +0 -0
  129. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/retries.py +0 -0
  130. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/runtime.py +0 -0
  131. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/scoring.py +0 -0
  132. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/select.py +0 -0
  133. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/serve.py +0 -0
  134. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/task.py +0 -0
  135. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/configs/taskset.py +0 -0
  136. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/dialects/__init__.py +0 -0
  137. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/dialects/anthropic.py +0 -0
  138. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/dialects/base.py +0 -0
  139. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/dialects/chat.py +0 -0
  140. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/dialects/responses.py +0 -0
  141. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/env.py +0 -0
  142. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/envs/__init__.py +0 -0
  143. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  144. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  145. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  146. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/envs/best_of_n/env.py +0 -0
  147. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  148. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/envs/single_agent/env.py +0 -0
  149. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  150. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/envs/user_sim/env.py +0 -0
  151. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/episode.py +0 -0
  152. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/errors.py +0 -0
  153. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/gepa/__init__.py +0 -0
  154. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/gepa/adapter.py +0 -0
  155. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/gepa/config.py +0 -0
  156. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/gepa/dataset.py +0 -0
  157. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/gepa/reflection.py +0 -0
  158. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/gepa/runner.py +0 -0
  159. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/grading.py +0 -0
  160. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/graph.py +0 -0
  161. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harness.py +0 -0
  162. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/__init__.py +0 -0
  163. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  164. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  165. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  166. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  167. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  168. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  169. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/deepseek/__init__.py +0 -0
  170. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/deepseek/gate.mjs +0 -0
  171. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/deepseek/usage.mjs +0 -0
  172. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  173. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  174. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  175. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  176. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  177. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/node.py +0 -0
  178. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/null/__init__.py +0 -0
  179. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  180. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/opencode/__init__.py +0 -0
  181. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/opencode/mcp-ready.js +0 -0
  182. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  183. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  184. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  185. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  186. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  187. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  188. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  189. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  190. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/utils/core.py +0 -0
  191. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/utils/install.py +0 -0
  192. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/utils/launch.py +0 -0
  193. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  194. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/interception/__init__.py +0 -0
  195. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/interception/base.py +0 -0
  196. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/interception/pool.py +0 -0
  197. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/interception/server.py +0 -0
  198. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  199. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/interception/tunnel/base.py +0 -0
  200. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/interception/tunnel/custom.py +0 -0
  201. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/interception/tunnel/prime.py +0 -0
  202. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/judge.py +0 -0
  203. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/judges/__init__.py +0 -0
  204. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/judges/decision.py +0 -0
  205. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/judges/reference.py +0 -0
  206. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/judges/reference.txt +0 -0
  207. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/judges/rubric.py +0 -0
  208. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/judges/rubric.txt +0 -0
  209. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/mcp/__init__.py +0 -0
  210. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/mcp/launch.py +0 -0
  211. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/mcp/server.py +0 -0
  212. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/mcp/toolset.py +0 -0
  213. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/rollout.py +0 -0
  214. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/__init__.py +0 -0
  215. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/apptainer.py +0 -0
  216. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/base.py +0 -0
  217. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/compose.py +0 -0
  218. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/container.py +0 -0
  219. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/deployment.py +0 -0
  220. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  221. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/docker/egress.py +0 -0
  222. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/e2b.py +0 -0
  223. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/limiters.py +0 -0
  224. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/modal.py +0 -0
  225. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/prime.py +0 -0
  226. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/private_network.py +0 -0
  227. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/runtime.py +0 -0
  228. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/strategies.py +0 -0
  229. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/runtimes/subprocess.py +0 -0
  230. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/semantic.py +0 -0
  231. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/serve/__init__.py +0 -0
  232. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/serve/client.py +0 -0
  233. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/serve/delta.py +0 -0
  234. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/serve/encoding.py +0 -0
  235. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/serve/pool.py +0 -0
  236. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/serve/server.py +0 -0
  237. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/serve/types.py +0 -0
  238. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/session.py +0 -0
  239. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/state.py +0 -0
  240. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/task.py +0 -0
  241. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/taskset.py +0 -0
  242. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/__init__.py +0 -0
  243. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  244. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  245. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  246. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  247. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  248. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  249. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  250. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  251. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  252. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  253. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  254. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  255. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/trace.py +0 -0
  256. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/__init__.py +0 -0
  257. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/aio.py +0 -0
  258. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/artifacts.py +0 -0
  259. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/compile.py +0 -0
  260. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/decorators.py +0 -0
  261. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/env.py +0 -0
  262. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/eval.py +0 -0
  263. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/format.py +0 -0
  264. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/generic.py +0 -0
  265. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/git.py +0 -0
  266. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/image.py +0 -0
  267. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/interrupt.py +0 -0
  268. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/logging.py +0 -0
  269. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/memory.py +0 -0
  270. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/paths.py +0 -0
  271. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/platform.py +0 -0
  272. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/prime.py +0 -0
  273. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/retries.py +0 -0
  274. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/scope.py +0 -0
  275. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/score.py +0 -0
  276. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/verifiers/v1/utils/trace_store.py +0 -0
  277. {verifiers-0.4.1.dev46 → verifiers-0.4.1.dev47}/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.dev46
3
+ Version: 0.4.1.dev47
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
@@ -192,31 +192,32 @@ def grid(
192
192
  return cells
193
193
 
194
194
 
195
- def transports(harness: str) -> tuple[str, ...]:
196
- """The wire formats the harness config can select (`transport`) besides its
197
- default. Empty when the program speaks one format or picks its own."""
198
- field = harness_config_type(harness).model_fields.get("transport")
199
- if field is None:
200
- return ()
201
- return tuple(t for t in get_args(field.annotation) if t != field.default)
195
+ def dialects(harness: str) -> tuple[str, ...]:
196
+ """The dialects the harness config can select besides its default. Empty when the
197
+ program speaks one dialect or picks its own."""
198
+ field = harness_config_type(harness).model_fields["dialect"]
199
+ return tuple(
200
+ value
201
+ for arg in get_args(field.annotation)
202
+ for value in get_args(arg) or (arg,)
203
+ if value != field.default
204
+ )
202
205
 
203
206
 
204
- def transport_grid(
207
+ def dialect_grid(
205
208
  runtimes: Sequence[str] = ("prime",), *, needs: tuple[str, ...] = ()
206
209
  ) -> list:
207
- """`grid` cells for every non-default `transport` each harness config can select."""
210
+ """`grid` cells for every non-default `dialect` each harness config can select."""
208
211
  cells = []
209
212
  for harness in HARNESSES:
210
213
  name = harness_id(harness)
211
- for transport in transports(name):
212
- for cell in grid(
213
- [{"id": name, "transport": transport}], runtimes, needs=needs
214
- ):
214
+ for dialect in dialects(name):
215
+ for cell in grid([{"id": name, "dialect": dialect}], runtimes, needs=needs):
215
216
  cells.append(
216
217
  pytest.param(
217
218
  *cell.values,
218
219
  marks=cell.marks,
219
- id=cell.id.replace(f"{name}-in-", f"{name}-{transport}-in-"),
220
+ id=cell.id.replace(f"{name}-in-", f"{name}-{dialect}-in-"),
220
221
  )
221
222
  )
222
223
  return cells
@@ -1,14 +1,14 @@
1
1
  """One task, many turns: the model completes a shell task (echo-agentic: write a phrase
2
2
  to a file, checked in the runtime) across the harness x runtime grid, and on prime over
3
- every other `transport` a harness config can select. A turn the harness re-sends
3
+ 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 grid, mark, transport_grid
7
+ from grid import dialect_grid, grid, mark
8
8
 
9
9
  MULTI_TURN = [
10
10
  *grid(needs=("shell",)),
11
- *transport_grid(needs=("shell",)),
11
+ *dialect_grid(needs=("shell",)),
12
12
  pytest.param(
13
13
  "bash",
14
14
  {"type": "modal", "allow": []},
@@ -305,6 +305,14 @@ def _replayed_trace(replay_view, sampled, replayed, dialect=None):
305
305
  ),
306
306
  (strip_text, {"content": "Calling it.\n\n"}, {"content": "Calling it."}),
307
307
  (strip_text, {"content": None}, {"reasoning_content": " "}),
308
+ (
309
+ strip_text,
310
+ {"content": "\n\n"},
311
+ {
312
+ "reasoning_content": " ",
313
+ "provider_state": [{"type": "thinking", "thinking": " "}],
314
+ },
315
+ ),
308
316
  ],
309
317
  )
310
318
  def test_replay_view_matches_cosmetically_rewritten_turns(view, sampled, replayed):
@@ -29,10 +29,10 @@ def test_every_builtin_harness_loads() -> None:
29
29
 
30
30
  def test_harness_config_narrows_to_its_own_type() -> None:
31
31
  config = vf.AgentConfig.model_validate(
32
- {"harness": {"id": "kimi-code", "transport": "responses"}}
32
+ {"harness": {"id": "kimi-code", "dialect": "responses"}}
33
33
  )
34
34
  assert type(config.harness) is harness_config_type("kimi-code")
35
- assert config.harness.transport == "responses"
35
+ assert config.harness.dialect == "responses"
36
36
 
37
37
 
38
38
  def test_unknown_harness_names_the_builtins() -> None:
@@ -9,7 +9,7 @@ from typing import Annotated, Literal
9
9
  from pydantic import ConfigDict, Field, FiniteFloat
10
10
  from pydantic_config import BaseConfig
11
11
 
12
- from verifiers.v1.types import ID
12
+ from verifiers.v1.types import ID, DialectName
13
13
 
14
14
  PinnedVersion = Annotated[str, Field(pattern=r"^[A-Za-z0-9._+-]+$")]
15
15
  """A release/tag a harness pins its program install to."""
@@ -52,6 +52,9 @@ class HarnessConfig(BaseConfig):
52
52
  tool_timeout: FiniteFloat = Field(600.0, gt=0)
53
53
  """Seconds a single MCP tool call may take; raise it for tools that boot a VM."""
54
54
  disabled_tools: list[str] | None = None
55
+ dialect: DialectName | Literal["auto"] = "auto"
56
+ """Model API wire format the program speaks. `auto` lets the program pick, e.g. from
57
+ the model. Each harness narrows this to the formats it can select."""
55
58
  skills: list[SkillSource] = Field(default_factory=list)
56
59
  """Host skill folders or `{runtime: path}` roots of skills inside the runtime.
57
60
  Sources are installed in order; later files override matching earlier files.
@@ -1,4 +1,5 @@
1
1
  import os
2
+ from typing import Literal
2
3
 
3
4
  from pydantic import PositiveInt
4
5
  from pydantic_config import BaseConfig
@@ -38,6 +39,7 @@ class CompactionConfig(BaseConfig):
38
39
 
39
40
 
40
41
  class BashHarnessConfig(HarnessConfig):
42
+ dialect: Literal["chat_completions"] = "chat_completions"
41
43
  edit: bool = True
42
44
  """Offer the local `edit` tool (single-occurrence string replacement in a file) alongside
43
45
  `bash`. On by default; set `--env.agent.harness.edit false` for a bash-only agent."""
@@ -32,6 +32,7 @@ Finding elements: prefer the accessibility tree over screenshots. cdp("Accessibi
32
32
 
33
33
 
34
34
  class BrowserUseHarnessConfig(HarnessConfig):
35
+ dialect: Literal["chat_completions"] = "chat_completions"
35
36
  browser: Literal["chromium", "cdp"] = "chromium"
36
37
  """`chromium` launches locally; `cdp` attaches to `cdp_url` without owning it."""
37
38
 
@@ -1,6 +1,7 @@
1
1
  """Run Claude Code through the Claude Agent SDK ACP adapter."""
2
2
 
3
3
  import json
4
+ from typing import Literal
4
5
 
5
6
  from verifiers.v1.acp import ACPConfig, ACPHarness
6
7
  from verifiers.v1.clients import ModelContext
@@ -32,6 +33,7 @@ touch {ready}
32
33
 
33
34
 
34
35
  class ClaudeCodeHarnessConfig(HarnessConfig):
36
+ dialect: Literal["anthropic_messages"] = "anthropic_messages"
35
37
  version: PinnedVersion = "2.1.278"
36
38
  """Claude Code release to install, pinned for reproducibility."""
37
39
 
@@ -7,6 +7,7 @@ import re
7
7
  import tomllib
8
8
  from collections import Counter
9
9
  from pathlib import Path
10
+ from typing import Literal
10
11
 
11
12
  import tomli_w
12
13
 
@@ -48,6 +49,9 @@ GATE_HANDLER = {
48
49
 
49
50
 
50
51
  class CodexHarnessConfig(HarnessConfig):
52
+ # Codex accepts no other wire API:
53
+ # https://github.com/openai/codex/blob/rust-v0.155.1/codex-rs/model-provider-info/src/lib.rs#L61
54
+ dialect: Literal["responses"] = "responses"
51
55
  version: PinnedVersion = "0.155.1"
52
56
  """Codex release to install, pinned for reproducibility."""
53
57
  multi_agent: bool = False
@@ -2,6 +2,7 @@
2
2
 
3
3
  import json
4
4
  from pathlib import Path
5
+ from typing import Literal
5
6
 
6
7
  from verifiers.v1.acp import ACPConfig, ACPHarness
7
8
  from verifiers.v1.clients import ModelContext
@@ -25,6 +26,9 @@ touch "$VF_DEEPSEEK_DIR/.ready"
25
26
 
26
27
 
27
28
  class DeepSeekHarnessConfig(HarnessConfig):
29
+ # The `deepseek-official` route speaks Anthropic messages:
30
+ # https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.1-alpha.3/packages/llm/llm-deepseek/src/messages-api.ts#L14-L17
31
+ dialect: Literal["anthropic_messages"] = "anthropic_messages"
28
32
  version: PinnedVersion = "0.2.1-alpha.3"
29
33
  """DeepSeek CLI release, pinned to its shipped sdk-minimal composition."""
30
34
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import json
4
4
  from pathlib import Path
5
+ from typing import Literal
5
6
 
6
7
  from verifiers.v1.acp import ACPConfig, ACPHarness
7
8
  from verifiers.v1.clients import ModelContext
@@ -32,6 +33,10 @@ class HermesAgentHarnessConfig(HarnessConfig):
32
33
  """Hermes Agent Git release tag to install, pinned for reproducibility."""
33
34
  use_bundled_skill: bool = False
34
35
  """Enable Hermes Agent's bundled skill catalog in addition to uploaded skills."""
36
+ # Over Responses it replays an earlier turn without its reasoning.
37
+ dialect: Literal["chat_completions", "anthropic_messages", "auto"] = "auto"
38
+ """`auto` lets Hermes pick the transport from the model name on eval clients, and
39
+ chat completions on others."""
35
40
 
36
41
 
37
42
  class HermesAgentHarness(ACPHarness[HermesAgentHarnessConfig]):
@@ -94,7 +99,9 @@ class HermesAgentHarness(ACPHarness[HermesAgentHarnessConfig]):
94
99
  "api_key": secret,
95
100
  "discover_models": False,
96
101
  }
97
- if ctx.client.type == "eval":
102
+ if self.config.dialect != "auto":
103
+ provider["transport"] = self.config.dialect
104
+ elif ctx.client.type == "eval":
98
105
  provider["transport"] = "${HERMES_INTERCEPT_TRANSPORT}"
99
106
  config = {
100
107
  "model": model,
@@ -40,8 +40,7 @@ fi
40
40
  class KimiCodeHarnessConfig(HarnessConfig):
41
41
  version: PinnedVersion = "2.0.2"
42
42
  """Kimi Code release to install, pinned for reproducibility."""
43
- transport: DialectName = "chat_completions"
44
- """Model API transport."""
43
+ dialect: DialectName = "chat_completions"
45
44
 
46
45
 
47
46
  class KimiCodeHarness(ACPHarness[KimiCodeHarnessConfig]):
@@ -87,10 +86,10 @@ class KimiCodeHarness(ACPHarness[KimiCodeHarnessConfig]):
87
86
  "chat_completions": "openai",
88
87
  "responses": "openai_responses",
89
88
  "anthropic_messages": "anthropic",
90
- }[self.config.transport]
89
+ }[self.config.dialect]
91
90
  base_url = (
92
91
  endpoint.removesuffix("/v1")
93
- if self.config.transport == "anthropic_messages"
92
+ if self.config.dialect == "anthropic_messages"
94
93
  else endpoint
95
94
  )
96
95
  config = {
@@ -1,4 +1,5 @@
1
1
  from pathlib import Path
2
+ from typing import Literal
2
3
 
3
4
  from verifiers.v1.clients import ModelContext
4
5
  from verifiers.v1.configs.harness import HarnessConfig, PinnedVersion
@@ -11,6 +12,7 @@ PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
11
12
 
12
13
 
13
14
  class MiniSWEAgentHarnessConfig(HarnessConfig):
15
+ dialect: Literal["chat_completions"] = "chat_completions"
14
16
  version: PinnedVersion = "2.4.6"
15
17
  """mini-swe-agent release to install, pinned for reproducibility."""
16
18
 
@@ -1,3 +1,5 @@
1
+ from typing import Literal
2
+
1
3
  from verifiers.v1.clients import ModelContext
2
4
  from verifiers.v1.configs.harness import HarnessConfig
3
5
  from verifiers.v1.harness import Harness
@@ -11,7 +13,7 @@ from verifiers.v1.trace import Trace
11
13
 
12
14
 
13
15
  class NullHarnessConfig(HarnessConfig):
14
- pass
16
+ dialect: Literal["chat_completions"] = "chat_completions"
15
17
 
16
18
 
17
19
  class NullHarness(Harness[NullHarnessConfig]):
@@ -2,6 +2,7 @@
2
2
 
3
3
  import json
4
4
  import logging
5
+ from typing import Literal
5
6
 
6
7
  from verifiers.v1.acp import ACPConfig, ACPHarness
7
8
  from verifiers.v1.clients import ModelContext
@@ -118,6 +119,8 @@ wait "$acp_pid"
118
119
  class OpenClawHarnessConfig(HarnessConfig):
119
120
  version: PinnedVersion = "2026.9.5"
120
121
  """OpenClaw release to install, pinned for reproducibility."""
122
+ dialect: Literal["auto"] = "auto"
123
+ """OpenClaw takes the transport from its model catalog."""
121
124
  use_bundled_skill: bool = True
122
125
  """Enable OpenClaw's bundled skill catalog in addition to uploaded harness skills."""
123
126
 
@@ -30,8 +30,7 @@ npm install --prefix "$VF_OPENCODE_DIR" --no-audit --no-fund --omit=dev \
30
30
  class OpenCodeHarnessConfig(HarnessConfig):
31
31
  version: PinnedVersion = "2.0.26"
32
32
  """OpenCode 2 release to install, pinned for reproducibility."""
33
- transport: DialectName = "chat_completions"
34
- """Model API transport."""
33
+ dialect: DialectName = "chat_completions"
35
34
  disabled_tools: list[str] | None = None
36
35
  """OpenCode permission actions to deny, such as shell, read, or edit."""
37
36
 
@@ -87,7 +86,7 @@ class OpenCodeHarness(ACPHarness[OpenCodeHarnessConfig]):
87
86
  "chat_completions": "openai-compatible",
88
87
  "responses": "openai-compatible/responses",
89
88
  "anthropic_messages": "anthropic-compatible",
90
- }[self.config.transport]
89
+ }[self.config.dialect]
91
90
  settings = {
92
91
  "model": "intercept/model",
93
92
  "providers": {
@@ -50,8 +50,7 @@ fi
50
50
  class PiHarnessConfig(HarnessConfig):
51
51
  version: PinnedVersion = "0.86.1"
52
52
  """Pi release to install, pinned for reproducibility."""
53
- transport: DialectName = "chat_completions"
54
- """Model API transport."""
53
+ dialect: DialectName = "chat_completions"
55
54
  supports_developer_role: bool | None = None
56
55
  """Override Pi's chat-completions role detection for custom model endpoints."""
57
56
 
@@ -118,10 +117,10 @@ class PiHarness(ACPHarness[PiHarnessConfig]):
118
117
  "chat_completions": "openai-completions",
119
118
  "responses": "openai-responses",
120
119
  "anthropic_messages": "anthropic-messages",
121
- }[self.config.transport]
120
+ }[self.config.dialect]
122
121
  base_url = (
123
122
  endpoint.removesuffix("/v1")
124
- if self.config.transport == "anthropic_messages"
123
+ if self.config.dialect == "anthropic_messages"
125
124
  else endpoint
126
125
  )
127
126
  model_config = {
@@ -130,12 +129,12 @@ class PiHarness(ACPHarness[PiHarnessConfig]):
130
129
  "input": ["text", "image"],
131
130
  **(
132
131
  {"compat": {"sessionAffinityFormat": "openai-nosession"}}
133
- if self.config.transport == "responses"
132
+ if self.config.dialect == "responses"
134
133
  else {}
135
134
  ),
136
135
  }
137
136
  if (
138
- self.config.transport == "chat_completions"
137
+ self.config.dialect == "chat_completions"
139
138
  and self.config.supports_developer_role is not None
140
139
  ):
141
140
  model_config["compat"] = {
@@ -82,6 +82,8 @@ class PrimeAgentHarnessConfig(HarnessConfig):
82
82
 
83
83
  autonomous: bool = False
84
84
  """Enable Prime Agent's autonomous continuation loop."""
85
+ # Over Responses it replays an earlier turn without its reasoning.
86
+ dialect: Literal["chat_completions", "anthropic_messages"] = "chat_completions"
85
87
 
86
88
 
87
89
  class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
@@ -209,8 +211,15 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
209
211
  models = {
210
212
  "providers": {
211
213
  PROVIDER: {
212
- "baseUrl": endpoint,
213
- "api": "openai-completions",
214
+ # Its Anthropic provider appends `/v1/messages` to the base URL.
215
+ "baseUrl": endpoint.removesuffix("/v1")
216
+ if self.config.dialect == "anthropic_messages"
217
+ else endpoint,
218
+ "api": {
219
+ "chat_completions": "openai-completions",
220
+ "responses": "openai-responses",
221
+ "anthropic_messages": "anthropic-messages",
222
+ }[self.config.dialect],
214
223
  "apiKey": KEY_VAR,
215
224
  "models": [
216
225
  {
@@ -67,6 +67,7 @@ class CompactionConfig(BaseConfig):
67
67
 
68
68
 
69
69
  class RLMHarnessConfig(HarnessConfig):
70
+ dialect: Literal["chat_completions"] = "chat_completions"
70
71
  version: str = Field(
71
72
  default="77c3489d1a7f918b75c31e195480ed3556af60a5", min_length=1
72
73
  )
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  from pathlib import Path
3
+ from typing import Literal
3
4
 
4
5
  from verifiers.v1.clients import ModelContext
5
6
  from verifiers.v1.configs.harness import HarnessConfig, PinnedVersion
@@ -13,6 +14,7 @@ logger = logging.getLogger(__name__)
13
14
 
14
15
 
15
16
  class Terminus2HarnessConfig(HarnessConfig):
17
+ dialect: Literal["chat_completions"] = "chat_completions"
16
18
  version: PinnedVersion = "0.23.0"
17
19
  """Harbor release to install, pinned for reproducibility."""
18
20
 
@@ -19,7 +19,7 @@ def drop_blank_text(message: Message) -> Message:
19
19
 
20
20
  def strip_text(message: Message) -> Message:
21
21
  """Clients that store assistant text stripped, and pad a missing reasoning field
22
- with a single space on replay."""
22
+ (or Anthropic thinking block) with a single space on replay."""
23
23
  if not isinstance(message, AssistantMessage):
24
24
  return message
25
25
  update: dict = {}
@@ -27,4 +27,14 @@ def strip_text(message: Message) -> Message:
27
27
  update["content"] = message.content.strip() or None
28
28
  if message.reasoning_content is not None and not message.reasoning_content.strip():
29
29
  update["reasoning_content"] = None
30
+ if message.provider_state and any(
31
+ _blank_thinking(item) for item in message.provider_state
32
+ ):
33
+ update["provider_state"] = [
34
+ item for item in message.provider_state if not _blank_thinking(item)
35
+ ] or None
30
36
  return message.model_copy(update=update) if update else message
37
+
38
+
39
+ def _blank_thinking(item: dict) -> bool:
40
+ return item.get("type") == "thinking" and not str(item.get("thinking", "")).strip()
@@ -126,8 +126,8 @@ class Request(BaseModel):
126
126
  FinishReason = Literal["stop", "length", "tool_calls"] | None
127
127
 
128
128
  DialectName = Literal["chat_completions", "responses", "anthropic_messages"]
129
- """A model API wire format: a `Dialect.name`, and the values of harness `transport`
130
- settings."""
129
+ """A model API wire format: a `Dialect.name`, and the values of the harness `dialect`
130
+ setting."""
131
131
 
132
132
 
133
133
  class Usage(BaseModel):
@@ -52,7 +52,8 @@ def narrow_plugin_field(
52
52
  ) -> None:
53
53
  raw = data.get(field)
54
54
  if isinstance(raw, BaseConfig):
55
- raw = raw.model_dump()
55
+ # Unset fields take the concrete type's defaults, which may narrow the base's.
56
+ raw = raw.model_dump(exclude_unset=True)
56
57
  raw = dict(raw or {})
57
58
  ident = raw.get("id") or default_id
58
59
  if not ident:
File without changes