fix: 会话消息中工具卡片始终显示✅0 ❌0且永远转圈执行中
根因:onNewIteration 保存工具记录时 status='running'、result=null, 工具执行完成后只更新了工作空间面板,未更新消息中的记录。 修复: 1. 新增 updateMessageToolRecord() 函数,从后往前查找消息中 running 状态的同名工具记录并更新为最终状态 2. onToolCallResult/onToolCallError 回调中同步更新消息记录 3. onDone 多迭代模式下,最终消息也包含 toolRecords
This commit is contained in:
@@ -330,12 +330,14 @@ async function handleRetry(): Promise<void> {
|
|||||||
name, arguments: call.function.arguments,
|
name, arguments: call.function.arguments,
|
||||||
result, status: result.success ? 'success' : 'error', timestamp: Date.now()
|
result, status: result.success ? 'success' : 'error', timestamp: Date.now()
|
||||||
});
|
});
|
||||||
|
updateMessageToolRecord(name, result.success ? 'success' : 'error', result);
|
||||||
},
|
},
|
||||||
onToolCallError: (name, error, call) => {
|
onToolCallError: (name, error, call) => {
|
||||||
updateToolCard({
|
updateToolCard({
|
||||||
name, arguments: call.function.arguments,
|
name, arguments: call.function.arguments,
|
||||||
result: { success: false, error }, status: 'error', timestamp: Date.now()
|
result: { success: false, error }, status: 'error', timestamp: Date.now()
|
||||||
});
|
});
|
||||||
|
updateMessageToolRecord(name, 'error', { success: false, error });
|
||||||
},
|
},
|
||||||
onConfirmTool: async (call) => showToolConfirm(call),
|
onConfirmTool: async (call) => showToolConfirm(call),
|
||||||
onDone: async (finalContent, toolRecords, loopStats) => {
|
onDone: async (finalContent, toolRecords, loopStats) => {
|
||||||
@@ -345,6 +347,7 @@ async function handleRetry(): Promise<void> {
|
|||||||
const lastMsg: ChatMessage = {
|
const lastMsg: ChatMessage = {
|
||||||
role: 'assistant', content: finalContent, timestamp: Date.now(),
|
role: 'assistant', content: finalContent, timestamp: Date.now(),
|
||||||
...(retryThinkContent && { think: retryThinkContent }),
|
...(retryThinkContent && { think: retryThinkContent }),
|
||||||
|
...(toolRecords?.length && { toolCalls: toolRecords }),
|
||||||
...(loopStats?.eval_count && { eval_count: loopStats.eval_count }),
|
...(loopStats?.eval_count && { eval_count: loopStats.eval_count }),
|
||||||
...(loopStats?.total_duration && { total_duration: loopStats.total_duration }),
|
...(loopStats?.total_duration && { total_duration: loopStats.total_duration }),
|
||||||
};
|
};
|
||||||
@@ -846,6 +849,27 @@ export async function sendMessage(): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 更新当前会话消息中最近一个 'running' 状态的同名工具记录 */
|
||||||
|
function updateMessageToolRecord(toolName: string, status: 'success' | 'error', result: Record<string, unknown>): void {
|
||||||
|
state.update(KEYS.CURRENT_SESSION, (session: ChatSession | null) => {
|
||||||
|
if (!session) return session;
|
||||||
|
const messages = [...session.messages];
|
||||||
|
// 从后往前找最近一条包含该工具 running 状态记录的消息
|
||||||
|
for (let i = messages.length - 1; i >= 0; i--) {
|
||||||
|
const msg = messages[i];
|
||||||
|
if (!msg.toolCalls) continue;
|
||||||
|
const idx = msg.toolCalls.findIndex(tc => tc.name === toolName && tc.status === 'running');
|
||||||
|
if (idx !== -1) {
|
||||||
|
const updated = [...msg.toolCalls];
|
||||||
|
updated[idx] = { ...updated[idx], status, result };
|
||||||
|
messages[i] = { ...msg, toolCalls: updated };
|
||||||
|
return { ...session, messages, updatedAt: Date.now() };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return session;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async function sendMessageWithAgentLoop(text: string, currentSession: ChatSession, model: string): Promise<void> {
|
async function sendMessageWithAgentLoop(text: string, currentSession: ChatSession, model: string): Promise<void> {
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
const msgsToAdd: ChatMessage[] = [];
|
const msgsToAdd: ChatMessage[] = [];
|
||||||
@@ -1004,12 +1028,14 @@ async function sendMessageWithAgentLoop(text: string, currentSession: ChatSessio
|
|||||||
name, arguments: call.function.arguments,
|
name, arguments: call.function.arguments,
|
||||||
result, status: result.success ? 'success' : 'error', timestamp: Date.now()
|
result, status: result.success ? 'success' : 'error', timestamp: Date.now()
|
||||||
});
|
});
|
||||||
|
updateMessageToolRecord(name, result.success ? 'success' : 'error', result);
|
||||||
},
|
},
|
||||||
onToolCallError: (name, error, call) => {
|
onToolCallError: (name, error, call) => {
|
||||||
updateToolCard({
|
updateToolCard({
|
||||||
name, arguments: call.function.arguments,
|
name, arguments: call.function.arguments,
|
||||||
result: { success: false, error }, status: 'error', timestamp: Date.now()
|
result: { success: false, error }, status: 'error', timestamp: Date.now()
|
||||||
});
|
});
|
||||||
|
updateMessageToolRecord(name, 'error', { success: false, error });
|
||||||
},
|
},
|
||||||
onConfirmTool: async (call) => {
|
onConfirmTool: async (call) => {
|
||||||
return showToolConfirm(call);
|
return showToolConfirm(call);
|
||||||
@@ -1028,6 +1054,7 @@ async function sendMessageWithAgentLoop(text: string, currentSession: ChatSessio
|
|||||||
content: assistantContent,
|
content: assistantContent,
|
||||||
timestamp: Date.now(),
|
timestamp: Date.now(),
|
||||||
...(thinkContent && { think: thinkContent }),
|
...(thinkContent && { think: thinkContent }),
|
||||||
|
...(toolRecords?.length && { toolCalls: toolRecords }),
|
||||||
...(loopStats?.eval_count && { eval_count: loopStats.eval_count }),
|
...(loopStats?.eval_count && { eval_count: loopStats.eval_count }),
|
||||||
...(lastIterDuration > 0 && { total_duration: lastIterDuration }),
|
...(lastIterDuration > 0 && { total_duration: lastIterDuration }),
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user