From e2e75a2bb4edc5debb1be01d3c7787ca0f2bf278 Mon Sep 17 00:00:00 2001 From: Abhin Rustagi Date: Mon, 20 Jul 2026 17:12:24 +0530 Subject: [PATCH 1/2] fix: add model persistence --- .../src/components/cloud-chat.tsx | 6 ++-- .../src/hooks/use-persisted-model.ts | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 packages/openui-cli/src/templates/openui-cloud/src/hooks/use-persisted-model.ts diff --git a/packages/openui-cli/src/templates/openui-cloud/src/components/cloud-chat.tsx b/packages/openui-cli/src/templates/openui-cloud/src/components/cloud-chat.tsx index 337f5c9f6..d482cc1a3 100644 --- a/packages/openui-cli/src/templates/openui-cloud/src/components/cloud-chat.tsx +++ b/packages/openui-cli/src/templates/openui-cloud/src/components/cloud-chat.tsx @@ -1,9 +1,9 @@ "use client"; +import { usePersistedModel } from "@/hooks/use-persisted-model"; import { useTheme } from "@/hooks/use-system-theme"; import { shouldShowBillingCreditsNotice } from "@/lib/billing"; import { createCloudChatLLM } from "@/lib/cloud-chat-llm"; -import { DEFAULT_MODEL } from "@/lib/models"; import { defineArtifactCategories } from "@openuidev/react-headless"; import { AgentInterface } from "@openuidev/react-ui"; import { @@ -25,7 +25,7 @@ const showBillingCreditsNotice = shouldShowBillingCreditsNotice(); export function CloudChat() { const mode = useTheme(); - const [selectedModel, setSelectedModel] = useState(DEFAULT_MODEL); + const [selectedModel, setSelectedModel] = usePersistedModel(); const [billingDialogOpen, setBillingDialogOpen] = useState(false); const [billingCreditsRequired, setBillingCreditsRequired] = useState(false); const [llm] = useState(() => @@ -54,7 +54,7 @@ export function CloudChat() { const handleModelChange = useCallback((model: string) => { llm.setSelectedModel(model); setSelectedModel(model); - }, [llm]); + }, [llm, setSelectedModel]); return (
void] { + const [model, setModel] = useState(DEFAULT_MODEL); + + // Restore after mount: reading localStorage during render would make the + // server-rendered HTML differ from the client's and break hydration. + useLayoutEffect(() => { + try { + const stored = window.localStorage.getItem(STORAGE_KEY); + if (stored && MODEL_OPTIONS.some((option) => option.id === stored)) { + setModel(stored); + } + } catch { + // localStorage unavailable; fall back to the default model + } + }, []); + + const selectModel = useCallback((next: string) => { + setModel(next); + try { + window.localStorage.setItem(STORAGE_KEY, next); + } catch { + // persistence is best-effort; the in-memory selection still applies + } + }, []); + + return [model, selectModel]; +} From f42980c0debd0142e882cf906acc9f80c8319346 Mon Sep 17 00:00:00 2001 From: Abhin Rustagi Date: Wed, 22 Jul 2026 00:53:34 +0530 Subject: [PATCH 2/2] chore: version bump --- packages/openui-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openui-cli/package.json b/packages/openui-cli/package.json index 77bf982d1..3c810e859 100644 --- a/packages/openui-cli/package.json +++ b/packages/openui-cli/package.json @@ -1,6 +1,6 @@ { "name": "@openuidev/cli", - "version": "0.1.8", + "version": "0.1.9", "description": "CLI for OpenUI — scaffold generative UI chat apps and generate LLM system prompts from component libraries", "bin": { "openui": "dist/index.js"