fix(code): group resume trace rounds - #5593
Merged
Merged
Conversation
Co-authored-by: open-swe[bot] <open-swe@users.noreply.github.com>
Mason Daugherty (mdrxy)
marked this pull request as ready for review
August 18, 2026 15:18
Replace `resume_trace_config(config)` with `stream_trace_config(config, stream_input)`, which decides internally whether the round is a resume. The `isinstance(stream_input, Command)` ternary was duplicated verbatim at all three call sites; folding it in leaves one shared branch to test. Correct the docstrings. The old text claimed the parameter was the stream config shared across a user turn, which is false on the `/offload` path -- `DeepAgentsApp._offload` passes a thread-only config that never goes through `build_stream_config`, so those rounds carry no `turn_id`/`turn_number` and group by `thread_id` alone. Also record that LangGraph unions `tags` onto every child config, so the tag reaches descendant runs and must be paired with an `is_root` filter to select resume roots, and that the shallow copy shares `metadata`/`configurable` by reference. Document what consumes `RESUME_TRACE_TAG`. Nothing in this repository reads it, so without a note the literal is indistinguishable from dead code. Cover the two call sites that had none: the headless loop and the `/offload` compaction driver both now assert the initial round is untagged, later rounds are tagged, and the base config is never tagged in place. Add a boundary test for `_prepare_config`, which every config crosses before reaching the server -- narrowing it to a whitelist would drop `tags` and make grouping a silent no-op with its own tests still green. Replace two assertions that pinned implementation over behavior: metadata dict identity (an artifact of `dict.copy()`) and an exact-match on a tag list that happens to be empty today.
Mason Daugherty (mdrxy)
pushed a commit
that referenced
this pull request
Aug 19, 2026
> [!CAUTION] > Merging this PR will automatically publish to **PyPI** and create a **GitHub release**. For the full release process, see [`.github/RELEASING.md`](https://github.com/langchain-ai/deepagents/blob/main/.github/RELEASING.md). --- _Release notes preview: keep this section in sync with the package `CHANGELOG.md`. Publish reads the merged CHANGELOG via `release.yml`, not this PR description — keep them aligned anyway so the PR stays an accurate historical record for reviewers and anyone returning later._ --- ## [0.1.58](deepagents-code==0.1.57...deepagents-code==0.1.58) (2026-08-19) ### Breaking Changes - `deepagents-code` now requires Python 3.12 or newer. ([#5603](#5603)) ### Features - Added OpenRouter `z-ai/glm-5.3` to the model switcher. ([#5641](#5641)) - Added support for re-authenticating MCP servers from the viewer. ([#5637](#5637)) - Footer pickers can now be opened with `ctrl+click`. ([#5611](#5611)) - Resume hints now account for `TERM_PROGRAM` support before showing terminal-specific guidance. ([#5580](#5580)) ### Fixes - Completed the `dcode config` command surface. ([#5581](#5581)) - Made `/offload` interruptible. ([#5590](#5590)) - Improved chat and footer UI behavior: rapid typing stays visible, double-click collapses a resized chat input, and the MCP footer wraps on narrow windows. ([#5424](#5424), [#5578](#5578), [#5651](#5651)) - Captured stdio MCP server stderr in the logger. ([#5610](#5610)) - Drained hook pipes after timeout. ([#5606](#5606)) - Grouped resume trace rounds. ([#5593](#5593)) - Omitted web-search prompt guidance when web search is unavailable. ([#5602](#5602)) - Resolved message pointer shapes per cell. ([#5592](#5592)) _End release notes preview._ --- > [!NOTE] > A **community contributors** list and a **Special thanks** section (crediting the users who filed the issues this release's PRs closed) are appended to the GitHub release notes automatically at publish time (see [Release Pipeline](https://github.com/langchain-ai/deepagents/blob/main/.github/RELEASING.md#release-pipeline), step 3). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: langchain-oss-automated-triage[bot] <248757908+langchain-oss-automated-triage[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Deep Agents Code now marks every approval-interrupt continuation as part of the same user turn, making long auto-approval sessions readable and groupable in LangSmith.
Before
A single user prompt can pause many times while tools pass through approval checks. After each approval, dcode resumes the LangGraph checkpoint with a new Agent Server request. LangSmith recorded every resume request as a separate root trace, so one turn with 30 approval checks looked like 30 independent traces with nearly identical conversation inputs—even though the graph was advancing normally by one step each time.
After
The initial run of a turn is unchanged and stays untagged. Every later
Command(resume=...)request is taggeddcode:resumeand reuses the turn's config, so it keeps the samethread_id,turn_id, andturn_numberas the original run. LangSmith views and cost reports can therefore filter and group those sibling roots as one logical user turn.stream_trace_config(config, stream_input)makes that decision in one place; each call site passes its stream input and the helper tags onlyCommandinputs.This applies to interactive TUI runs, headless runs, and internal
/offloadresumes. It does not change approval or classifier decisions, model inputs, prompt caching, checkpoint frequency, or graph execution semantics.Scope and caveats
/offloadgroups bythread_idonly. It builds a thread-only config instead of going throughbuild_stream_config, so its rounds carry noturn_id/turn_number. The tag is its only resume marker.tagsonto child configs, so pair it with anis_rootfilter to select resume roots alone.dcode:resume. The consumer is LangSmith, so the literal string is an external contract — renaming it breaks saved views and filters. This is recorded next to the constant.Made by Open SWE
References