From 1e7036ed90bcfbe325218215fceecc2182fde05c Mon Sep 17 00:00:00 2001 From: Li Xin Date: Wed, 23 Apr 2025 21:18:33 +0800 Subject: [PATCH] chore: add settings store --- web/src/core/store/index.ts | 1 + web/src/core/store/settings-store.ts | 58 ++++++++++++++++++++++++++++ web/src/core/store/store.ts | 11 +++--- 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 web/src/core/store/settings-store.ts diff --git a/web/src/core/store/index.ts b/web/src/core/store/index.ts index bfc8036..79d353a 100644 --- a/web/src/core/store/index.ts +++ b/web/src/core/store/index.ts @@ -2,3 +2,4 @@ // SPDX-License-Identifier: MIT export * from "./store"; +export * from "./settings-store"; diff --git a/web/src/core/store/settings-store.ts b/web/src/core/store/settings-store.ts new file mode 100644 index 0000000..7040923 --- /dev/null +++ b/web/src/core/store/settings-store.ts @@ -0,0 +1,58 @@ +import { create } from "zustand"; + +const SETTINGS_KEY = "deerflow.settings"; + +const DEFAULT_SETTINGS: SettingsState = { + general: { + maxPlanIterations: 1, + maxStepNum: 3, + }, +}; + +export type SettingsState = { + general: { + maxPlanIterations: number; + maxStepNum: number; + }; +}; + +export const useSettingsStore = create(() => ({ + ...DEFAULT_SETTINGS, +})); + +export const useSettings = (key: keyof SettingsState) => { + return useSettingsStore((state) => state[key]); +}; + +export const changeSettings = (settings: SettingsState) => { + useSettingsStore.setState(settings); +}; + +export const loadSettings = () => { + if (typeof window === "undefined") { + return; + } + const json = localStorage.getItem(SETTINGS_KEY); + if (json) { + const settings = JSON.parse(json); + for (const key in DEFAULT_SETTINGS) { + if (!(key in settings)) { + settings[key] = DEFAULT_SETTINGS[key as keyof SettingsState]; + } + } + + try { + useSettingsStore.setState(settings); + } catch (error) { + console.error(error); + } + } +}; + +export const saveSettings = () => { + const latestSettings = useSettingsStore.getState(); + const json = JSON.stringify(latestSettings); + localStorage.setItem(SETTINGS_KEY, json); +}; + +loadSettings(); diff --git a/web/src/core/store/store.ts b/web/src/core/store/store.ts index a0fbc45..82b8716 100644 --- a/web/src/core/store/store.ts +++ b/web/src/core/store/store.ts @@ -10,6 +10,8 @@ import type { Message } from "../messages"; import { mergeMessage } from "../messages"; import { parseJSON } from "../utils"; +import { useSettingsStore } from "./settings-store"; + const THREAD_ID = nanoid(); export const useStore = create<{ @@ -39,12 +41,8 @@ export const useStore = create<{ export async function sendMessage( content: string, { - maxPlanIterations = 1, - maxStepNum = 3, interruptFeedback, }: { - maxPlanIterations?: number; - maxStepNum?: number; interruptFeedback?: string; } = {}, options: { abortSignal?: AbortSignal } = {}, @@ -59,12 +57,13 @@ export async function sendMessage( setResponding(true); try { + const generalSettings = useSettingsStore.getState().general; const stream = chatStream( content, { thread_id: THREAD_ID, - max_plan_iterations: maxPlanIterations, - max_step_num: maxStepNum, + max_plan_iterations: generalSettings.maxPlanIterations, + max_step_num: generalSettings.maxStepNum, interrupt_feedback: interruptFeedback, }, options,