Reasoning Parsing (Dynamo)

Configure Dynamo’s built-in reasoning parsers for models that emit thinking content

View as Markdown

Some models emit reasoning separately from their final response. Dynamo can split that output into reasoning_content and normal assistant content by configuring --dyn-reasoning-parser on the backend worker. This page covers Dynamo-native parsing; if your model is not listed, use engine fallback, which also explains valid combinations of --dyn-reasoning-parser, --dyn-chat-processor, and --dyn-tool-call-parser.

Configure Reasoning Parsing

1

Launch Dynamo backend

Select --dyn-reasoning-parser from the supported list below. The backend can be SGLang, TensorRT-LLM, vLLM, or another installed backend.

For vLLM structured output or SGLang required/named tool choice, also configure the engine’s native --reasoning-parser. The native parser controls when the grammar starts; Dynamo’s parser populates reasoning_content. Parser names can differ between registries.

To inspect the available worker flags, run:

$python -m dynamo.<backend> --help

The following example starts an SGLang worker for Qwen3.5:

$python -m dynamo.sglang \
> --model Qwen/Qwen3.5-4B \
> --dyn-tool-call-parser qwen3_coder \
> --reasoning-parser qwen3 \
> --dyn-reasoning-parser qwen3
Some models need both parsers configured together. Common pairings include:
  • openai/gpt-oss-*: --dyn-tool-call-parser harmony --dyn-reasoning-parser gpt_oss
  • deepseek-ai/DeepSeek-V4-*: --dyn-tool-call-parser deepseek_v4 --dyn-reasoning-parser deepseek_v4
  • zai-org/GLM-4.7: --dyn-tool-call-parser glm47 --dyn-reasoning-parser glm45
  • moonshotai/Kimi-K2.5* / Kimi K2.6 format-compatible outputs: --dyn-tool-call-parser kimi_k2 --dyn-reasoning-parser kimi_k25
  • google/gemma-4-* thinking models: --dyn-tool-call-parser gemma4 --dyn-reasoning-parser gemma4 --custom-jinja-template examples/chat_templates/gemma4_tool.jinja
  • Qwen/Qwen3.5*: --dyn-tool-call-parser qwen3_coder --dyn-reasoning-parser qwen3
  • MiniMax M2 style outputs: --dyn-tool-call-parser minimax_m2 --dyn-reasoning-parser minimax_m2
  • MiniMax M3 style outputs: --dyn-tool-call-parser minimax_m3 --dyn-reasoning-parser minimax_m3

minimax_append_think is deprecated for MiniMax M2 tool-calling deployments. Use --dyn-reasoning-parser minimax_m2 with --dyn-tool-call-parser minimax_m2 so Dynamo can separate reasoning and pass MiniMax XML tool calls to the tool parser.

Reasoning parsing happens before tool call parsing. See Tool Call Parsing (Dynamo) for supported --dyn-tool-call-parser values.

2

Start the Frontend

Start the Dynamo frontend in another terminal:

$python -m dynamo.frontend
3

Wait for Readiness

Wait for the frontend health endpoint to return a successful response:

$curl --fail http://localhost:8000/health
4

Send a Reasoning Request

Send an OpenAI-compatible chat completion request:

$curl -s http://localhost:8000/v1/chat/completions \
> -H 'Content-Type: application/json' \
> -d '{
> "model": "Qwen/Qwen3.5-4B",
> "messages": [
> {
> "role": "user",
> "content": "If a train leaves at 3pm going 60 mph and another leaves at 4pm going 80 mph, when does the second catch up?"
> }
> ]
> }'

Dynamo places the chain of thought in reasoning_content and the user-facing answer in content.

1{
2 "choices": [
3 {
4 "index": 0,
5 "message": {
6 "role": "assistant",
7 "reasoning_content": "The first train has a 1-hour head start at 60 mph, so it is 60 miles ahead at 4pm. The second train closes the gap at 80 - 60 = 20 mph. 60 / 20 = 3 hours after 4pm.",
8 "content": "The second train catches up at 7pm."
9 },
10 "finish_reason": "stop"
11 }
12 ]
13}

Supported Reasoning Parsers

Choose a model family, then expand the matching model option to see its parser name and configuration details.

The Upstream name column shows where the vLLM or SGLang parser name differs from Dynamo’s. This is relevant for engine fallback and when configuring the native structured-output reasoning gate. A blank upstream column means the same name works everywhere. Dynamo-only means no upstream parser exists for this format.

Parsers marked Force-reasoning: Yes emit reasoning content from token one without requiring an explicit opening tag such as <think>. All others require the opening tag in the model output.

Parser: kimi_k25

Upstream name: Dynamo-only

Force-reasoning: Yes

Notes: <think>...</think> with force-reasoning

Parser: kimi

Upstream name: Dynamo-only

Force-reasoning: No

Notes: ◁think▷...◁/think▷

Kimi K2.7 may ignore chat_template_kwargs.thinking=false and continue to generate reasoning. Dynamo can separate emitted reasoning when a compatible parser is configured, but it cannot force the model to disable reasoning. Treat the request flag as best-effort for Kimi K2.7.

Parser: minimax_m2

Upstream name: vLLM: minimax_m2

Force-reasoning: Yes

Notes: <think>...</think> with force-reasoning

Parser: minimax_m3

Upstream name: vLLM: minimax_m3

Force-reasoning: No

Notes: <mm:think>...</mm:think>; recovers a prompt-prefilled opener

Parser: minimax_append_think Deprecated

Upstream name: Dynamo-only

Force-reasoning: No

Notes: Legacy pass-through with an implicit <think> opener. Use minimax_m2 for MiniMax M2 tool-calling deployments.

Parser: deepseek_v4

Upstream name: vLLM: deepseek_v4; SGLang: deepseek-v4

Force-reasoning: No

Notes: <think>...</think>. Aliases: deepseek-v4, deepseekv4

Parser: deepseek_r1

Upstream name: Same name across Dynamo, vLLM, and SGLang

Force-reasoning: Yes

Notes: Pass explicitly for V3.1/V3.2 (no alias)

Parser: qwen3

Upstream name: Same name across Dynamo, vLLM, and SGLang

Force-reasoning: No

Notes: <think>...</think>

Parser: glm45

Upstream name: Dynamo-only

Force-reasoning: No

Notes: Alias for nemotron_deci. <think>...</think>

Parser: nemotron3

Upstream name: vLLM: nemotron_v3

Force-reasoning: Yes

Notes: Alias for deepseek_r1. Also accepts nemotron_v3

Parser: nemotron_deci

Upstream name: Dynamo-only

Force-reasoning: No

Notes: <think>...</think>

Parser: nemotron_nano

Upstream name: Dynamo-only

Force-reasoning: Yes

Notes: Alias for deepseek_r1

Parser: gemma4

Upstream name: vLLM: gemma4

Force-reasoning: No

Notes: <\|channel>thought\n...<channel\|> with thought\n role label stripped. Aliases: gemma-4

Parser: gpt_oss

Upstream name: Dynamo-only

Force-reasoning: No

Notes: Harmony channel reasoning format

Parser: mistral

Upstream name: Same name across Dynamo, vLLM, and SGLang

Force-reasoning: Yes

Notes: [THINK]...[/THINK]

Parser: granite

Upstream name: Same name across Dynamo, vLLM, and SGLang

Force-reasoning: No

Notes: Here's my thought process: / Here's my response:

Parser: step3

Upstream name: Dynamo-only

Force-reasoning: Yes

Notes: <think>...</think>

Parser: basic

Upstream name: Dynamo-only

Force-reasoning: No

Notes: Plain <think>...</think>