diff --git a/src/extension/conversation/vscode-node/languageModelAccess.ts b/src/extension/conversation/vscode-node/languageModelAccess.ts index 760967ee25..7fd2246ebd 100644 --- a/src/extension/conversation/vscode-node/languageModelAccess.ts +++ b/src/extension/conversation/vscode-node/languageModelAccess.ts @@ -407,6 +407,18 @@ export class CopilotLanguageModelWrapper extends Disposable { tokenLimit } ); + + // --- Start Positron --- + // Calculate usage in Positron token counting format + const usage = { + inputTokens: (result.usage?.prompt_tokens ?? 0) - (result.usage?.prompt_tokens_details.cached_tokens ?? 0), + outputTokens: result.usage?.completion_tokens ?? 0, + cachedTokens: result.usage?.prompt_tokens_details.cached_tokens ?? 0, + providerMetadata: result.usage, + }; + this._logService.info(`[LanguageModelAccess] Usage for extension ${extensionId}: ${JSON.stringify(usage)}`); + callback('', 0, { text: '', usage }); + // --- End Positron --- } async provideLanguageModelResponse(endpoint: IChatEndpoint, messages: Array, options: vscode.LanguageModelChatRequestOptions, extensionId: string, progress: vscode.Progress, token: vscode.CancellationToken): Promise { @@ -431,6 +443,13 @@ export class CopilotLanguageModelWrapper extends Disposable { // @karthiknadig: remove this when LM API becomes available this._thinkingDataService.update(index, delta.thinking); } + // --- Start Positron --- + if (delta.usage) { + // Report usage as part of the output stream for the consuming extension + const part: any = vscode.LanguageModelDataPart.json({ type: 'usage', data: delta.usage }); + progress.report({ index, part: part }); + } + // --- End Positon --- return undefined; }; return this._provideLanguageModelResponse(endpoint, messages, options, extensionId, finishCallback, token); diff --git a/src/platform/networking/common/fetch.ts b/src/platform/networking/common/fetch.ts index be9ed134f3..7f0cc63c98 100644 --- a/src/platform/networking/common/fetch.ts +++ b/src/platform/networking/common/fetch.ts @@ -148,6 +148,14 @@ export interface IResponseDelta { copilotConfirmation?: ICopilotConfirmation; thinking?: ThinkingDelta; retryReason?: FilterReason; + // --- Start Positron --- + usage?: { + inputTokens: number; + outputTokens: number; + cachedTokens: number; + providerMetadata?: any; + }; + // --- End Positron --- } export interface FinishedCallback {