From 21b16c7c068585f71f510f7a39e0551286bfe22b Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Mon, 25 May 2026 21:02:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=BB=84=E4=BB=B6=E5=92=8C=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E7=9A=84=E8=BE=93=E5=85=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- REFACTOR.md | 1 + .../server/routers/model_provider_router.py | 4 +- web/src/apis/system_api.js | 2 +- web/src/components/AgentChatComponent.vue | 19 +++- web/src/components/AgentInputArea.vue | 5 +- web/src/components/KnowledgeGraphSection.vue | 4 +- web/src/components/ModelSelectorComponent.vue | 102 ++++++++++++++---- web/src/views/AgentView.vue | 66 +++++++++++- 8 files changed, 168 insertions(+), 35 deletions(-) diff --git a/REFACTOR.md b/REFACTOR.md index 33e9332e..219e0dfb 100644 --- a/REFACTOR.md +++ b/REFACTOR.md @@ -25,6 +25,7 @@ - [ ] rename database table name, such as skills -> agent_skills, subagents -> agent_subagents, mcp, tool_call, 等等 - [x] department 的 id 也不能使用那个索引的 id 来使用了,应该是一个独立的 dept_id,需要确认 - [ ] allow user config skill, and envs +- [ ] 添加 Skill 的权限设计 - [ ] add model retry times to agent context config - [ ] add user envs when load sandbox - [ ] Config spacy model 的 load diff --git a/backend/server/routers/model_provider_router.py b/backend/server/routers/model_provider_router.py index 904e82e6..71dd01bf 100644 --- a/backend/server/routers/model_provider_router.py +++ b/backend/server/routers/model_provider_router.py @@ -7,7 +7,7 @@ from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, Field from sqlalchemy.ext.asyncio import AsyncSession -from server.utils.auth_middleware import get_admin_user, get_db +from server.utils.auth_middleware import get_admin_user, get_db, get_required_user from yuxi.services.model_provider_service import ( check_credential_status, create_provider_config, @@ -201,7 +201,7 @@ async def refresh_model_cache( @model_providers.get("/models/v2") async def get_v2_models( model_type: str = "chat", - current_user: User = Depends(get_admin_user), + _current_user: User = Depends(get_required_user), ): """获取 v2 格式的模型列表,按 provider 分组。 diff --git a/web/src/apis/system_api.js b/web/src/apis/system_api.js index 22850f97..6e7916ae 100644 --- a/web/src/apis/system_api.js +++ b/web/src/apis/system_api.js @@ -108,7 +108,7 @@ export const modelProviderApi = { }, getV2Models: async (modelType = 'chat') => { - return apiAdminGet(`/api/system/model-providers/models/v2?model_type=${modelType}`) + return apiGet(`/api/system/model-providers/models/v2?model_type=${modelType}`) }, getCacheStatus: async () => { diff --git a/web/src/components/AgentChatComponent.vue b/web/src/components/AgentChatComponent.vue index 6037a23e..4c5ab302 100644 --- a/web/src/components/AgentChatComponent.vue +++ b/web/src/components/AgentChatComponent.vue @@ -120,6 +120,9 @@ +
@@ -205,7 +208,8 @@ import AgentPanel from '@/components/AgentPanel.vue' // ==================== PROPS & EMITS ==================== const props = defineProps({ agentId: { type: String, default: '' }, - singleMode: { type: Boolean, default: true } + singleMode: { type: Boolean, default: true }, + sendDisabled: { type: Boolean, default: false } }) const emit = defineEmits(['thread-change']) @@ -581,7 +585,9 @@ const isReplyLoading = computed(() => { }) const isSendButtonDisabled = computed(() => { return ( - sendCooldownActive.value || ((!userInput.value || !currentAgent.value) && !isProcessing.value) + sendCooldownActive.value || + (props.sendDisabled && !isProcessing.value) || + ((!userInput.value || !currentAgent.value) && !isProcessing.value) ) }) @@ -1259,7 +1265,13 @@ const selectThreadFromRoute = async (threadId) => { const handleSendMessage = async ({ image } = {}) => { const text = userInput.value.trim() const imageContent = image?.imageContent || null - if ((!text && !image) || !currentAgent.value || isProcessing.value || sendCooldownActive.value) + if ( + (!text && !image) || + !currentAgent.value || + isProcessing.value || + sendCooldownActive.value || + props.sendDisabled + ) return // 发送后进入短暂冷却,防止连续触发停止 @@ -1457,6 +1469,7 @@ const handleSendOrStop = async (payload) => { return } } + if (props.sendDisabled) return await handleSendMessage(payload) } diff --git a/web/src/components/AgentInputArea.vue b/web/src/components/AgentInputArea.vue index 8bc9c959..c8fe2660 100644 --- a/web/src/components/AgentInputArea.vue +++ b/web/src/components/AgentInputArea.vue @@ -77,6 +77,7 @@