This repository was archived by the owner on Jun 5, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 2 files changed +23
-5
lines changed Expand file tree Collapse file tree 2 files changed +23
-5
lines changed Original file line number Diff line number Diff line change 1
1
import asyncio
2
- from typing import List
2
+ from typing import List , AsyncGenerator
3
3
4
4
import structlog
5
5
from fastapi import APIRouter
6
+ from fastapi .responses import StreamingResponse
6
7
7
8
from codegate .dashboard .post_processing import (
8
9
parse_get_alert_conversation ,
9
10
parse_messages_in_conversations ,
10
11
)
11
12
from codegate .dashboard .request_models import AlertConversation , Conversation
12
- from codegate .db .connection import DbReader
13
+ from codegate .db .connection import DbReader , alert_queue
13
14
14
15
logger = structlog .get_logger ("codegate" )
15
16
@@ -34,3 +35,19 @@ def get_alerts() -> List[AlertConversation]:
34
35
"""
35
36
alerts_prompt_output = asyncio .run (db_reader .get_alerts_with_prompt_and_output ())
36
37
return asyncio .run (parse_get_alert_conversation (alerts_prompt_output ))
38
+
39
+
40
+ async def generate_sse_events () -> AsyncGenerator [str , None ]:
41
+ """
42
+ SSE generator from queue
43
+ """
44
+ while True :
45
+ message = await alert_queue .get ()
46
+ yield f"data: { message } \n \n "
47
+
48
+ @dashboard_router .get ("/dashboard/alerts_notification" )
49
+ async def stream_sse ():
50
+ """
51
+ Send alerts event
52
+ """
53
+ return StreamingResponse (generate_sse_events (), media_type = "text/event-stream" )
Original file line number Diff line number Diff line change 5
5
import uuid
6
6
from pathlib import Path
7
7
from typing import AsyncGenerator , AsyncIterator , List , Optional
8
-
9
8
import structlog
10
9
from litellm import ChatCompletionRequest , ModelResponse
11
10
from pydantic import BaseModel
20
19
)
21
20
22
21
logger = structlog .get_logger ("codegate" )
23
-
22
+ alert_queue = asyncio . Queue ()
24
23
25
24
class DbCodeGate :
26
25
@@ -213,7 +212,9 @@ async def record_alerts(self, alerts: List[Alert]) -> None:
213
212
async with asyncio .TaskGroup () as tg :
214
213
for alert in alerts :
215
214
try :
216
- tg .create_task (self ._insert_pydantic_model (alert , sql ))
215
+ result = tg .create_task (self ._insert_pydantic_model (alert , sql ))
216
+ if result and alert .trigger_category == "critical" :
217
+ await alert_queue .put (f"New alert detected: { alert .timestamp } " )
217
218
except Exception as e :
218
219
logger .error (f"Failed to record alert: { alert } ." , error = str (e ))
219
220
return None
You can’t perform that action at this time.
0 commit comments