openvinotoolkit / openvinotoolkit/model_server

OpenAI-compatible Chat Completions: top-level reasoning_effort ignored, only chat_template_kwargs controls reasoning

Open
#4,495 8 comments 0 reactions 1 assignee View on GitHub

@mzegla is already working on this.

Since Sep 3, 2026.

bug
Dominant language
C++
Stars
931
Forks
277
Avg merge
2d 13h
Merged PRs (30d)
68

Description

Summary

When using the OpenAI-compatible /v3/chat/completions endpoint with Qwen3 reasoning models, OVMS ignores the standard top-level reasoning_effort field and only honors reasoning controls passed through chat_template_kwargs.

This creates interoperability issues with OpenAI-compatible clients that correctly send reasoning_effort but have no knowledge of OVMS-specific chat-template parameters.

Additionally, with --reasoning_parser qwen3, reasoning still appears inside message.content instead of being returned separately as reasoning_content.

I'm not sure whether both behaviors are intentional, so this issue is primarily a request for clarification.


Environment

  • OVMS 2026.2.1 (Windows binary)
  • REST API (/v3/chat/completions)
  • Windows 11
  • GPU target
  • Model: OpenVINO/Qwen3-8B-int4-ov
  • --tool_parser hermes3
  • --reasoning_parser qwen3

What I verified

Using direct curl requests against OVMS:

Request Result
reasoning_effort: "none" ❌ ignored
reasoning_effort: "high" ❌ ignored
chat_template_kwargs.enable_thinking=false ✅ works
chat_template_kwargs.enable_thinking=true ✅ works
chat_template_kwargs.reasoning_effort="low" ✅ works

This confirms that reasoning is currently controlled exclusively through:

{
  "chat_template_kwargs": {
    "enable_thinking": true,
    "reasoning_effort": "low"
  }
}

while the OpenAI-style top-level

{
  "reasoning_effort": "low"
}

appears to have no effect.


Interoperability concern

OVMS advertises an OpenAI-compatible Chat Completions API.

Many OpenAI-compatible clients expose reasoning through the standard reasoning_effort field.

Some OpenAI-compatible inference servers translate this internally into the chat-template parameters required by the underlying model.

OVMS currently appears to require every client to explicitly know about chat_template_kwargs, reducing interoperability despite exposing an OpenAI-compatible endpoint.

If this behavior is intentional, documenting it explicitly would help client implementations avoid silent incompatibilities.


Questions

1. Is ignoring top-level reasoning_effort intentional?

If yes, I'll report this as an OVMS-specific capability that client implementations need to support.

If no, would OVMS consider automatically mapping

{
  "reasoning_effort": "low"
}

into

{
  "chat_template_kwargs": {
    "enable_thinking": true,
    "reasoning_effort": "low"
  }
}

for reasoning-capable models?

This would improve interoperability with existing OpenAI-compatible clients while remaining backward compatible.


2. What is the intended behavior of --reasoning_parser qwen3?

Even with the parser enabled, reasoning remains inside

choices[0].message.content

instead of being emitted separately as

choices[0].message.reasoning_content

Is this expected for Qwen3 models?

Or does it indicate a parser/template mismatch?


Why this matters

This is not specific to one client implementation.

Any OpenAI-compatible client that only knows the standard reasoning_effort field currently cannot dynamically control thinking on OVMS.

If appropriate, a server-side mapping would improve interoperability without requiring every client to implement OVMS-specific request rewriting.


Related

Client-side discussion:

https://github.com/NousResearch/hermes-agent/issues/99820

That issue discusses how Hermes Agent could work around the current OVMS behavior.

This issue asks whether the current OVMS behavior is intentional and whether improving compatibility at the server level would be desirable.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.