wangzhibo
2026-10-08 220e4fab27b7f419b3e89e2f2d28ae789aac09d7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import json
 
from fastapi import APIRouter, Query
from sse_starlette.sse import EventSourceResponse
 
from app.services.dialogue_service import DialogueService
 
router = APIRouter(prefix="/api/v1/dialogue", tags=["dialogue"])
dialogue_service = DialogueService()
 
 
@router.get("/stream")
async def stream_dialogue(
    dialogue_id: str | None = Query(default=None),
    user_text: str | None = Query(default=None),
    scene_prompt: str | None = Query(default=None),
    difficulty: str = Query(default="A2"),
) -> EventSourceResponse:
    resolved_id = dialogue_id or dialogue_service.create_dialogue_id()
 
    async def event_generator():
        async for chunk in dialogue_service.stream_dialogue(
            dialogue_id=resolved_id,
            user_text=user_text,
            scene_prompt=scene_prompt,
            difficulty=difficulty,
        ):
            yield {"event": "message", "data": json.dumps(chunk, ensure_ascii=False)}
        yield {"event": "done", "data": json.dumps({"dialogue_id": resolved_id})}
 
    return EventSourceResponse(event_generator())