From b4d1c36d6354bbd9b57e5b1af959b22cedf46312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Mon, 27 Nov 2023 15:24:47 +0100 Subject: [PATCH 1/7] Batch render user messages --- front/lib/api/assistant/conversation.ts | 196 ++++++++++++++---------- 1 file changed, 113 insertions(+), 83 deletions(-) diff --git a/front/lib/api/assistant/conversation.ts b/front/lib/api/assistant/conversation.ts index 170533a63250..7bfcfc2a9f0a 100644 --- a/front/lib/api/assistant/conversation.ts +++ b/front/lib/api/assistant/conversation.ts @@ -182,14 +182,17 @@ export async function deleteConversation( * Conversation Rendering */ -async function renderUserMessage( - message: Message, - userMessage: UserMessage -): Promise { - const [mentions, user] = await Promise.all([ +async function batchRenderUserMessages(messages: Message[]) { + if (messages.find((m) => !m.userMessage)) { + throw new Error( + "Unreachable: batchRenderUserMessages must be called with only user messages" + ); + } + + const [mentions, users] = await Promise.all([ Mention.findAll({ where: { - messageId: message.id, + messageId: messages.map((m) => m.id), }, include: [ { @@ -200,61 +203,79 @@ async function renderUserMessage( ], }), (async () => { - if (userMessage.userId) { - return await User.findOne({ - where: { - id: userMessage.userId, - }, - }); + const userIds = messages + .map((m) => m.userMessage?.userId) + .filter((id) => !!id) as number[]; + if (userIds.length === 0) { + return []; } - return null; + return await User.findAll({ + where: { + id: userIds, + }, + }); })(), ]); - return { - id: message.id, - sId: message.sId, - type: "user_message", - visibility: message.visibility, - version: message.version, - created: message.createdAt.getTime(), - user: user - ? { - id: user.id, - provider: user.provider, - providerId: user.providerId, - username: user.username, - email: user.email, - firstName: user.firstName, - lastName: user.lastName, - fullName: user.firstName + (user.lastName ? ` ${user.lastName}` : ""), - image: null, - workspaces: [], + return messages.map((message) => { + const messageMentions = mentions.filter((m) => m.messageId === message.id); + const messageUser = + users.find((u) => u.id === message.userMessage?.userId) || null; + + if (!message.userMessage) { + throw new Error( + "Unreachable: batchRenderUserMessages must be called with only user messages" + ); + } + + const m = { + id: message.id, + sId: message.sId, + type: "user_message", + visibility: message.visibility, + version: message.version, + created: message.createdAt.getTime(), + user: messageUser + ? { + id: messageUser.id, + provider: messageUser.provider, + providerId: messageUser.providerId, + username: messageUser.username, + email: messageUser.email, + firstName: messageUser.firstName, + lastName: messageUser.lastName, + fullName: + messageUser.firstName + + (messageUser.lastName ? ` ${messageUser.lastName}` : ""), + image: null, + workspaces: [], + } + : null, + mentions: messageMentions.map((m) => { + if (m.agentConfigurationId) { + return { + configurationId: m.agentConfigurationId, + }; } - : null, - mentions: mentions.map((m) => { - if (m.agentConfigurationId) { - return { - configurationId: m.agentConfigurationId, - }; - } - if (m.user) { - return { - provider: m.user.provider, - providerId: m.user.providerId, - }; - } - throw new Error("Unreachable: mention must be either agent or user"); - }), - content: userMessage.content, - context: { - username: userMessage.userContextUsername, - timezone: userMessage.userContextTimezone, - fullName: userMessage.userContextFullName, - email: userMessage.userContextEmail, - profilePictureUrl: userMessage.userContextProfilePictureUrl, - }, - }; + if (m.user) { + return { + provider: m.user.provider, + providerId: m.user.providerId, + }; + } + throw new Error("Unreachable: mention must be either agent or user"); + }), + content: message.userMessage.content, + context: { + username: message.userMessage.userContextUsername, + timezone: message.userMessage.userContextTimezone, + fullName: message.userMessage.userContextFullName, + email: message.userMessage.userContextEmail, + profilePictureUrl: message.userMessage.userContextProfilePictureUrl, + }, + }; + return { m, rank: message.rank, version: message.version }; + }); } async function renderAgentMessage( @@ -455,34 +476,43 @@ export async function getConversation( ], }); - const render = await Promise.all( - messages.map((message) => { - return (async () => { - if (message.userMessage) { - const m = await renderUserMessage(message, message.userMessage); - return { m, rank: message.rank, version: message.version }; - } - if (message.agentMessage) { - const m = await renderAgentMessage(auth, { - message, - agentMessage: message.agentMessage, - messages, - }); - return { m, rank: message.rank, version: message.version }; - } - if (message.contentFragment) { - const m = await renderContentFragment({ - message: message, - contentFragment: message.contentFragment, - }); - return { m, rank: message.rank, version: message.version }; - } - throw new Error( - "Unreachable: message must be either user, agent or content fragment" - ); - })(); - }) + const [userMessages] = await Promise.all([ + (async () => { + return await batchRenderUserMessages( + messages.filter((m) => !!m.userMessage) + ); + })(), + ]); + + const renderAgentAndContentFragments = await Promise.all( + messages + .filter((m) => !m.userMessage) + .map((message) => { + return (async () => { + if (message.agentMessage) { + const m = await renderAgentMessage(auth, { + message, + agentMessage: message.agentMessage, + messages, + }); + return { m, rank: message.rank, version: message.version }; + } + if (message.contentFragment) { + const m = await renderContentFragment({ + message: message, + contentFragment: message.contentFragment, + }); + return { m, rank: message.rank, version: message.version }; + } + throw new Error( + "Unreachable: message must be either user, agent or content fragment" + ); + })(); + }) ); + + const render = [...userMessages, ...renderAgentAndContentFragments]; + render.sort((a, b) => { if (a.rank !== b.rank) { return a.rank - b.rank; From 51026017110f8e821ced8d35cf90cf59d95a21f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Mon, 27 Nov 2023 16:40:29 +0100 Subject: [PATCH 2/7] Render batch for agent messages & content fragment --- front/lib/api/assistant/conversation.ts | 252 ++++++++++++++++-------- 1 file changed, 170 insertions(+), 82 deletions(-) diff --git a/front/lib/api/assistant/conversation.ts b/front/lib/api/assistant/conversation.ts index 7bfcfc2a9f0a..48380d9a5e7b 100644 --- a/front/lib/api/assistant/conversation.ts +++ b/front/lib/api/assistant/conversation.ts @@ -25,6 +25,7 @@ import { GPT_3_5_TURBO_MODEL_CONFIG } from "@app/lib/assistant"; import { Authenticator } from "@app/lib/auth"; import { front_sequelize } from "@app/lib/databases"; import { + AgentDustAppRunAction, AgentMessage, Conversation, ConversationParticipant, @@ -38,6 +39,7 @@ import { updateWorkspacePerMonthlyActiveUsersSubscriptionUsage } from "@app/lib/ import { Err, Ok, Result } from "@app/lib/result"; import { generateModelSId } from "@app/lib/utils"; import logger from "@app/logger/logger"; +import { AgentConfigurationType } from "@app/types/assistant/agent"; import { AgentMessageType, ContentFragmentContentType, @@ -57,8 +59,8 @@ import { import { PlanType } from "@app/types/plan"; import { WorkspaceType } from "@app/types/user"; -import { renderDustAppRunActionByModelId } from "./actions/dust_app_run"; import { renderRetrievalActionByModelId } from "./actions/retrieval"; +import { getGlobalAgents } from "./global_agents"; /** * Conversation Creation, update and deletion */ @@ -278,69 +280,135 @@ async function batchRenderUserMessages(messages: Message[]) { }); } -async function renderAgentMessage( +async function batchRenderAgentMessages( auth: Authenticator, - { - message, - agentMessage, - messages, - }: { message: Message; agentMessage: AgentMessage; messages: Message[] } -): Promise { - const [agentConfiguration, agentRetrievalAction, agentDustAppRunAction] = + messages: Message[] +) { + if (messages.find((m) => !m.agentMessage)) { + throw new Error( + "Unreachable: batchRenderAgentMessages must be called with only agent messages" + ); + } + + const [agentConfigurations, agentRetrievalActions, agentDustAppRunActions] = await Promise.all([ - getAgentConfiguration(auth, agentMessage.agentConfigurationId), (async () => { - if (agentMessage.agentRetrievalActionId) { - return await renderRetrievalActionByModelId( - agentMessage.agentRetrievalActionId - ); - } - return null; + const agentConfigurationIds: string[] = messages.reduce( + (acc: string[], m) => { + const agentId = m.agentMessage?.agentConfigurationId; + if (agentId && !acc.includes(agentId)) { + acc.push(agentId); + } + return acc; + }, + [] + ); + const agents = ( + await Promise.all( + agentConfigurationIds.map(async (agentConfigId) => { + return await getAgentConfiguration(auth, agentConfigId); + }) + ) + ).filter((a) => a !== null) as AgentConfigurationType[]; + const globalAgents = await getGlobalAgents(auth); + return [...globalAgents, ...agents]; })(), (async () => { - if (agentMessage.agentDustAppRunActionId) { - return await renderDustAppRunActionByModelId( - agentMessage.agentDustAppRunActionId - ); - } - return null; + const agentRetrievalActionIds: number[] = messages.reduce( + (acc: number[], m) => { + const agentId = m.agentMessage?.agentRetrievalActionId; + if (agentId && !acc.includes(agentId)) { + acc.push(agentId); + } + return acc; + }, + [] + ); + return await Promise.all( + agentRetrievalActionIds.map(async (agentRetrievalActionId) => { + return await renderRetrievalActionByModelId(agentRetrievalActionId); + }) + ); + })(), + (async () => { + const agentDustAppRunActionsIds: number[] = messages.reduce( + (acc: number[], m) => { + const agentId = m.agentMessage?.agentDustAppRunActionId; + if (agentId && !acc.includes(agentId)) { + acc.push(agentId); + } + return acc; + }, + [] + ); + const actions = await AgentDustAppRunAction.findAll({ + where: { + id: { + [Op.in]: agentDustAppRunActionsIds, + }, + }, + }); + return actions.map((action) => { + return { + id: action.id, + type: "dust_app_run_action", + appWorkspaceId: action.appWorkspaceId, + appId: action.appId, + appName: action.appName, + params: action.params, + runningBlock: null, + output: action.output, + }; + }); })(), ]); - if (!agentConfiguration) { - throw new Error( - `Configuration ${agentMessage.agentConfigurationId} not found` + return messages.map((message) => { + if (!message.agentMessage) { + throw new Error( + "Unreachable: batchRenderUserMessages must be called with only user messages" + ); + } + const agentMessage = message.agentMessage; + const action = + agentRetrievalActions.find( + (a) => a.id === agentMessage?.agentRetrievalActionId + ) ?? + agentDustAppRunActions.find( + (a) => a.id === agentMessage.agentDustAppRunActionId + ); + const agentConfiguration = agentConfigurations.find( + (a) => a.sId === message.agentMessage?.agentConfigurationId ); - } - const action = agentRetrievalAction ?? agentDustAppRunAction; + let error: { + code: string; + message: string; + } | null = null; + if (agentMessage.errorCode !== null && agentMessage.errorMessage !== null) { + error = { + code: agentMessage.errorCode, + message: agentMessage.errorMessage, + }; + } - let error: { - code: string; - message: string; - } | null = null; - if (agentMessage.errorCode !== null && agentMessage.errorMessage !== null) { - error = { - code: agentMessage.errorCode, - message: agentMessage.errorMessage, + const m = { + id: message.id, + sId: message.sId, + created: message.createdAt.getTime(), + type: "agent_message", + visibility: message.visibility, + version: message.version, + parentMessageId: + messages.find((m) => m.id === message.parentId)?.sId ?? null, + status: agentMessage.status, + action, + content: agentMessage.content, + error, + configuration: agentConfiguration, }; - } - - return { - id: message.id, - sId: message.sId, - created: message.createdAt.getTime(), - type: "agent_message", - visibility: message.visibility, - version: message.version, - parentMessageId: - messages.find((m) => m.id === message.parentId)?.sId ?? null, - status: agentMessage.status, - action, - content: agentMessage.content, - error, - configuration: agentConfiguration, - }; + return { m, rank: message.rank, version: message.version }; + }); } function renderContentFragment({ @@ -370,6 +438,43 @@ function renderContentFragment({ }; } +async function batchRenderContentFragment(messages: Message[]) { + if (messages.find((m) => !m.contentFragment)) { + throw new Error( + "Unreachable: batchRenderContentFragment must be called with only content fragments" + ); + } + + return messages.map((message) => { + if (!message.contentFragment) { + throw new Error( + "Unreachable: batchRenderContentFragment must be called with only content fragments" + ); + } + const contentFragment = message.contentFragment; + + const m = { + id: message.id, + sId: message.sId, + created: message.createdAt.getTime(), + type: "content_fragment", + visibility: message.visibility, + version: message.version, + title: contentFragment.title, + content: contentFragment.content, + url: contentFragment.url, + contentType: contentFragment.contentType, + context: { + profilePictureUrl: contentFragment.userContextProfilePictureUrl, + fullName: contentFragment.userContextFullName, + email: contentFragment.userContextEmail, + username: contentFragment.userContextUsername, + }, + }; + return { m, rank: message.rank, version: message.version }; + }); +} + export async function getUserConversations( auth: Authenticator, includeDeleted?: boolean @@ -476,43 +581,26 @@ export async function getConversation( ], }); - const [userMessages] = await Promise.all([ + const [userMessages, agentMessages, contentFragments] = await Promise.all([ (async () => { return await batchRenderUserMessages( messages.filter((m) => !!m.userMessage) ); })(), + (async () => { + return await batchRenderAgentMessages( + auth, + messages.filter((m) => !!m.agentMessage) + ); + })(), + (async () => { + return await batchRenderContentFragment( + messages.filter((m) => !!m.contentFragment) + ); + })(), ]); - const renderAgentAndContentFragments = await Promise.all( - messages - .filter((m) => !m.userMessage) - .map((message) => { - return (async () => { - if (message.agentMessage) { - const m = await renderAgentMessage(auth, { - message, - agentMessage: message.agentMessage, - messages, - }); - return { m, rank: message.rank, version: message.version }; - } - if (message.contentFragment) { - const m = await renderContentFragment({ - message: message, - contentFragment: message.contentFragment, - }); - return { m, rank: message.rank, version: message.version }; - } - throw new Error( - "Unreachable: message must be either user, agent or content fragment" - ); - })(); - }) - ); - - const render = [...userMessages, ...renderAgentAndContentFragments]; - + const render = [...userMessages, ...agentMessages, ...contentFragments]; render.sort((a, b) => { if (a.rank !== b.rank) { return a.rank - b.rank; From d2de821dfcd963a0a46c38228315cbf9eeb3225e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Mon, 27 Nov 2023 17:48:56 +0100 Subject: [PATCH 3/7] apply feedback --- front/lib/api/assistant/conversation.ts | 38 ++++++++++++------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/front/lib/api/assistant/conversation.ts b/front/lib/api/assistant/conversation.ts index 48380d9a5e7b..363ca5c537db 100644 --- a/front/lib/api/assistant/conversation.ts +++ b/front/lib/api/assistant/conversation.ts @@ -220,15 +220,14 @@ async function batchRenderUserMessages(messages: Message[]) { ]); return messages.map((message) => { - const messageMentions = mentions.filter((m) => m.messageId === message.id); - const messageUser = - users.find((u) => u.id === message.userMessage?.userId) || null; - if (!message.userMessage) { throw new Error( "Unreachable: batchRenderUserMessages must be called with only user messages" ); } + const userMessage = message.userMessage; + const messageMentions = mentions.filter((m) => m.messageId === message.id); + const user = users.find((u) => u.id === userMessage.userId) || null; const m = { id: message.id, @@ -237,18 +236,17 @@ async function batchRenderUserMessages(messages: Message[]) { visibility: message.visibility, version: message.version, created: message.createdAt.getTime(), - user: messageUser + user: user ? { - id: messageUser.id, - provider: messageUser.provider, - providerId: messageUser.providerId, - username: messageUser.username, - email: messageUser.email, - firstName: messageUser.firstName, - lastName: messageUser.lastName, + id: user.id, + provider: user.provider, + providerId: user.providerId, + username: user.username, + email: user.email, + firstName: user.firstName, + lastName: user.lastName, fullName: - messageUser.firstName + - (messageUser.lastName ? ` ${messageUser.lastName}` : ""), + user.firstName + (user.lastName ? ` ${user.lastName}` : ""), image: null, workspaces: [], } @@ -267,13 +265,13 @@ async function batchRenderUserMessages(messages: Message[]) { } throw new Error("Unreachable: mention must be either agent or user"); }), - content: message.userMessage.content, + content: userMessage.content, context: { - username: message.userMessage.userContextUsername, - timezone: message.userMessage.userContextTimezone, - fullName: message.userMessage.userContextFullName, - email: message.userMessage.userContextEmail, - profilePictureUrl: message.userMessage.userContextProfilePictureUrl, + username: userMessage.userContextUsername, + timezone: userMessage.userContextTimezone, + fullName: userMessage.userContextFullName, + email: userMessage.userContextEmail, + profilePictureUrl: userMessage.userContextProfilePictureUrl, }, }; return { m, rank: message.rank, version: message.version }; From 573027db1e5e64e6d62fe085d6904fc861fc3a7a Mon Sep 17 00:00:00 2001 From: Stanislas Polu Date: Tue, 28 Nov 2023 13:12:23 +0100 Subject: [PATCH 4/7] Batch render user message diff (#2686) * code simplification * nit * clean-up --- front/lib/api/assistant/conversation.ts | 178 ++++++++++-------------- 1 file changed, 75 insertions(+), 103 deletions(-) diff --git a/front/lib/api/assistant/conversation.ts b/front/lib/api/assistant/conversation.ts index 363ca5c537db..9ae519044ad0 100644 --- a/front/lib/api/assistant/conversation.ts +++ b/front/lib/api/assistant/conversation.ts @@ -288,78 +288,73 @@ async function batchRenderAgentMessages( ); } - const [agentConfigurations, agentRetrievalActions, agentDustAppRunActions] = - await Promise.all([ - (async () => { - const agentConfigurationIds: string[] = messages.reduce( - (acc: string[], m) => { - const agentId = m.agentMessage?.agentConfigurationId; - if (agentId && !acc.includes(agentId)) { - acc.push(agentId); - } - return acc; - }, - [] - ); - const agents = ( - await Promise.all( - agentConfigurationIds.map(async (agentConfigId) => { - return await getAgentConfiguration(auth, agentConfigId); - }) - ) - ).filter((a) => a !== null) as AgentConfigurationType[]; - const globalAgents = await getGlobalAgents(auth); - return [...globalAgents, ...agents]; - })(), - (async () => { - const agentRetrievalActionIds: number[] = messages.reduce( - (acc: number[], m) => { - const agentId = m.agentMessage?.agentRetrievalActionId; - if (agentId && !acc.includes(agentId)) { - acc.push(agentId); - } - return acc; - }, - [] - ); - return await Promise.all( - agentRetrievalActionIds.map(async (agentRetrievalActionId) => { - return await renderRetrievalActionByModelId(agentRetrievalActionId); + const [ + localAgentConfigurations, + globalAgentConfigurations, + agentRetrievalActions, + agentDustAppRunActions, + ] = await Promise.all([ + (async () => { + const agentConfigurationIds: string[] = messages.reduce( + (acc: string[], m) => { + const agentId = m.agentMessage?.agentConfigurationId; + if (agentId && !acc.includes(agentId)) { + acc.push(agentId); + } + return acc; + }, + [] + ); + const agents = ( + await Promise.all( + agentConfigurationIds.map((agentConfigId) => { + return getAgentConfiguration(auth, agentConfigId); }) - ); - })(), - (async () => { - const agentDustAppRunActionsIds: number[] = messages.reduce( - (acc: number[], m) => { - const agentId = m.agentMessage?.agentDustAppRunActionId; - if (agentId && !acc.includes(agentId)) { - acc.push(agentId); - } - return acc; - }, - [] - ); - const actions = await AgentDustAppRunAction.findAll({ - where: { - id: { - [Op.in]: agentDustAppRunActionsIds, - }, + ) + ).filter((a) => a !== null) as AgentConfigurationType[]; + return agents; + })(), + getGlobalAgents(auth), + (async () => { + return await Promise.all( + messages + .filter((m) => m.agentMessage?.agentRetrievalActionId) + .map((m) => { + return renderRetrievalActionByModelId( + m.agentMessage?.agentRetrievalActionId as number + ); + }) + ); + })(), + (async () => { + const actions = await AgentDustAppRunAction.findAll({ + where: { + id: { + [Op.in]: messages + .filter((m) => m.agentMessage?.agentDustAppRunActionId) + .map((m) => m.agentMessage?.agentDustAppRunActionId as number), }, - }); - return actions.map((action) => { - return { - id: action.id, - type: "dust_app_run_action", - appWorkspaceId: action.appWorkspaceId, - appId: action.appId, - appName: action.appName, - params: action.params, - runningBlock: null, - output: action.output, - }; - }); - })(), - ]); + }, + }); + return actions.map((action) => { + return { + id: action.id, + type: "dust_app_run_action", + appWorkspaceId: action.appWorkspaceId, + appId: action.appId, + appName: action.appName, + params: action.params, + runningBlock: null, + output: action.output, + }; + }); + })(), + ]); + + const agentConfigurations = [ + ...localAgentConfigurations, + ...globalAgentConfigurations, + ]; return messages.map((message) => { if (!message.agentMessage) { @@ -383,6 +378,7 @@ async function batchRenderAgentMessages( code: string; message: string; } | null = null; + if (agentMessage.errorCode !== null && agentMessage.errorMessage !== null) { error = { code: agentMessage.errorCode, @@ -451,25 +447,11 @@ async function batchRenderContentFragment(messages: Message[]) { } const contentFragment = message.contentFragment; - const m = { - id: message.id, - sId: message.sId, - created: message.createdAt.getTime(), - type: "content_fragment", - visibility: message.visibility, + return { + m: renderContentFragment({ message, contentFragment }), + rank: message.rank, version: message.version, - title: contentFragment.title, - content: contentFragment.content, - url: contentFragment.url, - contentType: contentFragment.contentType, - context: { - profilePictureUrl: contentFragment.userContextProfilePictureUrl, - fullName: contentFragment.userContextFullName, - email: contentFragment.userContextEmail, - username: contentFragment.userContextUsername, - }, }; - return { m, rank: message.rank, version: message.version }; }); } @@ -580,22 +562,12 @@ export async function getConversation( }); const [userMessages, agentMessages, contentFragments] = await Promise.all([ - (async () => { - return await batchRenderUserMessages( - messages.filter((m) => !!m.userMessage) - ); - })(), - (async () => { - return await batchRenderAgentMessages( - auth, - messages.filter((m) => !!m.agentMessage) - ); - })(), - (async () => { - return await batchRenderContentFragment( - messages.filter((m) => !!m.contentFragment) - ); - })(), + batchRenderUserMessages(messages.filter((m) => !!m.userMessage)), + batchRenderAgentMessages( + auth, + messages.filter((m) => !!m.agentMessage) + ), + batchRenderContentFragment(messages.filter((m) => !!m.contentFragment)), ]); const render = [...userMessages, ...agentMessages, ...contentFragments]; From 5816cb6abfb0bd944fca9548c258a7d9721a9bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Tue, 28 Nov 2023 13:14:17 +0100 Subject: [PATCH 5/7] Global agents are loaded from getAgetnConfiguration --- front/lib/api/assistant/conversation.ts | 123 +++++++++++------------- 1 file changed, 56 insertions(+), 67 deletions(-) diff --git a/front/lib/api/assistant/conversation.ts b/front/lib/api/assistant/conversation.ts index 9ae519044ad0..d4cd85d348f4 100644 --- a/front/lib/api/assistant/conversation.ts +++ b/front/lib/api/assistant/conversation.ts @@ -60,7 +60,6 @@ import { PlanType } from "@app/types/plan"; import { WorkspaceType } from "@app/types/user"; import { renderRetrievalActionByModelId } from "./actions/retrieval"; -import { getGlobalAgents } from "./global_agents"; /** * Conversation Creation, update and deletion */ @@ -288,73 +287,63 @@ async function batchRenderAgentMessages( ); } - const [ - localAgentConfigurations, - globalAgentConfigurations, - agentRetrievalActions, - agentDustAppRunActions, - ] = await Promise.all([ - (async () => { - const agentConfigurationIds: string[] = messages.reduce( - (acc: string[], m) => { - const agentId = m.agentMessage?.agentConfigurationId; - if (agentId && !acc.includes(agentId)) { - acc.push(agentId); - } - return acc; - }, - [] - ); - const agents = ( - await Promise.all( - agentConfigurationIds.map((agentConfigId) => { - return getAgentConfiguration(auth, agentConfigId); - }) - ) - ).filter((a) => a !== null) as AgentConfigurationType[]; - return agents; - })(), - getGlobalAgents(auth), - (async () => { - return await Promise.all( - messages - .filter((m) => m.agentMessage?.agentRetrievalActionId) - .map((m) => { - return renderRetrievalActionByModelId( - m.agentMessage?.agentRetrievalActionId as number - ); - }) - ); - })(), - (async () => { - const actions = await AgentDustAppRunAction.findAll({ - where: { - id: { - [Op.in]: messages - .filter((m) => m.agentMessage?.agentDustAppRunActionId) - .map((m) => m.agentMessage?.agentDustAppRunActionId as number), + const [agentConfigurations, agentRetrievalActions, agentDustAppRunActions] = + await Promise.all([ + (async () => { + const agentConfigurationIds: string[] = messages.reduce( + (acc: string[], m) => { + const agentId = m.agentMessage?.agentConfigurationId; + if (agentId && !acc.includes(agentId)) { + acc.push(agentId); + } + return acc; }, - }, - }); - return actions.map((action) => { - return { - id: action.id, - type: "dust_app_run_action", - appWorkspaceId: action.appWorkspaceId, - appId: action.appId, - appName: action.appName, - params: action.params, - runningBlock: null, - output: action.output, - }; - }); - })(), - ]); - - const agentConfigurations = [ - ...localAgentConfigurations, - ...globalAgentConfigurations, - ]; + [] + ); + const agents = ( + await Promise.all( + agentConfigurationIds.map((agentConfigId) => { + return getAgentConfiguration(auth, agentConfigId); + }) + ) + ).filter((a) => a !== null) as AgentConfigurationType[]; + return agents; + })(), + (async () => { + return await Promise.all( + messages + .filter((m) => m.agentMessage?.agentRetrievalActionId) + .map((m) => { + return renderRetrievalActionByModelId( + m.agentMessage?.agentRetrievalActionId as number + ); + }) + ); + })(), + (async () => { + const actions = await AgentDustAppRunAction.findAll({ + where: { + id: { + [Op.in]: messages + .filter((m) => m.agentMessage?.agentDustAppRunActionId) + .map((m) => m.agentMessage?.agentDustAppRunActionId as number), + }, + }, + }); + return actions.map((action) => { + return { + id: action.id, + type: "dust_app_run_action", + appWorkspaceId: action.appWorkspaceId, + appId: action.appId, + appName: action.appName, + params: action.params, + runningBlock: null, + output: action.output, + }; + }); + })(), + ]); return messages.map((message) => { if (!message.agentMessage) { From 763d7157e633ab44ede30d667eff225196eccabd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Tue, 28 Nov 2023 13:18:27 +0100 Subject: [PATCH 6/7] Update swr --- front/package-lock.json | 2 +- front/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index c41245abaa31..ce0df6bc9d4a 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -66,7 +66,7 @@ "sqlite3": "^5.1.4", "sse.js": "^0.6.1", "stripe": "^14.2.0", - "swr": "^2.0.2", + "swr": "^2.2.4", "tailwind-scrollbar-hide": "^1.1.7", "tailwindcss": "^3.2.4", "three": "^0.155.0", diff --git a/front/package.json b/front/package.json index 97ce11085123..5081b7e38123 100644 --- a/front/package.json +++ b/front/package.json @@ -74,7 +74,7 @@ "sqlite3": "^5.1.4", "sse.js": "^0.6.1", "stripe": "^14.2.0", - "swr": "^2.0.2", + "swr": "^2.2.4", "tailwind-scrollbar-hide": "^1.1.7", "tailwindcss": "^3.2.4", "three": "^0.155.0", From 1ef917237f1312c7bde33ae234b0be081912b7e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daphn=C3=A9=20Popin?= Date: Tue, 28 Nov 2023 13:43:11 +0100 Subject: [PATCH 7/7] Don't load full messages on reactions route --- front/lib/api/assistant/reaction.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/front/lib/api/assistant/reaction.ts b/front/lib/api/assistant/reaction.ts index 9dc29b0e376d..cc5e6019b833 100644 --- a/front/lib/api/assistant/reaction.ts +++ b/front/lib/api/assistant/reaction.ts @@ -24,6 +24,7 @@ export async function getMessageReactions( where: { conversationId: conversation.id, }, + attributes: ["sId"], include: [ { model: MessageReaction,