Skip to content

Commit f0e714a

Browse files
authored
refactor: reorganize message content updates in UI and widget modules (#7)
* refactor: reorganize message content updates in UI and widget modules * refactor: optimize message handling in ask-ai modules * fix: correct condition for server content override
1 parent 2a7248e commit f0e714a

4 files changed

Lines changed: 497 additions & 251 deletions

File tree

docs/sphinx_doc/source/_static/ask-ai-modules/ask-ai-api.js

Lines changed: 58 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export class AskAIApi {
7171
session_id: this.sessionId,
7272
user_id: this.sessionId,
7373
};
74-
74+
7575
console.log('Fetching memory for session:', this.sessionId);
7676

7777
const response = await fetch(`${this.getApiBaseUrl()}/memory`, {
@@ -86,7 +86,7 @@ export class AskAIApi {
8686
const data = await response.json();
8787
const messages = data.messages || [];
8888
console.log('Memory fetched:', messages.length, 'messages');
89-
89+
9090
// Return latest messages if limit is specified
9191
return limit > 0 ? messages.slice(-limit) : messages;
9292
} else {
@@ -236,11 +236,11 @@ export class AskAIApi {
236236
const toolCallWithId = data.content[0]?.type === "data" ? data.content[0].data : null;
237237
const toolCallWithArgs = data.content.length > 1 ? data.content[1] : data.content[0];
238238
const toolCall = toolCallWithArgs?.type === "data" ? toolCallWithArgs.data : null;
239-
239+
240240
if (toolCall && onToolUse) {
241241
const toolName = toolCall.name || 'Unknown Tool';
242242
let toolArgs = toolCall.arguments || {};
243-
243+
244244
if (typeof toolArgs === 'string') {
245245
try {
246246
toolArgs = JSON.parse(toolArgs);
@@ -249,7 +249,7 @@ export class AskAIApi {
249249
toolArgs = {};
250250
}
251251
}
252-
252+
253253
const callId = toolCallWithId?.call_id || null;
254254
console.log('Tool call detected:', { toolName, toolArgs, callId });
255255
onToolUse(toolName, toolArgs, callId);
@@ -263,7 +263,7 @@ export class AskAIApi {
263263
const outputData = data.content.find(item => item.type === "data")?.data;
264264
const callId = outputData?.call_id || null;
265265
const output = outputData?.output;
266-
266+
267267
if (output && callId && onToolComplete) {
268268
console.log('Tool output received for call_id:', callId);
269269
onToolComplete(callId);
@@ -299,7 +299,7 @@ export class AskAIApi {
299299
.filter(c => c.type === "text")
300300
.map(c => c.text)
301301
.join('');
302-
302+
303303
if (fullText && !hasReceivedContent) {
304304
currentStreamContent = fullText;
305305
hasReceivedContent = true;
@@ -327,67 +327,66 @@ export class AskAIApi {
327327

328328
// ✨ Fetch from memory to get verified messages with complete metadata
329329
console.log('Stream ended, fetching latest messages from memory...');
330-
const recentMessages = await this.getMemory(2); // Get last 2 messages (user + assistant)
331-
332-
if (recentMessages.length >= 2) {
333-
const userMessage = recentMessages[recentMessages.length - 2];
334-
const assistantMessage = recentMessages[recentMessages.length - 1];
335-
336-
// Validate these are the messages we expect
337-
if (userMessage.role === 'user' && assistantMessage.role === 'assistant') {
338-
339-
const extractText = (content) => {
340-
if (Array.isArray(content)) {
341-
return content.filter(c => c.type === 'text').map(c => c.text).join('').trim();
342-
}
343-
return (content || '').trim();
344-
};
345-
346-
const userContent = extractText(userMessage.content);
347-
const expectedContent = message.trim();
348-
349-
if (userContent === expectedContent) {
350-
console.log('✓ Memory sync successful');
351-
console.log(' User message ID:', userMessage.id);
352-
console.log(' Assistant message ID:', assistantMessage.id);
353-
354-
// Extract assistant content
355-
let verifiedContent = '';
356-
if (Array.isArray(assistantMessage.content)) {
357-
verifiedContent = assistantMessage.content
358-
.filter(c => c.type === "text")
359-
.map(c => c.text)
360-
.join('');
361-
}
362-
363-
// Use verified content if stream was incomplete or network was unstable
364-
if (verifiedContent && (!streamCompletedSuccessfully || verifiedContent !== currentStreamContent)) {
365-
console.log('⚠ Stream content differs from server, using server version');
366-
currentStreamContent = verifiedContent;
367-
// Update UI with correct content
368-
if (onContentUpdate) {
369-
onContentUpdate(currentStreamContent);
370-
}
371-
}
372-
373-
if (onComplete) {
374-
onComplete(userMessage, assistantMessage);
375-
}
376-
return;
377-
} else {
378-
console.warn('⚠ User message content mismatch - memory may not be synced yet');
379-
console.log(' Expected:', expectedContent.substring(0, 50));
380-
console.log(' Found in memory:', userContent.substring(0, 50));
330+
const recentMessages = await this.getMemory(10); // Get more messages to debug
331+
332+
// Find the last user message and last assistant message
333+
const extractText = (content) => {
334+
if (Array.isArray(content)) {
335+
return content.filter(c => c.type === 'text').map(c => c.text).join('').trim();
336+
}
337+
return (content || '').trim();
338+
};
339+
340+
// Get the last user message and last assistant message from memory
341+
let lastUserMessage = null;
342+
let lastAssistantMessage = null;
343+
344+
for (let i = recentMessages.length - 1; i >= 0; i--) {
345+
const msg = recentMessages[i];
346+
if (!lastAssistantMessage && msg.role === 'assistant') {
347+
lastAssistantMessage = msg;
348+
}
349+
if (!lastUserMessage && msg.role === 'user') {
350+
lastUserMessage = msg;
351+
}
352+
if (lastUserMessage && lastAssistantMessage) break;
353+
}
354+
355+
const expectedContent = message.trim();
356+
const lastUserContent = lastUserMessage ? extractText(lastUserMessage.content) : '';
357+
358+
if (lastUserMessage && lastAssistantMessage && lastUserContent === expectedContent) {
359+
const assistantContent = extractText(lastAssistantMessage.content);
360+
361+
console.log('✓ Memory sync successful');
362+
console.log(' User message ID:', lastUserMessage.id);
363+
console.log(' Assistant message ID:', lastAssistantMessage.id);
364+
365+
// Use server content if stream was incomplete or content differs
366+
if (assistantContent && (!streamCompletedSuccessfully)) {
367+
console.log('⚠ Stream content differs from server, using server version');
368+
currentStreamContent = assistantContent;
369+
if (onContentUpdate) {
370+
onContentUpdate(currentStreamContent);
381371
}
382372
}
373+
374+
if (onComplete) {
375+
onComplete(lastUserMessage, lastAssistantMessage);
376+
}
377+
return;
378+
} else {
379+
console.warn('⚠ Could not verify messages from memory');
380+
console.log(' Expected user content:', expectedContent.substring(0, 50));
381+
console.log(' Found user content:', lastUserContent.substring(0, 50));
383382
}
384383

385384
// Fallback: memory sync failed, use stream data
386385
console.warn('⚠ Could not verify messages from memory, using stream data');
387386
if (onComplete) {
388387
// Create message objects from stream data
389388
const fallbackUserMessage = {
390-
id: `user_${streamMessageId}`,
389+
id: 'user_' + streamMessageId,
391390
role: 'user',
392391
content: [{ type: 'text', text: message.trim() }]
393392
};

0 commit comments

Comments
 (0)