diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index 4153db0da4e..9e83cbc158a 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -598,7 +598,12 @@ export const getApiProtocol = (provider: ProviderName | undefined, modelId?: str } // Vercel AI Gateway uses anthropic protocol for anthropic models. - if (provider && provider === "vercel-ai-gateway" && modelId && modelId.toLowerCase().startsWith("anthropic/")) { + if ( + provider && + ["vercel-ai-gateway", "roo"].includes(provider) && + modelId && + modelId.toLowerCase().startsWith("anthropic/") + ) { return "anthropic" } diff --git a/src/api/providers/roo.ts b/src/api/providers/roo.ts index 5d7490496d7..0c4776c0c68 100644 --- a/src/api/providers/roo.ts +++ b/src/api/providers/roo.ts @@ -90,6 +90,8 @@ export class RooHandler extends BaseOpenAiCompatibleProvider { metadata?.taskId ? { headers: { "X-Roo-Task-ID": metadata.taskId } } : undefined, ) + let lastUsage: RooUsage | undefined = undefined + for await (const chunk of stream) { const delta = chunk.choices[0]?.delta @@ -110,15 +112,18 @@ export class RooHandler extends BaseOpenAiCompatibleProvider { } if (chunk.usage) { - const usage = chunk.usage as RooUsage - yield { - type: "usage", - inputTokens: usage.prompt_tokens || 0, - outputTokens: usage.completion_tokens || 0, - cacheWriteTokens: usage.cache_creation_input_tokens, - cacheReadTokens: usage.prompt_tokens_details?.cached_tokens, - totalCost: usage.cost ?? 0, - } + lastUsage = chunk.usage as RooUsage + } + } + + if (lastUsage) { + yield { + type: "usage", + inputTokens: lastUsage.prompt_tokens || 0, + outputTokens: lastUsage.completion_tokens || 0, + cacheWriteTokens: lastUsage.cache_creation_input_tokens, + cacheReadTokens: lastUsage.prompt_tokens_details?.cached_tokens, + totalCost: lastUsage.cost ?? 0, } } }