From bc2a322eebd8680927127bfd7995293fa4c6654e Mon Sep 17 00:00:00 2001 From: Lucas Massemin Date: Tue, 10 Dec 2024 12:14:50 +0100 Subject: [PATCH] Revert "Feedbacks for builders (#9110)" This reverts commit f726c723cc6ee24276d92f7ef0c8f778bd8ff628. --- .../components/assistant/AssistantDetails.tsx | 237 +----------------- .../assistant/conversation/AgentMessage.tsx | 35 ++- .../assistant/conversation/MessageItem.tsx | 51 +--- front/lib/api/assistant/feedback.ts | 26 -- front/lib/models/assistant/conversation.ts | 2 - .../agent_message_feedback_resource.ts | 65 +---- front/lib/swr/assistants.ts | 27 -- front/lib/swr/feedbacks.ts | 27 -- front/lib/swr/user.ts | 15 -- front/pages/api/user/[uId]/details/index.ts | 70 ------ .../agent_configurations/[aId]/feedbacks.ts | 50 ---- .../feedbacks/[fId]/conversation-context.ts | 108 -------- types/src/front/lib/error.ts | 4 +- 13 files changed, 33 insertions(+), 684 deletions(-) delete mode 100644 front/lib/swr/feedbacks.ts delete mode 100644 front/pages/api/user/[uId]/details/index.ts delete mode 100644 front/pages/api/w/[wId]/assistant/agent_configurations/[aId]/feedbacks.ts delete mode 100644 front/pages/api/w/[wId]/assistant/feedbacks/[fId]/conversation-context.ts diff --git a/front/components/assistant/AssistantDetails.tsx b/front/components/assistant/AssistantDetails.tsx index a282d0240d02..b853a294cf53 100644 --- a/front/components/assistant/AssistantDetails.tsx +++ b/front/components/assistant/AssistantDetails.tsx @@ -1,42 +1,23 @@ import { Avatar, - Button, ContentMessage, ElementModal, - HandThumbDownIcon, - HandThumbUpIcon, InformationCircleIcon, Page, - Spinner, - Tabs, - TabsContent, - TabsList, - TabsTrigger, } from "@dust-tt/sparkle"; -import type { - AgentConfigurationScope, - LightAgentConfigurationType, - LightWorkspaceType, - WorkspaceType, -} from "@dust-tt/types"; -import { ExternalLinkIcon } from "lucide-react"; -import { useCallback, useMemo, useState } from "react"; +import type { AgentConfigurationScope, WorkspaceType } from "@dust-tt/types"; +import { useCallback, useState } from "react"; import { AssistantDetailsButtonBar } from "@app/components/assistant/AssistantDetailsButtonBar"; import { AssistantActionsSection } from "@app/components/assistant/details/AssistantActionsSection"; import { AssistantUsageSection } from "@app/components/assistant/details/AssistantUsageSection"; import { ReadOnlyTextArea } from "@app/components/assistant/ReadOnlyTextArea"; import { SharingDropdown } from "@app/components/assistant_builder/Sharing"; -import type { AgentMessageFeedbackType } from "@app/lib/api/assistant/feedback"; import { useAgentConfiguration, - useAgentConfigurationFeedbacks, - useAgentConfigurationHistory, useUpdateAgentScope, } from "@app/lib/swr/assistants"; -import { useFeedbackConversationContext } from "@app/lib/swr/feedbacks"; -import { useUserDetails } from "@app/lib/swr/user"; -import { classNames, timeAgoFrom } from "@app/lib/utils"; +import { classNames } from "@app/lib/utils"; type AssistantDetailsProps = { owner: WorkspaceType; @@ -50,7 +31,6 @@ export function AssistantDetails({ owner, }: AssistantDetailsProps) { const [isUpdatingScope, setIsUpdatingScope] = useState(false); - const [activeTab, setActiveTab] = useState("info"); const { agentConfiguration } = useAgentConfiguration({ workspaceId: owner.sId, @@ -75,7 +55,7 @@ export function AssistantDetails({ return <>; } - const TopSection = () => ( + const DescriptionSection = () => (
-
- ); - - const TabsSection = () => ( - - - - - - - - - - - - - ); - - const InfoSection = () => ( -
{agentConfiguration.status === "active" && ( - -
); @@ -170,70 +121,6 @@ export function AssistantDetails({ "This assistant has no instructions." ); - const FeedbacksSection = () => { - const { - agentConfigurationFeedbacks, - isAgentConfigurationFeedbacksLoading, - } = useAgentConfigurationFeedbacks({ - workspaceId: owner.sId, - agentConfigurationId: assistantId ?? "", - }); - - const sortedFeedbacks = useMemo(() => { - if (!agentConfigurationFeedbacks) { - return null; - } - return agentConfigurationFeedbacks.sort( - (a, b) => - new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() - ); - }, [agentConfigurationFeedbacks]); - - const { agentConfigurationHistory, isAgentConfigurationHistoryLoading } = - useAgentConfigurationHistory({ - workspaceId: owner.sId, - agentConfigurationId: assistantId || "", - disabled: !assistantId, - }); - - return isAgentConfigurationFeedbacksLoading || - isAgentConfigurationHistoryLoading ? ( - - ) : ( -
- {!sortedFeedbacks || sortedFeedbacks.length === 0 || !assistantId ? ( -
No feedbacks.
- ) : ( -
- - {sortedFeedbacks.map((feedback, index) => ( -
- {index > 0 && - feedback.agentConfigurationVersion !== - sortedFeedbacks[index - 1].agentConfigurationVersion && ( - c.version === feedback.agentConfigurationVersion - )} - agentConfigurationVersion={ - feedback.agentConfigurationVersion - } - isLatestVersion={false} - /> - )} - -
- ))} -
- )} -
- ); - }; - return (
- - + + +
); } - -function AgentConfigurationVersionHeader({ - agentConfigurationVersion, - agentConfiguration, - isLatestVersion, -}: { - agentConfigurationVersion: number; - agentConfiguration: LightAgentConfigurationType | undefined; - isLatestVersion: boolean; -}) { - const getAgentConfigurationVersionString = useCallback( - (config: LightAgentConfigurationType) => { - return isLatestVersion - ? "Latest Version" - : !config.versionCreatedAt - ? `v${config.version}` - : new Date(config.versionCreatedAt).toLocaleDateString("en-US", { - year: "numeric", - month: "long", - day: "numeric", - }); - }, - [isLatestVersion] - ); - - return ( -
- - {agentConfiguration - ? getAgentConfigurationVersionString(agentConfiguration) - : `v${agentConfigurationVersion}`} - -
- ); -} - -function FeedbackCard({ - owner, - feedback, -}: { - owner: LightWorkspaceType; - feedback: AgentMessageFeedbackType; -}) { - const { userDetails } = useUserDetails(feedback.userId); - const { conversationContext } = useFeedbackConversationContext({ - workspaceId: owner.sId, - feedbackId: feedback.id.toString(), - }); - const conversationUrl = conversationContext - ? `${process.env.NEXT_PUBLIC_DUST_CLIENT_FACING_URL}/w/${owner.sId}/assistant/${conversationContext.conversationId}#${conversationContext.messageId}` - : null; - - return ( - -
-
- {userDetails?.image ? ( - - ) : ( - - )} - {userDetails?.firstName} {userDetails?.lastName} -
-
- {timeAgoFrom( - feedback.createdAt instanceof Date - ? feedback.createdAt.getTime() - : new Date(feedback.createdAt).getTime(), - { - useLongFormat: true, - } - )}{" "} - ago -
-
-
-
{feedback.content}
-
- {feedback.thumbDirection === "up" ? ( - - ) : ( - - )} -
-
- {conversationContext && conversationUrl && ( -
-
- )} -
- ); -} diff --git a/front/components/assistant/conversation/AgentMessage.tsx b/front/components/assistant/conversation/AgentMessage.tsx index 6511a13f6219..3c969244a3e0 100644 --- a/front/components/assistant/conversation/AgentMessage.tsx +++ b/front/components/assistant/conversation/AgentMessage.tsx @@ -126,27 +126,20 @@ export const FeedbackSelectorPopoverContent = ({ return ( agentLastAuthor && ( - <> -
- {agentLastAuthor?.image && ( - {agentLastAuthor?.firstName} - )} - - Your feedback will be sent to: -
- {agentLastAuthor?.firstName} {agentLastAuthor?.lastName} -
-
-
- - Your full conversation with the assistant will be shared. - -
- +
+ {agentLastAuthor?.image && ( + {agentLastAuthor?.firstName} + )} + + Your feedback will be sent to: +
+ {agentLastAuthor?.firstName} {agentLastAuthor?.lastName} +
+
) ); }; diff --git a/front/components/assistant/conversation/MessageItem.tsx b/front/components/assistant/conversation/MessageItem.tsx index 73bf6defb59e..14172841d871 100644 --- a/front/components/assistant/conversation/MessageItem.tsx +++ b/front/components/assistant/conversation/MessageItem.tsx @@ -15,8 +15,7 @@ import type { UserType, WorkspaceType, } from "@dust-tt/types"; -import { useRouter } from "next/router"; -import React, { useEffect, useState } from "react"; +import React from "react"; import { useSWRConfig } from "swr"; import { AgentMessage } from "@app/components/assistant/conversation/AgentMessage"; @@ -91,6 +90,10 @@ const MessageItem = React.forwardRef( } ); + if (message.visibility === "deleted") { + return null; + } + const messageFeedbackWithSubmit: FeedbackSelectorProps = { feedback: messageFeedback ? { @@ -102,36 +105,6 @@ const MessageItem = React.forwardRef( isSubmittingThumb, }; - const router = useRouter(); - const [hasScrolledToMessage, setHasScrolledToMessage] = useState(false); - const [highlighted, setHighlighted] = useState(false); - - // Effect: scroll to the message and temporarily highlight if it is the anchor's target - useEffect(() => { - if (!router.asPath.includes("#")) { - return; - } - const messageIdToScrollTo = router.asPath.split("#")[1]; - if (messageIdToScrollTo === sId && !hasScrolledToMessage) { - setTimeout(() => { - setHasScrolledToMessage(true); - document - .getElementById(`message-id-${sId}`) - ?.scrollIntoView({ behavior: "smooth", block: "center" }); - setHighlighted(true); - - // Highlight the message for a short time - setTimeout(() => { - setHighlighted(false); - }, 2000); - }, 100); - } - }, [hasScrolledToMessage, router.asPath, sId, ref]); - - if (message.visibility === "deleted") { - return null; - } - switch (type) { case "user_message": const citations = message.contenFragments @@ -180,12 +153,7 @@ const MessageItem = React.forwardRef( : undefined; return ( -
+
( case "agent_message": return ( -
+
> { - const feedbacksRes = - await AgentMessageFeedbackResource.fetchByAgentConfigurationId( - agentConfigurationId - ); - - const feedbacks = feedbacksRes.map( - (feedback) => - ({ - id: feedback.id, - userId: feedback.userId, - thumbDirection: feedback.thumbDirection, - content: feedback.content, - agentConfigurationVersion: feedback.agentConfigurationVersion, - agentConfigurationId: feedback.agentConfigurationId, - createdAt: feedback.createdAt, - }) as AgentMessageFeedbackType - ); - return new Ok(feedbacks); -} - export async function getConversationFeedbacksForUser( auth: Authenticator, conversation: ConversationType | ConversationWithoutContentType diff --git a/front/lib/models/assistant/conversation.ts b/front/lib/models/assistant/conversation.ts index 3bfa6c811213..cae554ffc2ba 100644 --- a/front/lib/models/assistant/conversation.ts +++ b/front/lib/models/assistant/conversation.ts @@ -366,8 +366,6 @@ AgentMessage.hasMany(AgentMessageFeedback, { UserModel.hasMany(AgentMessageFeedback, { onDelete: "SET NULL", }); -AgentMessageFeedback.belongsTo(UserModel); -AgentMessageFeedback.belongsTo(AgentMessage); export class Message extends BaseModel { declare createdAt: CreationOptional; diff --git a/front/lib/resources/agent_message_feedback_resource.ts b/front/lib/resources/agent_message_feedback_resource.ts index ff3dd2783aa7..8d47d2d712d1 100644 --- a/front/lib/resources/agent_message_feedback_resource.ts +++ b/front/lib/resources/agent_message_feedback_resource.ts @@ -7,12 +7,7 @@ import { Op } from "sequelize"; import type { AgentMessageFeedbackDirection } from "@app/lib/api/assistant/conversation/feedbacks"; import type { Authenticator } from "@app/lib/auth"; import type { AgentMessage } from "@app/lib/models/assistant/conversation"; -import { - AgentMessage as AgentMessageModel, - AgentMessageFeedback, - Conversation, - Message, -} from "@app/lib/models/assistant/conversation"; +import { AgentMessageFeedback } from "@app/lib/models/assistant/conversation"; import type { Workspace } from "@app/lib/models/workspace"; import { BaseResource } from "@app/lib/resources/base_resource"; import type { ReadonlyAttributesType } from "@app/lib/resources/storage/types"; @@ -107,21 +102,6 @@ export class AgentMessageFeedbackResource extends BaseResource { - const agentMessageFeedback = await AgentMessageFeedback.findAll({ - where: { - agentConfigurationId, - }, - order: [["agentConfigurationVersion", "DESC"]], - }); - - return agentMessageFeedback.map( - (feedback) => new this(this.model, feedback.get()) - ); - } - static async listByWorkspaceAndDateRange({ workspace, startDate, @@ -145,49 +125,6 @@ export class AgentMessageFeedbackResource extends BaseResource { - const agentMessageFeedback = await AgentMessageFeedback.findByPk( - agentMessageFeedbackId, - { - // Feedback -> AgentMessage -> Message -> Conversation - include: [ - { - model: AgentMessageModel, - attributes: ["id"], - include: [ - { - model: Message, - as: "agentMessage", - attributes: ["id", "sId"], - include: [ - { - model: Conversation, - as: "conversation", - attributes: ["sId"], - }, - ], - }, - ], - }, - ], - } - ); - - if (!agentMessageFeedback) { - return null; - } - - return { - // @ts-expect-error: sequelize cannot handle include easily - messageId: agentMessageFeedback.agent_message.agentMessage.sId, - conversationId: - // @ts-expect-error: sequelize cannot handle include easily - agentMessageFeedback.agent_message.agentMessage.conversation.sId, - }; - } - async fetchUser(): Promise { const users = await UserResource.fetchByModelIds([this.userId]); return users[0] ?? null; diff --git a/front/lib/swr/assistants.ts b/front/lib/swr/assistants.ts index ddb5c52fa63b..dc80fcded342 100644 --- a/front/lib/swr/assistants.ts +++ b/front/lib/swr/assistants.ts @@ -11,7 +11,6 @@ import { useCallback, useMemo, useState } from "react"; import type { Fetcher } from "swr"; import { useSWRConfig } from "swr"; -import type { AgentMessageFeedbackType } from "@app/lib/api/assistant/feedback"; import { fetcher, getErrorFromResponse, @@ -243,32 +242,6 @@ export function useAgentConfiguration({ }; } -export function useAgentConfigurationFeedbacks({ - workspaceId, - agentConfigurationId, -}: { - workspaceId: string; - agentConfigurationId: string | null; -}) { - const agentConfigurationFeedbacksFetcher: Fetcher<{ - feedbacks: AgentMessageFeedbackType[]; - }> = fetcher; - - const { data, error, mutate } = useSWRWithDefaults( - agentConfigurationId - ? `/api/w/${workspaceId}/assistant/agent_configurations/${agentConfigurationId}/feedbacks` - : null, - agentConfigurationFeedbacksFetcher - ); - - return { - agentConfigurationFeedbacks: data ? data.feedbacks : null, - isAgentConfigurationFeedbacksLoading: !error && !data, - isAgentConfigurationFeedbacksError: error, - mutateAgentConfigurationFeedbacks: mutate, - }; -} - export function useAgentConfigurationHistory({ workspaceId, agentConfigurationId, diff --git a/front/lib/swr/feedbacks.ts b/front/lib/swr/feedbacks.ts deleted file mode 100644 index c238793fde64..000000000000 --- a/front/lib/swr/feedbacks.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { Fetcher } from "swr"; - -import { fetcher, useSWRWithDefaults } from "@app/lib/swr/swr"; - -export function useFeedbackConversationContext({ - workspaceId, - feedbackId, -}: { - feedbackId: string; - workspaceId: string; -}) { - const feedbackFetcher: Fetcher<{ - conversationId: string; - messageId: string; - }> = fetcher; - - const { data, error } = useSWRWithDefaults( - `/api/w/${workspaceId}/assistant/feedbacks/${feedbackId}/conversation-context`, - feedbackFetcher - ); - - return { - conversationContext: data ? data : null, - isLoading: !error && !data, - isError: error, - }; -} diff --git a/front/lib/swr/user.ts b/front/lib/swr/user.ts index 635d3cfb0d43..b661938d7bbd 100644 --- a/front/lib/swr/user.ts +++ b/front/lib/swr/user.ts @@ -2,7 +2,6 @@ import type { Fetcher } from "swr"; import { fetcher, useSWRWithDefaults } from "@app/lib/swr/swr"; import type { GetUserResponseBody } from "@app/pages/api/user"; -import type { GetUserDetailsResponseBody } from "@app/pages/api/user/[uId]/details"; import type { GetUserMetadataResponseBody } from "@app/pages/api/user/metadata/[key]"; export function useUser() { @@ -31,17 +30,3 @@ export function useUserMetadata(key: string) { mutateMetadata: mutate, }; } - -export function useUserDetails(userId: number) { - const userFetcher: Fetcher = fetcher; - const { data, error } = useSWRWithDefaults( - `/api/user/${userId}/details`, - userFetcher - ); - - return { - userDetails: data, - isUserDetailsLoading: !error && !data, - isUserDetailsError: error, - }; -} diff --git a/front/pages/api/user/[uId]/details/index.ts b/front/pages/api/user/[uId]/details/index.ts deleted file mode 100644 index d0cb2872d6a7..000000000000 --- a/front/pages/api/user/[uId]/details/index.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { UserType, WithAPIErrorResponse } from "@dust-tt/types"; -import type { NextApiRequest, NextApiResponse } from "next"; - -import { withSessionAuthentication } from "@app/lib/api/auth_wrappers"; -import { UserResource } from "@app/lib/resources/user_resource"; -import { apiError } from "@app/logger/withlogging"; - -export type GetUserDetailsResponseBody = Pick< - UserType, - "firstName" | "lastName" | "image" ->; - -async function handler( - req: NextApiRequest, - res: NextApiResponse> -): Promise { - switch (req.method) { - case "GET": - const userId = req.query.uId; - if (typeof userId !== "string" || userId === "") { - return apiError(req, res, { - status_code: 400, - api_error: { - type: "invalid_request_error", - message: "The query parameter `uId` is not a string or is empty.", - }, - }); - } - - try { - parseInt(userId); - } catch (e) { - return apiError(req, res, { - status_code: 400, - api_error: { - type: "invalid_request_error", - message: "The query parameter `uId` is not a number.", - }, - }); - } - - const user = await UserResource.fetchByModelId(parseInt(userId)); - if (!user) { - return apiError(req, res, { - status_code: 404, - api_error: { - type: "user_not_found", - message: "The user was not found.", - }, - }); - } - - return res.status(200).json({ - firstName: user.firstName, - lastName: user.lastName, - image: user.imageUrl, - }); - - default: - return apiError(req, res, { - status_code: 405, - api_error: { - type: "method_not_supported_error", - message: "The method passed is not supported, GET is expected.", - }, - }); - } -} - -export default withSessionAuthentication(handler); diff --git a/front/pages/api/w/[wId]/assistant/agent_configurations/[aId]/feedbacks.ts b/front/pages/api/w/[wId]/assistant/agent_configurations/[aId]/feedbacks.ts deleted file mode 100644 index cc647de587f4..000000000000 --- a/front/pages/api/w/[wId]/assistant/agent_configurations/[aId]/feedbacks.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { WithAPIErrorResponse } from "@dust-tt/types"; -import type { NextApiRequest, NextApiResponse } from "next"; - -import { apiErrorForConversation } from "@app/lib/api/assistant/conversation/helper"; -import type { AgentMessageFeedbackType } from "@app/lib/api/assistant/feedback"; -import { getAgentConfigurationFeedbacks } from "@app/lib/api/assistant/feedback"; -import { withSessionAuthenticationForWorkspace } from "@app/lib/api/auth_wrappers"; -import { apiError } from "@app/logger/withlogging"; - -async function handler( - req: NextApiRequest, - res: NextApiResponse< - WithAPIErrorResponse<{ feedbacks: AgentMessageFeedbackType[] }> - > -): Promise { - if (!(typeof req.query.aId === "string")) { - return apiError(req, res, { - status_code: 400, - api_error: { - type: "invalid_request_error", - message: "Invalid query parameters, `aId` (string) is required.", - }, - }); - } - - switch (req.method) { - case "GET": - const feedbacksRes = await getAgentConfigurationFeedbacks(req.query.aId); - - if (feedbacksRes.isErr()) { - return apiErrorForConversation(req, res, feedbacksRes.error); - } - - const feedbacks = feedbacksRes.value; - - res.status(200).json({ feedbacks }); - return; - - default: - return apiError(req, res, { - status_code: 405, - api_error: { - type: "method_not_supported_error", - message: "The method passed is not supported, GET is expected.", - }, - }); - } -} - -export default withSessionAuthenticationForWorkspace(handler); diff --git a/front/pages/api/w/[wId]/assistant/feedbacks/[fId]/conversation-context.ts b/front/pages/api/w/[wId]/assistant/feedbacks/[fId]/conversation-context.ts deleted file mode 100644 index 50620b25c083..000000000000 --- a/front/pages/api/w/[wId]/assistant/feedbacks/[fId]/conversation-context.ts +++ /dev/null @@ -1,108 +0,0 @@ -import type { WithAPIErrorResponse } from "@dust-tt/types"; -import type { NextApiRequest, NextApiResponse } from "next"; - -import { getAgentConfiguration } from "@app/lib/api/assistant/configuration"; -import { withSessionAuthenticationForWorkspace } from "@app/lib/api/auth_wrappers"; -import { Authenticator } from "@app/lib/auth"; -import { AgentMessageFeedbackResource } from "@app/lib/resources/agent_message_feedback_resource"; -import { apiError } from "@app/logger/withlogging"; - -export type GetAgentConfigurationsResponseBody = { - conversationId: string; - messageId: string; -}; - -async function handler( - req: NextApiRequest, - res: NextApiResponse< - WithAPIErrorResponse - >, - auth: Authenticator -): Promise { - switch (req.method) { - case "GET": - const feedbackId = req.query.fId; - if (typeof feedbackId !== "string" || feedbackId === "") { - return apiError(req, res, { - status_code: 400, - api_error: { - type: "invalid_request_error", - message: "Invalid query parameters, `fId` (string) is required.", - }, - }); - } - - // Make sure that user is one of the authors - const feedback = - await AgentMessageFeedbackResource.fetchByModelId(feedbackId); - if (!feedback) { - return apiError(req, res, { - status_code: 404, - api_error: { - type: "feedback_not_found", - message: `Feedback not found for id ${feedbackId}`, - }, - }); - } - const agent = await getAgentConfiguration( - auth, - feedback.agentConfigurationId - ); - if (!agent) { - return apiError(req, res, { - status_code: 404, - api_error: { - type: "agent_configuration_not_found", - message: `Agent configuration not found for id ${feedback.agentConfigurationId}`, - }, - }); - } - if ( - !auth.canRead( - Authenticator.createResourcePermissionsFromGroupIds( - agent.requestedGroupIds - ) - ) - ) { - return apiError(req, res, { - status_code: 404, - api_error: { - type: "feedback_not_found", - message: "Feedback not found.", - }, - }); - } - - const messageAndConversation = - await AgentMessageFeedbackResource.fetchMessageAndConversationId( - feedbackId - ); - - if (!messageAndConversation) { - return apiError(req, res, { - status_code: 404, - api_error: { - type: "conversation_not_found", - message: `Conversation not found for feedback ${feedbackId}`, - }, - }); - } - - const { conversationId, messageId } = messageAndConversation; - - return res.status(200).json({ - conversationId, - messageId, - }); - default: - return apiError(req, res, { - status_code: 405, - api_error: { - type: "method_not_supported_error", - message: "The method passed is not supported, GET is expected.", - }, - }); - } -} - -export default withSessionAuthenticationForWorkspace(handler); diff --git a/types/src/front/lib/error.ts b/types/src/front/lib/error.ts index b5c9d423855c..d6e439478d80 100644 --- a/types/src/front/lib/error.ts +++ b/types/src/front/lib/error.ts @@ -103,9 +103,7 @@ export type APIErrorType = | ConversationErrorType // Plugins: | "plugin_not_found" - | "plugin_execution_failed" - // feedbacks - | "feedback_not_found"; + | "plugin_execution_failed"; export type APIError = { type: APIErrorType;