feat(ai-chat): add connection status badge to chat

This commit is contained in:
Henry Estela 2026-03-20 13:40:58 -07:00
parent fb1a55947d
commit c45236912e
No known key found for this signature in database
GPG Key ID: 90439853E9E235BA
4 changed files with 41 additions and 2 deletions

View File

@ -189,6 +189,21 @@ export default class OllamaController {
}
}
async remoteStatus() {
const remoteUrl = await KVStore.getValue('ai.remoteOllamaUrl')
if (!remoteUrl) {
return { configured: false, connected: false }
}
try {
const testResponse = await fetch(`${remoteUrl.replace(/\/$/, '')}/v1/models`, {
signal: AbortSignal.timeout(3000),
})
return { configured: true, connected: testResponse.ok }
} catch {
return { configured: true, connected: false }
}
}
async configureRemote({ request, response }: HttpContext) {
const remoteUrl: string | null = request.input('remoteUrl', null)

View File

@ -55,6 +55,13 @@ export default function Chat({
const { data: lastModelSetting } = useSystemSetting({ key: 'chat.lastModel', enabled })
const { data: remoteOllamaUrlSetting } = useSystemSetting({ key: 'ai.remoteOllamaUrl', enabled })
const { data: remoteStatus } = useQuery({
queryKey: ['remoteOllamaStatus'],
queryFn: () => api.getRemoteOllamaStatus(),
enabled: enabled && !!remoteOllamaUrlSetting?.value,
refetchInterval: 15000,
})
const { data: installedModels = [], isLoading: isLoadingModels } = useQuery({
queryKey: ['installedModels'],
queryFn: () => api.getInstalledModels(),
@ -365,8 +372,15 @@ export default function Chat({
</h2>
<div className="flex items-center gap-4">
{remoteOllamaUrlSetting?.value && (
<span className="text-xs text-green-700 bg-green-50 border border-green-200 rounded px-2 py-1 font-medium">
Remote Connected
<span
className={classNames(
'text-xs rounded px-2 py-1 font-medium',
remoteStatus?.connected === false
? 'text-red-700 bg-red-50 border border-red-200'
: 'text-green-700 bg-green-50 border border-green-200'
)}
>
{remoteStatus?.connected === false ? 'Remote Disconnected' : 'Remote Connected'}
</span>
)}
<div className="flex items-center gap-2">

View File

@ -48,6 +48,15 @@ class API {
})()
}
async getRemoteOllamaStatus(): Promise<{ configured: boolean; connected: boolean }> {
return catchInternal(async () => {
const response = await this.client.get<{ configured: boolean; connected: boolean }>(
'/ollama/remote-status'
)
return response.data
})()
}
async configureRemoteOllama(remoteUrl: string | null): Promise<{ success: boolean; message: string }> {
return catchInternal(async () => {
const response = await this.client.post<{ success: boolean; message: string }>(

View File

@ -108,6 +108,7 @@ router
router.delete('/models', [OllamaController, 'deleteModel'])
router.get('/installed-models', [OllamaController, 'installedModels'])
router.post('/configure-remote', [OllamaController, 'configureRemote'])
router.get('/remote-status', [OllamaController, 'remoteStatus'])
})
.prefix('/api/ollama')