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;