From 38078741f2e4f1dfbee6af14dd16424f858fef75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=AD=90=E9=BB=98?= <925456043@qq.com> Date: Mon, 31 Aug 2026 15:10:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E4=BD=93=E8=81=8A=E5=A4=A9=E5=9B=BE=E7=89=87=E8=83=BD=E5=8A=9B?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/views/ai/agent-chat/api.ts | 16 ++++++++-- .../ai/agent-chat/imageCapability.test.ts | 32 +++++++++++++++++++ .../views/ai/agent-chat/imageCapability.ts | 14 ++++++++ .../app/src/views/ai/agent-chat/index.vue | 25 +++++++-------- .../src/views/ai/agents/interaction-config.ts | 4 ++- 5 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 easyflow-ui-admin/app/src/views/ai/agent-chat/imageCapability.test.ts create mode 100644 easyflow-ui-admin/app/src/views/ai/agent-chat/imageCapability.ts diff --git a/easyflow-ui-admin/app/src/views/ai/agent-chat/api.ts b/easyflow-ui-admin/app/src/views/ai/agent-chat/api.ts index 8fb70258..72b2b913 100644 --- a/easyflow-ui-admin/app/src/views/ai/agent-chat/api.ts +++ b/easyflow-ui-admin/app/src/views/ai/agent-chat/api.ts @@ -2,6 +2,13 @@ import type { AgentInfo } from '../agents/types'; import { api } from '#/api/request'; +export type AgentChatAgentOption = Pick< + AgentInfo, + 'avatar' | 'description' | 'id' | 'interactionConfigJson' | 'name' +> & { + supportImage?: boolean | null; +}; + export interface RequestResult { data: T; errorCode: number; @@ -74,9 +81,12 @@ export interface AgentChatCapabilityPayload { } export function getPublishedAgents() { - return api.get>('/api/v1/agent/session/options', { - params: { publishedOnly: true }, - }); + return api.get>( + '/api/v1/agent/session/options', + { + params: { publishedOnly: true }, + }, + ); } export function generateAgentSessionId() { diff --git a/easyflow-ui-admin/app/src/views/ai/agent-chat/imageCapability.test.ts b/easyflow-ui-admin/app/src/views/ai/agent-chat/imageCapability.test.ts new file mode 100644 index 00000000..4b6a7820 --- /dev/null +++ b/easyflow-ui-admin/app/src/views/ai/agent-chat/imageCapability.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'vitest'; + +import { + AGENT_CHAT_ATTACHMENT_ACCEPT, + AGENT_IMAGE_REMOVE_REQUIRED_MESSAGE, + AGENT_IMAGE_UNSUPPORTED_MESSAGE, + supportsAgentImageInput, +} from './imageCapability'; + +describe('agent chat image capability', () => { + it('仅允许明确启用图片能力的发布模型', () => { + expect(supportsAgentImageInput(true)).toBe(true); + expect(supportsAgentImageInput(false)).toBe(false); + expect(supportsAgentImageInput(null)).toBe(false); + expect(supportsAgentImageInput(undefined)).toBe(false); + }); + + it('附件选择器同时展示文档和图片格式', () => { + expect(AGENT_CHAT_ATTACHMENT_ACCEPT).toContain('.pdf'); + expect(AGENT_CHAT_ATTACHMENT_ACCEPT).toContain('.png'); + expect(AGENT_CHAT_ATTACHMENT_ACCEPT).toContain('image/png'); + }); + + it('为视觉能力限制提供明确反馈', () => { + expect(AGENT_IMAGE_UNSUPPORTED_MESSAGE).toBe( + '当前大模型不支持视觉,无法上传图片', + ); + expect(AGENT_IMAGE_REMOVE_REQUIRED_MESSAGE).toBe( + '当前大模型不支持视觉,已添加的图片无法发送,请先移除', + ); + }); +}); diff --git a/easyflow-ui-admin/app/src/views/ai/agent-chat/imageCapability.ts b/easyflow-ui-admin/app/src/views/ai/agent-chat/imageCapability.ts new file mode 100644 index 00000000..ae5f69b8 --- /dev/null +++ b/easyflow-ui-admin/app/src/views/ai/agent-chat/imageCapability.ts @@ -0,0 +1,14 @@ +export const AGENT_CHAT_ATTACHMENT_ACCEPT = + '.pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx,.txt,.md,.png,.jpg,.jpeg,.webp,.gif,.bmp,image/png,image/jpeg,image/webp,image/gif,image/bmp'; + +export const AGENT_IMAGE_UNSUPPORTED_MESSAGE = + '当前大模型不支持视觉,无法上传图片'; + +export const AGENT_IMAGE_REMOVE_REQUIRED_MESSAGE = + '当前大模型不支持视觉,已添加的图片无法发送,请先移除'; + +export function supportsAgentImageInput( + supportImage?: boolean | null, +): boolean { + return supportImage === true; +} diff --git a/easyflow-ui-admin/app/src/views/ai/agent-chat/index.vue b/easyflow-ui-admin/app/src/views/ai/agent-chat/index.vue index 88b6c35b..46955bc6 100644 --- a/easyflow-ui-admin/app/src/views/ai/agent-chat/index.vue +++ b/easyflow-ui-admin/app/src/views/ai/agent-chat/index.vue @@ -8,8 +8,7 @@ import type { ChatTimelineToolApprovalPayload, } from '@easyflow/common-ui'; -import type { AgentInfo } from '../agents/types'; -import type { AgentChatSessionView } from './api'; +import type { AgentChatAgentOption, AgentChatSessionView } from './api'; import type { ChatInputTriggerGroup, @@ -78,6 +77,12 @@ import { renameAgentSession, saveAgentSessionExtraKnowledges, } from './api'; +import { + AGENT_CHAT_ATTACHMENT_ACCEPT, + AGENT_IMAGE_REMOVE_REQUIRED_MESSAGE, + AGENT_IMAGE_UNSUPPORTED_MESSAGE, + supportsAgentImageInput, +} from './imageCapability'; import { isMissingAgentSessionError, resolveAgentSessionErrorMessage, @@ -86,7 +91,7 @@ import { const route = useRoute(); const router = useRouter(); -const agents = ref([]); +const agents = ref([]); const sessions = ref([]); const timelineItems = ref([]); const selectedAgentId = ref(''); @@ -122,9 +127,7 @@ const selectedAgent = computed(() => agents.value.find((agent) => String(agent.id) === selectedAgentId.value), ); const selectedAgentImageSupport = computed(() => - Boolean( - selectedAgent.value?.publishedSnapshotJson?.modelSummary?.supportImage, - ), + supportsAgentImageInput(selectedAgent.value?.supportImage), ); const supportedAttachmentFormats = computed(() => selectedAgentImageSupport.value === false @@ -614,7 +617,7 @@ async function handleAgentChange() { selectedAgentImageSupport.value === false && composer.images.items.value.length > 0 ) { - ElMessage.warning('当前智能体不支持图片,请先移除图片'); + ElMessage.warning(AGENT_IMAGE_REMOVE_REQUIRED_MESSAGE); } } @@ -822,7 +825,7 @@ async function addImageFiles(files: File[]) { if (selectedAgentImageSupport.value === false) { ElMessage.warning({ grouping: true, - message: `当前智能体不支持图片,支持:${CHAT_DOCUMENT_SUPPORTED_FORMATS}`, + message: AGENT_IMAGE_UNSUPPORTED_MESSAGE, }); return; } @@ -1395,11 +1398,7 @@ onBeforeUnmount(() => { ref="attachmentFileInputRef" class="agent-chat__image-file-input" type="file" - :accept=" - selectedAgentImageSupport === false - ? '.pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx,.txt,.md' - : '.pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx,.txt,.md,.png,.jpg,.jpeg,.webp,.gif,.bmp,image/png,image/jpeg,image/webp,image/gif,image/bmp' - " + :accept="AGENT_CHAT_ATTACHMENT_ACCEPT" multiple @change="handleAttachmentFiles" /> diff --git a/easyflow-ui-admin/app/src/views/ai/agents/interaction-config.ts b/easyflow-ui-admin/app/src/views/ai/agents/interaction-config.ts index 33696282..25a5e0e0 100644 --- a/easyflow-ui-admin/app/src/views/ai/agents/interaction-config.ts +++ b/easyflow-ui-admin/app/src/views/ai/agents/interaction-config.ts @@ -49,7 +49,9 @@ export function buildInteractionConfigPayload( }; } -export function resolveInteractionDisplay(agent?: AgentInfo) { +export function resolveInteractionDisplay( + agent?: Pick, +) { const config = buildInteractionConfigPayload(agent?.interactionConfigJson); const agentName = String(agent?.name || '').trim() || '智能体'; return {