Support OpenHands MAX and complete trainer trajectories#921
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2fbb526e1b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| 'printf \',"reasoning_effort":"%s",' | ||
| '"litellm_extra_body":{"reasoning_effort":"%s"}\' ' | ||
| '"$LLM_REASONING_EFFORT" "$LLM_REASONING_EFFORT"; fi; ' |
There was a problem hiding this comment.
Clamp OpenHands reasoning_effort to its accepted values
When LLM_REASONING_EFFORT is set to a BenchFlow-supported value that OpenHands does not accept in its LLM.reasoning_effort field, such as max or minimal, this writes that value directly into agent_settings.json. The pinned OpenHands SDK schema only accepts low/medium/high/xhigh/none there, so those runs will fail to load the settings (or fall back after treating them as corrupted) before the proxy can use the otherwise valid provider-side effort.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in ed531a2bd.
OpenHands now writes the typed reasoning_effort field only for the SDK-accepted enum values (none, low, medium, high, xhigh). max stays on litellm_extra_body.reasoning.effort, and provider-only values such as minimal stay in litellm_extra_body.reasoning_effort without corrupting ~/.openhands/agent_settings.json.
Validation: uv run pytest -q tests/test_agent_registry.py (30 passed), focused Ruff check/format, uv run ty check src/benchflow/agents/registry.py, and git diff --check.
|
Canonical manifest sync opened as benchflow-ai/agents#54. Local live parity against that branch: 12 passed. MAX Daytona canaries are running under this commit; official rows remain blocked pending their provider-response audit. |
|
Latest production validation: integrated no-skill MAX canary is publishable end-to-end (9/9 MAX responses, exact 9-step trainer row). Integrated with-skill canary had 23 completed MAX responses plus two recovered content-filter incomplete responses; commit 4968f0a excludes only those incomplete responses and the strengthened validator passes. Final semantic audit is in progress. Canonical manifest dependency remains agents#54. |
|
MAX experiment follow-up: OpenHands SDK 1.22.1 defaults each LLM HTTP request to 300 seconds. In the 16-row GPT-5.6-SOL MAX ramp, the eight unfinished rows repeatedly logged Commit Validation:
|
|
MAX experiment follow-up: semantic review found a second retry-race edge in Raw exchange 59 completed after its 300s client timeout, but the agent had already resumed from the timeout error. Its nonterminal tool call was never consumed or executed. The old fallback still selected it because its request body was unique. Commit Evidence:
|
|
Runtime refresh for the GPT-5.6-SOL MAX experiment:
Local validation on head
Remote parity will remain externally blocked until agents #54 lands; the exact runtime code and local cross-repo parity are green. This update was generated by Codex on behalf of Bingran You. |
|
Users Simulation automation review (2026-07-12): blocked on current head What passed:
Blocker:
Thermo notes:
Cost metadata caveat: token/timing telemetry is complete, but GLM per-rollout Labels remain |
|
Follow-up runtime fix in
This fix is required before resuming long MAX rollouts such as |
…ropagation-fix # Conflicts: # tests/test_train_mode_artifact_emission.py
|
Added opt-in Daytona SSH ACP fallback in The default remains PTY. Set Validation:
This is intentionally opt-in rather than automatic failover; the canaries prove the direct-Daytona SSH happy path, not DinD or interrupted-session recovery. |
|
Users Simulation automation review (2026-07-13): still blocked on current head What passed:
Blocker:
Thermo-nuclear review: the broad 25-file surface is tolerable for this trajectory/proxy/sandbox change only because focused tests and the artifact validator cover the boundaries; no file crosses from under 1k to over 1k lines. The merge blocker remains manifest parity, not a local unit failure. Keeping |
|
MAX long-run recovery update (2026-07-13): pushed Root causes addressed:
Changes:
Validation:
Cross-repo manifest sync is pushed to This update was generated by Codex on behalf of Bingran You. |
|
Daytona cross-operator cleanup follow-up (2026-07-13): pushed The 105-response, 120.8-minute MAX Fix:
Validation:
The failed 105-response rollout was independently audited not publishable: task_skills_loading=0, all responses MAX, no reward hacking, genuine optimization progress, external deletion before verifier. This update was generated by Codex on behalf of Bingran You. |
|
Daily scan maintenance update (2026-07-14): pushed What changed:
Local validation on the PR branch:
Remaining known blocker is still manifest parity against external |
|
Users Simulation automation review (2026-07-14): still blocked on current head What passed:
Blocking finding:
Thermo-nuclear review:
Cost caveat:
|
Summary
litellm_extra_body.reasoning.effort, bypassing the OpenHands SDK typed enumresults.jsonlstatus=incompleteresponses from training while retaining raw provenancebenchflow-experiment-reviewvalidator against dropped exchanges and nested truncationProduction evidence
MAX canaries proved provider support and OpenHands routing. A 50-exchange citation pass exposed silent trainer-row loss and false truncation; an integrated 25-exchange canary exposed two recovered content-filter responses. Rebuilding unchanged raw trajectories now retains every completed exchange, excludes only incomplete/error responses from training, records zero truncated steps, and passes the strengthened validator.
Validation
324a8f40b4968f0a85Official MAX rows remain blocked until the final integrated with-skill audit passes.
Latest automation update (2026-07-12)
ed531a2bdto address current-line OpenHands settings feedback: typedreasoning_effortis now emitted only for OpenHands-supported values (none,low,medium,high,xhigh);maxand provider-only values such asminimalstay inlitellm_extra_bodyso the OpenHands SDK schema does not reject the settings file.uv sync --extra dev --locked;uv run pytest -q tests/test_agent_registry.py(30 passed);uv run ruff check src/benchflow/agents/registry.py tests/test_agent_registry.py;uv run ruff format --check src/benchflow/agents/registry.py tests/test_agent_registry.py;uv run ty check src/benchflow/agents/registry.py;git diff --check.ed531a2bd:test,pip-audit, both detect-scope jobs, andintegration-light / rollout-smokepassed.manifest-parity / paritystill fails againstbenchflow-ai/agentsmain because external manifests drift foropencode(install_cmd) andopenhands(launch_cmd).benchflow-experiment-review: 1/1 rollout healthy, 227,853 tokens, 13 tool calls, reward present, 14/14 LLM responses with usage, andtraining_ready=1.Remaining blocker: keep
status:blocked/review:changes-requesteduntil the external canonicalbenchflow-ai/agentsmanifests are synchronized and parity is green.