kamaleswar Mohanta commited on
Commit
6151dbe
·
1 Parent(s): bef665b

Refactor feedback processing and state management in SdlcNode class

Browse files
src/langgraphagenticai/nodes/__pycache__/sdlc_node.cpython-312.pyc CHANGED
Binary files a/src/langgraphagenticai/nodes/__pycache__/sdlc_node.cpython-312.pyc and b/src/langgraphagenticai/nodes/__pycache__/sdlc_node.cpython-312.pyc differ
 
src/langgraphagenticai/nodes/sdlc_node.py CHANGED
@@ -189,51 +189,30 @@ class SdlcNode:
189
  @log_entry_exit
190
  def process_feedback(self, state: State) -> dict:
191
  """
192
- Process user feedback passed via state and update state with decision.
193
  Only { "current_stage": ["accept"] } ends the process.
194
  """
195
  logger.info(f"--- Entering process_feedback ---")
196
- logger.info(f"Input state: {state.to_dict() if hasattr(state, 'to_dict') else state}")
197
- logger.info(f"State type: {type(state)}")
198
-
199
 
200
-
201
-
202
- current_stage = state.get("current_stage") if isinstance(state, dict) else state.current_stage
203
- raw_feedback = state.get("feedback", {}) if isinstance(state, dict) else getattr(state, "feedback", {})
204
 
205
- if isinstance(current_stage, str):
206
- current_stage_value = current_stage
207
- else:
208
- current_stage_value = current_stage.value if hasattr(current_stage, "value") else str(current_stage)
209
 
210
- logger.info(f"Processing feedback for stage: {current_stage_value}")
211
- logger.info(f"Raw feedback data received in state: {raw_feedback}")
212
 
213
- # Only accept if feedback is {current_stage: ["accept"]}
214
- logger.info(f"Checking acceptance: current_stage_value={current_stage_value}, raw_feedback={raw_feedback}")
215
- if (
216
- isinstance(raw_feedback, dict)
217
- and current_stage_value in raw_feedback
218
- and isinstance(raw_feedback[current_stage_value], list)
219
- and raw_feedback[current_stage_value]
220
- and raw_feedback[current_stage_value][-1].strip().lower() == "accept"
221
- ):
222
- logger.info(f"Feedback for stage '{current_stage_value}' is ACCEPT. Ending flow.")
223
- if isinstance(state, dict):
224
- state["feedback_decision"] = "accept"
225
- else:
226
- state.feedback_decision = "accept"
227
  else:
228
- logger.info(f"Feedback for stage '{current_stage_value}' is not accept. Looping back. Feedback is: {raw_feedback}")
229
- if isinstance(state, dict):
230
- state["feedback_decision"] = "reject"
231
- else:
232
- state.feedback_decision = "reject"
233
 
234
  return_value = {
235
- "feedback_decision": state["feedback_decision"] if isinstance(state, dict) else state.feedback_decision,
236
- "feedback": raw_feedback
237
  }
238
  logger.info(f"Returning from process_feedback: {return_value}")
239
  logger.info(f"--- Exiting process_feedback ---")
@@ -242,34 +221,26 @@ class SdlcNode:
242
  @log_entry_exit
243
  def feedback_route(self, state: State) -> str:
244
  """Routes based on the feedback decision stored in the state."""
245
- logger.info(f"--- Entering feedback_route ---")
246
- logger.info(f"Routing feedback. Current state includes feedback_decision: {hasattr(state, 'feedback_decision')}")
247
-
248
- logger.info(f"Full state content received by feedback_route: {state.to_dict() if isinstance(state, State) else state}")
249
 
250
  if not isinstance(state, State):
251
- logger.error(f"Incorrect state type passed to feedback_route: {type(state)}. Defaulting to reject.")
252
- logger.info(f"--- Exiting feedback_route (routing: reject due to type error) ---")
253
-
254
  return "reject"
255
 
256
-
257
- feedback_decision = state.feedback_decision
258
- logger.info(f"Feedback decision read from state object: {feedback_decision}")
259
-
260
- if feedback_decision == "accept":
261
  logger.info("Feedback accepted. Routing to next stage.")
262
- logger.info(f"--- Exiting feedback_route (routing: accept) ---")
263
- state.feedback_decision = None # Reset feedback decision after routing
264
  next_stage = state.get_next_stage()
265
- if next_stage is not None:
266
  state.update_stage(next_stage)
 
 
 
 
 
267
  return "accept"
268
  else:
269
-
270
- logger.info(f"Feedback decision is '{feedback_decision}'. Routing back for revision.")
271
- logger.info(f"--- Exiting feedback_route (routing: reject) ---")
272
- state.feedback_decision = None # Reset feedback decision after routing
273
  return "reject"
274
 
275
 
 
189
  @log_entry_exit
190
  def process_feedback(self, state: State) -> dict:
191
  """
192
+ Process user feedback and update state with decision.
193
  Only { "current_stage": ["accept"] } ends the process.
194
  """
195
  logger.info(f"--- Entering process_feedback ---")
196
+ logger.info(f"Input state: {state.to_dict()}")
 
 
197
 
198
+ current_stage = state.current_stage
199
+ feedback = state.get_last_feedback_for_stage(current_stage)
 
 
200
 
201
+ state.add_feedback(current_stage, str(feedback))
 
 
 
202
 
203
+ logger.info(f"Processing feedback for stage: {current_stage}")
204
+ logger.info(f"Feedback received: {feedback}")
205
 
206
+ if feedback and feedback.strip().lower() == "accept":
207
+ logger.info(f"Feedback for stage '{current_stage}' is ACCEPT. Ending flow.")
208
+ state.feedback_decision = "accept"
 
 
 
 
 
 
 
 
 
 
 
209
  else:
210
+ logger.info(f"Feedback for stage '{current_stage}' is not accept. Looping back. Feedback is: {feedback}")
211
+ state.feedback_decision = "reject"
 
 
 
212
 
213
  return_value = {
214
+ "feedback_decision": state.feedback_decision,
215
+ "feedback": feedback
216
  }
217
  logger.info(f"Returning from process_feedback: {return_value}")
218
  logger.info(f"--- Exiting process_feedback ---")
 
221
  @log_entry_exit
222
  def feedback_route(self, state: State) -> str:
223
  """Routes based on the feedback decision stored in the state."""
224
+ logger.info(f"Entering feedback_route with decision: {state.feedback_decision}")
 
 
 
225
 
226
  if not isinstance(state, State):
227
+ logger.error(f"Invalid state type: {type(state)}. Routing to reject.")
 
 
228
  return "reject"
229
 
230
+ if state.feedback_decision == "accept":
 
 
 
 
231
  logger.info("Feedback accepted. Routing to next stage.")
 
 
232
  next_stage = state.get_next_stage()
233
+ if next_stage:
234
  state.update_stage(next_stage)
235
+ logger.info(f"Updated state to next stage: {next_stage}")
236
+ else:
237
+ logger.info("No next stage available. Ending process.")
238
+
239
+ state.clear_feedback_decision()
240
  return "accept"
241
  else:
242
+ logger.info("Feedback rejected. Routing back for revision.")
243
+ state.clear_feedback_decision()
 
 
244
  return "reject"
245
 
246
 
src/langgraphagenticai/state/__pycache__/state.cpython-312.pyc CHANGED
Binary files a/src/langgraphagenticai/state/__pycache__/state.cpython-312.pyc and b/src/langgraphagenticai/state/__pycache__/state.cpython-312.pyc differ
 
src/langgraphagenticai/state/state.py CHANGED
@@ -119,6 +119,9 @@ class SDLCState(BaseModel):
119
  """Convert state to dictionary."""
120
  return self.model_dump()
121
 
 
 
 
122
 
123
  def update_stage(self, new_stage: SDLCStages):
124
  """
 
119
  """Convert state to dictionary."""
120
  return self.model_dump()
121
 
122
+ def clear_feedback_decision(self):
123
+ """Clear the feedback decision."""
124
+ self.feedback_decision = None
125
 
126
  def update_stage(self, new_stage: SDLCStages):
127
  """
src/langgraphagenticai/ui/streamlitui/__pycache__/display_result_sdlc.cpython-312.pyc CHANGED
Binary files a/src/langgraphagenticai/ui/streamlitui/__pycache__/display_result_sdlc.cpython-312.pyc and b/src/langgraphagenticai/ui/streamlitui/__pycache__/display_result_sdlc.cpython-312.pyc differ