Skip to content

Commit 2b16c3e

Browse files
committed
Revert "Reduce amount of stuff we fetch on /persona (#4988)"
This reverts commit adf48de.
1 parent 8377ab3 commit 2b16c3e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+250
-408
lines changed

backend/onyx/db/persona.py

Lines changed: 15 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from collections.abc import Sequence
22
from datetime import datetime
3-
from enum import Enum
43
from uuid import UUID
54

65
from fastapi import HTTPException
@@ -12,6 +11,7 @@
1211
from sqlalchemy import update
1312
from sqlalchemy.orm import aliased
1413
from sqlalchemy.orm import joinedload
14+
from sqlalchemy.orm import selectinload
1515
from sqlalchemy.orm import Session
1616

1717
from onyx.auth.schemas import UserRole
@@ -22,7 +22,6 @@
2222
from onyx.configs.constants import NotificationType
2323
from onyx.context.search.enums import RecencyBiasSetting
2424
from onyx.db.constants import SLACK_BOT_PERSONA_PREFIX
25-
from onyx.db.models import ConnectorCredentialPair
2625
from onyx.db.models import DocumentSet
2726
from onyx.db.models import Persona
2827
from onyx.db.models import Persona__User
@@ -46,12 +45,6 @@
4645
logger = setup_logger()
4746

4847

49-
class PersonaLoadType(Enum):
50-
NONE = "none"
51-
MINIMAL = "minimal"
52-
FULL = "full"
53-
54-
5548
def _add_user_filters(
5649
stmt: Select, user: User | None, get_editable: bool = True
5750
) -> Select:
@@ -329,15 +322,16 @@ def update_persona_public_status(
329322

330323

331324
def get_personas_for_user(
332-
# defines how much of the persona to pre-load
333-
load_type: PersonaLoadType,
334325
# if user is `None` assume the user is an admin or auth is disabled
335326
user: User | None,
336327
db_session: Session,
337328
get_editable: bool = True,
338329
include_default: bool = True,
339330
include_slack_bot_personas: bool = False,
340331
include_deleted: bool = False,
332+
joinedload_all: bool = False,
333+
# a bit jank
334+
include_prompt: bool = True,
341335
) -> Sequence[Persona]:
342336
stmt = select(Persona)
343337
stmt = _add_user_filters(stmt, user, get_editable)
@@ -349,45 +343,20 @@ def get_personas_for_user(
349343
if not include_deleted:
350344
stmt = stmt.where(Persona.deleted.is_(False))
351345

352-
if load_type == PersonaLoadType.MINIMAL:
353-
# For ChatPage, only load essential relationships
354-
stmt = stmt.options(
355-
# Used for retrieval capability checking
356-
joinedload(Persona.tools),
357-
# Used for filtering
358-
joinedload(Persona.labels),
359-
# only show document sets in the UI that the assistant has access to
360-
joinedload(Persona.document_sets),
361-
joinedload(Persona.document_sets)
362-
.joinedload(DocumentSet.connector_credential_pairs)
363-
.joinedload(ConnectorCredentialPair.connector),
364-
joinedload(Persona.document_sets)
365-
.joinedload(DocumentSet.connector_credential_pairs)
366-
.joinedload(ConnectorCredentialPair.credential),
367-
# user
368-
joinedload(Persona.user),
369-
)
370-
elif load_type == PersonaLoadType.FULL:
346+
if joinedload_all:
371347
stmt = stmt.options(
372-
joinedload(Persona.user),
373-
joinedload(Persona.tools),
374-
joinedload(Persona.document_sets)
375-
.joinedload(DocumentSet.connector_credential_pairs)
376-
.joinedload(ConnectorCredentialPair.connector),
377-
joinedload(Persona.document_sets)
378-
.joinedload(DocumentSet.connector_credential_pairs)
379-
.joinedload(ConnectorCredentialPair.credential),
380-
joinedload(Persona.document_sets).joinedload(DocumentSet.users),
381-
joinedload(Persona.document_sets).joinedload(DocumentSet.groups),
382-
joinedload(Persona.groups),
383-
joinedload(Persona.users),
384-
joinedload(Persona.labels),
385-
joinedload(Persona.user_files),
386-
joinedload(Persona.user_folders),
387-
joinedload(Persona.prompts),
348+
selectinload(Persona.tools),
349+
selectinload(Persona.document_sets),
350+
selectinload(Persona.groups),
351+
selectinload(Persona.users),
352+
selectinload(Persona.labels),
353+
selectinload(Persona.user_files),
354+
selectinload(Persona.user_folders),
388355
)
356+
if include_prompt:
357+
stmt = stmt.options(selectinload(Persona.prompts))
389358

390-
results = db_session.execute(stmt).unique().scalars().all()
359+
results = db_session.execute(stmt).scalars().all()
391360
return results
392361

393362

backend/onyx/server/features/persona/api.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
from onyx.db.persona import get_personas_for_user
3030
from onyx.db.persona import mark_persona_as_deleted
3131
from onyx.db.persona import mark_persona_as_not_deleted
32-
from onyx.db.persona import PersonaLoadType
3332
from onyx.db.persona import update_all_personas_display_priority
3433
from onyx.db.persona import update_persona_is_default
3534
from onyx.db.persona import update_persona_label
@@ -46,7 +45,6 @@
4645
from onyx.server.features.persona.models import FullPersonaSnapshot
4746
from onyx.server.features.persona.models import GenerateStarterMessageRequest
4847
from onyx.server.features.persona.models import ImageGenerationToolStatus
49-
from onyx.server.features.persona.models import MinimalPersonaSnapshot
5048
from onyx.server.features.persona.models import PersonaLabelCreate
5149
from onyx.server.features.persona.models import PersonaLabelResponse
5250
from onyx.server.features.persona.models import PersonaSharedNotificationData
@@ -156,7 +154,7 @@ def list_personas_admin(
156154
user=user,
157155
get_editable=get_editable,
158156
include_deleted=include_deleted,
159-
load_type=PersonaLoadType.FULL,
157+
joinedload_all=True,
160158
)
161159
]
162160

@@ -395,13 +393,14 @@ def list_personas(
395393
db_session: Session = Depends(get_session),
396394
include_deleted: bool = False,
397395
persona_ids: list[int] = Query(None),
398-
) -> list[MinimalPersonaSnapshot]:
396+
) -> list[PersonaSnapshot]:
399397
personas = get_personas_for_user(
400-
load_type=PersonaLoadType.MINIMAL,
401398
user=user,
402399
include_deleted=include_deleted,
403400
db_session=db_session,
404401
get_editable=False,
402+
joinedload_all=True,
403+
include_prompt=False,
405404
)
406405

407406
if persona_ids:
@@ -417,8 +416,7 @@ def list_personas(
417416
)
418417
]
419418

420-
result = [MinimalPersonaSnapshot.from_model(p) for p in personas]
421-
return result
419+
return [PersonaSnapshot.from_model(p) for p in personas]
422420

423421

424422
@basic_router.get("/{persona_id}")

backend/onyx/server/features/persona/models.py

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -18,64 +18,6 @@
1818
logger = setup_logger()
1919

2020

21-
class MinimalPersonaSnapshot(BaseModel):
22-
"""Minimal persona model optimized for ChatPage.tsx - only includes fields actually used"""
23-
24-
# Core fields used by ChatPage
25-
id: int
26-
name: str
27-
description: str
28-
tools: list[ToolSnapshot]
29-
starter_messages: list[StarterMessage] | None
30-
document_sets: list[DocumentSet]
31-
llm_model_version_override: str | None
32-
llm_model_provider_override: str | None
33-
34-
uploaded_image_id: str | None
35-
icon_shape: int | None
36-
icon_color: str | None
37-
38-
is_public: bool
39-
is_visible: bool
40-
display_priority: int | None
41-
is_default_persona: bool
42-
builtin_persona: bool
43-
44-
labels: list["PersonaLabelSnapshot"]
45-
owner: MinimalUserSnapshot | None
46-
47-
@classmethod
48-
def from_model(cls, persona: Persona) -> "MinimalPersonaSnapshot":
49-
return MinimalPersonaSnapshot(
50-
# Core fields actually used by ChatPage
51-
id=persona.id,
52-
name=persona.name,
53-
description=persona.description,
54-
tools=[ToolSnapshot.from_model(tool) for tool in persona.tools],
55-
starter_messages=persona.starter_messages,
56-
document_sets=[
57-
DocumentSet.from_model(document_set)
58-
for document_set in persona.document_sets
59-
],
60-
llm_model_version_override=persona.llm_model_version_override,
61-
llm_model_provider_override=persona.llm_model_provider_override,
62-
uploaded_image_id=persona.uploaded_image_id,
63-
icon_shape=persona.icon_shape,
64-
icon_color=persona.icon_color,
65-
is_public=persona.is_public,
66-
is_visible=persona.is_visible,
67-
display_priority=persona.display_priority,
68-
is_default_persona=persona.is_default_persona,
69-
builtin_persona=persona.builtin_persona,
70-
labels=[PersonaLabelSnapshot.from_model(label) for label in persona.labels],
71-
owner=(
72-
MinimalUserSnapshot(id=persona.user.id, email=persona.user.email)
73-
if persona.user
74-
else None
75-
),
76-
)
77-
78-
7921
class PromptSnapshot(BaseModel):
8022
id: int
8123
name: str

backend/onyx/server/openai_assistants_api/asssistants_api.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from onyx.db.persona import get_persona_by_id
1818
from onyx.db.persona import get_personas_for_user
1919
from onyx.db.persona import mark_persona_as_deleted
20-
from onyx.db.persona import PersonaLoadType
2120
from onyx.db.persona import upsert_persona
2221
from onyx.db.prompts import upsert_prompt
2322
from onyx.db.tools import get_tool_by_name
@@ -245,10 +244,10 @@ def list_assistants(
245244
) -> ListAssistantsResponse:
246245
personas = list(
247246
get_personas_for_user(
248-
load_type=PersonaLoadType.FULL,
249247
user=user,
250248
db_session=db_session,
251249
get_editable=False,
250+
joinedload_all=True,
252251
)
253252
)
254253

web/src/app/admin/assistants/AssistantEditor.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ export function AssistantEditor({
258258
existingPersona?.llm_model_version_override ?? null,
259259
starter_messages: existingPersona?.starter_messages?.length
260260
? existingPersona.starter_messages
261-
: [{ message: "", name: "" }],
261+
: [{ message: "" }],
262262
enabled_tools_map: enabledToolsMap,
263263
icon_color: existingPersona?.icon_color ?? defautIconColor,
264264
icon_shape: existingPersona?.icon_shape ?? defaultIconShape,
@@ -526,8 +526,10 @@ export function AssistantEditor({
526526
// to tell the backend to not fetch any documents
527527
const numChunks = searchToolEnabled ? values.num_chunks || 25 : 0;
528528
const starterMessages = values.starter_messages
529-
.filter((message: StarterMessage) => message.message.trim() !== "")
530-
.map((message: StarterMessage) => ({
529+
.filter(
530+
(message: { message: string }) => message.message.trim() !== ""
531+
)
532+
.map((message: { message: string; name?: string }) => ({
531533
message: message.message,
532534
name: message.message,
533535
}));

web/src/app/admin/assistants/PersonaTable.tsx

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
import { FiEdit2 } from "react-icons/fi";
1818
import { TrashIcon } from "@/components/icons/icons";
1919
import { useUser } from "@/components/user/UserProvider";
20+
import { useAssistants } from "@/components/context/AssistantsContext";
2021
import { ConfirmEntityModal } from "@/components/modals/ConfirmEntityModal";
2122

2223
function PersonaTypeDisplay({ persona }: { persona: Persona }) {
@@ -39,18 +40,16 @@ function PersonaTypeDisplay({ persona }: { persona: Persona }) {
3940
return <Text>Personal {persona.owner && <>({persona.owner.email})</>}</Text>;
4041
}
4142

42-
export function PersonasTable({
43-
personas,
44-
refreshPersonas,
45-
}: {
46-
personas: Persona[];
47-
refreshPersonas: () => void;
48-
}) {
43+
export function PersonasTable() {
4944
const router = useRouter();
5045
const { popup, setPopup } = usePopup();
5146
const { refreshUser, isAdmin } = useUser();
47+
const {
48+
allAssistants: assistants,
49+
refreshAssistants,
50+
editablePersonas,
51+
} = useAssistants();
5252

53-
const editablePersonas = personas.filter((p) => !p.builtin_persona);
5453
const editablePersonaIds = useMemo(() => {
5554
return new Set(editablePersonas.map((p) => p.id.toString()));
5655
}, [editablePersonas]);
@@ -64,18 +63,18 @@ export function PersonasTable({
6463

6564
useEffect(() => {
6665
const editable = editablePersonas.sort(personaComparator);
67-
const nonEditable = personas
66+
const nonEditable = assistants
6867
.filter((p) => !editablePersonaIds.has(p.id.toString()))
6968
.sort(personaComparator);
7069
setFinalPersonas([...editable, ...nonEditable]);
71-
}, [editablePersonas, personas, editablePersonaIds]);
70+
}, [editablePersonas, assistants, editablePersonaIds]);
7271

7372
const updatePersonaOrder = async (orderedPersonaIds: UniqueIdentifier[]) => {
74-
const reorderedPersonas = orderedPersonaIds.map(
75-
(id) => personas.find((persona) => persona.id.toString() === id)!
73+
const reorderedAssistants = orderedPersonaIds.map(
74+
(id) => assistants.find((assistant) => assistant.id.toString() === id)!
7675
);
7776

78-
setFinalPersonas(reorderedPersonas);
77+
setFinalPersonas(reorderedAssistants);
7978

8079
const displayPriorityMap = new Map<UniqueIdentifier, number>();
8180
orderedPersonaIds.forEach((personaId, ind) => {
@@ -97,12 +96,12 @@ export function PersonasTable({
9796
type: "error",
9897
message: `Failed to update persona order - ${await response.text()}`,
9998
});
100-
setFinalPersonas(personas);
101-
await refreshPersonas();
99+
setFinalPersonas(assistants);
100+
await refreshAssistants();
102101
return;
103102
}
104103

105-
await refreshPersonas();
104+
await refreshAssistants();
106105
await refreshUser();
107106
};
108107

@@ -120,7 +119,7 @@ export function PersonasTable({
120119
if (personaToDelete) {
121120
const response = await deletePersona(personaToDelete.id);
122121
if (response.ok) {
123-
refreshPersonas();
122+
await refreshAssistants();
124123
closeDeleteModal();
125124
} else {
126125
setPopup({
@@ -148,7 +147,7 @@ export function PersonasTable({
148147
personaToToggleDefault.is_default_persona
149148
);
150149
if (response.ok) {
151-
refreshPersonas();
150+
await refreshAssistants();
152151
closeDefaultModal();
153152
} else {
154153
setPopup({
@@ -268,7 +267,7 @@ export function PersonasTable({
268267
persona.is_visible
269268
);
270269
if (response.ok) {
271-
refreshPersonas();
270+
await refreshAssistants();
272271
} else {
273272
setPopup({
274273
type: "error",

0 commit comments

Comments
 (0)