From 1033b634502d6ad138bc919d8593a3efb9e3a617 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Thu, 19 Mar 2026 12:09:17 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 12 +- .../package/yuxi/services/subagent_service.py | 5 +- web/src/apis/subagent_api.js | 20 +- web/src/components/SubAgentsComponent.vue | 890 +++++++++--------- web/src/views/ExtensionsView.vue | 12 +- 5 files changed, 471 insertions(+), 468 deletions(-) diff --git a/Makefile b/Makefile index bdc4263a..4e90863e 100644 --- a/Makefile +++ b/Makefile @@ -24,14 +24,14 @@ logs: ###################### lint: - uv run python -m ruff check backend/package - uv run python -m ruff format --check backend/package - uv run python -m ruff check --select I backend/package + 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: - uv run python -m ruff format backend/package - uv run python -m ruff check backend/package --fix - uv run python -m ruff check --select I backend/package --fix + 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 router-tests: diff --git a/backend/package/yuxi/services/subagent_service.py b/backend/package/yuxi/services/subagent_service.py index 872f09f3..d06121d3 100644 --- a/backend/package/yuxi/services/subagent_service.py +++ b/backend/package/yuxi/services/subagent_service.py @@ -1,12 +1,11 @@ """SubAgent 服务层""" import asyncio -from copy import deepcopy from contextlib import asynccontextmanager +from copy import deepcopy from typing import Any from sqlalchemy.ext.asyncio import AsyncSession - from yuxi.repositories.subagent_repository import SubAgentRepository from yuxi.services.mcp_service import get_tools_from_all_servers from yuxi.storage.postgres.manager import pg_manager @@ -25,6 +24,7 @@ async def _get_session(db: AsyncSession | None = None): async with pg_manager.get_async_session_context() as session: yield session + # 内置 SubAgent 配置 _DEFAULT_SUBAGENTS = [ { @@ -130,6 +130,7 @@ async def _get_available_tools() -> list[Any]: tools.extend(mcp_tools) return tools + async def get_all_subagents(db: AsyncSession | None = None) -> list[dict[str, Any]]: """获取所有 SubAgent(含禁用的)""" async with _get_session(db) as session: diff --git a/web/src/apis/subagent_api.js b/web/src/apis/subagent_api.js index 0a82bac1..00789112 100644 --- a/web/src/apis/subagent_api.js +++ b/web/src/apis/subagent_api.js @@ -16,7 +16,7 @@ const BASE_URL = '/api/system/subagents' * @returns {Promise} - SubAgent 列表 */ export const getSubAgents = async () => { - return apiAdminGet(BASE_URL) + return apiAdminGet(BASE_URL) } /** @@ -25,7 +25,7 @@ export const getSubAgents = async () => { * @returns {Promise} - SubAgent 配置 */ export const getSubAgent = async (name) => { - return apiAdminGet(`${BASE_URL}/${encodeURIComponent(name)}`) + return apiAdminGet(`${BASE_URL}/${encodeURIComponent(name)}`) } /** @@ -34,7 +34,7 @@ export const getSubAgent = async (name) => { * @returns {Promise} - 创建结果 */ export const createSubAgent = async (data) => { - return apiAdminPost(BASE_URL, data) + return apiAdminPost(BASE_URL, data) } /** @@ -44,7 +44,7 @@ export const createSubAgent = async (data) => { * @returns {Promise} - 更新结果 */ export const updateSubAgent = async (name, data) => { - return apiAdminPut(`${BASE_URL}/${encodeURIComponent(name)}`, data) + return apiAdminPut(`${BASE_URL}/${encodeURIComponent(name)}`, data) } /** @@ -53,7 +53,7 @@ export const updateSubAgent = async (name, data) => { * @returns {Promise} - 删除结果 */ export const deleteSubAgent = async (name) => { - return apiAdminDelete(`${BASE_URL}/${encodeURIComponent(name)}`) + return apiAdminDelete(`${BASE_URL}/${encodeURIComponent(name)}`) } // ============================================================================= @@ -61,11 +61,11 @@ export const deleteSubAgent = async (name) => { // ============================================================================= export const subagentApi = { - getSubAgents, - getSubAgent, - createSubAgent, - updateSubAgent, - deleteSubAgent, + getSubAgents, + getSubAgent, + createSubAgent, + updateSubAgent, + deleteSubAgent } export default subagentApi diff --git a/web/src/components/SubAgentsComponent.vue b/web/src/components/SubAgentsComponent.vue index 2636a008..9491fef1 100644 --- a/web/src/components/SubAgentsComponent.vue +++ b/web/src/components/SubAgentsComponent.vue @@ -1,220 +1,214 @@ @@ -460,114 +454,114 @@ defineExpose({ @import '@/assets/css/extensions.less'; .list-item { - .agent-icon-svg { - width: 16px; - height: 16px; - color: var(--gray-500); - flex-shrink: 0; + .agent-icon-svg { + width: 16px; + height: 16px; + color: var(--gray-500); + flex-shrink: 0; + } + + .item-details { + display: flex; + flex-direction: column; + gap: 4px; + + .builtin-tag { + background: var(--color-primary-50); + border: none; + color: var(--color-primary-600); + border-radius: 4px; + font-size: 11px; + width: fit-content; } - .item-details { - display: flex; - flex-direction: column; - gap: 4px; - - .builtin-tag { - background: var(--color-primary-50); - border: none; - color: var(--color-primary-600); - border-radius: 4px; - font-size: 11px; - width: fit-content; - } - - .item-desc { - font-size: 12px; - color: var(--gray-400); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } + .item-desc { + font-size: 12px; + color: var(--gray-400); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + } } .agent-icon-lg-svg { - width: 18px; - height: 18px; - color: var(--gray-700); - flex-shrink: 0; + width: 18px; + height: 18px; + color: var(--gray-700); + flex-shrink: 0; } .model-override-row { - display: flex; - align-items: center; - gap: 8px; + display: flex; + align-items: center; + gap: 8px; } .model-selector-full { - flex: 1; + flex: 1; - :deep(.model-select) { - width: 100%; - } + :deep(.model-select) { + width: 100%; + } } /* 右侧面板 */ .main-panel { - .detail-tabs { - .tab-content { - padding: 16px; - min-height: 300px; - height: 100%; - overflow: scroll; - } + .detail-tabs { + .tab-content { + padding: 16px; + min-height: 300px; + height: 100%; + overflow: scroll; } + } } .info-grid { - display: grid; - gap: 16px; + display: grid; + gap: 16px; - .info-item { - display: flex; - flex-direction: column; - gap: 4px; + .info-item { + display: flex; + flex-direction: column; + gap: 4px; - label { - font-size: 12px; - color: var(--gray-500); - font-weight: 500; - } - - span { - font-size: 14px; - color: var(--gray-900); - } + label { + font-size: 12px; + color: var(--gray-500); + font-weight: 500; } + + span { + font-size: 14px; + color: var(--gray-900); + } + } } .prompt-display { - background: var(--gray-50); - border: 1px solid var(--gray-150); - border-radius: 8px; - padding: 16px; + background: var(--gray-50); + border: 1px solid var(--gray-150); + border-radius: 8px; + padding: 16px; - pre { - margin: 0; - font-family: 'Monaco', 'Consolas', monospace; - font-size: 13px; - white-space: pre-wrap; - word-break: break-word; - color: var(--gray-700); - } + pre { + margin: 0; + font-family: 'Monaco', 'Consolas', monospace; + font-size: 13px; + white-space: pre-wrap; + word-break: break-word; + color: var(--gray-700); + } } /* 模态框样式 */ .subagent-modal { - .subagent-form { - .form-item { - margin-bottom: 16px; - } + .subagent-form { + .form-item { + margin-bottom: 16px; } + } } diff --git a/web/src/views/ExtensionsView.vue b/web/src/views/ExtensionsView.vue index a34a2385..34c0c9de 100644 --- a/web/src/views/ExtensionsView.vue +++ b/web/src/views/ExtensionsView.vue @@ -50,7 +50,11 @@ 添加 - + 刷新 @@ -73,7 +77,11 @@
- +