diff --git a/litellm/types/llms/openai.py b/litellm/types/llms/openai.py index 944a20049da..15be19b9802 100644 --- a/litellm/types/llms/openai.py +++ b/litellm/types/llms/openai.py @@ -1179,6 +1179,24 @@ class ResponseAPIUsage(BaseLiteLLMOpenAIResponseObject): model_config = {"extra": "allow"} +# Optional typing for reasoning fields; API may add new values. Prefer Dict[str, Any] +# for response parsing so new effort/summary values and new fields are accepted. +ResponsesAPIReasoningEffort = str # known: "none", "minimal", "low", "medium", "high", "xhigh" + + +class ResponsesAPIReasoning(BaseLiteLLMOpenAIResponseObject): + """ + Reasoning info on a Responses API response. All fields are optional str to accept + current API values and any new values OpenAI adds. Extra fields are allowed. + """ + + model_config = ConfigDict(extra="allow") + + effort: Optional[str] = None + generate_summary: Optional[str] = None + summary: Optional[str] = None + + ResponsesAPIStatus = Literal[ "completed", "failed", "in_progress", "cancelled", "queued", "incomplete" ] @@ -1217,7 +1235,7 @@ class ResponsesAPIResponse(BaseLiteLLMOpenAIResponseObject): top_p: Optional[float] = None max_output_tokens: Optional[int] = None previous_response_id: Optional[str] = None - reasoning: Optional[Reasoning] = None + reasoning: Optional[Dict[str, Any]] = None status: Optional[str] = None text: Optional[Union["ResponseText", Dict[str, Any]]] = None truncation: Optional[Literal["auto", "disabled"]] = None @@ -1227,6 +1245,18 @@ class ResponsesAPIResponse(BaseLiteLLMOpenAIResponseObject): # Define private attributes using PrivateAttr _hidden_params: dict = PrivateAttr(default_factory=dict) + @field_validator("reasoning", mode="before") + @classmethod + def validate_reasoning_to_dict(cls, value: Any) -> Optional[Dict[str, Any]]: + """Accept API reasoning dict (including effort 'none'/'xhigh'); always store as dict.""" + if value is None: + return None + if isinstance(value, dict): + return value + if hasattr(value, "model_dump"): + return value.model_dump() + return value + @field_validator("usage", mode="before") @classmethod def validate_usage(cls, value): @@ -1626,12 +1656,12 @@ class ImageGenerationPartialImageEvent(BaseLiteLLMOpenAIResponseObject): class ErrorEventError(BaseLiteLLMOpenAIResponseObject): - """Nested error object within ErrorEvent""" + """Nested error object within ErrorEvent.""" type: str # e.g., 'invalid_request_error' code: str # e.g., 'context_length_exceeded' message: str - param: Optional[str] + param: Optional[str] = None class ErrorEvent(BaseLiteLLMOpenAIResponseObject):