verifiers 0.4.1.dev30__tar.gz → 0.4.1.dev32__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.dev30 → verifiers-0.4.1.dev32}/PKG-INFO +1 -1
  2. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/pyproject.toml +1 -0
  3. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/grid.py +1 -0
  4. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/anthropic.py +26 -1
  5. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/base.py +1 -1
  6. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/responses.py +1 -1
  7. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/__init__.py +3 -0
  8. verifiers-0.4.1.dev32/verifiers/v1/harnesses/deepseek/__init__.py +6 -0
  9. verifiers-0.4.1.dev32/verifiers/v1/harnesses/deepseek/gate.mjs +11 -0
  10. verifiers-0.4.1.dev32/verifiers/v1/harnesses/deepseek/harness.py +148 -0
  11. verifiers-0.4.1.dev32/verifiers/v1/harnesses/deepseek/usage.mjs +75 -0
  12. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/server.py +3 -1
  13. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/.gitignore +0 -0
  14. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/LICENSE +0 -0
  15. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/README.md +0 -0
  16. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/conftest.py +0 -0
  17. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/agent_user_harness_v1.py +0 -0
  18. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/agent_user_v1.py +0 -0
  19. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/counter_tool_v1.py +0 -0
  20. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/duet_v1.py +0 -0
  21. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_acp_resume_v1.py +0 -0
  22. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_agentic_v1.py +0 -0
  23. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_tool_compose/docker-compose.yaml +0 -0
  24. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_tool_v1.py +0 -0
  25. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_user_sim_v1.py +0 -0
  26. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_v1.py +0 -0
  27. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/network_policy_v1.py +0 -0
  28. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/pyproject.toml +0 -0
  29. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/skill_codeword_v1.py +0 -0
  30. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
  31. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/tool_response_image_v1.py +0 -0
  32. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_agent_user.py +0 -0
  33. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_agentic_judge.py +0 -0
  34. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_compose_scoring.py +0 -0
  35. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_examples.py +0 -0
  36. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_limits.py +0 -0
  37. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_multi_agent.py +0 -0
  38. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_multi_turn.py +0 -0
  39. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_multi_turn_tool.py +0 -0
  40. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_multimodal_tool.py +0 -0
  41. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_network_policy.py +0 -0
  42. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_resume_tool.py +0 -0
  43. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_rubric_judge.py +0 -0
  44. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_sampling.py +0 -0
  45. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_shared_tool.py +0 -0
  46. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_single_turn.py +0 -0
  47. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_skills.py +0 -0
  48. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_stateful_tool.py +0 -0
  49. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_user_echo.py +0 -0
  50. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_user_sim.py +0 -0
  51. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/cli/test_replay.py +0 -0
  52. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/conftest.py +0 -0
  53. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/harnesses/test_core.py +0 -0
  54. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/harnesses/test_rlm.py +0 -0
  55. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/interception/test_tunnel.py +0 -0
  56. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/judges/conftest.py +0 -0
  57. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/judges/test_judge.py +0 -0
  58. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/judges/test_reference.py +0 -0
  59. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/judges/test_rubric.py +0 -0
  60. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/runtimes/test_e2b.py +0 -0
  61. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/serve/test_client.py +0 -0
  62. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/serve/test_delta.py +0 -0
  63. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/serve/test_pool.py +0 -0
  64. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_agent.py +0 -0
  65. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_dialects.py +0 -0
  66. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_graph.py +0 -0
  67. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_semantic.py +0 -0
  68. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_task.py +0 -0
  69. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_taskset.py +0 -0
  70. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_trace.py +0 -0
  71. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/utils/test_compile.py +0 -0
  72. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/utils/test_loaders.py +0 -0
  73. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/utils/test_platform.py +0 -0
  74. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/utils/test_score.py +0 -0
  75. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/__init__.py +0 -0
  76. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/__init__.py +0 -0
  77. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/acp/__init__.py +0 -0
  78. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/acp/runner.py +0 -0
  79. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/agent.py +0 -0
  80. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/__init__.py +0 -0
  81. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  82. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/base.py +0 -0
  83. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/eval.py +0 -0
  84. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/replay.py +0 -0
  85. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/validate.py +0 -0
  86. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/debug.py +0 -0
  87. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/__init__.py +0 -0
  88. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/hint.py +0 -0
  89. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/main.py +0 -0
  90. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/resume.py +0 -0
  91. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/runner.py +0 -0
  92. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/gepa.py +0 -0
  93. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/output.py +0 -0
  94. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/replay.py +0 -0
  95. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/resolve.py +0 -0
  96. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/resume.py +0 -0
  97. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/validate.py +0 -0
  98. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/__init__.py +0 -0
  99. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/base.py +0 -0
  100. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/client.py +0 -0
  101. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/eval.py +0 -0
  102. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/train.py +0 -0
  103. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/__init__.py +0 -0
  104. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/agent.py +0 -0
  105. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/__init__.py +0 -0
  106. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/debug.py +0 -0
  107. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/env.py +0 -0
  108. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/eval.py +0 -0
  109. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/replay.py +0 -0
  110. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/validate.py +0 -0
  111. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/client.py +0 -0
  112. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/env.py +0 -0
  113. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/harness.py +0 -0
  114. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/judge.py +0 -0
  115. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/retries.py +0 -0
  116. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/runtime.py +0 -0
  117. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/scoring.py +0 -0
  118. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/select.py +0 -0
  119. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/serve.py +0 -0
  120. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/task.py +0 -0
  121. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/taskset.py +0 -0
  122. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/__init__.py +0 -0
  123. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/chat.py +0 -0
  124. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/env.py +0 -0
  125. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/__init__.py +0 -0
  126. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  127. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  128. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  129. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/best_of_n/env.py +0 -0
  130. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  131. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/single_agent/env.py +0 -0
  132. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  133. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/user_sim/env.py +0 -0
  134. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/episode.py +0 -0
  135. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/errors.py +0 -0
  136. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/__init__.py +0 -0
  137. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/adapter.py +0 -0
  138. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/config.py +0 -0
  139. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/dataset.py +0 -0
  140. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/reflection.py +0 -0
  141. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/runner.py +0 -0
  142. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/grading.py +0 -0
  143. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/graph.py +0 -0
  144. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harness.py +0 -0
  145. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  146. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/bash/harness.py +0 -0
  147. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  148. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  149. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  150. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  151. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  152. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  153. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  154. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/codex/harness.py +0 -0
  155. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  156. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  157. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  158. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  159. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  160. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  161. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  162. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  163. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/node.py +0 -0
  164. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/null/__init__.py +0 -0
  165. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/null/harness.py +0 -0
  166. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  167. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  168. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/opencode/__init__.py +0 -0
  169. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/opencode/harness.py +0 -0
  170. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/opencode/mcp-ready.js +0 -0
  171. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  172. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  173. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/pi/harness.py +0 -0
  174. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  175. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  176. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  177. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  178. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  179. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  180. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  181. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  182. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  183. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/core.py +0 -0
  184. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/install.py +0 -0
  185. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/launch.py +0 -0
  186. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  187. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/replay.py +0 -0
  188. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/__init__.py +0 -0
  189. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/base.py +0 -0
  190. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/pool.py +0 -0
  191. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  192. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/tunnel/base.py +0 -0
  193. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/tunnel/custom.py +0 -0
  194. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/tunnel/prime.py +0 -0
  195. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judge.py +0 -0
  196. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/__init__.py +0 -0
  197. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/decision.py +0 -0
  198. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/reference.py +0 -0
  199. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/reference.txt +0 -0
  200. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/rubric.py +0 -0
  201. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/rubric.txt +0 -0
  202. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/mcp/__init__.py +0 -0
  203. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/mcp/launch.py +0 -0
  204. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/mcp/server.py +0 -0
  205. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/mcp/toolset.py +0 -0
  206. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/rollout.py +0 -0
  207. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/__init__.py +0 -0
  208. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/apptainer.py +0 -0
  209. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/base.py +0 -0
  210. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/compose.py +0 -0
  211. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/container.py +0 -0
  212. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/deployment.py +0 -0
  213. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  214. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/docker/egress.py +0 -0
  215. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/e2b.py +0 -0
  216. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/limiters.py +0 -0
  217. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/modal.py +0 -0
  218. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/prime.py +0 -0
  219. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/runtime.py +0 -0
  220. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/strategies.py +0 -0
  221. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/subprocess.py +0 -0
  222. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/semantic.py +0 -0
  223. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/__init__.py +0 -0
  224. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/client.py +0 -0
  225. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/delta.py +0 -0
  226. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/encoding.py +0 -0
  227. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/pool.py +0 -0
  228. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/server.py +0 -0
  229. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/types.py +0 -0
  230. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/session.py +0 -0
  231. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/state.py +0 -0
  232. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/task.py +0 -0
  233. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/taskset.py +0 -0
  234. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/__init__.py +0 -0
  235. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  236. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  237. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  238. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  239. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  240. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  241. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  242. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  243. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  244. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  245. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  246. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  247. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/trace.py +0 -0
  248. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/types.py +0 -0
  249. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/__init__.py +0 -0
  250. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/aio.py +0 -0
  251. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/artifacts.py +0 -0
  252. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/compile.py +0 -0
  253. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/decorators.py +0 -0
  254. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/env.py +0 -0
  255. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/eval.py +0 -0
  256. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/format.py +0 -0
  257. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/generic.py +0 -0
  258. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/git.py +0 -0
  259. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/image.py +0 -0
  260. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/interrupt.py +0 -0
  261. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/loaders.py +0 -0
  262. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/logging.py +0 -0
  263. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/memory.py +0 -0
  264. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/paths.py +0 -0
  265. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/platform.py +0 -0
  266. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/prime.py +0 -0
  267. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/retries.py +0 -0
  268. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/scope.py +0 -0
  269. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/score.py +0 -0
  270. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/trace_store.py +0 -0
  271. {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/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.dev30
3
+ Version: 0.4.1.dev32
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
@@ -237,6 +237,7 @@ markers = [
237
237
  "claude_code: integration cells on the claude-code harness",
238
238
  "openclaw: integration cells on the OpenClaw harness",
239
239
  "hermes_agent: integration cells on the hermes-agent harness",
240
+ "deepseek: integration cells on the DeepSeek minimal harness",
240
241
  "rlm: integration cells on the rlm harness",
241
242
  "kimi_code: integration cells on the kimi-code harness",
242
243
  "pi: integration cells on the pi harness",
@@ -49,6 +49,7 @@ HARNESSES: list[str | dict] = [
49
49
  "codex",
50
50
  "claude-code",
51
51
  "hermes-agent",
52
+ "deepseek",
52
53
  "kimi-code",
53
54
  "pi",
54
55
  "openclaw",
@@ -24,6 +24,7 @@ from verifiers.v1.dialects.base import (
24
24
  parse_sse_event,
25
25
  provider_domains,
26
26
  )
27
+ from verifiers.v1.errors import ProviderError
27
28
  from verifiers.v1.types import (
28
29
  AssistantMessage,
29
30
  ContentPart,
@@ -51,6 +52,18 @@ STOP_REASONS: dict[str, FinishReason] = {
51
52
  "tool_use": "tool_calls",
52
53
  "stop_sequence": "stop",
53
54
  }
55
+ ERROR_TYPES = {
56
+ 400: "invalid_request_error",
57
+ 401: "authentication_error",
58
+ 403: "permission_error",
59
+ 404: "not_found_error",
60
+ 413: "request_too_large",
61
+ 429: "rate_limit_error",
62
+ 502: "api_error",
63
+ 529: "overloaded_error",
64
+ }
65
+ ERROR_STATUSES = {kind: status for status, kind in ERROR_TYPES.items()}
66
+
54
67
  # Claude may reorder mixed thinking block types between a response and its replay.
55
68
  # Native tool events share the final rank, preserving their relative order.
56
69
  THINKING_ORDER = {"redacted_thinking": 0, "thinking": 1}
@@ -356,6 +369,11 @@ class AnthropicStreamParser(StreamParser):
356
369
  if event is None:
357
370
  return
358
371
  kind = event.get("type")
372
+ if kind == "error":
373
+ # HTTP 200 streams can fail in-band; preserve the provider's cause and IDs.
374
+ detail = event.get("error") or {}
375
+ status = ERROR_STATUSES.get(detail.get("type"), 502)
376
+ raise ProviderError(json.dumps(event), status_code=status)
359
377
  if kind == "message_start":
360
378
  self.message = event.get("message") or {}
361
379
  elif kind == "content_block_start":
@@ -516,7 +534,14 @@ class AnthropicDialect(Dialect[AnthropicMessage]):
516
534
  # Anthropic's own keepalive; its SDKs skip it anywhere in the stream.
517
535
  return b'event: ping\ndata: {"type": "ping"}\n\n'
518
536
 
519
- def stream_error(self, error: dict) -> bytes:
537
+ def stream_error(self, error: dict, *, status_code: int | None = None) -> bytes:
538
+ # Once HTTP 200 is committed, clients classify retries from the SSE error type.
539
+ if status_code is not None:
540
+ kind = ERROR_TYPES.get(
541
+ status_code,
542
+ "api_error" if status_code >= 500 else "invalid_request_error",
543
+ )
544
+ error = {**error, "error": {**error.get("error", {}), "type": kind}}
520
545
  # The Anthropic SDKs raise only on a named `error` event.
521
546
  return b"event: error\ndata: " + json.dumps(error).encode() + b"\n\n"
522
547
 
@@ -318,7 +318,7 @@ class Dialect(ABC, Generic[RespT]):
318
318
  # Don't terminate an empty event; some SSE clients try to JSON-decode it.
319
319
  return b": keepalive\n"
320
320
 
321
- def stream_error(self, error: dict) -> bytes:
321
+ def stream_error(self, error: dict, *, status_code: int | None = None) -> bytes:
322
322
  """An `error_body` as an SSE event, for a failure after the stream is committed.
323
323
  OpenAI SDKs raise on any event carrying `error`."""
324
324
  return b"data: " + json.dumps(error).encode() + b"\n\n"
@@ -687,7 +687,7 @@ class ResponsesDialect(Dialect[OpenAIResponse]):
687
687
  payload = {"type": kind, "sequence_number": 0, "response": _KEEPALIVE_RESPONSE}
688
688
  return f"event: {kind}\ndata: {json.dumps(payload)}\n\n".encode()
689
689
 
690
- def stream_error(self, error: dict) -> bytes:
690
+ def stream_error(self, error: dict, *, status_code: int | None = None) -> bytes:
691
691
  # `response.failed` is what Responses clients (codex) act on; the `error` key is what
692
692
  # the OpenAI SDK raises on.
693
693
  message = error["error"]["message"]
@@ -8,6 +8,7 @@ from verifiers.v1.harnesses.claude_code import (
8
8
  ClaudeCodeHarnessConfig,
9
9
  )
10
10
  from verifiers.v1.harnesses.codex import CodexHarness, CodexHarnessConfig
11
+ from verifiers.v1.harnesses.deepseek import DeepSeekHarness, DeepSeekHarnessConfig
11
12
  from verifiers.v1.harnesses.hermes_agent import (
12
13
  HermesAgentHarness,
13
14
  HermesAgentHarnessConfig,
@@ -37,6 +38,8 @@ __all__ = [
37
38
  "ClaudeCodeHarnessConfig",
38
39
  "CodexHarness",
39
40
  "CodexHarnessConfig",
41
+ "DeepSeekHarness",
42
+ "DeepSeekHarnessConfig",
40
43
  "HermesAgentHarness",
41
44
  "HermesAgentHarnessConfig",
42
45
  "KimiCodeHarness",
@@ -0,0 +1,6 @@
1
+ from verifiers.v1.harnesses.deepseek.harness import (
2
+ DeepSeekHarness,
3
+ DeepSeekHarnessConfig,
4
+ )
5
+
6
+ __all__ = ["DeepSeekHarness", "DeepSeekHarnessConfig"]
@@ -0,0 +1,11 @@
1
+ // Preserve native policy denials; route every otherwise allowed tool through ACP.
2
+ // The shared ACP runner resolves the call ID against the rollout's tool policy.
3
+ export const name = "vf-tool-gate";
4
+ export const inject = ["tools", "approval"];
5
+
6
+ export function apply(ctx) {
7
+ ctx.on("tools/pre-execute", async (_exec, next) => {
8
+ const decision = await next();
9
+ return decision.kind === "allow" ? { kind: "ask" } : decision;
10
+ });
11
+ }
@@ -0,0 +1,148 @@
1
+ """DeepSeek's minimal coding agent, driven through its native ACP bridge."""
2
+
3
+ import json
4
+ from pathlib import Path
5
+
6
+ from verifiers.v1.acp import ACPConfig, ACPHarness
7
+ from verifiers.v1.clients import ModelContext
8
+ from verifiers.v1.configs.harness import HarnessConfig, PinnedVersion
9
+ from verifiers.v1.harnesses.node import NODE_BIN_DIR, ensure_node
10
+ from verifiers.v1.harnesses.utils.install import ensure_installed, remove_dir
11
+ from verifiers.v1.runtimes import Runtime
12
+ from verifiers.v1.task import TaskData
13
+ from verifiers.v1.trace import Trace
14
+
15
+ DEEPSEEK_DIR = "/var/tmp/vf-deepseek-{version}"
16
+ USAGE_COMPAT = (Path(__file__).parent / "usage.mjs").read_bytes()
17
+ GATE = (Path(__file__).parent / "gate.mjs").read_bytes()
18
+ INSTALL = r"""
19
+ set -e
20
+ export PATH="/var/tmp/vf-node/bin:$PATH"
21
+ npm install --prefix "$VF_DEEPSEEK_DIR" --no-audit --no-fund \
22
+ "@deepseek-ai/dsh@$VF_DEEPSEEK_VERSION" >/dev/null
23
+ touch "$VF_DEEPSEEK_DIR/.ready"
24
+ """
25
+
26
+
27
+ class DeepSeekHarnessConfig(HarnessConfig):
28
+ version: PinnedVersion = "0.2.1-alpha.3"
29
+ """DeepSeek CLI release, pinned to its shipped sdk-minimal composition."""
30
+
31
+
32
+ class DeepSeekHarness(ACPHarness[DeepSeekHarnessConfig]):
33
+ APPENDS_SYSTEM_PROMPT = True
34
+ SUPPORTS_MCP = True
35
+ SUPPORTS_TOOL_INTERCEPTION = True
36
+
37
+ async def setup(self, runtime: Runtime) -> None:
38
+ await ensure_node(runtime)
39
+ directory = DEEPSEEK_DIR.format(version=self.config.version)
40
+ await ensure_installed(
41
+ runtime,
42
+ directory=directory,
43
+ ready=f"test -f {directory}/.ready",
44
+ install=INSTALL,
45
+ env={
46
+ "VF_DEEPSEEK_DIR": directory,
47
+ "VF_DEEPSEEK_VERSION": self.config.version,
48
+ },
49
+ label="DeepSeek Harness",
50
+ )
51
+ await super().setup(runtime)
52
+
53
+ async def prepare_acp(
54
+ self,
55
+ ctx: ModelContext,
56
+ trace: Trace,
57
+ runtime: Runtime,
58
+ endpoint: str,
59
+ secret: str,
60
+ mcp_urls: dict[str, str],
61
+ data: TaskData,
62
+ ) -> ACPConfig:
63
+ if self.config.disabled_tools:
64
+ raise ValueError("DeepSeek minimal ACP does not support disabling tools")
65
+
66
+ home = f"/tmp/vf-deepseek/{trace.id}"
67
+ system_prompt, prompt = self.resolve_prompt(data)
68
+ # Keep the upstream minimal tree; replace only its SDK stdio front door.
69
+ # https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/bundle/sdk-minimal
70
+ patches = [
71
+ {"id": "sdk-app-startup", "disabled": True},
72
+ {"id": "sdk-jsonrpc-server", "disabled": True},
73
+ # Provider metadata is captured by verifiers, not uploaded by DSH.
74
+ {"id": "session-log-deepseek", "disabled": True},
75
+ {"id": "plugin-package-inventory-deepseek", "disabled": True},
76
+ {
77
+ "insert": [
78
+ {
79
+ "id": "acp-app-startup",
80
+ "name": "@deepseek-ai/dsh-acp-app",
81
+ },
82
+ {
83
+ "id": "acp",
84
+ "name": "@deepseek-ai/dsh-acp",
85
+ "inject": ["acpAppStartup"],
86
+ "config": {"provider": "deepseek-official", "model": ctx.model},
87
+ },
88
+ ]
89
+ },
90
+ ]
91
+ if system_prompt:
92
+ patches.append(
93
+ {
94
+ "id": "system-prompt",
95
+ "config": {
96
+ "includeHarnessIdentity": False,
97
+ "includeRuntimeContext": False,
98
+ "personaPrefix": "You are a helpful software engineer assistant."
99
+ + "\n\n"
100
+ + system_prompt,
101
+ },
102
+ }
103
+ )
104
+ patch_path = f"{home}/acp.patch.json"
105
+ # JSON is valid YAML and preserves arbitrary task prompt text verbatim.
106
+ await runtime.write(patch_path, json.dumps(patches).encode())
107
+ usage_path = f"{home}/usage.mjs"
108
+ await runtime.write(usage_path, USAGE_COMPAT)
109
+ return ACPConfig(
110
+ command=[
111
+ f"{NODE_BIN_DIR}/node",
112
+ "--import",
113
+ usage_path,
114
+ f"{DEEPSEEK_DIR.format(version=self.config.version)}/node_modules/@deepseek-ai/dsh/lib/bin.js",
115
+ "--profile",
116
+ "sdk-minimal",
117
+ "--patch",
118
+ patch_path,
119
+ ],
120
+ env={
121
+ **self.config.resolved_env,
122
+ "DSH_HOME": home,
123
+ "DEEPSEEK_BASE_URL": endpoint,
124
+ "DEEPSEEK_API_KEY": secret,
125
+ },
126
+ prompt=prompt,
127
+ )
128
+
129
+ async def gate_tools(
130
+ self, config: ACPConfig, runtime: Runtime, url: str, secret: str
131
+ ) -> None:
132
+ home = config.env["DSH_HOME"]
133
+ gate_path = f"{home}/gate.mjs"
134
+ await runtime.write(gate_path, GATE)
135
+ patch_path = f"{home}/acp.patch.json"
136
+ patches = json.loads(await runtime.read(patch_path))
137
+ patches.append(
138
+ {
139
+ "insert": [
140
+ {"id": "vf-approval", "name": "@deepseek-ai/dsh-user-approval"},
141
+ {"id": "vf-tool-gate", "name": gate_path},
142
+ ]
143
+ }
144
+ )
145
+ await runtime.write(patch_path, json.dumps(patches).encode())
146
+
147
+ async def cleanup(self, trace: Trace, runtime: Runtime) -> None:
148
+ await remove_dir(runtime, f"/tmp/vf-deepseek/{trace.id}", "DeepSeek state")
@@ -0,0 +1,75 @@
1
+ // Some Messages-compatible gateways emit null for unknown cache counts. DSH's
2
+ // parser accepts omitted counts, but rejects null. Keep the last known counts.
3
+ const fetch = globalThis.fetch;
4
+ const base = new URL(process.env.DEEPSEEK_BASE_URL);
5
+ base.pathname = base.pathname.replace(/\/$/, "");
6
+ if (!base.pathname.endsWith("/v1")) base.pathname += "/v1";
7
+ base.pathname += "/messages";
8
+
9
+ function normalize(line) {
10
+ if (!line.startsWith("data:")) return line;
11
+ let data;
12
+ try {
13
+ data = JSON.parse(line.slice(5));
14
+ } catch {
15
+ // Preserve SSE sentinels and non-JSON data for the upstream parser.
16
+ return line;
17
+ }
18
+ let changed = false;
19
+ for (const usage of [data?.usage, data?.message?.usage]) {
20
+ if (!usage) continue;
21
+ for (const key of ["cache_read_input_tokens", "cache_creation_input_tokens"]) {
22
+ if (usage[key] === null) {
23
+ delete usage[key];
24
+ changed = true;
25
+ }
26
+ }
27
+ }
28
+ return changed ? `data: ${JSON.stringify(data)}` : line;
29
+ }
30
+
31
+ globalThis.fetch = async (input, init) => {
32
+ const url = new URL(input instanceof Request ? input.url : input);
33
+ if (url.href === base.href && typeof init?.body === "string") {
34
+ const body = JSON.parse(init.body);
35
+ // DSH enables thinking without a budget; Messages gateways require either
36
+ // a budget or adaptive thinking. Eval sampling overrides apply downstream.
37
+ if (body.thinking?.type === "enabled" && body.thinking.budget_tokens === undefined) {
38
+ body.thinking = {type: "adaptive"};
39
+ init = {...init, body: JSON.stringify(body)};
40
+ }
41
+ }
42
+ const response = await fetch(input, init);
43
+ if (url.href === base.href && !response.ok) {
44
+ const detail = (await response.clone().text()).slice(0, 1000);
45
+ console.error(`DeepSeek Messages HTTP ${response.status}: ${detail}`);
46
+ }
47
+ if (
48
+ url.href !== base.href ||
49
+ !response.body ||
50
+ !response.headers.get("content-type")?.includes("text/event-stream")
51
+ ) return response;
52
+
53
+ let pending = "";
54
+ const body = response.body
55
+ .pipeThrough(new TextDecoderStream())
56
+ .pipeThrough(new TransformStream({
57
+ transform(chunk, controller) {
58
+ pending += chunk;
59
+ const lines = pending.split("\n");
60
+ pending = lines.pop();
61
+ for (const line of lines) controller.enqueue(`${normalize(line)}\n`);
62
+ },
63
+ flush(controller) {
64
+ if (pending) controller.enqueue(normalize(pending));
65
+ },
66
+ }))
67
+ .pipeThrough(new TextEncoderStream());
68
+ const headers = new Headers(response.headers);
69
+ headers.delete("content-length");
70
+ return new Response(body, {
71
+ status: response.status,
72
+ statusText: response.statusText,
73
+ headers,
74
+ });
75
+ };
@@ -288,7 +288,9 @@ async def _buffered_stream(
288
288
  await stream.write(
289
289
  replay.body
290
290
  if response.status < 400
291
- else dialect.stream_error(from_json(replay.body))
291
+ else dialect.stream_error(
292
+ from_json(replay.body), status_code=response.status
293
+ )
292
294
  )
293
295
  await stream.write_eof()
294
296
  except ConnectionResetError:
File without changes