seroxdesigncleand0badd58 months agoHistory
40 lines · 1.5 KB · TypeScript
RawDownload
// 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());    }  });};