fix: Kiro API currentMessage must be userInputMessage type

This commit is contained in:
Sanyela 2025-12-03 12:55:16 +08:00
parent b22de358fa
commit 47df249142

View file

@ -659,71 +659,100 @@ async initializeAuth(forceRefresh = false) {
} }
// Build current message // Build current message
const currentMessage = processedMessages[processedMessages.length - 1]; let currentMessage = processedMessages[processedMessages.length - 1];
let currentContent = ''; let currentContent = '';
let currentToolResults = []; let currentToolResults = [];
let currentToolUses = []; let currentToolUses = [];
let currentImages = []; let currentImages = [];
if (Array.isArray(currentMessage.content)) { // 如果最后一条消息是 assistant需要将其加入 history然后创建一个 user 类型的 currentMessage
for (const part of currentMessage.content) { // 因为 CodeWhisperer API 的 currentMessage 必须是 userInputMessage 类型
if (part.type === 'text') { if (currentMessage.role === 'assistant') {
currentContent += part.text; console.log('[Kiro] Last message is assistant, moving it to history and creating user currentMessage');
} else if (part.type === 'tool_result') {
currentToolResults.push({ // 构建 assistant 消息并加入 history
content: [{ text: this.getContentText(part.content) }], let assistantResponseMessage = {
status: 'success', content: '',
toolUseId: part.tool_use_id toolUses: []
}); };
} else if (part.type === 'tool_use') { if (Array.isArray(currentMessage.content)) {
currentToolUses.push({ for (const part of currentMessage.content) {
input: part.input, if (part.type === 'text') {
name: part.name, assistantResponseMessage.content += part.text;
toolUseId: part.id } else if (part.type === 'tool_use') {
}); assistantResponseMessage.toolUses.push({
} else if (part.type === 'image') { input: part.input,
currentImages.push({ name: part.name,
format: part.source.media_type.split('/')[1], toolUseId: part.id
source: { });
bytes: part.source.data }
}
});
} }
} else {
assistantResponseMessage.content = this.getContentText(currentMessage);
} }
} else { if (assistantResponseMessage.toolUses.length === 0) {
currentContent = this.getContentText(currentMessage); delete assistantResponseMessage.toolUses;
} }
history.push({ assistantResponseMessage });
if (!currentContent && currentToolResults.length === 0 && currentToolUses.length === 0) {
// 设置 currentContent 为 "Continue",因为我们需要一个 user 消息来触发 AI 继续
currentContent = 'Continue'; currentContent = 'Continue';
} else {
// 处理 user 消息
if (Array.isArray(currentMessage.content)) {
for (const part of currentMessage.content) {
if (part.type === 'text') {
currentContent += part.text;
} else if (part.type === 'tool_result') {
currentToolResults.push({
content: [{ text: this.getContentText(part.content) }],
status: 'success',
toolUseId: part.tool_use_id
});
} else if (part.type === 'tool_use') {
currentToolUses.push({
input: part.input,
name: part.name,
toolUseId: part.id
});
} else if (part.type === 'image') {
currentImages.push({
format: part.source.media_type.split('/')[1],
source: {
bytes: part.source.data
}
});
}
}
} else {
currentContent = this.getContentText(currentMessage);
}
if (!currentContent && currentToolResults.length === 0 && currentToolUses.length === 0) {
currentContent = 'Continue';
}
} }
const request = { const request = {
conversationState: { conversationState: {
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 as userInputMessage
history: history history: history
} }
}; };
if (currentMessage.role === 'user') { // currentMessage 始终是 userInputMessage 类型
request.conversationState.currentMessage.userInputMessage = { request.conversationState.currentMessage.userInputMessage = {
content: currentContent, content: currentContent,
modelId: codewhispererModel, modelId: codewhispererModel,
origin: KIRO_CONSTANTS.ORIGIN_AI_EDITOR, origin: KIRO_CONSTANTS.ORIGIN_AI_EDITOR,
images: currentImages && currentImages.length > 0 ? currentImages : null, // Add images here images: currentImages && currentImages.length > 0 ? currentImages : null,
userInputMessageContext: { userInputMessageContext: {
toolResults: currentToolResults.length > 0 ? currentToolResults : null, toolResults: currentToolResults.length > 0 ? currentToolResults : null,
tools: Object.keys(toolsContext).length > 0 ? toolsContext.tools : null tools: Object.keys(toolsContext).length > 0 ? toolsContext.tools : null
} }
}; };
} else if (currentMessage.role === 'assistant') {
request.conversationState.currentMessage.assistantResponseMessage = {
content: currentContent,
toolUses: currentToolUses.length > 0 ? currentToolUses : undefined
};
}
if (this.authMethod === KIRO_CONSTANTS.AUTH_METHOD_SOCIAL) { if (this.authMethod === KIRO_CONSTANTS.AUTH_METHOD_SOCIAL) {
request.profileArn = this.profileArn; request.profileArn = this.profileArn;