@openrouter/ai-sdk-provider 1.3.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -55,6 +55,64 @@ This list is not a definitive list of models supported by OpenRouter, as it cons
55
55
 
56
56
  You can find the latest list of tool-supported models supported by OpenRouter [here](https://openrouter.ai/models?order=newest&supported_parameters=tools). (Note: This list may contain models that are not compatible with the AI SDK.)
57
57
 
58
+ ## Embeddings
59
+
60
+ OpenRouter supports embedding models for semantic search, RAG pipelines, and vector-native features. The provider exposes embeddings compatible with both AI SDK v5 and v4.
61
+
62
+ ### AI SDK v5 (Recommended)
63
+
64
+ ```ts
65
+ import { embed } from 'ai';
66
+ import { openrouter } from '@openrouter/ai-sdk-provider';
67
+
68
+ const { embedding } = await embed({
69
+ model: openrouter.textEmbeddingModel('openai/text-embedding-3-small'),
70
+ value: 'sunny day at the beach',
71
+ });
72
+
73
+ console.log(embedding); // Array of numbers representing the embedding
74
+ ```
75
+
76
+ ### Batch Embeddings
77
+
78
+ ```ts
79
+ import { embedMany } from 'ai';
80
+ import { openrouter } from '@openrouter/ai-sdk-provider';
81
+
82
+ const { embeddings } = await embedMany({
83
+ model: openrouter.textEmbeddingModel('openai/text-embedding-3-small'),
84
+ values: [
85
+ 'sunny day at the beach',
86
+ 'rainy day in the city',
87
+ 'snowy mountain peak',
88
+ ],
89
+ });
90
+
91
+ console.log(embeddings); // Array of embedding arrays
92
+ ```
93
+
94
+ ### AI SDK v4 (Deprecated)
95
+
96
+ For backwards compatibility, the `embedding` method is also available:
97
+
98
+ ```ts
99
+ import { embed } from 'ai';
100
+ import { openrouter } from '@openrouter/ai-sdk-provider';
101
+
102
+ const { embedding } = await embed({
103
+ model: openrouter.embedding('openai/text-embedding-3-small'),
104
+ value: 'sunny day at the beach',
105
+ });
106
+ ```
107
+
108
+ ### Supported Embedding Models
109
+
110
+ OpenRouter supports various embedding models including:
111
+ - `openai/text-embedding-3-small`
112
+ - `openai/text-embedding-3-large`
113
+ - `openai/text-embedding-ada-002`
114
+ - And more available on [OpenRouter](https://openrouter.ai/models?output_modalities=embeddings)
115
+
58
116
  ## Passing Extra Body to OpenRouter
59
117
 
60
118
  There are 3 ways to pass extra body to OpenRouter:
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2Content, LanguageModelV2FinishReason, LanguageModelV2Usage, LanguageModelV2CallWarning, LanguageModelV2ResponseMetadata, SharedV2Headers, LanguageModelV2StreamPart, ProviderV2 } from '@ai-sdk/provider';
1
+ import { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2Content, LanguageModelV2FinishReason, LanguageModelV2Usage, LanguageModelV2CallWarning, LanguageModelV2ResponseMetadata, SharedV2Headers, LanguageModelV2StreamPart, EmbeddingModelV2, SharedV2ProviderMetadata, ProviderV2 } from '@ai-sdk/provider';
2
2
  export { LanguageModelV2, LanguageModelV2Prompt } from '@ai-sdk/provider';
3
3
  import * as models from '@openrouter/sdk/models';
4
4
  import { z } from 'zod/v4';
@@ -70,6 +70,14 @@ type OpenRouterChatSettings = {
70
70
  * Custom search prompt to guide the search query
71
71
  */
72
72
  search_prompt?: string;
73
+ /**
74
+ * Search engine to use for web search
75
+ * - "native": Use provider's built-in web search
76
+ * - "exa": Use Exa's search API
77
+ * - undefined: Native if supported, otherwise Exa
78
+ * @see https://openrouter.ai/docs/features/web-search
79
+ */
80
+ engine?: models.Engine;
73
81
  };
74
82
  /**
75
83
  * Debug options for troubleshooting API requests.
@@ -130,6 +138,63 @@ type OpenRouterChatSettings = {
130
138
  audio?: number | string;
131
139
  request?: number | string;
132
140
  };
141
+ /**
142
+ * Whether to restrict routing to only ZDR (Zero Data Retention) endpoints.
143
+ * When true, only endpoints that do not retain prompts will be used.
144
+ */
145
+ zdr?: boolean;
146
+ };
147
+ } & OpenRouterSharedSettings;
148
+
149
+ type OpenRouterEmbeddingModelId = string;
150
+ type OpenRouterEmbeddingSettings = {
151
+ /**
152
+ * A unique identifier representing your end-user, which can help OpenRouter to
153
+ * monitor and detect abuse.
154
+ */
155
+ user?: string;
156
+ /**
157
+ * Provider routing preferences to control request routing behavior
158
+ */
159
+ provider?: {
160
+ /**
161
+ * List of provider slugs to try in order (e.g. ["openai", "voyageai"])
162
+ */
163
+ order?: string[];
164
+ /**
165
+ * Whether to allow backup providers when primary is unavailable (default: true)
166
+ */
167
+ allow_fallbacks?: boolean;
168
+ /**
169
+ * Only use providers that support all parameters in your request (default: false)
170
+ */
171
+ require_parameters?: boolean;
172
+ /**
173
+ * Control whether to use providers that may store data
174
+ */
175
+ data_collection?: 'allow' | 'deny';
176
+ /**
177
+ * List of provider slugs to allow for this request
178
+ */
179
+ only?: string[];
180
+ /**
181
+ * List of provider slugs to skip for this request
182
+ */
183
+ ignore?: string[];
184
+ /**
185
+ * Sort providers by price, throughput, or latency
186
+ */
187
+ sort?: 'price' | 'throughput' | 'latency';
188
+ /**
189
+ * Maximum pricing you want to pay for this request
190
+ */
191
+ max_price?: {
192
+ prompt?: number | string;
193
+ completion?: number | string;
194
+ image?: number | string;
195
+ audio?: number | string;
196
+ request?: number | string;
197
+ };
133
198
  };
134
199
  } & OpenRouterSharedSettings;
135
200
 
@@ -277,6 +342,7 @@ declare class OpenRouterChatLanguageModel implements LanguageModelV2 {
277
342
  readonly provider = "openrouter";
278
343
  readonly defaultObjectGenerationMode: "tool";
279
344
  readonly modelId: OpenRouterChatModelId;
345
+ readonly supportsImageUrls = true;
280
346
  readonly supportedUrls: Record<string, RegExp[]>;
281
347
  readonly settings: OpenRouterChatSettings;
282
348
  private readonly config;
@@ -330,6 +396,7 @@ declare class OpenRouterCompletionLanguageModel implements LanguageModelV2 {
330
396
  readonly specificationVersion: "v2";
331
397
  readonly provider = "openrouter";
332
398
  readonly modelId: OpenRouterCompletionModelId;
399
+ readonly supportsImageUrls = true;
333
400
  readonly supportedUrls: Record<string, RegExp[]>;
334
401
  readonly defaultObjectGenerationMode: undefined;
335
402
  readonly settings: OpenRouterCompletionSettings;
@@ -340,6 +407,42 @@ declare class OpenRouterCompletionLanguageModel implements LanguageModelV2 {
340
407
  doStream(options: LanguageModelV2CallOptions): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>>;
341
408
  }
342
409
 
410
+ type OpenRouterEmbeddingConfig = {
411
+ provider: string;
412
+ headers: () => Record<string, string | undefined>;
413
+ url: (options: {
414
+ modelId: string;
415
+ path: string;
416
+ }) => string;
417
+ fetch?: typeof fetch;
418
+ extraBody?: Record<string, unknown>;
419
+ };
420
+ declare class OpenRouterEmbeddingModel implements EmbeddingModelV2<string> {
421
+ readonly specificationVersion: "v2";
422
+ readonly provider = "openrouter";
423
+ readonly modelId: OpenRouterEmbeddingModelId;
424
+ readonly settings: OpenRouterEmbeddingSettings;
425
+ readonly maxEmbeddingsPerCall: undefined;
426
+ readonly supportsParallelCalls = true;
427
+ private readonly config;
428
+ constructor(modelId: OpenRouterEmbeddingModelId, settings: OpenRouterEmbeddingSettings, config: OpenRouterEmbeddingConfig);
429
+ doEmbed(options: {
430
+ values: Array<string>;
431
+ abortSignal?: AbortSignal;
432
+ headers?: Record<string, string | undefined>;
433
+ }): Promise<{
434
+ embeddings: Array<Array<number>>;
435
+ usage?: {
436
+ tokens: number;
437
+ };
438
+ providerMetadata?: SharedV2ProviderMetadata;
439
+ response?: {
440
+ headers?: SharedV2Headers;
441
+ body?: unknown;
442
+ };
443
+ }>;
444
+ }
445
+
343
446
  interface OpenRouterProvider extends ProviderV2 {
344
447
  (modelId: OpenRouterChatModelId, settings?: OpenRouterCompletionSettings): OpenRouterCompletionLanguageModel;
345
448
  (modelId: OpenRouterChatModelId, settings?: OpenRouterChatSettings): OpenRouterChatLanguageModel;
@@ -353,6 +456,15 @@ interface OpenRouterProvider extends ProviderV2 {
353
456
  Creates an OpenRouter completion model for text generation.
354
457
  */
355
458
  completion(modelId: OpenRouterCompletionModelId, settings?: OpenRouterCompletionSettings): OpenRouterCompletionLanguageModel;
459
+ /**
460
+ Creates an OpenRouter text embedding model. (AI SDK v5)
461
+ */
462
+ textEmbeddingModel(modelId: OpenRouterEmbeddingModelId, settings?: OpenRouterEmbeddingSettings): OpenRouterEmbeddingModel;
463
+ /**
464
+ Creates an OpenRouter text embedding model. (AI SDK v4 - deprecated, use textEmbeddingModel instead)
465
+ @deprecated Use textEmbeddingModel instead
466
+ */
467
+ embedding(modelId: OpenRouterEmbeddingModelId, settings?: OpenRouterEmbeddingSettings): OpenRouterEmbeddingModel;
356
468
  }
357
469
  interface OpenRouterProviderSettings {
358
470
  /**
@@ -386,6 +498,11 @@ interface OpenRouterProviderSettings {
386
498
  A JSON object to send as the request body to access OpenRouter features & upstream provider features.
387
499
  */
388
500
  extraBody?: Record<string, unknown>;
501
+ /**
502
+ * Record of provider slugs to API keys for injecting into provider routing.
503
+ * Maps provider slugs (e.g. "anthropic", "openai") to their respective API keys.
504
+ */
505
+ api_keys?: Record<string, string>;
389
506
  }
390
507
  /**
391
508
  Create an OpenRouter provider instance.
@@ -414,6 +531,10 @@ declare class OpenRouter {
414
531
  Custom headers to include in the requests.
415
532
  */
416
533
  readonly headers?: Record<string, string>;
534
+ /**
535
+ * Record of provider slugs to API keys for injecting into provider routing.
536
+ */
537
+ readonly api_keys?: Record<string, string>;
417
538
  /**
418
539
  * Creates a new OpenRouter provider instance.
419
540
  */
@@ -421,6 +542,11 @@ declare class OpenRouter {
421
542
  private get baseConfig();
422
543
  chat(modelId: OpenRouterChatModelId, settings?: OpenRouterChatSettings): OpenRouterChatLanguageModel;
423
544
  completion(modelId: OpenRouterCompletionModelId, settings?: OpenRouterCompletionSettings): OpenRouterCompletionLanguageModel;
545
+ textEmbeddingModel(modelId: OpenRouterEmbeddingModelId, settings?: OpenRouterEmbeddingSettings): OpenRouterEmbeddingModel;
546
+ /**
547
+ * @deprecated Use textEmbeddingModel instead
548
+ */
549
+ embedding(modelId: OpenRouterEmbeddingModelId, settings?: OpenRouterEmbeddingSettings): OpenRouterEmbeddingModel;
424
550
  }
425
551
 
426
- export { OpenRouter, type OpenRouterCompletionSettings, type OpenRouterProvider, type OpenRouterProviderOptions, type OpenRouterProviderSettings, type OpenRouterSharedSettings, type OpenRouterUsageAccounting, createOpenRouter, openrouter };
552
+ export { OpenRouter, type OpenRouterCompletionSettings, type OpenRouterEmbeddingModelId, type OpenRouterEmbeddingSettings, type OpenRouterProvider, type OpenRouterProviderOptions, type OpenRouterProviderSettings, type OpenRouterSharedSettings, type OpenRouterUsageAccounting, createOpenRouter, openrouter };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2Content, LanguageModelV2FinishReason, LanguageModelV2Usage, LanguageModelV2CallWarning, LanguageModelV2ResponseMetadata, SharedV2Headers, LanguageModelV2StreamPart, ProviderV2 } from '@ai-sdk/provider';
1
+ import { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2Content, LanguageModelV2FinishReason, LanguageModelV2Usage, LanguageModelV2CallWarning, LanguageModelV2ResponseMetadata, SharedV2Headers, LanguageModelV2StreamPart, EmbeddingModelV2, SharedV2ProviderMetadata, ProviderV2 } from '@ai-sdk/provider';
2
2
  export { LanguageModelV2, LanguageModelV2Prompt } from '@ai-sdk/provider';
3
3
  import * as models from '@openrouter/sdk/models';
4
4
  import { z } from 'zod/v4';
@@ -70,6 +70,14 @@ type OpenRouterChatSettings = {
70
70
  * Custom search prompt to guide the search query
71
71
  */
72
72
  search_prompt?: string;
73
+ /**
74
+ * Search engine to use for web search
75
+ * - "native": Use provider's built-in web search
76
+ * - "exa": Use Exa's search API
77
+ * - undefined: Native if supported, otherwise Exa
78
+ * @see https://openrouter.ai/docs/features/web-search
79
+ */
80
+ engine?: models.Engine;
73
81
  };
74
82
  /**
75
83
  * Debug options for troubleshooting API requests.
@@ -130,6 +138,63 @@ type OpenRouterChatSettings = {
130
138
  audio?: number | string;
131
139
  request?: number | string;
132
140
  };
141
+ /**
142
+ * Whether to restrict routing to only ZDR (Zero Data Retention) endpoints.
143
+ * When true, only endpoints that do not retain prompts will be used.
144
+ */
145
+ zdr?: boolean;
146
+ };
147
+ } & OpenRouterSharedSettings;
148
+
149
+ type OpenRouterEmbeddingModelId = string;
150
+ type OpenRouterEmbeddingSettings = {
151
+ /**
152
+ * A unique identifier representing your end-user, which can help OpenRouter to
153
+ * monitor and detect abuse.
154
+ */
155
+ user?: string;
156
+ /**
157
+ * Provider routing preferences to control request routing behavior
158
+ */
159
+ provider?: {
160
+ /**
161
+ * List of provider slugs to try in order (e.g. ["openai", "voyageai"])
162
+ */
163
+ order?: string[];
164
+ /**
165
+ * Whether to allow backup providers when primary is unavailable (default: true)
166
+ */
167
+ allow_fallbacks?: boolean;
168
+ /**
169
+ * Only use providers that support all parameters in your request (default: false)
170
+ */
171
+ require_parameters?: boolean;
172
+ /**
173
+ * Control whether to use providers that may store data
174
+ */
175
+ data_collection?: 'allow' | 'deny';
176
+ /**
177
+ * List of provider slugs to allow for this request
178
+ */
179
+ only?: string[];
180
+ /**
181
+ * List of provider slugs to skip for this request
182
+ */
183
+ ignore?: string[];
184
+ /**
185
+ * Sort providers by price, throughput, or latency
186
+ */
187
+ sort?: 'price' | 'throughput' | 'latency';
188
+ /**
189
+ * Maximum pricing you want to pay for this request
190
+ */
191
+ max_price?: {
192
+ prompt?: number | string;
193
+ completion?: number | string;
194
+ image?: number | string;
195
+ audio?: number | string;
196
+ request?: number | string;
197
+ };
133
198
  };
134
199
  } & OpenRouterSharedSettings;
135
200
 
@@ -277,6 +342,7 @@ declare class OpenRouterChatLanguageModel implements LanguageModelV2 {
277
342
  readonly provider = "openrouter";
278
343
  readonly defaultObjectGenerationMode: "tool";
279
344
  readonly modelId: OpenRouterChatModelId;
345
+ readonly supportsImageUrls = true;
280
346
  readonly supportedUrls: Record<string, RegExp[]>;
281
347
  readonly settings: OpenRouterChatSettings;
282
348
  private readonly config;
@@ -330,6 +396,7 @@ declare class OpenRouterCompletionLanguageModel implements LanguageModelV2 {
330
396
  readonly specificationVersion: "v2";
331
397
  readonly provider = "openrouter";
332
398
  readonly modelId: OpenRouterCompletionModelId;
399
+ readonly supportsImageUrls = true;
333
400
  readonly supportedUrls: Record<string, RegExp[]>;
334
401
  readonly defaultObjectGenerationMode: undefined;
335
402
  readonly settings: OpenRouterCompletionSettings;
@@ -340,6 +407,42 @@ declare class OpenRouterCompletionLanguageModel implements LanguageModelV2 {
340
407
  doStream(options: LanguageModelV2CallOptions): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>>;
341
408
  }
342
409
 
410
+ type OpenRouterEmbeddingConfig = {
411
+ provider: string;
412
+ headers: () => Record<string, string | undefined>;
413
+ url: (options: {
414
+ modelId: string;
415
+ path: string;
416
+ }) => string;
417
+ fetch?: typeof fetch;
418
+ extraBody?: Record<string, unknown>;
419
+ };
420
+ declare class OpenRouterEmbeddingModel implements EmbeddingModelV2<string> {
421
+ readonly specificationVersion: "v2";
422
+ readonly provider = "openrouter";
423
+ readonly modelId: OpenRouterEmbeddingModelId;
424
+ readonly settings: OpenRouterEmbeddingSettings;
425
+ readonly maxEmbeddingsPerCall: undefined;
426
+ readonly supportsParallelCalls = true;
427
+ private readonly config;
428
+ constructor(modelId: OpenRouterEmbeddingModelId, settings: OpenRouterEmbeddingSettings, config: OpenRouterEmbeddingConfig);
429
+ doEmbed(options: {
430
+ values: Array<string>;
431
+ abortSignal?: AbortSignal;
432
+ headers?: Record<string, string | undefined>;
433
+ }): Promise<{
434
+ embeddings: Array<Array<number>>;
435
+ usage?: {
436
+ tokens: number;
437
+ };
438
+ providerMetadata?: SharedV2ProviderMetadata;
439
+ response?: {
440
+ headers?: SharedV2Headers;
441
+ body?: unknown;
442
+ };
443
+ }>;
444
+ }
445
+
343
446
  interface OpenRouterProvider extends ProviderV2 {
344
447
  (modelId: OpenRouterChatModelId, settings?: OpenRouterCompletionSettings): OpenRouterCompletionLanguageModel;
345
448
  (modelId: OpenRouterChatModelId, settings?: OpenRouterChatSettings): OpenRouterChatLanguageModel;
@@ -353,6 +456,15 @@ interface OpenRouterProvider extends ProviderV2 {
353
456
  Creates an OpenRouter completion model for text generation.
354
457
  */
355
458
  completion(modelId: OpenRouterCompletionModelId, settings?: OpenRouterCompletionSettings): OpenRouterCompletionLanguageModel;
459
+ /**
460
+ Creates an OpenRouter text embedding model. (AI SDK v5)
461
+ */
462
+ textEmbeddingModel(modelId: OpenRouterEmbeddingModelId, settings?: OpenRouterEmbeddingSettings): OpenRouterEmbeddingModel;
463
+ /**
464
+ Creates an OpenRouter text embedding model. (AI SDK v4 - deprecated, use textEmbeddingModel instead)
465
+ @deprecated Use textEmbeddingModel instead
466
+ */
467
+ embedding(modelId: OpenRouterEmbeddingModelId, settings?: OpenRouterEmbeddingSettings): OpenRouterEmbeddingModel;
356
468
  }
357
469
  interface OpenRouterProviderSettings {
358
470
  /**
@@ -386,6 +498,11 @@ interface OpenRouterProviderSettings {
386
498
  A JSON object to send as the request body to access OpenRouter features & upstream provider features.
387
499
  */
388
500
  extraBody?: Record<string, unknown>;
501
+ /**
502
+ * Record of provider slugs to API keys for injecting into provider routing.
503
+ * Maps provider slugs (e.g. "anthropic", "openai") to their respective API keys.
504
+ */
505
+ api_keys?: Record<string, string>;
389
506
  }
390
507
  /**
391
508
  Create an OpenRouter provider instance.
@@ -414,6 +531,10 @@ declare class OpenRouter {
414
531
  Custom headers to include in the requests.
415
532
  */
416
533
  readonly headers?: Record<string, string>;
534
+ /**
535
+ * Record of provider slugs to API keys for injecting into provider routing.
536
+ */
537
+ readonly api_keys?: Record<string, string>;
417
538
  /**
418
539
  * Creates a new OpenRouter provider instance.
419
540
  */
@@ -421,6 +542,11 @@ declare class OpenRouter {
421
542
  private get baseConfig();
422
543
  chat(modelId: OpenRouterChatModelId, settings?: OpenRouterChatSettings): OpenRouterChatLanguageModel;
423
544
  completion(modelId: OpenRouterCompletionModelId, settings?: OpenRouterCompletionSettings): OpenRouterCompletionLanguageModel;
545
+ textEmbeddingModel(modelId: OpenRouterEmbeddingModelId, settings?: OpenRouterEmbeddingSettings): OpenRouterEmbeddingModel;
546
+ /**
547
+ * @deprecated Use textEmbeddingModel instead
548
+ */
549
+ embedding(modelId: OpenRouterEmbeddingModelId, settings?: OpenRouterEmbeddingSettings): OpenRouterEmbeddingModel;
424
550
  }
425
551
 
426
- export { OpenRouter, type OpenRouterCompletionSettings, type OpenRouterProvider, type OpenRouterProviderOptions, type OpenRouterProviderSettings, type OpenRouterSharedSettings, type OpenRouterUsageAccounting, createOpenRouter, openrouter };
552
+ export { OpenRouter, type OpenRouterCompletionSettings, type OpenRouterEmbeddingModelId, type OpenRouterEmbeddingSettings, type OpenRouterProvider, type OpenRouterProviderOptions, type OpenRouterProviderSettings, type OpenRouterSharedSettings, type OpenRouterUsageAccounting, createOpenRouter, openrouter };