feat: add SSE endpoint for streaming ticket notes generation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -924,6 +924,52 @@ async def get_documentation(
|
|||||||
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=str(e))
|
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=str(e))
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/{session_id}/documentation/stream")
|
||||||
|
@limiter.limit("20/minute")
|
||||||
|
async def stream_documentation(
|
||||||
|
request: Request,
|
||||||
|
session_id: UUID,
|
||||||
|
current_user: Annotated[User, Depends(get_current_active_user)],
|
||||||
|
db: Annotated[AsyncSession, Depends(get_db)],
|
||||||
|
):
|
||||||
|
"""Stream AI-generated ticket notes as Server-Sent Events."""
|
||||||
|
from starlette.responses import StreamingResponse
|
||||||
|
|
||||||
|
# Verify session ownership
|
||||||
|
result = await db.execute(
|
||||||
|
select(AISession).where(AISession.id == session_id)
|
||||||
|
)
|
||||||
|
session = result.scalar_one_or_none()
|
||||||
|
if not session:
|
||||||
|
raise HTTPException(status_code=404, detail="Session not found")
|
||||||
|
if session.user_id != current_user.id:
|
||||||
|
raise HTTPException(status_code=403, detail="Not authorized")
|
||||||
|
|
||||||
|
async def event_generator():
|
||||||
|
try:
|
||||||
|
async for chunk in flowpilot_engine.stream_ticket_notes(
|
||||||
|
session_id=session_id,
|
||||||
|
user_id=current_user.id,
|
||||||
|
db=db,
|
||||||
|
):
|
||||||
|
# SSE format: data: <text>\n\n
|
||||||
|
yield f"data: {chunk}\n\n"
|
||||||
|
yield "data: [DONE]\n\n"
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception("SSE stream error for session %s: %s", session_id, e)
|
||||||
|
yield f"data: [ERROR] {str(e)}\n\n"
|
||||||
|
|
||||||
|
return StreamingResponse(
|
||||||
|
event_generator(),
|
||||||
|
media_type="text/event-stream",
|
||||||
|
headers={
|
||||||
|
"Cache-Control": "no-cache",
|
||||||
|
"Connection": "keep-alive",
|
||||||
|
"X-Accel-Buffering": "no", # Disable nginx buffering
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ── Status Update ──
|
# ── Status Update ──
|
||||||
|
|
||||||
@router.post("/{session_id}/status-update", response_model=StatusUpdateResponse)
|
@router.post("/{session_id}/status-update", response_model=StatusUpdateResponse)
|
||||||
|
|||||||
Reference in New Issue
Block a user