diff --git a/packages/scrawn/src/core/ai/track.ts b/packages/scrawn/src/core/ai/track.ts index c93fd13..4073fdd 100644 --- a/packages/scrawn/src/core/ai/track.ts +++ b/packages/scrawn/src/core/ai/track.ts @@ -20,7 +20,8 @@ export function buildAIPayload( inputCacheDebit: Debit; outputCacheDebit: Debit; provider?: string; - } + }, + metadata?: Record ): AITokenUsagePayload { return { userId, @@ -30,6 +31,7 @@ export function buildAIPayload( inputDebit: overrides.inputDebit ?? defaults.inputDebit, outputDebit: overrides.outputDebit ?? defaults.outputDebit, provider: overrides.provider ?? defaults.provider ?? model.provider, + metadata, inputCacheTokens: usage.inputCachedTokens, inputCacheDebit: overrides.inputCacheDebit ?? defaults.inputCacheDebit, outputCacheTokens: usage.outputCachedTokens, diff --git a/packages/scrawn/src/core/ai/types.ts b/packages/scrawn/src/core/ai/types.ts index 70b5fff..750673c 100644 --- a/packages/scrawn/src/core/ai/types.ts +++ b/packages/scrawn/src/core/ai/types.ts @@ -24,6 +24,8 @@ export interface BillableAIOptions { export interface BillableCallParams { /** The user ID to bill against. If omitted, billing is skipped. */ userId?: string; + /** Arbitrary metadata to associate with the event. */ + metadata?: Record; /** Override input token billing for this specific call. */ inputDebit?: Debit; /** Override output token billing for this specific call. */ diff --git a/packages/scrawn/src/core/ai/wrap.ts b/packages/scrawn/src/core/ai/wrap.ts index 7848a08..4a33b53 100644 --- a/packages/scrawn/src/core/ai/wrap.ts +++ b/packages/scrawn/src/core/ai/wrap.ts @@ -91,6 +91,7 @@ export function createBillableAI( outputCacheDebit: billing.outputCacheDebit ?? defaults.outputCacheDebit, provider: billing.provider ?? defaults.provider, + metadata: billing.metadata, }); }; @@ -123,6 +124,8 @@ function extractBillingParams( params.inputCacheDebit as BillableCallParams["inputCacheDebit"], outputCacheDebit: params.outputCacheDebit as BillableCallParams["outputCacheDebit"], + provider: params.provider as string | undefined, + metadata: params.metadata as Record | undefined, }; } diff --git a/packages/scrawn/src/core/scrawn.ts b/packages/scrawn/src/core/scrawn.ts index 39ff19e..687d2be 100644 --- a/packages/scrawn/src/core/scrawn.ts +++ b/packages/scrawn/src/core/scrawn.ts @@ -1238,6 +1238,7 @@ export class Scrawn< inputCacheDebit?: Debit; outputCacheDebit?: Debit; provider?: string; + metadata?: Record; }): void { const { userId, @@ -1247,6 +1248,7 @@ export class Scrawn< inputCacheDebit, outputCacheDebit, provider, + metadata, } = config; const usage = event.usage ?? event.totalUsage ?? {}; const model: ModelInfo = event.model; @@ -1270,7 +1272,8 @@ export class Scrawn< inputCacheDebit: inputCacheDebit ?? inputDebit, outputCacheDebit: outputCacheDebit ?? outputDebit, provider, - } + }, + metadata ); this.aiTokenStreamConsumer( (async function* () {