Skip to content

Commit e860387

Browse files
Wevesaponcedeleonch
authored andcommitted
fix: improve assistant fetching efficiency (onyx-dot-app#5047)
* Improve assistant fetching efficiency * More fix * Fix weird build stuff * Improve
1 parent 359c78f commit e860387

File tree

6 files changed

+24
-129
lines changed

6 files changed

+24
-129
lines changed

web/src/app/ee/admin/performance/usage/PersonaMessagesChart.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
usePersonaMessages,
66
usePersonaUniqueUsers,
77
} from "../lib";
8-
import { useAssistants } from "@/components/context/AssistantsContext";
98
import { DateRangePickerValue } from "@/components/dateRangeSelectors/AdminDateRangeSelector";
109
import Text from "@/components/ui/text";
1110
import Title from "@/components/ui/title";
@@ -19,18 +18,20 @@ import {
1918
SelectValue,
2019
} from "@/components/ui/select";
2120
import { useState, useMemo, useEffect } from "react";
21+
import { Persona } from "@/app/admin/assistants/interfaces";
2222

2323
export function PersonaMessagesChart({
24+
availablePersonas,
2425
timeRange,
2526
}: {
27+
availablePersonas: Persona[];
2628
timeRange: DateRangePickerValue;
2729
}) {
2830
const [selectedPersonaId, setSelectedPersonaId] = useState<
2931
number | undefined
3032
>(undefined);
3133
const [searchQuery, setSearchQuery] = useState("");
3234
const [highlightedIndex, setHighlightedIndex] = useState(-1);
33-
const { allAssistants: personaList } = useAssistants();
3435

3536
const {
3637
data: personaMessagesData,
@@ -48,11 +49,11 @@ export function PersonaMessagesChart({
4849
const hasError = personaMessagesError || personaUniqueUsersError;
4950

5051
const filteredPersonaList = useMemo(() => {
51-
if (!personaList) return [];
52-
return personaList.filter((persona) =>
52+
if (!availablePersonas) return [];
53+
return availablePersonas.filter((persona) =>
5354
persona.name.toLowerCase().includes(searchQuery.toLowerCase())
5455
);
55-
}, [personaList, searchQuery]);
56+
}, [availablePersonas, searchQuery]);
5657

5758
const handleKeyDown = (e: React.KeyboardEvent) => {
5859
e.stopPropagation();
@@ -142,7 +143,7 @@ export function PersonaMessagesChart({
142143
<ThreeDotsLoader />
143144
</div>
144145
);
145-
} else if (!personaList || hasError) {
146+
} else if (!availablePersonas || hasError) {
146147
content = (
147148
<div className="h-80 text-red-600 text-bold flex flex-col">
148149
<p className="m-auto">Failed to fetch data...</p>

web/src/app/ee/admin/performance/usage/page.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ import { AdminPageTitle } from "@/components/admin/Title";
1010
import { FiActivity } from "react-icons/fi";
1111
import UsageReports from "./UsageReports";
1212
import { Separator } from "@/components/ui/separator";
13+
import { useAdminPersonas } from "@/app/admin/assistants/hooks";
1314

1415
export default function AnalyticsPage() {
1516
const [timeRange, setTimeRange] = useTimeRange();
17+
const { personas } = useAdminPersonas();
1618

1719
return (
1820
<main className="pt-4 mx-auto container">
@@ -27,7 +29,10 @@ export default function AnalyticsPage() {
2729
<QueryPerformanceChart timeRange={timeRange} />
2830
<FeedbackChart timeRange={timeRange} />
2931
<OnyxBotChart timeRange={timeRange} />
30-
<PersonaMessagesChart timeRange={timeRange} />
32+
<PersonaMessagesChart
33+
availablePersonas={personas}
34+
timeRange={timeRange}
35+
/>
3136
<Separator />
3237
<UsageReports />
3338
</main>

web/src/app/layout.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import {
1717
EnterpriseSettings,
1818
ApplicationStatus,
1919
} from "./admin/settings/interfaces";
20-
import { fetchAssistantData } from "@/lib/chat/fetchAssistantdata";
2120
import { AppProvider } from "@/components/context/AppProvider";
2221
import { PHProvider } from "./providers";
2322
import { getAuthTypeMetadataSS, getCurrentUserSS } from "@/lib/userSS";
@@ -31,6 +30,7 @@ import { DocumentsProvider } from "./chat/my-documents/DocumentsContext";
3130
import CloudError from "@/components/errorPages/CloudErrorPage";
3231
import Error from "@/components/errorPages/ErrorPage";
3332
import AccessRestrictedPage from "@/components/errorPages/AccessRestrictedPage";
33+
import { fetchAssistantData } from "@/lib/chat/fetchAssistantdata";
3434

3535
const inter = Inter({
3636
subsets: ["latin"],
@@ -71,7 +71,7 @@ export default async function RootLayout({
7171
}: {
7272
children: React.ReactNode;
7373
}) {
74-
const [combinedSettings, assistantsData, user, authTypeMetadata] =
74+
const [combinedSettings, assistants, user, authTypeMetadata] =
7575
await Promise.all([
7676
fetchSettingsSS(),
7777
fetchAssistantData(),
@@ -145,17 +145,12 @@ export default async function RootLayout({
145145
);
146146
}
147147

148-
const { assistants, hasAnyConnectors, hasImageCompatibleModel } =
149-
assistantsData;
150-
151148
return getPageContent(
152149
<AppProvider
153150
authTypeMetadata={authTypeMetadata}
154151
user={user}
155152
settings={combinedSettings}
156153
assistants={assistants}
157-
hasAnyConnectors={hasAnyConnectors}
158-
hasImageCompatibleModel={hasImageCompatibleModel}
159154
>
160155
<DocumentsProvider>
161156
<Suspense fallback={null}>

web/src/components/context/AppProvider.tsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ interface AppProviderProps {
1414
user: User | null;
1515
settings: CombinedSettings;
1616
assistants: MinimalPersonaSnapshot[];
17-
hasAnyConnectors: boolean;
18-
hasImageCompatibleModel: boolean;
1917
authTypeMetadata: AuthTypeMetadata;
2018
}
2119

@@ -24,8 +22,6 @@ export const AppProvider = ({
2422
user,
2523
settings,
2624
assistants,
27-
hasAnyConnectors,
28-
hasImageCompatibleModel,
2925
authTypeMetadata,
3026
}: AppProviderProps) => {
3127
return (
@@ -36,11 +32,7 @@ export const AppProvider = ({
3632
authTypeMetadata={authTypeMetadata}
3733
>
3834
<ProviderContextProvider>
39-
<AssistantsProvider
40-
initialAssistants={assistants}
41-
hasAnyConnectors={hasAnyConnectors}
42-
hasImageCompatibleModel={hasImageCompatibleModel}
43-
>
35+
<AssistantsProvider initialAssistants={assistants}>
4436
<ModalProvider user={user}>{children}</ModalProvider>
4537
</AssistantsProvider>
4638
</ProviderContextProvider>

web/src/components/context/AssistantsContext.tsx

Lines changed: 3 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ interface AssistantsContextProps {
2525
ownedButHiddenAssistants: MinimalPersonaSnapshot[];
2626
refreshAssistants: () => Promise<void>;
2727
isImageGenerationAvailable: boolean;
28-
// Admin only
29-
editablePersonas: MinimalPersonaSnapshot[];
30-
allAssistants: MinimalPersonaSnapshot[];
3128
pinnedAssistants: MinimalPersonaSnapshot[];
3229
setPinnedAssistants: Dispatch<SetStateAction<MinimalPersonaSnapshot[]>>;
3330
}
@@ -41,22 +38,11 @@ export const AssistantsProvider: React.FC<{
4138
initialAssistants: MinimalPersonaSnapshot[];
4239
hasAnyConnectors?: boolean;
4340
hasImageCompatibleModel?: boolean;
44-
}> = ({
45-
children,
46-
initialAssistants,
47-
hasAnyConnectors,
48-
hasImageCompatibleModel,
49-
}) => {
41+
}> = ({ children, initialAssistants }) => {
5042
const [assistants, setAssistants] = useState<MinimalPersonaSnapshot[]>(
5143
initialAssistants || []
5244
);
53-
const { user, isAdmin, isCurator } = useUser();
54-
const [editablePersonas, setEditablePersonas] = useState<
55-
MinimalPersonaSnapshot[]
56-
>([]);
57-
const [allAssistants, setAllAssistants] = useState<MinimalPersonaSnapshot[]>(
58-
[]
59-
);
45+
const { user } = useUser();
6046

6147
const [pinnedAssistants, setPinnedAssistants] = useState<
6248
MinimalPersonaSnapshot[]
@@ -107,37 +93,6 @@ export const AssistantsProvider: React.FC<{
10793
checkImageGenerationAvailability();
10894
}, []);
10995

110-
const fetchPersonas = async () => {
111-
if (!isAdmin && !isCurator) {
112-
return;
113-
}
114-
115-
try {
116-
const [editableResponse, allResponse] = await Promise.all([
117-
fetch("/api/admin/persona?get_editable=true"),
118-
fetch("/api/admin/persona"),
119-
]);
120-
121-
if (editableResponse.ok) {
122-
const editablePersonas = await editableResponse.json();
123-
setEditablePersonas(editablePersonas);
124-
}
125-
126-
if (allResponse.ok) {
127-
const allPersonas = await allResponse.json();
128-
setAllAssistants(allPersonas);
129-
} else {
130-
console.error("Error fetching personas:", allResponse);
131-
}
132-
} catch (error) {
133-
console.error("Error fetching personas:", error);
134-
}
135-
};
136-
137-
useEffect(() => {
138-
fetchPersonas();
139-
}, [isAdmin, isCurator]);
140-
14196
const refreshAssistants = async () => {
14297
try {
14398
const response = await fetch("/api/persona", {
@@ -148,13 +103,7 @@ export const AssistantsProvider: React.FC<{
148103
});
149104
if (!response.ok) throw new Error("Failed to fetch assistants");
150105
let assistants: MinimalPersonaSnapshot[] = await response.json();
151-
152-
let filteredAssistants = filterAssistants(assistants);
153-
154-
setAssistants(filteredAssistants);
155-
156-
// Fetch and update allAssistants for admins and curators
157-
await fetchPersonas();
106+
setAssistants(filterAssistants(assistants));
158107
} catch (error) {
159108
console.error("Error refreshing assistants:", error);
160109
}
@@ -197,8 +146,6 @@ export const AssistantsProvider: React.FC<{
197146
finalAssistants,
198147
ownedButHiddenAssistants,
199148
refreshAssistants,
200-
editablePersonas,
201-
allAssistants,
202149
isImageGenerationAvailable,
203150
setPinnedAssistants,
204151
pinnedAssistants,
Lines changed: 5 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,20 @@
1-
import { fetchSS } from "@/lib/utilsSS";
21
import { MinimalPersonaSnapshot } from "@/app/admin/assistants/interfaces";
3-
import { fetchLLMProvidersSS } from "@/lib/llm/fetchLLMs";
42
import { fetchAssistantsSS } from "../assistants/fetchAssistantsSS";
5-
import { modelSupportsImageInput } from "../llm/utils";
63
import { filterAssistants } from "../assistants/utils";
74

8-
interface AssistantData {
9-
assistants: MinimalPersonaSnapshot[];
10-
hasAnyConnectors: boolean;
11-
hasImageCompatibleModel: boolean;
12-
}
13-
export async function fetchAssistantData(): Promise<AssistantData> {
14-
// Default state if anything fails
15-
const defaultState: AssistantData = {
16-
assistants: [],
17-
hasAnyConnectors: false,
18-
hasImageCompatibleModel: false,
19-
};
20-
5+
export async function fetchAssistantData(): Promise<MinimalPersonaSnapshot[]> {
216
try {
22-
// Fetch core assistants data first
7+
// Fetch core assistants data
238
const [assistants, assistantsFetchError] = await fetchAssistantsSS();
249
if (assistantsFetchError) {
2510
// This is not a critical error and occurs when the user is not logged in
2611
console.warn(`Failed to fetch assistants - ${assistantsFetchError}`);
27-
return defaultState;
12+
return [];
2813
}
2914

30-
// Parallel fetch of additional data
31-
const [ccPairsResponse, llmProviders] = await Promise.all([
32-
fetchSS("/manage/connector-status").catch((error) => {
33-
console.error("Failed to fetch connectors:", error);
34-
return null;
35-
}),
36-
fetchLLMProvidersSS().catch((error) => {
37-
console.error("Failed to fetch LLM providers:", error);
38-
return [];
39-
}),
40-
]);
41-
42-
const hasAnyConnectors = ccPairsResponse?.ok
43-
? (await ccPairsResponse.json()).length > 0
44-
: false;
45-
46-
const hasImageCompatibleModel = llmProviders.some(
47-
(provider) =>
48-
provider.provider === "openai" ||
49-
provider.model_configurations.some((modelConfiguration) =>
50-
modelSupportsImageInput(llmProviders, modelConfiguration.name)
51-
)
52-
);
53-
54-
let filteredAssistants = filterAssistants(assistants);
55-
56-
return {
57-
assistants: filteredAssistants,
58-
hasAnyConnectors,
59-
hasImageCompatibleModel,
60-
};
15+
return filterAssistants(assistants);
6116
} catch (error) {
6217
console.error("Unexpected error in fetchAssistantData:", error);
63-
return defaultState;
18+
return [];
6419
}
6520
}

0 commit comments

Comments
 (0)