@hebo-ai/gateway 0.5.2 → 0.6.0-rc0

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 (180) hide show
  1. package/README.md +32 -1
  2. package/package.json +17 -12
  3. package/src/endpoints/chat-completions/converters.test.ts +85 -1
  4. package/src/endpoints/chat-completions/converters.ts +139 -18
  5. package/src/endpoints/chat-completions/handler.test.ts +2 -0
  6. package/src/endpoints/chat-completions/index.ts +1 -0
  7. package/src/endpoints/chat-completions/otel.ts +1 -0
  8. package/src/endpoints/chat-completions/schema.ts +38 -4
  9. package/src/endpoints/embeddings/index.ts +1 -0
  10. package/src/lifecycle.ts +2 -2
  11. package/src/models/anthropic/middleware.test.ts +45 -1
  12. package/src/models/anthropic/middleware.ts +21 -1
  13. package/src/models/google/middleware.test.ts +30 -1
  14. package/src/models/google/middleware.ts +20 -1
  15. package/src/models/openai/middleware.test.ts +32 -1
  16. package/src/models/openai/middleware.ts +25 -1
  17. package/src/providers/bedrock/middleware.test.ts +121 -1
  18. package/src/providers/bedrock/middleware.ts +61 -1
  19. package/src/telemetry/fetch.ts +31 -4
  20. package/src/telemetry/index.ts +1 -0
  21. package/dist/config.d.ts +0 -2
  22. package/dist/config.js +0 -81
  23. package/dist/endpoints/chat-completions/converters.d.ts +0 -43
  24. package/dist/endpoints/chat-completions/converters.js +0 -551
  25. package/dist/endpoints/chat-completions/handler.d.ts +0 -2
  26. package/dist/endpoints/chat-completions/handler.js +0 -145
  27. package/dist/endpoints/chat-completions/index.d.ts +0 -3
  28. package/dist/endpoints/chat-completions/index.js +0 -3
  29. package/dist/endpoints/chat-completions/otel.d.ts +0 -6
  30. package/dist/endpoints/chat-completions/otel.js +0 -134
  31. package/dist/endpoints/chat-completions/schema.d.ts +0 -946
  32. package/dist/endpoints/chat-completions/schema.js +0 -257
  33. package/dist/endpoints/embeddings/converters.d.ts +0 -10
  34. package/dist/endpoints/embeddings/converters.js +0 -31
  35. package/dist/endpoints/embeddings/handler.d.ts +0 -2
  36. package/dist/endpoints/embeddings/handler.js +0 -101
  37. package/dist/endpoints/embeddings/index.d.ts +0 -3
  38. package/dist/endpoints/embeddings/index.js +0 -3
  39. package/dist/endpoints/embeddings/otel.d.ts +0 -6
  40. package/dist/endpoints/embeddings/otel.js +0 -35
  41. package/dist/endpoints/embeddings/schema.d.ts +0 -38
  42. package/dist/endpoints/embeddings/schema.js +0 -26
  43. package/dist/endpoints/models/converters.d.ts +0 -6
  44. package/dist/endpoints/models/converters.js +0 -42
  45. package/dist/endpoints/models/handler.d.ts +0 -2
  46. package/dist/endpoints/models/handler.js +0 -29
  47. package/dist/endpoints/models/index.d.ts +0 -3
  48. package/dist/endpoints/models/index.js +0 -3
  49. package/dist/endpoints/models/schema.d.ts +0 -42
  50. package/dist/endpoints/models/schema.js +0 -31
  51. package/dist/errors/ai-sdk.d.ts +0 -2
  52. package/dist/errors/ai-sdk.js +0 -52
  53. package/dist/errors/gateway.d.ts +0 -5
  54. package/dist/errors/gateway.js +0 -13
  55. package/dist/errors/openai.d.ts +0 -20
  56. package/dist/errors/openai.js +0 -40
  57. package/dist/errors/utils.d.ts +0 -22
  58. package/dist/errors/utils.js +0 -44
  59. package/dist/gateway.d.ts +0 -9
  60. package/dist/gateway.js +0 -34
  61. package/dist/index.d.ts +0 -14
  62. package/dist/index.js +0 -13
  63. package/dist/lifecycle.d.ts +0 -2
  64. package/dist/lifecycle.js +0 -94
  65. package/dist/logger/default.d.ts +0 -4
  66. package/dist/logger/default.js +0 -81
  67. package/dist/logger/index.d.ts +0 -14
  68. package/dist/logger/index.js +0 -25
  69. package/dist/middleware/common.d.ts +0 -12
  70. package/dist/middleware/common.js +0 -145
  71. package/dist/middleware/matcher.d.ts +0 -27
  72. package/dist/middleware/matcher.js +0 -112
  73. package/dist/middleware/utils.d.ts +0 -2
  74. package/dist/middleware/utils.js +0 -27
  75. package/dist/models/amazon/index.d.ts +0 -2
  76. package/dist/models/amazon/index.js +0 -2
  77. package/dist/models/amazon/middleware.d.ts +0 -3
  78. package/dist/models/amazon/middleware.js +0 -65
  79. package/dist/models/amazon/presets.d.ts +0 -2390
  80. package/dist/models/amazon/presets.js +0 -80
  81. package/dist/models/anthropic/index.d.ts +0 -2
  82. package/dist/models/anthropic/index.js +0 -2
  83. package/dist/models/anthropic/middleware.d.ts +0 -4
  84. package/dist/models/anthropic/middleware.js +0 -111
  85. package/dist/models/anthropic/presets.d.ts +0 -4802
  86. package/dist/models/anthropic/presets.js +0 -135
  87. package/dist/models/catalog.d.ts +0 -4
  88. package/dist/models/catalog.js +0 -4
  89. package/dist/models/cohere/index.d.ts +0 -2
  90. package/dist/models/cohere/index.js +0 -2
  91. package/dist/models/cohere/middleware.d.ts +0 -3
  92. package/dist/models/cohere/middleware.js +0 -60
  93. package/dist/models/cohere/presets.d.ts +0 -2918
  94. package/dist/models/cohere/presets.js +0 -134
  95. package/dist/models/google/index.d.ts +0 -2
  96. package/dist/models/google/index.js +0 -2
  97. package/dist/models/google/middleware.d.ts +0 -7
  98. package/dist/models/google/middleware.js +0 -103
  99. package/dist/models/google/presets.d.ts +0 -2553
  100. package/dist/models/google/presets.js +0 -83
  101. package/dist/models/meta/index.d.ts +0 -1
  102. package/dist/models/meta/index.js +0 -1
  103. package/dist/models/meta/presets.d.ts +0 -3254
  104. package/dist/models/meta/presets.js +0 -95
  105. package/dist/models/openai/index.d.ts +0 -2
  106. package/dist/models/openai/index.js +0 -2
  107. package/dist/models/openai/middleware.d.ts +0 -3
  108. package/dist/models/openai/middleware.js +0 -62
  109. package/dist/models/openai/presets.d.ts +0 -6634
  110. package/dist/models/openai/presets.js +0 -213
  111. package/dist/models/types.d.ts +0 -20
  112. package/dist/models/types.js +0 -84
  113. package/dist/models/voyage/index.d.ts +0 -2
  114. package/dist/models/voyage/index.js +0 -2
  115. package/dist/models/voyage/middleware.d.ts +0 -2
  116. package/dist/models/voyage/middleware.js +0 -18
  117. package/dist/models/voyage/presets.d.ts +0 -3471
  118. package/dist/models/voyage/presets.js +0 -85
  119. package/dist/providers/anthropic/canonical.d.ts +0 -3
  120. package/dist/providers/anthropic/canonical.js +0 -9
  121. package/dist/providers/anthropic/index.d.ts +0 -1
  122. package/dist/providers/anthropic/index.js +0 -1
  123. package/dist/providers/bedrock/canonical.d.ts +0 -17
  124. package/dist/providers/bedrock/canonical.js +0 -61
  125. package/dist/providers/bedrock/index.d.ts +0 -2
  126. package/dist/providers/bedrock/index.js +0 -2
  127. package/dist/providers/bedrock/middleware.d.ts +0 -3
  128. package/dist/providers/bedrock/middleware.js +0 -55
  129. package/dist/providers/cohere/canonical.d.ts +0 -3
  130. package/dist/providers/cohere/canonical.js +0 -17
  131. package/dist/providers/cohere/index.d.ts +0 -1
  132. package/dist/providers/cohere/index.js +0 -1
  133. package/dist/providers/groq/canonical.d.ts +0 -3
  134. package/dist/providers/groq/canonical.js +0 -12
  135. package/dist/providers/groq/index.d.ts +0 -1
  136. package/dist/providers/groq/index.js +0 -1
  137. package/dist/providers/openai/canonical.d.ts +0 -3
  138. package/dist/providers/openai/canonical.js +0 -8
  139. package/dist/providers/openai/index.d.ts +0 -1
  140. package/dist/providers/openai/index.js +0 -1
  141. package/dist/providers/registry.d.ts +0 -24
  142. package/dist/providers/registry.js +0 -100
  143. package/dist/providers/types.d.ts +0 -7
  144. package/dist/providers/types.js +0 -11
  145. package/dist/providers/vertex/canonical.d.ts +0 -3
  146. package/dist/providers/vertex/canonical.js +0 -8
  147. package/dist/providers/vertex/index.d.ts +0 -1
  148. package/dist/providers/vertex/index.js +0 -1
  149. package/dist/providers/voyage/canonical.d.ts +0 -3
  150. package/dist/providers/voyage/canonical.js +0 -7
  151. package/dist/providers/voyage/index.d.ts +0 -1
  152. package/dist/providers/voyage/index.js +0 -1
  153. package/dist/telemetry/ai-sdk.d.ts +0 -2
  154. package/dist/telemetry/ai-sdk.js +0 -31
  155. package/dist/telemetry/baggage.d.ts +0 -1
  156. package/dist/telemetry/baggage.js +0 -24
  157. package/dist/telemetry/fetch.d.ts +0 -2
  158. package/dist/telemetry/fetch.js +0 -24
  159. package/dist/telemetry/gen-ai.d.ts +0 -5
  160. package/dist/telemetry/gen-ai.js +0 -60
  161. package/dist/telemetry/http.d.ts +0 -3
  162. package/dist/telemetry/http.js +0 -54
  163. package/dist/telemetry/memory.d.ts +0 -2
  164. package/dist/telemetry/memory.js +0 -27
  165. package/dist/telemetry/span.d.ts +0 -13
  166. package/dist/telemetry/span.js +0 -60
  167. package/dist/telemetry/stream.d.ts +0 -3
  168. package/dist/telemetry/stream.js +0 -51
  169. package/dist/types.d.ts +0 -176
  170. package/dist/types.js +0 -1
  171. package/dist/utils/env.d.ts +0 -2
  172. package/dist/utils/env.js +0 -5
  173. package/dist/utils/headers.d.ts +0 -4
  174. package/dist/utils/headers.js +0 -22
  175. package/dist/utils/preset.d.ts +0 -9
  176. package/dist/utils/preset.js +0 -41
  177. package/dist/utils/request.d.ts +0 -2
  178. package/dist/utils/request.js +0 -14
  179. package/dist/utils/response.d.ts +0 -3
  180. package/dist/utils/response.js +0 -68
@@ -1,85 +0,0 @@
1
- import { presetFor } from "../../utils/preset";
2
- const VOYAGE_BASE = {
3
- modalities: {
4
- input: ["text"],
5
- output: ["embedding"],
6
- },
7
- providers: ["voyage"],
8
- };
9
- export const voyage2Code = presetFor()("voyage/voyage-2-code", {
10
- ...VOYAGE_BASE,
11
- name: "Voyage 2 Code",
12
- created: "2024-01-23",
13
- context: 16000,
14
- });
15
- export const voyage2Finance = presetFor()("voyage/voyage-2-finance", {
16
- ...VOYAGE_BASE,
17
- name: "Voyage 2 Finance",
18
- created: "2024-06-03",
19
- context: 32000,
20
- });
21
- export const voyage2Law = presetFor()("voyage/voyage-2-law", {
22
- ...VOYAGE_BASE,
23
- name: "Voyage 2 Law",
24
- created: "2024-04-15",
25
- context: 16000,
26
- });
27
- export const voyage3Code = presetFor()("voyage/voyage-3-code", {
28
- ...VOYAGE_BASE,
29
- name: "Voyage 3 Code",
30
- created: "2024-12-04",
31
- context: 32000,
32
- });
33
- export const voyage3Large = presetFor()("voyage/voyage-3-large", {
34
- ...VOYAGE_BASE,
35
- name: "Voyage 3 Large",
36
- created: "2025-01-07",
37
- context: 32000,
38
- });
39
- export const voyage35 = presetFor()("voyage/voyage-3.5", {
40
- ...VOYAGE_BASE,
41
- name: "Voyage 3.5",
42
- created: "2025-05-20",
43
- context: 32000,
44
- });
45
- export const voyage35Lite = presetFor()("voyage/voyage-3.5-lite", {
46
- ...VOYAGE_BASE,
47
- name: "Voyage 3.5 Lite",
48
- created: "2025-05-20",
49
- context: 32000,
50
- });
51
- export const voyage4Lite = presetFor()("voyage/voyage-4-lite", {
52
- ...VOYAGE_BASE,
53
- name: "Voyage 4 Lite",
54
- created: "2026-01-15",
55
- context: 32000,
56
- });
57
- export const voyage4 = presetFor()("voyage/voyage-4", {
58
- ...VOYAGE_BASE,
59
- name: "Voyage 4",
60
- created: "2026-01-15",
61
- context: 32000,
62
- });
63
- export const voyage4Large = presetFor()("voyage/voyage-4-large", {
64
- ...VOYAGE_BASE,
65
- name: "Voyage 4 Large",
66
- created: "2026-01-15",
67
- context: 32000,
68
- });
69
- const voyageAtomic = {
70
- v2: [voyage2Code, voyage2Finance, voyage2Law],
71
- v3: [voyage3Code, voyage3Large],
72
- "v3.5": [voyage35, voyage35Lite],
73
- v4: [voyage4Lite, voyage4, voyage4Large],
74
- };
75
- const voyageGroups = {
76
- "v2.x": [...voyageAtomic["v2"]],
77
- "v3.x": [...voyageAtomic["v3"], ...voyageAtomic["v3.5"]],
78
- "v4.x": [...voyageAtomic["v4"]],
79
- };
80
- export const voyage = {
81
- ...voyageAtomic,
82
- ...voyageGroups,
83
- latest: [voyage2Finance, voyage2Law, voyage3Code, voyage4Lite, voyage4, voyage4Large],
84
- all: Object.values(voyageAtomic).flat(),
85
- };
@@ -1,3 +0,0 @@
1
- import { type AnthropicProvider } from "@ai-sdk/anthropic";
2
- import type { ModelId } from "../../models/types";
3
- export declare const withCanonicalIdsForAnthropic: (provider: AnthropicProvider, extraMapping?: Record<ModelId, string>) => import("@ai-sdk/provider").ProviderV3;
@@ -1,9 +0,0 @@
1
- import {} from "@ai-sdk/anthropic";
2
- import { withCanonicalIds } from "../registry";
3
- export const withCanonicalIdsForAnthropic = (provider, extraMapping) => withCanonicalIds(provider, {
4
- mapping: extraMapping,
5
- options: {
6
- stripNamespace: true,
7
- normalizeDelimiters: true,
8
- },
9
- });
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1,17 +0,0 @@
1
- import { type AmazonBedrockProvider } from "@ai-sdk/amazon-bedrock";
2
- import type { ModelId } from "../../models/types";
3
- export type BedrockInferenceProfileOptions = {
4
- /** @default "preferred" */
5
- mode?: "preferred" | "avoid";
6
- /** @default "us" */
7
- geo?: "global" | "us" | "eu" | "apac" | "au" | "ca" | "jp" | "us-gov" | (string & {});
8
- arn?: {
9
- region: string;
10
- accountId: string;
11
- };
12
- };
13
- export type BedrockCanonicalConfig = {
14
- inferenceProfile?: BedrockInferenceProfileOptions;
15
- extraMapping?: Record<ModelId, string>;
16
- };
17
- export declare const withCanonicalIdsForBedrock: (provider: AmazonBedrockProvider, config?: BedrockCanonicalConfig) => import("@ai-sdk/provider").ProviderV3;
@@ -1,61 +0,0 @@
1
- import {} from "@ai-sdk/amazon-bedrock";
2
- import { withCanonicalIds } from "../registry";
3
- // For a list of all models with their IDs and InferenceTypes check:
4
- // https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html
5
- // OR
6
- // aws bedrock list-foundation-models --region us-east-1 \
7
- // --query "modelSummaries[].{id:modelId,mode:join(',', inferenceTypesSupported)}" \
8
- // --output table
9
- const MAPPING = {
10
- // Require Inference Profiles and can't be resolved from standard name mapping
11
- "anthropic/claude-haiku-4.5": "{ip}anthropic.claude-haiku-4-5-20251001-v1:0",
12
- "anthropic/claude-sonnet-4.6": "{ip}anthropic.claude-sonnet-4-6",
13
- "anthropic/claude-sonnet-4.5": "{ip}anthropic.claude-sonnet-4-5-20250929-v1:0",
14
- "anthropic/claude-opus-4.6": "{ip}anthropic.claude-opus-4-6-v1",
15
- "anthropic/claude-opus-4.5": "{ip}anthropic.claude-opus-4-5-20251101-v1:0",
16
- "anthropic/claude-opus-4.1": "{ip}anthropic.claude-opus-4-1-20250805-v1:0",
17
- "anthropic/claude-sonnet-4": "{ip}anthropic.claude-sonnet-4-20250514-v1:0",
18
- "anthropic/claude-opus-4": "{ip}anthropic.claude-opus-4-20250514-v1:0",
19
- "anthropic/claude-sonnet-3.7": "{ip}anthropic.claude-3-7-sonnet-20250219-v1:0",
20
- "anthropic/claude-sonnet-3.5": "{ip}anthropic.claude-3-5-sonnet-20241022-v2:0",
21
- "anthropic/claude-haiku-3.5": "{ip}anthropic.claude-3-5-haiku-20241022-v1:0",
22
- "anthropic/claude-haiku-3": "{ip}anthropic.claude-3-haiku-20240307-v1:0",
23
- "cohere/embed-v4.0": "{ip}cohere.embed-v4:0",
24
- "meta/llama-3.1-70b": "{ip}meta.llama3-1-70b-instruct-v1:0",
25
- "meta/llama-3.1-405b": "{ip}meta.llama3-1-405b-instruct-v1:0",
26
- "meta/llama-3.2-1b": "{ip}meta.llama3-2-1b-instruct-v1:0",
27
- "meta/llama-3.2-3b": "{ip}meta.llama3-2-3b-instruct-v1:0",
28
- "meta/llama-3.2-11b": "{ip}meta.llama3-2-11b-instruct-v1:0",
29
- "meta/llama-3.2-90b": "{ip}meta.llama3-2-90b-instruct-v1:0",
30
- "meta/llama-4-scout": "{ip}meta.llama4-scout-17b-instruct-v1:0",
31
- "meta/llama-4-maverick": "{ip}meta.llama4-maverick-17b-instruct-v1:0",
32
- // On-demand only models, ensure that {ip} is never added
33
- "amazon/nova-2-multimodal-embeddings": "amazon.nova-2-multimodal-embeddings-v1:0",
34
- "cohere/embed-english-v3.0": "cohere.embed-english-v3",
35
- "cohere/embed-multilingual-v3.0": "cohere.embed-multilingual-v3",
36
- "cohere/command-r": "cohere.command-r-v1:0",
37
- "cohere/command-r-plus": "cohere.command-r-plus-v1:0",
38
- "meta/llama-3.3-70b": "meta.llama3-3-70b-instruct-v1:0",
39
- "meta/llama-3.1-8b": "meta.llama3-1-8b-instruct-v1:0",
40
- "openai/gpt-oss-20b": "openai.gpt-oss-20b-1:0",
41
- "openai/gpt-oss-120b": "openai.gpt-oss-120b-1:0",
42
- };
43
- const resolveInferenceProfile = ({ geo = "us", arn } = {}) => `${arn ? `arn:aws:bedrock:${arn.region}:${arn.accountId}:inference-profile/` : ""}${geo}.`;
44
- export const withCanonicalIdsForBedrock = (provider, config = {}) => withCanonicalIds(provider, {
45
- mapping: {
46
- ...MAPPING,
47
- ...config.extraMapping,
48
- },
49
- options: {
50
- stripNamespace: false,
51
- namespaceSeparator: ".",
52
- normalizeDelimiters: true,
53
- prefix: config.inferenceProfile?.mode === "avoid"
54
- ? ""
55
- : resolveInferenceProfile(config.inferenceProfile),
56
- template: {
57
- ip: resolveInferenceProfile(config.inferenceProfile),
58
- },
59
- postfix: config.inferenceProfile?.mode === "avoid" ? "" : "-v1:0",
60
- },
61
- });
@@ -1,2 +0,0 @@
1
- export * from "./canonical";
2
- export * from "./middleware";
@@ -1,2 +0,0 @@
1
- export * from "./canonical";
2
- export * from "./middleware";
@@ -1,3 +0,0 @@
1
- import type { LanguageModelMiddleware } from "ai";
2
- export declare const bedrockGptReasoningMiddleware: LanguageModelMiddleware;
3
- export declare const bedrockClaudeReasoningMiddleware: LanguageModelMiddleware;
@@ -1,55 +0,0 @@
1
- import { modelMiddlewareMatcher } from "../../middleware/matcher";
2
- const isClaude46 = (modelId) => modelId.includes("-4-6");
3
- export const bedrockGptReasoningMiddleware = {
4
- specificationVersion: "v3",
5
- // eslint-disable-next-line require-await
6
- transformParams: async ({ params, model }) => {
7
- if (!model.modelId.includes("gpt"))
8
- return params;
9
- const bedrock = params.providerOptions?.["bedrock"];
10
- if (!bedrock || typeof bedrock !== "object")
11
- return params;
12
- const effort = bedrock["reasoningEffort"];
13
- if (effort === undefined)
14
- return params;
15
- const target = (bedrock["reasoningConfig"] ??= {});
16
- target["maxReasoningEffort"] = effort;
17
- delete bedrock["reasoningEffort"];
18
- return params;
19
- },
20
- };
21
- export const bedrockClaudeReasoningMiddleware = {
22
- specificationVersion: "v3",
23
- // eslint-disable-next-line require-await
24
- transformParams: async ({ params, model }) => {
25
- if (!model.modelId.includes("claude"))
26
- return params;
27
- const bedrock = params.providerOptions?.["bedrock"];
28
- if (!bedrock || typeof bedrock !== "object")
29
- return params;
30
- const thinking = bedrock["thinking"];
31
- const effort = bedrock["effort"];
32
- if (!thinking && effort === undefined)
33
- return params;
34
- const target = (bedrock["reasoningConfig"] ??= {});
35
- if (thinking && typeof thinking === "object") {
36
- const thinkingOptions = thinking;
37
- if (thinkingOptions["type"] !== undefined) {
38
- target["type"] = thinkingOptions["type"];
39
- }
40
- if (thinkingOptions["budgetTokens"] !== undefined) {
41
- target["budgetTokens"] = thinkingOptions["budgetTokens"];
42
- }
43
- }
44
- // FUTURE: bedrock currently does not support "effort" for other 4.x models
45
- if (effort !== undefined && isClaude46(model.modelId)) {
46
- target["maxReasoningEffort"] = effort;
47
- }
48
- delete bedrock["thinking"];
49
- delete bedrock["effort"];
50
- return params;
51
- },
52
- };
53
- modelMiddlewareMatcher.useForProvider("amazon-bedrock", {
54
- language: [bedrockGptReasoningMiddleware, bedrockClaudeReasoningMiddleware],
55
- });
@@ -1,3 +0,0 @@
1
- import { type CohereProvider } from "@ai-sdk/cohere";
2
- import type { ModelId } from "../../models/types";
3
- export declare const withCanonicalIdsForCohere: (provider: CohereProvider, extraMapping?: Record<ModelId, string>) => import("@ai-sdk/provider").ProviderV3;
@@ -1,17 +0,0 @@
1
- import {} from "@ai-sdk/cohere";
2
- import { withCanonicalIds } from "../registry";
3
- const MAPPING = {
4
- "cohere/command-a": "command-a-03-2025",
5
- "cohere/command-r7b": "command-r7b-12-2024",
6
- "cohere/command-a-translate": "command-a-translate-08-2025",
7
- "cohere/command-a-reasoning": "command-a-reasoning-08-2025",
8
- "cohere/command-a-vision": "command-a-vision-07-2025",
9
- "cohere/command-r": "command-r-08-2024",
10
- "cohere/command-r-plus": "command-r-plus-08-2024",
11
- };
12
- export const withCanonicalIdsForCohere = (provider, extraMapping) => withCanonicalIds(provider, {
13
- mapping: { ...MAPPING, ...extraMapping },
14
- options: {
15
- stripNamespace: true,
16
- },
17
- });
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1,3 +0,0 @@
1
- import { type GroqProvider } from "@ai-sdk/groq";
2
- import type { ModelId } from "../../models/types";
3
- export declare const withCanonicalIdsForGroq: (provider: GroqProvider, extraMapping?: Record<ModelId, string>) => import("@ai-sdk/provider").ProviderV3;
@@ -1,12 +0,0 @@
1
- import {} from "@ai-sdk/groq";
2
- import { withCanonicalIds } from "../registry";
3
- const MAPPING = {
4
- "meta/llama-3.1-8b": "llama-3.1-8b-instant",
5
- "meta/llama-3.3-70b": "llama-3.3-70b-versatile",
6
- "meta/llama-4-scout": "meta-llama/llama-4-scout-17b-16e-instruct",
7
- "meta/llama-4-maverick": "meta-llama/llama-4-maverick-17b-128e-instruct",
8
- };
9
- export const withCanonicalIdsForGroq = (provider, extraMapping) => withCanonicalIds(provider, {
10
- mapping: { ...MAPPING, ...extraMapping },
11
- options: { stripNamespace: false },
12
- });
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1,3 +0,0 @@
1
- import { type OpenAIProvider } from "@ai-sdk/openai";
2
- import type { ModelId } from "../../models/types";
3
- export declare const withCanonicalIdsForOpenAI: (provider: OpenAIProvider, extraMapping?: Record<ModelId, string>) => import("@ai-sdk/provider").ProviderV3;
@@ -1,8 +0,0 @@
1
- import {} from "@ai-sdk/openai";
2
- import { withCanonicalIds } from "../registry";
3
- export const withCanonicalIdsForOpenAI = (provider, extraMapping) => withCanonicalIds(provider, {
4
- mapping: extraMapping,
5
- options: {
6
- stripNamespace: true,
7
- },
8
- });
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1,24 +0,0 @@
1
- import type { ProviderV3 } from "@ai-sdk/provider";
2
- import type { ModelCatalog, ModelId } from "../models/types";
3
- import type { ProviderRegistry } from "./types";
4
- export declare const resolveProvider: (args: {
5
- providers: ProviderRegistry;
6
- models: ModelCatalog;
7
- modelId: ModelId;
8
- operation: "chat" | "embeddings";
9
- }) => ProviderV3;
10
- export type CanonicalIdsOptions = {
11
- mapping?: Partial<Record<ModelId, string>>;
12
- options?: {
13
- /** @default true */
14
- stripNamespace?: boolean;
15
- /** @default false */
16
- normalizeDelimiters?: boolean | readonly string[];
17
- prefix?: string;
18
- template?: Record<string, string | undefined>;
19
- postfix?: string;
20
- /** @default "/" */
21
- namespaceSeparator?: "/" | "." | ":";
22
- };
23
- };
24
- export declare const withCanonicalIds: (provider: ProviderV3, config?: CanonicalIdsOptions) => ProviderV3;
@@ -1,100 +0,0 @@
1
- import { customProvider } from "ai";
2
- import { GatewayError } from "../errors/gateway";
3
- import { logger } from "../logger";
4
- export const resolveProvider = (args) => {
5
- const { providers, models, modelId, operation } = args;
6
- const catalogModel = models[modelId];
7
- if (!catalogModel) {
8
- throw new GatewayError(`Model '${modelId}' not found in catalog`, 422, "MODEL_NOT_FOUND");
9
- }
10
- const modality = operation === "embeddings" ? "embedding" : "text";
11
- if (catalogModel.modalities && !catalogModel.modalities.output.includes(modality)) {
12
- throw new GatewayError(`Model '${modelId}' does not support '${modality}' output`, 422, "MODEL_UNSUPPORTED_OPERATION");
13
- }
14
- // FUTURE: implement fallback logic [e.g. runtime config invalid]
15
- const resolvedProviderId = catalogModel.providers[0];
16
- if (!resolvedProviderId) {
17
- throw new GatewayError(`No providers configured for model '${modelId}'`, 422, "NO_PROVIDERS");
18
- }
19
- const provider = providers[resolvedProviderId];
20
- if (!provider) {
21
- throw new GatewayError(`Provider '${resolvedProviderId}' not configured`, 422, "PROVIDER_NOT_CONFIGURED");
22
- }
23
- return provider;
24
- };
25
- export const withCanonicalIds = (provider, config = {}) => {
26
- const { mapping, options: { stripNamespace = true, normalizeDelimiters = false, template, prefix, postfix, namespaceSeparator = "/", } = {}, } = config;
27
- const shouldNormalizeDelimiters = (canonicalId) => {
28
- if (typeof normalizeDelimiters === "boolean")
29
- return normalizeDelimiters;
30
- return normalizeDelimiters.some((x) => canonicalId.startsWith(`${x}/`));
31
- };
32
- const normalizeId = (canonicalId) => {
33
- let out = canonicalId;
34
- if (shouldNormalizeDelimiters(canonicalId)) {
35
- out = out.replaceAll(".", "-");
36
- }
37
- if (stripNamespace) {
38
- out = out.replace(/^[^/]+\//, "");
39
- }
40
- else if (namespaceSeparator !== "/") {
41
- out = out.replace("/", namespaceSeparator);
42
- }
43
- return out;
44
- };
45
- const applyTemplate = (input) => {
46
- if (!template)
47
- return input;
48
- return Object.entries(template).reduce((out, [k, v]) => out.replace(`{${k}}`, v ?? ""), input);
49
- };
50
- const applyFallbackAffixes = (v) => {
51
- let out = prefix && !v.startsWith(prefix) ? `${prefix}${v}` : v;
52
- if (postfix && !out.endsWith(postfix))
53
- out = `${out}${postfix}`;
54
- return out;
55
- };
56
- const needsFallbackWrap = stripNamespace || normalizeDelimiters || namespaceSeparator !== "/" || !!prefix || !!postfix;
57
- // FUTURE: use embeddingModel instead of textEmbeddingModel once voyage supports it
58
- const languageModel = provider.languageModel;
59
- const embeddingModel = provider.textEmbeddingModel;
60
- const fallbackProvider = needsFallbackWrap
61
- ? {
62
- ...provider,
63
- specificationVersion: "v3",
64
- languageModel: (id) => {
65
- const mapped = applyFallbackAffixes(normalizeId(id));
66
- logger.debug(`[canonical] mapped ${id} to ${mapped}`);
67
- return languageModel(mapped);
68
- },
69
- embeddingModel: (id) => {
70
- const mapped = applyFallbackAffixes(normalizeId(id));
71
- logger.debug(`[canonical] mapped ${id} to ${mapped}`);
72
- return embeddingModel(mapped);
73
- },
74
- }
75
- : provider;
76
- const mapModels = (fn) => {
77
- const out = {};
78
- // Some providers don't have languageModel / embeddingModel
79
- if (fn === undefined)
80
- return out;
81
- for (const [k, v] of Object.entries(mapping ?? {})) {
82
- if (v === undefined)
83
- continue;
84
- // This is lazy so that provider is only create once called
85
- Object.defineProperty(out, k, {
86
- get: () => {
87
- const mapped = applyTemplate(v);
88
- logger.debug(`[canonical] mapped ${k} to ${mapped}`);
89
- return fn(mapped);
90
- },
91
- });
92
- }
93
- return out;
94
- };
95
- return customProvider({
96
- languageModels: mapModels(languageModel),
97
- embeddingModels: mapModels(embeddingModel),
98
- fallbackProvider,
99
- });
100
- };
@@ -1,7 +0,0 @@
1
- import { type ProviderV3 } from "@ai-sdk/provider";
2
- export declare const CANONICAL_PROVIDER_IDS: readonly ["anthropic", "azure", "bedrock", "cohere", "groq", "openai", "vertex", "voyage"];
3
- export type CanonicalProviderId = (typeof CANONICAL_PROVIDER_IDS)[number];
4
- export type ProviderId = CanonicalProviderId | (string & {});
5
- export type ProviderRegistry = {
6
- [K in ProviderId]?: ProviderV3;
7
- };
@@ -1,11 +0,0 @@
1
- import {} from "@ai-sdk/provider";
2
- export const CANONICAL_PROVIDER_IDS = [
3
- "anthropic",
4
- "azure",
5
- "bedrock",
6
- "cohere",
7
- "groq",
8
- "openai",
9
- "vertex",
10
- "voyage",
11
- ];
@@ -1,3 +0,0 @@
1
- import type { GoogleVertexProvider } from "@ai-sdk/google-vertex";
2
- import type { ModelId } from "../../models/types";
3
- export declare const withCanonicalIdsForVertex: (provider: GoogleVertexProvider, extraMapping?: Record<ModelId, string>) => import("@ai-sdk/provider").ProviderV3;
@@ -1,8 +0,0 @@
1
- import { withCanonicalIds } from "../registry";
2
- export const withCanonicalIdsForVertex = (provider, extraMapping) => withCanonicalIds(provider, {
3
- mapping: extraMapping,
4
- options: {
5
- stripNamespace: true,
6
- normalizeDelimiters: ["anthropic"],
7
- },
8
- });
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1,3 +0,0 @@
1
- import type { VoyageProvider } from "voyage-ai-provider";
2
- import type { ModelId } from "../../models/types";
3
- export declare const withCanonicalIdsForVoyage: (provider: VoyageProvider, extraMapping?: Record<ModelId, string>) => import("@ai-sdk/provider").ProviderV3;
@@ -1,7 +0,0 @@
1
- import { withCanonicalIds } from "../registry";
2
- export const withCanonicalIdsForVoyage = (provider, extraMapping) => withCanonicalIds(provider, {
3
- mapping: extraMapping,
4
- options: {
5
- stripNamespace: true,
6
- },
7
- });
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1 +0,0 @@
1
- export * from "./canonical";
@@ -1,2 +0,0 @@
1
- import type { TelemetrySignalLevel } from "../types";
2
- export declare const installAiSdkWarningLogger: (genAiSignalLevel?: TelemetrySignalLevel) => void;
@@ -1,31 +0,0 @@
1
- import { logger } from "../logger";
2
- import { addSpanEvent, setSpanAttributes } from "./span";
3
- export const installAiSdkWarningLogger = (genAiSignalLevel) => {
4
- const logWarnings = ({ warnings, provider, model }) => {
5
- if (warnings.length === 0)
6
- return;
7
- for (const warning of warnings) {
8
- logger.warn({
9
- provider,
10
- model,
11
- warning,
12
- }, `[ai-sdk] ${warning.type}`);
13
- }
14
- if (!(genAiSignalLevel === "recommended" || genAiSignalLevel === "full"))
15
- return;
16
- setSpanAttributes({
17
- "gen_ai.response.warning_count": warnings.length,
18
- });
19
- for (const warning of warnings) {
20
- addSpanEvent("gen_ai.warning", {
21
- "gen_ai.provider.name": provider,
22
- "gen_ai.response.model": model,
23
- "gen_ai.warning.type": warning.type,
24
- "gen_ai.warning.feature": "feature" in warning ? warning.feature : undefined,
25
- "gen_ai.warning.details": "details" in warning ? warning.details : undefined,
26
- "gen_ai.warning.message": "message" in warning ? warning.message : undefined,
27
- });
28
- }
29
- };
30
- globalThis.AI_SDK_LOG_WARNINGS = logWarnings;
31
- };
@@ -1 +0,0 @@
1
- export declare const getBaggageAttributes: (request?: Request) => Record<string, string>;
@@ -1,24 +0,0 @@
1
- const HEBO_BAGGAGE_PREFIX = "hebo.";
2
- export const getBaggageAttributes = (request) => {
3
- const h = request?.headers.get("baggage");
4
- if (!h)
5
- return {};
6
- const attrs = {};
7
- for (const part of h.split(",")) {
8
- const [k, v] = part.trim().split("=", 2);
9
- if (!k || !v)
10
- continue;
11
- const [rawValue] = v.split(";", 1);
12
- if (!rawValue)
13
- continue;
14
- let value = rawValue;
15
- try {
16
- value = decodeURIComponent(rawValue);
17
- }
18
- catch { }
19
- if (k.startsWith(HEBO_BAGGAGE_PREFIX)) {
20
- attrs[k.slice(HEBO_BAGGAGE_PREFIX.length)] = value;
21
- }
22
- }
23
- return attrs;
24
- };
@@ -1,2 +0,0 @@
1
- import type { TelemetrySignalLevel } from "../types";
2
- export declare const initFetch: (level?: TelemetrySignalLevel) => void;
@@ -1,24 +0,0 @@
1
- import { SpanKind } from "@opentelemetry/api";
2
- import { withSpan } from "./span";
3
- const ORIGINAL_FETCH_KEY = Symbol.for("@hebo/fetch/original-fetch");
4
- const g = globalThis;
5
- let fetchTracingEnabled = false;
6
- const shouldTraceFetch = (init) => typeof init?.headers?.["user-agent"] === "string" &&
7
- init.headers["user-agent"].indexOf("ai-sdk/provider-utils") !== -1;
8
- const otelFetch = (input, init) => {
9
- const original = g[ORIGINAL_FETCH_KEY];
10
- if (!fetchTracingEnabled)
11
- return original(input, init);
12
- if (!shouldTraceFetch(init))
13
- return original(input, init);
14
- return withSpan("fetch", () => original(input, init), { kind: SpanKind.CLIENT });
15
- };
16
- export const initFetch = (level) => {
17
- fetchTracingEnabled = level === "full";
18
- if (!fetchTracingEnabled)
19
- return;
20
- if (g[ORIGINAL_FETCH_KEY])
21
- return;
22
- g[ORIGINAL_FETCH_KEY] = globalThis.fetch.bind(globalThis);
23
- globalThis.fetch = otelFetch;
24
- };
@@ -1,5 +0,0 @@
1
- import { type Attributes } from "@opentelemetry/api";
2
- import type { TelemetrySignalLevel } from "../types";
3
- export declare const recordRequestDuration: (start: number, attrs: Attributes, signalLevel?: TelemetrySignalLevel) => void;
4
- export declare const recordTimePerOutputToken: (start: number, tokenAttrs: Attributes, metricAttrs: Attributes, signalLevel?: TelemetrySignalLevel) => void;
5
- export declare const recordTokenUsage: (tokenAttrs: Attributes, metricAttrs: Attributes, signalLevel?: TelemetrySignalLevel) => void;