diff --git a/backend/src/database/repositories/memberRepository.ts b/backend/src/database/repositories/memberRepository.ts index eea1e54379..60282c3bce 100644 --- a/backend/src/database/repositories/memberRepository.ts +++ b/backend/src/database/repositories/memberRepository.ts @@ -253,9 +253,16 @@ class MemberRepository { const totalCount = await options.database.sequelize.query( ` + WITH top_candidates AS ( + SELECT "memberId", "toMergeId", similarity, "activityEstimate" + FROM "memberToMerge" + WHERE similarity IS NOT NULL + ORDER BY similarity DESC, "activityEstimate" DESC + LIMIT 5000 + ) SELECT COUNT(*) AS count - FROM "memberToMerge" mtm + FROM top_candidates mtm ${membersJoin} WHERE EXISTS ( SELECT 1 FROM "memberSegmentsAgg" ms @@ -364,6 +371,13 @@ class MemberRepository { const mems = await options.database.sequelize.query( ` + WITH top_candidates AS ( + SELECT "memberId", "toMergeId", similarity, "activityEstimate" + FROM "memberToMerge" + WHERE similarity IS NOT NULL + ORDER BY similarity DESC, "activityEstimate" DESC + LIMIT 5000 + ) SELECT mtm."memberId" AS id, mtm."toMergeId", @@ -373,7 +387,7 @@ class MemberRepository { m.attributes->'avatarUrl'->>'default' as "primaryAvatarUrl", m2."displayName" as "toMergeDisplayName", m2.attributes->'avatarUrl'->>'default' as "toMergeAvatarUrl" - FROM "memberToMerge" mtm + FROM top_candidates mtm JOIN members m ON m.id = mtm."memberId" JOIN members m2 ON m2.id = mtm."toMergeId" WHERE EXISTS ( @@ -384,7 +398,6 @@ class MemberRepository { SELECT 1 FROM "memberSegmentsAgg" ms2 WHERE ms2."memberId" = mtm."toMergeId" AND ms2."segmentId" IN (:segmentIds) ) - AND mtm.similarity IS NOT NULL ${memberFilter} ${similarityFilter} ${displayNameFilter} diff --git a/services/apps/merge_suggestions_worker/src/types.ts b/services/apps/merge_suggestions_worker/src/types.ts index 167dea0bab..fa1166b17d 100644 --- a/services/apps/merge_suggestions_worker/src/types.ts +++ b/services/apps/merge_suggestions_worker/src/types.ts @@ -104,6 +104,7 @@ export interface IProcessMergeOrganizationSuggestionsWithLLM { export interface IProcessMergeMemberSuggestionsWithLLM { similarity: ISimilarityFilter tenantId: string + modelId?: string } export interface ISimilarMemberOpensearchResult { diff --git a/services/apps/merge_suggestions_worker/src/workflows/mergeMembersWithLLM.ts b/services/apps/merge_suggestions_worker/src/workflows/mergeMembersWithLLM.ts index 03f0af6b1b..e3fa45c0ee 100644 --- a/services/apps/merge_suggestions_worker/src/workflows/mergeMembersWithLLM.ts +++ b/services/apps/merge_suggestions_worker/src/workflows/mergeMembersWithLLM.ts @@ -1,6 +1,6 @@ import { continueAsNew, proxyActivities } from '@temporalio/workflow' -import { LLMSuggestionVerdictType, MemberMergeSuggestionTable } from '@crowd/types' +import { LLMSuggestionVerdictType, LlmModelType, MemberMergeSuggestionTable } from '@crowd/types' import * as commonActivities from '../activities/common' import * as memberActivities from '../activities/memberMergeSuggestions' @@ -24,7 +24,7 @@ export async function mergeMembersWithLLM( ): Promise { const SUGGESTIONS_PER_RUN = 10 const REGION = 'us-east-1' - const MODEL_ID = 'us.anthropic.claude-sonnet-4-20250514-v1:0' + const MODEL_ID = args.modelId ?? LlmModelType.CLAUDE_SONNET_4 const MODEL_ARGS = { max_tokens: 2000, anthropic_version: 'bedrock-2023-05-31',