@@ -162,6 +162,7 @@ def create_summary_agent_prompt(agent: ConversableAgent, messages: list[dict[str
162162 """Create the summary agent prompt with context information."""
163163 update_ingested_documents ()
164164
165+ # Safe type casting with defaults
165166 query_results = cast (list [dict [str , Any ]], agent .context_variables .get ("QueryResults" , []))
166167 documents_ingested = cast (list [str ], agent .context_variables .get ("DocumentsIngested" , []))
167168 documents_to_ingest = cast (list [Ingest ], agent .context_variables .get ("DocumentsToIngest" , []))
@@ -209,86 +210,94 @@ def generate_inner_group_chat_reply(
209210 config : Any = None ,
210211 ) -> tuple [bool , str | dict [str , Any ] | None ]:
211212 """Reply function that generates the inner group chat reply for the DocAgent."""
212- # Initialize or reuse context variables
213- if hasattr (self , "_group_chat_context_variables" ) and self ._group_chat_context_variables is not None :
214- context_variables = self ._group_chat_context_variables
215- # Reset pending tasks for new run
216- context_variables ["DocumentsToIngest" ] = []
217- else :
218- context_variables = ContextVariables (
219- data = {
220- "CompletedTaskCount" : 0 ,
221- "DocumentsToIngest" : [],
222- "DocumentsIngested" : self .documents_ingested ,
223- "QueriesToRun" : [],
224- "QueryResults" : [],
225- }
213+ try :
214+ # Initialize or reuse context variables
215+ if hasattr (self , "_group_chat_context_variables" ) and self ._group_chat_context_variables is not None :
216+ context_variables = self ._group_chat_context_variables
217+ # Reset pending tasks for new run
218+ context_variables ["DocumentsToIngest" ] = []
219+ else :
220+ context_variables = ContextVariables (
221+ data = {
222+ "CompletedTaskCount" : 0 ,
223+ "DocumentsToIngest" : [],
224+ "DocumentsIngested" : self .documents_ingested ,
225+ "QueriesToRun" : [],
226+ "QueryResults" : [],
227+ }
228+ )
229+ self ._group_chat_context_variables = context_variables
230+
231+ if messages and len (messages ) > 0 :
232+ last_message = messages [- 1 ]
233+ if (
234+ isinstance (last_message , dict )
235+ and last_message .get ("name" ) == "DocumentTriageAgent"
236+ and "content" in last_message
237+ and isinstance (last_message ["content" ], str )
238+ ):
239+ try :
240+ import json
241+
242+ document_task_data = json .loads (last_message ["content" ])
243+
244+ # Extract ingestions and queries
245+ ingestions = [Ingest (** ing ) for ing in document_task_data .get ("ingestions" , [])]
246+ queries = [Query (** q ) for q in document_task_data .get ("queries" , [])]
247+
248+ # Update context variables with new tasks
249+ existing_ingestions = context_variables .get ("DocumentsToIngest" , []) or []
250+ existing_queries = context_variables .get ("QueriesToRun" , []) or []
251+ documents_ingested = context_variables .get ("DocumentsIngested" , []) or []
252+
253+ # Deduplicate and add new ingestions
254+ for ingestion in ingestions :
255+ if (
256+ ingestion .path_or_url not in [ing .path_or_url for ing in existing_ingestions ]
257+ and ingestion .path_or_url not in documents_ingested
258+ ):
259+ existing_ingestions .append (ingestion )
260+
261+ # Deduplicate and add new queries
262+ for query in queries :
263+ if query .query not in [q .query for q in existing_queries ]:
264+ existing_queries .append (query )
265+
266+ context_variables ["DocumentsToIngest" ] = existing_ingestions
267+ context_variables ["QueriesToRun" ] = existing_queries
268+ context_variables ["TaskInitiated" ] = True
269+
270+ logger .info (f"Processed triage output: { len (ingestions )} ingestions, { len (queries )} queries" )
271+
272+ except json .JSONDecodeError as e :
273+ logger .warning (f"Failed to parse triage output JSON: { e } " )
274+ except Exception as e :
275+ logger .warning (f"Failed to process triage output: { e } " )
276+
277+ group_chat_agents = [
278+ self ._triage_agent ,
279+ self ._task_manager_agent ,
280+ self ._summary_agent ,
281+ ]
282+
283+ agent_pattern = DefaultPattern (
284+ initial_agent = self ._triage_agent ,
285+ agents = group_chat_agents ,
286+ context_variables = context_variables ,
287+ group_after_work = TerminateTarget (),
226288 )
227- self ._group_chat_context_variables = context_variables
228-
229- if messages and len (messages ) > 0 :
230- last_message = messages [- 1 ]
231- if (
232- isinstance (last_message , dict )
233- and last_message .get ("name" ) == "DocumentTriageAgent"
234- and "content" in last_message
235- ):
236- try :
237- import json
238-
239- document_task_data = json .loads (last_message ["content" ])
240-
241- # Extract ingestions and queries
242- ingestions = [Ingest (** ing ) for ing in document_task_data .get ("ingestions" , [])]
243- queries = [Query (** q ) for q in document_task_data .get ("queries" , [])]
244-
245- # Update context variables with new tasks
246- existing_ingestions = context_variables .get ("DocumentsToIngest" , []) or []
247- existing_queries = context_variables .get ("QueriesToRun" , []) or []
248- documents_ingested = context_variables .get ("DocumentsIngested" , []) or []
249-
250- # Deduplicate and add new ingestions
251- for ingestion in ingestions :
252- if (
253- ingestion .path_or_url not in [ing .path_or_url for ing in existing_ingestions ]
254- and ingestion .path_or_url not in documents_ingested
255- ):
256- existing_ingestions .append (ingestion )
257-
258- # Deduplicate and add new queries
259- for query in queries :
260- if query .query not in [q .query for q in existing_queries ]:
261- existing_queries .append (query )
262-
263- context_variables ["DocumentsToIngest" ] = existing_ingestions
264- context_variables ["QueriesToRun" ] = existing_queries
265- context_variables ["TaskInitiated" ] = True
266-
267- logger .info (f"Processed triage output: { len (ingestions )} ingestions, { len (queries )} queries" )
268-
269- except Exception as e :
270- logger .warning (f"Failed to process triage output: { e } " )
271-
272- group_chat_agents = [
273- self ._triage_agent ,
274- self ._task_manager_agent ,
275- self ._summary_agent ,
276- ]
277-
278- agent_pattern = DefaultPattern (
279- initial_agent = self ._triage_agent ,
280- agents = group_chat_agents ,
281- context_variables = context_variables ,
282- group_after_work = TerminateTarget (),
283- )
284289
285- chat_result , context_variables , last_speaker = initiate_group_chat (
286- pattern = agent_pattern ,
287- messages = self ._get_document_input_message (messages ),
288- )
290+ chat_result , context_variables , last_speaker = initiate_group_chat (
291+ pattern = agent_pattern ,
292+ messages = self ._get_document_input_message (messages ),
293+ )
294+
295+ # Always return the final result since we only have summary termination
296+ return True , chat_result .summary
289297
290- # Always return the final result since we only have summary termination
291- return True , chat_result .summary
298+ except Exception as e :
299+ logger .error (f"Critical error in DocAgent group chat: { e } " )
300+ return True , f"Error processing request: { str (e )} "
292301
293302 def _get_document_input_message (self , messages : list [dict [str , Any ]] | None ) -> str :
294303 """Gets and validates the input message(s) for the document agent."""
0 commit comments