From 4133b80d494470d9bc4195c63905642691708301 Mon Sep 17 00:00:00 2001 From: Gsh <15170702455@163.com> Date: Sat, 7 Feb 2026 01:17:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BD=91=E9=A1=B5=E7=AB=AFAnthropic=20C?= =?UTF-8?q?laude=E5=AF=B9=E8=AF=9D=E6=A0=BC=E5=BC=8F=E5=8E=BB=E9=99=A4syst?= =?UTF-8?q?em=E8=A7=92=E8=89=B2=EF=BC=8C=E6=94=B9=E4=B8=BAassistant?= =?UTF-8?q?=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/composables/chat/useChatSender.ts | 43 ++++++++++++------- Yi.Ai.Vue3/src/utils/apiFormatConverter.ts | 16 ++++--- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/Yi.Ai.Vue3/src/composables/chat/useChatSender.ts b/Yi.Ai.Vue3/src/composables/chat/useChatSender.ts index 6c5ad5fd..cc3640b0 100644 --- a/Yi.Ai.Vue3/src/composables/chat/useChatSender.ts +++ b/Yi.Ai.Vue3/src/composables/chat/useChatSender.ts @@ -1,12 +1,13 @@ -import { useHookFetch } from 'hook-fetch/vue'; -import { ElMessage } from 'element-plus'; -import { ref, computed } from 'vue'; import type { AnyObject } from 'typescript-api-pro'; -import { deleteMessages, unifiedSend } from '@/api'; -import { useModelStore } from '@/stores/modules/model'; -import { convertToApiFormat, parseStreamChunk, type UnifiedMessage } from '@/utils/apiFormatConverter'; import type { BubbleProps } from 'vue-element-plus-x/types/Bubble'; import type { ThinkingStatus } from 'vue-element-plus-x/types/Thinking'; +import type { UnifiedMessage } from '@/utils/apiFormatConverter'; +import { ElMessage } from 'element-plus'; +import { useHookFetch } from 'hook-fetch/vue'; +import { ref } from 'vue'; +import { unifiedSend } from '@/api'; +import { useModelStore } from '@/stores/modules/model'; +import { convertToApiFormat, parseStreamChunk } from '@/utils/apiFormatConverter'; export type MessageRole = 'ai' | 'user' | 'assistant' | string; @@ -83,7 +84,8 @@ export function useChatSender(options: UseChatSenderOptions) { ); const latest = messages[messages.length - 1]; - if (!latest) return; + if (!latest) + return; // 处理 token 使用情况 if (parsed.usage) { @@ -99,7 +101,8 @@ export function useChatSender(options: UseChatSenderOptions) { latest.thinkingStatus = 'thinking'; latest.loading = true; latest.thinlCollapse = true; - if (!latest.reasoning_content) latest.reasoning_content = ''; + if (!latest.reasoning_content) + latest.reasoning_content = ''; latest.reasoning_content += parsed.reasoning_content; } @@ -108,21 +111,26 @@ export function useChatSender(options: UseChatSenderOptions) { const thinkStart = parsed.content.includes(''); const thinkEnd = parsed.content.includes(''); - if (thinkStart) isThinking.value = true; - if (thinkEnd) isThinking.value = false; + if (thinkStart) + isThinking.value = true; + if (thinkEnd) + isThinking.value = false; if (isThinking.value) { latest.thinkingStatus = 'thinking'; latest.loading = true; latest.thinlCollapse = true; - if (!latest.reasoning_content) latest.reasoning_content = ''; + if (!latest.reasoning_content) + latest.reasoning_content = ''; latest.reasoning_content += parsed.content .replace('', '') .replace('', ''); - } else { + } + else { latest.thinkingStatus = 'end'; latest.loading = false; - if (!latest.content) latest.content = ''; + if (!latest.content) + latest.content = ''; latest.content += parsed.content; } } @@ -144,7 +152,8 @@ export function useChatSender(options: UseChatSenderOptions) { textFiles: any[], onUpdate: (messages: MessageItem[]) => void, ): Promise { - if (isSending.value) return; + if (isSending.value) + return; isSending.value = true; currentRequestApiType.value = modelStore.currentModelInfo.modelApiType || 'Completions'; @@ -207,7 +216,8 @@ export function useChatSender(options: UseChatSenderOptions) { fileContent += `${fileItem.name}\n`; fileContent += `\n${fileItem.fileContent}\n\n`; fileContent += `\n`; - if (index < textFiles.length - 1) fileContent += '\n'; + if (index < textFiles.length - 1) + fileContent += '\n'; }); contentArray.push({ type: 'text', text: fileContent }); } @@ -225,7 +235,8 @@ export function useChatSender(options: UseChatSenderOptions) { baseMessage.content = contentArray.length > 1 || imageFiles.length > 0 || textFiles.length > 0 ? contentArray : item.content; - } else { + } + else { baseMessage.content = (item.role === 'ai' || item.role === 'assistant') && item.content.length > 10000 ? `${item.content.substring(0, 10000)}...(内容过长,已省略)` : item.content; diff --git a/Yi.Ai.Vue3/src/utils/apiFormatConverter.ts b/Yi.Ai.Vue3/src/utils/apiFormatConverter.ts index fa6df9c8..f3c3589a 100644 --- a/Yi.Ai.Vue3/src/utils/apiFormatConverter.ts +++ b/Yi.Ai.Vue3/src/utils/apiFormatConverter.ts @@ -127,18 +127,20 @@ export function toResponsesFormat(messages: UnifiedMessage[]): ResponsesMessage[ * 将统一格式的消息转换为 Anthropic Claude 格式 */ export function toClaudeFormat(messages: UnifiedMessage[]): { messages: ClaudeMessage[]; system?: string } { - let systemPrompt: string | undefined; const claudeMessages: ClaudeMessage[] = []; for (const msg of messages) { - // Claude 的 system 消息需要单独提取 + // system 消息转换为 assistant 角色放入 messages 数组 + let role: 'user' | 'assistant'; if (msg.role === 'system') { - msg.role = 'assistant'; - // systemPrompt = typeof msg.content === 'string' ? msg.content : msg.content.map(c => c.text || '').join(''); - // continue; + role = 'assistant'; + } + else if (msg.role === 'model') { + role = 'assistant'; + } + else { + role = msg.role as 'user' | 'assistant'; } - - const role = msg.role === 'model' ? 'assistant' : msg.role; // 处理内容格式 let content: string | ClaudeContent[];