From dbc230e205c673a7fe976def3417745a143f02ac Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Thu, 26 Mar 2026 13:53:35 +0800 Subject: [PATCH] =?UTF-8?q?style(lint):=20=E4=BC=98=E5=8C=96=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 8 +-- .../yuxi/agents/backends/sandbox/__init__.py | 2 +- backend/package/yuxi/agents/base.py | 4 +- .../yuxi/agents/buildin/chatbot/graph.py | 6 +- .../yuxi/agents/buildin/deep_agent/prompt.py | 2 +- .../agents/middlewares/skills_middleware.py | 8 ++- backend/package/yuxi/config/app.py | 4 +- .../yuxi/services/conversation_service.py | 9 +-- .../package/yuxi/services/doc_converter.py | 1 - .../yuxi/services/knowledge_fs_service.py | 4 +- .../yuxi/services/thread_files_service.py | 3 +- web/src/assets/css/extensions.less | 65 +++++++++---------- web/src/components/AgentConfigSidebar.vue | 16 ----- web/src/components/AgentMessageComponent.vue | 2 +- web/src/components/AgentPanel.vue | 2 +- .../components/AttachmentOptionsComponent.vue | 1 - web/src/components/BasicSettingsSection.vue | 4 +- web/src/components/ChatSidebarComponent.vue | 2 +- web/src/components/ChunkParamsConfig.vue | 14 ++-- web/src/components/EmbeddingModelSelector.vue | 2 +- web/src/components/EvaluationBenchmarks.vue | 4 +- web/src/components/FileTable.vue | 16 +---- web/src/components/FileUploadModal.vue | 43 ++++-------- web/src/components/GraphCanvas.vue | 22 +++++-- web/src/components/HeaderComponent.vue | 2 +- web/src/components/ImagePreviewComponent.vue | 2 +- web/src/components/LoadingComponent.vue | 2 +- web/src/components/MarkdownContentViewer.vue | 2 +- .../components/ModelProvidersComponent.vue | 30 ++------- web/src/components/ProjectOverview.vue | 4 +- web/src/components/QuerySection.vue | 19 +----- web/src/components/RAGEvaluationTab.vue | 16 +---- web/src/components/RefsComponent.vue | 30 ++++----- web/src/components/SearchConfigModal.vue | 2 + web/src/components/SkillsManagerComponent.vue | 30 ++------- web/src/components/StatusBar.vue | 1 - web/src/components/SubAgentsComponent.vue | 13 +++- web/src/components/TaskCenterDrawer.vue | 12 ---- .../tools/CalculatorTool.vue | 5 +- .../ToolCallingResult/tools/ChartTool.vue | 4 +- .../ToolCallingResult/tools/EditFileTool.vue | 2 +- .../ToolCallingResult/tools/ExecuteTool.vue | 2 +- .../ToolCallingResult/tools/GlobTool.vue | 2 +- .../ToolCallingResult/tools/GrepTool.vue | 5 +- .../ToolCallingResult/tools/ImageTool.vue | 4 +- .../tools/KnowledgeGraphTool.vue | 8 +-- .../tools/ListDirectoryTool.vue | 2 +- .../ToolCallingResult/tools/ListKbsTool.vue | 2 +- .../tools/MysqlDescribeTableTool.vue | 2 +- .../tools/MysqlListTablesTool.vue | 2 +- .../tools/MysqlQueryTool.vue | 2 +- .../ToolCallingResult/tools/ReadFileTool.vue | 2 +- .../tools/SearchFileContentTool.vue | 2 +- .../ToolCallingResult/tools/TaskTool.vue | 2 +- .../ToolCallingResult/tools/TodoListTool.vue | 4 +- .../ToolCallingResult/tools/WriteFileTool.vue | 2 +- web/src/components/UserInfoComponent.vue | 21 +----- .../components/UserManagementComponent.vue | 28 -------- .../dashboard/CallStatsComponent.vue | 4 +- web/src/composables/useMention.js | 2 +- web/src/composables/useStreamSmoother.js | 6 +- web/src/stores/agent.js | 1 + web/src/stores/graphStore.js | 2 +- web/src/stores/info.js | 1 - web/src/stores/theme.js | 2 +- web/src/utils/file_utils.js | 2 +- web/src/utils/modelIcon.js | 1 - web/src/views/DashboardView.vue | 6 +- web/src/views/DataBaseView.vue | 3 +- web/src/views/GraphView.vue | 7 -- web/src/views/HomeView.vue | 2 +- web/vite.config.js | 1 + 72 files changed, 189 insertions(+), 363 deletions(-) diff --git a/Makefile b/Makefile index f2dd20b9..61636ac8 100644 --- a/Makefile +++ b/Makefile @@ -30,13 +30,9 @@ logs: # LINTING AND FORMATTING ###################### -lint: - cd backend && uv run ruff check package - cd backend && uv run ruff format --check package - cd backend && uv run ruff check --select I package - format: cd backend && uv run ruff format package cd backend && uv run ruff check package --fix cd backend && uv run ruff check --select I package --fix - docker compose exec -T web pnpm run format + cd web && pnpm run format + cd web && pnpm run lint diff --git a/backend/package/yuxi/agents/backends/sandbox/__init__.py b/backend/package/yuxi/agents/backends/sandbox/__init__.py index e6ca900d..6e3d6734 100644 --- a/backend/package/yuxi/agents/backends/sandbox/__init__.py +++ b/backend/package/yuxi/agents/backends/sandbox/__init__.py @@ -10,8 +10,8 @@ from .paths import ( virtual_path_for_thread_file, ) from .provider import ( - SandboxConnection, ProvisionerSandboxProvider, + SandboxConnection, get_sandbox_provider, init_sandbox_provider, sandbox_id_for_thread, diff --git a/backend/package/yuxi/agents/base.py b/backend/package/yuxi/agents/base.py index 44838dad..56ca458d 100644 --- a/backend/package/yuxi/agents/base.py +++ b/backend/package/yuxi/agents/base.py @@ -1,6 +1,5 @@ from __future__ import annotations -import asyncio import os from abc import abstractmethod from pathlib import Path @@ -11,8 +10,9 @@ from langgraph.graph.state import CompiledStateGraph from yuxi import config as sys_config from yuxi.agents.context import BaseContext -from yuxi.utils import logger from yuxi.storage.postgres.manager import pg_manager +from yuxi.utils import logger + class BaseAgent: """ diff --git a/backend/package/yuxi/agents/buildin/chatbot/graph.py b/backend/package/yuxi/agents/buildin/chatbot/graph.py index 381a786d..a8025517 100644 --- a/backend/package/yuxi/agents/buildin/chatbot/graph.py +++ b/backend/package/yuxi/agents/buildin/chatbot/graph.py @@ -21,10 +21,7 @@ from .prompt import PROMPT async def _build_middlewares(context): """构建中间件列表""" - all_mcp_tools = ( - await get_tools_from_all_servers() - ) # 因为异步加载,无法放在 RuntimeConfigMiddleware 的 __init__ 中 - + all_mcp_tools = await get_tools_from_all_servers() # 因为异步加载,无法放在 RuntimeConfigMiddleware 的 __init__ 中 # summary middleware # 主 Agent 上下文优化:90k tokens 触发压缩(128k context window 的 70%) @@ -80,7 +77,6 @@ class ChatbotAgent(BaseAgent): def __init__(self, **kwargs): super().__init__(**kwargs) - async def get_graph(self, context=None, **kwargs): context = context or self.context_schema() # 获取上下文配置 diff --git a/backend/package/yuxi/agents/buildin/deep_agent/prompt.py b/backend/package/yuxi/agents/buildin/deep_agent/prompt.py index 22f40f6c..02b3da70 100644 --- a/backend/package/yuxi/agents/buildin/deep_agent/prompt.py +++ b/backend/package/yuxi/agents/buildin/deep_agent/prompt.py @@ -83,4 +83,4 @@ DEEP_PROMPT = """你是一位专家级研究员。你的工作是进行彻底的 - /home/gem/user-data/workspace/:用于存放工作文件和中间结果 - /home/gem/user-data/outputs/:用于存放最终输出结果 - /home/gem/user-data/uploads/:用于存放用户上传的文件 -""" \ No newline at end of file +""" diff --git a/backend/package/yuxi/agents/middlewares/skills_middleware.py b/backend/package/yuxi/agents/middlewares/skills_middleware.py index a308ab38..21a1d754 100644 --- a/backend/package/yuxi/agents/middlewares/skills_middleware.py +++ b/backend/package/yuxi/agents/middlewares/skills_middleware.py @@ -405,7 +405,13 @@ class SkillsMiddleware(AgentMiddleware): pure = PurePosixPath(raw if raw.startswith("/") else f"/{raw}") parts = [p for p in pure.parts if p not in ("/", "")] slug: str | None = None - if len(parts) == 5 and parts[0] == "home" and parts[1] == "gem" and parts[2] == "skills" and parts[4] == "SKILL.md": + if ( + len(parts) == 5 + and parts[0] == "home" + and parts[1] == "gem" + and parts[2] == "skills" + and parts[4] == "SKILL.md" + ): slug = parts[3] if not is_valid_skill_slug(slug): diff --git a/backend/package/yuxi/config/app.py b/backend/package/yuxi/config/app.py index 85412c63..e169072b 100644 --- a/backend/package/yuxi/config/app.py +++ b/backend/package/yuxi/config/app.py @@ -221,9 +221,7 @@ class Config(BaseModel): if os.path.exists(self.model_dir): logger.debug(f"Model directory ({self.model_dir}) contains: {os.listdir(self.model_dir)}") else: - logger.debug( - f"Model directory ({self.model_dir}) does not exist. If not configured, please ignore it." - ) + logger.debug(f"Model directory ({self.model_dir}) does not exist. If not configured, please ignore it.") # 检查模型提供商的环境变量 self.model_provider_status = {} diff --git a/backend/package/yuxi/services/conversation_service.py b/backend/package/yuxi/services/conversation_service.py index bf066505..863d847a 100644 --- a/backend/package/yuxi/services/conversation_service.py +++ b/backend/package/yuxi/services/conversation_service.py @@ -1,28 +1,23 @@ import uuid from dataclasses import dataclass -from datetime import UTC, datetime from pathlib import Path import aiofiles from fastapi import HTTPException, UploadFile from sqlalchemy.ext.asyncio import AsyncSession - from yuxi.agents.backends.sandbox import ( ensure_thread_dirs, sandbox_uploads_dir, ) -from yuxi.services.doc_converter import ATTACHMENT_ALLOWED_EXTENSIONS, MAX_ATTACHMENT_SIZE_BYTES - -UPLOADS_VIRTUAL_PREFIX = "/home/gem/user-data/uploads" from yuxi.agents.buildin import agent_manager from yuxi.config import config as app_config from yuxi.plugins.parser import Parser from yuxi.repositories.conversation_repository import ConversationRepository +from yuxi.services.doc_converter import ATTACHMENT_ALLOWED_EXTENSIONS, MAX_ATTACHMENT_SIZE_BYTES from yuxi.utils.datetime_utils import utc_isoformat from yuxi.utils.logging_config import logger -ATTACHMENT_ALLOWED_EXTENSIONS: tuple[str, ...] = (".txt", ".md", ".docx", ".html", ".htm") -MAX_ATTACHMENT_SIZE_BYTES = 5 * 1024 * 1024 # 5 MB +UPLOADS_VIRTUAL_PREFIX = "/home/gem/user-data/uploads" MAX_ATTACHMENT_MARKDOWN_CHARS = 32_000 diff --git a/backend/package/yuxi/services/doc_converter.py b/backend/package/yuxi/services/doc_converter.py index 074f8e2e..a32427e9 100644 --- a/backend/package/yuxi/services/doc_converter.py +++ b/backend/package/yuxi/services/doc_converter.py @@ -8,7 +8,6 @@ from pathlib import Path import aiofiles from fastapi import UploadFile - from yuxi.config import config as app_config from yuxi.plugins.parser import Parser from yuxi.utils import logger diff --git a/backend/package/yuxi/services/knowledge_fs_service.py b/backend/package/yuxi/services/knowledge_fs_service.py index ca8a3a98..4d7c9cb5 100644 --- a/backend/package/yuxi/services/knowledge_fs_service.py +++ b/backend/package/yuxi/services/knowledge_fs_service.py @@ -130,8 +130,6 @@ async def build_visible_knowledge_mounts( return mounts - - def cache_minio_object(*, source_url: str, metadata: dict[str, Any] | None = None) -> Path: bucket_name, object_name = parse_minio_url(source_url) minio_client = get_minio_client() @@ -139,7 +137,7 @@ def cache_minio_object(*, source_url: str, metadata: dict[str, Any] | None = Non etag = str(getattr(stat, "etag", "") or "") last_modified = getattr(stat, "last_modified", None) version_key = etag or (last_modified.isoformat() if last_modified else "") - cache_key = hashlib.sha256(f"{bucket_name}:{object_name}:{version_key}".encode("utf-8")).hexdigest() + cache_key = hashlib.sha256(f"{bucket_name}:{object_name}:{version_key}".encode()).hexdigest() suffix = Path(object_name).suffix objects_root = get_kb_cache_root() / "objects" diff --git a/backend/package/yuxi/services/thread_files_service.py b/backend/package/yuxi/services/thread_files_service.py index 4be3d01a..4f38e3c6 100644 --- a/backend/package/yuxi/services/thread_files_service.py +++ b/backend/package/yuxi/services/thread_files_service.py @@ -5,15 +5,14 @@ from pathlib import Path from typing import Any from fastapi import HTTPException - from yuxi import config as conf -from yuxi.repositories.conversation_repository import ConversationRepository from yuxi.agents.backends.sandbox import ( ensure_thread_dirs, resolve_virtual_path, sandbox_user_data_dir, virtual_path_for_thread_file, ) +from yuxi.repositories.conversation_repository import ConversationRepository from yuxi.services.conversation_service import require_user_conversation diff --git a/web/src/assets/css/extensions.less b/web/src/assets/css/extensions.less index 134006da..ec8aff92 100644 --- a/web/src/assets/css/extensions.less +++ b/web/src/assets/css/extensions.less @@ -33,48 +33,47 @@ .search-box { padding: 8px 12px 0; - :deep(.ant-input-affix-wrapper) { - height: 28px; - padding: 0 12px; + :deep(.ant-input-affix-wrapper) { + height: 28px; + padding: 0 12px; + // border: none; + border-radius: 8px; + background-color: var(--gray-0); + box-shadow: none; + + &:hover, + &:focus, + &.ant-input-affix-wrapper-focused { // border: none; - border-radius: 8px; - background-color: var(--gray-0); box-shadow: none; - - &:hover, - &:focus, - &.ant-input-affix-wrapper-focused { - // border: none; - box-shadow: none; - } } + } - :deep(.ant-input-prefix) { - margin-right: 8px; - color: var(--gray-400); - } + :deep(.ant-input-prefix) { + margin-right: 8px; + color: var(--gray-400); + } - :deep(.ant-input) { - height: 100%; - background-color: transparent; - } + :deep(.ant-input) { + height: 100%; + background-color: transparent; + } - :deep(.ant-input::placeholder) { - color: var(--gray-400); - } + :deep(.ant-input::placeholder) { + color: var(--gray-400); + } - :deep(.ant-input-clear-icon) { - color: var(--gray-400); - } + :deep(.ant-input-clear-icon) { + color: var(--gray-400); + } - :deep(.ant-input-clear-icon:hover) { - color: var(--gray-500); - } - - // :deep(.ant-input-outlined) { - // border: none; - // } + :deep(.ant-input-clear-icon:hover) { + color: var(--gray-500); + } + // :deep(.ant-input-outlined) { + // border: none; + // } } .list-container { diff --git a/web/src/components/AgentConfigSidebar.vue b/web/src/components/AgentConfigSidebar.vue index 89bc580f..151a7c37 100644 --- a/web/src/components/AgentConfigSidebar.vue +++ b/web/src/components/AgentConfigSidebar.vue @@ -548,22 +548,6 @@ const isReadOnlyConfig = computed(() => !userStore.isAdmin) const isSavingConfig = ref(false) const isDeletingConfig = ref(false) -const hasOtherConfigs = computed(() => { - if (isEmptyConfig.value) return false - return Object.entries(configurableItems.value).some(([, value]) => { - const isBasic = - value.template_metadata?.kind === 'prompt' || value.template_metadata?.kind === 'llm' - const isTools = - value.template_metadata?.kind === 'mcps' || - value.template_metadata?.kind === 'knowledges' || - value.template_metadata?.kind === 'tools' || - value.template_metadata?.kind === 'skills' || - value.template_metadata?.kind === 'subagents' - - return !isBasic && !isTools - }) -}) - const segmentConfigKeys = computed(() => { const keys = Object.keys(configurableItems.value) return { diff --git a/web/src/components/AgentMessageComponent.vue b/web/src/components/AgentMessageComponent.vue index 30bf6b1b..34fdd4fb 100644 --- a/web/src/components/AgentMessageComponent.vue +++ b/web/src/components/AgentMessageComponent.vue @@ -108,7 +108,7 @@ diff --git a/web/src/components/FileUploadModal.vue b/web/src/components/FileUploadModal.vue index 3617b6f6..b2b2bc0b 100644 --- a/web/src/components/FileUploadModal.vue +++ b/web/src/components/FileUploadModal.vue @@ -160,8 +160,12 @@
上传中 {{ uploadingUploadCount }}
-
排队 {{ queuedUploadCount }}
-
失败 {{ failedUploadCount }}
+
+ 排队 {{ queuedUploadCount }} +
+
+ 失败 {{ failedUploadCount }} +
@@ -192,9 +196,7 @@
文件夹上传采用队列模式,最多同时上传 {{ MAX_UPLOAD_CONCURRENCY }} 个文件。
-
- 上传队列已完成,可点击“添加到知识库”继续下一步。 -
+
上传队列已完成,可点击“添加到知识库”继续下一步。
@@ -292,12 +294,12 @@