ai-world-sdk 1.5.11 → 1.5.13

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.
Files changed (156) hide show
  1. package/dist/cli/commands/config-cmd.js +1 -1
  2. package/dist/cli/config.js +3 -2
  3. package/dist/config.d.ts +3 -3
  4. package/dist/config.js +11 -5
  5. package/dist/llm.js +3 -3
  6. package/dist/vite-plugin.js +3 -1
  7. package/package.json +3 -2
  8. package/skills/ai-world-sdk/SKILL.md +1 -0
  9. package/skills/ai-world-sdk/docs/cli-usage.md +7 -4
  10. package/pacakges/ai-sdk-provider/.changeset/README.md +0 -34
  11. package/pacakges/ai-sdk-provider/.changeset/config.json +0 -13
  12. package/pacakges/ai-sdk-provider/.github/PULL_REQUEST_TEMPLATE.md +0 -16
  13. package/pacakges/ai-sdk-provider/.github/workflows/ci.yaml +0 -24
  14. package/pacakges/ai-sdk-provider/.github/workflows/publish-manual.yaml +0 -36
  15. package/pacakges/ai-sdk-provider/.github/workflows/publish.yaml +0 -107
  16. package/pacakges/ai-sdk-provider/.vscode/settings.json +0 -32
  17. package/pacakges/ai-sdk-provider/CHANGELOG.md +0 -631
  18. package/pacakges/ai-sdk-provider/CLAUDE.md +0 -79
  19. package/pacakges/ai-sdk-provider/CONTRIBUTING.md +0 -241
  20. package/pacakges/ai-sdk-provider/LICENSE +0 -201
  21. package/pacakges/ai-sdk-provider/README.md +0 -426
  22. package/pacakges/ai-sdk-provider/biome.json +0 -122
  23. package/pacakges/ai-sdk-provider/e2e/cache-control.test.ts +0 -74
  24. package/pacakges/ai-sdk-provider/e2e/embeddings/index.test.ts +0 -128
  25. package/pacakges/ai-sdk-provider/e2e/fixtures/pdfs/generate-pdfs.sh +0 -181
  26. package/pacakges/ai-sdk-provider/e2e/fixtures/pdfs/large.json +0 -7
  27. package/pacakges/ai-sdk-provider/e2e/fixtures/pdfs/large.pdf +41 -12894
  28. package/pacakges/ai-sdk-provider/e2e/gemini/reasoning-multiturn.test.ts +0 -221
  29. package/pacakges/ai-sdk-provider/e2e/issues/issue-160-toolcallid-uniqueness.test.ts +0 -88
  30. package/pacakges/ai-sdk-provider/e2e/issues/issue-166-finish-reason-null.test.ts +0 -129
  31. package/pacakges/ai-sdk-provider/e2e/issues/issue-171-cache-tool-key-ordering.test.ts +0 -70
  32. package/pacakges/ai-sdk-provider/e2e/issues/issue-181-tool-response-image.test.ts +0 -199
  33. package/pacakges/ai-sdk-provider/e2e/issues/issue-190-streamobject-flush-error.test.ts +0 -114
  34. package/pacakges/ai-sdk-provider/e2e/issues/issue-194-grok-invalid-json.test.ts +0 -93
  35. package/pacakges/ai-sdk-provider/e2e/issues/issue-196-anthropic-1h-cache-ttl.test.ts +0 -85
  36. package/pacakges/ai-sdk-provider/e2e/issues/issue-199-openai-pdf-processing.test.ts +0 -102
  37. package/pacakges/ai-sdk-provider/e2e/issues/issue-212-anthropic-web-search-online.test.ts +0 -128
  38. package/pacakges/ai-sdk-provider/e2e/issues/issue-234-prompt-caching.test.ts +0 -201
  39. package/pacakges/ai-sdk-provider/e2e/issues/issue-237-reasoning-linebreaks.test.ts +0 -103
  40. package/pacakges/ai-sdk-provider/e2e/issues/issue-248-gemini-web-search-empty-response.test.ts +0 -210
  41. package/pacakges/ai-sdk-provider/e2e/issues/issue-269-image-size-parameter.test.ts +0 -208
  42. package/pacakges/ai-sdk-provider/e2e/issues/issue-287-tool-calls-missing-arguments.test.ts +0 -87
  43. package/pacakges/ai-sdk-provider/e2e/issues/issue-341-cache-control-last-text-part.test.ts +0 -138
  44. package/pacakges/ai-sdk-provider/e2e/issues/issue-383-video-url-support.test.ts +0 -120
  45. package/pacakges/ai-sdk-provider/e2e/issues/issue-386-image-files-parameter.test.ts +0 -109
  46. package/pacakges/ai-sdk-provider/e2e/issues/issue-387-temperature-settings.test.ts +0 -113
  47. package/pacakges/ai-sdk-provider/e2e/issues/issue-389-system-cache-control.test.ts +0 -107
  48. package/pacakges/ai-sdk-provider/e2e/issues/issue-391-reasoning-effort-values.test.ts +0 -121
  49. package/pacakges/ai-sdk-provider/e2e/issues/issue-392-auto-router-plugin.test.ts +0 -84
  50. package/pacakges/ai-sdk-provider/e2e/issues/issue-394-reasoning-end-signature.test.ts +0 -157
  51. package/pacakges/ai-sdk-provider/e2e/issues/issue-407-token-usage-details.test.ts +0 -141
  52. package/pacakges/ai-sdk-provider/e2e/issues/issue-411-output-object-tools-conflict.test.ts +0 -75
  53. package/pacakges/ai-sdk-provider/e2e/issues/issue-412-mid-stream-termination.test.ts +0 -217
  54. package/pacakges/ai-sdk-provider/e2e/issues/issue-413-reasoning-metadata-bloat.test.ts +0 -292
  55. package/pacakges/ai-sdk-provider/e2e/issues/issue-413-tool-input-end-streaming.test.ts +0 -167
  56. package/pacakges/ai-sdk-provider/e2e/issues/issue-418-gemini-thought-signature.test.ts +0 -171
  57. package/pacakges/ai-sdk-provider/e2e/issues/issue-419-420-finish-reason-usage-fallback.test.ts +0 -87
  58. package/pacakges/ai-sdk-provider/e2e/issues/issue-419-usage-fallback.test.ts +0 -106
  59. package/pacakges/ai-sdk-provider/e2e/issues/issue-422-incomplete-error-information.test.ts +0 -46
  60. package/pacakges/ai-sdk-provider/e2e/issues/issue-423-signature-stripped.test.ts +0 -165
  61. package/pacakges/ai-sdk-provider/e2e/issues/issue-423-streaming-signature-loss.test.ts +0 -161
  62. package/pacakges/ai-sdk-provider/e2e/issues/issue-423-uimessage-roundtrip.test.ts +0 -111
  63. package/pacakges/ai-sdk-provider/e2e/issues/issue-424-anthropic-auto-cache.test.ts +0 -66
  64. package/pacakges/ai-sdk-provider/e2e/issues/issue-432-raw-response-body.test.ts +0 -52
  65. package/pacakges/ai-sdk-provider/e2e/issues/issue-438-gemini-reasoning-redacted.test.ts +0 -120
  66. package/pacakges/ai-sdk-provider/e2e/issues/issue-439-exact-payload.test.ts +0 -108
  67. package/pacakges/ai-sdk-provider/e2e/issues/issue-443-eager-input-streaming.test.ts +0 -204
  68. package/pacakges/ai-sdk-provider/e2e/issues/issue-453-signature-reopen.test.ts +0 -203
  69. package/pacakges/ai-sdk-provider/e2e/issues/issue-474-web-search-server-tool.test.ts +0 -102
  70. package/pacakges/ai-sdk-provider/e2e/issues/issue-483-response-format-strict-option.test.ts +0 -199
  71. package/pacakges/ai-sdk-provider/e2e/issues/issue-484-image-url-query-params.test.ts +0 -165
  72. package/pacakges/ai-sdk-provider/e2e/issues/issue-63-web-search-annotations.test.ts +0 -159
  73. package/pacakges/ai-sdk-provider/e2e/parallel-tool-calls.test.ts +0 -425
  74. package/pacakges/ai-sdk-provider/e2e/pdf-blob/index.test.ts +0 -139
  75. package/pacakges/ai-sdk-provider/e2e/pdf-url/index.test.ts +0 -60
  76. package/pacakges/ai-sdk-provider/e2e/reasoning-effort.test.ts +0 -139
  77. package/pacakges/ai-sdk-provider/e2e/reasoning-multiturn/index.test.ts +0 -69
  78. package/pacakges/ai-sdk-provider/e2e/tools-with-reasoning.test.ts +0 -76
  79. package/pacakges/ai-sdk-provider/e2e/tools.ts +0 -61
  80. package/pacakges/ai-sdk-provider/e2e/usage-accounting.test.ts +0 -55
  81. package/pacakges/ai-sdk-provider/e2e/utils.ts +0 -15
  82. package/pacakges/ai-sdk-provider/e2e/video-generation.test.ts +0 -43
  83. package/pacakges/ai-sdk-provider/e2e/web-search/index.test.ts +0 -50
  84. package/pacakges/ai-sdk-provider/example.env.e2e +0 -3
  85. package/pacakges/ai-sdk-provider/pnpm-lock.yaml +0 -3075
  86. package/pacakges/ai-sdk-provider/pnpm-workspace.yaml +0 -6
  87. package/pacakges/ai-sdk-provider/src/chat/convert-to-openrouter-chat-messages.test.ts +0 -3079
  88. package/pacakges/ai-sdk-provider/src/chat/convert-to-openrouter-chat-messages.ts +0 -618
  89. package/pacakges/ai-sdk-provider/src/chat/errors.test.ts +0 -97
  90. package/pacakges/ai-sdk-provider/src/chat/file-parser-schema.test.ts +0 -112
  91. package/pacakges/ai-sdk-provider/src/chat/file-url-utils.ts +0 -167
  92. package/pacakges/ai-sdk-provider/src/chat/get-tool-choice.ts +0 -42
  93. package/pacakges/ai-sdk-provider/src/chat/index.test.ts +0 -6093
  94. package/pacakges/ai-sdk-provider/src/chat/index.ts +0 -1300
  95. package/pacakges/ai-sdk-provider/src/chat/is-url.ts +0 -15
  96. package/pacakges/ai-sdk-provider/src/chat/large-pdf-response.test.ts +0 -108
  97. package/pacakges/ai-sdk-provider/src/chat/payload-comparison.test.ts +0 -154
  98. package/pacakges/ai-sdk-provider/src/chat/schemas.ts +0 -288
  99. package/pacakges/ai-sdk-provider/src/chat/signature-roundtrip.test.ts +0 -777
  100. package/pacakges/ai-sdk-provider/src/completion/convert-to-openrouter-completion-prompt.ts +0 -150
  101. package/pacakges/ai-sdk-provider/src/completion/index.test.ts +0 -958
  102. package/pacakges/ai-sdk-provider/src/completion/index.ts +0 -441
  103. package/pacakges/ai-sdk-provider/src/completion/schemas.ts +0 -67
  104. package/pacakges/ai-sdk-provider/src/embedding/index.test.ts +0 -262
  105. package/pacakges/ai-sdk-provider/src/embedding/index.ts +0 -113
  106. package/pacakges/ai-sdk-provider/src/embedding/schemas.ts +0 -26
  107. package/pacakges/ai-sdk-provider/src/facade.ts +0 -131
  108. package/pacakges/ai-sdk-provider/src/image/index.test.ts +0 -769
  109. package/pacakges/ai-sdk-provider/src/image/index.ts +0 -206
  110. package/pacakges/ai-sdk-provider/src/image/schemas.ts +0 -48
  111. package/pacakges/ai-sdk-provider/src/index.ts +0 -3
  112. package/pacakges/ai-sdk-provider/src/internal/index.ts +0 -10
  113. package/pacakges/ai-sdk-provider/src/provider.ts +0 -327
  114. package/pacakges/ai-sdk-provider/src/schemas/error-response.test.ts +0 -171
  115. package/pacakges/ai-sdk-provider/src/schemas/error-response.ts +0 -105
  116. package/pacakges/ai-sdk-provider/src/schemas/format.ts +0 -12
  117. package/pacakges/ai-sdk-provider/src/schemas/image.ts +0 -23
  118. package/pacakges/ai-sdk-provider/src/schemas/provider-metadata.ts +0 -91
  119. package/pacakges/ai-sdk-provider/src/schemas/reasoning-details.ts +0 -92
  120. package/pacakges/ai-sdk-provider/src/tests/provider-options.test.ts +0 -234
  121. package/pacakges/ai-sdk-provider/src/tests/stream-usage-accounting.test.ts +0 -409
  122. package/pacakges/ai-sdk-provider/src/tests/usage-accounting.test.ts +0 -555
  123. package/pacakges/ai-sdk-provider/src/tests/web-search-tool.test.ts +0 -319
  124. package/pacakges/ai-sdk-provider/src/tool/web-search.ts +0 -52
  125. package/pacakges/ai-sdk-provider/src/types/index.ts +0 -114
  126. package/pacakges/ai-sdk-provider/src/types/openrouter-api-types.ts +0 -83
  127. package/pacakges/ai-sdk-provider/src/types/openrouter-chat-completions-input.ts +0 -116
  128. package/pacakges/ai-sdk-provider/src/types/openrouter-chat-settings.ts +0 -233
  129. package/pacakges/ai-sdk-provider/src/types/openrouter-completion-settings.ts +0 -39
  130. package/pacakges/ai-sdk-provider/src/types/openrouter-embedding-settings.ts +0 -56
  131. package/pacakges/ai-sdk-provider/src/types/openrouter-image-settings.ts +0 -49
  132. package/pacakges/ai-sdk-provider/src/types/openrouter-video-settings.ts +0 -26
  133. package/pacakges/ai-sdk-provider/src/utils/compute-token-usage.test.ts +0 -186
  134. package/pacakges/ai-sdk-provider/src/utils/compute-token-usage.ts +0 -55
  135. package/pacakges/ai-sdk-provider/src/utils/deterministic-stringify.test.ts +0 -87
  136. package/pacakges/ai-sdk-provider/src/utils/deterministic-stringify.ts +0 -35
  137. package/pacakges/ai-sdk-provider/src/utils/map-finish-reason.ts +0 -43
  138. package/pacakges/ai-sdk-provider/src/utils/reasoning-details-duplicate-tracker.test.ts +0 -324
  139. package/pacakges/ai-sdk-provider/src/utils/reasoning-details-duplicate-tracker.ts +0 -70
  140. package/pacakges/ai-sdk-provider/src/utils/remove-undefined.ts +0 -12
  141. package/pacakges/ai-sdk-provider/src/utils/type-guards.ts +0 -6
  142. package/pacakges/ai-sdk-provider/src/utils/with-stream-error-handling.test.ts +0 -119
  143. package/pacakges/ai-sdk-provider/src/utils/with-stream-error-handling.ts +0 -25
  144. package/pacakges/ai-sdk-provider/src/utils/with-user-agent-suffix.test.ts +0 -133
  145. package/pacakges/ai-sdk-provider/src/utils/with-user-agent-suffix.ts +0 -78
  146. package/pacakges/ai-sdk-provider/src/version.ts +0 -4
  147. package/pacakges/ai-sdk-provider/src/video/index.test.ts +0 -515
  148. package/pacakges/ai-sdk-provider/src/video/index.ts +0 -275
  149. package/pacakges/ai-sdk-provider/src/video/schemas.ts +0 -36
  150. package/pacakges/ai-sdk-provider/tsconfig.json +0 -42
  151. package/pacakges/ai-sdk-provider/tsup.config.ts +0 -28
  152. package/pacakges/ai-sdk-provider/turbo.json +0 -8
  153. package/pacakges/ai-sdk-provider/vitest.e2e.config.ts +0 -21
  154. package/pacakges/ai-sdk-provider/vitest.edge.config.ts +0 -16
  155. package/pacakges/ai-sdk-provider/vitest.issues.config.ts +0 -28
  156. package/pacakges/ai-sdk-provider/vitest.node.config.ts +0 -16
@@ -1,262 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { createOpenRouter } from '../provider';
3
- import { OpenRouterEmbeddingModel } from './index';
4
-
5
- describe('OpenRouterEmbeddingModel', () => {
6
- const mockFetch = async (
7
- _url: URL | RequestInfo,
8
- _init?: RequestInit,
9
- ): Promise<Response> => {
10
- return new Response(
11
- JSON.stringify({
12
- id: 'test-id',
13
- object: 'list',
14
- data: [
15
- {
16
- object: 'embedding',
17
- embedding: new Array(1536).fill(0.1),
18
- index: 0,
19
- },
20
- ],
21
- model: 'openai/text-embedding-3-small',
22
- usage: {
23
- prompt_tokens: 5,
24
- total_tokens: 5,
25
- cost: 0.00001,
26
- },
27
- }),
28
- {
29
- status: 200,
30
- headers: {
31
- 'content-type': 'application/json',
32
- },
33
- },
34
- );
35
- };
36
-
37
- describe('provider methods', () => {
38
- it('should expose textEmbeddingModel method', () => {
39
- const provider = createOpenRouter({ apiKey: 'test-key' });
40
- expect(provider.textEmbeddingModel).toBeDefined();
41
- expect(typeof provider.textEmbeddingModel).toBe('function');
42
- });
43
-
44
- it('should expose embedding method (deprecated)', () => {
45
- const provider = createOpenRouter({ apiKey: 'test-key' });
46
- expect(provider.embedding).toBeDefined();
47
- expect(typeof provider.embedding).toBe('function');
48
- });
49
-
50
- it('should create an embedding model instance', () => {
51
- const provider = createOpenRouter({ apiKey: 'test-key' });
52
- const model = provider.textEmbeddingModel(
53
- 'openai/text-embedding-3-small',
54
- );
55
- expect(model).toBeInstanceOf(OpenRouterEmbeddingModel);
56
- expect(model.modelId).toBe('openai/text-embedding-3-small');
57
- expect(model.provider).toBe('openrouter');
58
- expect(model.specificationVersion).toBe('v3');
59
- });
60
- });
61
-
62
- describe('doEmbed', () => {
63
- it('should embed a single value', async () => {
64
- const provider = createOpenRouter({
65
- apiKey: 'test-key',
66
- fetch: mockFetch,
67
- });
68
- const model = provider.textEmbeddingModel(
69
- 'openai/text-embedding-3-small',
70
- );
71
-
72
- const result = await model.doEmbed({
73
- values: ['sunny day at the beach'],
74
- });
75
-
76
- expect(result.embeddings).toHaveLength(1);
77
- expect(result.embeddings[0]).toHaveLength(1536);
78
- expect(result.usage).toEqual({ tokens: 5 });
79
- expect(
80
- (result.providerMetadata?.openrouter as { usage?: { cost?: number } })
81
- ?.usage?.cost,
82
- ).toBe(0.00001);
83
- });
84
-
85
- it('should embed multiple values', async () => {
86
- const mockFetchMultiple = async (
87
- _url: URL | RequestInfo,
88
- _init?: RequestInit,
89
- ): Promise<Response> => {
90
- return new Response(
91
- JSON.stringify({
92
- object: 'list',
93
- data: [
94
- {
95
- object: 'embedding',
96
- embedding: new Array(1536).fill(0.1),
97
- index: 0,
98
- },
99
- {
100
- object: 'embedding',
101
- embedding: new Array(1536).fill(0.2),
102
- index: 1,
103
- },
104
- {
105
- object: 'embedding',
106
- embedding: new Array(1536).fill(0.3),
107
- index: 2,
108
- },
109
- ],
110
- model: 'openai/text-embedding-3-small',
111
- usage: {
112
- prompt_tokens: 15,
113
- total_tokens: 15,
114
- },
115
- }),
116
- {
117
- status: 200,
118
- headers: {
119
- 'content-type': 'application/json',
120
- },
121
- },
122
- );
123
- };
124
-
125
- const provider = createOpenRouter({
126
- apiKey: 'test-key',
127
- fetch: mockFetchMultiple,
128
- });
129
- const model = provider.textEmbeddingModel(
130
- 'openai/text-embedding-3-small',
131
- );
132
-
133
- const result = await model.doEmbed({
134
- values: [
135
- 'sunny day at the beach',
136
- 'rainy day in the city',
137
- 'snowy mountain peak',
138
- ],
139
- });
140
-
141
- expect(result.embeddings).toHaveLength(3);
142
- expect(result.embeddings[0]).toHaveLength(1536);
143
- expect(result.embeddings[1]).toHaveLength(1536);
144
- expect(result.embeddings[2]).toHaveLength(1536);
145
- expect(result.usage).toEqual({ tokens: 15 });
146
- });
147
-
148
- it('should pass custom settings to API', async () => {
149
- let capturedRequest: Record<string, unknown> | undefined;
150
-
151
- const mockFetchWithCapture = async (
152
- _url: URL | RequestInfo,
153
- init?: RequestInit,
154
- ): Promise<Response> => {
155
- capturedRequest = JSON.parse(init?.body as string);
156
- return new Response(
157
- JSON.stringify({
158
- object: 'list',
159
- data: [
160
- {
161
- object: 'embedding',
162
- embedding: new Array(1536).fill(0.1),
163
- index: 0,
164
- },
165
- ],
166
- model: 'openai/text-embedding-3-small',
167
- usage: {
168
- prompt_tokens: 5,
169
- total_tokens: 5,
170
- },
171
- }),
172
- {
173
- status: 200,
174
- headers: {
175
- 'content-type': 'application/json',
176
- },
177
- },
178
- );
179
- };
180
-
181
- const provider = createOpenRouter({
182
- apiKey: 'test-key',
183
- fetch: mockFetchWithCapture,
184
- });
185
-
186
- const model = provider.textEmbeddingModel(
187
- 'openai/text-embedding-3-small',
188
- {
189
- user: 'test-user-123',
190
- provider: {
191
- order: ['openai'],
192
- allow_fallbacks: false,
193
- },
194
- },
195
- );
196
-
197
- await model.doEmbed({
198
- values: ['test input'],
199
- });
200
-
201
- expect(capturedRequest?.user).toBe('test-user-123');
202
- expect(capturedRequest?.provider).toEqual({
203
- order: ['openai'],
204
- allow_fallbacks: false,
205
- });
206
- expect(capturedRequest?.model).toBe('openai/text-embedding-3-small');
207
- expect(capturedRequest?.input).toEqual(['test input']);
208
- });
209
-
210
- it('should handle response without usage information', async () => {
211
- const mockFetchNoUsage = async (
212
- _url: URL | RequestInfo,
213
- _init?: RequestInit,
214
- ): Promise<Response> => {
215
- return new Response(
216
- JSON.stringify({
217
- object: 'list',
218
- data: [
219
- {
220
- object: 'embedding',
221
- embedding: new Array(1536).fill(0.1),
222
- index: 0,
223
- },
224
- ],
225
- model: 'openai/text-embedding-3-small',
226
- }),
227
- {
228
- status: 200,
229
- headers: {
230
- 'content-type': 'application/json',
231
- },
232
- },
233
- );
234
- };
235
-
236
- const provider = createOpenRouter({
237
- apiKey: 'test-key',
238
- fetch: mockFetchNoUsage,
239
- });
240
- const model = provider.textEmbeddingModel(
241
- 'openai/text-embedding-3-small',
242
- );
243
-
244
- const result = await model.doEmbed({
245
- values: ['test'],
246
- });
247
-
248
- expect(result.embeddings).toHaveLength(1);
249
- expect(result.usage).toBeUndefined();
250
- expect(result.providerMetadata).toStrictEqual({
251
- openrouter: {
252
- provider: '',
253
- usage: {
254
- promptTokens: 0,
255
- completionTokens: 0,
256
- totalTokens: 0,
257
- },
258
- },
259
- });
260
- });
261
- });
262
- });
@@ -1,113 +0,0 @@
1
- import type {
2
- EmbeddingModelV3,
3
- SharedV3Headers,
4
- SharedV3ProviderMetadata,
5
- } from '@ai-sdk/provider';
6
- import type {
7
- OpenRouterEmbeddingModelId,
8
- OpenRouterEmbeddingSettings,
9
- } from '../types/openrouter-embedding-settings';
10
-
11
- import {
12
- combineHeaders,
13
- createJsonResponseHandler,
14
- postJsonToApi,
15
- } from '@ai-sdk/provider-utils';
16
- import { openrouterFailedResponseHandler } from '../schemas/error-response';
17
- import { OpenRouterProviderMetadataSchema } from '../schemas/provider-metadata';
18
- import { OpenRouterEmbeddingResponseSchema } from './schemas';
19
-
20
- type OpenRouterEmbeddingConfig = {
21
- provider: string;
22
- headers: () => Record<string, string | undefined>;
23
- url: (options: { modelId: string; path: string }) => string;
24
- fetch?: typeof fetch;
25
- extraBody?: Record<string, unknown>;
26
- };
27
-
28
- export class OpenRouterEmbeddingModel implements EmbeddingModelV3 {
29
- readonly specificationVersion = 'v3' as const;
30
- readonly provider = 'openrouter';
31
- readonly modelId: OpenRouterEmbeddingModelId;
32
- readonly settings: OpenRouterEmbeddingSettings;
33
- readonly maxEmbeddingsPerCall = undefined;
34
- readonly supportsParallelCalls = true;
35
-
36
- private readonly config: OpenRouterEmbeddingConfig;
37
-
38
- constructor(
39
- modelId: OpenRouterEmbeddingModelId,
40
- settings: OpenRouterEmbeddingSettings,
41
- config: OpenRouterEmbeddingConfig,
42
- ) {
43
- this.modelId = modelId;
44
- this.settings = settings;
45
- this.config = config;
46
- }
47
-
48
- async doEmbed(options: {
49
- values: Array<string>;
50
- abortSignal?: AbortSignal;
51
- headers?: Record<string, string | undefined>;
52
- }): Promise<{
53
- embeddings: Array<Array<number>>;
54
- usage?: { tokens: number };
55
- providerMetadata?: SharedV3ProviderMetadata;
56
- response?: {
57
- headers?: SharedV3Headers;
58
- body?: unknown;
59
- };
60
- warnings: Array<import('@ai-sdk/provider').SharedV3Warning>;
61
- }> {
62
- const { values, abortSignal, headers } = options;
63
-
64
- const args = {
65
- model: this.modelId,
66
- input: values,
67
- user: this.settings.user,
68
- provider: this.settings.provider,
69
- ...this.config.extraBody,
70
- ...this.settings.extraBody,
71
- };
72
-
73
- const { value: responseValue, responseHeaders } = await postJsonToApi({
74
- url: this.config.url({
75
- path: '/embeddings',
76
- modelId: this.modelId,
77
- }),
78
- headers: combineHeaders(this.config.headers(), headers),
79
- body: args,
80
- failedResponseHandler: openrouterFailedResponseHandler,
81
- successfulResponseHandler: createJsonResponseHandler(
82
- OpenRouterEmbeddingResponseSchema,
83
- ),
84
- abortSignal,
85
- fetch: this.config.fetch,
86
- });
87
-
88
- return {
89
- embeddings: responseValue.data.map((item) => item.embedding),
90
- usage: responseValue.usage
91
- ? { tokens: responseValue.usage.prompt_tokens }
92
- : undefined,
93
- providerMetadata: {
94
- openrouter: OpenRouterProviderMetadataSchema.parse({
95
- provider: responseValue.provider ?? '',
96
- usage: {
97
- promptTokens: responseValue.usage?.prompt_tokens ?? 0,
98
- completionTokens: 0,
99
- totalTokens: responseValue.usage?.total_tokens ?? 0,
100
- ...(responseValue.usage?.cost != null
101
- ? { cost: responseValue.usage.cost }
102
- : {}),
103
- },
104
- }),
105
- },
106
- response: {
107
- headers: responseHeaders,
108
- body: responseValue,
109
- },
110
- warnings: [],
111
- };
112
- }
113
- }
@@ -1,26 +0,0 @@
1
- import { z } from 'zod/v4';
2
-
3
- const openrouterEmbeddingUsageSchema = z.object({
4
- prompt_tokens: z.number(),
5
- total_tokens: z.number(),
6
- cost: z.number().optional(),
7
- });
8
-
9
- const openrouterEmbeddingDataSchema = z.object({
10
- object: z.literal('embedding'),
11
- embedding: z.array(z.number()),
12
- index: z.number().optional(),
13
- });
14
-
15
- export const OpenRouterEmbeddingResponseSchema = z.object({
16
- id: z.string().optional(),
17
- object: z.literal('list'),
18
- data: z.array(openrouterEmbeddingDataSchema),
19
- model: z.string(),
20
- provider: z.string().optional(),
21
- usage: openrouterEmbeddingUsageSchema.optional(),
22
- });
23
-
24
- export type OpenRouterEmbeddingResponse = z.infer<
25
- typeof OpenRouterEmbeddingResponseSchema
26
- >;
@@ -1,131 +0,0 @@
1
- import type { OpenRouterProviderSettings } from './provider';
2
- import type {
3
- OpenRouterChatModelId,
4
- OpenRouterChatSettings,
5
- } from './types/openrouter-chat-settings';
6
- import type {
7
- OpenRouterCompletionModelId,
8
- OpenRouterCompletionSettings,
9
- } from './types/openrouter-completion-settings';
10
- import type {
11
- OpenRouterEmbeddingModelId,
12
- OpenRouterEmbeddingSettings,
13
- } from './types/openrouter-embedding-settings';
14
-
15
- import { loadApiKey, withoutTrailingSlash } from '@ai-sdk/provider-utils';
16
- import { OpenRouterChatLanguageModel } from './chat';
17
- import { OpenRouterCompletionLanguageModel } from './completion';
18
- import { OpenRouterEmbeddingModel } from './embedding';
19
-
20
- /**
21
- @deprecated Use `createOpenRouter` instead.
22
- */
23
- export class OpenRouter {
24
- /**
25
- Use a different URL prefix for API calls, e.g. to use proxy servers.
26
- The default prefix is `https://openrouter.ai/api/v1`.
27
- */
28
- readonly baseURL: string;
29
-
30
- /**
31
- API key that is being sent using the `Authorization` header.
32
- It defaults to the `OPENROUTER_API_KEY` environment variable.
33
- */
34
- readonly apiKey?: string;
35
-
36
- /**
37
- Custom headers to include in the requests.
38
- */
39
- readonly headers?: Record<string, string>;
40
-
41
- /**
42
- * Record of provider slugs to API keys for injecting into provider routing.
43
- */
44
- readonly api_keys?: Record<string, string>;
45
-
46
- /**
47
- * App display name for the `X-OpenRouter-Title` header.
48
- */
49
- readonly appName?: string;
50
-
51
- /**
52
- * App URL for the `HTTP-Referer` header.
53
- */
54
- readonly appUrl?: string;
55
-
56
- /**
57
- * Creates a new OpenRouter provider instance.
58
- */
59
- constructor(options: OpenRouterProviderSettings = {}) {
60
- this.baseURL =
61
- withoutTrailingSlash(options.baseURL ?? options.baseUrl) ??
62
- 'https://openrouter.ai/api/v1';
63
- this.apiKey = options.apiKey;
64
- this.headers = options.headers;
65
- this.api_keys = options.api_keys;
66
- this.appName = options.appName;
67
- this.appUrl = options.appUrl;
68
- }
69
-
70
- private get baseConfig() {
71
- return {
72
- baseURL: this.baseURL,
73
- headers: () => ({
74
- Authorization: `Bearer ${loadApiKey({
75
- apiKey: this.apiKey,
76
- environmentVariableName: 'OPENROUTER_API_KEY',
77
- description: 'OpenRouter',
78
- })}`,
79
- ...(this.appName && { 'X-OpenRouter-Title': this.appName }),
80
- ...(this.appUrl && { 'HTTP-Referer': this.appUrl }),
81
- ...this.headers,
82
- ...(this.api_keys &&
83
- Object.keys(this.api_keys).length > 0 && {
84
- 'X-Provider-API-Keys': JSON.stringify(this.api_keys),
85
- }),
86
- }),
87
- };
88
- }
89
-
90
- chat(modelId: OpenRouterChatModelId, settings: OpenRouterChatSettings = {}) {
91
- return new OpenRouterChatLanguageModel(modelId, settings, {
92
- provider: 'openrouter.chat',
93
- ...this.baseConfig,
94
- compatibility: 'strict',
95
- url: ({ path }) => `${this.baseURL}${path}`,
96
- });
97
- }
98
-
99
- completion(
100
- modelId: OpenRouterCompletionModelId,
101
- settings: OpenRouterCompletionSettings = {},
102
- ) {
103
- return new OpenRouterCompletionLanguageModel(modelId, settings, {
104
- provider: 'openrouter.completion',
105
- ...this.baseConfig,
106
- compatibility: 'strict',
107
- url: ({ path }) => `${this.baseURL}${path}`,
108
- });
109
- }
110
-
111
- textEmbeddingModel(
112
- modelId: OpenRouterEmbeddingModelId,
113
- settings: OpenRouterEmbeddingSettings = {},
114
- ) {
115
- return new OpenRouterEmbeddingModel(modelId, settings, {
116
- provider: 'openrouter.embedding',
117
- ...this.baseConfig,
118
- url: ({ path }) => `${this.baseURL}${path}`,
119
- });
120
- }
121
-
122
- /**
123
- * @deprecated Use textEmbeddingModel instead
124
- */
125
- embedding(
126
- modelId: OpenRouterEmbeddingModelId,
127
- settings: OpenRouterEmbeddingSettings = {},
128
- ) {
129
- return this.textEmbeddingModel(modelId, settings);
130
- }
131
- }