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,