File tree Expand file tree Collapse file tree 3 files changed +23
-4
lines changed
Expand file tree Collapse file tree 3 files changed +23
-4
lines changed Original file line number Diff line number Diff line change @@ -4,12 +4,19 @@ import { ChatService } from '#services/chat_service'
44import { createSessionSchema , updateSessionSchema , addMessageSchema } from '#validators/chat'
55import { parseBoolean } from '../utils/misc.js'
66import KVStore from '#models/kv_store'
7+ import { SystemService } from '#services/system_service'
8+ import { SERVICE_NAMES } from '../../constants/service_names.js'
79
810@inject ( )
911export default class ChatsController {
10- constructor ( private chatService : ChatService ) { }
12+ constructor ( private chatService : ChatService , private systemService : SystemService ) { }
1113
12- async inertia ( { inertia } : HttpContext ) {
14+ async inertia ( { inertia, response } : HttpContext ) {
15+ const aiAssistantInstalled = await this . systemService . checkServiceInstalled ( SERVICE_NAMES . OLLAMA )
16+ if ( ! aiAssistantInstalled ) {
17+ return response . status ( 404 ) . json ( { error : 'AI Assistant service not installed' } )
18+ }
19+
1320 const chatSuggestionsEnabled = await KVStore . getValue ( 'chat.suggestionsEnabled' )
1421 return inertia . render ( 'chat' , {
1522 settings : {
Original file line number Diff line number Diff line change @@ -20,6 +20,11 @@ export class SystemService {
2020
2121 constructor ( private dockerService : DockerService ) { }
2222
23+ async checkServiceInstalled ( serviceName : string ) : Promise < boolean > {
24+ const services = await this . getServices ( { installedOnly : true } ) ;
25+ return services . some ( service => service . service_name === serviceName ) ;
26+ }
27+
2328 async getInternetStatus ( ) : Promise < boolean > {
2429 const DEFAULT_TEST_URL = 'https://1.1.1.1/cdn-cgi/trace'
2530 const MAX_ATTEMPTS = 3
Original file line number Diff line number Diff line change @@ -2,9 +2,12 @@ import { useState } from 'react'
22import Footer from '~/components/Footer'
33import ChatButton from '~/components/chat/ChatButton'
44import ChatModal from '~/components/chat/ChatModal'
5+ import useServiceInstalledStatus from '~/hooks/useServiceInstalledStatus'
6+ import { SERVICE_NAMES } from '../../constants/service_names'
57
68export default function AppLayout ( { children } : { children : React . ReactNode } ) {
79 const [ isChatOpen , setIsChatOpen ] = useState ( false )
10+ const aiAssistantInstalled = useServiceInstalledStatus ( SERVICE_NAMES . OLLAMA )
811
912 return (
1013 < div className = "min-h-screen flex flex-col" >
@@ -19,8 +22,12 @@ export default function AppLayout({ children }: { children: React.ReactNode }) {
1922 < div className = "flex-1 w-full bg-desert" > { children } </ div >
2023 < Footer />
2124
22- < ChatButton onClick = { ( ) => setIsChatOpen ( true ) } />
23- < ChatModal open = { isChatOpen } onClose = { ( ) => setIsChatOpen ( false ) } />
25+ { aiAssistantInstalled && (
26+ < >
27+ < ChatButton onClick = { ( ) => setIsChatOpen ( true ) } />
28+ < ChatModal open = { isChatOpen } onClose = { ( ) => setIsChatOpen ( false ) } />
29+ </ >
30+ ) }
2431 </ div >
2532 )
2633}
You can’t perform that action at this time.
0 commit comments