diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index b0ef646b..8c3ecb51 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Added + +- Added optional `metadata` field to `StreamOptions` for passing provider-specific metadata (e.g. Anthropic `user_id` for abuse tracking/rate limiting) ([#1384](https://github.com/badlogic/pi-mono/pull/1384) by [@7Sageer](https://github.com/7Sageer)) + ## [0.52.9] - 2026-02-08 ### Changed diff --git a/packages/ai/src/providers/anthropic.ts b/packages/ai/src/providers/anthropic.ts index 0a52a316..2280a215 100644 --- a/packages/ai/src/providers/anthropic.ts +++ b/packages/ai/src/providers/anthropic.ts @@ -594,6 +594,13 @@ function buildParams( } } + if (options?.metadata) { + const userId = options.metadata.user_id; + if (typeof userId === "string") { + params.metadata = { user_id: userId }; + } + } + if (options?.toolChoice) { if (typeof options.toolChoice === "string") { params.tool_choice = { type: options.toolChoice }; diff --git a/packages/ai/src/providers/simple-options.ts b/packages/ai/src/providers/simple-options.ts index a1a298aa..71c15847 100644 --- a/packages/ai/src/providers/simple-options.ts +++ b/packages/ai/src/providers/simple-options.ts @@ -11,6 +11,7 @@ export function buildBaseOptions(model: Model, options?: SimpleStreamOption headers: options?.headers, onPayload: options?.onPayload, maxRetryDelayMs: options?.maxRetryDelayMs, + metadata: options?.metadata, }; } diff --git a/packages/ai/src/types.ts b/packages/ai/src/types.ts index 10834901..89bcb303 100644 --- a/packages/ai/src/types.ts +++ b/packages/ai/src/types.ts @@ -87,6 +87,12 @@ export interface StreamOptions { * Default: 60000 (60 seconds). Set to 0 to disable the cap. */ maxRetryDelayMs?: number; + /** + * Optional metadata to include in API requests. + * Providers extract the fields they understand and ignore the rest. + * For example, Anthropic uses `user_id` for abuse tracking and rate limiting. + */ + metadata?: Record; } export type ProviderStreamOptions = StreamOptions & Record;