Skip to content

Commit fd8a296

Browse files
committed
🤖 fix: include step providerMetadata in liveUsage for cache creation display
During streaming, liveUsage (context window display) showed 0 cache creation tokens because it wasn't receiving providerMetadata. The cache creation token count is Anthropic-specific and only available in providerMetadata.anthropic. cacheCreationInputTokens, not in the standard LanguageModelV2Usage. Thread step-level providerMetadata from backend through IPC to frontend, mirroring the existing pattern for cumulative provider metadata. _Generated with mux_
1 parent 76d8779 commit fd8a296

File tree

4 files changed

+23
-1
lines changed

4 files changed

+23
-1
lines changed

‎src/browser/stores/WorkspaceStore.ts‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,8 +493,13 @@ export class WorkspaceStore {
493493
const rawContextUsage = activeStreamId
494494
? aggregator.getActiveStreamUsage(activeStreamId)
495495
: undefined;
496+
const rawStepProviderMetadata = activeStreamId
497+
? aggregator.getActiveStreamStepProviderMetadata(activeStreamId)
498+
: undefined;
496499
const liveUsage =
497-
rawContextUsage && model ? createDisplayUsage(rawContextUsage, model) : undefined;
500+
rawContextUsage && model
501+
? createDisplayUsage(rawContextUsage, model, rawStepProviderMetadata)
502+
: undefined;
498503

499504
// Live cost usage (cumulative across all steps, with accumulated cache creation tokens)
500505
const rawCumulativeUsage = activeStreamId

‎src/browser/utils/messages/StreamingMessageAggregator.ts‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ export class StreamingMessageAggregator {
7878
// Active stream step usage (updated on each stream-step event)
7979
// Tracks last step's usage for context window display
8080
private activeStreamStepUsage = new Map<string, LanguageModelV2Usage>();
81+
// Tracks step provider metadata for context window cache display
82+
private activeStreamStepProviderMetadata = new Map<string, Record<string, unknown>>();
8183
// Tracks cumulative usage across all steps for live cost display
8284
private activeStreamCumulativeUsage = new Map<string, LanguageModelV2Usage>();
8385
// Tracks cumulative provider metadata for live cost display (with cache creation tokens)
@@ -1061,6 +1063,7 @@ export class StreamingMessageAggregator {
10611063
clearTokenState(messageId: string): void {
10621064
this.deltaHistory.delete(messageId);
10631065
this.activeStreamStepUsage.delete(messageId);
1066+
this.activeStreamStepProviderMetadata.delete(messageId);
10641067
this.activeStreamCumulativeUsage.delete(messageId);
10651068
this.activeStreamCumulativeProviderMetadata.delete(messageId);
10661069
}
@@ -1071,6 +1074,10 @@ export class StreamingMessageAggregator {
10711074
handleUsageDelta(data: UsageDeltaEvent): void {
10721075
// Store last step's usage for context window display
10731076
this.activeStreamStepUsage.set(data.messageId, data.usage);
1077+
// Store step provider metadata for context window cache display
1078+
if (data.providerMetadata) {
1079+
this.activeStreamStepProviderMetadata.set(data.messageId, data.providerMetadata);
1080+
}
10741081
// Store cumulative usage for cost display
10751082
this.activeStreamCumulativeUsage.set(data.messageId, data.cumulativeUsage);
10761083
// Store cumulative provider metadata for live cost display (with cache creation tokens)
@@ -1104,4 +1111,11 @@ export class StreamingMessageAggregator {
11041111
): Record<string, unknown> | undefined {
11051112
return this.activeStreamCumulativeProviderMetadata.get(messageId);
11061113
}
1114+
1115+
/**
1116+
* Get step provider metadata for context window cache display
1117+
*/
1118+
getActiveStreamStepProviderMetadata(messageId: string): Record<string, unknown> | undefined {
1119+
return this.activeStreamStepProviderMetadata.get(messageId);
1120+
}
11071121
}

‎src/common/types/stream.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ export interface UsageDeltaEvent {
148148
cumulativeUsage: LanguageModelV2Usage;
149149
// Cumulative provider metadata across all steps (for live cost display with cache tokens)
150150
cumulativeProviderMetadata?: Record<string, unknown>;
151+
// This step's provider metadata (for context window cache display)
152+
providerMetadata?: Record<string, unknown>;
151153
}
152154

153155
export type AIServiceEvent =

‎src/node/services/streamManager.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,7 @@ export class StreamManager extends EventEmitter {
972972
usage: finishStepPart.usage, // For context window display
973973
cumulativeUsage: streamInfo.cumulativeUsage, // For live cost display
974974
cumulativeProviderMetadata: streamInfo.cumulativeProviderMetadata, // For live cache costs
975+
providerMetadata: finishStepPart.providerMetadata, // For context window cache display
975976
};
976977
this.emit("usage-delta", usageEvent);
977978
break;

0 commit comments

Comments
 (0)