File size: 8,108 Bytes
376f172 dc06ee7 376f172 3578090 dff8a57 dc06ee7 42fe171 2e0d004 dc06ee7 7540325 07eaad0 506c5f2 563cdd1 506c5f2 dc06ee7 3578090 506c5f2 3578090 6e8f1c9 07eaad0 19d53d6 b2d3810 08f9fdd 07eaad0 3578090 506c5f2 07eaad0 506c5f2 07eaad0 506c5f2 29ee1c2 07eaad0 29ee1c2 beccf5b 07eaad0 dff8a57 07eaad0 dc06ee7 9982e65 506c5f2 563cdd1 506c5f2 dc06ee7 506c5f2 dc06ee7 506c5f2 dc06ee7 6e8f1c9 07eaad0 19d53d6 b2d3810 25d2520 07eaad0 3578090 07eaad0 506c5f2 3578090 29ee1c2 7540325 29ee1c2 dff8a57 a760fdf 53952fe dff8a57 b007a8e dff8a57 3578090 beccf5b 219639b beccf5b 219639b beccf5b 07eaad0 3578090 506c5f2 07eaad0 b2d3810 08f9fdd 6e8f1c9 506c5f2 29ee1c2 dff8a57 7540325 563cdd1 dc06ee7 53952fe dc06ee7 3578090 506c5f2 29ee1c2 dff8a57 7bc5b65 dff8a57 07eaad0 21e6b7d 9982e65 07eaad0 7540325 19d53d6 d1a56fa 6e8f1c9 8be533e 9d2e94f b2d3810 53952fe a760fdf 53952fe a760fdf 53952fe a760fdf 53952fe 96fe1c7 53952fe dff8a57 dc06ee7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 |
import { create } from 'zustand'
import { persist, createJSONStorage } from 'zustand/middleware'
import { createSelectors } from '@/lib/utils'
import { defaultQueryLabel } from '@/lib/constants'
import { Message, QueryRequest } from '@/api/lightrag'
type Theme = 'dark' | 'light' | 'system'
type Language = 'en' | 'zh' | 'fr' | 'ar' | 'zh_TW'
type Tab = 'documents' | 'knowledge-graph' | 'retrieval' | 'api'
interface SettingsState {
// Document manager settings
showFileName: boolean
setShowFileName: (show: boolean) => void
// Graph viewer settings
showPropertyPanel: boolean
showNodeSearchBar: boolean
showLegend: boolean
setShowLegend: (show: boolean) => void
showNodeLabel: boolean
enableNodeDrag: boolean
showEdgeLabel: boolean
enableHideUnselectedEdges: boolean
enableEdgeEvents: boolean
minEdgeSize: number
setMinEdgeSize: (size: number) => void
maxEdgeSize: number
setMaxEdgeSize: (size: number) => void
graphQueryMaxDepth: number
setGraphQueryMaxDepth: (depth: number) => void
graphMaxNodes: number
setGraphMaxNodes: (nodes: number, triggerRefresh?: boolean) => void
backendMaxGraphNodes: number | null
setBackendMaxGraphNodes: (maxNodes: number | null) => void
graphLayoutMaxIterations: number
setGraphLayoutMaxIterations: (iterations: number) => void
// Retrieval settings
queryLabel: string
setQueryLabel: (queryLabel: string) => void
retrievalHistory: Message[]
setRetrievalHistory: (history: Message[]) => void
querySettings: Omit<QueryRequest, 'query'>
updateQuerySettings: (settings: Partial<QueryRequest>) => void
// Auth settings
apiKey: string | null
setApiKey: (key: string | null) => void
// App settings
theme: Theme
setTheme: (theme: Theme) => void
language: Language
setLanguage: (lang: Language) => void
enableHealthCheck: boolean
setEnableHealthCheck: (enable: boolean) => void
currentTab: Tab
setCurrentTab: (tab: Tab) => void
}
const useSettingsStoreBase = create<SettingsState>()(
persist(
(set) => ({
theme: 'system',
language: 'en',
showPropertyPanel: true,
showNodeSearchBar: true,
showLegend: false,
showNodeLabel: true,
enableNodeDrag: true,
showEdgeLabel: false,
enableHideUnselectedEdges: true,
enableEdgeEvents: false,
minEdgeSize: 1,
maxEdgeSize: 1,
graphQueryMaxDepth: 3,
graphMaxNodes: 1000,
backendMaxGraphNodes: null,
graphLayoutMaxIterations: 15,
queryLabel: defaultQueryLabel,
enableHealthCheck: true,
apiKey: null,
currentTab: 'documents',
showFileName: false,
retrievalHistory: [],
querySettings: {
mode: 'global',
response_type: 'Multiple Paragraphs',
top_k: 40,
chunk_top_k: 10,
max_entity_tokens: 10000,
max_relation_tokens: 10000,
max_total_tokens: 32000,
only_need_context: false,
only_need_prompt: false,
stream: true,
history_turns: 3,
user_prompt: '',
enable_rerank: true
},
setTheme: (theme: Theme) => set({ theme }),
setLanguage: (language: Language) => {
set({ language })
// Update i18n after state is updated
import('i18next').then(({ default: i18n }) => {
if (i18n.language !== language) {
i18n.changeLanguage(language)
}
})
},
setGraphLayoutMaxIterations: (iterations: number) =>
set({
graphLayoutMaxIterations: iterations
}),
setQueryLabel: (queryLabel: string) =>
set({
queryLabel
}),
setGraphQueryMaxDepth: (depth: number) => set({ graphQueryMaxDepth: depth }),
setGraphMaxNodes: (nodes: number, triggerRefresh: boolean = false) => {
const state = useSettingsStore.getState();
if (state.graphMaxNodes === nodes) {
return;
}
if (triggerRefresh) {
const currentLabel = state.queryLabel;
// Atomically update both the node count and the query label to trigger a refresh.
set({ graphMaxNodes: nodes, queryLabel: '' });
// Restore the label after a short delay.
setTimeout(() => {
set({ queryLabel: currentLabel });
}, 300);
} else {
set({ graphMaxNodes: nodes });
}
},
setBackendMaxGraphNodes: (maxNodes: number | null) => set({ backendMaxGraphNodes: maxNodes }),
setMinEdgeSize: (size: number) => set({ minEdgeSize: size }),
setMaxEdgeSize: (size: number) => set({ maxEdgeSize: size }),
setEnableHealthCheck: (enable: boolean) => set({ enableHealthCheck: enable }),
setApiKey: (apiKey: string | null) => set({ apiKey }),
setCurrentTab: (tab: Tab) => set({ currentTab: tab }),
setRetrievalHistory: (history: Message[]) => set({ retrievalHistory: history }),
updateQuerySettings: (settings: Partial<QueryRequest>) =>
set((state) => ({
querySettings: { ...state.querySettings, ...settings }
})),
setShowFileName: (show: boolean) => set({ showFileName: show }),
setShowLegend: (show: boolean) => set({ showLegend: show })
}),
{
name: 'settings-storage',
storage: createJSONStorage(() => localStorage),
version: 15,
migrate: (state: any, version: number) => {
if (version < 2) {
state.showEdgeLabel = false
}
if (version < 3) {
state.queryLabel = defaultQueryLabel
}
if (version < 4) {
state.showPropertyPanel = true
state.showNodeSearchBar = true
state.showNodeLabel = true
state.enableHealthCheck = true
state.apiKey = null
}
if (version < 5) {
state.currentTab = 'documents'
}
if (version < 6) {
state.querySettings = {
mode: 'global',
response_type: 'Multiple Paragraphs',
top_k: 10,
max_token_for_text_unit: 4000,
max_token_for_global_context: 4000,
max_token_for_local_context: 4000,
only_need_context: false,
only_need_prompt: false,
stream: true,
history_turns: 3,
hl_keywords: [],
ll_keywords: []
}
state.retrievalHistory = []
}
if (version < 7) {
state.graphQueryMaxDepth = 3
state.graphLayoutMaxIterations = 15
}
if (version < 8) {
state.graphMinDegree = 0
state.language = 'en'
}
if (version < 9) {
state.showFileName = false
}
if (version < 10) {
delete state.graphMinDegree // 删除废弃参数
state.graphMaxNodes = 1000 // 添加新参数
}
if (version < 11) {
state.minEdgeSize = 1
state.maxEdgeSize = 1
}
if (version < 12) {
// Clear retrieval history to avoid compatibility issues with MessageWithError type
state.retrievalHistory = []
}
if (version < 13) {
// Add user_prompt field for older versions
if (state.querySettings) {
state.querySettings.user_prompt = ''
}
}
if (version < 14) {
// Add backendMaxGraphNodes field for older versions
state.backendMaxGraphNodes = null
}
if (version < 15) {
// Add new querySettings
state.querySettings = {
...state.querySettings,
mode: 'mix',
response_type: 'Multiple Paragraphs',
top_k: 40,
chunk_top_k: 10,
max_entity_tokens: 10000,
max_relation_tokens: 10000,
max_total_tokens: 32000,
enable_rerank: true,
history_turns: 0,
}
}
return state
}
}
)
)
const useSettingsStore = createSelectors(useSettingsStoreBase)
export { useSettingsStore, type Theme }
|