Files

41 lines
1.4 KiB
Python

import asyncio, json, logging
from fastapi import APIRouter, Query
from fastapi.responses import StreamingResponse
from services.chatlog_client import chatlog_client
from services.message_formatter import attach_quote
router = APIRouter(prefix="/api/sse", tags=["sse"])
log = logging.getLogger(__name__)
@router.get("/chatlog")
async def sse_chatlog(talker: str = Query(...)):
async def generate():
try:
data = await chatlog_client.get_messages(talker, limit=1, offset=0)
last_total = data.get("total", 0)
except Exception:
last_total = 0
while True:
await asyncio.sleep(2)
try:
data = await chatlog_client.get_messages(talker, limit=50, offset=last_total)
msgs = data.get("messages") or data.get("items") or []
new_total = data.get("total", last_total)
for msg in msgs:
attach_quote(msg)
yield f"data: {json.dumps(msg, ensure_ascii=False)}\n\n"
if new_total > last_total:
last_total = new_total
except asyncio.CancelledError:
return
except Exception as e:
log.warning(f"[sse] poll error: {e}")
return StreamingResponse(
generate(),
media_type="text/event-stream",
headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"},
)