sgl-project/sglang · error · DS32EncodingError

Invalid message for role `{role}`: {msg}

Error message

Invalid message for role `{role}`: {msg}

What it means

In the deepseek-v3.2 prompt encoding, a message with role 'developer' must have non-empty content. render_message raises DS32EncodingError when a developer message has empty/missing content (optionally after tools/response_format are appended).

Source

Thrown at python/sglang/srt/entrypoints/openai/encoding_dsv32.py:198

    if tools:
        tools = tools_from_openai_format(tools)
    if tool_calls:
        tool_calls = tool_calls_from_openai_format(tool_calls)

    if role == "system":
        prompt += system_msg_template.format(content=content or "")
        if tools:
            prompt += "\n\n" + render_tools(tools)

        if response_format:
            prompt += "\n\n" + response_format_template.format(
                schema=to_json(response_format)
            )

    elif role == "developer":
        if not content:
            raise DS32EncodingError(f"Invalid message for role `{role}`: {msg}")
        content_developer = ""
        if tools:
            content_developer += "\n\n" + render_tools(tools)

        if response_format:
            content_developer += "\n\n" + response_format_template.format(
                schema=to_json(response_format)
            )

        content_developer += "\n\n# The user's message is: {}".format(content)

        prompt += user_msg_template.format(content=content_developer)
        if index == last_user_idx and thinking_mode == "thinking":
            prompt += thinking_start_token
        else:
            prompt += thinking_end_token

    elif role == "user":

View on GitHub (pinned to 0132848349)

Solutions

  1. Give the developer message non-empty content text.
  2. If the message is intentionally empty, drop it from the messages list before sending.
  3. Pass tools or response_format alongside if you expected them to fill the message.

Example fix

# before
{"role":"developer","content":""}
# after
{"role":"developer","content":"You are a helpful assistant."}
Defensive patterns

Strategy: validation

Validate before calling

for m in messages:
    if m['role']=='developer' and not m.get('content'):
        raise ValueError('developer message needs content')

Try / catch

try:
    encode_messages(msgs)
except DS32EncodingError as e:
    # drop or fill empty developer messages, retry
    ...

Prevention

When it happens

Trigger: A messages array containing {'role':'developer','content':''} or content=None (with no tools/response_format to pad it), passed to the DSv32 serving/chat endpoint.

Common situations: Clients sending system-style developer prompts with empty strings; pipelines that strip content but keep the role; migrating system->developer roles after OpenAI API changes.

Related errors


AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28). Data as JSON: /api/errors/437dde7c15bf84c9. Report an issue: GitHub.