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[];