feat: add reasoning and reasoning_content fields to OpenAI message types

Add support for reasoning fields in OpenAI-compatible chat completion
messages to enable compatibility with vLLM reasoning parsers.

Changes:
- Add `reasoning_content` and `reasoning` fields to OpenAIAssistantMessageParam
- Add `reasoning` field to OpenAIChoiceDelta (reasoning_content already existed)

Both field names are supported for maximum compatibility:
- `reasoning_content`: Used by vLLM ≤ v0.8.4
- `reasoning`: New field name in vLLM ≥ v0.9.x

vLLM documentation recommends migrating to the shorter `reasoning` field
name, but maintains backward compatibility with `reasoning_content`.

These fields allow reasoning models to return their chain-of-thought
process alongside the final answer, which is crucial for transparency
and debugging with reasoning models.

References:
- vLLM Reasoning Outputs: https://docs.vllm.ai/en/stable/features/reasoning_outputs/
- vLLM Issue #12468: https://github.com/vllm-project/vllm/issues/12468

Signed-off-by: Charlie Doern <cdoern@redhat.com>
This commit is contained in:
Charlie Doern 2025-11-26 12:04:56 -05:00
parent 618c03405c
commit b1851dc9ef
6 changed files with 162 additions and 1 deletions

View file

@ -448,12 +448,16 @@ class OpenAIAssistantMessageParam(BaseModel):
:param content: The content of the model's response
:param name: (Optional) The name of the assistant message participant.
:param tool_calls: List of tool calls. Each tool call is an OpenAIChatCompletionToolCall object.
:param reasoning_content: (Optional) The reasoning content from the model (for vLLM v0.8.4)
:param reasoning: (Optional) The reasoning content from the model (for vLLM v0.9.x)
"""
role: Literal["assistant"] = "assistant"
content: OpenAIChatCompletionTextOnlyMessageContent | None = None
name: str | None = None
tool_calls: list[OpenAIChatCompletionToolCall] | None = None
reasoning_content: str | None = None
reasoning: str | None = None
@json_schema_type
@ -605,7 +609,8 @@ class OpenAIChoiceDelta(BaseModel):
:param refusal: (Optional) The refusal of the delta
:param role: (Optional) The role of the delta
:param tool_calls: (Optional) The tool calls of the delta
:param reasoning_content: (Optional) The reasoning content from the model (non-standard, for o1/o3 models)
:param reasoning_content: (Optional) The reasoning content from the model (for vLLM v0.8.4)
:param reasoning: (Optional) The reasoning content from the model (for vLLM v0.9.x)
"""
content: str | None = None
@ -613,6 +618,7 @@ class OpenAIChoiceDelta(BaseModel):
role: str | None = None
tool_calls: list[OpenAIChatCompletionToolCall] | None = None
reasoning_content: str | None = None
reasoning: str | None = None
@json_schema_type