From ff2b7e0474cc2a24bf40b1373061dba630470229 Mon Sep 17 00:00:00 2001 From: SuYao Date: Thu, 5 Jun 2025 09:33:40 +0800 Subject: [PATCH] fix(AnthropicProvider): update usage and metrics handling to prevent TypeError (#6813) --- .../providers/AiProvider/AnthropicProvider.ts | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/src/renderer/src/providers/AiProvider/AnthropicProvider.ts b/src/renderer/src/providers/AiProvider/AnthropicProvider.ts index 1f53f5d05e..855c9adc62 100644 --- a/src/renderer/src/providers/AiProvider/AnthropicProvider.ts +++ b/src/renderer/src/providers/AiProvider/AnthropicProvider.ts @@ -445,6 +445,14 @@ export default class AnthropicProvider extends BaseProvider { ) } + if (thinking_content) { + onChunk({ + type: ChunkType.THINKING_COMPLETE, + text: thinking_content, + thinking_millsec: new Date().getTime() - time_first_token_millsec + }) + } + userMessages.push({ role: message.role, content: message.content @@ -464,18 +472,31 @@ export default class AnthropicProvider extends BaseProvider { } } - finalUsage.prompt_tokens += message.usage?.input_tokens || 0 - finalUsage.completion_tokens += message.usage?.output_tokens || 0 - finalUsage.total_tokens += finalUsage.prompt_tokens + finalUsage.completion_tokens - finalMetrics.completion_tokens = finalUsage.completion_tokens - finalMetrics.time_completion_millsec += new Date().getTime() - start_time_millsec - finalMetrics.time_first_token_millsec = time_first_token_millsec - start_time_millsec + // 直接修改finalUsage对象会报错,TypeError: Cannot assign to read only property 'prompt_tokens' of object '#' + // 暂未找到原因 + const updatedUsage: Usage = { + ...finalUsage, + prompt_tokens: finalUsage.prompt_tokens + (message.usage?.input_tokens || 0), + completion_tokens: finalUsage.completion_tokens + (message.usage?.output_tokens || 0) + } + updatedUsage.total_tokens = updatedUsage.prompt_tokens + updatedUsage.completion_tokens + + const updatedMetrics: Metrics = { + ...finalMetrics, + completion_tokens: updatedUsage.completion_tokens, + time_completion_millsec: + finalMetrics.time_completion_millsec + (new Date().getTime() - start_time_millsec), + time_first_token_millsec: time_first_token_millsec - start_time_millsec + } + + Object.assign(finalUsage, updatedUsage) + Object.assign(finalMetrics, updatedMetrics) onChunk({ type: ChunkType.BLOCK_COMPLETE, response: { - usage: finalUsage, - metrics: finalMetrics + usage: updatedUsage, + metrics: updatedMetrics } }) resolve() @@ -488,7 +509,9 @@ export default class AnthropicProvider extends BaseProvider { } onChunk({ type: ChunkType.LLM_RESPONSE_CREATED }) const start_time_millsec = new Date().getTime() - await processStream(body, 0).finally(cleanup) + await processStream(body, 0).finally(() => { + cleanup() + }) } /**