mirror of https://github.com/buster-so/buster.git
Add duplicate message check in slack-agent-task
- Introduced a new function `checkForDuplicateMessages` in the database queries to verify if a message already exists in the same chat. - Integrated the duplicate check in the `slackAgentTask` to prevent processing of duplicate messages, enhancing task efficiency and logging warnings for duplicates detected.
This commit is contained in:
parent
0e46d64683
commit
8daceae2e3
|
@ -1,4 +1,11 @@
|
||||||
import { chats, db, eq, messages, updateMessage } from '@buster/database';
|
import {
|
||||||
|
chats,
|
||||||
|
checkForDuplicateMessages,
|
||||||
|
db,
|
||||||
|
eq,
|
||||||
|
messages,
|
||||||
|
updateMessage,
|
||||||
|
} from '@buster/database';
|
||||||
import {
|
import {
|
||||||
SlackMessagingService,
|
SlackMessagingService,
|
||||||
addReaction,
|
addReaction,
|
||||||
|
@ -244,6 +251,26 @@ export const slackAgentTask: ReturnType<
|
||||||
prompt = `Please fulfill the request from this slack conversation:\n${formattedMessages}`;
|
prompt = `Please fulfill the request from this slack conversation:\n${formattedMessages}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for duplicate messages before creating
|
||||||
|
const duplicateCheck = await checkForDuplicateMessages({
|
||||||
|
chatId: payload.chatId,
|
||||||
|
requestMessage: prompt,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (duplicateCheck.isDuplicate) {
|
||||||
|
logger.warn('Duplicate message detected, stopping task', {
|
||||||
|
chatId: payload.chatId,
|
||||||
|
duplicateMessageIds: duplicateCheck.duplicateMessageIds,
|
||||||
|
requestMessage: prompt,
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
messageId: '',
|
||||||
|
triggerRunId: '',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// Step 4: Create message
|
// Step 4: Create message
|
||||||
const message = await createMessage({
|
const message = await createMessage({
|
||||||
chatId: payload.chatId,
|
chatId: payload.chatId,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { InferSelectModel } from 'drizzle-orm';
|
import type { InferSelectModel } from 'drizzle-orm';
|
||||||
import { and, desc, eq, isNull } from 'drizzle-orm';
|
import { and, desc, eq, isNull, ne } from 'drizzle-orm';
|
||||||
import { db } from '../../connection';
|
import { db } from '../../connection';
|
||||||
import { messages } from '../../schema';
|
import { messages } from '../../schema';
|
||||||
|
|
||||||
|
@ -233,3 +233,47 @@ export async function updateMessage(
|
||||||
throw new Error(`Failed to update message ${messageId}`);
|
throw new Error(`Failed to update message ${messageId}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for duplicate messages in the same chat
|
||||||
|
* @param options - Options for duplicate checking
|
||||||
|
* @returns Object indicating if duplicate exists and duplicate message IDs
|
||||||
|
*/
|
||||||
|
export async function checkForDuplicateMessages(options: {
|
||||||
|
chatId: string;
|
||||||
|
requestMessage: string;
|
||||||
|
excludeMessageId?: string;
|
||||||
|
}): Promise<{ isDuplicate: boolean; duplicateMessageIds: string[] }> {
|
||||||
|
const { chatId, requestMessage, excludeMessageId } = options;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Build query conditions
|
||||||
|
const conditions = [
|
||||||
|
eq(messages.chatId, chatId),
|
||||||
|
eq(messages.requestMessage, requestMessage),
|
||||||
|
isNull(messages.deletedAt),
|
||||||
|
];
|
||||||
|
|
||||||
|
// Only add exclusion if messageId provided
|
||||||
|
if (excludeMessageId) {
|
||||||
|
conditions.push(ne(messages.id, excludeMessageId));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Query for messages with same chatId and requestMessage
|
||||||
|
const duplicateMessages = await db
|
||||||
|
.select({
|
||||||
|
id: messages.id,
|
||||||
|
})
|
||||||
|
.from(messages)
|
||||||
|
.where(and(...conditions))
|
||||||
|
.orderBy(desc(messages.createdAt));
|
||||||
|
|
||||||
|
return {
|
||||||
|
isDuplicate: duplicateMessages.length > 0,
|
||||||
|
duplicateMessageIds: duplicateMessages.map((msg) => msg.id),
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to check for duplicate messages:', error);
|
||||||
|
throw new Error(`Failed to check for duplicate messages in chat ${chatId}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue