Skip to content

Commit 39df7b2

Browse files
committed
chore: rename key runOnStartup from hooks useLocalApiServer
1 parent cfa68c5 commit 39df7b2

File tree

4 files changed

+98
-31
lines changed

4 files changed

+98
-31
lines changed

web-app/src/hooks/__tests__/useLocalApiServer.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ describe('useLocalApiServer', () => {
2424
vi.clearAllMocks()
2525
// Reset store state to defaults
2626
const store = useLocalApiServer.getState()
27-
store.setRunOnStartup(true)
27+
store.setEnableOnStartup(true)
2828
store.setServerHost('127.0.0.1')
2929
store.setServerPort(1337)
3030
store.setApiPrefix('/v1')
@@ -37,7 +37,7 @@ describe('useLocalApiServer', () => {
3737
it('should initialize with default values', () => {
3838
const { result } = renderHook(() => useLocalApiServer())
3939

40-
expect(result.current.runOnStartup).toBe(true)
40+
expect(result.current.enableOnStartup).toBe(true)
4141
expect(result.current.serverHost).toBe('127.0.0.1')
4242
expect(result.current.serverPort).toBe(1337)
4343
expect(result.current.apiPrefix).toBe('/v1')
@@ -47,21 +47,21 @@ describe('useLocalApiServer', () => {
4747
expect(result.current.apiKey).toBe('')
4848
})
4949

50-
describe('runOnStartup', () => {
50+
describe('enableOnStartup', () => {
5151
it('should set run on startup', () => {
5252
const { result } = renderHook(() => useLocalApiServer())
5353

5454
act(() => {
55-
result.current.setRunOnStartup(false)
55+
result.current.setEnableOnStartup(false)
5656
})
5757

58-
expect(result.current.runOnStartup).toBe(false)
58+
expect(result.current.enableOnStartup).toBe(false)
5959

6060
act(() => {
61-
result.current.setRunOnStartup(true)
61+
result.current.setEnableOnStartup(true)
6262
})
6363

64-
expect(result.current.runOnStartup).toBe(true)
64+
expect(result.current.enableOnStartup).toBe(true)
6565
})
6666
})
6767

@@ -323,7 +323,7 @@ describe('useLocalApiServer', () => {
323323
const { result: result2 } = renderHook(() => useLocalApiServer())
324324

325325
act(() => {
326-
result1.current.setRunOnStartup(false)
326+
result1.current.setEnableOnStartup(false)
327327
result1.current.setServerHost('0.0.0.0')
328328
result1.current.setServerPort(8080)
329329
result1.current.setApiPrefix('/api')
@@ -333,7 +333,7 @@ describe('useLocalApiServer', () => {
333333
result1.current.addTrustedHost('example.com')
334334
})
335335

336-
expect(result2.current.runOnStartup).toBe(false)
336+
expect(result2.current.enableOnStartup).toBe(false)
337337
expect(result2.current.serverHost).toBe('0.0.0.0')
338338
expect(result2.current.serverPort).toBe(8080)
339339
expect(result2.current.apiPrefix).toBe('/api')

web-app/src/hooks/useLocalApiServer.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { localStorageKey } from '@/constants/localStorage'
44

55
type LocalApiServerState = {
66
// Run local API server once app opens
7-
runOnStartup: boolean
8-
setRunOnStartup: (value: boolean) => void
7+
enableOnStartup: boolean
8+
setEnableOnStartup: (value: boolean) => void
99
// Server host option (127.0.0.1 or 0.0.0.0)
1010
serverHost: '127.0.0.1' | '0.0.0.0'
1111
setServerHost: (value: '127.0.0.1' | '0.0.0.0') => void
@@ -33,8 +33,8 @@ type LocalApiServerState = {
3333
export const useLocalApiServer = create<LocalApiServerState>()(
3434
persist(
3535
(set) => ({
36-
runOnStartup: false,
37-
setRunOnStartup: (value) => set({ runOnStartup: value }),
36+
enableOnStartup: false,
37+
setEnableOnStartup: (value) => set({ enableOnStartup: value }),
3838
serverHost: '127.0.0.1',
3939
setServerHost: (value) => set({ serverHost: value }),
4040
serverPort: 1337,

web-app/src/providers/DataProvider.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export function DataProvider() {
3636

3737
// Local API Server hooks
3838
const {
39-
runOnStartup,
39+
enableOnStartup,
4040
serverHost,
4141
serverPort,
4242
apiPrefix,
@@ -146,7 +146,7 @@ export function DataProvider() {
146146

147147
// Auto-start Local API Server on app startup if enabled
148148
useEffect(() => {
149-
if (runOnStartup) {
149+
if (enableOnStartup) {
150150
// Validate API key before starting
151151
if (!apiKey || apiKey.toString().trim().length === 0) {
152152
console.warn('Cannot start Local API Server: API key is required')

web-app/src/routes/settings/local-api-server.tsx

Lines changed: 83 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import { TrustedHostsInput } from '@/containers/TrustedHostsInput'
1313
import { useLocalApiServer } from '@/hooks/useLocalApiServer'
1414
import { WebviewWindow } from '@tauri-apps/api/webviewWindow'
1515
import { useAppState } from '@/hooks/useAppState'
16+
import { useModelProvider } from '@/hooks/useModelProvider'
17+
import { startModel } from '@/services/models'
18+
import { localStorageKey } from '@/constants/localStorage'
1619
import { windowKey } from '@/constants/windows'
1720
import { IconLogs } from '@tabler/icons-react'
1821
import { cn } from '@/lib/utils'
@@ -32,8 +35,8 @@ function LocalAPIServer() {
3235
setCorsEnabled,
3336
verboseLogs,
3437
setVerboseLogs,
35-
runOnStartup,
36-
setRunOnStartup,
38+
enableOnStartup,
39+
setEnableOnStartup,
3740
serverHost,
3841
serverPort,
3942
apiPrefix,
@@ -42,6 +45,7 @@ function LocalAPIServer() {
4245
} = useLocalApiServer()
4346

4447
const { serverStatus, setServerStatus } = useAppState()
48+
const { selectedModel, selectedProvider, getProviderByName } = useModelProvider()
4549
const [showApiKeyError, setShowApiKeyError] = useState(false)
4650
const [isApiKeyEmpty, setIsApiKeyEmpty] = useState(
4751
!apiKey || apiKey.toString().trim().length === 0
@@ -62,6 +66,54 @@ function LocalAPIServer() {
6266
setIsApiKeyEmpty(!isValid)
6367
}
6468

69+
const getLastUsedModel = (): { provider: string; model: string } | null => {
70+
try {
71+
const stored = localStorage.getItem(localStorageKey.lastUsedModel)
72+
return stored ? JSON.parse(stored) : null
73+
} catch (error) {
74+
console.debug('Failed to get last used model from localStorage:', error)
75+
return null
76+
}
77+
}
78+
79+
// Helper function to determine which model to start
80+
const getModelToStart = () => {
81+
// Use last used model if available
82+
const lastUsedModel = getLastUsedModel()
83+
if (lastUsedModel) {
84+
const provider = getProviderByName(lastUsedModel.provider)
85+
if (
86+
provider &&
87+
provider.models.some((m) => m.id === lastUsedModel.model)
88+
) {
89+
return { model: lastUsedModel.model, provider }
90+
}
91+
}
92+
93+
// Use selected model if available
94+
if (selectedModel && selectedProvider) {
95+
const provider = getProviderByName(selectedProvider)
96+
if (provider) {
97+
return { model: selectedModel.id, provider }
98+
}
99+
}
100+
101+
// Use first model from llamacpp provider
102+
const llamacppProvider = getProviderByName('llamacpp')
103+
if (
104+
llamacppProvider &&
105+
llamacppProvider.models &&
106+
llamacppProvider.models.length > 0
107+
) {
108+
return {
109+
model: llamacppProvider.models[0].id,
110+
provider: llamacppProvider,
111+
}
112+
}
113+
114+
return null
115+
}
116+
65117
const toggleAPIServer = async () => {
66118
// Validate API key before starting server
67119
if (serverStatus === 'stopped') {
@@ -70,19 +122,33 @@ function LocalAPIServer() {
70122
return
71123
}
72124
setShowApiKeyError(false)
73-
}
74125

75-
setServerStatus('pending')
76-
if (serverStatus === 'stopped') {
77-
window.core?.api
78-
?.startServer({
79-
host: serverHost,
80-
port: serverPort,
81-
prefix: apiPrefix,
82-
apiKey,
83-
trustedHosts,
84-
isCorsEnabled: corsEnabled,
85-
isVerboseEnabled: verboseLogs,
126+
const modelToStart = getModelToStart()
127+
// Only start server if we have a model to load
128+
if (!modelToStart) {
129+
console.warn(
130+
'Cannot start Local API Server: No model available to load'
131+
)
132+
return
133+
}
134+
135+
setServerStatus('pending')
136+
137+
// Start the model first
138+
startModel(modelToStart.provider, modelToStart.model)
139+
.then(() => {
140+
console.log(`Model ${modelToStart.model} started successfully`)
141+
142+
// Then start the server
143+
return window.core?.api?.startServer({
144+
host: serverHost,
145+
port: serverPort,
146+
prefix: apiPrefix,
147+
apiKey,
148+
trustedHosts,
149+
isCorsEnabled: corsEnabled,
150+
isVerboseEnabled: verboseLogs,
151+
})
86152
})
87153
.then(() => {
88154
setServerStatus('running')
@@ -92,6 +158,7 @@ function LocalAPIServer() {
92158
setServerStatus('stopped')
93159
})
94160
} else {
161+
setServerStatus('pending')
95162
window.core?.api
96163
?.stopServer()
97164
.then(() => {
@@ -208,13 +275,13 @@ function LocalAPIServer() {
208275
description={t('settings:localApiServer.runOnStartupDesc')}
209276
actions={
210277
<Switch
211-
checked={runOnStartup}
278+
checked={enableOnStartup}
212279
onCheckedChange={(checked) => {
213280
if (!apiKey || apiKey.toString().trim().length === 0) {
214281
setShowApiKeyError(true)
215282
return
216283
}
217-
setRunOnStartup(checked)
284+
setEnableOnStartup(checked)
218285
}}
219286
/>
220287
}

0 commit comments

Comments
 (0)