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.
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/PKG-INFO +1 -1
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/pyproject.toml +1 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/grid.py +1 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/anthropic.py +26 -1
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/base.py +1 -1
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/responses.py +1 -1
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/__init__.py +3 -0
- verifiers-0.4.1.dev32/verifiers/v1/harnesses/deepseek/__init__.py +6 -0
- verifiers-0.4.1.dev32/verifiers/v1/harnesses/deepseek/gate.mjs +11 -0
- verifiers-0.4.1.dev32/verifiers/v1/harnesses/deepseek/harness.py +148 -0
- verifiers-0.4.1.dev32/verifiers/v1/harnesses/deepseek/usage.mjs +75 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/server.py +3 -1
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/.gitignore +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/LICENSE +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/README.md +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/conftest.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/agent_user_harness_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/agent_user_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/duet_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_tool_compose/docker-compose.yaml +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/network_policy_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/pyproject.toml +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/skill_codeword_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_agent_user.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_agentic_judge.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_compose_scoring.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_examples.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_limits.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_multi_agent.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_multi_turn.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_multi_turn_tool.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_multimodal_tool.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_network_policy.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_resume_tool.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_rubric_judge.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_sampling.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_shared_tool.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_single_turn.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_skills.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_stateful_tool.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_user_echo.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/test_user_sim.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/cli/test_replay.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/conftest.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/harnesses/test_core.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/harnesses/test_rlm.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/interception/test_tunnel.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/judges/conftest.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/judges/test_judge.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/judges/test_reference.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/judges/test_rubric.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/runtimes/test_e2b.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/serve/test_client.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/serve/test_delta.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/serve/test_pool.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_agent.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_dialects.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_graph.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_semantic.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_task.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_taskset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/test_trace.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/utils/test_compile.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/utils/test_loaders.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/utils/test_platform.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/unit/utils/test_score.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/agent.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/scoring.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/select.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/env.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/episode.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/errors.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/grading.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/graph.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/opencode/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/opencode/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/opencode/mcp-ready.js +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/harnesses/utils/replay.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judge.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/decision.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/apptainer.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/compose.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/container.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/deployment.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/e2b.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/runtime.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/strategies.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/delta.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/session.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/state.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/task.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/trace.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/types.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/env.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/eval.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/scope.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/verifiers/v1/utils/trace_store.py +0 -0
- {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.
|
|
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",
|
|
@@ -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,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(
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/agent_user_harness_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/counter_tool_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_acp_resume_v1.py
RENAMED
|
File without changes
|
{verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_agentic_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/echo_user_sim_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/network_policy_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/skill_codeword_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev30 → verifiers-0.4.1.dev32}/tests/integration/fixtures/tool_response_image_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|