Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 31 additions & 23 deletions packages/agents/src/agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1544,7 +1544,7 @@ Good suggestions are:

/**
* Save user and assistant messages, then update chat session.
* Messages are saved in parallel for better performance.
* Ensures chat row is saved/updated before messages (avoids FK errors)
*
* @param chatId - The chat identifier
* @param userId - Optional user identifier
Expand All @@ -1569,22 +1569,43 @@ Good suggestions are:

// Save messages and update chat session in parallel for better performance
try {
const savePromises = [
const shouldSaveAssistant = !!assistantMessage && assistantMessage.length > 0;

// If chats are enabled, create or update the chat first (so FK constraints on messages succeed).
if (this.memory?.chats?.enabled) {
const messageCount = 1 + (shouldSaveAssistant ? 1 : 0);
// Build chat payload (use existingChat if provided)
const chatPayload = {
...(existingChat || { chatId, userId, createdAt: new Date() }),
messageCount: (existingChat?.messageCount || 0) + messageCount,
updatedAt: new Date()
};
logger.debug(`Saving/updating chat before messages`, { chatId, messageCount });
// await chat save BEFORE saving messages
await this.memory.provider.saveChat?.(chatPayload);
}

// Now save messages in parallel (chat row exists/updated)
const saveMessagePromises = [];

// user message (always)
saveMessagePromises.push(
this.memory.provider.saveMessage?.({
chatId,
userId,
role: "user",
content: userMessage,
timestamp: new Date(),
}),
];
})
);

// Only save assistant message if it has content
if (assistantMessage && assistantMessage.length > 0) {
if (shouldSaveAssistant) {
// Only save assistant message if it has content
logger.debug(`Will save assistant message`, {
length: assistantMessage.length,
});
savePromises.push(

saveMessagePromises.push(
this.memory.provider.saveMessage?.({
chatId,
userId,
Expand All @@ -1597,24 +1618,11 @@ Good suggestions are:
logger.warn(`Skipping assistant message save - empty or undefined`);
}

// Batch chat session update with message saves (using passed existingChat to avoid duplicate query)
if (this.memory?.chats?.enabled) {
const messageCount = savePromises.length;

savePromises.push(
this.memory.provider.saveChat?.({
...(existingChat || { chatId, userId, createdAt: new Date() }),
messageCount: (existingChat?.messageCount || 0) + messageCount,
updatedAt: new Date(),
}),
);
}

await Promise.all(savePromises);
await Promise.all(saveMessagePromises);

logger.debug(`Successfully saved ${savePromises.length} items`, {
logger.debug(`Successfully saved ${saveMessagePromises.length} items`, {
chatId,
count: savePromises.length,
count: saveMessagePromises.length,
});
} catch (error) {
logger.error(`Failed to save messages for chatId=${chatId}`, {
Expand Down