feat: Add LangGraph streaming with real-time UI updates

- Add streaming schemas and events
- Implement run_review_stream in ReviewerAgent
- Update task_worker to broadcast streaming events via WebSocket
- Create ReviewStream component for real-time progress visualization
- Integrate ReviewStream into ReviewDetail page
- Show agent steps, LLM messages, and progress in real-time
This commit is contained in:
Primakov Alexandr Alexandrovich
2025-10-13 01:00:49 +03:00
parent 2ad11142ad
commit 4ab6400a87
6 changed files with 383 additions and 3 deletions

View File

@@ -159,14 +159,45 @@ class ReviewTaskWorker:
await db.commit()
await db.refresh(review)
# Run review agent
# Run review agent with streaming
logger.info(f" 🤖 Запуск AI review для PR #{pull_request.pr_number}")
# Import broadcast function
from app.main import manager
from datetime import datetime as dt
# Create event handler
async def on_review_event(event: dict):
"""Handle review events and broadcast to clients"""
try:
# Prepare event data
event_data = {
"type": event.get("type", "agent_update"),
"review_id": review.id,
"pr_number": pull_request.pr_number,
"timestamp": dt.utcnow().isoformat(),
"data": event
}
# Broadcast to all connected clients
await manager.broadcast(event_data)
# Log the event
if event.get("type") == "agent_step":
step = event.get("step", "unknown")
logger.info(f" 📍 Step: {step}")
elif event.get("type") == "llm_message":
message = event.get("message", "")[:100]
logger.debug(f" 💬 LLM: {message}...")
except Exception as e:
logger.error(f" ❌ Ошибка broadcast события: {e}")
agent = ReviewerAgent(db)
await agent.run_review(
await agent.run_review_stream(
review_id=review.id,
pr_number=pull_request.pr_number,
repository_id=repository.id
repository_id=repository.id,
on_event=on_review_event
)
logger.info(f" ✅ Review завершен для PR #{pull_request.pr_number}")