feat: implement request tracking and enhance usage stats display

This commit is contained in:
Catalin Stanciu
2026-01-06 20:41:53 +02:00
committed by decolua
parent 7f71916f9e
commit e4f92cd104
4 changed files with 199 additions and 20 deletions

View File

@@ -8,7 +8,7 @@ import { createRequestLogger } from "../utils/requestLogger.js";
import { getModelTargetFormat, PROVIDER_ID_TO_ALIAS } from "../config/providerModels.js";
import { createErrorResult, parseUpstreamError, formatProviderError } from "../utils/error.js";
import { handleBypassRequest } from "../utils/bypassHandler.js";
import { saveRequestUsage } from "@/lib/usageDb.js";
import { saveRequestUsage, trackPendingRequest } from "@/lib/usageDb.js";
/**
* Extract usage from non-streaming response body
@@ -122,6 +122,9 @@ export async function handleChatCore({ body, modelInfo, credentials, log, onCred
const providerUrl = buildProviderUrl(provider, model, stream);
const providerHeaders = buildProviderHeaders(provider, credentials, stream, translatedBody);
// Track pending request
trackPendingRequest(model, provider, connectionId, true);
// 2. Log converted request to provider
reqLogger.logConvertedRequest(providerUrl, providerHeaders, translatedBody);
@@ -155,6 +158,7 @@ export async function handleChatCore({ body, modelInfo, credentials, log, onCred
signal: streamController.signal
});
} catch (error) {
trackPendingRequest(model, provider, connectionId, false);
if (error.name === "AbortError") {
streamController.handleError(error);
return createErrorResult(499, "Request aborted");
@@ -248,6 +252,7 @@ export async function handleChatCore({ body, modelInfo, credentials, log, onCred
// Check provider response - return error info for fallback handling
if (!providerResponse.ok) {
trackPendingRequest(model, provider, connectionId, false);
const { statusCode, message } = await parseUpstreamError(providerResponse);
const errMsg = formatProviderError(new Error(message), provider, model, statusCode);
console.log(`${COLORS.red}[ERROR] ${errMsg}${COLORS.reset}`);
@@ -260,6 +265,7 @@ export async function handleChatCore({ body, modelInfo, credentials, log, onCred
// Non-streaming response
if (!stream) {
trackPendingRequest(model, provider, connectionId, false);
const responseBody = await providerResponse.json();
// Notify success - caller can clear error status if needed

View File

@@ -1,6 +1,6 @@
import { translateResponse, initState } from "../translator/index.js";
import { FORMATS } from "../translator/formats.js";
import { saveRequestUsage } from "@/lib/usageDb.js";
import { saveRequestUsage, trackPendingRequest } from "@/lib/usageDb.js";
// Get HH:MM:SS timestamp
function getTimeString() {
@@ -220,6 +220,7 @@ export function createSSEStream(options = {}) {
},
flush(controller) {
trackPendingRequest(model, provider, connectionId, false);
try {
const remaining = decoder.decode();
if (remaining) buffer += remaining;