40 lines
1.5 KiB
Python
40 lines
1.5 KiB
Python
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
from starlette.responses import StreamingResponse
|
|
|
|
from app.core.response import ApiResponse, ok
|
|
from app.core.user_context import UserContext, get_user_context
|
|
from app.db.session import get_db
|
|
from app.schemas.learning_assistant import LearningAssistantChatRequest, LearningAssistantChatResponse
|
|
from app.services.learning_assistant_service import LearningAssistantService
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/chat", response_model=ApiResponse[LearningAssistantChatResponse], include_in_schema=False)
|
|
async def learning_assistant_chat(
|
|
payload: LearningAssistantChatRequest,
|
|
ctx: UserContext = Depends(get_user_context),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""AI 学习助手调试接口:非流式返回回答,正式前端联调使用流式接口。"""
|
|
result = await LearningAssistantService(db).chat(ctx, payload)
|
|
db.commit()
|
|
return ok(result)
|
|
|
|
|
|
@router.post("/chat/stream", response_class=StreamingResponse)
|
|
async def learning_assistant_stream_chat(
|
|
payload: LearningAssistantChatRequest,
|
|
ctx: UserContext = Depends(get_user_context),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""AI 学习助手流式问答:返回 retrieval_done、answer_delta、answer_done 事件。"""
|
|
stream = LearningAssistantService(db).stream_chat(ctx, payload)
|
|
db.commit()
|
|
return StreamingResponse(
|
|
stream,
|
|
media_type="text/event-stream",
|
|
headers={"Cache-Control": "no-cache", "Connection": "keep-alive", "X-Accel-Buffering": "no"},
|
|
)
|