import type { StateCreator } from "zustand"; import { create } from "zustand"; import { createJSONStorage, persist } from "zustand/middleware"; import { createSelectors } from "./helpers"; import type { ModelSettings } from "../types"; import { getDefaultModelSettings } from "../utils/constants"; const resetters: (() => void)[] = []; interface ModelSettingsSlice { modelSettings: ModelSettings; updateSettings: (key: Key, value: ModelSettings[Key]) => void; } const initialModelSettingsState = { modelSettings: getDefaultModelSettings(), }; const createModelSettingsSlice: StateCreator = (set) => { resetters.push(() => set(initialModelSettingsState)); return { ...initialModelSettingsState, updateSettings: (key: Key, value: ModelSettings[Key]) => { set((state) => ({ modelSettings: { ...state.modelSettings, [key]: value }, })); }, }; }; export const useModelSettingsStore = createSelectors( create()( persist( (...a) => ({ ...createModelSettingsSlice(...a), }), { name: "agentgpt-settings-storage-v2", storage: createJSONStorage(() => localStorage), partialize: (state) => ({ modelSettings: { ...state.modelSettings, customModelName: "gpt-3.5-turbo", maxTokens: Math.min(state.modelSettings.maxTokens, 4000), }, }), } ) ) ); export const resetSettings = () => resetters.forEach((resetter) => resetter());