diff --git a/backend/alembic/versions/b388730a2899_nullable_preferences.py b/backend/alembic/versions/b388730a2899_nullable_preferences.py new file mode 100644 index 0000000000..ce321c9167 --- /dev/null +++ b/backend/alembic/versions/b388730a2899_nullable_preferences.py @@ -0,0 +1,31 @@ +"""nullable preferences + +Revision ID: b388730a2899 +Revises: 1a03d2c2856b +Create Date: 2025-02-17 18:49:22.643902 + +""" +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "b388730a2899" +down_revision = "1a03d2c2856b" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.alter_column("user", "temperature_override_enabled", nullable=True) + op.alter_column("user", "auto_scroll", nullable=True) + + +def downgrade() -> None: + # Ensure no null values before making columns non-nullable + op.execute( + 'UPDATE "user" SET temperature_override_enabled = false WHERE temperature_override_enabled IS NULL' + ) + op.execute('UPDATE "user" SET auto_scroll = false WHERE auto_scroll IS NULL') + + op.alter_column("user", "temperature_override_enabled", nullable=False) + op.alter_column("user", "auto_scroll", nullable=False) diff --git a/backend/onyx/db/models.py b/backend/onyx/db/models.py index 8728933cdf..be222440e4 100644 --- a/backend/onyx/db/models.py +++ b/backend/onyx/db/models.py @@ -148,11 +148,12 @@ class User(SQLAlchemyBaseUserTableUUID, Base): putting here for simpicity """ - # if specified, controls the assistants that are shown to the user + their order - # if not specified, all assistants are shown - temperature_override_enabled: Mapped[bool] = mapped_column(Boolean, default=False) - auto_scroll: Mapped[bool] = mapped_column(Boolean, default=True) + temperature_override_enabled: Mapped[bool | None] = mapped_column( + Boolean, default=None + ) + auto_scroll: Mapped[bool | None] = mapped_column(Boolean, default=None) shortcut_enabled: Mapped[bool] = mapped_column(Boolean, default=False) + chosen_assistants: Mapped[list[int] | None] = mapped_column( postgresql.JSONB(), nullable=True, default=None ) diff --git a/backend/onyx/server/manage/models.py b/backend/onyx/server/manage/models.py index 5256119abe..7d0c5a1731 100644 --- a/backend/onyx/server/manage/models.py +++ b/backend/onyx/server/manage/models.py @@ -45,9 +45,11 @@ class UserPreferences(BaseModel): hidden_assistants: list[int] = [] visible_assistants: list[int] = [] default_model: str | None = None - auto_scroll: bool | None = None pinned_assistants: list[int] | None = None shortcut_enabled: bool | None = None + + # These will default to workspace settings on the frontend if not set + auto_scroll: bool | None = None temperature_override_enabled: bool | None = None @@ -86,12 +88,12 @@ class UserInfo(BaseModel): preferences=( UserPreferences( shortcut_enabled=user.shortcut_enabled, - auto_scroll=user.auto_scroll, chosen_assistants=user.chosen_assistants, default_model=user.default_model, hidden_assistants=user.hidden_assistants, pinned_assistants=user.pinned_assistants, visible_assistants=user.visible_assistants, + auto_scroll=user.auto_scroll, temperature_override_enabled=user.temperature_override_enabled, ) ), diff --git a/backend/onyx/server/settings/models.py b/backend/onyx/server/settings/models.py index f0c542797d..515551dbc8 100644 --- a/backend/onyx/server/settings/models.py +++ b/backend/onyx/server/settings/models.py @@ -46,7 +46,9 @@ class Settings(BaseModel): application_status: ApplicationStatus = ApplicationStatus.ACTIVE anonymous_user_enabled: bool | None = None pro_search_disabled: bool | None = None - auto_scroll: bool | None = None + + temperature_override_enabled: bool = False + auto_scroll: bool = False class UserSettings(Settings): diff --git a/web/src/app/admin/settings/SettingsForm.tsx b/web/src/app/admin/settings/SettingsForm.tsx index 9e06b8ca3f..e0b7b3a15d 100644 --- a/web/src/app/admin/settings/SettingsForm.tsx +++ b/web/src/app/admin/settings/SettingsForm.tsx @@ -213,12 +213,23 @@ export function SettingsForm() { Workspace Settings handleToggleSettingsField("auto_scroll", e.target.checked) } /> + + handleToggleSettingsField( + "temperature_override_enabled", + e.target.checked + ) + } + /> { @@ -624,7 +623,6 @@ export const AgenticMessage = ({ {includeMessageSwitcher && (
{ @@ -703,52 +701,27 @@ function MessageSwitcher({ totalPages, handlePrevious, handleNext, - disableForStreaming, }: { currentPage: number; totalPages: number; handlePrevious: () => void; handleNext: () => void; - disableForStreaming?: boolean; }) { return (
- - - -
- -
-
- - {disableForStreaming ? "Disabled" : "Previous"} - -
-
+ {currentPage} / {totalPages} - {disableForStreaming ? "Complete" : "Generating"} - - - -
- -
-
- - {disableForStreaming ? "Disabled" : "Next"} - -
-
+
); } diff --git a/web/src/app/chat/modal/Inpu b/web/src/app/chat/modal/Inpu deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/web/src/app/chat/modal/InputPromptCreationComponents.tsx b/web/src/app/chat/modal/InputPromptCreationComponents.tsx deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/web/src/app/chat/modal/UserSettingsModal.tsx b/web/src/app/chat/modal/UserSettingsModal.tsx index 9a4b6d515c..678b95a26f 100644 --- a/web/src/app/chat/modal/UserSettingsModal.tsx +++ b/web/src/app/chat/modal/UserSettingsModal.tsx @@ -154,11 +154,9 @@ export function UserSettingsModal({ }); } }; - const defaultProvider = llmProviders.find( - (llmProvider) => llmProvider.is_default_provider - ); + const settings = useContext(SettingsContext); - const autoScroll = settings?.enterpriseSettings?.auto_scroll; + const autoScroll = settings?.settings?.auto_scroll; const checked = user?.preferences?.auto_scroll === null diff --git a/web/src/app/ee/admin/whitelabeling/WhitelabelingForm.tsx b/web/src/app/ee/admin/whitelabeling/WhitelabelingForm.tsx index 6ffc03b1c9..70998dce30 100644 --- a/web/src/app/ee/admin/whitelabeling/WhitelabelingForm.tsx +++ b/web/src/app/ee/admin/whitelabeling/WhitelabelingForm.tsx @@ -55,7 +55,7 @@ export function WhitelabelingForm() {
{ return ( - - - + + + {children} - - - + + + ); }; diff --git a/web/src/components/settings/lib.ts b/web/src/components/settings/lib.ts index d8994fe759..fb9f585d43 100644 --- a/web/src/components/settings/lib.ts +++ b/web/src/components/settings/lib.ts @@ -52,6 +52,7 @@ export async function fetchSettingsSS(): Promise { needs_reindexing: false, anonymous_user_enabled: false, pro_search_disabled: false, + temperature_override_enabled: true, }; } else { throw new Error( diff --git a/web/src/components/user/UserProvider.tsx b/web/src/components/user/UserProvider.tsx index 701e3181a4..6f742fa9fd 100644 --- a/web/src/components/user/UserProvider.tsx +++ b/web/src/components/user/UserProvider.tsx @@ -4,6 +4,8 @@ import React, { createContext, useContext, useState, useEffect } from "react"; import { User, UserRole } from "@/lib/types"; import { getCurrentUser } from "@/lib/user"; import { usePostHog } from "posthog-js/react"; +import { CombinedSettings } from "@/app/admin/settings/interfaces"; +import { SettingsContext } from "../settings/SettingsProvider"; interface UserContextType { user: User | null; @@ -26,14 +28,47 @@ const UserContext = createContext(undefined); export function UserProvider({ children, user, + settings, }: { children: React.ReactNode; user: User | null; + settings: CombinedSettings; }) { - const [upToDateUser, setUpToDateUser] = useState(user); - + const updatedSettings = useContext(SettingsContext); const posthog = usePostHog(); + // For auto_scroll and temperature_override_enabled: + // - If user has a preference set, use that + // - Otherwise, use the workspace setting if available + function mergeUserPreferences( + currentUser: User | null, + currentSettings: CombinedSettings | null + ): User | null { + if (!currentUser) return null; + return { + ...currentUser, + preferences: { + ...currentUser.preferences, + auto_scroll: + currentUser.preferences?.auto_scroll ?? + currentSettings?.settings?.auto_scroll ?? + false, + temperature_override_enabled: + currentUser.preferences?.temperature_override_enabled ?? + currentSettings?.settings?.temperature_override_enabled ?? + false, + }, + }; + } + + const [upToDateUser, setUpToDateUser] = useState( + mergeUserPreferences(user, settings) + ); + + useEffect(() => { + setUpToDateUser(mergeUserPreferences(user, updatedSettings)); + }, [user, updatedSettings]); + useEffect(() => { if (!posthog) return;