Skip to content

Commit 2b9ce72

Browse files
authored
also check for reasoning before raising error (#918)
1 parent e35f40a commit 2b9ce72

1 file changed

Lines changed: 24 additions & 15 deletions

File tree

verifiers/clients/openai_chat_completions_client.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
123136
OpenAIChatMessage: TypeAlias = ChatCompletionMessageParam
124137
OpenAIChatMessages: TypeAlias = list[OpenAIChatMessage]
125138
OpenAIChatResponse: 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

Comments
 (0)