@@ -425,8 +425,21 @@ def _request_text(
425425 if timeout_seconds is not None :
426426 request ["timeout" ] = timeout_seconds
427427
428- response = self .client .responses .create (** request )
429- return getattr (response , "output_text" , "" ).strip ()
428+ try :
429+ response = self .client .responses .create (** request )
430+ text = getattr (response , "output_text" , "" ).strip ()
431+ if text :
432+ return text
433+ except Exception :
434+ # Many local OpenAI-compatible servers expose only chat/completions.
435+ pass
436+
437+ return self ._request_chat_text (
438+ instructions = instructions ,
439+ prompt = prompt ,
440+ max_output_tokens = max_output_tokens ,
441+ timeout_seconds = timeout_seconds ,
442+ )
430443
431444 def _is_openrouter (self ) -> bool :
432445 return bool (self .base_url and "openrouter.ai" in self .base_url .lower ())
@@ -465,6 +478,33 @@ def _request_openrouter_text(
465478
466479 return ""
467480
481+ def _request_chat_text (
482+ self ,
483+ * ,
484+ instructions : str ,
485+ prompt : str ,
486+ max_output_tokens : int ,
487+ timeout_seconds : float | None = None ,
488+ ) -> str :
489+ token_budget = max (96 , max_output_tokens )
490+ request : dict [str , object ] = {
491+ "model" : self .model ,
492+ "messages" : [
493+ {"role" : "system" , "content" : instructions },
494+ {"role" : "user" , "content" : prompt },
495+ ],
496+ "temperature" : 0 ,
497+ }
498+ request ["max_tokens" ] = token_budget
499+ if timeout_seconds is not None :
500+ request ["timeout" ] = timeout_seconds
501+
502+ completion = self .client .chat .completions .create (** request )
503+ choice = completion .choices [0 ] if completion .choices else None
504+ message = choice .message if choice else None
505+ content = (message .content or "" ).strip () if message else ""
506+ return content
507+
468508
469509class SolverChain :
470510 def __init__ (
0 commit comments