Skip to content

Commit 05836c2

Browse files
committed
fix: Enhance error handling in RAG agents
- Add consistent error handling for missing agents in both RAG implementations - Add fallback to general response when agents are unavailable - Improve logging for agent availability and errors - Ensure graceful degradation in Chain of Thought processing
1 parent f1c4a33 commit 05836c2

File tree

2 files changed

+118
-84
lines changed

2 files changed

+118
-84
lines changed

agentic_rag/local_rag_agent.py

Lines changed: 59 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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}\nFindings: {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}\nFindings: {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"""

agentic_rag/rag_agent.py

Lines changed: 59 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -85,48 +85,65 @@ def _process_query_with_cot(self, query: str, analysis: QueryAnalysis) -> Dict[s
8585
repo_context = self.vector_store.query_repo_collection(query)
8686
initial_context = pdf_context + repo_context
8787

88-
# Step 1: Planning
89-
logger.info("Step 1: Planning")
90-
plan = self.agents["planner"].plan(query, initial_context)
91-
logger.info(f"Generated plan:\n{plan}")
92-
93-
# Step 2: Research each step (if researcher is available)
94-
logger.info("Step 2: Research")
95-
research_results = []
96-
if self.agents["researcher"] is not None and initial_context:
97-
for step in plan.split("\n"):
98-
if not step.strip():
99-
continue
100-
step_research = self.agents["researcher"].research(query, step)
101-
research_results.append({"step": step, "findings": step_research})
102-
logger.info(f"Research for step: {step}\nFindings: {step_research}")
103-
else:
104-
# If no researcher or no context, use the steps directly
105-
research_results = [{"step": step, "findings": []} for step in plan.split("\n") if step.strip()]
106-
logger.info("No research performed (no researcher agent or no context available)")
107-
108-
# Step 3: Reasoning about each step
109-
logger.info("Step 3: Reasoning")
110-
reasoning_steps = []
111-
for result in research_results:
112-
step_reasoning = self.agents["reasoner"].reason(
113-
query,
114-
result["step"],
115-
result["findings"] if result["findings"] else [{"content": "Using general knowledge", "metadata": {"source": "General Knowledge"}}]
116-
)
117-
reasoning_steps.append(step_reasoning)
118-
logger.info(f"Reasoning for step: {result['step']}\n{step_reasoning}")
119-
120-
# Step 4: Synthesize final answer
121-
logger.info("Step 4: Synthesis")
122-
final_answer = self.agents["synthesizer"].synthesize(query, reasoning_steps)
123-
logger.info(f"Final synthesized answer:\n{final_answer}")
124-
125-
return {
126-
"answer": final_answer,
127-
"context": initial_context,
128-
"reasoning_steps": reasoning_steps
129-
}
88+
try:
89+
# Step 1: Planning
90+
logger.info("Step 1: Planning")
91+
if not self.agents or "planner" not in self.agents:
92+
logger.warning("No planner agent available, using direct response")
93+
return self._generate_general_response(query)
94+
95+
plan = self.agents["planner"].plan(query, initial_context)
96+
logger.info(f"Generated plan:\n{plan}")
97+
98+
# Step 2: Research each step (if researcher is available)
99+
logger.info("Step 2: Research")
100+
research_results = []
101+
if self.agents.get("researcher") is not None and initial_context:
102+
for step in plan.split("\n"):
103+
if not step.strip():
104+
continue
105+
step_research = self.agents["researcher"].research(query, step)
106+
research_results.append({"step": step, "findings": step_research})
107+
logger.info(f"Research for step: {step}\nFindings: {step_research}")
108+
else:
109+
# If no researcher or no context, use the steps directly
110+
research_results = [{"step": step, "findings": []} for step in plan.split("\n") if step.strip()]
111+
logger.info("No research performed (no researcher agent or no context available)")
112+
113+
# Step 3: Reasoning about each step
114+
logger.info("Step 3: Reasoning")
115+
if not self.agents.get("reasoner"):
116+
logger.warning("No reasoner agent available, using direct response")
117+
return self._generate_general_response(query)
118+
119+
reasoning_steps = []
120+
for result in research_results:
121+
step_reasoning = self.agents["reasoner"].reason(
122+
query,
123+
result["step"],
124+
result["findings"] if result["findings"] else [{"content": "Using general knowledge", "metadata": {"source": "General Knowledge"}}]
125+
)
126+
reasoning_steps.append(step_reasoning)
127+
logger.info(f"Reasoning for step: {result['step']}\n{step_reasoning}")
128+
129+
# Step 4: Synthesize final answer
130+
logger.info("Step 4: Synthesis")
131+
if not self.agents.get("synthesizer"):
132+
logger.warning("No synthesizer agent available, using direct response")
133+
return self._generate_general_response(query)
134+
135+
final_answer = self.agents["synthesizer"].synthesize(query, reasoning_steps)
136+
logger.info(f"Final synthesized answer:\n{final_answer}")
137+
138+
return {
139+
"answer": final_answer,
140+
"context": initial_context,
141+
"reasoning_steps": reasoning_steps
142+
}
143+
except Exception as e:
144+
logger.error(f"Error in CoT processing: {str(e)}")
145+
logger.info("Falling back to general response")
146+
return self._generate_general_response(query)
130147

131148
def _process_query_standard(self, query: str, analysis: QueryAnalysis) -> Dict[str, Any]:
132149
"""Process query using standard approach without Chain of Thought"""

0 commit comments

Comments
 (0)