From 0527cf491db63fdf059fb5fe6c8c3f11c3a9a7fd Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Sun, 21 Dec 2025 21:25:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=B0=86=E5=90=8C=E6=AD=A5IO?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=94=B9=E4=B8=BA=E5=BC=82=E6=AD=A5=E4=BB=A5?= =?UTF-8?q?=E6=8F=90=E9=AB=98=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/latest/changelog/roadmap.md | 4 +-- server/routers/mindmap_router.py | 5 ++-- server/routers/system_router.py | 30 +++++++++++-------- .../common/middlewares/context_middlewares.py | 2 +- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/docs/latest/changelog/roadmap.md b/docs/latest/changelog/roadmap.md index 800398d1..d3d52e11 100644 --- a/docs/latest/changelog/roadmap.md +++ b/docs/latest/changelog/roadmap.md @@ -10,13 +10,13 @@ - 集成 neo4j mcp (或者自己构建工具) - 文档解析部分的 markdown 中的图片替换为内部可访问的链接 (2/4) - chat_model 的 call 需要异步 -- 优化分块儿逻辑,移除 QA 分块,集成到普通分块儿中 +- 优化chunk逻辑,移除 QA 分割,集成到普通分块中 ### Bugs - 部分异常状态下,智能体的模型名称出现重叠[#279](https://github.com/xerrors/Yuxi-Know/issues/279) - DeepSeek 官方接口适配会出现问题 - 目前的知识库的图片存在公开访问风险 -- 工具传递给模型的时候,使用英文,显示的时候,使用中文(尽量保持一致) +- 工具传递给模型的时候,使用英文,但部分模型不支持中文函数名(如gpt-4o-mini) - 首页加载的问题 - lightrag 类型的图谱的节点数量统计有问题 diff --git a/server/routers/mindmap_router.py b/server/routers/mindmap_router.py index bf0946af..b68b2d21 100644 --- a/server/routers/mindmap_router.py +++ b/server/routers/mindmap_router.py @@ -7,6 +7,7 @@ - 保存和加载思维导图配置 """ +import asyncio import json import traceback import textwrap @@ -213,10 +214,10 @@ async def generate_mindmap( # 调用AI生成 logger.info(f"开始生成思维导图,知识库: {db_name}, 文件数量: {len(files_info)}") - # 选择模型并调用 + # 选择模型并调用(使用异步包装) model = select_model() messages = [{"role": "system", "content": system_prompt}, {"role": "user", "content": user_message}] - response = model.call(messages, stream=False) + response = await asyncio.to_thread(model.call, messages, stream=False) # 解析AI返回的JSON try: diff --git a/server/routers/system_router.py b/server/routers/system_router.py index 02a56cb8..f9aba820 100644 --- a/server/routers/system_router.py +++ b/server/routers/system_router.py @@ -1,5 +1,5 @@ import os -from collections import deque +import aiofiles from pathlib import Path import yaml @@ -30,7 +30,7 @@ async def health_check(): @system.get("/config") -def get_config(current_user: User = Depends(get_admin_user)): +async def get_config(current_user: User = Depends(get_admin_user)): """获取系统配置""" return config.dump_config() @@ -52,15 +52,20 @@ async def update_config_batch(items: dict = Body(...), current_user: User = Depe @system.get("/logs") -def get_system_logs(current_user: User = Depends(get_admin_user)): +async def get_system_logs(current_user: User = Depends(get_admin_user)): """获取系统日志""" try: from src.utils.logging_config import LOG_FILE - with open(LOG_FILE) as f: - last_lines = deque(f, maxlen=1000) + async with aiofiles.open(LOG_FILE) as f: + # 读取最后1000行 + lines = [] + async for line in f: + lines.append(line) + if len(lines) > 1000: + lines.pop(0) - log = "".join(last_lines) + log = "".join(lines) return {"log": log, "message": "success", "log_file": LOG_FILE} except Exception as e: logger.error(f"获取系统日志失败: {e}") @@ -72,7 +77,7 @@ def get_system_logs(current_user: User = Depends(get_admin_user)): # ============================================================================= -def load_info_config(): +async def load_info_config(): """加载信息配置文件""" try: # 配置文件路径 @@ -84,9 +89,10 @@ def load_info_config(): logger.debug(f"The config file {config_path} does not exist, using default config") config_path = Path("src/config/static/info.template.yaml") - # 读取配置文件 - with open(config_path, encoding="utf-8") as file: - config = yaml.safe_load(file) + # 异步读取配置文件 + async with aiofiles.open(config_path, encoding="utf-8") as file: + content = await file.read() + config = yaml.safe_load(content) return config @@ -99,7 +105,7 @@ def load_info_config(): async def get_info_config(): """获取系统信息配置(公开接口,无需认证)""" try: - config = load_info_config() + config = await load_info_config() return {"success": True, "data": config} except Exception as e: logger.error(f"获取信息配置失败: {e}") @@ -110,7 +116,7 @@ async def get_info_config(): async def reload_info_config(current_user: User = Depends(get_admin_user)): """重新加载信息配置""" try: - config = load_info_config() + config = await load_info_config() return {"success": True, "message": "配置重新加载成功", "data": config} except Exception as e: logger.error(f"重新加载信息配置失败: {e}") diff --git a/src/agents/common/middlewares/context_middlewares.py b/src/agents/common/middlewares/context_middlewares.py index 12249314..a1012d41 100644 --- a/src/agents/common/middlewares/context_middlewares.py +++ b/src/agents/common/middlewares/context_middlewares.py @@ -4,8 +4,8 @@ from collections.abc import Callable from langchain.agents.middleware import ModelRequest, ModelResponse, dynamic_prompt, wrap_model_call -from src.utils import logger from src.agents.common import load_chat_model +from src.utils import logger @dynamic_prompt