Fix 法规对话

This commit is contained in:
2026-05-21 23:20:39 +08:00
parent 1b640f0084
commit bf6d47e1fd
11 changed files with 553 additions and 428 deletions

View File

@@ -2,7 +2,6 @@
from __future__ import annotations
import asyncio
import json
from typing import AsyncGenerator, List, Optional
@@ -20,6 +19,7 @@ from app.api.models import (
SessionInfo,
)
from app.config.settings import settings
from app.shared.async_utils import iter_in_thread
from app.shared.bootstrap import get_agent_conversation_service, get_conversation_store
# Keep route handlers close to their transport-layer wiring for easier auditing.
@@ -101,14 +101,13 @@ async def chat_stream_get(
top_k=settings.rag_top_k,
)
yield f"event: session\ndata: {json.dumps({'session_id': session_id_})}\n\n"
for event_data in event_stream:
async for event_data in iter_in_thread(event_stream):
event_type = event_data.get("event", "content")
data = event_data.get("data", "")
if isinstance(data, (dict, list)):
yield f"event: {event_type}\ndata: {json.dumps(data, ensure_ascii=False)}\n\n"
else:
yield f"event: {event_type}\ndata: {data}\n\n"
await asyncio.sleep(0)
except Exception as exc:
yield f"event: error\ndata: {str(exc)}\n\n"

View File

@@ -2,7 +2,6 @@
from __future__ import annotations
import asyncio
import json
from typing import AsyncGenerator
@@ -11,6 +10,7 @@ from fastapi.responses import StreamingResponse
from app.config.settings import settings
from app.schemas.rag import RagChatRequest, QuickQuestionsResponse, QuickQuestion
from app.shared.async_utils import iter_in_thread
from app.shared.bootstrap import get_agent_conversation_service
@@ -29,7 +29,7 @@ _DEFAULT_QUICK_QUESTIONS = [
@router.post("/chat")
async def rag_chat(request: RagChatRequest):
"""Stream RAG Q&A using the real agent service."""
_, event_stream = get_agent_conversation_service().stream_chat(
session_id, event_stream = get_agent_conversation_service().stream_chat(
query=request.query,
session_id=request.session_id,
filters=request.filters,
@@ -38,7 +38,11 @@ async def rag_chat(request: RagChatRequest):
async def generate() -> AsyncGenerator[str, None]:
"""Translate agent SSE events to rag format."""
for event in event_stream:
yield (
"event: message\n"
f"data: {json.dumps({'type': 'session', 'session_id': session_id}, ensure_ascii=False)}\n\n"
)
async for event in iter_in_thread(event_stream):
event_type = event.get("event", "")
data = event.get("data", "")
if event_type == "sources":
@@ -69,14 +73,18 @@ async def rag_chat(request: RagChatRequest):
elif event_type == "done":
yield (
"event: message\n"
f"data: {json.dumps({'type': 'done'}, ensure_ascii=False)}\n\n"
f"data: {json.dumps({'type': 'done', 'session_id': session_id}, ensure_ascii=False)}\n\n"
)
elif event_type == "status":
yield (
"event: message\n"
f"data: {json.dumps({'type': 'status', 'text': data}, ensure_ascii=False)}\n\n"
)
await asyncio.sleep(0)
elif event_type == "error":
yield (
"event: message\n"
f"data: {json.dumps({'type': 'error', 'text': str(data)}, ensure_ascii=False)}\n\n"
)
return StreamingResponse(
generate(),