@hebo-ai/gateway 0.6.2 → 0.8.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 (168) hide show
  1. package/README.md +134 -7
  2. package/package.json +46 -1
  3. package/dist/config.d.ts +0 -2
  4. package/dist/config.js +0 -81
  5. package/dist/endpoints/chat-completions/converters.d.ts +0 -43
  6. package/dist/endpoints/chat-completions/converters.js +0 -625
  7. package/dist/endpoints/chat-completions/handler.d.ts +0 -2
  8. package/dist/endpoints/chat-completions/handler.js +0 -149
  9. package/dist/endpoints/chat-completions/index.d.ts +0 -4
  10. package/dist/endpoints/chat-completions/index.js +0 -4
  11. package/dist/endpoints/chat-completions/otel.d.ts +0 -5
  12. package/dist/endpoints/chat-completions/otel.js +0 -171
  13. package/dist/endpoints/chat-completions/schema.d.ts +0 -1188
  14. package/dist/endpoints/chat-completions/schema.js +0 -298
  15. package/dist/endpoints/embeddings/converters.d.ts +0 -10
  16. package/dist/endpoints/embeddings/converters.js +0 -31
  17. package/dist/endpoints/embeddings/handler.d.ts +0 -2
  18. package/dist/endpoints/embeddings/handler.js +0 -104
  19. package/dist/endpoints/embeddings/index.d.ts +0 -4
  20. package/dist/endpoints/embeddings/index.js +0 -4
  21. package/dist/endpoints/embeddings/otel.d.ts +0 -5
  22. package/dist/endpoints/embeddings/otel.js +0 -29
  23. package/dist/endpoints/embeddings/schema.d.ts +0 -44
  24. package/dist/endpoints/embeddings/schema.js +0 -29
  25. package/dist/endpoints/models/converters.d.ts +0 -6
  26. package/dist/endpoints/models/converters.js +0 -42
  27. package/dist/endpoints/models/handler.d.ts +0 -2
  28. package/dist/endpoints/models/handler.js +0 -29
  29. package/dist/endpoints/models/index.d.ts +0 -3
  30. package/dist/endpoints/models/index.js +0 -3
  31. package/dist/endpoints/models/schema.d.ts +0 -42
  32. package/dist/endpoints/models/schema.js +0 -31
  33. package/dist/errors/ai-sdk.d.ts +0 -2
  34. package/dist/errors/ai-sdk.js +0 -52
  35. package/dist/errors/gateway.d.ts +0 -5
  36. package/dist/errors/gateway.js +0 -13
  37. package/dist/errors/openai.d.ts +0 -20
  38. package/dist/errors/openai.js +0 -40
  39. package/dist/errors/utils.d.ts +0 -22
  40. package/dist/errors/utils.js +0 -44
  41. package/dist/gateway.d.ts +0 -9
  42. package/dist/gateway.js +0 -40
  43. package/dist/index.d.ts +0 -14
  44. package/dist/index.js +0 -13
  45. package/dist/lifecycle.d.ts +0 -2
  46. package/dist/lifecycle.js +0 -98
  47. package/dist/logger/default.d.ts +0 -4
  48. package/dist/logger/default.js +0 -81
  49. package/dist/logger/index.d.ts +0 -11
  50. package/dist/logger/index.js +0 -25
  51. package/dist/middleware/common.d.ts +0 -12
  52. package/dist/middleware/common.js +0 -146
  53. package/dist/middleware/debug.d.ts +0 -3
  54. package/dist/middleware/debug.js +0 -27
  55. package/dist/middleware/matcher.d.ts +0 -28
  56. package/dist/middleware/matcher.js +0 -118
  57. package/dist/middleware/utils.d.ts +0 -2
  58. package/dist/middleware/utils.js +0 -24
  59. package/dist/models/amazon/index.d.ts +0 -2
  60. package/dist/models/amazon/index.js +0 -2
  61. package/dist/models/amazon/middleware.d.ts +0 -3
  62. package/dist/models/amazon/middleware.js +0 -68
  63. package/dist/models/amazon/presets.d.ts +0 -345
  64. package/dist/models/amazon/presets.js +0 -80
  65. package/dist/models/anthropic/index.d.ts +0 -2
  66. package/dist/models/anthropic/index.js +0 -2
  67. package/dist/models/anthropic/middleware.d.ts +0 -5
  68. package/dist/models/anthropic/middleware.js +0 -127
  69. package/dist/models/anthropic/presets.d.ts +0 -711
  70. package/dist/models/anthropic/presets.js +0 -135
  71. package/dist/models/catalog.d.ts +0 -4
  72. package/dist/models/catalog.js +0 -8
  73. package/dist/models/cohere/index.d.ts +0 -2
  74. package/dist/models/cohere/index.js +0 -2
  75. package/dist/models/cohere/middleware.d.ts +0 -3
  76. package/dist/models/cohere/middleware.js +0 -62
  77. package/dist/models/cohere/presets.d.ts +0 -411
  78. package/dist/models/cohere/presets.js +0 -134
  79. package/dist/models/google/index.d.ts +0 -2
  80. package/dist/models/google/index.js +0 -2
  81. package/dist/models/google/middleware.d.ts +0 -8
  82. package/dist/models/google/middleware.js +0 -111
  83. package/dist/models/google/presets.d.ts +0 -375
  84. package/dist/models/google/presets.js +0 -82
  85. package/dist/models/meta/index.d.ts +0 -1
  86. package/dist/models/meta/index.js +0 -1
  87. package/dist/models/meta/presets.d.ts +0 -483
  88. package/dist/models/meta/presets.js +0 -95
  89. package/dist/models/openai/index.d.ts +0 -2
  90. package/dist/models/openai/index.js +0 -2
  91. package/dist/models/openai/middleware.d.ts +0 -4
  92. package/dist/models/openai/middleware.js +0 -88
  93. package/dist/models/openai/presets.d.ts +0 -959
  94. package/dist/models/openai/presets.js +0 -213
  95. package/dist/models/types.d.ts +0 -20
  96. package/dist/models/types.js +0 -84
  97. package/dist/models/voyage/index.d.ts +0 -2
  98. package/dist/models/voyage/index.js +0 -2
  99. package/dist/models/voyage/middleware.d.ts +0 -2
  100. package/dist/models/voyage/middleware.js +0 -19
  101. package/dist/models/voyage/presets.d.ts +0 -436
  102. package/dist/models/voyage/presets.js +0 -85
  103. package/dist/providers/anthropic/canonical.d.ts +0 -3
  104. package/dist/providers/anthropic/canonical.js +0 -9
  105. package/dist/providers/anthropic/index.d.ts +0 -1
  106. package/dist/providers/anthropic/index.js +0 -1
  107. package/dist/providers/bedrock/canonical.d.ts +0 -17
  108. package/dist/providers/bedrock/canonical.js +0 -61
  109. package/dist/providers/bedrock/index.d.ts +0 -2
  110. package/dist/providers/bedrock/index.js +0 -2
  111. package/dist/providers/bedrock/middleware.d.ts +0 -4
  112. package/dist/providers/bedrock/middleware.js +0 -104
  113. package/dist/providers/cohere/canonical.d.ts +0 -3
  114. package/dist/providers/cohere/canonical.js +0 -17
  115. package/dist/providers/cohere/index.d.ts +0 -1
  116. package/dist/providers/cohere/index.js +0 -1
  117. package/dist/providers/groq/canonical.d.ts +0 -3
  118. package/dist/providers/groq/canonical.js +0 -12
  119. package/dist/providers/groq/index.d.ts +0 -1
  120. package/dist/providers/groq/index.js +0 -1
  121. package/dist/providers/openai/canonical.d.ts +0 -3
  122. package/dist/providers/openai/canonical.js +0 -8
  123. package/dist/providers/openai/index.d.ts +0 -1
  124. package/dist/providers/openai/index.js +0 -1
  125. package/dist/providers/registry.d.ts +0 -24
  126. package/dist/providers/registry.js +0 -103
  127. package/dist/providers/types.d.ts +0 -7
  128. package/dist/providers/types.js +0 -11
  129. package/dist/providers/vertex/canonical.d.ts +0 -3
  130. package/dist/providers/vertex/canonical.js +0 -8
  131. package/dist/providers/vertex/index.d.ts +0 -1
  132. package/dist/providers/vertex/index.js +0 -1
  133. package/dist/providers/voyage/canonical.d.ts +0 -3
  134. package/dist/providers/voyage/canonical.js +0 -7
  135. package/dist/providers/voyage/index.d.ts +0 -1
  136. package/dist/providers/voyage/index.js +0 -1
  137. package/dist/telemetry/ai-sdk.d.ts +0 -2
  138. package/dist/telemetry/ai-sdk.js +0 -31
  139. package/dist/telemetry/baggage.d.ts +0 -1
  140. package/dist/telemetry/baggage.js +0 -24
  141. package/dist/telemetry/fetch.d.ts +0 -2
  142. package/dist/telemetry/fetch.js +0 -49
  143. package/dist/telemetry/gen-ai.d.ts +0 -6
  144. package/dist/telemetry/gen-ai.js +0 -78
  145. package/dist/telemetry/http.d.ts +0 -3
  146. package/dist/telemetry/http.js +0 -54
  147. package/dist/telemetry/index.d.ts +0 -1
  148. package/dist/telemetry/index.js +0 -1
  149. package/dist/telemetry/memory.d.ts +0 -2
  150. package/dist/telemetry/memory.js +0 -43
  151. package/dist/telemetry/span.d.ts +0 -13
  152. package/dist/telemetry/span.js +0 -60
  153. package/dist/telemetry/stream.d.ts +0 -3
  154. package/dist/telemetry/stream.js +0 -58
  155. package/dist/types.d.ts +0 -176
  156. package/dist/types.js +0 -1
  157. package/dist/utils/env.d.ts +0 -2
  158. package/dist/utils/env.js +0 -7
  159. package/dist/utils/headers.d.ts +0 -4
  160. package/dist/utils/headers.js +0 -22
  161. package/dist/utils/preset.d.ts +0 -10
  162. package/dist/utils/preset.js +0 -42
  163. package/dist/utils/request.d.ts +0 -2
  164. package/dist/utils/request.js +0 -43
  165. package/dist/utils/response.d.ts +0 -3
  166. package/dist/utils/response.js +0 -70
  167. package/dist/utils/url.d.ts +0 -4
  168. package/dist/utils/url.js +0 -21
@@ -1,104 +0,0 @@
1
- import { modelMiddlewareMatcher } from "../../middleware/matcher";
2
- const isClaude46 = (modelId) => modelId.includes("-4-6");
3
- export const bedrockGptReasoningMiddleware = {
4
- specificationVersion: "v3",
5
- // oxlint-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)
11
- return params;
12
- const effort = bedrock.reasoningEffort;
13
- if (effort === undefined)
14
- return params;
15
- const target = (bedrock.reasoningConfig ??= {});
16
- // @ts-expect-error AI SDK does accept this
17
- target.maxReasoningEffort = effort;
18
- delete bedrock.reasoningEffort;
19
- return params;
20
- },
21
- };
22
- export const bedrockClaudeReasoningMiddleware = {
23
- specificationVersion: "v3",
24
- // oxlint-disable-next-line require-await
25
- transformParams: async ({ params, model }) => {
26
- if (!model.modelId.includes("claude"))
27
- return params;
28
- const bedrock = params.providerOptions?.["bedrock"];
29
- if (!bedrock)
30
- return params;
31
- const thinking = bedrock.thinking;
32
- const effort = bedrock.effort;
33
- if (!thinking && effort === undefined)
34
- return params;
35
- const target = (bedrock.reasoningConfig ??= {});
36
- if (thinking && typeof thinking === "object") {
37
- target.type = thinking.type;
38
- if ("budgetTokens" in thinking && thinking.budgetTokens !== undefined) {
39
- target.budgetTokens = thinking.budgetTokens;
40
- }
41
- }
42
- // FUTURE: bedrock currently does not support "effort" for other 4.x models
43
- if (effort !== undefined && isClaude46(model.modelId)) {
44
- target.maxReasoningEffort = effort;
45
- }
46
- delete bedrock.thinking;
47
- delete bedrock.effort;
48
- return params;
49
- },
50
- };
51
- function toBedrockCachePoint(modelId, cacheControl) {
52
- const out = { type: "default" };
53
- // Nova currently only supports 5m
54
- if (cacheControl?.ttl && !modelId.includes("nova")) {
55
- out.ttl = cacheControl.ttl;
56
- }
57
- return out;
58
- }
59
- // https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-caching.html
60
- export const bedrockPromptCachingMiddleware = {
61
- specificationVersion: "v3",
62
- // oxlint-disable-next-line require-await
63
- transformParams: async ({ params, model }) => {
64
- if (!model.modelId.includes("nova") && !model.modelId.includes("claude"))
65
- return params;
66
- let hasExplicitCacheControl = false;
67
- let lastCacheableBlock;
68
- const processCacheControl = (providerOptions) => {
69
- if (!providerOptions)
70
- return;
71
- const entryBedrock = providerOptions["bedrock"];
72
- const entryCacheControl = entryBedrock?.["cacheControl"];
73
- if (!entryBedrock || !entryCacheControl)
74
- return;
75
- hasExplicitCacheControl = true;
76
- entryBedrock["cachePoint"] = toBedrockCachePoint(model.modelId, entryCacheControl);
77
- delete entryBedrock["cacheControl"];
78
- };
79
- for (const message of params.prompt) {
80
- processCacheControl(message.providerOptions);
81
- if (!Array.isArray(message.content))
82
- continue;
83
- for (const part of message.content) {
84
- processCacheControl(part.providerOptions);
85
- }
86
- lastCacheableBlock = message;
87
- }
88
- const bedrock = params.providerOptions?.["bedrock"];
89
- const cacheControl = bedrock?.["cacheControl"];
90
- if (cacheControl && !hasExplicitCacheControl && lastCacheableBlock) {
91
- ((lastCacheableBlock.providerOptions ??= {})["bedrock"] ??= {})["cachePoint"] =
92
- toBedrockCachePoint(model.modelId, cacheControl);
93
- }
94
- delete bedrock?.["cacheControl"];
95
- return params;
96
- },
97
- };
98
- modelMiddlewareMatcher.useForProvider("amazon-bedrock", {
99
- language: [
100
- bedrockGptReasoningMiddleware,
101
- bedrockClaudeReasoningMiddleware,
102
- bedrockPromptCachingMiddleware,
103
- ],
104
- });
@@ -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,103 +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
- // oxlint-disable-next-line unbound-method
59
- const languageModel = provider.languageModel;
60
- // oxlint-disable-next-line unbound-method, no-deprecated
61
- const embeddingModel = provider.textEmbeddingModel;
62
- const fallbackProvider = needsFallbackWrap
63
- ? {
64
- ...provider,
65
- specificationVersion: "v3",
66
- languageModel: (id) => {
67
- const mapped = applyFallbackAffixes(normalizeId(id));
68
- logger.debug(`[canonical] mapped ${id} to ${mapped}`);
69
- return languageModel(mapped);
70
- },
71
- embeddingModel: (id) => {
72
- const mapped = applyFallbackAffixes(normalizeId(id));
73
- logger.debug(`[canonical] mapped ${id} to ${mapped}`);
74
- // oxlint-disable-next-line no-deprecated
75
- return embeddingModel(mapped);
76
- },
77
- }
78
- : provider;
79
- const mapModels = (fn) => {
80
- const out = {};
81
- // Some providers don't have languageModel / embeddingModel
82
- if (fn === undefined)
83
- return out;
84
- for (const [k, v] of Object.entries(mapping ?? {})) {
85
- if (v === undefined)
86
- continue;
87
- // This is lazy so that provider is only create once called
88
- Object.defineProperty(out, k, {
89
- get: () => {
90
- const mapped = applyTemplate(v);
91
- logger.debug(`[canonical] mapped ${k} to ${mapped}`);
92
- return fn(mapped);
93
- },
94
- });
95
- }
96
- return out;
97
- };
98
- return customProvider({
99
- languageModels: mapModels(languageModel),
100
- embeddingModels: mapModels(embeddingModel),
101
- fallbackProvider,
102
- });
103
- };
@@ -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 instrumentFetch: (level?: TelemetrySignalLevel) => void;
@@ -1,49 +0,0 @@
1
- import { SpanKind } from "@opentelemetry/api";
2
- import { setSpanAttributes, withSpan } from "./span";
3
- const ORIGINAL_FETCH_KEY = Symbol.for("@hebo/fetch/original-fetch");
4
- const g = globalThis;
5
- let fetchTracingEnabled = false;
6
- const isRequest = (value) => typeof Request !== "undefined" && value instanceof Request;
7
- const getRequestAttributes = (input, init) => {
8
- const attrs = {
9
- "http.request.method": init?.method ?? (isRequest(input) ? input.method : "GET"),
10
- };
11
- if (input instanceof URL)
12
- attrs["url.full"] = input.href;
13
- else if (typeof input === "string")
14
- attrs["url.full"] = input;
15
- else if (isRequest(input))
16
- attrs["url.full"] = input.url;
17
- return attrs;
18
- };
19
- const shouldTraceFetch = (init) => {
20
- const h = init?.headers;
21
- if (!h || typeof h !== "object" || Array.isArray(h) || h instanceof Headers)
22
- return false;
23
- const ua = h["user-agent"];
24
- return typeof ua === "string" && ua.includes("ai-sdk/provider-utils");
25
- };
26
- const otelFetch = (input, init) => {
27
- const original = g[ORIGINAL_FETCH_KEY];
28
- if (!fetchTracingEnabled)
29
- return original(input, init);
30
- if (!shouldTraceFetch(init))
31
- return original(input, init);
32
- return withSpan("fetch", async () => {
33
- const response = await original(input, init);
34
- setSpanAttributes({ "http.response.status_code": response.status });
35
- return response;
36
- }, {
37
- kind: SpanKind.CLIENT,
38
- attributes: getRequestAttributes(input, init),
39
- });
40
- };
41
- export const instrumentFetch = (level) => {
42
- fetchTracingEnabled = level === "full";
43
- if (!fetchTracingEnabled)
44
- return;
45
- if (g[ORIGINAL_FETCH_KEY])
46
- return;
47
- g[ORIGINAL_FETCH_KEY] = globalThis.fetch.bind(globalThis);
48
- globalThis.fetch = otelFetch;
49
- };
@@ -1,6 +0,0 @@
1
- import { type Attributes } from "@opentelemetry/api";
2
- import type { GatewayContext, TelemetrySignalLevel } from "../types";
3
- export declare const getGenAiGeneralAttributes: (ctx: GatewayContext, signalLevel?: TelemetrySignalLevel) => Attributes;
4
- export declare const recordRequestDuration: (duration: number, status: number, ctx: GatewayContext, signalLevel?: TelemetrySignalLevel) => void;
5
- export declare const recordTimePerOutputToken: (start: number, tokenAttrs: Attributes, metricAttrs: Attributes, signalLevel?: TelemetrySignalLevel) => void;
6
- export declare const recordTokenUsage: (tokenAttrs: Attributes, metricAttrs: Attributes, signalLevel?: TelemetrySignalLevel) => void;
@@ -1,78 +0,0 @@
1
- import { metrics } from "@opentelemetry/api";
2
- import { STATUS_CODE } from "../errors/utils";
3
- const getMeter = () => metrics.getMeter("@hebo/gateway");
4
- let requestDurationHistogram;
5
- let timePerOutputTokenHistogram;
6
- let tokenUsageHistogram;
7
- const getRequestDurationHistogram = () => (requestDurationHistogram ??= getMeter().createHistogram("gen_ai.server.request.duration", {
8
- description: "End-to-end gateway request duration",
9
- unit: "s",
10
- advice: {
11
- explicitBucketBoundaries: [
12
- 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, 60, 120, 240,
13
- ],
14
- },
15
- }));
16
- const getTimePerOutputTokenHistogram = () => (timePerOutputTokenHistogram ??= getMeter().createHistogram("gen_ai.server.time_per_output_token", {
17
- description: "End-to-end gateway request duration per output token",
18
- unit: "s",
19
- advice: {
20
- explicitBucketBoundaries: [
21
- 0.01, 0.025, 0.05, 0.075, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.75, 1.0, 2.5,
22
- ],
23
- },
24
- }));
25
- const getTokenUsageHistogram = () => (tokenUsageHistogram ??= getMeter().createHistogram("gen_ai.client.token.usage", {
26
- description: "Token usage reported by upstream model responses",
27
- unit: "{token}",
28
- advice: {
29
- explicitBucketBoundaries: [
30
- 1, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072,
31
- 262144, 524288, 1048576,
32
- ],
33
- },
34
- }));
35
- export const getGenAiGeneralAttributes = (ctx, signalLevel) => {
36
- if (!signalLevel || signalLevel === "off")
37
- return {};
38
- const requestModel = typeof ctx.body?.model === "string" ? ctx.body.model : ctx.modelId;
39
- return {
40
- "gen_ai.operation.name": ctx.operation,
41
- "gen_ai.request.model": requestModel,
42
- "gen_ai.response.model": ctx.resolvedModelId,
43
- "gen_ai.provider.name": ctx.resolvedProviderId,
44
- };
45
- };
46
- export const recordRequestDuration = (duration, status, ctx, signalLevel) => {
47
- if (!signalLevel || signalLevel === "off")
48
- return;
49
- const attrs = getGenAiGeneralAttributes(ctx, signalLevel);
50
- if (status !== 200) {
51
- attrs["error.type"] = `${status} ${STATUS_CODE(status).toLowerCase()}`;
52
- }
53
- getRequestDurationHistogram().record(duration / 1000, attrs);
54
- };
55
- // FUTURE: record unsuccessful calls
56
- export const recordTimePerOutputToken = (start, tokenAttrs, metricAttrs, signalLevel) => {
57
- if (!signalLevel || (signalLevel !== "recommended" && signalLevel !== "full"))
58
- return;
59
- const outputTokens = tokenAttrs["gen_ai.usage.output_tokens"];
60
- if (typeof outputTokens !== "number" || outputTokens <= 0)
61
- return;
62
- getTimePerOutputTokenHistogram().record((performance.now() - start) / 1000 / outputTokens, metricAttrs);
63
- };
64
- // FUTURE: record unsuccessful calls
65
- export const recordTokenUsage = (tokenAttrs, metricAttrs, signalLevel) => {
66
- if (!signalLevel || (signalLevel !== "recommended" && signalLevel !== "full"))
67
- return;
68
- const record = (value, tokenType) => {
69
- if (typeof value !== "number")
70
- return;
71
- getTokenUsageHistogram().record(value, Object.assign({}, metricAttrs, { "gen_ai.token.type": tokenType }));
72
- };
73
- record(tokenAttrs["gen_ai.usage.input_tokens"], "input");
74
- record(tokenAttrs["gen_ai.usage.output_tokens"], "output");
75
- // FUTURE: Monitor otel for emerging cached / reasoning tokens standard:
76
- // https://github.com/open-telemetry/semantic-conventions/issues/1959
77
- // https://github.com/open-telemetry/semantic-conventions/issues/3341
78
- };
@@ -1,3 +0,0 @@
1
- import { type TelemetrySignalLevel } from "../types";
2
- export declare const getRequestAttributes: (request: Request, signalLevel?: TelemetrySignalLevel) => {};
3
- export declare const getResponseAttributes: (response: Response, signalLevel?: TelemetrySignalLevel) => {};
@@ -1,54 +0,0 @@
1
- import {} from "../types";
2
- const headerArr = (h, k) => (h.has(k) ? [h.get(k)] : undefined);
3
- export const getRequestAttributes = (request, signalLevel) => {
4
- if (!signalLevel || signalLevel === "off")
5
- return {};
6
- let url;
7
- try {
8
- // FUTURE: reuse URL from lifecycle
9
- url = new URL(request.url);
10
- }
11
- catch { }
12
- const attrs = {
13
- "http.request.method": request.method,
14
- "url.full": request.url,
15
- "url.path": url?.pathname,
16
- "url.scheme": url?.protocol.replace(":", ""),
17
- "server.address": url?.hostname,
18
- "server.port": url
19
- ? url.port
20
- ? Number(url.port)
21
- : url.protocol === "https:"
22
- ? 443
23
- : 80
24
- : undefined,
25
- };
26
- if (signalLevel !== "required") {
27
- Object.assign(attrs, {
28
- "user_agent.original": request.headers.get("user-agent") ?? undefined,
29
- });
30
- }
31
- if (signalLevel === "full") {
32
- Object.assign(attrs, {
33
- // FUTURE: "url.query"
34
- "http.request.header.content-type": headerArr(request.headers, "content-type"),
35
- "http.request.header.content-length": headerArr(request.headers, "content-length"),
36
- // FUTURE: "client.address"
37
- });
38
- }
39
- return attrs;
40
- };
41
- export const getResponseAttributes = (response, signalLevel) => {
42
- if (!signalLevel || signalLevel === "off")
43
- return {};
44
- const attrs = {
45
- "http.response.status_code": response.status,
46
- };
47
- if (signalLevel === "full") {
48
- Object.assign(attrs, {
49
- "http.response.header.content-type": [headerArr(response.headers, "content-type")],
50
- "http.response.header.content-length": [headerArr(response.headers, "content-length")],
51
- });
52
- }
53
- return attrs;
54
- };
@@ -1 +0,0 @@
1
- export * from "./fetch";
@@ -1 +0,0 @@
1
- export * from "./fetch";
@@ -1,2 +0,0 @@
1
- import type { TelemetrySignalLevel } from "../types";
2
- export declare const observeV8jsMemoryMetrics: (level?: TelemetrySignalLevel) => void;