diff --git a/src/uipath_langchain/agent/guardrails/actions/escalate_action.py b/src/uipath_langchain/agent/guardrails/actions/escalate_action.py index 92ffa3a9..0dcbdb31 100644 --- a/src/uipath_langchain/agent/guardrails/actions/escalate_action.py +++ b/src/uipath_langchain/agent/guardrails/actions/escalate_action.py @@ -151,7 +151,12 @@ async def _node( ) if escalation_result.action == "Approve": - return _process_escalation_response( + # Extract reviewed data for observability + reviewed_inputs = escalation_result.data.get("ReviewedInputs") + reviewed_outputs = escalation_result.data.get("ReviewedOutputs") + reviewed_by = escalation_result.data.get("ReviewedBy") + + response = _process_escalation_response( state, escalation_result.data, scope, @@ -159,6 +164,14 @@ async def _node( guarded_component_name, ) + # Inject reviewed data into response for observability callback + return _inject_reviewed_data( + response, + reviewed_inputs, + reviewed_outputs, + reviewed_by, + ) + raise AgentTerminationException( code=UiPathErrorCode.EXECUTION_ERROR, title="Escalation rejected", @@ -175,6 +188,47 @@ async def _node( return node_name, _node +ESCALATION_REVIEWED_DATA_KEY = "_escalation_reviewed_data" + + +def _inject_reviewed_data( + response: Dict[str, Any] | Command[Any], + reviewed_inputs: Any, + reviewed_outputs: Any, + reviewed_by: Any, +) -> Dict[str, Any] | Command[Any]: + """Inject reviewed data into response for observability callback to read. + + Args: + response: The response from _process_escalation_response. + reviewed_inputs: The reviewed inputs from escalation result. + reviewed_outputs: The reviewed outputs from escalation result. + reviewed_by: The reviewer from escalation result. + + Returns: + The response with reviewed data injected into inner_state. + """ + reviewed_data = { + "reviewed_inputs": reviewed_inputs, + "reviewed_outputs": reviewed_outputs, + "reviewed_by": reviewed_by, + } + + if isinstance(response, Command): + update = dict(response.update) if response.update else {} + inner_state = dict(update.get("inner_state", {})) + inner_state[ESCALATION_REVIEWED_DATA_KEY] = reviewed_data + update["inner_state"] = inner_state + return Command(update=update, graph=response.graph) + elif isinstance(response, dict): + inner_state = dict(response.get("inner_state", {})) + inner_state[ESCALATION_REVIEWED_DATA_KEY] = reviewed_data + response["inner_state"] = inner_state + return response + + return response + + def _validate_message_count( state: AgentGuardrailsGraphState, execution_stage: ExecutionStage,