11import asyncio
22import json
3- from typing import List , Optional , Tuple
3+ from typing import List , Optional , Tuple , Union
44
55import structlog
66
77from codegate .dashboard .request_models import (
8+ AlertConversation ,
89 ChatMessage ,
910 Conversation ,
1011 PartialConversation ,
1112 QuestionAnswer ,
1213)
13- from codegate .db .queries import GetPromptWithOutputsRow
14+ from codegate .db .queries import GetAlertsWithPromptAndOutputRow , GetPromptWithOutputsRow
1415
1516logger = structlog .get_logger ("codegate" )
1617
@@ -40,7 +41,7 @@ async def parse_request(request_str: str) -> Optional[str]:
4041 try :
4142 request = json .loads (request_str )
4243 except Exception as e :
43- logger .exception (f"Error parsing request: { e } " )
44+ logger .warning (f"Error parsing request: { request_str } . { e } " )
4445 return None
4546
4647 messages = []
@@ -82,7 +83,7 @@ async def parse_output(output_str: str) -> Tuple[Optional[str], Optional[str]]:
8283 try :
8384 output = json .loads (output_str )
8485 except Exception as e :
85- logger .exception (f"Error parsing request: { e } " )
86+ logger .warning (f"Error parsing output: { output_str } . { e } " )
8687 return None , None
8788
8889 output_message = ""
@@ -107,9 +108,9 @@ async def parse_output(output_str: str) -> Tuple[Optional[str], Optional[str]]:
107108 return output_message , chat_id
108109
109110
110- async def parse_get_prompt_with_output (
111- row : GetPromptWithOutputsRow ,
112- ) -> Optional [PartialConversation ]:
111+ async def _get_question_answer (
112+ row : Union [ GetPromptWithOutputsRow , GetAlertsWithPromptAndOutputRow ]
113+ ) -> Tuple [ Optional [QuestionAnswer ], Optional [ str ] ]:
113114 """
114115 Parse a row from the get_prompt_with_outputs query and return a PartialConversation
115116
@@ -124,7 +125,7 @@ async def parse_get_prompt_with_output(
124125
125126 # If we couldn't parse the request or output, return None
126127 if not request_msg_str or not output_msg_str or not chat_id :
127- return None
128+ return None , None
128129
129130 request_message = ChatMessage (
130131 message = request_msg_str ,
@@ -136,10 +137,20 @@ async def parse_get_prompt_with_output(
136137 timestamp = row .output_timestamp ,
137138 message_id = row .output_id ,
138139 )
139- question_answer = QuestionAnswer (
140- question = request_message ,
141- answer = output_message ,
142- )
140+ return QuestionAnswer (question = request_message , answer = output_message ), chat_id
141+
142+
143+ async def parse_get_prompt_with_output (
144+ row : GetPromptWithOutputsRow ,
145+ ) -> Optional [PartialConversation ]:
146+ """
147+ Parse a row from the get_prompt_with_outputs query and return a PartialConversation
148+
149+ The row contains the raw request and output strings from the pipeline.
150+ """
151+ question_answer , chat_id = await _get_question_answer (row )
152+ if not question_answer or not chat_id :
153+ return None
143154 return PartialConversation (
144155 question_answer = question_answer ,
145156 provider = row .provider ,
@@ -187,3 +198,34 @@ async def match_conversations(
187198 )
188199
189200 return conversations
201+
202+
203+ async def parse_get_alert_conversation (
204+ row : GetAlertsWithPromptAndOutputRow ,
205+ ) -> Optional [AlertConversation ]:
206+ """
207+ Parse a row from the get_alerts_with_prompt_and_output query and return a Conversation
208+
209+ The row contains the raw request and output strings from the pipeline.
210+ """
211+ question_answer , chat_id = await _get_question_answer (row )
212+ if not question_answer or not chat_id :
213+ return None
214+
215+ conversation = Conversation (
216+ question_answers = [question_answer ],
217+ provider = row .provider ,
218+ type = row .type ,
219+ chat_id = chat_id or "chat-id-not-found" ,
220+ conversation_timestamp = row .timestamp ,
221+ )
222+ code_snippet = json .loads (row .code_snippet ) if row .code_snippet else None
223+ return AlertConversation (
224+ conversation = conversation ,
225+ alert_id = row .id ,
226+ code_snippet = code_snippet ,
227+ trigger_string = row .trigger_string ,
228+ trigger_type = row .trigger_type ,
229+ trigger_category = row .trigger_category ,
230+ timestamp = row .timestamp ,
231+ )
0 commit comments