feat(parsers-v2): add Muse Glimmer unified and streaming tool-call parsers - #185
Conversation
|
📊 Conformance matrix rendered — view in CI summary |
7672553 to
da2f540
Compare
18f5c31 to
6e5e82a
Compare
9945785 to
49cce52
Compare
indrajit96
left a comment
There was a problem hiding this comment.
LGTM!
Core parser behavior and targeted tests look solid.
Some Nits and versioning questions
49cce52 to
106d907
Compare
|
hey Dallas, nice work on this. digging into the conformance table after approving — muse_glimmer only covers 36 of 81 unified cases. guided-decoding and prefilled-response groups get skipped since there's no |
keivenchang
left a comment
There was a problem hiding this comment.
Just gonna pre-approve to unblock you.
|
Added the TODO for the guided-decoding/prefilled-response coverage. Thanks for the approval @keivenchang! |

Overview
Adds Muse-Glimmer-30B parser support as a v2
UnifiedParser: one state machine that emits reasoning, content, and tool-call deltas in model order, plus the tool-only projection of the same scanner. The model uses ATEM tool markup and recipient-routed reasoning.What this adds
parsers/v2/src/unified/muse_glimmer.rs: the unified parser.parsers/v2/src/tool_calling/muse_glimmer.rs:MuseChannelScanner(recipient-dispatched) andMuseGlimmerToolStreamParser, the tool-only projection of the same scanner. Registered asmuse_glimmerincreate_tool_parser_for_familyandcreate_unified_parser_for_family.Why a muse-specific scanner
WrappedBlockScannerdispatches on fixed marker literals. Muse decides the channel from the dynamicto=<recipient>header (the same<|start|>...<|message|>opener begins reasoning, content, or a tool block), so there is no marker pair to declare.MuseChannelScannerowns the routing and reuses the shared primitives; one scanner drives both surfaces.Validation
cargo test --workspacepass, clippy-D warningsand fmt clean,check.sh cigreen,check_family_coverage --family muse_glimmer0/0, golden corpus regenerates byte-identical.Known limitations (documented and pinned)
<|eom|>seam can survive one strip pass and reappear in assembled text. Requires model-invalid input (a reserved-token fragment as prose across a real control token). Pinned as a chunk-invariance exception.u64::MAXformat viaf64.<|start|>inside an ATEM parameter value is read as a channel switch.Companion Dynamo change (separate PR)
To serve muse through v2, Dynamo consumes the unified parser (
create_unified_parser_for_family) for muse by default, which replaces both the v1 reasoning parser and the tool jail. Dynamo'sparser_requires_special_tokensmust also list the muse aliases, or serving strips the channel framing before any parser runs (Inkling precedent, dynamo #11823).Versions
dynamo-parsers-v20.2.0 to 0.2.1 (additive, on top of the refactor(parsers): align the unified parser surface with peer traits, and let vendors supply their own #178 unified-surface refactor).