@@ -13,6 +13,9 @@ import { TrustedHostsInput } from '@/containers/TrustedHostsInput'
1313import { useLocalApiServer } from '@/hooks/useLocalApiServer'
1414import { WebviewWindow } from '@tauri-apps/api/webviewWindow'
1515import { useAppState } from '@/hooks/useAppState'
16+ import { useModelProvider } from '@/hooks/useModelProvider'
17+ import { startModel } from '@/services/models'
18+ import { localStorageKey } from '@/constants/localStorage'
1619import { windowKey } from '@/constants/windows'
1720import { IconLogs } from '@tabler/icons-react'
1821import { 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