diff --git a/packages/chat-client/src/api/orchestration.js b/packages/chat-client/src/api/orchestration.js index d571da0..86843e6 100644 --- a/packages/chat-client/src/api/orchestration.js +++ b/packages/chat-client/src/api/orchestration.js @@ -188,4 +188,10 @@ export async function updateSettings(updates) { }); if (!res.ok) throw new Error(`Failed to update settings: ${res.status}`); return res.json(); +} + +export async function getServiceHealth() { + const res = await fetch(`${BASE_URL}/health/services`); + if (!res.ok) throw new Error(`Failed to fetch health: ${res.status}`); + return res.json(); } \ No newline at end of file diff --git a/packages/chat-client/vite.config.js b/packages/chat-client/vite.config.js index ad30f68..b42d81c 100644 --- a/packages/chat-client/vite.config.js +++ b/packages/chat-client/vite.config.js @@ -14,6 +14,8 @@ export default defineConfig({ '/models': 'http://192.168.0.205:4000', '/projects': 'http://192.168.0.205:4000', '/episodes': 'http://192.168.0.205:4000', + '/settings': 'http://192.168.0.205:4000', + '/health': 'http://192.168.0.205:4000', }, }, }); \ No newline at end of file diff --git a/packages/orchestration-service/src/index.js b/packages/orchestration-service/src/index.js index c53aa94..bb9edd5 100644 --- a/packages/orchestration-service/src/index.js +++ b/packages/orchestration-service/src/index.js @@ -7,8 +7,9 @@ const chatRouter = require('./routes/chat'); const sessionsRouter = require('./routes/sessions'); const modelsRouter = require('./routes/models'); const projectsRouter = require('./routes/projects'); -const episodesRouter = require('./routes/episodes') -const settingsRouter = require('./routes/settings') +const episodesRouter = require('./routes/episodes'); +const settingsRouter = require('./routes/settings'); +const healthRouter = require('./routes/health'); const cors = require('cors'); @@ -46,6 +47,7 @@ app.use('/models', modelsRouter); app.use('/projects', projectsRouter); app.use('/episodes', episodesRouter); app.use('/settings', settingsRouter); +app.use('/health/services', healthRouter); /******* Start the server ************/ app.listen(PORT, () => { diff --git a/packages/orchestration-service/src/routes/health.js b/packages/orchestration-service/src/routes/health.js new file mode 100644 index 0000000..58521e7 --- /dev/null +++ b/packages/orchestration-service/src/routes/health.js @@ -0,0 +1,30 @@ +const { Router } = require('express'); +const fetch = require('node-fetch'); +const { getEnv, SERVICES, PORTS } = require('@nexusai/shared'); + +const router = Router(); + +const SERVICES_MAP = [ + { key: 'inference', label: 'Inference', url: `${getEnv('INFERENCE_SERVICE_URL', SERVICES.INFERENCE_URL)}/health` }, + { key: 'memory', label: 'Memory', url: `${getEnv('MEMORY_SERVICE_URL', SERVICES.MEMORY_URL)}/health` }, + { key: 'embedding', label: 'Embedding', url: `${getEnv('EMBEDDING_SERVICE_URL', SERVICES.EMBEDDING_URL)}/health` }, + { key: 'orchestration', label: 'Orchestration', url: `http://localhost:${getEnv('PORT', PORTS.ORCHESTRATION)}/health` }, +]; + +router.get('/', async (req, res) => { + const results = await Promise.all( + SERVICES_MAP.map(async ({ key, label, url }) => { + const start = Date.now(); + try { + const r = await fetch(url, { signal: AbortSignal.timeout(3000) }); + const data = await r.json(); + return { key, label, status: 'healthy', latency: Date.now() - start, detail: data }; + } catch (err) { + return { key, label, status: 'unreachable', latency: Date.now() - start, detail: null }; + } + }) + ); + res.json(results); +}); + +module.exports = router; \ No newline at end of file