main
HuangHai 3 weeks ago
parent b2ee229e15
commit 15095235c3

@ -54,10 +54,10 @@ app = FastAPI(lifespan=lifespan)
# 挂载静态文件目录 # 挂载静态文件目录
app.mount("/static", StaticFiles(directory="Static"), name="static") app.mount("/static", StaticFiles(directory="Static"), name="static")
@app.post("/api/rag", response_model=None) @app.post("/api/rag")
async def rag(request: fastapi.Request): async def rag(request: fastapi.Request):
data = await request.json() data = await request.json()
query = data.get('query', '') query = data.get("query")
working_dir = "./Test/Math" # 使用与T2_Query.py相同的目录 working_dir = "./Test/Math" # 使用与T2_Query.py相同的目录
async def generate_response_stream(query: str): async def generate_response_stream(query: str):
@ -69,17 +69,15 @@ async def rag(request: fastapi.Request):
if not chunk: if not chunk:
continue continue
# 正确的SSE格式应该是单层data:前缀 # 确保SSE格式正确
yield f"data: {json.dumps({'reply': chunk})}\n\n" yield f"data: {json.dumps({'reply': chunk})}\n\n"
# 打印到控制台用于调试
print(chunk, end='', flush=True) print(chunk, end='', flush=True)
except Exception as e: except Exception as e:
yield f"data: {json.dumps({'error': str(e)})}\n\n" yield f"data: {json.dumps({'error': str(e)})}\n\n"
finally: finally:
if 'rag' in locals(): if 'rag' in locals():
await rag.finalize() await rag.finalize_storages()
return EventSourceResponse(generate_response_stream(query=query)) return EventSourceResponse(generate_response_stream(query=query))

@ -308,15 +308,15 @@
function submitQuestion() { function submitQuestion() {
const question = document.getElementById('questionInput').value.trim(); const question = document.getElementById('questionInput').value.trim();
const answerArea = document.getElementById('answerArea'); const answerArea = document.getElementById('answerArea');
if (!question) { if (!question) {
alert('请输入问题!'); alert('请输入问题!');
return; return;
} }
// 添加加载动画 // 添加加载动画
answerArea.innerHTML = '<div class="loading-animation"><div class="spinner"></div><div>思考中...</div></div>'; answerArea.innerHTML = '<div class="loading-animation"><div class="spinner"></div><div>思考中...</div></div>';
fetch('/api/rag', { fetch('/api/rag', {
method: 'POST', method: 'POST',
headers: { headers: {
@ -332,18 +332,18 @@
const decoder = new TextDecoder(); const decoder = new TextDecoder();
let buffer = ''; let buffer = '';
let accumulatedContent = ''; let accumulatedContent = '';
function processChunk() { function processChunk() {
return reader.read().then(({done, value}) => { return reader.read().then(({done, value}) => {
if (done) return; if (done) return;
buffer += decoder.decode(value, {stream: true}); buffer += decoder.decode(value, {stream: true});
const lines = buffer.split('\n'); const lines = buffer.split('\n');
buffer = lines.pop(); buffer = lines.pop();
for (const line of lines) { for (const line of lines) {
if (line.includes('data:')) { if (line.includes('data:')) {
const jsonStr = line.replace(/^data:\s*/, '').trim(); const jsonStr = line.replace(/^data:\s*/, '').replace(/^data:\s*/, '').trim();
if (jsonStr) { if (jsonStr) {
try { try {
const data = JSON.parse(jsonStr); const data = JSON.parse(jsonStr);
@ -358,14 +358,23 @@
} }
} }
} }
return processChunk();
return processChunk().then(() => {
// 在流处理完成后保存完整的markdown内容
localStorage.setItem('lastMarkdownContent', accumulatedContent);
});
}); });
} }
return processChunk(); return processChunk();
}) })
.catch(error => { .catch(error => {
answerArea.innerHTML = '<div style="color:red">请求出错,请重试</div>'; // 移除加载动画
answerArea.innerHTML = '';
console.error('Error:', error); console.error('Error:', error);
// 出错时也移除加载动画
answerArea.innerHTML = '<div style="color:red">请求出错,请重试</div>';
}); });
} }

Loading…
Cancel
Save