From de4d8e9a652fffce7d2aaeb06ff1ddccaab2ce7f Mon Sep 17 00:00:00 2001 From: Weves Date: Thu, 4 Jul 2024 11:21:15 -0700 Subject: [PATCH] Fix shared chats --- web/src/app/admin/bot/[id]/page.tsx | 25 ++++++++++----- web/src/app/admin/bot/new/page.tsx | 17 ++++++---- web/src/app/assistants/gallery/page.tsx | 6 ++-- web/src/app/assistants/mine/page.tsx | 6 ++-- web/src/app/chat/page.tsx | 4 +-- .../shared/[chatId]/SharedChatDisplay.tsx | 7 ++-- web/src/app/chat/shared/[chatId]/page.tsx | 12 +++++-- web/src/app/search/page.tsx | 32 +++++++++++-------- web/src/lib/assistants/fetchAssistantsSS.ts | 12 +++++++ web/src/lib/chat/fetchChatData.ts | 27 +++++++++------- 10 files changed, 94 insertions(+), 54 deletions(-) create mode 100644 web/src/lib/assistants/fetchAssistantsSS.ts diff --git a/web/src/app/admin/bot/[id]/page.tsx b/web/src/app/admin/bot/[id]/page.tsx index 2cc5eaea18e9..625ed2548906 100644 --- a/web/src/app/admin/bot/[id]/page.tsx +++ b/web/src/app/admin/bot/[id]/page.tsx @@ -6,18 +6,28 @@ import { ErrorCallout } from "@/components/ErrorCallout"; import { DocumentSet, SlackBotConfig } from "@/lib/types"; import { Text } from "@tremor/react"; import { BackButton } from "@/components/BackButton"; -import { Persona } from "../../assistants/interfaces"; import { InstantSSRAutoRefresh } from "@/components/SSRAutoRefresh"; +import { + FetchAssistantsResponse, + fetchAssistantsSS, +} from "@/lib/assistants/fetchAssistantsSS"; async function Page({ params }: { params: { id: string } }) { const tasks = [ fetchSS("/manage/admin/slack-bot/config"), fetchSS("/manage/document-set"), - fetchSS("/persona"), + fetchAssistantsSS(), ]; - const [slackBotsResponse, documentSetsResponse, personasResponse] = - await Promise.all(tasks); + const [ + slackBotsResponse, + documentSetsResponse, + [assistants, assistantsFetchError], + ] = (await Promise.all(tasks)) as [ + Response, + Response, + FetchAssistantsResponse, + ]; if (!slackBotsResponse.ok) { return ( @@ -51,15 +61,14 @@ async function Page({ params }: { params: { id: string } }) { } const documentSets = (await documentSetsResponse.json()) as DocumentSet[]; - if (!personasResponse.ok) { + if (assistantsFetchError) { return ( ); } - const personas = (await personasResponse.json()) as Persona[]; return (
@@ -78,7 +87,7 @@ async function Page({ params }: { params: { id: string } }) {
diff --git a/web/src/app/admin/bot/new/page.tsx b/web/src/app/admin/bot/new/page.tsx index 3c4972b92771..9edd2ca63888 100644 --- a/web/src/app/admin/bot/new/page.tsx +++ b/web/src/app/admin/bot/new/page.tsx @@ -6,11 +6,15 @@ import { ErrorCallout } from "@/components/ErrorCallout"; import { DocumentSet } from "@/lib/types"; import { BackButton } from "@/components/BackButton"; import { Text } from "@tremor/react"; -import { Persona } from "../../assistants/interfaces"; +import { + FetchAssistantsResponse, + fetchAssistantsSS, +} from "@/lib/assistants/fetchAssistantsSS"; async function Page() { - const tasks = [fetchSS("/manage/document-set"), fetchSS("/persona")]; - const [documentSetsResponse, personasResponse] = await Promise.all(tasks); + const tasks = [fetchSS("/manage/document-set"), fetchAssistantsSS()]; + const [documentSetsResponse, [assistants, assistantsFetchError]] = + (await Promise.all(tasks)) as [Response, FetchAssistantsResponse]; if (!documentSetsResponse.ok) { return ( @@ -22,15 +26,14 @@ async function Page() { } const documentSets = (await documentSetsResponse.json()) as DocumentSet[]; - if (!personasResponse.ok) { + if (assistantsFetchError) { return ( ); } - const personas = (await personasResponse.json()) as Persona[]; return (
@@ -45,7 +48,7 @@ async function Page() { DanswerBot behaves in the specified channels. - +
); } diff --git a/web/src/app/assistants/gallery/page.tsx b/web/src/app/assistants/gallery/page.tsx index c4b9f46f6d02..86b9a6a8b57d 100644 --- a/web/src/app/assistants/gallery/page.tsx +++ b/web/src/app/assistants/gallery/page.tsx @@ -26,7 +26,7 @@ export default async function GalleryPage({ chatSessions, availableSources, documentSets, - personas, + assistants, tags, llmProviders, folders, @@ -46,7 +46,7 @@ export default async function GalleryPage({ chatSessions, availableSources, availableDocumentSets: documentSets, - availablePersonas: personas, + availablePersonas: assistants, availableTags: tags, llmProviders, folders, @@ -71,7 +71,7 @@ export default async function GalleryPage({
- +
diff --git a/web/src/app/assistants/mine/page.tsx b/web/src/app/assistants/mine/page.tsx index 3bbf83e17053..c1cac2273ef2 100644 --- a/web/src/app/assistants/mine/page.tsx +++ b/web/src/app/assistants/mine/page.tsx @@ -27,7 +27,7 @@ export default async function GalleryPage({ chatSessions, availableSources, documentSets, - personas, + assistants, tags, llmProviders, folders, @@ -47,7 +47,7 @@ export default async function GalleryPage({ chatSessions, availableSources, availableDocumentSets: documentSets, - availablePersonas: personas, + availablePersonas: assistants, availableTags: tags, llmProviders, folders, @@ -72,7 +72,7 @@ export default async function GalleryPage({
- +
diff --git a/web/src/app/chat/page.tsx b/web/src/app/chat/page.tsx index 5abda7bb4cb5..325da0d0cf1a 100644 --- a/web/src/app/chat/page.tsx +++ b/web/src/app/chat/page.tsx @@ -27,7 +27,7 @@ export default async function Page({ ccPairs, availableSources, documentSets, - personas, + assistants, tags, llmProviders, folders, @@ -54,7 +54,7 @@ export default async function Page({ chatSessions, availableSources, availableDocumentSets: documentSets, - availablePersonas: personas, + availablePersonas: assistants, availableTags: tags, llmProviders, folders, diff --git a/web/src/app/chat/shared/[chatId]/SharedChatDisplay.tsx b/web/src/app/chat/shared/[chatId]/SharedChatDisplay.tsx index c476d6d62006..129d76f38403 100644 --- a/web/src/app/chat/shared/[chatId]/SharedChatDisplay.tsx +++ b/web/src/app/chat/shared/[chatId]/SharedChatDisplay.tsx @@ -10,7 +10,7 @@ import { import { AIMessage, HumanMessage } from "../../message/Messages"; import { Button, Callout, Divider } from "@tremor/react"; import { useRouter } from "next/navigation"; -import { useChatContext } from "@/components/context/ChatContext"; +import { Persona } from "@/app/admin/assistants/interfaces"; function BackToDanswerButton() { const router = useRouter(); @@ -28,10 +28,11 @@ function BackToDanswerButton() { export function SharedChatDisplay({ chatSession, + availableAssistants, }: { chatSession: BackendChatSession | null; + availableAssistants: Persona[]; }) { - let { availablePersonas } = useChatContext(); if (!chatSession) { return (
@@ -46,7 +47,7 @@ export function SharedChatDisplay({ ); } - const currentPersona = availablePersonas.find( + const currentPersona = availableAssistants.find( (persona) => persona.id === chatSession.persona_id ); diff --git a/web/src/app/chat/shared/[chatId]/page.tsx b/web/src/app/chat/shared/[chatId]/page.tsx index 6555f5e4163e..37d658eeb1f0 100644 --- a/web/src/app/chat/shared/[chatId]/page.tsx +++ b/web/src/app/chat/shared/[chatId]/page.tsx @@ -9,6 +9,8 @@ import { redirect } from "next/navigation"; import { BackendChatSession } from "../../interfaces"; import { Header } from "@/components/header/Header"; import { SharedChatDisplay } from "./SharedChatDisplay"; +import { Persona } from "@/app/admin/assistants/interfaces"; +import { fetchAssistantsSS } from "@/lib/assistants/fetchAssistantsSS"; async function getSharedChat(chatId: string) { const response = await fetchSS( @@ -25,12 +27,14 @@ export default async function Page({ params }: { params: { chatId: string } }) { getAuthTypeMetadataSS(), getCurrentUserSS(), getSharedChat(params.chatId), + fetchAssistantsSS(), ]; // catch cases where the backend is completely unreachable here // without try / catch, will just raise an exception and the page // will not render - let results: (User | AuthTypeMetadata | null)[] = [null, null, null]; + let results: (User | AuthTypeMetadata | [Persona[], string | null] | null)[] = + [null, null, null]; try { results = await Promise.all(tasks); } catch (e) { @@ -39,6 +43,7 @@ export default async function Page({ params }: { params: { chatId: string } }) { const authTypeMetadata = results[0] as AuthTypeMetadata | null; const user = results[1] as User | null; const chatSession = results[2] as BackendChatSession | null; + const [availableAssistants, _] = results[3] as [Persona[], string | null]; const authDisabled = authTypeMetadata?.authType === "disabled"; if (!authDisabled && !user) { @@ -56,7 +61,10 @@ export default async function Page({ params }: { params: { chatId: string } }) {
- +
); diff --git a/web/src/app/search/page.tsx b/web/src/app/search/page.tsx index 3c674ba25366..891014b0707a 100644 --- a/web/src/app/search/page.tsx +++ b/web/src/app/search/page.tsx @@ -24,6 +24,10 @@ import { FullEmbeddingModelResponse } from "../admin/models/embedding/embeddingM import { NoSourcesModal } from "@/components/initialSetup/search/NoSourcesModal"; import { NoCompleteSourcesModal } from "@/components/initialSetup/search/NoCompleteSourceModal"; import { ChatPopup } from "../chat/ChatPopup"; +import { + FetchAssistantsResponse, + fetchAssistantsSS, +} from "@/lib/assistants/fetchAssistantsSS"; export default async function Home() { // Disable caching so we always get the up to date connector / document set / persona info @@ -36,7 +40,7 @@ export default async function Home() { getCurrentUserSS(), fetchSS("/manage/indexing-status"), fetchSS("/manage/document-set"), - fetchSS("/persona"), + fetchAssistantsSS(), fetchSS("/query/valid-tags"), fetchSS("/secondary-index/get-embedding-models"), ]; @@ -49,6 +53,7 @@ export default async function Home() { | Response | AuthTypeMetadata | FullEmbeddingModelResponse + | FetchAssistantsResponse | null )[] = [null, null, null, null, null, null]; try { @@ -60,7 +65,8 @@ export default async function Home() { const user = results[1] as User | null; const ccPairsResponse = results[2] as Response | null; const documentSetsResponse = results[3] as Response | null; - const personaResponse = results[4] as Response | null; + const [initialAssistantsList, assistantsFetchError] = + results[4] as FetchAssistantsResponse; const tagsResponse = results[5] as Response | null; const embeddingModelResponse = results[6] as Response | null; @@ -89,19 +95,17 @@ export default async function Home() { ); } - let personas: Persona[] = []; - - if (personaResponse?.ok) { - personas = await personaResponse.json(); + let assistants: Persona[] = initialAssistantsList; + if (assistantsFetchError) { + console.log(`Failed to fetch assistants - ${assistantsFetchError}`); } else { - console.log(`Failed to fetch personas - ${personaResponse?.status}`); + // remove those marked as hidden by an admin + assistants = assistants.filter((assistant) => assistant.is_visible); + // hide personas with no retrieval + assistants = assistants.filter((assistant) => assistant.num_chunks !== 0); + // sort them in priority order + assistants.sort(personaComparator); } - // remove those marked as hidden by an admin - personas = personas.filter((persona) => persona.is_visible); - // hide personas with no retrieval - personas = personas.filter((persona) => persona.num_chunks !== 0); - // sort them in priority order - personas.sort(personaComparator); let tags: Tag[] = []; if (tagsResponse?.ok) { @@ -176,7 +180,7 @@ export default async function Home() { diff --git a/web/src/lib/assistants/fetchAssistantsSS.ts b/web/src/lib/assistants/fetchAssistantsSS.ts new file mode 100644 index 000000000000..abe96eb2cc5f --- /dev/null +++ b/web/src/lib/assistants/fetchAssistantsSS.ts @@ -0,0 +1,12 @@ +import { Persona } from "@/app/admin/assistants/interfaces"; +import { fetchSS } from "../utilsSS"; + +export type FetchAssistantsResponse = [Persona[], string | null]; + +export async function fetchAssistantsSS(): Promise { + const response = await fetchSS("/persona"); + if (response.ok) { + return [(await response.json()) as Persona[], null]; + } + return [[], (await response.json()).detail || "Unknown Error"]; +} diff --git a/web/src/lib/chat/fetchChatData.ts b/web/src/lib/chat/fetchChatData.ts index c2a701fd2280..8c1c3fdc9e6c 100644 --- a/web/src/lib/chat/fetchChatData.ts +++ b/web/src/lib/chat/fetchChatData.ts @@ -22,6 +22,7 @@ import { personaComparator } from "@/app/admin/assistants/lib"; import { cookies } from "next/headers"; import { DOCUMENT_SIDEBAR_WIDTH_COOKIE_NAME } from "@/components/resizable/contants"; import { hasCompletedWelcomeFlowSS } from "@/components/initialSetup/welcome/WelcomeModalWrapper"; +import { fetchAssistantsSS } from "../assistants/fetchAssistantsSS"; interface FetchChatDataResult { user: User | null; @@ -29,7 +30,7 @@ interface FetchChatDataResult { ccPairs: CCPairBasicInfo[]; availableSources: ValidSources[]; documentSets: DocumentSet[]; - personas: Persona[]; + assistants: Persona[]; tags: Tag[]; llmProviders: LLMProviderDescriptor[]; folders: Folder[]; @@ -48,7 +49,7 @@ export async function fetchChatData(searchParams: { getCurrentUserSS(), fetchSS("/manage/indexing-status"), fetchSS("/manage/document-set"), - fetchSS("/persona?include_default=true"), + fetchAssistantsSS(), fetchSS("/chat/get-user-chat-sessions"), fetchSS("/query/valid-tags"), fetchLLMProvidersSS(), @@ -62,6 +63,7 @@ export async function fetchChatData(searchParams: { | FullEmbeddingModelResponse | Settings | LLMProviderDescriptor[] + | [Persona[], string | null] | null )[] = [null, null, null, null, null, null, null, null, null, null]; try { @@ -74,7 +76,10 @@ export async function fetchChatData(searchParams: { const user = results[1] as User | null; const ccPairsResponse = results[2] as Response | null; const documentSetsResponse = results[3] as Response | null; - const personasResponse = results[4] as Response | null; + const [rawAssistantsList, assistantsFetchError] = results[4] as [ + Persona[], + string | null, + ]; const chatSessionsResponse = results[5] as Response | null; const tagsResponse = results[6] as Response | null; const llmProviders = (results[7] || []) as LLMProviderDescriptor[]; @@ -122,17 +127,15 @@ export async function fetchChatData(searchParams: { ); } - let personas: Persona[] = []; - if (personasResponse?.ok) { - personas = await personasResponse.json(); - } else { - console.log(`Failed to fetch personas - ${personasResponse?.status}`); + let assistants = rawAssistantsList; + if (assistantsFetchError) { + console.log(`Failed to fetch assistants - ${assistantsFetchError}`); } // remove those marked as hidden by an admin - personas = personas.filter((persona) => persona.is_visible); + assistants = assistants.filter((assistant) => assistant.is_visible); // sort them in priority order - personas.sort(personaComparator); + assistants.sort(personaComparator); let tags: Tag[] = []; if (tagsResponse?.ok) { @@ -168,7 +171,7 @@ export async function fetchChatData(searchParams: { // if no connectors are setup, only show personas that are pure // passthrough and don't do any retrieval if (!hasAnyConnectors) { - personas = personas.filter((persona) => persona.num_chunks === 0); + assistants = assistants.filter((assistant) => assistant.num_chunks === 0); } let folders: Folder[] = []; @@ -189,7 +192,7 @@ export async function fetchChatData(searchParams: { ccPairs, availableSources, documentSets, - personas, + assistants, tags, llmProviders, folders,