@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,146 +0,0 @@
1
- function snakeToCamel(key) {
2
- // oxlint-disable-next-line prefer-includes
3
- if (key.indexOf("_") === -1)
4
- return key;
5
- let out = "";
6
- for (let i = 0; i < key.length; i++) {
7
- const c = key[i];
8
- if (c === "_" && i + 1 < key.length) {
9
- const next = key[i + 1];
10
- if (next >= "a" && next <= "z") {
11
- out += next.toUpperCase();
12
- i++;
13
- continue;
14
- }
15
- }
16
- out += c;
17
- }
18
- return out;
19
- }
20
- function hasUppercase(s) {
21
- for (let i = 0; i < s.length; i++) {
22
- const c = s[i];
23
- if (c >= "A" && c <= "Z")
24
- return true;
25
- }
26
- return false;
27
- }
28
- function camelToSnake(key) {
29
- if (!hasUppercase(key))
30
- return key;
31
- let out = "";
32
- for (let i = 0; i < key.length; i++) {
33
- const c = key[i];
34
- out += c >= "A" && c <= "Z" ? "_" + c.toLowerCase() : c;
35
- }
36
- return out;
37
- }
38
- function remapDeep(value, mapKey) {
39
- if (value === null || typeof value !== "object")
40
- return value;
41
- if (Array.isArray(value)) {
42
- return value.map((v) => remapDeep(v, mapKey));
43
- }
44
- const out = {};
45
- for (const key of Object.keys(value)) {
46
- out[mapKey(key)] = remapDeep(value[key], mapKey);
47
- }
48
- return out;
49
- }
50
- function processOptions(options, providerName) {
51
- const target = (options[providerName] = remapDeep(options[providerName] ?? {}, snakeToCamel));
52
- for (const namespace in options) {
53
- if (namespace === providerName)
54
- continue;
55
- Object.assign(target, remapDeep(options[namespace], snakeToCamel));
56
- if (namespace === "unknown")
57
- delete options[namespace];
58
- }
59
- }
60
- function processMetadata(metadata) {
61
- for (const namespace in metadata) {
62
- metadata[namespace] = remapDeep(metadata[namespace], camelToSnake);
63
- }
64
- }
65
- /**
66
- * Converts snake_case params in providerOptions to camelCase
67
- * and moves all of them into providerOptions[providerName].
68
- * Also snakizes values in providerMetadata for OpenAI compatibility.
69
- */
70
- export function forwardLanguageParams(providerName) {
71
- return {
72
- specificationVersion: "v3",
73
- // oxlint-disable-next-line require-await
74
- transformParams: async ({ params }) => {
75
- if (params.providerOptions)
76
- processOptions(params.providerOptions, providerName);
77
- for (const message of params.prompt) {
78
- if (message.providerOptions) {
79
- processOptions(message.providerOptions, providerName);
80
- }
81
- if (message.content && Array.isArray(message.content)) {
82
- for (const part of message.content) {
83
- if ("providerOptions" in part && part.providerOptions) {
84
- processOptions(part.providerOptions, providerName);
85
- }
86
- }
87
- }
88
- }
89
- return params;
90
- },
91
- wrapGenerate: async ({ doGenerate }) => {
92
- const result = await doGenerate();
93
- if (result.providerMetadata)
94
- processMetadata(result.providerMetadata);
95
- result.content?.forEach((part) => {
96
- if (part.providerMetadata)
97
- processMetadata(part.providerMetadata);
98
- });
99
- return result;
100
- },
101
- wrapStream: async ({ doStream }) => {
102
- const result = await doStream();
103
- result.stream = result.stream.pipeThrough(new TransformStream({
104
- transform(part, controller) {
105
- if ("providerMetadata" in part && part.providerMetadata) {
106
- processMetadata(part.providerMetadata);
107
- }
108
- controller.enqueue(part);
109
- },
110
- }));
111
- return result;
112
- },
113
- };
114
- }
115
- export function forwardEmbeddingParams(providerName) {
116
- return {
117
- specificationVersion: "v3",
118
- // oxlint-disable-next-line require-await
119
- transformParams: async ({ params }) => {
120
- if (params.providerOptions)
121
- processOptions(params.providerOptions, providerName);
122
- return params;
123
- },
124
- wrapEmbed: async ({ doEmbed }) => {
125
- const result = await doEmbed();
126
- if (result.providerMetadata)
127
- processMetadata(result.providerMetadata);
128
- return result;
129
- },
130
- };
131
- }
132
- export function extractProviderNamespace(id) {
133
- if (id === "amazon-bedrock")
134
- return "bedrock";
135
- const [first, second] = id.split(".");
136
- // FUTURE: map vertex to google once AI SDK support per-message level provider options
137
- if (first === "vertex" || second === "vertex")
138
- return "vertex";
139
- return first;
140
- }
141
- export function forwardParamsMiddleware(provider) {
142
- return forwardLanguageParams(extractProviderNamespace(provider));
143
- }
144
- export function forwardParamsEmbeddingMiddleware(provider) {
145
- return forwardEmbeddingParams(extractProviderNamespace(provider));
146
- }
@@ -1,3 +0,0 @@
1
- import type { EmbeddingModelMiddleware, LanguageModelMiddleware } from "ai";
2
- export declare const debugFinalParamsMiddleware: LanguageModelMiddleware;
3
- export declare const debugEmbeddingFinalParamsMiddleware: EmbeddingModelMiddleware;
@@ -1,27 +0,0 @@
1
- import { logger } from "../logger";
2
- export const debugFinalParamsMiddleware = {
3
- specificationVersion: "v3",
4
- // oxlint-disable-next-line require-await
5
- transformParams: async ({ params, model }) => {
6
- logger.trace({
7
- kind: "text",
8
- modelId: model.modelId,
9
- providerId: model.provider,
10
- params,
11
- }, "[middleware] final params");
12
- return params;
13
- },
14
- };
15
- export const debugEmbeddingFinalParamsMiddleware = {
16
- specificationVersion: "v3",
17
- // oxlint-disable-next-line require-await
18
- transformParams: async ({ params, model }) => {
19
- logger.trace({
20
- kind: "embedding",
21
- modelId: model.modelId,
22
- providerId: model.provider,
23
- params,
24
- }, "[middleware] final params");
25
- return params;
26
- },
27
- };
@@ -1,28 +0,0 @@
1
- import type { EmbeddingModelMiddleware, LanguageModelMiddleware } from "ai";
2
- import type { ModelId } from "../models/types";
3
- import type { ProviderId } from "../providers/types";
4
- type MiddlewareEntries = {
5
- language?: LanguageModelMiddleware[];
6
- embedding?: EmbeddingModelMiddleware[];
7
- };
8
- type ModelMiddleware = LanguageModelMiddleware | EmbeddingModelMiddleware;
9
- declare class ModelMiddlewareMatcher {
10
- private model;
11
- private provider;
12
- private static readonly MAX_CACHE;
13
- private cache;
14
- useForModel(patterns: ModelId | readonly ModelId[], entry: MiddlewareEntries): void;
15
- useForProvider(patterns: ProviderId | readonly ProviderId[], entry: MiddlewareEntries): void;
16
- for(modelId: ModelId, providerId: ProviderId): LanguageModelMiddleware[];
17
- forEmbedding(modelId: ModelId, providerId: ProviderId): EmbeddingModelMiddleware[];
18
- resolve(options: {
19
- kind: "text" | "embedding";
20
- modelId?: ModelId;
21
- providerId?: ProviderId;
22
- forward?: ModelMiddleware | (() => ModelMiddleware);
23
- debug?: ModelMiddleware;
24
- }): ModelMiddleware[];
25
- private collect;
26
- }
27
- export declare const modelMiddlewareMatcher: ModelMiddlewareMatcher;
28
- export type { ModelMiddlewareMatcher };
@@ -1,118 +0,0 @@
1
- import { logger } from "../logger";
2
- import { addSpanEvent } from "../telemetry/span";
3
- import { forwardParamsEmbeddingMiddleware, forwardParamsMiddleware } from "./common";
4
- import { debugEmbeddingFinalParamsMiddleware, debugFinalParamsMiddleware } from "./debug";
5
- class SimpleMatcher {
6
- rules = [];
7
- use(pattern, entry) {
8
- const stored = {
9
- language: entry.language ? [...entry.language] : undefined,
10
- embedding: entry.embedding ? [...entry.embedding] : undefined,
11
- };
12
- this.rules.push({ pattern, test: compilePattern(pattern), stored });
13
- }
14
- match(key) {
15
- const out = [];
16
- const matched = [];
17
- for (const r of this.rules) {
18
- if (!r.test(key))
19
- continue;
20
- out.push(r.stored);
21
- matched.push(r.pattern);
22
- }
23
- const matchedSummary = matched.length > 0 ? matched.join(",") : "none";
24
- logger.debug(`[middleware] matched ${key} to [${matchedSummary}]`);
25
- return out;
26
- }
27
- }
28
- class ModelMiddlewareMatcher {
29
- model = new SimpleMatcher();
30
- provider = new SimpleMatcher();
31
- static MAX_CACHE = 500;
32
- cache = new Map();
33
- useForModel(patterns, entry) {
34
- this.cache.clear();
35
- for (const pattern of toArray(patterns)) {
36
- this.model.use(pattern, entry);
37
- }
38
- }
39
- useForProvider(patterns, entry) {
40
- this.cache.clear();
41
- for (const pattern of toArray(patterns)) {
42
- this.provider.use(pattern, entry);
43
- }
44
- }
45
- for(modelId, providerId) {
46
- return this.resolve({
47
- kind: "text",
48
- modelId,
49
- providerId,
50
- forward: () => forwardParamsMiddleware(providerId),
51
- debug: debugFinalParamsMiddleware,
52
- });
53
- }
54
- forEmbedding(modelId, providerId) {
55
- return this.resolve({
56
- kind: "embedding",
57
- modelId,
58
- providerId,
59
- forward: () => forwardParamsEmbeddingMiddleware(providerId),
60
- debug: debugEmbeddingFinalParamsMiddleware,
61
- });
62
- }
63
- resolve(options) {
64
- const { kind, modelId, providerId, forward, debug } = options;
65
- const key = `${kind}-${modelId}:${providerId}`;
66
- const cached = this.cache.get(key);
67
- if (cached) {
68
- logger.debug(`[middleware] cache hit for ${modelId}:${providerId}`);
69
- return cached;
70
- }
71
- const out = [];
72
- if (modelId) {
73
- out.push(...this.collect(this.model.match(modelId), kind));
74
- }
75
- if (forward) {
76
- out.push(typeof forward === "function" ? forward() : forward);
77
- }
78
- if (providerId) {
79
- out.push(...this.collect(this.provider.match(providerId), kind));
80
- }
81
- if (debug) {
82
- out.push(debug);
83
- }
84
- if (this.cache.size >= ModelMiddlewareMatcher.MAX_CACHE) {
85
- let n = Math.ceil(ModelMiddlewareMatcher.MAX_CACHE * 0.2);
86
- for (const cacheKey of this.cache.keys()) {
87
- this.cache.delete(cacheKey);
88
- if (--n === 0)
89
- break;
90
- }
91
- logger.warn(`[middleware] cache eviction`);
92
- addSpanEvent("hebo.middleware.cache.evicted");
93
- }
94
- this.cache.set(key, out);
95
- return out;
96
- }
97
- collect(entries, kind) {
98
- const out = [];
99
- for (const s of entries) {
100
- if (kind === "text")
101
- out.push(...(s.language ?? []));
102
- else
103
- out.push(...(s.embedding ?? []));
104
- }
105
- return out;
106
- }
107
- }
108
- export const modelMiddlewareMatcher = new ModelMiddlewareMatcher();
109
- const toArray = (v) => (Array.isArray(v) ? v : [v]);
110
- function compilePattern(pattern) {
111
- if (!pattern.includes("*"))
112
- return (key) => key === pattern;
113
- const re = new RegExp(`^${pattern
114
- .split("*")
115
- .map((p) => p.replaceAll(/[-\\^$+?.()|[\]{}]/g, "\\$&"))
116
- .join(".*")}$`);
117
- return (key) => re.test(key);
118
- }
@@ -1,2 +0,0 @@
1
- import type { ChatCompletionsReasoningEffort } from "../endpoints/chat-completions/schema";
2
- export declare function calculateReasoningBudgetFromEffort(effort: ChatCompletionsReasoningEffort, maxTokens: number, minTokens?: number): number;
@@ -1,24 +0,0 @@
1
- export function calculateReasoningBudgetFromEffort(effort, maxTokens, minTokens = 1024) {
2
- let percentage = 0;
3
- switch (effort) {
4
- case "none":
5
- percentage = 0;
6
- break;
7
- case "minimal":
8
- percentage = 0.1;
9
- break;
10
- case "low":
11
- percentage = 0.2;
12
- break;
13
- case "medium":
14
- percentage = 0.5;
15
- break;
16
- case "high":
17
- percentage = 0.8;
18
- break;
19
- case "xhigh":
20
- percentage = 0.95;
21
- break;
22
- }
23
- return Math.max(minTokens, Math.floor(maxTokens * percentage));
24
- }
@@ -1,2 +0,0 @@
1
- export * from "./middleware";
2
- export * from "./presets";
@@ -1,2 +0,0 @@
1
- export * from "./middleware";
2
- export * from "./presets";
@@ -1,3 +0,0 @@
1
- import type { EmbeddingModelMiddleware, LanguageModelMiddleware } from "ai";
2
- export declare const novaDimensionsMiddleware: EmbeddingModelMiddleware;
3
- export declare const novaReasoningMiddleware: LanguageModelMiddleware;
@@ -1,68 +0,0 @@
1
- import { modelMiddlewareMatcher } from "../../middleware/matcher";
2
- // Convert `dimensions` (OpenAI) to `embeddingDimension` (Nova)
3
- export const novaDimensionsMiddleware = {
4
- specificationVersion: "v3",
5
- // oxlint-disable-next-line require-await
6
- transformParams: async ({ params }) => {
7
- const unknown = params.providerOptions?.["unknown"];
8
- if (!unknown)
9
- return params;
10
- const dimensions = unknown["dimensions"];
11
- if (!dimensions)
12
- return params;
13
- const target = (params.providerOptions["nova"] ??= {});
14
- // @ts-expect-error AI SDK does the value checking for us
15
- target.embeddingDimension = dimensions;
16
- delete unknown["dimensions"];
17
- return params;
18
- },
19
- };
20
- function mapNovaEffort(effort) {
21
- switch (effort) {
22
- case "none":
23
- return;
24
- case "minimal":
25
- case "low":
26
- return "low";
27
- case "medium":
28
- return "medium";
29
- case "high":
30
- case "xhigh":
31
- return "high";
32
- }
33
- }
34
- export const novaReasoningMiddleware = {
35
- specificationVersion: "v3",
36
- // oxlint-disable-next-line require-await
37
- transformParams: async ({ params }) => {
38
- const unknown = params.providerOptions?.["unknown"];
39
- if (!unknown)
40
- return params;
41
- const reasoning = unknown["reasoning"];
42
- if (!reasoning)
43
- return params;
44
- const target = (params.providerOptions["amazon"] ??= {});
45
- if (!reasoning.enabled) {
46
- target.reasoningConfig = { type: "disabled" };
47
- }
48
- else if (reasoning.effort) {
49
- // FUTURE: warn if mapNovaEffort modified the effort
50
- target.reasoningConfig = {
51
- type: "enabled",
52
- maxReasoningEffort: mapNovaEffort(reasoning.effort),
53
- };
54
- }
55
- else {
56
- // FUTURE: warn if reasoning.max_tokens (unsupported) was ignored
57
- target.reasoningConfig = { type: "enabled" };
58
- }
59
- delete unknown["reasoning"];
60
- return params;
61
- },
62
- };
63
- modelMiddlewareMatcher.useForModel("amazon/nova-*embeddings*", {
64
- embedding: [novaDimensionsMiddleware],
65
- });
66
- modelMiddlewareMatcher.useForModel("amazon/nova-2-*", {
67
- language: [novaReasoningMiddleware],
68
- });