Skip to content

[Bug]: reasoning_effort on Responses API models always adds reasoning.summary, causing 400s for unverified orgs #16032

Description

@Chesars

Summary

When using reasoning_effort with models that have mode: "responses" in LiteLLM, the parameter is automatically converted to include
reasoning.summary. This causes 400 errors for OpenAI users with unverified organizations, since only reasoning.summary requires verification.

Current

In litellm/completion_extras/litellm_responses_transformation/transformation.py (lines 541-551):

def _map_reasoning_effort(self, reasoning_effort: str) -> Optional[Reasoning]:
    if reasoning_effort == "high":
        return Reasoning(effort="high", summary="detailed")  # ← Always adds summary
    elif reasoning_effort == "medium":
        return Reasoning(effort="medium", summary="auto")    # ← Always adds summary
    elif reasoning_effort == "low":
        return Reasoning(effort="low", summary="auto")        # ← Always adds summary
    elif reasoning_effort == "minimal":
        return Reasoning(effort="minimal", summary="auto")    # ← Always adds summary
    return None

OpenAI's official recommendations:

Error Message

  {
    "error": {
      "message": "Your organization must be verified to generate reasoning summaries.
                  Please go to: https://platform.openai.com/settings/organization/general
                  and click on Verify Organization.",
      "type": "invalid_request_error",
      "param": "reasoning.summary",
      "code": "unsupported_value"
    }
  }

Why This Matters

  1. reasoning.summary is optional - It's only for debugging/auditing the reasoning process, not required for model functionality
  2. Not all users are verified - Many individual developers don't have (or need) verified organizations
  3. reasoning_effort is useful alone - Users want to control reasoning computation without needing summaries
  4. No workaround exists - Users can't use reasoning_effort at all if their org isn't verified

Proposed Solutions

Option 1: Make summary parameter optional (Recommended)

Allow users to control whether summary is included:

  def _map_reasoning_effort(
      self,
      reasoning_effort: str,
      include_summary: bool = False  # ← New parameter, defaults to False
  ) -> Optional[Reasoning]:
      if reasoning_effort == "high":
          summary = "detailed" if include_summary else None
          return Reasoning(effort="high", summary=summary)
      elif reasoning_effort == "medium":
          summary = "auto" if include_summary else None
          return Reasoning(effort="medium", summary=summary)
      # ... etc

Usage:
Without summary (works for unverified orgs)

completion(
     model="gpt-5-codex",
     messages=[...],
     reasoning_effort="high"  # No summary added
 )

With summary (requires verified org)

completion(
     model="gpt-5-codex",
     messages=[...],
     reasoning_effort="high",
     include_reasoning_summary=True  # Explicitly opt-in
 )

Option 2: Add separate reasoning_summary parameter

  completion(
      model="gpt-5-codex",
      messages=[...],
      reasoning_effort="high",       
      reasoning_summary="detailed"    # Optional 
  )

Recommendation

Option 1 is because:

  • ✅ Backward compatible (defaults to False)
  • ✅ Explicit opt-in (follows best practices)
  • ✅ Clear API design

Related

Relevant log output

Are you a ML Ops Team?

No

What LiteLLM version are you on ?

v1.77.7

Twitter / LinkedIn details

No response

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions