Skip to content

[Docs] Streaming example diff logic for reasoning_details doesn't match actual API behavior #95

@wakaka6

Description

@wakaka6

Problem

In the OpenAI-compatible API streaming example, reasoning_details is processed with a diff approach:

reasoning_text = detail["text"]
new_reasoning = reasoning_text[len(reasoning_buffer):]
reasoning_buffer = reasoning_text

This assumes reasoning_details[].text is cumulative (full text so far), requiring a diff against the buffer to extract the new portion.

Actual Behavior

Testing against api.minimaxi.com/v1 with MiniMax-M2.7, reasoning_details[].text returns incremental text, not cumulative:

chunk1: text="The user"
chunk2: text=" is asking how I am, which is a simple greeting."

chunk2 does not contain chunk1's "The user" — it's already just the new part.

Bug

Applying diff logic to incremental text truncates the beginning of each chunk:

chunk1: buf="", text="The user", text[0:] = "The user"       ✅ happens to work
chunk2: buf="The user"(len=8), text=" is asking...", text[8:] = "king..."  ❌ truncated

Reproduction

from openai import OpenAI

client = OpenAI(
    api_key="sk-xxx",
    base_url="https://api.minimaxi.com/v1",
)

stream = client.chat.completions.create(
    model="MiniMax-M2.7",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Hi, how are you?"},
    ],
    extra_body={"reasoning_split": True},
    stream=True,
)

for chunk in stream:
    if (
        hasattr(chunk.choices[0].delta, "reasoning_details")
        and chunk.choices[0].delta.reasoning_details
    ):
        for detail in chunk.choices[0].delta.reasoning_details:
            if "text" in detail:
                text = detail["text"]
                print(f"len={len(text)} text={repr(text)}")

Suggested Fix

If reasoning_details[].text is incremental, the example should simply concatenate:

for detail in chunk.choices[0].delta.reasoning_details:
    if "text" in detail:
        text = detail["text"]
        print(text, end="", flush=True)
        reasoning_buffer += text

Also, if api.minimax.io (international) and api.minimaxi.com (China mainland) behave differently for this field, it would be helpful to note that in the docs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions