diff --git a/apps/web/src/lib/ai-gateway/llm-proxy-helpers.ts b/apps/web/src/lib/ai-gateway/llm-proxy-helpers.ts index 5a84550be..527063d99 100644 --- a/apps/web/src/lib/ai-gateway/llm-proxy-helpers.ts +++ b/apps/web/src/lib/ai-gateway/llm-proxy-helpers.ts @@ -494,7 +494,8 @@ function computeFimMicrodollarCost(usage: FimUsage, provider: ProviderId): numbe function parseMistralFimUsageFromString( response: string, - provider: ProviderId + provider: ProviderId, + statusCode: number ): MicrodollarUsageStats { const json: MistralFimCompletion = JSON.parse(response); const cost_mUsd = computeFimMicrodollarCost(json.usage, provider); @@ -503,7 +504,7 @@ function parseMistralFimUsageFromString( messageId: json.id, model: json.model, responseContent: json.choices[0]?.text || '', - hasError: !json.model, + hasError: !json.model || statusCode >= 400, inference_provider: provider, inputTokens: json.usage.prompt_tokens, outputTokens: json.usage.completion_tokens, @@ -524,7 +525,8 @@ function parseMistralFimUsageFromString( async function parseMistralFimUsageFromStream( stream: ReadableStream, requestSpan: Span | undefined, - provider: ProviderId + provider: ProviderId, + statusCode: number ): Promise { requestSpan?.end(); const streamProcessingSpan = startInactiveSpan({ @@ -539,7 +541,7 @@ async function parseMistralFimUsageFromStream( let messageId: string | null = null; let model: string | null = null; let responseContent = ''; - let reportedError = false; + let reportedError = statusCode >= 400; const startedAt = performance.now(); let firstTokenReceived = false; let usage: FimUsage | undefined; @@ -627,13 +629,21 @@ export function countAndStoreFimUsage( const logFileExtension = usageContext.isStreaming ? '.log.resp.sse' : '.log.resp.json'; debugSaveProxyResponseStream(clonedResponse, logFileExtension); + const statusCode = usageContext.status_code ?? 0; const usageStatsPromise = !clonedResponse.body ? Promise.resolve(null) : usageContext.isStreaming - ? parseMistralFimUsageFromStream(clonedResponse.body, requestSpan, usageContext.provider) + ? parseMistralFimUsageFromStream( + clonedResponse.body, + requestSpan, + usageContext.provider, + statusCode + ) : clonedResponse .text() - .then(content => parseMistralFimUsageFromString(content, usageContext.provider)); + .then(content => + parseMistralFimUsageFromString(content, usageContext.provider, statusCode) + ); after( usageStatsPromise.then(usageStats => {