verifiers 0.4.1.dev18__tar.gz → 0.4.1.dev20__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 (260) hide show
  1. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/PKG-INFO +1 -1
  2. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/conftest.py +8 -4
  3. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/network_policy_v1.py +4 -2
  4. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/grid.py +11 -1
  5. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_examples.py +26 -5
  6. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_resume_tool.py +0 -4
  7. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_rubric_judge.py +5 -1
  8. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/client.py +24 -18
  9. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/.gitignore +0 -0
  10. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/LICENSE +0 -0
  11. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/README.md +0 -0
  12. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/pyproject.toml +0 -0
  13. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/agent_user_harness_v1.py +0 -0
  14. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/agent_user_v1.py +0 -0
  15. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/counter_tool_v1.py +0 -0
  16. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/duet_v1.py +0 -0
  17. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_acp_resume_v1.py +0 -0
  18. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_agentic_v1.py +0 -0
  19. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_tool_v1.py +0 -0
  20. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_user_sim_v1.py +0 -0
  21. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_v1.py +0 -0
  22. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/pyproject.toml +0 -0
  23. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/skill_codeword_v1.py +0 -0
  24. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
  25. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/tool_response_image_v1.py +0 -0
  26. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_agent_user.py +0 -0
  27. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_agentic_judge.py +0 -0
  28. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_compose_scoring.py +0 -0
  29. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_limits.py +0 -0
  30. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_multi_agent.py +0 -0
  31. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_multi_turn.py +0 -0
  32. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_multi_turn_tool.py +0 -0
  33. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_multimodal_tool.py +0 -0
  34. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_network_policy.py +0 -0
  35. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_shared_tool.py +0 -0
  36. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_single_turn.py +0 -0
  37. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_skills.py +0 -0
  38. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_stateful_tool.py +0 -0
  39. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_user_echo.py +0 -0
  40. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_user_sim.py +0 -0
  41. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/cli/test_replay.py +0 -0
  42. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/conftest.py +0 -0
  43. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/harnesses/test_core.py +0 -0
  44. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/harnesses/test_rlm.py +0 -0
  45. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/interception/test_tunnel.py +0 -0
  46. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/judges/conftest.py +0 -0
  47. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/judges/test_judge.py +0 -0
  48. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/judges/test_reference.py +0 -0
  49. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/judges/test_rubric.py +0 -0
  50. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/runtimes/test_e2b.py +0 -0
  51. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/serve/test_client.py +0 -0
  52. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/serve/test_delta.py +0 -0
  53. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/serve/test_pool.py +0 -0
  54. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_agent.py +0 -0
  55. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_graph.py +0 -0
  56. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_semantic.py +0 -0
  57. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_task.py +0 -0
  58. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_taskset.py +0 -0
  59. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_trace.py +0 -0
  60. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/utils/test_compile.py +0 -0
  61. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/utils/test_loaders.py +0 -0
  62. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/utils/test_platform.py +0 -0
  63. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/utils/test_score.py +0 -0
  64. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/__init__.py +0 -0
  65. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/__init__.py +0 -0
  66. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/acp/__init__.py +0 -0
  67. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/acp/runner.py +0 -0
  68. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/agent.py +0 -0
  69. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/__init__.py +0 -0
  70. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  71. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/base.py +0 -0
  72. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/eval.py +0 -0
  73. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/replay.py +0 -0
  74. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/validate.py +0 -0
  75. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/debug.py +0 -0
  76. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/__init__.py +0 -0
  77. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/hint.py +0 -0
  78. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/main.py +0 -0
  79. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/resume.py +0 -0
  80. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/runner.py +0 -0
  81. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/gepa.py +0 -0
  82. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/output.py +0 -0
  83. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/replay.py +0 -0
  84. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/resolve.py +0 -0
  85. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/resume.py +0 -0
  86. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/validate.py +0 -0
  87. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/__init__.py +0 -0
  88. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/base.py +0 -0
  89. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/client.py +0 -0
  90. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/eval.py +0 -0
  91. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/train.py +0 -0
  92. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/__init__.py +0 -0
  93. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/agent.py +0 -0
  94. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/__init__.py +0 -0
  95. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/debug.py +0 -0
  96. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/env.py +0 -0
  97. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/eval.py +0 -0
  98. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/replay.py +0 -0
  99. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/validate.py +0 -0
  100. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/client.py +0 -0
  101. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/env.py +0 -0
  102. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/harness.py +0 -0
  103. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/judge.py +0 -0
  104. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/retries.py +0 -0
  105. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/runtime.py +0 -0
  106. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/scoring.py +0 -0
  107. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/select.py +0 -0
  108. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/serve.py +0 -0
  109. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/task.py +0 -0
  110. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/taskset.py +0 -0
  111. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/__init__.py +0 -0
  112. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/anthropic.py +0 -0
  113. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/base.py +0 -0
  114. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/chat.py +0 -0
  115. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/responses.py +0 -0
  116. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/env.py +0 -0
  117. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/__init__.py +0 -0
  118. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  119. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  120. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  121. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/best_of_n/env.py +0 -0
  122. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  123. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/single_agent/env.py +0 -0
  124. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  125. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/user_sim/env.py +0 -0
  126. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/episode.py +0 -0
  127. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/errors.py +0 -0
  128. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/__init__.py +0 -0
  129. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/adapter.py +0 -0
  130. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/config.py +0 -0
  131. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/dataset.py +0 -0
  132. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/reflection.py +0 -0
  133. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/runner.py +0 -0
  134. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/grading.py +0 -0
  135. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/graph.py +0 -0
  136. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harness.py +0 -0
  137. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/__init__.py +0 -0
  138. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  139. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/bash/harness.py +0 -0
  140. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  141. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  142. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  143. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  144. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  145. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  146. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  147. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/codex/harness.py +0 -0
  148. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  149. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  150. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  151. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  152. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  153. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  154. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  155. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  156. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/node.py +0 -0
  157. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/null/__init__.py +0 -0
  158. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/null/harness.py +0 -0
  159. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  160. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  161. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  162. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  163. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/pi/harness.py +0 -0
  164. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  165. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  166. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  167. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  168. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  169. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  170. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  171. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  172. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  173. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/core.py +0 -0
  174. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/install.py +0 -0
  175. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/launch.py +0 -0
  176. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  177. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/__init__.py +0 -0
  178. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/base.py +0 -0
  179. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/pool.py +0 -0
  180. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/server.py +0 -0
  181. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  182. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/tunnel/base.py +0 -0
  183. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/tunnel/custom.py +0 -0
  184. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/tunnel/prime.py +0 -0
  185. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judge.py +0 -0
  186. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/__init__.py +0 -0
  187. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/decision.py +0 -0
  188. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/reference.py +0 -0
  189. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/reference.txt +0 -0
  190. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/rubric.py +0 -0
  191. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/rubric.txt +0 -0
  192. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/mcp/__init__.py +0 -0
  193. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/mcp/launch.py +0 -0
  194. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/mcp/server.py +0 -0
  195. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/mcp/toolset.py +0 -0
  196. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/rollout.py +0 -0
  197. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/__init__.py +0 -0
  198. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/apptainer.py +0 -0
  199. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/base.py +0 -0
  200. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/compose.py +0 -0
  201. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/container.py +0 -0
  202. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/deployment.py +0 -0
  203. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  204. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/docker/egress.py +0 -0
  205. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/e2b.py +0 -0
  206. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/limiters.py +0 -0
  207. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/modal.py +0 -0
  208. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/prime.py +0 -0
  209. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/runtime.py +0 -0
  210. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/strategies.py +0 -0
  211. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/subprocess.py +0 -0
  212. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/semantic.py +0 -0
  213. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/__init__.py +0 -0
  214. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/delta.py +0 -0
  215. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/encoding.py +0 -0
  216. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/pool.py +0 -0
  217. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/server.py +0 -0
  218. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/types.py +0 -0
  219. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/session.py +0 -0
  220. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/state.py +0 -0
  221. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/task.py +0 -0
  222. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/taskset.py +0 -0
  223. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/__init__.py +0 -0
  224. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  225. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  226. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  227. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  228. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  229. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  230. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  231. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  232. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  233. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  234. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  235. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  236. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/trace.py +0 -0
  237. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/types.py +0 -0
  238. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/__init__.py +0 -0
  239. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/aio.py +0 -0
  240. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/artifacts.py +0 -0
  241. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/compile.py +0 -0
  242. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/decorators.py +0 -0
  243. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/env.py +0 -0
  244. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/eval.py +0 -0
  245. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/format.py +0 -0
  246. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/generic.py +0 -0
  247. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/git.py +0 -0
  248. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/image.py +0 -0
  249. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/interrupt.py +0 -0
  250. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/loaders.py +0 -0
  251. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/logging.py +0 -0
  252. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/memory.py +0 -0
  253. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/paths.py +0 -0
  254. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/platform.py +0 -0
  255. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/prime.py +0 -0
  256. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/retries.py +0 -0
  257. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/scope.py +0 -0
  258. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/score.py +0 -0
  259. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/trace_store.py +0 -0
  260. {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/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.dev18
3
+ Version: 0.4.1.dev20
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
@@ -23,7 +23,10 @@ from verifiers.v1.episode import Episode
23
23
  from verifiers.v1.types import SamplingConfig
24
24
  from verifiers.v1.utils.loaders import harness_config_type, load_environment
25
25
 
26
- CI_MODEL = "openai/gpt-5.6-luna"
26
+ CI_MODEL = "internal/deepseek-v4.1-flash"
27
+ CI_REASONING_EFFORT = "low"
28
+ # Judge config fields that keep config-plugged judges on the CI model and effort.
29
+ CI_JUDGE = {"model": CI_MODEL, "sampling": {"reasoning_effort": CI_REASONING_EFFORT}}
27
30
 
28
31
  # Fixture tasksets (echo-v1, echo-agentic-v1, ...) live in tests/integration/fixtures,
29
32
  # added to the path via `pythonpath` in pyproject so the loader resolves them by id.
@@ -104,7 +107,8 @@ def _eval_config(
104
107
  taskset_overrides: dict | None = None,
105
108
  runtime: dict | None = None,
106
109
  env: dict | None = None,
107
- reasoning_effort: str | None = None,
110
+ reasoning_effort: str | None = CI_REASONING_EFFORT,
111
+ model: str = CI_MODEL,
108
112
  client: dict | None = None,
109
113
  ) -> EvalConfig:
110
114
  """Build the smallest `EvalConfig` that still exercises the path, used by the `run`
@@ -156,7 +160,7 @@ def _eval_config(
156
160
  "max_tokens": max_tokens,
157
161
  "reasoning_effort": reasoning_effort,
158
162
  },
159
- model=CI_MODEL,
163
+ model=model,
160
164
  **({"client": client} if client else {}),
161
165
  )
162
166
 
@@ -196,7 +200,7 @@ async def live_ctx():
196
200
  yield ModelContext(
197
201
  model=CI_MODEL,
198
202
  client=EvalClientConfig(),
199
- sampling=SamplingConfig(max_tokens=2048),
203
+ sampling=SamplingConfig(max_tokens=2048, reasoning_effort=CI_REASONING_EFFORT),
200
204
  )
201
205
 
202
206
 
@@ -68,8 +68,10 @@ class NetworkPolicyTaskset(vf.Taskset[NetworkPolicyTask, vf.TasksetConfig]):
68
68
  "allow": {"network_allow": [ALLOWED]},
69
69
  }
70
70
  prompt = (
71
- f"Use your shell to run `python3 {PROBE_PATH}` once, then reply with its "
72
- "output."
71
+ f"Your only task: run the command `python3 {PROBE_PATH}` once in your "
72
+ "shell, then reply with exactly what it printed. Any network policy is "
73
+ "already enforced, so do not inspect, configure, or change the network or "
74
+ "firewall, and do not run any other command."
73
75
  )
74
76
  return [
75
77
  NetworkPolicyTask(
@@ -59,6 +59,13 @@ RUNTIMES = ["subprocess", "docker", "podman", "apptainer", "prime", "modal", "e2
59
59
  ENGINES = ("podman", "apptainer")
60
60
  HARNESS_RUNTIMES = [runtime for runtime in RUNTIMES if runtime not in ENGINES]
61
61
 
62
+ # Harnesses that cannot run against the CI model yet.
63
+ # TODO: drop each entry once its fix lands.
64
+ CI_MODEL_GAPS = {
65
+ "kimi-code": "Prime chat completions rejects kimi-code's prompt_cache_key",
66
+ "openclaw": "openclaw cannot load the custom `internal/` model provider",
67
+ }
68
+
62
69
 
63
70
  def agent_seats(taskset: str, env_id: str = "") -> list[str]:
64
71
  """The agent seats the env declares for `taskset`: `agent` for a plain taskset, its
@@ -164,7 +171,10 @@ def grid(
164
171
  for harness in harnesses:
165
172
  for runtime in runtimes:
166
173
  marks = [mark(harness_id(harness)), mark(runtime)]
167
- if reason := unsupported(harness, runtime, needs):
174
+ reason = unsupported(harness, runtime, needs) or CI_MODEL_GAPS.get(
175
+ harness_id(harness)
176
+ )
177
+ if reason:
168
178
  marks.append(pytest.mark.skip(reason=reason))
169
179
  cells.append(
170
180
  pytest.param(
@@ -11,14 +11,33 @@ import subprocess
11
11
  from pathlib import Path
12
12
 
13
13
  import pytest
14
+ from conftest import CI_JUDGE, CI_MODEL, CI_REASONING_EFFORT
14
15
  from grid import agent_seats
15
16
 
16
17
  EVAL_TIMEOUT = 600 # 10 minutes for a capped eval (-n 1 -r 1)
17
18
 
18
19
  ENVIRONMENTS = Path(__file__).parent.parent.parent / "environments"
19
20
 
20
- # V1 tasksets that aren't part of the default CI install.
21
- SKIP_EVAL = {"nemo_gym_weather"}
21
+ SKIP_EVAL = {
22
+ "nemo_gym_weather": "not part of the default CI install",
23
+ # TODO: drop once the CI model's proposer reliably finishes within the caps.
24
+ "proposer_solver": "the CI model's proposer reasons past the token cap",
25
+ }
26
+
27
+ # Point each bundled judge at the CI model and effort.
28
+ JUDGE_OVERRIDES = {
29
+ "interception": [
30
+ "--env.taskset.task.judge.model",
31
+ CI_MODEL,
32
+ "--env.taskset.task.judge.sampling.reasoning-effort",
33
+ CI_REASONING_EFFORT,
34
+ ],
35
+ "wiki_search": [
36
+ "--env.taskset.task.judges",
37
+ # The list replaces the default entry, so restate its `question_field`.
38
+ json.dumps([{"id": "wiki-search", "question_field": "question", **CI_JUDGE}]),
39
+ ],
40
+ }
22
41
 
23
42
 
24
43
  def v1_tasksets() -> list[str]:
@@ -35,13 +54,15 @@ def v1_tasksets() -> list[str]:
35
54
  def test_eval(taskset: str, tmp_path: Path):
36
55
  """Run one capped rollout of `taskset` and require every episode to finish ok; a
37
56
  taskset that bundles a harness uses it by default."""
38
- if taskset in SKIP_EVAL:
39
- pytest.skip(f"{taskset} can't run a plain-CI smoke eval")
57
+ if reason := SKIP_EVAL.get(taskset):
58
+ pytest.skip(reason)
40
59
  if os.getenv("PRIME_API_KEY"):
41
60
  model = [
42
- "-m", "openai/gpt-5.6-luna",
61
+ "-m", CI_MODEL,
62
+ "--sampling.reasoning-effort", CI_REASONING_EFFORT,
43
63
  "--client.base-url", "https://api.pinference.ai/api/v1",
44
64
  "--client.api-key-var", "PRIME_API_KEY",
65
+ *JUDGE_OVERRIDES.get(taskset, []),
45
66
  ] # fmt: skip
46
67
  elif os.getenv("OPENAI_API_KEY"):
47
68
  model = [
@@ -27,10 +27,6 @@ async def test_resume_tool(run, harness, harness_runtime):
27
27
  assert segments[0]["terminated"] is False
28
28
  assert segments[1]["terminated"] is False
29
29
  assert trace.last_reply == segments[1]["last_reply"]
30
- # Kimi Code's resumed requests replay history that differs from the turns it
31
- # sampled (seen on prime), so its graph forks instead of extending one branch.
32
- if harness.id != "kimi-code":
33
- assert trace.num_branches == 1
34
30
  assert "tool" in segments[1]["roles"]
35
31
  assert segments[1]["tool_outputs"]
36
32
  if harness.id == "pi":
@@ -1,5 +1,7 @@
1
1
  """A config-plugged rubric judge scores the rollout on top of the task's own reward."""
2
2
 
3
+ from conftest import CI_JUDGE
4
+
3
5
 
4
6
  async def test_rubric_judge(run, tmp_path):
5
7
  """A config-plugged rubric judge scores the rollout on top of the taskset's own reward.
@@ -17,7 +19,9 @@ async def test_rubric_judge(run, tmp_path):
17
19
  "echo-v1",
18
20
  harness="null",
19
21
  runtime={"type": "subprocess"},
20
- taskset_overrides={"task": {"judges": [{"id": "rubric", "path": str(rubric)}]}},
22
+ taskset_overrides={
23
+ "task": {"judges": [{"id": "rubric", "path": str(rubric), **CI_JUDGE}]}
24
+ },
21
25
  max_turns=2,
22
26
  )
23
27
  (trace,) = episode.traces
@@ -39,9 +39,12 @@ from verifiers.v1.types import SamplingConfig
39
39
  logger = logging.getLogger(__name__)
40
40
 
41
41
  ResponseT = TypeVar("ResponseT", bound=BaseResponse)
42
+ DecodedT = TypeVar("DecodedT")
42
43
 
43
44
 
44
45
  class EnvClient:
46
+ """Receive streamed episodes with bounded worker decoding."""
47
+
45
48
  def __init__(self, address: str = "tcp://127.0.0.1:5000") -> None:
46
49
  self.address = address
47
50
  self.ctx = zmq.asyncio.Context()
@@ -51,7 +54,7 @@ class EnvClient:
51
54
  self.socket.setsockopt(zmq.RCVHWM, 0)
52
55
  self.socket.connect(address)
53
56
  self._pending: dict[str, asyncio.Future[bytes]] = {}
54
- self._deltas: dict[str, Callable[[bytes], None]] = {}
57
+ self._deltas: dict[str, Callable[[dict], None]] = {}
55
58
  # Strong refs to in-flight fire-and-forget cancels: the loop only
56
59
  # holds weak references to tasks, so an unreferenced one can be
57
60
  # garbage-collected before it ever sends
@@ -68,7 +71,7 @@ class EnvClient:
68
71
  # handler that raises is logged and skipped rather than allowed to end the loop.
69
72
  while True:
70
73
  try:
71
- frames = await self.socket.recv_multipart()
74
+ frames = await self.socket.recv_multipart(copy=False)
72
75
  except asyncio.CancelledError:
73
76
  break
74
77
  try:
@@ -77,16 +80,23 @@ class EnvClient:
77
80
  f"expected [request_id, kind, data], got {len(frames)} frames - "
78
81
  "is the env server speaking the same serve protocol?"
79
82
  )
80
- request_id_bytes, kind, data = frames
81
- request_id = request_id_bytes.decode()
83
+ request_id_frame, kind_frame, data_frame = frames
84
+ request_id = request_id_frame.bytes.decode()
85
+ kind = kind_frame.bytes
82
86
  if kind == b"delta":
83
87
  on_delta = self._deltas.get(request_id)
84
88
  if on_delta is not None:
85
- on_delta(data)
89
+ # The view retains its ZMQ frame while a cancelled worker finishes.
90
+ delta = await self._decode(
91
+ unpack, data_frame.buffer.toreadonly()
92
+ )
93
+ # Cancellation may remove the handler while the worker decodes.
94
+ if self._deltas.get(request_id) is on_delta:
95
+ on_delta(delta)
86
96
  continue
87
97
  future = self._pending.pop(request_id, None)
88
98
  if future is not None and not future.done():
89
- future.set_result(data)
99
+ future.set_result(data_frame.bytes)
90
100
  except Exception: # keep receiving for the other requests
91
101
  logger.warning("dropping a malformed env-server frame", exc_info=True)
92
102
 
@@ -95,11 +105,11 @@ class EnvClient:
95
105
  request: BaseRequest,
96
106
  response_type: type[ResponseT],
97
107
  timeout: float | None = None,
98
- on_delta: Callable[[bytes], None] | None = None,
108
+ on_delta: Callable[[dict], None] | None = None,
99
109
  ) -> ResponseT:
100
110
  """Send a typed request and validate the reply into `response_type`. A
101
111
  `timeout` is only used for health polling — rollouts run untimed. `on_delta`
102
- receives each `delta` frame the request streams before its reply."""
112
+ receives each decoded `delta` the request streams before its reply."""
103
113
  self._ensure_receiver()
104
114
  request_id = uuid.uuid4().hex
105
115
  future: asyncio.Future[bytes] = asyncio.get_running_loop().create_future()
@@ -134,13 +144,10 @@ class EnvClient:
134
144
  raise RuntimeError(response.error or "env server request failed")
135
145
  return response
136
146
 
137
- async def _validate_episode(self, record: dict) -> WireEpisode:
138
- """Type the assembled record off the loop, one episode at a time: a long
139
- trace is a lot of token spans to validate."""
147
+ async def _decode(self, decode: Callable[..., DecodedT], *args: object) -> DecodedT:
148
+ """Decode off the loop, sharing one slot with final episode validation."""
140
149
  await self._decode_slots.acquire()
141
- decoding = asyncio.create_task(
142
- asyncio.to_thread(WireEpisode.model_validate, record)
143
- )
150
+ decoding = asyncio.create_task(asyncio.to_thread(decode, *args))
144
151
  # Hold the slot until the worker finishes so cancellation cannot overlap decodes.
145
152
  decoding.add_done_callback(lambda _: self._decode_slots.release())
146
153
  try:
@@ -199,8 +206,7 @@ class EnvClient:
199
206
  episode returned is assembled from the same deltas."""
200
207
  assembly = EpisodeAssembly()
201
208
 
202
- def apply(data: bytes) -> None:
203
- delta = unpack(data)
209
+ def apply(delta: dict) -> None:
204
210
  assembly.apply(delta)
205
211
  if on_delta is not None:
206
212
  on_delta(delta)
@@ -216,8 +222,8 @@ class EnvClient:
216
222
  on_delta=apply,
217
223
  )
218
224
  assert response.head is not None
219
- return await self._validate_episode(
220
- assembly.finish(response.head, response.traces)
225
+ return await self._decode(
226
+ WireEpisode.model_validate, assembly.finish(response.head, response.traces)
221
227
  )
222
228
 
223
229
  async def close(self) -> None:
File without changes