@hebo-ai/gateway 0.6.2-rc0 → 0.6.2

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 (134) hide show
  1. package/README.md +3 -3
  2. package/dist/endpoints/chat-completions/converters.js +26 -21
  3. package/dist/endpoints/chat-completions/handler.js +2 -0
  4. package/dist/endpoints/chat-completions/otel.js +1 -1
  5. package/dist/endpoints/chat-completions/schema.d.ts +4 -18
  6. package/dist/endpoints/chat-completions/schema.js +14 -17
  7. package/dist/endpoints/embeddings/handler.js +2 -0
  8. package/dist/endpoints/embeddings/otel.js +5 -0
  9. package/dist/endpoints/embeddings/schema.d.ts +6 -0
  10. package/dist/endpoints/embeddings/schema.js +4 -1
  11. package/dist/endpoints/models/converters.js +3 -3
  12. package/dist/lifecycle.js +2 -2
  13. package/dist/logger/default.js +3 -3
  14. package/dist/logger/index.d.ts +2 -5
  15. package/dist/middleware/common.js +1 -0
  16. package/dist/middleware/utils.js +0 -3
  17. package/dist/models/amazon/middleware.js +8 -5
  18. package/dist/models/anthropic/middleware.js +13 -13
  19. package/dist/models/catalog.js +5 -1
  20. package/dist/models/cohere/middleware.js +7 -5
  21. package/dist/models/google/middleware.d.ts +1 -1
  22. package/dist/models/google/middleware.js +29 -25
  23. package/dist/models/openai/middleware.js +13 -9
  24. package/dist/models/voyage/middleware.js +2 -1
  25. package/dist/providers/bedrock/middleware.js +21 -23
  26. package/dist/providers/registry.js +3 -0
  27. package/dist/telemetry/fetch.js +7 -2
  28. package/dist/telemetry/gen-ai.js +15 -12
  29. package/dist/telemetry/memory.d.ts +1 -1
  30. package/dist/telemetry/memory.js +30 -14
  31. package/dist/telemetry/span.js +1 -1
  32. package/dist/telemetry/stream.js +30 -23
  33. package/dist/utils/env.js +4 -2
  34. package/dist/utils/preset.js +1 -0
  35. package/dist/utils/response.js +3 -1
  36. package/package.json +36 -50
  37. package/src/config.ts +0 -98
  38. package/src/endpoints/chat-completions/converters.test.ts +0 -631
  39. package/src/endpoints/chat-completions/converters.ts +0 -899
  40. package/src/endpoints/chat-completions/handler.test.ts +0 -391
  41. package/src/endpoints/chat-completions/handler.ts +0 -201
  42. package/src/endpoints/chat-completions/index.ts +0 -4
  43. package/src/endpoints/chat-completions/otel.test.ts +0 -315
  44. package/src/endpoints/chat-completions/otel.ts +0 -214
  45. package/src/endpoints/chat-completions/schema.ts +0 -364
  46. package/src/endpoints/embeddings/converters.ts +0 -51
  47. package/src/endpoints/embeddings/handler.test.ts +0 -133
  48. package/src/endpoints/embeddings/handler.ts +0 -137
  49. package/src/endpoints/embeddings/index.ts +0 -4
  50. package/src/endpoints/embeddings/otel.ts +0 -40
  51. package/src/endpoints/embeddings/schema.ts +0 -36
  52. package/src/endpoints/models/converters.ts +0 -56
  53. package/src/endpoints/models/handler.test.ts +0 -122
  54. package/src/endpoints/models/handler.ts +0 -37
  55. package/src/endpoints/models/index.ts +0 -3
  56. package/src/endpoints/models/schema.ts +0 -37
  57. package/src/errors/ai-sdk.ts +0 -99
  58. package/src/errors/gateway.ts +0 -17
  59. package/src/errors/openai.ts +0 -57
  60. package/src/errors/utils.ts +0 -47
  61. package/src/gateway.ts +0 -50
  62. package/src/index.ts +0 -19
  63. package/src/lifecycle.ts +0 -135
  64. package/src/logger/default.ts +0 -105
  65. package/src/logger/index.ts +0 -42
  66. package/src/middleware/common.test.ts +0 -215
  67. package/src/middleware/common.ts +0 -163
  68. package/src/middleware/debug.ts +0 -37
  69. package/src/middleware/matcher.ts +0 -161
  70. package/src/middleware/utils.ts +0 -34
  71. package/src/models/amazon/index.ts +0 -2
  72. package/src/models/amazon/middleware.test.ts +0 -133
  73. package/src/models/amazon/middleware.ts +0 -79
  74. package/src/models/amazon/presets.ts +0 -104
  75. package/src/models/anthropic/index.ts +0 -2
  76. package/src/models/anthropic/middleware.test.ts +0 -643
  77. package/src/models/anthropic/middleware.ts +0 -148
  78. package/src/models/anthropic/presets.ts +0 -191
  79. package/src/models/catalog.ts +0 -13
  80. package/src/models/cohere/index.ts +0 -2
  81. package/src/models/cohere/middleware.test.ts +0 -138
  82. package/src/models/cohere/middleware.ts +0 -76
  83. package/src/models/cohere/presets.ts +0 -186
  84. package/src/models/google/index.ts +0 -2
  85. package/src/models/google/middleware.test.ts +0 -298
  86. package/src/models/google/middleware.ts +0 -137
  87. package/src/models/google/presets.ts +0 -118
  88. package/src/models/meta/index.ts +0 -1
  89. package/src/models/meta/presets.ts +0 -143
  90. package/src/models/openai/index.ts +0 -2
  91. package/src/models/openai/middleware.test.ts +0 -189
  92. package/src/models/openai/middleware.ts +0 -103
  93. package/src/models/openai/presets.ts +0 -280
  94. package/src/models/types.ts +0 -114
  95. package/src/models/voyage/index.ts +0 -2
  96. package/src/models/voyage/middleware.test.ts +0 -28
  97. package/src/models/voyage/middleware.ts +0 -23
  98. package/src/models/voyage/presets.ts +0 -126
  99. package/src/providers/anthropic/canonical.ts +0 -17
  100. package/src/providers/anthropic/index.ts +0 -1
  101. package/src/providers/bedrock/canonical.ts +0 -87
  102. package/src/providers/bedrock/index.ts +0 -2
  103. package/src/providers/bedrock/middleware.test.ts +0 -303
  104. package/src/providers/bedrock/middleware.ts +0 -128
  105. package/src/providers/cohere/canonical.ts +0 -26
  106. package/src/providers/cohere/index.ts +0 -1
  107. package/src/providers/groq/canonical.ts +0 -21
  108. package/src/providers/groq/index.ts +0 -1
  109. package/src/providers/openai/canonical.ts +0 -16
  110. package/src/providers/openai/index.ts +0 -1
  111. package/src/providers/registry.test.ts +0 -44
  112. package/src/providers/registry.ts +0 -165
  113. package/src/providers/types.ts +0 -20
  114. package/src/providers/vertex/canonical.ts +0 -17
  115. package/src/providers/vertex/index.ts +0 -1
  116. package/src/providers/voyage/canonical.ts +0 -16
  117. package/src/providers/voyage/index.ts +0 -1
  118. package/src/telemetry/ai-sdk.ts +0 -46
  119. package/src/telemetry/baggage.ts +0 -27
  120. package/src/telemetry/fetch.ts +0 -62
  121. package/src/telemetry/gen-ai.ts +0 -113
  122. package/src/telemetry/http.ts +0 -62
  123. package/src/telemetry/index.ts +0 -1
  124. package/src/telemetry/memory.ts +0 -36
  125. package/src/telemetry/span.ts +0 -85
  126. package/src/telemetry/stream.ts +0 -64
  127. package/src/types.ts +0 -223
  128. package/src/utils/env.ts +0 -7
  129. package/src/utils/headers.ts +0 -27
  130. package/src/utils/preset.ts +0 -65
  131. package/src/utils/request.test.ts +0 -75
  132. package/src/utils/request.ts +0 -52
  133. package/src/utils/response.ts +0 -84
  134. package/src/utils/url.ts +0 -26
@@ -1,303 +0,0 @@
1
- import { MockLanguageModelV3 } from "ai/test";
2
- import { expect, test } from "bun:test";
3
-
4
- import { modelMiddlewareMatcher } from "../../middleware/matcher";
5
- import {
6
- bedrockClaudeReasoningMiddleware,
7
- bedrockGptReasoningMiddleware,
8
- bedrockPromptCachingMiddleware,
9
- } from "./middleware";
10
-
11
- test("bedrock middlewares > matching provider resolves GPT middleware", () => {
12
- const middleware = modelMiddlewareMatcher.resolve({
13
- kind: "text",
14
- modelId: "openai/gpt-oss-20b",
15
- providerId: "amazon-bedrock",
16
- });
17
-
18
- expect(middleware).toContain(bedrockGptReasoningMiddleware);
19
- });
20
-
21
- test("bedrock middlewares > matching provider resolves Claude middleware", () => {
22
- const middleware = modelMiddlewareMatcher.resolve({
23
- kind: "text",
24
- modelId: "anthropic/claude-opus-4.6",
25
- providerId: "amazon-bedrock",
26
- });
27
-
28
- expect(middleware).toContain(bedrockClaudeReasoningMiddleware);
29
- });
30
-
31
- test("bedrock middlewares > matching provider resolves prompt caching middleware for Claude", () => {
32
- const middleware = modelMiddlewareMatcher.resolve({
33
- kind: "text",
34
- modelId: "anthropic/claude-opus-4.6",
35
- providerId: "amazon-bedrock",
36
- });
37
-
38
- expect(middleware).toContain(bedrockPromptCachingMiddleware);
39
- });
40
-
41
- test("bedrock middlewares > matching provider resolves prompt caching middleware for Nova", () => {
42
- const middleware = modelMiddlewareMatcher.resolve({
43
- kind: "text",
44
- modelId: "amazon/nova-2-lite",
45
- providerId: "amazon-bedrock",
46
- });
47
-
48
- expect(middleware).toContain(bedrockPromptCachingMiddleware);
49
- });
50
-
51
- test("bedrockGptReasoningMiddleware > should map reasoningEffort into reasoningConfig", async () => {
52
- const params = {
53
- prompt: [],
54
- providerOptions: {
55
- bedrock: {
56
- reasoningEffort: "high",
57
- },
58
- },
59
- };
60
-
61
- const result = await bedrockGptReasoningMiddleware.transformParams!({
62
- type: "generate",
63
- params,
64
- model: new MockLanguageModelV3({ modelId: "openai/gpt-oss-20b" }),
65
- });
66
-
67
- expect(result.providerOptions?.bedrock).toEqual({
68
- reasoningConfig: {
69
- maxReasoningEffort: "high",
70
- },
71
- });
72
- });
73
-
74
- test("bedrockGptReasoningMiddleware > should skip non-gpt models", async () => {
75
- const params = {
76
- prompt: [],
77
- providerOptions: {
78
- bedrock: {
79
- reasoningEffort: "medium",
80
- },
81
- },
82
- };
83
-
84
- const result = await bedrockGptReasoningMiddleware.transformParams!({
85
- type: "generate",
86
- params,
87
- model: new MockLanguageModelV3({ modelId: "anthropic/claude-opus-4.6" }),
88
- });
89
-
90
- expect(result.providerOptions?.bedrock).toEqual({
91
- reasoningEffort: "medium",
92
- });
93
- });
94
-
95
- test("bedrockClaudeReasoningMiddleware > should map thinking/effort into reasoningConfig", async () => {
96
- const params = {
97
- prompt: [],
98
- providerOptions: {
99
- bedrock: {
100
- thinking: {
101
- type: "adaptive",
102
- budgetTokens: 4096,
103
- },
104
- effort: "max",
105
- },
106
- },
107
- };
108
-
109
- const result = await bedrockClaudeReasoningMiddleware.transformParams!({
110
- type: "generate",
111
- params,
112
- model: new MockLanguageModelV3({ modelId: "anthropic/claude-opus-4-6" }),
113
- });
114
-
115
- expect(result.providerOptions?.bedrock).toEqual({
116
- reasoningConfig: {
117
- type: "adaptive",
118
- budgetTokens: 4096,
119
- maxReasoningEffort: "max",
120
- },
121
- });
122
- });
123
-
124
- test("bedrockClaudeReasoningMiddleware > should skip non-claude models", async () => {
125
- const params = {
126
- prompt: [],
127
- providerOptions: {
128
- bedrock: {
129
- thinking: {
130
- type: "enabled",
131
- budgetTokens: 4096,
132
- },
133
- effort: "high",
134
- },
135
- },
136
- };
137
-
138
- const result = await bedrockClaudeReasoningMiddleware.transformParams!({
139
- type: "generate",
140
- params,
141
- model: new MockLanguageModelV3({ modelId: "openai/gpt-oss-20b" }),
142
- });
143
-
144
- expect(result.providerOptions?.bedrock).toEqual({
145
- thinking: {
146
- type: "enabled",
147
- budgetTokens: 4096,
148
- },
149
- effort: "high",
150
- });
151
- });
152
-
153
- test("bedrockClaudeReasoningMiddleware > should not set maxReasoningEffort for Claude 3.x", async () => {
154
- const params = {
155
- prompt: [],
156
- providerOptions: {
157
- bedrock: {
158
- thinking: {
159
- type: "enabled",
160
- budgetTokens: 4096,
161
- },
162
- effort: "high",
163
- },
164
- },
165
- };
166
-
167
- const result = await bedrockClaudeReasoningMiddleware.transformParams!({
168
- type: "generate",
169
- params,
170
- model: new MockLanguageModelV3({ modelId: "anthropic/claude-sonnet-3.7" }),
171
- });
172
-
173
- expect(result.providerOptions?.bedrock).toEqual({
174
- reasoningConfig: {
175
- type: "enabled",
176
- budgetTokens: 4096,
177
- },
178
- });
179
- });
180
-
181
- test("bedrockClaudeReasoningMiddleware > should not set maxReasoningEffort for Claude 4.5", async () => {
182
- const params = {
183
- prompt: [],
184
- providerOptions: {
185
- bedrock: {
186
- thinking: {
187
- type: "enabled",
188
- budgetTokens: 4096,
189
- },
190
- effort: "high",
191
- },
192
- },
193
- };
194
-
195
- const result = await bedrockClaudeReasoningMiddleware.transformParams!({
196
- type: "generate",
197
- params,
198
- model: new MockLanguageModelV3({ modelId: "anthropic/claude-opus-4.5" }),
199
- });
200
-
201
- expect(result.providerOptions?.bedrock).toEqual({
202
- reasoningConfig: {
203
- type: "enabled",
204
- budgetTokens: 4096,
205
- },
206
- });
207
- });
208
-
209
- test("bedrockPromptCachingMiddleware > should map message and part cacheControl to cachePoint", async () => {
210
- const params = {
211
- prompt: [
212
- {
213
- role: "system",
214
- content: [
215
- {
216
- type: "text",
217
- text: "Policy",
218
- providerOptions: {
219
- bedrock: {
220
- cacheControl: { type: "ephemeral", ttl: "1h" },
221
- },
222
- },
223
- },
224
- ],
225
- providerOptions: {
226
- bedrock: {
227
- cacheControl: { type: "ephemeral", ttl: "1h" },
228
- },
229
- },
230
- },
231
- ],
232
- providerOptions: {
233
- bedrock: {},
234
- },
235
- };
236
-
237
- const result = await bedrockPromptCachingMiddleware.transformParams!({
238
- type: "generate",
239
- params: params as any,
240
- model: new MockLanguageModelV3({ modelId: "amazon/nova-2-lite" }),
241
- });
242
-
243
- expect((result.prompt[0] as any).providerOptions.bedrock.cachePoint).toEqual({
244
- type: "default",
245
- });
246
- expect((result.prompt[0] as any).providerOptions.bedrock.cacheControl).toBeUndefined();
247
- expect((result.prompt[0] as any).content[0].providerOptions.bedrock.cachePoint).toEqual({
248
- type: "default",
249
- });
250
- expect((result.prompt[0] as any).content[0].providerOptions.bedrock.cacheControl).toBeUndefined();
251
- });
252
-
253
- test("bedrockPromptCachingMiddleware > should fallback from top-level cacheControl", async () => {
254
- const params = {
255
- prompt: [
256
- {
257
- role: "system",
258
- content: "Reusable context",
259
- },
260
- {
261
- role: "user",
262
- content: "Question",
263
- },
264
- ],
265
- providerOptions: {
266
- bedrock: {
267
- cacheControl: { type: "ephemeral", ttl: "1h" },
268
- },
269
- },
270
- };
271
-
272
- const result = await bedrockPromptCachingMiddleware.transformParams!({
273
- type: "generate",
274
- params: params as any,
275
- model: new MockLanguageModelV3({ modelId: "anthropic/claude-opus-4.6" }),
276
- });
277
-
278
- expect((result.prompt[1] as any).providerOptions).toBeUndefined();
279
- expect((result.providerOptions as any).bedrock.cacheControl).toBeUndefined();
280
- });
281
-
282
- test("bedrockPromptCachingMiddleware > should skip non-claude non-nova models", async () => {
283
- const params = {
284
- prompt: [{ role: "user", content: "Hello" }],
285
- providerOptions: {
286
- bedrock: {
287
- cacheControl: { type: "ephemeral", ttl: "1h" },
288
- },
289
- },
290
- };
291
-
292
- const result = await bedrockPromptCachingMiddleware.transformParams!({
293
- type: "generate",
294
- params: params as any,
295
- model: new MockLanguageModelV3({ modelId: "openai/gpt-oss-20b" }),
296
- });
297
-
298
- expect((result.providerOptions as any).bedrock.cacheControl).toEqual({
299
- type: "ephemeral",
300
- ttl: "1h",
301
- });
302
- expect((result.prompt[0] as any).providerOptions).toBeUndefined();
303
- });
@@ -1,128 +0,0 @@
1
- import type { LanguageModelMiddleware } from "ai";
2
-
3
- import type { ChatCompletionsCacheControl } from "../../endpoints/chat-completions/schema";
4
-
5
- import { modelMiddlewareMatcher } from "../../middleware/matcher";
6
-
7
- const isClaude46 = (modelId: string) => modelId.includes("-4-6");
8
-
9
- export const bedrockGptReasoningMiddleware: LanguageModelMiddleware = {
10
- specificationVersion: "v3",
11
- // oxlint-disable-next-line require-await
12
- transformParams: async ({ params, model }) => {
13
- if (!model.modelId.includes("gpt")) return params;
14
-
15
- const bedrock = params.providerOptions?.["bedrock"];
16
- if (!bedrock || typeof bedrock !== "object") return params;
17
-
18
- const effort = bedrock["reasoningEffort"];
19
- if (effort === undefined) return params;
20
-
21
- const target = (bedrock["reasoningConfig"] ??= {}) as Record<string, unknown>;
22
- target["maxReasoningEffort"] = effort;
23
-
24
- delete bedrock["reasoningEffort"];
25
-
26
- return params;
27
- },
28
- };
29
-
30
- export const bedrockClaudeReasoningMiddleware: LanguageModelMiddleware = {
31
- specificationVersion: "v3",
32
- // oxlint-disable-next-line require-await
33
- transformParams: async ({ params, model }) => {
34
- if (!model.modelId.includes("claude")) return params;
35
-
36
- const bedrock = params.providerOptions?.["bedrock"];
37
- if (!bedrock || typeof bedrock !== "object") return params;
38
-
39
- const thinking = bedrock["thinking"];
40
- const effort = bedrock["effort"];
41
-
42
- if (!thinking && effort === undefined) return params;
43
-
44
- const target = (bedrock["reasoningConfig"] ??= {}) as Record<string, unknown>;
45
-
46
- if (thinking && typeof thinking === "object") {
47
- const thinkingOptions = thinking as Record<string, unknown>;
48
- if (thinkingOptions["type"] !== undefined) {
49
- target["type"] = thinkingOptions["type"];
50
- }
51
- if (thinkingOptions["budgetTokens"] !== undefined) {
52
- target["budgetTokens"] = thinkingOptions["budgetTokens"];
53
- }
54
- }
55
-
56
- // FUTURE: bedrock currently does not support "effort" for other 4.x models
57
- if (effort !== undefined && isClaude46(model.modelId)) {
58
- target["maxReasoningEffort"] = effort;
59
- }
60
-
61
- delete bedrock["thinking"];
62
- delete bedrock["effort"];
63
-
64
- return params;
65
- },
66
- };
67
-
68
- function toBedrockCachePoint(modelId: string, cacheControl?: ChatCompletionsCacheControl) {
69
- const out: { type: "default"; ttl?: string } = { type: "default" };
70
- // Nova currently only supports 5m
71
- if (cacheControl?.ttl && !modelId.includes("nova")) {
72
- out.ttl = cacheControl.ttl;
73
- }
74
- return out;
75
- }
76
-
77
- // https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-caching.html
78
- export const bedrockPromptCachingMiddleware: LanguageModelMiddleware = {
79
- specificationVersion: "v3",
80
- // oxlint-disable-next-line require-await
81
- transformParams: async ({ params, model }) => {
82
- if (!model.modelId.includes("nova") && !model.modelId.includes("claude")) return params;
83
-
84
- let hasExplicitCacheControl = false;
85
- let lastCacheableBlock;
86
-
87
- const processCacheControl = (providerOptions?: Record<string, any>) => {
88
- if (!providerOptions) return;
89
-
90
- const entryBedrock = providerOptions["bedrock"] as Record<string, unknown> | undefined;
91
- const entryCacheControl = entryBedrock?.["cacheControl"] as ChatCompletionsCacheControl;
92
- if (!entryBedrock || !entryCacheControl) return;
93
-
94
- hasExplicitCacheControl = true;
95
- entryBedrock["cachePoint"] = toBedrockCachePoint(model.modelId, entryCacheControl);
96
- delete entryBedrock["cacheControl"];
97
- };
98
-
99
- for (const message of params.prompt) {
100
- processCacheControl(message["providerOptions"]);
101
-
102
- if (!Array.isArray(message["content"])) continue;
103
- for (const part of message["content"]) {
104
- processCacheControl(part["providerOptions"]);
105
- }
106
- lastCacheableBlock = message;
107
- }
108
-
109
- const bedrock = params.providerOptions?.["bedrock"];
110
- const cacheControl = bedrock?.["cacheControl"] as ChatCompletionsCacheControl;
111
- if (cacheControl && !hasExplicitCacheControl && lastCacheableBlock) {
112
- ((lastCacheableBlock["providerOptions"] ??= {})["bedrock"] ??= {})["cachePoint"] =
113
- toBedrockCachePoint(model.modelId, cacheControl);
114
- }
115
-
116
- delete bedrock?.["cacheControl"];
117
-
118
- return params;
119
- },
120
- };
121
-
122
- modelMiddlewareMatcher.useForProvider("amazon-bedrock", {
123
- language: [
124
- bedrockGptReasoningMiddleware,
125
- bedrockClaudeReasoningMiddleware,
126
- bedrockPromptCachingMiddleware,
127
- ],
128
- });
@@ -1,26 +0,0 @@
1
- import { type CohereProvider } from "@ai-sdk/cohere";
2
-
3
- import type { CanonicalModelId, ModelId } from "../../models/types";
4
-
5
- import { withCanonicalIds } from "../registry";
6
-
7
- const MAPPING = {
8
- "cohere/command-a": "command-a-03-2025",
9
- "cohere/command-r7b": "command-r7b-12-2024",
10
- "cohere/command-a-translate": "command-a-translate-08-2025",
11
- "cohere/command-a-reasoning": "command-a-reasoning-08-2025",
12
- "cohere/command-a-vision": "command-a-vision-07-2025",
13
- "cohere/command-r": "command-r-08-2024",
14
- "cohere/command-r-plus": "command-r-plus-08-2024",
15
- } as const satisfies Partial<Record<CanonicalModelId, string>>;
16
-
17
- export const withCanonicalIdsForCohere = (
18
- provider: CohereProvider,
19
- extraMapping?: Record<ModelId, string>,
20
- ) =>
21
- withCanonicalIds(provider, {
22
- mapping: { ...MAPPING, ...extraMapping },
23
- options: {
24
- stripNamespace: true,
25
- },
26
- });
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1,21 +0,0 @@
1
- import { type GroqProvider } from "@ai-sdk/groq";
2
-
3
- import type { CanonicalModelId, ModelId } from "../../models/types";
4
-
5
- import { withCanonicalIds } from "../registry";
6
-
7
- const MAPPING = {
8
- "meta/llama-3.1-8b": "llama-3.1-8b-instant",
9
- "meta/llama-3.3-70b": "llama-3.3-70b-versatile",
10
- "meta/llama-4-scout": "meta-llama/llama-4-scout-17b-16e-instruct",
11
- "meta/llama-4-maverick": "meta-llama/llama-4-maverick-17b-128e-instruct",
12
- } as const satisfies Partial<Record<CanonicalModelId, string>>;
13
-
14
- export const withCanonicalIdsForGroq = (
15
- provider: GroqProvider,
16
- extraMapping?: Record<ModelId, string>,
17
- ) =>
18
- withCanonicalIds(provider, {
19
- mapping: { ...MAPPING, ...extraMapping },
20
- options: { stripNamespace: false },
21
- });
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1,16 +0,0 @@
1
- import { type OpenAIProvider } from "@ai-sdk/openai";
2
-
3
- import type { ModelId } from "../../models/types";
4
-
5
- import { withCanonicalIds } from "../registry";
6
-
7
- export const withCanonicalIdsForOpenAI = (
8
- provider: OpenAIProvider,
9
- extraMapping?: Record<ModelId, string>,
10
- ) =>
11
- withCanonicalIds(provider, {
12
- mapping: extraMapping,
13
- options: {
14
- stripNamespace: true,
15
- },
16
- });
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1,44 +0,0 @@
1
- import { expect, test } from "bun:test";
2
- import { createVoyage } from "voyage-ai-provider";
3
-
4
- import { voyage4Lite } from "../models/voyage/presets";
5
- import { withCanonicalIdsForVoyage } from "../providers/voyage/canonical";
6
- import { resolveProvider } from "./registry";
7
-
8
- test("Voyage 4 Lite ID transformation in gateway config", () => {
9
- const config = {
10
- providers: {
11
- voyage: withCanonicalIdsForVoyage(
12
- createVoyage({
13
- apiKey: "test-key",
14
- }),
15
- ),
16
- },
17
- models: {
18
- ...voyage4Lite({
19
- providers: ["voyage"],
20
- }),
21
- },
22
- };
23
-
24
- const modelId = "voyage/voyage-4-lite";
25
-
26
- // 1. Resolve the provider for embeddings
27
- const provider = resolveProvider({
28
- providers: config.providers,
29
- models: config.models,
30
- modelId,
31
- operation: "embeddings",
32
- });
33
-
34
- // 2. Get the actual embedding model instance
35
- const embeddingModel = provider.embeddingModel(modelId);
36
-
37
- // 3. Verify the internal modelId is stripped of the 'voyage/' prefix
38
- expect(embeddingModel.modelId).toBe("voyage-4-lite");
39
-
40
- // 4. Check the providers registry directly
41
- const registry = config.providers;
42
- const directModel = registry["voyage"]!.embeddingModel(modelId);
43
- expect(directModel.modelId).toBe("voyage-4-lite");
44
- });