error response consistency, human readible1

This commit is contained in:
Storme-bit
2026-04-26 23:00:18 -07:00
parent f5011fddca
commit 095c9a623e
7 changed files with 30 additions and 18 deletions

View File

@@ -17,7 +17,7 @@ router.post('/complete', async (req, res) => {
res.json(result);
} catch (error) {
logger.error('[Inference] Completion error:', error.message);
res.status(500).json({ error: error.message });
res.status(500).json({ error: 'Inference failed', detail: error.message });
}
});

View File

@@ -87,15 +87,27 @@ async function extractAndStoreEntities(userMessage, aiResponse, projectId=null)
const data = await res.json();
const raw = data.response?.trim() ?? '';
const parsed = JSON.parse(raw);
const jsonMatch = raw.match(/\{[\s\S]*\}/);
if (!jsonMatch) {
logger.warn('[entities] No JSON object found in response');
logger.debug('[entities] Raw response was:', raw);
return;
}
let parsed;
try {
parsed = JSON.parse(jsonMatch[0]);
} catch (err) {
logger.warn('[entities] Failed to parse extraction response:', err.message);
logger.debug('[entities] Raw response was:', raw);
return;
}
const entities = Array.isArray(parsed.entities) ? parsed.entities : [];
if (entities.length === 0) {
logger.debug('[entities] No entities found in this exchange — skipping');
return; // not an error, just nothing to extract
}
if (!Array.isArray(entities)) throw new Error('Response was not a JSON array');
let saved = 0;

View File

@@ -80,7 +80,7 @@ app.patch('/sessions/by-external/:externalId', (req, res) => {
const session = episodic.updateSessionByExternalId(req.params.externalId, {name, projectId });
res.json(session);
} catch (err) {
res.status(500).json({error: err.message });
res.status(500).json({ error: 'Failed to update session', detail: err.message });
}
});
@@ -235,7 +235,7 @@ app.post('/projects', (req, res) => {
try {
res.status(201).json(createProject({ name: name.trim(), description, colour, icon }));
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to create project', detail: err.message });
}
});
@@ -255,7 +255,7 @@ app.post('/projects/:id/summarize', async (req, res) => {
if (err.message.includes('No session summaries or episodes')) {
return res.status(422).json({ error: err.message });
}
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to generate project summary', detail: err.message });
}
});
@@ -310,7 +310,7 @@ app.post('/summaries', (req, res) => {
const summary = createSummary({ sessionId, projectId, content, tokenCount, episodeRange, metadata });
res.status(201).json(summary);
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to create summary', detail: err.message });
}
});

View File

@@ -20,7 +20,7 @@ router.post('/', async (req, res) => {
res.json(result)
} catch (err) {
logger.error(`[orchestration] chat error: `, err.message)
res.status(500).json ({ error: err.message})
res.status(500).json ({ error: 'Chat failed', detail: err.message })
}
});

View File

@@ -9,7 +9,7 @@ router.get('/', async (req, res) => {
const result = await memory.getEpisodes({ limit, offset, sessionId, q });
res.json(result);
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to fetch episodes', detail: err.message });
}
});
@@ -18,7 +18,7 @@ router.delete('/:id', async (req, res) => {
await memory.deleteEpisode(req.params.id);
res.status(204).send();
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to delete episode', detail: err.message });
}
});

View File

@@ -7,7 +7,7 @@ router.get('/', async (req, res) => {
try {
res.json(await memory.getProjects());
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to fetch projects', detail: err.message });
}
});
@@ -17,7 +17,7 @@ router.post('/', async (req, res) => {
try {
res.status(201).json(await memory.createProject({ name: name.trim(), description, colour, icon, isolated }));
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to create project', detail: err.message });
}
});
@@ -25,7 +25,7 @@ router.patch('/:id', async (req, res) => {
try {
res.json(await memory.updateProject(req.params.id, req.body));
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to update project', detail: err.message });
}
});
@@ -34,7 +34,7 @@ router.delete('/:id', async (req, res) => {
await memory.deleteProject(req.params.id);
res.status(204).send();
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to delete project', detail: err.message });
}
});

View File

@@ -21,7 +21,7 @@ router.get('/project/:projectId/overview', async (req, res) => {
const summary = await memory.getProjectOverviewSummary(req.params.projectId);
res.json(summary);
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to fetch project overview summary', detail: err.message });
}
});
@@ -32,7 +32,7 @@ router.get('/session/:sessionId', async (req, res) => {
const summaries = await memory.getSummariesBySession(session.id);
res.json(summaries);
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to fetch session summaries', detail: err.message });
}
});
@@ -41,7 +41,7 @@ router.get('/project/:projectId', async (req, res) => {
const summaries = await memory.getSummariesByProject(req.params.projectId);
res.json(summaries);
} catch (err) {
res.status(500).json({ error: err.message });
res.status(500).json({ error: 'Failed to fetch project summaries', detail: err.message });
}
});