@@ -25,18 +25,26 @@ def mixture_of_agents(system_prompt: str, initial_query: str, client, model: str
2525 }
2626
2727 response = client .chat .completions .create (** provider_request )
28-
28+
2929 # Convert response to dict for logging
3030 response_dict = response .model_dump () if hasattr (response , 'model_dump' ) else response
31-
31+
3232 # Log provider call if conversation logging is enabled
3333 if request_id :
3434 conversation_logger .log_provider_call (request_id , provider_request , response_dict )
35-
36- completions = [choice .message .content for choice in response .choices ]
35+
36+ # Check for valid response with None-checking
37+ if response is None or not response .choices :
38+ raise Exception ("Response is None or has no choices" )
39+
40+ completions = [choice .message .content for choice in response .choices if choice .message .content is not None ]
3741 moa_completion_tokens += response .usage .completion_tokens
3842 logger .info (f"Generated { len (completions )} initial completions using n parameter. Tokens used: { response .usage .completion_tokens } " )
39-
43+
44+ # Check if any valid completions were generated
45+ if not completions :
46+ raise Exception ("No valid completions generated (all were None)" )
47+
4048 except Exception as e :
4149 logger .warning (f"n parameter not supported by provider: { str (e )} " )
4250 logger .info ("Falling back to generating 3 completions one by one" )
@@ -56,14 +64,22 @@ def mixture_of_agents(system_prompt: str, initial_query: str, client, model: str
5664 }
5765
5866 response = client .chat .completions .create (** provider_request )
59-
67+
6068 # Convert response to dict for logging
6169 response_dict = response .model_dump () if hasattr (response , 'model_dump' ) else response
62-
70+
6371 # Log provider call if conversation logging is enabled
6472 if request_id :
6573 conversation_logger .log_provider_call (request_id , provider_request , response_dict )
66-
74+
75+ # Check for valid response with None-checking
76+ if (response is None or
77+ not response .choices or
78+ response .choices [0 ].message .content is None or
79+ response .choices [0 ].finish_reason == "length" ):
80+ logger .warning (f"Completion { i + 1 } /3 truncated or empty, skipping" )
81+ continue
82+
6783 completions .append (response .choices [0 ].message .content )
6884 moa_completion_tokens += response .usage .completion_tokens
6985 logger .debug (f"Generated completion { i + 1 } /3" )
@@ -77,7 +93,12 @@ def mixture_of_agents(system_prompt: str, initial_query: str, client, model: str
7793 return "Error: Could not generate any completions" , 0
7894
7995 logger .info (f"Generated { len (completions )} completions using fallback method. Total tokens used: { moa_completion_tokens } " )
80-
96+
97+ # Double-check we have at least one completion
98+ if not completions :
99+ logger .error ("No completions available for processing" )
100+ return "Error: Could not generate any completions" , moa_completion_tokens
101+
81102 # Handle case where fewer than 3 completions were generated
82103 if len (completions ) < 3 :
83104 original_count = len (completions )
@@ -118,15 +139,24 @@ def mixture_of_agents(system_prompt: str, initial_query: str, client, model: str
118139 }
119140
120141 critique_response = client .chat .completions .create (** provider_request )
121-
142+
122143 # Convert response to dict for logging
123144 response_dict = critique_response .model_dump () if hasattr (critique_response , 'model_dump' ) else critique_response
124-
145+
125146 # Log provider call if conversation logging is enabled
126147 if request_id :
127148 conversation_logger .log_provider_call (request_id , provider_request , response_dict )
128-
129- critiques = critique_response .choices [0 ].message .content
149+
150+ # Check for valid response with None-checking
151+ if (critique_response is None or
152+ not critique_response .choices or
153+ critique_response .choices [0 ].message .content is None or
154+ critique_response .choices [0 ].finish_reason == "length" ):
155+ logger .warning ("Critique response truncated or empty, using generic critique" )
156+ critiques = "All candidates show reasonable approaches to the problem."
157+ else :
158+ critiques = critique_response .choices [0 ].message .content
159+
130160 moa_completion_tokens += critique_response .usage .completion_tokens
131161 logger .info (f"Generated critiques. Tokens used: { critique_response .usage .completion_tokens } " )
132162
@@ -165,16 +195,27 @@ def mixture_of_agents(system_prompt: str, initial_query: str, client, model: str
165195 }
166196
167197 final_response = client .chat .completions .create (** provider_request )
168-
198+
169199 # Convert response to dict for logging
170200 response_dict = final_response .model_dump () if hasattr (final_response , 'model_dump' ) else final_response
171-
201+
172202 # Log provider call if conversation logging is enabled
173203 if request_id :
174204 conversation_logger .log_provider_call (request_id , provider_request , response_dict )
175-
205+
176206 moa_completion_tokens += final_response .usage .completion_tokens
177207 logger .info (f"Generated final response. Tokens used: { final_response .usage .completion_tokens } " )
178-
208+
209+ # Check for valid response with None-checking
210+ if (final_response is None or
211+ not final_response .choices or
212+ final_response .choices [0 ].message .content is None or
213+ final_response .choices [0 ].finish_reason == "length" ):
214+ logger .error ("Final response truncated or empty. Consider increasing max_tokens." )
215+ # Return best completion if final response failed
216+ result = completions [0 ] if completions else "Error: Response was truncated due to token limit. Please increase max_tokens or max_completion_tokens."
217+ else :
218+ result = final_response .choices [0 ].message .content
219+
179220 logger .info (f"Total completion tokens used: { moa_completion_tokens } " )
180- return final_response . choices [ 0 ]. message . content , moa_completion_tokens
221+ return result , moa_completion_tokens
0 commit comments