Skip to content

[examples, gateway, tasks] feat: add DeepEyes training recipe - #150

Open
Fvvs-iu wants to merge 12 commits into
verl-project:mainfrom
Fvvs-iu:deepeyes-decoupled
Open

[examples, gateway, tasks] feat: add DeepEyes training recipe#150
Fvvs-iu wants to merge 12 commits into
verl-project:mainfrom
Fvvs-iu:deepeyes-decoupled

Conversation

@Fvvs-iu

@Fvvs-iu Fvvs-iu commented Aug 25, 2026

Copy link
Copy Markdown

Summary

Add DeepEyes as a complete visual-tool GRPO training workflow for multimodal
visual question answering.

The DeepEyes policy can inspect image crops through ImageZoomInTool before
producing a final answer. DeepEyes-specific behavior remains in the owning
layers: the Agent owns the multimodal ReAct loop and crop action; the Task owns
episode lifecycle and reward context; the Task package owns preprocessing and
Judge-based scoring; Gateway and Framework changes preserve compatible
multimodal requests and task metadata during rollout.

The deepeyes recipe also serves as a lightweight, self-contained quickstart
for the agentic RL training path, keeping data preparation, rollout, reward,
and training entry points in one place.

No separate issue is linked because this PR delivers the complete DeepEyes
training recipe and its supporting core integration.

Changes

  • Add registered deepeyes Agent and Task implementations, including the
    image-zoom tool, visual-question preprocessing, and Judge-based reward.
  • Add a runnable examples/deepeyes GRPO recipe: parquet dataset adapter,
    task/Judge configuration, training launcher, and eight-NPU Qwen3.5-4B preset.
  • Bound rollout generation with configurable turn, per-turn-token, and
    total-token limits; retain the configured system prompt and support
    configurable request retries.
  • Normalize multimodal image URLs for Qwen-compatible gateway requests and
    preserve task metadata required for reward evaluation.
  • Document data preparation, training controls, and a local fixed 48-sample
    validation result: Qwen3.5-4B accuracy improves from 50.0% to 79.2%.

Validation

  • python -m pytest -q tests/uni_agent/agents/test_deepeyes_agent.py 5 passed
  • python -m pytest -q tests/uni_agent/framework/test_generate_sequences_on_cpu.py 28 passed
  • pre-commit run --all-files --show-diff-on-failure --color=always passed

Checklist

  • The PR is focused and explains why no issue is needed.
  • The title follows the required format and names the owning layers.
  • Tests were added for the core DeepEyes behavior.
  • User-facing config and workflow changes include runnable examples and documentation.
  • No compatibility-breaking API or migration is required.
  • Logs, fixtures, and examples contain no credentials or private data.
  • pre-commit run --all-files --show-diff-on-failure passes.

@tardis-key

Copy link
Copy Markdown
Contributor

The README references examples/deepeyes/run_4b_7p1_container.sh and examples/deepeyes/task_config_4b.yaml, but neither file is included in this PR. Could you add them or update the README to use train_deepeyes.sh directly?

@Fvvs-iu

Fvvs-iu commented Aug 26, 2026

Copy link
Copy Markdown
Author

The README references examples/deepeyes/run_4b_7p1_container.sh and examples/deepeyes/task_config_4b.yaml, but neither file is included in this PR. Could you add them or update the README to use train_deepeyes.sh directly?

Thanks for catching this. I’ve updated the README to use train_deepeyes.sh directly and added the Judge startup instructions.

@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 82.12560% with 74 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
uni_agent/agents/deepeyes/tool.py 68.06% 38 Missing ⚠️
uni_agent/agents/deepeyes/agent.py 81.17% 32 Missing ⚠️
uni_agent/gateway/session/codec.py 86.66% 4 Missing ⚠️

📢 Thoughts on this report? Let us know!

Comment thread examples/deepeyes/task_config.yaml Outdated
@Fvvs-iu
Fvvs-iu force-pushed the deepeyes-decoupled branch from 6777dae to 7a73617 Compare August 27, 2026 02:55
ge=0,
description="Retries after transient HTTP failures. Set to zero for long-running policy requests.",
)
action_timeout_seconds: float | None = Field(default=None, gt=0.0)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this variable needed? It seems enforced nowhere.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants