Repository navigation
feat: route Qwen3-Coder + DeepSeek-V4 tool calls through dynamo-parsers-v2 (DYN_ENABLE_EXPERIMENTAL_PARSERS_V2) - #10853
Merged
keivenchang merged 1 commit intoJun 26, 2026
Conversation
This comment has been minimized.
This comment has been minimized.
keivenchang
force-pushed
the
keivenchang/DIS-2228__bump-dynamo-parsers-2.0.1
branch
from
June 23, 2026 01:25
84aaa30 to
2eb21b3
Compare
keivenchang
force-pushed
the
keivenchang/DIS-2228__qwen3-coder-tool-calls-v2
branch
from
June 23, 2026 01:26
efd94c2 to
0c42524
Compare
This was referenced Jun 23, 2026
keivenchang
force-pushed
the
keivenchang/DIS-2228__bump-dynamo-parsers
branch
from
June 24, 2026 00:21
2eb21b3 to
044c0ca
Compare
keivenchang
force-pushed
the
keivenchang/DIS-2228__qwen3-coder-tool-calls-v2
branch
from
June 24, 2026 18:33
0c42524 to
2382afd
Compare
keivenchang
temporarily deployed
to
external_collaborator
June 24, 2026 18:33 — with
GitHub Actions
Inactive
keivenchang
force-pushed
the
keivenchang/DIS-2228__bump-dynamo-parsers
branch
from
June 24, 2026 18:45
044c0ca to
ce6c40c
Compare
keivenchang
force-pushed
the
keivenchang/DIS-2228__bump-dynamo-parsers
branch
from
June 24, 2026 19:14
ce6c40c to
bd65cf7
Compare
keivenchang
force-pushed
the
keivenchang/DIS-2228__qwen3-coder-tool-calls-v2
branch
from
June 24, 2026 19:21
2382afd to
75b7b9b
Compare
keivenchang
temporarily deployed
to
external_collaborator
June 24, 2026 19:21 — with
GitHub Actions
Inactive
keivenchang
force-pushed
the
keivenchang/DIS-2228__qwen3-coder-tool-calls-v2
branch
from
June 24, 2026 19:33
75b7b9b to
84131c4
Compare
keivenchang
temporarily deployed
to
external_collaborator
June 24, 2026 19:33 — with
GitHub Actions
Inactive
keivenchang
force-pushed
the
keivenchang/DIS-2228__bump-dynamo-parsers
branch
from
June 24, 2026 19:48
bd65cf7 to
0159cef
Compare
keivenchang
force-pushed
the
keivenchang/DIS-2228__qwen3-coder-tool-calls-v2
branch
from
June 24, 2026 19:53
84131c4 to
06833c0
Compare
keivenchang
temporarily deployed
to
external_collaborator
June 24, 2026 19:53 — with
GitHub Actions
Inactive
Base automatically changed from
keivenchang/DIS-2228__bump-dynamo-parsers
to
main
June 24, 2026 20:49
keivenchang
force-pushed
the
keivenchang/DIS-2228__qwen3-coder-tool-calls-v2
branch
from
June 24, 2026 21:04
06833c0 to
9440d51
Compare
keivenchang
temporarily deployed
to
external_collaborator
June 24, 2026 21:04 — with
GitHub Actions
Inactive
keivenchang
force-pushed
the
keivenchang/DIS-2228__qwen3-coder-tool-calls-v2
branch
from
June 24, 2026 21:59
9440d51 to
d0747af
Compare
keivenchang
temporarily deployed
to
external_collaborator
June 24, 2026 21:59 — with
GitHub Actions
Inactive
keivenchang
marked this pull request as ready for review
June 24, 2026 22:08
Contributor
WalkthroughAdds the parser-v2 dependency and environment flag, introduces a new OpenAI chat-completions tool parser module, routes supported tool-call flows through it, and adds unit and integration tests for the experimental path. ChangesExperimental parser-v2 routing
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
keivenchang
force-pushed
the
keivenchang/DIS-2228__qwen3-coder-tool-calls-v2
branch
from
June 24, 2026 23:19
d0747af to
0c2655e
Compare
keivenchang
temporarily deployed
to
external_collaborator
June 24, 2026 23:19 — with
GitHub Actions
Inactive
…s-v2 behind DYN_ENABLE_EXPERIMENTAL_PARSERS_V2 Generalize the Qwen3-Coder v2 tool-call routing into a family-agnostic path and add DeepSeek-V4 (DSML). When DYN_ENABLE_EXPERIMENTAL_PARSERS_V2 is set, both the batch and streaming paths route supported families through dynamo_parsers_v2::create_tool_parser_for_family, bypassing the v1 jail; otherwise the v1 jail / aggregate-finalize path is unchanged. Renames qwen3_coder_v2.rs to tool_parser_v2.rs, adds the env flag (off by default), and depends on the published dynamo-parsers-v2 0.1.10 (dynamo-parsers 2.1.2). Signed-off-by: Keiven Chang <keivenchang@users.noreply.github.com>
keivenchang
force-pushed
the
keivenchang/DIS-2228__qwen3-coder-tool-calls-v2
branch
from
June 24, 2026 23:39
0c2655e to
9aad838
Compare
keivenchang
temporarily deployed
to
external_collaborator
June 24, 2026 23:39 — with
GitHub Actions
Inactive
KrishnanPrash
approved these changes
Jun 26, 2026
This branch was previously deployed
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.
Overview
Routes Qwen3-Coder and DeepSeek-V4 tool calls through the
dynamo-parsers-v2streaming parser, gated behind a newDYN_ENABLE_EXPERIMENTAL_PARSERS_V2env flag. When the flag is set, both the batch and the streaming path bypass the v1 tool-call jail and use the v2 parser — which owns incremental tool-call emission and drops a parameter value truncated at EOF instead of guessing it. Off by default; the v1 jail / aggregate-finalize path is unchanged.Changes
DYN_ENABLE_EXPERIMENTAL_PARSERS_V2flag (const + registry inenvironment_names.rs), read once via a cachedLazyLock<bool>.qwen3_coder_v2.rsinto a family-agnostictool_parser_v2.rs:enabled(),supports_family()={qwen3_coder, deepseek_v4}, andapply_stream/parse_completebuilt ondynamo_parsers_v2::create_tool_parser_for_family(family, …)returningBox<dyn ToolParser>. Adding a family is a one-line change here plus support in the crate.enabled() && supports_family(parser): streaming (preprocessor.rs) and batch (aggregator.rs).dynamo-parsers-v2 0.1.10dep. Thedynamo-parsers 2.1.2bump merged separately in chore: bump dynamo-parsers to 2.1.2 #10899; this branch is rebased ontomainon top of it.Behavior
qwen3_coderanddeepseek_v4route through v2 for both batch and streaming.Tests
tool_parser_v2unit tests: Qwen3-Coder incremental stream + truncated-at-EOF drop, plus a DeepSeek-V4 DSML incremental stream (reconstructs oneget_weather(location=NYC)call, no markup leak).cargo test -p dynamo-llm: 3 unit + 149 integration (test_jail 69, streaming 36, tool_choice 36, parallel 8) pass — the env-gating leaves the v1 path unchanged.Enabling the experimental v2 path
Off by default. Set
DYN_ENABLE_EXPERIMENTAL_PARSERS_V2(truthy:1/true/yes/on) at process startup to route the supported families (qwen3_coder,deepseek_v4) through the v2 parser instead of the v1 jail, for both batch and streaming. The flag is read once per process viaLazyLock, so it's a startup switch (not toggleable mid-run). Other families, and non-autotool_choice (required/named), always stay on v1.In fixture / Rust tests — prefix the test run with the env var (applies to the whole test binary):
tool_calls_qwen3_coder_auto_routes_through_experimental_gateis the gate test: it routes aqwen3_coder+autotool-call stream through the dispatch, so the same assertion exercises v1 with the flag off and v2 with it on. CI runs with the flag off.In real Dynamo — export it for the frontend process:
Related
DIS-2228 — Qwen3-Coder v2 parser + env-gated Dynamo routing
Summary by CodeRabbit
New Features
Bug Fixes