From df20993d8b2d3c4572853811a4004df05232919d Mon Sep 17 00:00:00 2001 From: ProgrammerIn-wonderland <30693865+ProgrammerIn-wonderland@users.noreply.github.com> Date: Mon, 8 Jun 2026 20:33:41 -0400 Subject: [PATCH] set azure openai as the default (#3233) --- .../drivers/ai-chat/ChatCompletionDriver.ts | 2 +- .../providers/azure/AzureChatProvider.ts | 20 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/backend/drivers/ai-chat/ChatCompletionDriver.ts b/src/backend/drivers/ai-chat/ChatCompletionDriver.ts index cb5a605c7..ae88fbe76 100644 --- a/src/backend/drivers/ai-chat/ChatCompletionDriver.ts +++ b/src/backend/drivers/ai-chat/ChatCompletionDriver.ts @@ -279,7 +279,7 @@ export class ChatCompletionDriver extends PuterDriver { let intendedProvider = args.provider || ''; if (!args.model && !intendedProvider) { - intendedProvider = 'claude'; // default provider + intendedProvider = 'azure-openai'; // default provider } if ( !args.model && diff --git a/src/backend/drivers/ai-chat/providers/azure/AzureChatProvider.ts b/src/backend/drivers/ai-chat/providers/azure/AzureChatProvider.ts index d2eee5ac1..c05d0b5f9 100644 --- a/src/backend/drivers/ai-chat/providers/azure/AzureChatProvider.ts +++ b/src/backend/drivers/ai-chat/providers/azure/AzureChatProvider.ts @@ -51,7 +51,7 @@ export class AzureChatProvider implements IChatProvider { */ #openAi: OpenAI; - #defaultModel = 'gpt-5-nano'; + #defaultModel = 'gpt-5.4-nano'; #meteringService: MeteringService; @@ -220,13 +220,21 @@ export class AzureChatProvider implements IChatProvider { return OpenAiUtil.handle_completion_output({ usage_calculator: ({ usage }) => { + const cachedTokens = + usage.prompt_tokens_details?.cached_tokens ?? 0; const trackedUsage = { - prompt_tokens: - (usage.prompt_tokens ?? 0) - - (usage.prompt_tokens_details?.cached_tokens ?? 0), + // OpenAI includes cached tokens in `prompt_tokens`, so we + // subtract them out to meter the non-cached remainder. Grok + // reports `prompt_tokens` already excluding cached tokens + // (they're additive, not a subset) — subtracting there + // underflows to a negative count, which bills a negative + // (crediting) cost. Match xAI's `extractMeteredUsage` and + // take Grok's `prompt_tokens` as-is. + prompt_tokens: isGrok + ? (usage.prompt_tokens ?? 0) + : (usage.prompt_tokens ?? 0) - cachedTokens, completion_tokens: usage.completion_tokens ?? 0, - cached_tokens: - usage.prompt_tokens_details?.cached_tokens ?? 0, + cached_tokens: cachedTokens, }; const costsOverrideFromModel = Object.fromEntries(