refactor(claude-kiro): 兼容Claude Code的npm客户端bug代码
将消息合并逻辑从历史记录处理阶段提前到消息预处理阶段,
同时移除末尾包含单个"{"字符的assistant消息。修复工具上下文
仅在存在工具结果时才传递的条件判断。
This commit is contained in:
parent
41e1b8f25a
commit
78a4674410
1 changed files with 47 additions and 50 deletions
|
|
@ -505,6 +505,52 @@ async initializeAuth(forceRefresh = false) {
|
||||||
throw new Error('No user messages found');
|
throw new Error('No user messages found');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 判断最后一条消息是否为 assistant,如果是则移除
|
||||||
|
const lastMessage = processedMessages[processedMessages.length - 1];
|
||||||
|
if (processedMessages.length > 0 && lastMessage.role === 'assistant') {
|
||||||
|
if (lastMessage.content[0].type === "text" && lastMessage.content[0].text === "{") {
|
||||||
|
console.log('[Kiro] Removing last assistant with "{" message from processedMessages');
|
||||||
|
processedMessages.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 合并相邻相同 role 的消息
|
||||||
|
const mergedMessages = [];
|
||||||
|
for (let i = 0; i < processedMessages.length; i++) {
|
||||||
|
const currentMsg = processedMessages[i];
|
||||||
|
|
||||||
|
if (mergedMessages.length === 0) {
|
||||||
|
mergedMessages.push(currentMsg);
|
||||||
|
} else {
|
||||||
|
const lastMsg = mergedMessages[mergedMessages.length - 1];
|
||||||
|
|
||||||
|
// 判断当前消息和上一条消息是否为相同 role
|
||||||
|
if (currentMsg.role === lastMsg.role) {
|
||||||
|
// 合并消息内容
|
||||||
|
if (Array.isArray(lastMsg.content) && Array.isArray(currentMsg.content)) {
|
||||||
|
// 如果都是数组,合并数组内容
|
||||||
|
lastMsg.content.push(...currentMsg.content);
|
||||||
|
} else if (typeof lastMsg.content === 'string' && typeof currentMsg.content === 'string') {
|
||||||
|
// 如果都是字符串,用换行符连接
|
||||||
|
lastMsg.content += '\n' + currentMsg.content;
|
||||||
|
} else if (Array.isArray(lastMsg.content) && typeof currentMsg.content === 'string') {
|
||||||
|
// 上一条是数组,当前是字符串,添加为 text 类型
|
||||||
|
lastMsg.content.push({ type: 'text', text: currentMsg.content });
|
||||||
|
} else if (typeof lastMsg.content === 'string' && Array.isArray(currentMsg.content)) {
|
||||||
|
// 上一条是字符串,当前是数组,转换为数组格式
|
||||||
|
lastMsg.content = [{ type: 'text', text: lastMsg.content }, ...currentMsg.content];
|
||||||
|
}
|
||||||
|
console.log(`[Kiro] Merged adjacent ${currentMsg.role} messages`);
|
||||||
|
} else {
|
||||||
|
mergedMessages.push(currentMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用合并后的消息替换原消息数组
|
||||||
|
processedMessages.length = 0;
|
||||||
|
processedMessages.push(...mergedMessages);
|
||||||
|
|
||||||
const codewhispererModel = MODEL_MAPPING[model] || MODEL_MAPPING[this.modelName];
|
const codewhispererModel = MODEL_MAPPING[model] || MODEL_MAPPING[this.modelName];
|
||||||
|
|
||||||
let toolsContext = {};
|
let toolsContext = {};
|
||||||
|
|
@ -610,55 +656,6 @@ async initializeAuth(forceRefresh = false) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 合并相邻相同 role 的消息
|
|
||||||
const mergedHistory = [];
|
|
||||||
for (let i = 0; i < history.length; i++) {
|
|
||||||
const currentMessage = history[i];
|
|
||||||
|
|
||||||
if (mergedHistory.length === 0) {
|
|
||||||
mergedHistory.push(currentMessage);
|
|
||||||
} else {
|
|
||||||
const lastMessage = mergedHistory[mergedHistory.length - 1];
|
|
||||||
|
|
||||||
// 判断当前消息和上一条消息是否为相同类型(都是 userInputMessage 或都是 assistantResponseMessage)
|
|
||||||
const currentIsUser = currentMessage.hasOwnProperty('userInputMessage');
|
|
||||||
const lastIsUser = lastMessage.hasOwnProperty('userInputMessage');
|
|
||||||
|
|
||||||
if (currentIsUser && lastIsUser) {
|
|
||||||
// 合并两个 userInputMessage
|
|
||||||
lastMessage.userInputMessage.content += '\n' + currentMessage.userInputMessage.content;
|
|
||||||
|
|
||||||
// 合并 toolResults(如果存在)
|
|
||||||
if (currentMessage.userInputMessage.userInputMessageContext?.toolResults) {
|
|
||||||
if (!lastMessage.userInputMessage.userInputMessageContext.toolResults) {
|
|
||||||
lastMessage.userInputMessage.userInputMessageContext.toolResults = [];
|
|
||||||
}
|
|
||||||
lastMessage.userInputMessage.userInputMessageContext.toolResults.push(
|
|
||||||
...currentMessage.userInputMessage.userInputMessageContext.toolResults
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 合并 images(如果存在)
|
|
||||||
if (currentMessage.userInputMessage.images && currentMessage.userInputMessage.images.length > 0) {
|
|
||||||
if (!lastMessage.userInputMessage.images) {
|
|
||||||
lastMessage.userInputMessage.images = [];
|
|
||||||
}
|
|
||||||
lastMessage.userInputMessage.images.push(...currentMessage.userInputMessage.images);
|
|
||||||
}
|
|
||||||
} else if (!currentIsUser && !lastIsUser) {
|
|
||||||
// 合并两个 assistantResponseMessage
|
|
||||||
lastMessage.assistantResponseMessage.content += '\n' + currentMessage.assistantResponseMessage.content;
|
|
||||||
|
|
||||||
// 合并 toolUses(如果存在)
|
|
||||||
if (currentMessage.assistantResponseMessage.toolUses && currentMessage.assistantResponseMessage.toolUses.length > 0) {
|
|
||||||
lastMessage.assistantResponseMessage.toolUses.push(...currentMessage.assistantResponseMessage.toolUses);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mergedHistory.push(currentMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build current message
|
// Build current message
|
||||||
const currentMessage = processedMessages[processedMessages.length - 1];
|
const currentMessage = processedMessages[processedMessages.length - 1];
|
||||||
let currentContent = '';
|
let currentContent = '';
|
||||||
|
|
@ -704,7 +701,7 @@ async initializeAuth(forceRefresh = false) {
|
||||||
chatTriggerType: KIRO_CONSTANTS.CHAT_TRIGGER_TYPE_MANUAL,
|
chatTriggerType: KIRO_CONSTANTS.CHAT_TRIGGER_TYPE_MANUAL,
|
||||||
conversationId: conversationId,
|
conversationId: conversationId,
|
||||||
currentMessage: {}, // Will be populated based on the last message's role
|
currentMessage: {}, // Will be populated based on the last message's role
|
||||||
history: mergedHistory
|
history: history
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue