Files
2026-07-13 13:39:12 +08:00

55 lines
2.1 KiB
TypeScript

/**
* chatCore client usage buffer/estimate (Quality Gate v2 / Fase 9 — chatCore god-file
* decomposition, #3501).
*
* Extracted from handleChatCore's non-streaming success path: add a buffer to the response usage
* and filter it for the client format (to prevent CLI context errors); if the provider returned no
* usage block, fall back to estimating from the serialized content length. Mutates
* `translatedResponse.usage` in place — byte-identical to the previous inline block, including the
* `?.usage` guard, the `JSON.stringify(... || "")` content-length, and the `> 0` estimate gate.
*/
import {
addBufferToUsage as defaultAddBuffer,
filterUsageForFormat as defaultFilterUsage,
estimateUsage as defaultEstimateUsage,
} from "../../utils/usageTracking.ts";
type ResponseLike = {
usage?: unknown;
choices?: Array<{ message?: { content?: unknown } }>;
} | null | undefined;
export interface ClientUsageBufferDeps {
addBufferToUsage: typeof defaultAddBuffer;
filterUsageForFormat: typeof defaultFilterUsage;
estimateUsage: typeof defaultEstimateUsage;
}
const DEFAULT_DEPS: ClientUsageBufferDeps = {
addBufferToUsage: defaultAddBuffer,
filterUsageForFormat: defaultFilterUsage,
estimateUsage: defaultEstimateUsage,
};
export function applyClientUsageBuffer(
translatedResponse: ResponseLike,
body: unknown,
clientResponseFormat: unknown,
deps: ClientUsageBufferDeps = DEFAULT_DEPS
): void {
// Add buffer and filter usage for client (to prevent CLI context errors)
if (translatedResponse?.usage) {
const buffered = deps.addBufferToUsage(translatedResponse.usage);
translatedResponse.usage = deps.filterUsageForFormat(buffered, clientResponseFormat);
} else {
// Fallback: estimate usage when provider returned no usage block
const contentLength = JSON.stringify(
translatedResponse?.choices?.[0]?.message?.content || ""
).length;
if (contentLength > 0) {
const estimated = deps.estimateUsage(body, contentLength, clientResponseFormat);
translatedResponse.usage = deps.filterUsageForFormat(estimated, clientResponseFormat);
}
}
}