@@ -120,6 +120,19 @@ def content_to_text(content: Any) -> str:
120120 "reasoning_details" , # OpenRouter, MiniMax
121121]
122122
123+
124+ def parse_reasoning_content (message : Any ) -> str | None :
125+ message_dict = message .model_dump ()
126+ if not isinstance (message_dict , dict ):
127+ return None
128+
129+ for field in DEFAULT_REASONING_FIELDS :
130+ value = message_dict .get (field )
131+ if isinstance (value , str ):
132+ return value
133+ return None
134+
135+
123136OpenAIChatMessage : TypeAlias = ChatCompletionMessageParam
124137OpenAIChatMessages : TypeAlias = list [OpenAIChatMessage ]
125138OpenAIChatResponse : TypeAlias = ChatCompletion
@@ -282,12 +295,13 @@ async def raise_from_native_response(self, response: OpenAIChatResponse) -> None
282295 raise InvalidModelResponseError (
283296 f"Model returned { len (response .choices )} choices, expected 1"
284297 )
285- if not (
286- response .choices [0 ].message .content
287- or response .choices [0 ].message .tool_calls
288- ):
298+ message = response .choices [0 ].message
299+ has_content = bool (content_to_text (getattr (message , "content" , None )))
300+ has_tool_calls = bool (getattr (message , "tool_calls" , None ))
301+ has_reasoning = bool (parse_reasoning_content (message ))
302+ if not (has_content or has_tool_calls or has_reasoning ):
289303 raise EmptyModelResponseError (
290- "Model returned no content and did not call any tools"
304+ "Model returned no content, reasoning, and did not call any tools"
291305 )
292306
293307 async def from_native_response (self , response : OpenAIChatResponse ) -> Response :
@@ -439,15 +453,10 @@ def parse_tokens(response: OpenAIChatResponse) -> ResponseTokens | None:
439453 completion_logprobs = completion_logprobs ,
440454 )
441455
442- def parse_reasoning_content (response : OpenAIChatResponse ) -> str | None :
443- message_dict = response .choices [0 ].message .model_dump ()
444- if not isinstance (message_dict , dict ):
445- return None
446- for field in DEFAULT_REASONING_FIELDS :
447- value = message_dict .get (field )
448- if isinstance (value , str ):
449- return value
450- return None
456+ def parse_reasoning_content_from_response (
457+ response : OpenAIChatResponse ,
458+ ) -> str | None :
459+ return parse_reasoning_content (response .choices [0 ].message )
451460
452461 response_id = getattr (response , "id" , "" )
453462 if not isinstance (response_id , str ):
@@ -466,7 +475,7 @@ def parse_reasoning_content(response: OpenAIChatResponse) -> str | None:
466475 usage = parse_usage (response ),
467476 message = ResponseMessage (
468477 content = response .choices [0 ].message .content ,
469- reasoning_content = parse_reasoning_content (response ),
478+ reasoning_content = parse_reasoning_content_from_response (response ),
470479 finish_reason = parse_finish_reason (response ),
471480 is_truncated = parse_is_truncated (response ),
472481 tokens = parse_tokens (response ),
0 commit comments