// CRITICALimport type { Hono } from "hono";import type { AppContext } from "../../types/context";import { getUsageFromChatDatabase } from "./usage/chat-database";import { getUsageFromPostgres } from "./usage/postgres";import { getUsageFromSqliteSpendLogs } from "./usage/sqlite-spend-logs";import { emptyResponse } from "./usage/usage-utilities"; /** * Register usage analytics routes. * Uses LiteLLM spend logs (Postgres preferred) with SQLite/chat fallbacks. * Falls back to empty data if no sources are available. * @param app - Hono app. * @param context - App context. */export const registerUsageRoutes = (app: Hono, context: AppContext): void => { app.get("/usage", async (ctx) => { try { const postgresUsage = await getUsageFromPostgres(context); if (postgresUsage) return ctx.json(postgresUsage); const sqliteUsage = getUsageFromSqliteSpendLogs(context.config.db_path); if (sqliteUsage) return ctx.json(sqliteUsage); const chatUsage = getUsageFromChatDatabase(context.config.data_dir); if (chatUsage) return ctx.json(chatUsage); return ctx.json(emptyResponse()); } catch (error) { console.error("[Usage] Error fetching usage stats:", error); try { const chatUsage = getUsageFromChatDatabase(context.config.data_dir); if (chatUsage) return ctx.json(chatUsage); } catch (fallbackError) { console.error("[Usage] Fallback also failed:", fallbackError); } return ctx.json(emptyResponse()); } });};
// CRITICAL
import type { Hono } from "hono";
import type { AppContext } from "../../types/context";
import { getUsageFromChatDatabase } from "./usage/chat-database";
import { getUsageFromPostgres } from "./usage/postgres";
import { getUsageFromSqliteSpendLogs } from "./usage/sqlite-spend-logs";
import { emptyResponse } from "./usage/usage-utilities";
/**
* Register usage analytics routes.
* Uses LiteLLM spend logs (Postgres preferred) with SQLite/chat fallbacks.
* Falls back to empty data if no sources are available.
* @param app - Hono app.
* @param context - App context.
*/
export const registerUsageRoutes = (app: Hono, context: AppContext): void => {
app.get("/usage", async (ctx) => {
try {
const postgresUsage = await getUsageFromPostgres(context);
if (postgresUsage) return ctx.json(postgresUsage);
const sqliteUsage = getUsageFromSqliteSpendLogs(context.config.db_path);
if (sqliteUsage) return ctx.json(sqliteUsage);
const chatUsage = getUsageFromChatDatabase(context.config.data_dir);
if (chatUsage) return ctx.json(chatUsage);
return ctx.json(emptyResponse());
} catch (error) {
console.error("[Usage] Error fetching usage stats:", error);
try {
const chatUsage = getUsageFromChatDatabase(context.config.data_dir);
if (chatUsage) return ctx.json(chatUsage);
} catch (fallbackError) {
console.error("[Usage] Fallback also failed:", fallbackError);
}
return ctx.json(emptyResponse());
}
});
};