verifiers 0.4.1.dev34__tar.gz → 0.4.1.dev36__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 (271) hide show
  1. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/PKG-INFO +1 -1
  2. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_multi_turn_tool.py +5 -1
  3. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/prime_agent/harness.py +60 -60
  4. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/harbor/taskset.py +1 -3
  5. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/artifacts.py +120 -2
  6. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/trace_store.py +13 -0
  7. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/.gitignore +0 -0
  8. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/LICENSE +0 -0
  9. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/README.md +0 -0
  10. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/pyproject.toml +0 -0
  11. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/conftest.py +0 -0
  12. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/agent_user_harness_v1.py +0 -0
  13. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/agent_user_v1.py +0 -0
  14. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/counter_tool_v1.py +0 -0
  15. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/duet_v1.py +0 -0
  16. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/echo_acp_resume_v1.py +0 -0
  17. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/echo_agentic_v1.py +0 -0
  18. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/echo_tool_compose/docker-compose.yaml +0 -0
  19. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/echo_tool_v1.py +0 -0
  20. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/echo_user_sim_v1.py +0 -0
  21. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/echo_v1.py +0 -0
  22. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/network_policy_v1.py +0 -0
  23. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/pyproject.toml +0 -0
  24. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/skill_codeword_v1.py +0 -0
  25. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
  26. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/fixtures/tool_response_image_v1.py +0 -0
  27. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/grid.py +0 -0
  28. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_agent_user.py +0 -0
  29. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_agentic_judge.py +0 -0
  30. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_compose_scoring.py +0 -0
  31. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_examples.py +0 -0
  32. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_limits.py +0 -0
  33. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_multi_agent.py +0 -0
  34. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_multi_turn.py +0 -0
  35. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_multimodal_tool.py +0 -0
  36. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_network_policy.py +0 -0
  37. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_resume_tool.py +0 -0
  38. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_rubric_judge.py +0 -0
  39. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_sampling.py +0 -0
  40. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_shared_tool.py +0 -0
  41. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_single_turn.py +0 -0
  42. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_skills.py +0 -0
  43. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_stateful_tool.py +0 -0
  44. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_user_echo.py +0 -0
  45. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/integration/test_user_sim.py +0 -0
  46. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/cli/test_replay.py +0 -0
  47. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/conftest.py +0 -0
  48. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/harnesses/test_core.py +0 -0
  49. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/harnesses/test_rlm.py +0 -0
  50. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/interception/test_tunnel.py +0 -0
  51. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/judges/conftest.py +0 -0
  52. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/judges/test_judge.py +0 -0
  53. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/judges/test_reference.py +0 -0
  54. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/judges/test_rubric.py +0 -0
  55. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/runtimes/test_e2b.py +0 -0
  56. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/serve/test_client.py +0 -0
  57. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/serve/test_delta.py +0 -0
  58. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/serve/test_pool.py +0 -0
  59. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/test_agent.py +0 -0
  60. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/test_dialects.py +0 -0
  61. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/test_graph.py +0 -0
  62. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/test_semantic.py +0 -0
  63. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/test_task.py +0 -0
  64. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/test_taskset.py +0 -0
  65. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/test_trace.py +0 -0
  66. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/utils/test_compile.py +0 -0
  67. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/utils/test_loaders.py +0 -0
  68. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/utils/test_platform.py +0 -0
  69. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/tests/unit/utils/test_score.py +0 -0
  70. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/__init__.py +0 -0
  71. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/__init__.py +0 -0
  72. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/acp/__init__.py +0 -0
  73. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/acp/runner.py +0 -0
  74. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/agent.py +0 -0
  75. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/__init__.py +0 -0
  76. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  77. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/dashboard/base.py +0 -0
  78. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/dashboard/eval.py +0 -0
  79. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/dashboard/replay.py +0 -0
  80. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/dashboard/validate.py +0 -0
  81. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/debug.py +0 -0
  82. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/eval/__init__.py +0 -0
  83. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/eval/hint.py +0 -0
  84. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/eval/main.py +0 -0
  85. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/eval/resume.py +0 -0
  86. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/eval/runner.py +0 -0
  87. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/gepa.py +0 -0
  88. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/output.py +0 -0
  89. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/replay.py +0 -0
  90. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/resolve.py +0 -0
  91. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/resume.py +0 -0
  92. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/cli/validate.py +0 -0
  93. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/clients/__init__.py +0 -0
  94. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/clients/base.py +0 -0
  95. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/clients/client.py +0 -0
  96. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/clients/eval.py +0 -0
  97. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/clients/train.py +0 -0
  98. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/__init__.py +0 -0
  99. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/agent.py +0 -0
  100. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/cli/__init__.py +0 -0
  101. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/cli/debug.py +0 -0
  102. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/cli/env.py +0 -0
  103. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/cli/eval.py +0 -0
  104. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/cli/replay.py +0 -0
  105. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/cli/validate.py +0 -0
  106. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/client.py +0 -0
  107. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/env.py +0 -0
  108. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/harness.py +0 -0
  109. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/judge.py +0 -0
  110. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/retries.py +0 -0
  111. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/runtime.py +0 -0
  112. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/scoring.py +0 -0
  113. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/select.py +0 -0
  114. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/serve.py +0 -0
  115. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/task.py +0 -0
  116. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/configs/taskset.py +0 -0
  117. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/dialects/__init__.py +0 -0
  118. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/dialects/anthropic.py +0 -0
  119. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/dialects/base.py +0 -0
  120. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/dialects/chat.py +0 -0
  121. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/dialects/responses.py +0 -0
  122. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/env.py +0 -0
  123. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/envs/__init__.py +0 -0
  124. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  125. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  126. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  127. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/envs/best_of_n/env.py +0 -0
  128. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  129. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/envs/single_agent/env.py +0 -0
  130. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  131. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/envs/user_sim/env.py +0 -0
  132. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/episode.py +0 -0
  133. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/errors.py +0 -0
  134. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/gepa/__init__.py +0 -0
  135. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/gepa/adapter.py +0 -0
  136. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/gepa/config.py +0 -0
  137. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/gepa/dataset.py +0 -0
  138. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/gepa/reflection.py +0 -0
  139. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/gepa/runner.py +0 -0
  140. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/grading.py +0 -0
  141. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/graph.py +0 -0
  142. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harness.py +0 -0
  143. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/__init__.py +0 -0
  144. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  145. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/bash/harness.py +0 -0
  146. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  147. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  148. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  149. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  150. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  151. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  152. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  153. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/codex/harness.py +0 -0
  154. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/deepseek/__init__.py +0 -0
  155. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/deepseek/gate.mjs +0 -0
  156. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/deepseek/harness.py +0 -0
  157. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/deepseek/usage.mjs +0 -0
  158. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  159. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  160. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  161. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  162. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  163. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  164. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  165. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  166. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/node.py +0 -0
  167. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/null/__init__.py +0 -0
  168. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/null/harness.py +0 -0
  169. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  170. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  171. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/opencode/__init__.py +0 -0
  172. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/opencode/harness.py +0 -0
  173. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/opencode/mcp-ready.js +0 -0
  174. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  175. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  176. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/pi/harness.py +0 -0
  177. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  178. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  179. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  180. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  181. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  182. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  183. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  184. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  185. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/utils/core.py +0 -0
  186. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/utils/install.py +0 -0
  187. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/utils/launch.py +0 -0
  188. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  189. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/harnesses/utils/replay.py +0 -0
  190. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/interception/__init__.py +0 -0
  191. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/interception/base.py +0 -0
  192. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/interception/pool.py +0 -0
  193. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/interception/server.py +0 -0
  194. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  195. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/interception/tunnel/base.py +0 -0
  196. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/interception/tunnel/custom.py +0 -0
  197. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/interception/tunnel/prime.py +0 -0
  198. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/judge.py +0 -0
  199. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/judges/__init__.py +0 -0
  200. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/judges/decision.py +0 -0
  201. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/judges/reference.py +0 -0
  202. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/judges/reference.txt +0 -0
  203. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/judges/rubric.py +0 -0
  204. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/judges/rubric.txt +0 -0
  205. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/mcp/__init__.py +0 -0
  206. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/mcp/launch.py +0 -0
  207. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/mcp/server.py +0 -0
  208. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/mcp/toolset.py +0 -0
  209. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/rollout.py +0 -0
  210. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/__init__.py +0 -0
  211. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/apptainer.py +0 -0
  212. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/base.py +0 -0
  213. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/compose.py +0 -0
  214. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/container.py +0 -0
  215. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/deployment.py +0 -0
  216. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  217. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/docker/egress.py +0 -0
  218. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/e2b.py +0 -0
  219. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/limiters.py +0 -0
  220. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/modal.py +0 -0
  221. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/prime.py +0 -0
  222. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/runtime.py +0 -0
  223. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/strategies.py +0 -0
  224. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/runtimes/subprocess.py +0 -0
  225. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/semantic.py +0 -0
  226. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/serve/__init__.py +0 -0
  227. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/serve/client.py +0 -0
  228. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/serve/delta.py +0 -0
  229. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/serve/encoding.py +0 -0
  230. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/serve/pool.py +0 -0
  231. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/serve/server.py +0 -0
  232. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/serve/types.py +0 -0
  233. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/session.py +0 -0
  234. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/state.py +0 -0
  235. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/task.py +0 -0
  236. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/taskset.py +0 -0
  237. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/__init__.py +0 -0
  238. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  239. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  240. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  241. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  242. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  243. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  244. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  245. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  246. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  247. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  248. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  249. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/trace.py +0 -0
  250. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/types.py +0 -0
  251. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/__init__.py +0 -0
  252. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/aio.py +0 -0
  253. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/compile.py +0 -0
  254. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/decorators.py +0 -0
  255. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/env.py +0 -0
  256. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/eval.py +0 -0
  257. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/format.py +0 -0
  258. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/generic.py +0 -0
  259. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/git.py +0 -0
  260. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/image.py +0 -0
  261. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/interrupt.py +0 -0
  262. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/loaders.py +0 -0
  263. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/logging.py +0 -0
  264. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/memory.py +0 -0
  265. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/paths.py +0 -0
  266. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/platform.py +0 -0
  267. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/prime.py +0 -0
  268. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/retries.py +0 -0
  269. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/scope.py +0 -0
  270. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/verifiers/v1/utils/score.py +0 -0
  271. {verifiers-0.4.1.dev34 → verifiers-0.4.1.dev36}/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.dev34
3
+ Version: 0.4.1.dev36
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
@@ -28,7 +28,11 @@ async def test_tool(run, harness, harness_runtime):
28
28
  # Reward 1.0 is the proof the tool ran. How a program surfaces an MCP tool to the
29
29
  # model is its own business (rlm calls it from code; chat loops advertise it), so
30
30
  # the advertised schema is checked on the chat loop in `test_tool_placement`.
31
- assert trace.reward == 1.0
31
+ assert trace.reward == 1.0, "\n".join(
32
+ message.model_dump_json(exclude_none=True)
33
+ for message in trace.messages
34
+ if message.role in {"assistant", "tool"}
35
+ )
32
36
 
33
37
 
34
38
  @pytest.mark.parametrize(
@@ -8,10 +8,10 @@ from typing import Literal
8
8
  from verifiers.v1.acp import ACPConfig, ACPHarness, ACPTurn
9
9
  from verifiers.v1.clients import ModelContext
10
10
  from verifiers.v1.configs.harness import HarnessConfig, skill_destination
11
- from verifiers.v1.harnesses.node import NODE_BIN_DIR, ensure_node
12
11
  from verifiers.v1.harnesses.utils.install import ensure_installed, remove_dir
13
12
  from verifiers.v1.harnesses.utils.replay import drop_blank_text
14
13
  from verifiers.v1.runtimes import Runtime
14
+ from verifiers.v1.runtimes.base import _ENSURE_UV
15
15
  from verifiers.v1.task import TaskData
16
16
  from verifiers.v1.trace import Trace
17
17
  from verifiers.v1.types import Message
@@ -21,10 +21,10 @@ logger = logging.getLogger(__name__)
21
21
  GITHUB_RELEASE_URL = (
22
22
  "https://github.com/PrimeIntellect-ai/prime-agent/releases/download"
23
23
  )
24
- PRIME_AGENT_COMMIT: Literal["a7d791bc1be09793ed5f3ec05bf4cccbc60679ea"] = (
25
- "a7d791bc1be09793ed5f3ec05bf4cccbc60679ea"
24
+ PRIME_AGENT_COMMIT: Literal["763094e1b6a7c17450ee8399b06cda1853847ca5"] = (
25
+ "763094e1b6a7c17450ee8399b06cda1853847ca5"
26
26
  )
27
- PRIME_AGENT_VERSION = "0.9.5"
27
+ PRIME_AGENT_VERSION = "0.10.0"
28
28
  PRIME_AGENT_DIR = "/var/tmp/vf-prime-agent"
29
29
  STATE_ROOT = "/tmp/vf-prime-agent-runs"
30
30
  PROVIDER = "intercept"
@@ -33,63 +33,51 @@ KEY_VAR = "PRIME_AGENT_INTERCEPT_KEY"
33
33
  ENV_AGENT_DIR = "PRIME_AGENT_CODING_AGENT_DIR"
34
34
 
35
35
 
36
- INSTALL = r"""
37
- set -e
38
- export PATH="/var/tmp/vf-node/bin:$PATH"
36
+ INSTALL = (
37
+ "set -e\n"
38
+ + _ENSURE_UV
39
+ + r"""
39
40
  prefix="$VF_PRIME_AGENT_DIR/$PRIME_AGENT_COMMIT"
40
- [ -x "$prefix/bin/prime-agent" ] && [ -f "$PRIME_AGENT_KERNEL_VENV/.bootstrap-version" ] && exit 0
41
- export NPM_CONFIG_PREFIX="$prefix"
42
- export PRIME_AGENT_BOOTSTRAP_KERNEL_ON_INSTALL=1
43
- release_url="$VF_PRIME_AGENT_GITHUB_RELEASE_URL/v$PRIME_AGENT_RELEASE_VERSION"
44
- agent_tarball="prime-agent-$PRIME_AGENT_RELEASE_VERSION.tgz"
45
- ai_tarball="prime-agent-ai-$PRIME_AGENT_RELEASE_VERSION.tgz"
46
- core_tarball="prime-agent-core-$PRIME_AGENT_RELEASE_VERSION.tgz"
47
- tui_tarball="prime-agent-tui-$PRIME_AGENT_RELEASE_VERSION.tgz"
48
- download_dir="$(mktemp -d "$VF_PRIME_AGENT_DIR/install.XXXXXX")"
49
- trap 'rm -rf "$download_dir"' EXIT
50
- for tarball in "$agent_tarball" "$ai_tarball" "$core_tarball" "$tui_tarball"; do
51
- curl -fsSL --retry 5 --retry-all-errors \
52
- "$release_url/$tarball" -o "$download_dir/$tarball"
41
+ if [ ! -x "$prefix/bin/prime-agent" ]; then
42
+ case "$(uname -s)-$(uname -m)" in
43
+ Linux-x86_64) platform=linux-x64; sha=c16bd2af5e77b53f49b914a44742c4cf6a67c5ed5000041430b78dbd4c3bcbec ;;
44
+ Linux-aarch64|Linux-arm64) platform=linux-arm64; sha=f3cab3530a4d7ca43dbef8321bf13f260d1ba05d8b5dde057165a20bd4f675c4 ;;
45
+ Darwin-x86_64) platform=darwin-x64; sha=af4866b5ba82f3419b964290e3f023ddb9b99958a89e16ee856962b901ec0fc6 ;;
46
+ Darwin-arm64) platform=darwin-arm64; sha=e418bdf62fcb0002777bf3ac43bcc136512b26763f2ab5c500792f26e37294e5 ;;
47
+ *) echo "unsupported prime-agent platform: $(uname -s)-$(uname -m)" >&2; exit 1 ;;
48
+ esac
49
+ command -v curl >/dev/null || { apt-get update -qq && apt-get install -y -qq curl ca-certificates; } || apk add --no-cache curl ca-certificates
50
+ release_url="$VF_PRIME_AGENT_GITHUB_RELEASE_URL/v$PRIME_AGENT_RELEASE_VERSION"
51
+ tarball="prime-agent-$PRIME_AGENT_RELEASE_VERSION-$platform.tar.gz"
52
+ download_dir="$(mktemp -d "$VF_PRIME_AGENT_DIR/install.XXXXXX")"
53
+ trap 'rm -rf "$download_dir"' EXIT
54
+ curl -fsSL --retry 5 --retry-all-errors "$release_url/$tarball" -o "$download_dir/$tarball"
55
+ printf '%s %s\n' "$sha" "$tarball" > "$download_dir/SHA256SUMS"
56
+ if command -v sha256sum >/dev/null; then
57
+ (cd "$download_dir" && sha256sum -c SHA256SUMS)
58
+ else
59
+ (cd "$download_dir" && shasum -a 256 -c SHA256SUMS)
60
+ fi
61
+ mkdir "$download_dir/bin"
62
+ tar -xzf "$download_dir/$tarball" -C "$download_dir/bin"
63
+ [ "$("$download_dir/bin/prime-agent" --version)" = "$PRIME_AGENT_RELEASE_VERSION" ]
64
+ mkdir -p "$prefix"
65
+ mv "$download_dir/bin" "$prefix/bin"
66
+ fi
67
+ # Let the released binary validate the kernel cache and prepare its Python runtime.
68
+ "$prefix/bin/prime-agent" --prime-agent-bootstrap
69
+ # Bootstrap installs only the runtime; sessions also import the bundled Python skills.
70
+ set --
71
+ for pyproject in "$prefix/bin/skills/"*/pyproject.toml; do
72
+ set -- "$@" --editable "${pyproject%/pyproject.toml}"
53
73
  done
54
- printf '%s %s\n' \
55
- '349f1682c7909550842f1b04a71ba95814341b136474ade736df93f8ec006876' "$agent_tarball" \
56
- '9ad0184b7b5f3d5c3b1677c0663335de32c092cbdb72697aeaf997f17910bb92' "$ai_tarball" \
57
- '59aafeffb4b64eb997399d56a03f529b2f6604b228e5674372195277db52f04a' "$core_tarball" \
58
- 'e49f41170edfd1d0e72418729d2c117969ccf8df784dc55fe8c1a9d91778e103' "$tui_tarball" \
59
- > "$download_dir/SHA256SUMS"
60
- (cd "$download_dir" && sha256sum -c SHA256SUMS)
61
- mkdir "$download_dir/package-root"
62
- tar -xzf "$download_dir/$agent_tarball" -C "$download_dir/package-root"
63
- node - \
64
- "$download_dir/package-root/package/package.json" \
65
- "$download_dir" \
66
- "$ai_tarball" \
67
- "$core_tarball" \
68
- "$tui_tarball" <<'NODE'
69
- const fs = require("node:fs");
70
- const [manifestPath, downloadDir, ai, core, tui] = process.argv.slice(2);
71
- const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
72
- for (const [name, file] of [
73
- ["@earendil-works/pi-ai", ai],
74
- ["@earendil-works/pi-agent-core", core],
75
- ["@earendil-works/pi-tui", tui],
76
- ]) {
77
- manifest.dependencies[name] = `file:${downloadDir}/${file}`;
78
- }
79
- fs.writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
80
- NODE
81
- mkdir "$download_dir/repacked"
82
- repacked="$(npm pack "$download_dir/package-root/package" \
83
- --pack-destination "$download_dir/repacked" --silent)"
84
- PRIME_AGENT_BOOTSTRAP_TOOLS_ON_INSTALL=1 npm install -g \
85
- --no-fund --no-audit --loglevel=error --progress=false \
86
- "$download_dir/repacked/$repacked"
87
- [ -f "$PRIME_AGENT_KERNEL_VENV/.bootstrap-version" ]
74
+ uv pip install --python "$PRIME_AGENT_KERNEL_VENV/bin/python" "$@"
88
75
  """
76
+ )
89
77
 
90
78
 
91
79
  class PrimeAgentHarnessConfig(HarnessConfig):
92
- commit: Literal["a7d791bc1be09793ed5f3ec05bf4cccbc60679ea"] = PRIME_AGENT_COMMIT
80
+ commit: Literal["763094e1b6a7c17450ee8399b06cda1853847ca5"] = PRIME_AGENT_COMMIT
93
81
  """Prime Agent release commit to install."""
94
82
 
95
83
  autonomous: bool = False
@@ -101,8 +89,8 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
101
89
  SUPPORTS_MCP = True
102
90
  SUPPORTS_SKILLS = True
103
91
 
104
- # Its pi-ai fork drops whitespace-only assistant text on replay. Recheck on bumps:
105
- # https://github.com/PrimeIntellect-ai/prime-agent/blob/v0.9.5/packages/ai/src/providers/openai-completions.ts#L895
92
+ # Its chat-completions provider drops whitespace-only assistant text on replay. Recheck on bumps:
93
+ # https://github.com/PrimeIntellect-ai/prime-agent/blob/v0.10.0/crates/pa-ai/src/providers/openai_completions/convert.rs#L106
106
94
  def replay_view(self, message: Message) -> Message:
107
95
  return drop_blank_text(message)
108
96
 
@@ -161,7 +149,6 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
161
149
  statuses.append(status)
162
150
 
163
151
  async def setup(self, runtime: Runtime) -> None:
164
- await ensure_node(runtime)
165
152
  logger.info("prime-agent: ensuring commit %s is installed", self.config.commit)
166
153
  await ensure_installed(
167
154
  runtime,
@@ -262,6 +249,18 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
262
249
  args += ["--skill", skill_destination(skill, skills_dir)]
263
250
  if system_prompt:
264
251
  args += ["--append-system-prompt", system_prompt]
252
+ if mcp_urls:
253
+ # ACP servers need discovery guidance; importing the SDK shadows the REPL helper.
254
+ args += [
255
+ "--append-system-prompt",
256
+ (
257
+ f"Connected MCP servers: {json.dumps(list(mcp_urls))}. "
258
+ "Use the pre-imported `mcp` helper in `ipython`, or `from rlm import mcp`. "
259
+ "Do not `import mcp`: that loads the unrelated SDK and overwrites the helper. "
260
+ "Discover tools with `print(await mcp.list_tools(server))`, then call them "
261
+ "with `print(await mcp.call_tool(server, tool, arguments))`."
262
+ ),
263
+ ]
265
264
 
266
265
  return ACPConfig(
267
266
  env=self._env(trace, secret),
@@ -270,7 +269,7 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
270
269
  "/bin/sh",
271
270
  "-eu",
272
271
  "-c",
273
- f'export PATH="{NODE_BIN_DIR}:$HOME/.local/bin:$PATH"; exec "$@"',
272
+ 'export PATH="$HOME/.local/bin:$PATH"; exec "$@"',
274
273
  "prime-agent",
275
274
  *args,
276
275
  ],
@@ -301,6 +300,7 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
301
300
  KEY_VAR: secret,
302
301
  ENV_AGENT_DIR: f"{root}/agent",
303
302
  "TMPDIR": f"{root}/tmp",
304
- "PRIME_AGENT_KERNEL_VENV": self._kernel_venv(),
303
+ # Sessions use the installed interpreter without writing to the shared venv.
304
+ "PRIME_AGENT_KERNEL_PYTHON": f"{self._kernel_venv()}/bin/python",
305
305
  "PRIME_AGENT_TELEMETRY": "0",
306
306
  }
@@ -830,12 +830,10 @@ def parse_verifier_extras(
830
830
 
831
831
  artifacts: list[HarborArtifact] = []
832
832
  for entry in normalize_artifact_entries(parsed.artifacts):
833
- # `destination` positions a file in Harbor's host trial directory. Verifiers has
834
- # no such directory (the trace is the record) and Harbor never lets destination
835
- # affect verifier-side placement, so it cannot change any grading outcome.
836
833
  artifacts.append(
837
834
  HarborArtifact(
838
835
  source=entry.source,
836
+ destination=entry.destination,
839
837
  service=effective_artifact_service(entry),
840
838
  exclude=list(entry.exclude or []),
841
839
  required=False,
@@ -3,14 +3,17 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import io
6
+ import json
6
7
  import logging
7
8
  import shlex
9
+ import shutil
8
10
  import tarfile
11
+ import tempfile
9
12
  import uuid
10
- from pathlib import PurePosixPath
13
+ from pathlib import Path, PurePosixPath
11
14
  from typing import TYPE_CHECKING
12
15
 
13
- from pydantic import BaseModel, Field
16
+ from pydantic import BaseModel, Field, field_validator
14
17
 
15
18
  if TYPE_CHECKING:
16
19
  from verifiers.v1.runtimes import Runtime
@@ -29,10 +32,31 @@ class Artifact(BaseModel):
29
32
  """One path to restore at the same location in another runtime."""
30
33
 
31
34
  source: str
35
+ destination: str | None = None
36
+ """Saved path relative to the trace's artifact directory; grading uses `source`."""
32
37
  exclude: list[str] = Field(default_factory=list)
33
38
  """`tar --exclude` patterns, applied when `source` is a directory."""
34
39
  required: bool = True
35
40
 
41
+ @field_validator("destination")
42
+ @classmethod
43
+ def validate_destination(cls, value: str | None) -> str | None:
44
+ if not value:
45
+ return None
46
+ path = PurePosixPath(value)
47
+ if (
48
+ path.is_absolute()
49
+ or not path.parts
50
+ or ".." in path.parts
51
+ or "\\" in value
52
+ or path.parts[0] == "manifest.json"
53
+ ):
54
+ raise ValueError(
55
+ "artifact destination must be a relative path without '..' or "
56
+ "backslashes, outside the reserved manifest.json path"
57
+ )
58
+ return str(path)
59
+
36
60
 
37
61
  async def collect(
38
62
  runtime: Runtime,
@@ -136,6 +160,100 @@ async def collect(
136
160
  return collected
137
161
 
138
162
 
163
+ def save_artifacts(
164
+ directory: Path,
165
+ collected: dict[str, bytes | None],
166
+ artifacts: list[Artifact],
167
+ *,
168
+ workdir: str = "/",
169
+ ) -> None:
170
+ """Save collected files at their declared destinations, with a manifest.
171
+
172
+ Unpack each validated archive in isolation before moving its files into the
173
+ saved tree. Failed or conflicting entries are recorded without losing the
174
+ completed trace. Source-mirrored directories may merge: collection splits
175
+ nested declarations out of the implicit convention sweep.
176
+ """
177
+ declared = {str(PurePosixPath(workdir) / a.source): a for a in artifacts}
178
+ manifest: list[dict] = []
179
+ claims: list[tuple[PurePosixPath, bool]] = []
180
+ directory.parent.mkdir(parents=True, exist_ok=True)
181
+ with tempfile.TemporaryDirectory(dir=directory.parent) as temporary:
182
+ saved = Path(temporary) / "artifacts"
183
+ saved.mkdir()
184
+ (saved / "manifest.json").touch()
185
+ for source, archive in collected.items():
186
+ artifact = declared.get(source, Artifact(source=source))
187
+ destination = artifact.destination or artifact.source.lstrip("/")
188
+ entry = {
189
+ "source": source,
190
+ "service": getattr(artifact, "service", "main"),
191
+ "destination": destination,
192
+ "status": "empty",
193
+ }
194
+ manifest.append(entry)
195
+ try:
196
+ _validate_restore(source, archive)
197
+ Artifact.validate_destination(artifact.destination)
198
+ target = PurePosixPath(destination)
199
+ entry["destination"] = str(target)
200
+ if archive is None:
201
+ continue
202
+ with tarfile.open(fileobj=io.BytesIO(archive), mode="r:") as tar:
203
+ members = tar.getmembers()
204
+ if not members:
205
+ continue
206
+ root = PurePosixPath(source).relative_to("/")
207
+ paths = [
208
+ saved / target / PurePosixPath(member.name).relative_to(root)
209
+ for member in members
210
+ ]
211
+ # Explicit renames claim a whole subtree. Source-mirrored
212
+ # entries may share directories, but never overwrite files.
213
+ if any(
214
+ (artifact.destination or renamed)
215
+ and (
216
+ target.is_relative_to(prior) or prior.is_relative_to(target)
217
+ )
218
+ for prior, renamed in claims
219
+ ) or any(
220
+ path.is_symlink()
221
+ or (path.exists() and not (member.isdir() and path.is_dir()))
222
+ or any(
223
+ parent.is_symlink()
224
+ or (parent.exists() and not parent.is_dir())
225
+ for parent in path.parents
226
+ if parent.is_relative_to(saved)
227
+ )
228
+ for member, path in zip(members, paths, strict=True)
229
+ ):
230
+ entry["status"] = "skipped"
231
+ entry["error"] = (
232
+ "destination overlaps a previously saved artifact"
233
+ )
234
+ logger.warning("artifact %r: %s", source, entry["error"])
235
+ continue
236
+ with tempfile.TemporaryDirectory(dir=temporary) as unpacked:
237
+ tar.extractall(unpacked, filter="data")
238
+ for member, path in zip(members, paths, strict=True):
239
+ if member.isdir():
240
+ path.mkdir(parents=True, exist_ok=True)
241
+ else:
242
+ path.parent.mkdir(parents=True, exist_ok=True)
243
+ (Path(unpacked) / member.name).replace(path)
244
+ claims.append((target, artifact.destination is not None))
245
+ entry["status"] = "ok"
246
+ except (OSError, ValueError, RuntimeError, tarfile.TarError) as exc:
247
+ entry.update(status="failed", error=str(exc))
248
+ logger.warning("failed to save artifact %r: %s", source, exc)
249
+ (saved / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n")
250
+ if directory.is_symlink():
251
+ raise ValueError(f"artifact directory must not be a symlink: {directory}")
252
+ if directory.exists():
253
+ shutil.rmtree(directory)
254
+ saved.replace(directory)
255
+
256
+
139
257
  async def restore(runtime: Runtime, collected: dict[str, bytes | None]) -> None:
140
258
  """Extract `collected` in `runtime` at the original absolute paths.
141
259
 
@@ -14,6 +14,7 @@ from verifiers.v1.state import StateT
14
14
  from verifiers.v1.task import DataT
15
15
  from verifiers.v1.trace import AgentConfigT, Trace
16
16
  from verifiers.v1.utils.aio import run_shielded
17
+ from verifiers.v1.utils.artifacts import save_artifacts
17
18
 
18
19
  TRACES_FILE = "traces.jsonl"
19
20
  type_adapter = cache(TypeAdapter)
@@ -25,6 +26,18 @@ def write_episode(
25
26
  """Serialize and append one rollout episode in the worker thread."""
26
27
  # Preserve fields declared by typed Trace subclasses nested in the episode.
27
28
  data = type_adapter(type(episode)).dump_json(episode, exclude_none=True)
29
+ for trace in episode.traces:
30
+ if trace.state.artifacts:
31
+ if trace.id == ".." or Path(trace.id).parts != (trace.id,):
32
+ raise ValueError(
33
+ f"trace ID must be a single path component: {trace.id!r}"
34
+ )
35
+ save_artifacts(
36
+ results_dir / "artifacts" / trace.id,
37
+ trace.state.artifacts,
38
+ trace.task.data.artifacts,
39
+ workdir=getattr(trace.agent.runtime, "workdir", None) or "/",
40
+ )
28
41
  with (results_dir / TRACES_FILE).open("ab") as f:
29
42
  f.write(data + b"\n")
30
43
 
File without changes