From 3cbc341b60258e892d5f887e39d7405ebe53da9f Mon Sep 17 00:00:00 2001 From: pablodanswer Date: Fri, 16 Aug 2024 18:11:04 -0700 Subject: [PATCH] Enable persistence / removal of assistant icons + remove accidental regression (#2153) * enable persistence / removal of assistant icons + remove accidental regression * simpler env seeding for web building --- backend/danswer/db/persona.py | 6 +++- .../danswer/server/features/persona/models.py | 1 + backend/ee/danswer/server/seeding.py | 7 ++-- .../app/admin/assistants/AssistantEditor.tsx | 9 ++++- web/src/app/admin/assistants/lib.ts | 4 +++ web/src/app/chat/sessionSidebar/PagesTab.tsx | 1 - .../assistants/AssistantIconCreation.tsx | 34 +++++++++++++++---- 7 files changed, 50 insertions(+), 12 deletions(-) diff --git a/backend/danswer/db/persona.py b/backend/danswer/db/persona.py index ff821e307..067ae477a 100644 --- a/backend/danswer/db/persona.py +++ b/backend/danswer/db/persona.py @@ -64,6 +64,7 @@ def create_update_persona( ) -> PersonaSnapshot: """Higher level function than upsert_persona, although either is valid to use.""" # Permission to actually use these is checked later + try: persona = upsert_persona( persona_id=persona_id, @@ -85,6 +86,7 @@ def create_update_persona( icon_color=create_persona_request.icon_color, icon_shape=create_persona_request.icon_shape, uploaded_image_id=create_persona_request.uploaded_image_id, + remove_image=create_persona_request.remove_image, ) versioned_make_persona_private = fetch_versioned_implementation( @@ -338,6 +340,7 @@ def upsert_persona( uploaded_image_id: str | None = None, display_priority: int | None = None, is_visible: bool = True, + remove_image: bool | None = None, ) -> Persona: if persona_id is not None: persona = db_session.query(Persona).filter_by(id=persona_id).first() @@ -395,7 +398,8 @@ def upsert_persona( persona.is_public = is_public persona.icon_color = icon_color persona.icon_shape = icon_shape - persona.uploaded_image_id = uploaded_image_id + if remove_image or uploaded_image_id: + persona.uploaded_image_id = uploaded_image_id persona.display_priority = display_priority persona.is_visible = is_visible diff --git a/backend/danswer/server/features/persona/models.py b/backend/danswer/server/features/persona/models.py index dbda2567e..5e2dec982 100644 --- a/backend/danswer/server/features/persona/models.py +++ b/backend/danswer/server/features/persona/models.py @@ -36,6 +36,7 @@ class CreatePersonaRequest(BaseModel): icon_color: str | None = None icon_shape: int | None = None uploaded_image_id: str | None = None # New field for uploaded image + remove_image: bool | None = None class PersonaSnapshot(BaseModel): diff --git a/backend/ee/danswer/server/seeding.py b/backend/ee/danswer/server/seeding.py index 81a745e9f..933a7ba82 100644 --- a/backend/ee/danswer/server/seeding.py +++ b/backend/ee/danswer/server/seeding.py @@ -35,7 +35,7 @@ class SeedConfiguration(BaseModel): personas: list[CreatePersonaRequest] | None = None settings: Settings | None = None enterprise_settings: EnterpriseSettings | None = None - analytics_script_key: str | None = None + # Use existing `CUSTOM_ANALYTICS_SECRET_KEY` for reference analytics_script_path: str | None = None @@ -119,13 +119,14 @@ def _seed_logo(db_session: Session, logo_path: str | None) -> None: def _seed_analytics_script(seed_config: SeedConfiguration) -> None: - if seed_config.analytics_script_path and seed_config.analytics_script_key: + custom_analytics_secret_key = os.environ.get("CUSTOM_ANALYTICS_SECRET_KEY") + if seed_config.analytics_script_path and custom_analytics_secret_key: logger.info("Seeding analytics script") try: with open(seed_config.analytics_script_path, "r") as file: script_content = file.read() analytics_script = AnalyticsScriptUpload( - script=script_content, secret_key=seed_config.analytics_script_key + script=script_content, secret_key=custom_analytics_secret_key ) store_analytics_script(analytics_script) except FileNotFoundError: diff --git a/web/src/app/admin/assistants/AssistantEditor.tsx b/web/src/app/admin/assistants/AssistantEditor.tsx index 65368f2a8..3aa73a98b 100644 --- a/web/src/app/admin/assistants/AssistantEditor.tsx +++ b/web/src/app/admin/assistants/AssistantEditor.tsx @@ -114,6 +114,7 @@ export function AssistantEditor({ const [finalPrompt, setFinalPrompt] = useState(""); const [finalPromptError, setFinalPromptError] = useState(""); + const [removePersonaImage, setRemovePersonaImage] = useState(false); const triggerFinalPromptUpdate = async ( systemPrompt: string, @@ -228,6 +229,9 @@ export function AssistantEditor({ groups: existingPersona?.groups ?? [], }; + const [existingPersonaImageId, setExistingPersonaImageId] = useState< + string | null + >(existingPersona?.uploaded_image_id || null); return (
{popup} @@ -352,6 +356,7 @@ export function AssistantEditor({ user && !checkUserIsNoAuthUser(user.id) ? [user.id] : undefined, groups, tool_ids: enabledTools, + remove_image: removePersonaImage, }); } else { [promptResponse, personaResponse] = await createPersona({ @@ -488,7 +493,9 @@ export function AssistantEditor({
diff --git a/web/src/app/admin/assistants/lib.ts b/web/src/app/admin/assistants/lib.ts index 2286180e4..613f98145 100644 --- a/web/src/app/admin/assistants/lib.ts +++ b/web/src/app/admin/assistants/lib.ts @@ -18,6 +18,7 @@ interface PersonaCreationRequest { tool_ids: number[]; icon_color: string | null; icon_shape: number | null; + remove_image?: boolean; uploaded_image: File | null; } @@ -41,6 +42,7 @@ interface PersonaUpdateRequest { tool_ids: number[]; icon_color: string | null; icon_shape: number | null; + remove_image: boolean; uploaded_image: File | null; } @@ -119,6 +121,7 @@ function buildPersonaAPIBody( tool_ids, icon_color, icon_shape, + remove_image, } = creationRequest; return { @@ -140,6 +143,7 @@ function buildPersonaAPIBody( icon_color, icon_shape, uploaded_image_id, + remove_image, }; } diff --git a/web/src/app/chat/sessionSidebar/PagesTab.tsx b/web/src/app/chat/sessionSidebar/PagesTab.tsx index 41f0637e3..ed1c3e4a1 100644 --- a/web/src/app/chat/sessionSidebar/PagesTab.tsx +++ b/web/src/app/chat/sessionSidebar/PagesTab.tsx @@ -71,7 +71,6 @@ export function PagesTab({
Chat Folders - {newFolderId ? newFolderId : "Hi"}
>; + existingPersonaImageId: string | null; setFieldValue: ( field: string, value: any, shouldValidate?: boolean ) => Promise; + setRemovePersonaImage: Dispatch>; }) => { const [uploadedImage, setUploadedImage] = useState(null); @@ -22,19 +26,37 @@ export const IconImageSelection = ({ setFieldValue("uploaded_image", image); }; + const resetPreviousAssistantImage = () => { + setRemovePersonaImage(true); + setExistingPersonaImageId(null); + }; + return (

Or Upload Image

- {existingPersona && existingPersona.uploaded_image_id && ( + {existingPersonaImageId && (
Current image:
)} - +
+ + {existingPersonaImageId && ( + + )} +

Uploading an image will override the generated icon.