41 lines
1.4 KiB
Python
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"},
|
|
)
|