Codex rollout reader drops raw reasoning from open-model servers
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 45/100
Research direction
Read engine/resources/agent_rollout/codex.py, especially extract_codex_reasoning_summaries, and the rollout tests under tests/engine/resources/agent_rollout/. Use the provided JSONL reproduction to check how reasoning items with content and summary are parsed. Done means the assistant message has reasoning_content from content, with summary as fallback, and the existing rollout tests still pass.
Written by the indexing model from the issue text.
Description
Priority Level
Medium (Annoying but has workaround)
Describe the bug
AgentRolloutSeedSource with format=codex drops the reasoning of Codex sessions that ran against an open model served by vLLM.
extract_codex_reasoning_summaries in engine/resources/agent_rollout/codex.py reads only the summary field of a reasoning response item.
vLLM's Responses API returns reasoning as content: [{"type": "reasoning_text", ...}] with an empty summary, and Codex writes that item to the rollout file unchanged.
The resulting assistant messages have no reasoning_content, so the reasoning is missing from the seed data.
Steps/Code to reproduce bug
Reproduced on main (c05a87e) with Python 3.14.3 and dependencies installed with uv sync --all-packages --frozen.
No model calls are needed.
The code calls CodexAgentRolloutFormatHandler, the handler that AgentRolloutSeedSource(format="codex") uses (registered in agent_rollout/registry.py).
import json
import tempfile
from pathlib import Path
from data_designer.engine.resources.agent_rollout.codex import CodexAgentRolloutFormatHandler
root = Path(tempfile.mkdtemp())
rows = [
{"type": "session_meta", "payload": {"id": "sess-1"}},
{"type": "response_item", "payload": {"type": "message", "role": "user", "content": [{"type": "input_text", "text": "What is 2+2?"}]}},
{"type": "response_item", "payload": {"type": "reasoning", "summary": [], "content": [{"type": "reasoning_text", "text": "2+2 is 4."}], "encrypted_content": None}},
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "4"}]}},
]
(root / "rollout-repro.jsonl").write_text("\n".join(json.dumps(r) for r in rows) + "\n")
record = CodexAgentRolloutFormatHandler().parse_file(root_path=root, relative_path="rollout-repro.jsonl")[0]
print(next(m for m in record.messages if m["role"] == "assistant").get("reasoning_content"))
Output: None
Expected behavior
The assistant message has reasoning_content == "2+2 is 4.".
When a reasoning item has text in both content and summary, the reader should prefer content (the full reasoning) and fall back to summary, OpenAI-hosted models do not return raw reasoning content, so their rollouts keep the current behavior.
Agent Diagnostic / Prior Investigation
- Searched open and closed issues, PRs, and discussions for "codex reasoning", "codex rollout", "reasoning_content", "reasoning_text", "agent_rollout", and "AgentRolloutSeedSource": no existing report.
#374 also concerns vLLM reasoning fields, but in model client response parsing, not in rollout ingestion. - Searched the docs: the agent rollout ingestion page (
agent-rollout-ingestion.mdx) does not mention reasoning, so it does not say which Codex reasoning fields are read. - End to end: Codex CLI 0.159.2 against vLLM 0.30.0 serving
nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8, two turns with tool calls, ingested with Data Designer 0.9.2.
The rollout file had 4 reasoning items withreasoning_textcontent and an emptysummary.
The reader setreasoning_contenton 0 of 4 corresponding assistant messages. - Workaround: rewrite the rollout files to copy
contentintosummarybefore ingestion.
Additional context
I have a fix ready: a small change in codex.py (+11/−6 lines) that reads content first and falls back to summary, plus one unit test.
On main, tests/engine/resources/agent_rollout/ passes (49 tests) with the fix applied, and the new test fails without it.
I will open the PR once this issue is triaged.
Checklist
- I reproduced this issue or provided a minimal example
- I searched the docs/issues myself, or had my agent do so
- If I used an agent, I included its diagnostics above
- Dominant language
- Python
- Stars
- 2.3k
- Forks
- 227
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 52
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from NVIDIA-NeMo/DataDesigner
-
docs: required_columns description is incomplete for LLM and multimodal columnsPossibly taken @nightcityblade claimed this 6 days ago. Openbug
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
NVIDIA-NeMo/DataDesigner#1002 · 3 comments ·
Maintainers usually reply within 1 day
-
Python code validator reports syntactically invalid code as validPossibly taken @Bsgg1 claimed this today. Openbug triaged
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
NVIDIA-NeMo/DataDesigner#995 · 4 comments ·
Maintainers usually reply within 1 day
-
enforce \from future import annotations` via ruff FA102 rule`Possibly taken @chethanuk claimed this 34 days ago. Opentask
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
NVIDIA-NeMo/DataDesigner#760 ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 15/100
NVIDIA-NeMo/DataDesigner#1033 ·
Maintainers usually reply within 1 day
-
Agent skills hide information in unspecified fieldMay be free again A pull request for this issue was closed without being merged. Openbug
Difficulty 2/5 1-3 hours Newbie friendliness 38/100
NVIDIA-NeMo/DataDesigner#1010 ·
Maintainers usually reply within 1 day
All issues in NVIDIA-NeMo/DataDesigner
Similar issues
-
`burr` fails to start when the Python path has a space in itPossibly taken @enekoreto claimed this today. Openstatus/needs-triage
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 5 days
-
gemini 出现了新的域名需要加入Open
Difficulty 1/5 Under an hour Newbie friendliness 72/100
-
Difficulty 2/5 Half a day Newbie friendliness 72/100
debpalash/VoiceStudio#2903 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
dagster-io/community-integrations#367 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
aws-samples/sample-per-model-bedrock#243 ·
Maintainers usually reply within 1 day