diff --git a/deepsearcher/agent/deep_search.py b/deepsearcher/agent/deep_search.py index 95ee890..3d6fdb6 100644 --- a/deepsearcher/agent/deep_search.py +++ b/deepsearcher/agent/deep_search.py @@ -85,9 +85,8 @@ REFLECT_PROMPT = """ SUMMARY_PROMPT = """ 你是一个内容分析专家,请你根据提供的问题和检索到的信息生成详尽的长文回答。 如果检索到的信息不足以回答问题或者必须添加额外信息才能能回答,你应该使用你的知识来进行补充, -这种情况下,你自己提供的信息需要使用"your knowledge here"括起来 -(添加多个块时不需要序号,并且块不应该被单独分到一个段落中,而是放到回答的各处) -同时,你应该根据提供的信息生成文内引用和文末参考资料列表 +这种情况下,你自己提供的信息需要使用例如"your knowledge here[^0]"引用,注意,这里的"[^0]"的序号0是固定的,表示你的知识,下文当中有文末引用的例子 +同时,你应该根据提供的信息生成文内引用和文末参考资料列表,来自文档切片的reference引用从[^1]开始 如果多个片段是相同的来源或者一个片段可以回答多个问题,文内引用可以引用多次,但文末只引用一次来源,即文末的引用列表中不能有重复的来源。 例子: @@ -99,6 +98,7 @@ SUMMARY_PROMPT = """ 文末引用示例 (需要与前文reference的href一致,不需要对每个chunk分配一个引用,而是每一个referecen共用一个引用): +[^0]: AI Generated [^2]: files/docs/chap_001_003_models.md diff --git a/deepsearcher/backend/templates/index.html b/deepsearcher/backend/templates/index.html index 80e67ad..16bbf37 100644 --- a/deepsearcher/backend/templates/index.html +++ b/deepsearcher/backend/templates/index.html @@ -190,15 +190,32 @@ .query-result { white-space: pre-wrap; line-height: 1.6; + background-color: white; + padding: 16px; + border-radius: 6px; + border: 1px solid var(--border-color); + margin-top: 8px; } .message-stream { margin-top: 16px; } + #processResult { + margin-top: 16px; + } + + #processResult h3 { + color: var(--text-secondary); + font-size: 1rem; + } + + #queryResult h3 { + color: var(--text-secondary); + font-size: 1rem; + } + .message-container { - max-height: 400px; - overflow-y: auto; border: 1px solid var(--border-color); border-radius: 6px; background-color: white; @@ -325,7 +342,9 @@

查询结果:

- +
+ +

处理过程:

@@ -406,10 +425,10 @@ } container.appendChild(messageElement); - // 确保结果容器是可见的 - const resultContainer = document.getElementById('queryResult'); - if (resultContainer && !resultContainer.classList.contains('visible')) { - resultContainer.classList.add('visible'); + // 确保处理过程容器是可见的 + const processContainer = document.getElementById('processResult'); + if (processContainer && !processContainer.classList.contains('visible')) { + processContainer.classList.add('visible'); } // 滚动到底部 @@ -425,10 +444,8 @@ } // 工具函数:显示结果 - function showResult(message) { + function showResult() { const resultElement = document.getElementById('queryResult'); - const resultTextElement = document.getElementById('resultText'); - resultTextElement.textContent = message; resultElement.classList.add('visible'); } @@ -438,6 +455,18 @@ resultElement.classList.remove('visible'); } + // 工具函数:显示处理过程 + function showProcessResult() { + const processElement = document.getElementById('processResult'); + processElement.classList.add('visible'); + } + + // 工具函数:隐藏处理过程 + function hideProcessResult() { + const processElement = document.getElementById('processResult'); + processElement.classList.remove('visible'); + } + // 工具函数:转义HTML特殊字符 function escapeHtml(text) { const map = { @@ -532,8 +561,7 @@ document.getElementById('resultText').textContent = message.content; showResult(); } - // 同时添加到消息容器中 - addMessageToContainer(message); + // 不将answer消息添加到处理过程容器中,只显示在查询结果框中 break; default: console.log('Unknown message type:', message.type); @@ -582,6 +610,7 @@ setButtonLoading(button, true); showStatus('loadStatus', '正在加载文件...', 'loading'); hideResult(); + hideProcessResult(); try { const response = await fetch('/load-files/', { @@ -649,6 +678,7 @@ setButtonLoading(button, true); showStatus('webLoadStatus', '正在加载网站内容...', 'loading'); hideResult(); + hideProcessResult(); try { const response = await fetch('/load-website/', { @@ -702,6 +732,7 @@ setButtonLoading(button, true); showStatus('queryStatus', '正在启动查询...', 'loading'); hideResult(); + hideProcessResult(); // 清空消息容器 const container = document.getElementById('messageContainer'); diff --git a/main.py b/main.py index 58fd9f2..7e268e2 100644 --- a/main.py +++ b/main.py @@ -316,7 +316,11 @@ async def perform_query_stream( print(f"Query error: {error}") yield f"data: {json.dumps({'type': 'error', 'content': f'查询失败: {error}'}, ensure_ascii=False)}\n\n" return - # 成功完成时,发送complete消息并结束 + # 成功完成时,先发送answer消息包含查询结果 + if result_text: + print(f"Sending answer message with result length: {len(result_text)}") + yield f"data: {json.dumps({'type': 'answer', 'content': result_text}, ensure_ascii=False)}\n\n" + # 然后发送complete消息并结束 print("Query completed successfully, sending complete message") yield f"data: {json.dumps({'type': 'complete', 'content': '查询完成'}, ensure_ascii=False)}\n\n" print("Complete message sent, ending stream")