feat: Add WebSocket ping/pong + detailed streaming debug + initial review messages
This commit is contained in:
@@ -122,14 +122,37 @@ async def health_check():
|
||||
async def websocket_endpoint(websocket: WebSocket):
|
||||
"""WebSocket endpoint for real-time review updates"""
|
||||
await manager.connect(websocket)
|
||||
print(f"✅ WebSocket connected. Total connections: {len(manager.active_connections)}")
|
||||
|
||||
try:
|
||||
# Send welcome message
|
||||
await websocket.send_json({
|
||||
"type": "connection",
|
||||
"status": "connected",
|
||||
"message": "WebSocket подключен к серверу review",
|
||||
"timestamp": __import__('datetime').datetime.utcnow().isoformat()
|
||||
})
|
||||
|
||||
while True:
|
||||
# Keep connection alive
|
||||
# Keep connection alive and handle client messages
|
||||
data = await websocket.receive_text()
|
||||
# Echo back or handle client messages if needed
|
||||
await websocket.send_json({"type": "pong", "message": "connected"})
|
||||
print(f"📨 Received from client: {data}")
|
||||
|
||||
# Handle ping/pong
|
||||
if data == "ping":
|
||||
await websocket.send_json({
|
||||
"type": "pong",
|
||||
"timestamp": __import__('datetime').datetime.utcnow().isoformat()
|
||||
})
|
||||
else:
|
||||
# Echo back for debugging
|
||||
await websocket.send_json({
|
||||
"type": "echo",
|
||||
"message": f"Получено: {data}"
|
||||
})
|
||||
except WebSocketDisconnect:
|
||||
manager.disconnect(websocket)
|
||||
print(f"❌ WebSocket disconnected. Remaining connections: {len(manager.active_connections)}")
|
||||
|
||||
|
||||
async def broadcast_review_update(review_id: int, event_type: str, data: dict = None):
|
||||
|
||||
@@ -166,6 +166,25 @@ class ReviewTaskWorker:
|
||||
from app.main import manager
|
||||
from datetime import datetime as dt
|
||||
|
||||
# Send initial "review started" message
|
||||
logger.info(f" 📢 Отправка начального сообщения о старте review...")
|
||||
try:
|
||||
initial_message = {
|
||||
"type": "review_started",
|
||||
"review_id": review.id,
|
||||
"pr_number": pull_request.pr_number,
|
||||
"timestamp": dt.utcnow().isoformat(),
|
||||
"data": {
|
||||
"message": f"Начало review для PR #{pull_request.pr_number}",
|
||||
"repository_id": repository.id,
|
||||
"repository_name": f"{repository.repo_owner}/{repository.repo_name}"
|
||||
}
|
||||
}
|
||||
await manager.broadcast(initial_message)
|
||||
logger.info(f" ✅ Начальное сообщение отправлено: {len(manager.active_connections)} подключений")
|
||||
except Exception as e:
|
||||
logger.error(f" ❌ Ошибка отправки начального сообщения: {e}")
|
||||
|
||||
# Create event handler
|
||||
async def on_review_event(event: dict):
|
||||
"""Handle review events and broadcast to clients"""
|
||||
@@ -179,6 +198,8 @@ class ReviewTaskWorker:
|
||||
"data": event
|
||||
}
|
||||
|
||||
logger.info(f" 🔔 Broadcasting event: type={event.get('type')}, connections={len(manager.active_connections)}")
|
||||
|
||||
# Broadcast to all connected clients
|
||||
await manager.broadcast(event_data)
|
||||
|
||||
@@ -188,9 +209,11 @@ class ReviewTaskWorker:
|
||||
logger.info(f" 📍 Step: {step}")
|
||||
elif event.get("type") == "llm_message":
|
||||
message = event.get("message", "")[:100]
|
||||
logger.debug(f" 💬 LLM: {message}...")
|
||||
logger.info(f" 💬 LLM: {message}...")
|
||||
except Exception as e:
|
||||
logger.error(f" ❌ Ошибка broadcast события: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
agent = ReviewerAgent(db)
|
||||
await agent.run_review_stream(
|
||||
@@ -201,6 +224,21 @@ class ReviewTaskWorker:
|
||||
)
|
||||
|
||||
logger.info(f" ✅ Review завершен для PR #{pull_request.pr_number}")
|
||||
|
||||
# Send completion message
|
||||
try:
|
||||
completion_message = {
|
||||
"type": "review_completed",
|
||||
"review_id": review.id,
|
||||
"pr_number": pull_request.pr_number,
|
||||
"timestamp": dt.utcnow().isoformat(),
|
||||
"data": {
|
||||
"message": f"Review завершен для PR #{pull_request.pr_number}"
|
||||
}
|
||||
}
|
||||
await manager.broadcast(completion_message)
|
||||
except Exception as e:
|
||||
logger.error(f" ❌ Ошибка отправки сообщения о завершении: {e}")
|
||||
|
||||
|
||||
# Global worker instance
|
||||
|
||||
Reference in New Issue
Block a user