mirror of
https://github.com/Crosstalk-Solutions/project-nomad.git
synced 2026-04-09 02:06:16 +02:00
feat(ai-chat): add connection status badge to chat
This commit is contained in:
parent
fb1a55947d
commit
c45236912e
|
|
@ -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) {
|
async configureRemote({ request, response }: HttpContext) {
|
||||||
const remoteUrl: string | null = request.input('remoteUrl', null)
|
const remoteUrl: string | null = request.input('remoteUrl', null)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,13 @@ export default function Chat({
|
||||||
const { data: lastModelSetting } = useSystemSetting({ key: 'chat.lastModel', enabled })
|
const { data: lastModelSetting } = useSystemSetting({ key: 'chat.lastModel', enabled })
|
||||||
const { data: remoteOllamaUrlSetting } = useSystemSetting({ key: 'ai.remoteOllamaUrl', 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({
|
const { data: installedModels = [], isLoading: isLoadingModels } = useQuery({
|
||||||
queryKey: ['installedModels'],
|
queryKey: ['installedModels'],
|
||||||
queryFn: () => api.getInstalledModels(),
|
queryFn: () => api.getInstalledModels(),
|
||||||
|
|
@ -365,8 +372,15 @@ export default function Chat({
|
||||||
</h2>
|
</h2>
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
{remoteOllamaUrlSetting?.value && (
|
{remoteOllamaUrlSetting?.value && (
|
||||||
<span className="text-xs text-green-700 bg-green-50 border border-green-200 rounded px-2 py-1 font-medium">
|
<span
|
||||||
Remote Connected
|
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>
|
</span>
|
||||||
)}
|
)}
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
|
|
|
||||||
|
|
@ -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 }> {
|
async configureRemoteOllama(remoteUrl: string | null): Promise<{ success: boolean; message: string }> {
|
||||||
return catchInternal(async () => {
|
return catchInternal(async () => {
|
||||||
const response = await this.client.post<{ success: boolean; message: string }>(
|
const response = await this.client.post<{ success: boolean; message: string }>(
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,7 @@ router
|
||||||
router.delete('/models', [OllamaController, 'deleteModel'])
|
router.delete('/models', [OllamaController, 'deleteModel'])
|
||||||
router.get('/installed-models', [OllamaController, 'installedModels'])
|
router.get('/installed-models', [OllamaController, 'installedModels'])
|
||||||
router.post('/configure-remote', [OllamaController, 'configureRemote'])
|
router.post('/configure-remote', [OllamaController, 'configureRemote'])
|
||||||
|
router.get('/remote-status', [OllamaController, 'remoteStatus'])
|
||||||
})
|
})
|
||||||
.prefix('/api/ollama')
|
.prefix('/api/ollama')
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user