timeline($text, $language, $engine, $focus, $confidenceFilter, $includeRelative, $includeBackground, $userNotes, null); if ($ftUid > 0) { $balance = dbnToolsFreeTierDeductAmount($ftUid, 'timeline', (int)$timelineRoute['credits'], [ 'requested_engine' => $timelineRoute['requested_engine'], 'effective_engine' => $timelineRoute['effective_engine'], 'auto_upgraded_engine' => $timelineRoute['auto_upgraded_engine'], 'input_char_count' => $timelineRoute['input_char_count'], ]); if ($balance >= 0 && !headers_sent()) { header('X-Credits-Remaining: ' . $balance); } $result['balance'] = $balance; } $latency = (int)round((microtime(true) - $start) * 1000); $result['ok'] = $result['ok'] ?? true; $result['latency_ms'] = $latency; $result['trace_metadata'] = array_merge($result['trace_metadata'] ?? [], [ 'requested_engine' => $timelineRoute['requested_engine'], 'effective_engine' => $timelineRoute['effective_engine'], 'auto_upgraded_engine' => $timelineRoute['auto_upgraded_engine'], 'input_char_count' => $timelineRoute['input_char_count'], 'engine_limit_chars' => $timelineRoute['engine_limit_chars'], 'credits_charged' => $timelineRoute['credits'], ]); dbnToolsLogMetadata([ 'tool' => 'timeline', 'language' => $language, 'ok' => true, 'latency_ms' => $latency, 'chunk_count' => (int)($result['trace_metadata']['chunk_count'] ?? 0), 'source_count' => (int)($result['trace_metadata']['source_count'] ?? 0), 'deployment' => $result['trace_metadata']['deployment'] ?? null, ]); dbnToolsRespond($result); } catch (DbnToolsHttpException $e) { $latency = (int)round((microtime(true) - $start) * 1000); dbnToolsLogMetadata([ 'tool' => 'timeline', 'language' => $language, 'ok' => false, 'latency_ms' => $latency, 'error_code' => $e->errorCode, ]); dbnToolsError($e->getMessage(), $e->status, $e->errorCode, $e->extra); } catch (Throwable $e) { $latency = (int)round((microtime(true) - $start) * 1000); dbnToolsLogMetadata([ 'tool' => 'timeline', 'language' => $language, 'ok' => false, 'latency_ms' => $latency, 'error_code' => 'internal_error', ]); error_log('timeline error: ' . $e->getMessage()); dbnToolsError('The tool could not complete this request.', 500, 'internal_error'); }