@@ -121,48 +121,65 @@ def _process_query_with_cot(self, query: str, analysis: QueryAnalysis) -> Dict[s
121121 repo_context = self .vector_store .query_repo_collection (query )
122122 initial_context = pdf_context + repo_context
123123
124- # Step 1: Planning
125- logger .info ("Step 1: Planning" )
126- plan = self .agents ["planner" ].plan (query , initial_context )
127- logger .info (f"Generated plan:\n { plan } " )
128-
129- # Step 2: Research each step (if researcher is available)
130- logger .info ("Step 2: Research" )
131- research_results = []
132- if self .agents ["researcher" ] is not None and initial_context :
133- for step in plan .split ("\n " ):
134- if not step .strip ():
135- continue
136- step_research = self .agents ["researcher" ].research (query , step )
137- research_results .append ({"step" : step , "findings" : step_research })
138- logger .info (f"Research for step: { step } \n Findings: { step_research } " )
139- else :
140- # If no researcher or no context, use the steps directly
141- research_results = [{"step" : step , "findings" : []} for step in plan .split ("\n " ) if step .strip ()]
142- logger .info ("No research performed (no researcher agent or no context available)" )
143-
144- # Step 3: Reasoning about each step
145- logger .info ("Step 3: Reasoning" )
146- reasoning_steps = []
147- for result in research_results :
148- step_reasoning = self .agents ["reasoner" ].reason (
149- query ,
150- result ["step" ],
151- result ["findings" ] if result ["findings" ] else [{"content" : "Using general knowledge" , "metadata" : {"source" : "General Knowledge" }}]
152- )
153- reasoning_steps .append (step_reasoning )
154- logger .info (f"Reasoning for step: { result ['step' ]} \n { step_reasoning } " )
155-
156- # Step 4: Synthesize final answer
157- logger .info ("Step 4: Synthesis" )
158- final_answer = self .agents ["synthesizer" ].synthesize (query , reasoning_steps )
159- logger .info (f"Final synthesized answer:\n { final_answer } " )
160-
161- return {
162- "answer" : final_answer ,
163- "context" : initial_context ,
164- "reasoning_steps" : reasoning_steps
165- }
124+ try :
125+ # Step 1: Planning
126+ logger .info ("Step 1: Planning" )
127+ if not self .agents or "planner" not in self .agents :
128+ logger .warning ("No planner agent available, using direct response" )
129+ return self ._generate_general_response (query )
130+
131+ plan = self .agents ["planner" ].plan (query , initial_context )
132+ logger .info (f"Generated plan:\n { plan } " )
133+
134+ # Step 2: Research each step (if researcher is available)
135+ logger .info ("Step 2: Research" )
136+ research_results = []
137+ if self .agents .get ("researcher" ) is not None and initial_context :
138+ for step in plan .split ("\n " ):
139+ if not step .strip ():
140+ continue
141+ step_research = self .agents ["researcher" ].research (query , step )
142+ research_results .append ({"step" : step , "findings" : step_research })
143+ logger .info (f"Research for step: { step } \n Findings: { step_research } " )
144+ else :
145+ # If no researcher or no context, use the steps directly
146+ research_results = [{"step" : step , "findings" : []} for step in plan .split ("\n " ) if step .strip ()]
147+ logger .info ("No research performed (no researcher agent or no context available)" )
148+
149+ # Step 3: Reasoning about each step
150+ logger .info ("Step 3: Reasoning" )
151+ if not self .agents .get ("reasoner" ):
152+ logger .warning ("No reasoner agent available, using direct response" )
153+ return self ._generate_general_response (query )
154+
155+ reasoning_steps = []
156+ for result in research_results :
157+ step_reasoning = self .agents ["reasoner" ].reason (
158+ query ,
159+ result ["step" ],
160+ result ["findings" ] if result ["findings" ] else [{"content" : "Using general knowledge" , "metadata" : {"source" : "General Knowledge" }}]
161+ )
162+ reasoning_steps .append (step_reasoning )
163+ logger .info (f"Reasoning for step: { result ['step' ]} \n { step_reasoning } " )
164+
165+ # Step 4: Synthesize final answer
166+ logger .info ("Step 4: Synthesis" )
167+ if not self .agents .get ("synthesizer" ):
168+ logger .warning ("No synthesizer agent available, using direct response" )
169+ return self ._generate_general_response (query )
170+
171+ final_answer = self .agents ["synthesizer" ].synthesize (query , reasoning_steps )
172+ logger .info (f"Final synthesized answer:\n { final_answer } " )
173+
174+ return {
175+ "answer" : final_answer ,
176+ "context" : initial_context ,
177+ "reasoning_steps" : reasoning_steps
178+ }
179+ except Exception as e :
180+ logger .error (f"Error in CoT processing: { str (e )} " )
181+ logger .info ("Falling back to general response" )
182+ return self ._generate_general_response (query )
166183
167184 def _process_query_standard (self , query : str , analysis : QueryAnalysis ) -> Dict [str , Any ]:
168185 """Process query using standard approach without Chain of Thought"""
0 commit comments