diff --git a/src/robusta/core/reporting/holmes.py b/src/robusta/core/reporting/holmes.py index 91de646c8..4ddbf7388 100644 --- a/src/robusta/core/reporting/holmes.py +++ b/src/robusta/core/reporting/holmes.py @@ -68,6 +68,7 @@ class HolmesChatResult(BaseModel): analysis: Optional[str] = None tool_calls: Optional[List[ToolCallResult]] = None conversation_history: Optional[List[dict]] = None + follow_up_actions: Optional[List[Any]] = None class HolmesChatResultsBlock(BaseBlock): diff --git a/src/robusta/core/sinks/robusta/dal/model_conversion.py b/src/robusta/core/sinks/robusta/dal/model_conversion.py index 3c659c0c6..2f82ad471 100644 --- a/src/robusta/core/sinks/robusta/dal/model_conversion.py +++ b/src/robusta/core/sinks/robusta/dal/model_conversion.py @@ -72,7 +72,7 @@ def get_file_type(filename: str): return filename[last_dot_idx + 1 :] @staticmethod - def get_file_object(block: FileBlock): + def get_file_object(block: FileBlock) -> Dict[str, Any]: return { "type": ModelConversion.get_file_type(block.filename), "data": str(base64.b64encode(block.contents)), @@ -98,14 +98,16 @@ def append_to_structured_data_tool_calls(tool_calls: List[ToolCallResult], struc @staticmethod def add_ai_chat_data(structured_data: List[Dict], block: HolmesChatResultsBlock): + if not block.holmes_result: + return structured_data.append( { "type": "markdown", "metadata": {"type": "ai_investigation_result", "createdAt": datetime_to_db_str(datetime.now())}, - "data": Transformer.to_github_markdown(block.holmes_result.analysis), + "data": Transformer.to_github_markdown(block.holmes_result.analysis or ""), } ) - ModelConversion.append_to_structured_data_tool_calls(block.holmes_result.tool_calls, structured_data) + ModelConversion.append_to_structured_data_tool_calls(block.holmes_result.tool_calls or [], structured_data) conversation_history_block = FileBlock( f"conversation_history-{datetime.now()}.txt", @@ -116,6 +118,13 @@ def add_ai_chat_data(structured_data: List[Dict], block: HolmesChatResultsBlock) conversation_history_obj["metadata"] = {"type": "conversation_history"} structured_data.append(conversation_history_obj) + if block.holmes_result and block.holmes_result.follow_up_actions and len(block.holmes_result.follow_up_actions) > 0: + structured_data.append({ + "type": "structured_data", + "metadata": {"type": "follow_up_actions"}, + "data": block.holmes_result.follow_up_actions, + }) + @staticmethod def add_ai_analysis_data(structured_data: List[Dict], block: HolmesResultsBlock): if not block.holmes_result: