feat: enhance request handling and error management in chatCore and streamToJsonConverter

- Added detailed request logging and latency tracking in handleChatCore.
- Improved error handling for SSE to JSON conversion and JSON parsing in streamToJsonConverter.
- Introduced a safe JSON parsing utility to handle potential parsing errors gracefully in requestDetailsDb.

Co-authored-by: zx <me@char.moe>
This commit is contained in:
decolua
2026-02-15 12:02:53 +07:00
parent 3d29b86d44
commit e2db638982
3 changed files with 166 additions and 91 deletions

View File

@@ -298,7 +298,8 @@ function safeJsonStringify(obj, maxSize) {
try {
const str = JSON.stringify(obj);
if (str.length > maxSize) {
return str.substring(0, maxSize) + "... (truncated due to size limit)";
// Return valid JSON instead of truncated invalid string
return JSON.stringify({ _truncated: true, _originalSize: str.length, _preview: str.substring(0, 200) });
}
return str;
} catch (error) {
@@ -456,6 +457,12 @@ export async function getRequestDetails(filter = {}) {
const stmt = db.prepare(query);
const rows = stmt.all(...params);
// Safe JSON parse — returns fallback on corrupt/truncated data
const safeJsonParse = (str, fallback = {}) => {
try { return JSON.parse(str || '{}'); }
catch { return fallback; }
};
// Convert back to original format
const details = rows.map(row => ({
id: row.id,
@@ -464,12 +471,12 @@ export async function getRequestDetails(filter = {}) {
connectionId: row.connection_id,
timestamp: new Date(row.timestamp).toISOString(),
status: row.status,
latency: JSON.parse(row.latency || '{}'),
tokens: JSON.parse(row.tokens || '{}'),
request: JSON.parse(row.request || '{}'),
providerRequest: JSON.parse(row.provider_request || '{}'),
providerResponse: JSON.parse(row.provider_response || '{}'),
response: JSON.parse(row.response || '{}')
latency: safeJsonParse(row.latency),
tokens: safeJsonParse(row.tokens),
request: safeJsonParse(row.request),
providerRequest: safeJsonParse(row.provider_request),
providerResponse: safeJsonParse(row.provider_response),
response: safeJsonParse(row.response)
}));
return {
@@ -500,6 +507,11 @@ export async function getRequestDetailById(id) {
if (!row) return null;
const safeJsonParse = (str, fallback = {}) => {
try { return JSON.parse(str || '{}'); }
catch { return fallback; }
};
return {
id: row.id,
provider: row.provider,
@@ -507,11 +519,11 @@ export async function getRequestDetailById(id) {
connectionId: row.connection_id,
timestamp: new Date(row.timestamp).toISOString(),
status: row.status,
latency: JSON.parse(row.latency || '{}'),
tokens: JSON.parse(row.tokens || '{}'),
request: JSON.parse(row.request || '{}'),
providerRequest: JSON.parse(row.provider_request || '{}'),
providerResponse: JSON.parse(row.provider_response || '{}'),
response: JSON.parse(row.response || '{}')
latency: safeJsonParse(row.latency),
tokens: safeJsonParse(row.tokens),
request: safeJsonParse(row.request),
providerRequest: safeJsonParse(row.provider_request),
providerResponse: safeJsonParse(row.provider_response),
response: safeJsonParse(row.response)
};
}