From 28428a53d1fe051adf38d6f89926e201386c46ea Mon Sep 17 00:00:00 2001 From: floating21 <15998581+floating21@user.noreply.gitee.com> Date: Wed, 25 Feb 2026 22:35:33 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E5=B0=86=20DeepAgent=20=E7=9A=84?= =?UTF-8?q?=E6=96=AD=E8=A8=80=E6=94=B9=E4=B8=BA=E8=AD=A6=E5=91=8A=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E5=85=B6=E5=9C=A8=E6=B2=A1=E6=9C=89=20Tavily=20Key=20?= =?UTF-8?q?=E6=97=B6=E4=B9=9F=E8=83=BD=E5=8A=A0=E8=BD=BD=E5=87=BA=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E4=BD=93=E9=80=89=E9=A1=B9=E5=B9=B6=E6=AD=A3=E5=B8=B8?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/agents/deep_agent/graph.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/agents/deep_agent/graph.py b/src/agents/deep_agent/graph.py index 460e7952..1a6c89e2 100644 --- a/src/agents/deep_agent/graph.py +++ b/src/agents/deep_agent/graph.py @@ -18,7 +18,7 @@ from src.services.mcp_service import get_tools_from_all_servers from .context import DeepContext from .prompts import DEEP_PROMPT - +from src.utils import logger def _get_research_sub_agent(search_tools: list) -> dict: """Get research sub-agent config with search tools.""" @@ -85,11 +85,14 @@ class DeepAgent(BaseAgent): if tavily_search: tools.append(tavily_search) - # Assert that search tool is available for DeepAgent - assert tools, ( - "DeepAgent requires at least one search tool. " - "Please configure TAVILY_API_KEY environment variable to enable web search." - ) + # # Assert that search tool is available for DeepAgent + # assert tools, ( + # "DeepAgent requires at least one search tool. " + # "Please configure TAVILY_API_KEY environment variable to enable web search." + # ) + if not tools: + logger.warning("No search tools configured, DeepAgent will work without web search") + tools = [] return tools async def get_graph(self, **kwargs): From 9cd64708499b7cce29c016fb8450a04fdd3a179f Mon Sep 17 00:00:00 2001 From: holenzzz Date: Thu, 26 Feb 2026 12:43:38 +0800 Subject: [PATCH 2/3] Fix embedding 400 errors --- src/knowledge/implementations/milvus.py | 4 +-- .../services/upload_graph_service.py | 2 +- src/models/embed.py | 31 ++++++++++++++----- src/services/evaluation_service.py | 2 +- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/knowledge/implementations/milvus.py b/src/knowledge/implementations/milvus.py index 9896e4c2..f72ac80b 100644 --- a/src/knowledge/implementations/milvus.py +++ b/src/knowledge/implementations/milvus.py @@ -191,13 +191,13 @@ class MilvusKB(KnowledgeBase): def _get_async_embedding_function(self, embed_info: dict): """获取 embedding 函数""" embedding_model = self._get_async_embedding(embed_info) - return partial(embedding_model.abatch_encode, batch_size=40) + return partial(embedding_model.abatch_encode, batch_size=10) def _get_embedding_function(self, embed_info: dict): """获取 embedding 函数""" embedding_model = self._get_async_embedding(embed_info) - return partial(embedding_model.batch_encode, batch_size=40) + return partial(embedding_model.batch_encode, batch_size=10) async def _get_milvus_collection(self, db_id: str): """获取或创建 Milvus 集合""" diff --git a/src/knowledge/services/upload_graph_service.py b/src/knowledge/services/upload_graph_service.py index da3556ae..e1480cd6 100644 --- a/src/knowledge/services/upload_graph_service.py +++ b/src/knowledge/services/upload_graph_service.py @@ -488,7 +488,7 @@ class UploadGraphService: logger.error(f"加载图数据库信息失败:{e}") return False - async def aget_embedding(self, text, batch_size=40): + async def aget_embedding(self, text, batch_size=10): if isinstance(text, list): outputs = await self.embed_model.abatch_encode(text, batch_size=batch_size) return outputs diff --git a/src/models/embed.py b/src/models/embed.py index a63bbc58..08f42e4a 100644 --- a/src/models/embed.py +++ b/src/models/embed.py @@ -46,7 +46,7 @@ class BaseEmbeddingModel(ABC): """等同于aencode""" return await self.aencode(queries) - def batch_encode(self, messages: list[str], batch_size: int = 40) -> list[list[float]]: + def batch_encode(self, messages: list[str], batch_size: int = 10) -> list[list[float]]: # logger.info(f"Batch encoding {len(messages)} messages") data = [] task_id = None @@ -67,24 +67,39 @@ class BaseEmbeddingModel(ABC): return data - async def abatch_encode(self, messages: list[str], batch_size: int = 40) -> list[list[float]]: + async def abatch_encode(self, messages: list[str], batch_size: int = 10) -> list[list[float]]: data = [] task_id = None if len(messages) > batch_size: task_id = hashstr(messages) self.embed_state[task_id] = {"status": "in-progress", "total": len(messages), "progress": 0} - tasks = [] + #保留原有逻辑: + #使用 asyncio.gather 并发执行所有 embedding 批次请求: + # tasks = [] + # for i in range(0, len(messages), batch_size): + # group_msg = messages[i : i + batch_size] + # tasks.append(self.aencode(group_msg)) + + # results = await asyncio.gather(*tasks) + # for res in results: + # data.extend(res) + + # if task_id: + # self.embed_state[task_id]["progress"] = len(messages) + # self.embed_state[task_id]["status"] = "completed" + + # return data + for i in range(0, len(messages), batch_size): group_msg = messages[i : i + batch_size] - tasks.append(self.aencode(group_msg)) - - results = await asyncio.gather(*tasks) - for res in results: + logger.info(f"Async encoding [{i}/{len(messages)}] messages (bsz={batch_size})") + res = await self.aencode(group_msg) data.extend(res) + if task_id: + self.embed_state[task_id]["progress"] = i + len(group_msg) if task_id: - self.embed_state[task_id]["progress"] = len(messages) self.embed_state[task_id]["status"] = "completed" return data diff --git a/src/services/evaluation_service.py b/src/services/evaluation_service.py index e1b6968b..836229b6 100644 --- a/src/services/evaluation_service.py +++ b/src/services/evaluation_service.py @@ -336,7 +336,7 @@ class EvaluationService: # Currently, we re-calculate embeddings for ALL chunks in the KB for every benchmark generation. # This is inefficient for large KBs (O(N) embedding calls). # Optimization: Reuse existing embeddings from Vector DB if embedding_model_id matches the KB's embedding model. - embeddings = await embed_model.abatch_encode(contents, batch_size=40) + embeddings = await embed_model.abatch_encode(contents, batch_size=10) norms = [math.sqrt(sum(x * x for x in vec)) or 1.0 for vec in embeddings] def cosine(a, b, na, nb): From 9844908b2c566198226df1c3e6feb0aac1882027 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sat, 28 Feb 2026 08:33:54 +0000 Subject: [PATCH 3/3] style: auto-format with ruff [skip ci] --- server/routers/chat_router.py | 2 +- src/agents/deep_agent/graph.py | 3 +-- src/models/embed.py | 6 +++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/server/routers/chat_router.py b/server/routers/chat_router.py index 95b41a01..9bfad55a 100644 --- a/server/routers/chat_router.py +++ b/server/routers/chat_router.py @@ -658,11 +658,11 @@ async def update_thread( ) - # ================================ # > === 附件管理分组 === # ================================ + @chat.post("/thread/{thread_id}/attachments", response_model=AttachmentResponse) async def upload_thread_attachment( thread_id: str, diff --git a/src/agents/deep_agent/graph.py b/src/agents/deep_agent/graph.py index 055d0c6c..802bb4e7 100644 --- a/src/agents/deep_agent/graph.py +++ b/src/agents/deep_agent/graph.py @@ -13,10 +13,9 @@ from src.agents.common import BaseAgent, load_chat_model from src.agents.common.middlewares import RuntimeConfigMiddleware, SummaryOffloadMiddleware, save_attachments_to_fs from src.agents.common.tools import get_tavily_search from src.services.mcp_service import get_tools_from_all_servers +from src.utils import logger from .context import DeepContext -from .prompts import DEEP_PROMPT -from src.utils import logger def _create_fs_backend(rt): diff --git a/src/models/embed.py b/src/models/embed.py index 08f42e4a..fafe1d0f 100644 --- a/src/models/embed.py +++ b/src/models/embed.py @@ -74,8 +74,8 @@ class BaseEmbeddingModel(ABC): task_id = hashstr(messages) self.embed_state[task_id] = {"status": "in-progress", "total": len(messages), "progress": 0} - #保留原有逻辑: - #使用 asyncio.gather 并发执行所有 embedding 批次请求: + # 保留原有逻辑: + # 使用 asyncio.gather 并发执行所有 embedding 批次请求: # tasks = [] # for i in range(0, len(messages), batch_size): # group_msg = messages[i : i + batch_size] @@ -90,7 +90,7 @@ class BaseEmbeddingModel(ABC): # self.embed_state[task_id]["status"] = "completed" # return data - + for i in range(0, len(messages), batch_size): group_msg = messages[i : i + batch_size] logger.info(f"Async encoding [{i}/{len(messages)}] messages (bsz={batch_size})")