@hebo-ai/gateway 0.9.0 → 0.9.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.
- package/README.md +82 -4
- package/package.json +34 -34
- package/dist/config.d.ts +0 -2
- package/dist/config.js +0 -111
- package/dist/endpoints/chat-completions/converters.d.ts +0 -26
- package/dist/endpoints/chat-completions/converters.js +0 -524
- package/dist/endpoints/chat-completions/handler.d.ts +0 -2
- package/dist/endpoints/chat-completions/handler.js +0 -149
- package/dist/endpoints/chat-completions/index.d.ts +0 -4
- package/dist/endpoints/chat-completions/index.js +0 -4
- package/dist/endpoints/chat-completions/otel.d.ts +0 -5
- package/dist/endpoints/chat-completions/otel.js +0 -175
- package/dist/endpoints/chat-completions/schema.d.ts +0 -1170
- package/dist/endpoints/chat-completions/schema.js +0 -252
- package/dist/endpoints/conversations/converters.d.ts +0 -8
- package/dist/endpoints/conversations/converters.js +0 -29
- package/dist/endpoints/conversations/handler.d.ts +0 -2
- package/dist/endpoints/conversations/handler.js +0 -276
- package/dist/endpoints/conversations/index.d.ts +0 -3
- package/dist/endpoints/conversations/index.js +0 -3
- package/dist/endpoints/conversations/schema.d.ts +0 -1511
- package/dist/endpoints/conversations/schema.js +0 -74
- package/dist/endpoints/conversations/storage/dialects/greptime.d.ts +0 -10
- package/dist/endpoints/conversations/storage/dialects/greptime.js +0 -75
- package/dist/endpoints/conversations/storage/dialects/mysql.d.ts +0 -12
- package/dist/endpoints/conversations/storage/dialects/mysql.js +0 -118
- package/dist/endpoints/conversations/storage/dialects/postgres.d.ts +0 -16
- package/dist/endpoints/conversations/storage/dialects/postgres.js +0 -185
- package/dist/endpoints/conversations/storage/dialects/sqlite.d.ts +0 -11
- package/dist/endpoints/conversations/storage/dialects/sqlite.js +0 -176
- package/dist/endpoints/conversations/storage/dialects/types.d.ts +0 -42
- package/dist/endpoints/conversations/storage/dialects/types.js +0 -0
- package/dist/endpoints/conversations/storage/dialects/utils.d.ts +0 -25
- package/dist/endpoints/conversations/storage/dialects/utils.js +0 -80
- package/dist/endpoints/conversations/storage/memory.d.ts +0 -25
- package/dist/endpoints/conversations/storage/memory.js +0 -200
- package/dist/endpoints/conversations/storage/sql.d.ts +0 -33
- package/dist/endpoints/conversations/storage/sql.js +0 -278
- package/dist/endpoints/conversations/storage/types.d.ts +0 -39
- package/dist/endpoints/conversations/storage/types.js +0 -0
- package/dist/endpoints/embeddings/converters.d.ts +0 -10
- package/dist/endpoints/embeddings/converters.js +0 -31
- package/dist/endpoints/embeddings/handler.d.ts +0 -2
- package/dist/endpoints/embeddings/handler.js +0 -104
- package/dist/endpoints/embeddings/index.d.ts +0 -4
- package/dist/endpoints/embeddings/index.js +0 -4
- package/dist/endpoints/embeddings/otel.d.ts +0 -5
- package/dist/endpoints/embeddings/otel.js +0 -29
- package/dist/endpoints/embeddings/schema.d.ts +0 -44
- package/dist/endpoints/embeddings/schema.js +0 -29
- package/dist/endpoints/models/converters.d.ts +0 -6
- package/dist/endpoints/models/converters.js +0 -42
- package/dist/endpoints/models/handler.d.ts +0 -2
- package/dist/endpoints/models/handler.js +0 -29
- package/dist/endpoints/models/index.d.ts +0 -3
- package/dist/endpoints/models/index.js +0 -3
- package/dist/endpoints/models/schema.d.ts +0 -42
- package/dist/endpoints/models/schema.js +0 -31
- package/dist/endpoints/responses/converters.d.ts +0 -17
- package/dist/endpoints/responses/converters.js +0 -1034
- package/dist/endpoints/responses/handler.d.ts +0 -2
- package/dist/endpoints/responses/handler.js +0 -137
- package/dist/endpoints/responses/index.d.ts +0 -4
- package/dist/endpoints/responses/index.js +0 -4
- package/dist/endpoints/responses/otel.d.ts +0 -6
- package/dist/endpoints/responses/otel.js +0 -221
- package/dist/endpoints/responses/schema.d.ts +0 -2109
- package/dist/endpoints/responses/schema.js +0 -314
- package/dist/endpoints/shared/converters.d.ts +0 -55
- package/dist/endpoints/shared/converters.js +0 -179
- package/dist/endpoints/shared/schema.d.ts +0 -70
- package/dist/endpoints/shared/schema.js +0 -46
- package/dist/errors/ai-sdk.d.ts +0 -2
- package/dist/errors/ai-sdk.js +0 -52
- package/dist/errors/gateway.d.ts +0 -5
- package/dist/errors/gateway.js +0 -13
- package/dist/errors/openai.d.ts +0 -15
- package/dist/errors/openai.js +0 -40
- package/dist/errors/utils.d.ts +0 -22
- package/dist/errors/utils.js +0 -44
- package/dist/gateway.d.ts +0 -11
- package/dist/gateway.js +0 -44
- package/dist/index.d.ts +0 -11
- package/dist/index.js +0 -10
- package/dist/lifecycle.d.ts +0 -3
- package/dist/lifecycle.js +0 -113
- package/dist/logger/default.d.ts +0 -4
- package/dist/logger/default.js +0 -81
- package/dist/logger/index.d.ts +0 -11
- package/dist/logger/index.js +0 -25
- package/dist/middleware/common.d.ts +0 -12
- package/dist/middleware/common.js +0 -146
- package/dist/middleware/debug.d.ts +0 -3
- package/dist/middleware/debug.js +0 -27
- package/dist/middleware/matcher.d.ts +0 -28
- package/dist/middleware/matcher.js +0 -118
- package/dist/middleware/utils.d.ts +0 -2
- package/dist/middleware/utils.js +0 -24
- package/dist/models/amazon/index.d.ts +0 -2
- package/dist/models/amazon/index.js +0 -2
- package/dist/models/amazon/middleware.d.ts +0 -3
- package/dist/models/amazon/middleware.js +0 -68
- package/dist/models/amazon/presets.d.ts +0 -345
- package/dist/models/amazon/presets.js +0 -80
- package/dist/models/anthropic/index.d.ts +0 -2
- package/dist/models/anthropic/index.js +0 -2
- package/dist/models/anthropic/middleware.d.ts +0 -5
- package/dist/models/anthropic/middleware.js +0 -127
- package/dist/models/anthropic/presets.d.ts +0 -711
- package/dist/models/anthropic/presets.js +0 -135
- package/dist/models/catalog.d.ts +0 -4
- package/dist/models/catalog.js +0 -8
- package/dist/models/cohere/index.d.ts +0 -2
- package/dist/models/cohere/index.js +0 -2
- package/dist/models/cohere/middleware.d.ts +0 -3
- package/dist/models/cohere/middleware.js +0 -62
- package/dist/models/cohere/presets.d.ts +0 -411
- package/dist/models/cohere/presets.js +0 -134
- package/dist/models/google/index.d.ts +0 -2
- package/dist/models/google/index.js +0 -2
- package/dist/models/google/middleware.d.ts +0 -8
- package/dist/models/google/middleware.js +0 -111
- package/dist/models/google/presets.d.ts +0 -403
- package/dist/models/google/presets.js +0 -88
- package/dist/models/meta/index.d.ts +0 -1
- package/dist/models/meta/index.js +0 -1
- package/dist/models/meta/presets.d.ts +0 -483
- package/dist/models/meta/presets.js +0 -95
- package/dist/models/openai/index.d.ts +0 -2
- package/dist/models/openai/index.js +0 -2
- package/dist/models/openai/middleware.d.ts +0 -4
- package/dist/models/openai/middleware.js +0 -88
- package/dist/models/openai/presets.d.ts +0 -1319
- package/dist/models/openai/presets.js +0 -277
- package/dist/models/types.d.ts +0 -20
- package/dist/models/types.js +0 -92
- package/dist/models/voyage/index.d.ts +0 -2
- package/dist/models/voyage/index.js +0 -2
- package/dist/models/voyage/middleware.d.ts +0 -2
- package/dist/models/voyage/middleware.js +0 -19
- package/dist/models/voyage/presets.d.ts +0 -436
- package/dist/models/voyage/presets.js +0 -85
- package/dist/providers/anthropic/canonical.d.ts +0 -3
- package/dist/providers/anthropic/canonical.js +0 -9
- package/dist/providers/anthropic/index.d.ts +0 -1
- package/dist/providers/anthropic/index.js +0 -1
- package/dist/providers/bedrock/canonical.d.ts +0 -17
- package/dist/providers/bedrock/canonical.js +0 -61
- package/dist/providers/bedrock/index.d.ts +0 -2
- package/dist/providers/bedrock/index.js +0 -2
- package/dist/providers/bedrock/middleware.d.ts +0 -5
- package/dist/providers/bedrock/middleware.js +0 -137
- package/dist/providers/cohere/canonical.d.ts +0 -3
- package/dist/providers/cohere/canonical.js +0 -17
- package/dist/providers/cohere/index.d.ts +0 -1
- package/dist/providers/cohere/index.js +0 -1
- package/dist/providers/groq/canonical.d.ts +0 -3
- package/dist/providers/groq/canonical.js +0 -12
- package/dist/providers/groq/index.d.ts +0 -2
- package/dist/providers/groq/index.js +0 -2
- package/dist/providers/groq/middleware.d.ts +0 -2
- package/dist/providers/groq/middleware.js +0 -31
- package/dist/providers/openai/canonical.d.ts +0 -3
- package/dist/providers/openai/canonical.js +0 -8
- package/dist/providers/openai/index.d.ts +0 -1
- package/dist/providers/openai/index.js +0 -1
- package/dist/providers/registry.d.ts +0 -24
- package/dist/providers/registry.js +0 -103
- package/dist/providers/types.d.ts +0 -7
- package/dist/providers/types.js +0 -11
- package/dist/providers/vertex/canonical.d.ts +0 -3
- package/dist/providers/vertex/canonical.js +0 -8
- package/dist/providers/vertex/index.d.ts +0 -2
- package/dist/providers/vertex/index.js +0 -2
- package/dist/providers/vertex/middleware.d.ts +0 -2
- package/dist/providers/vertex/middleware.js +0 -47
- package/dist/providers/voyage/canonical.d.ts +0 -3
- package/dist/providers/voyage/canonical.js +0 -7
- package/dist/providers/voyage/index.d.ts +0 -1
- package/dist/providers/voyage/index.js +0 -1
- package/dist/telemetry/ai-sdk.d.ts +0 -2
- package/dist/telemetry/ai-sdk.js +0 -31
- package/dist/telemetry/baggage.d.ts +0 -1
- package/dist/telemetry/baggage.js +0 -24
- package/dist/telemetry/fetch.d.ts +0 -2
- package/dist/telemetry/fetch.js +0 -49
- package/dist/telemetry/gen-ai.d.ts +0 -6
- package/dist/telemetry/gen-ai.js +0 -78
- package/dist/telemetry/http.d.ts +0 -3
- package/dist/telemetry/http.js +0 -54
- package/dist/telemetry/index.d.ts +0 -1
- package/dist/telemetry/index.js +0 -1
- package/dist/telemetry/memory.d.ts +0 -2
- package/dist/telemetry/memory.js +0 -43
- package/dist/telemetry/span.d.ts +0 -13
- package/dist/telemetry/span.js +0 -60
- package/dist/types.d.ts +0 -216
- package/dist/types.js +0 -2
- package/dist/utils/env.d.ts +0 -2
- package/dist/utils/env.js +0 -7
- package/dist/utils/headers.d.ts +0 -4
- package/dist/utils/headers.js +0 -22
- package/dist/utils/preset.d.ts +0 -10
- package/dist/utils/preset.js +0 -41
- package/dist/utils/request.d.ts +0 -2
- package/dist/utils/request.js +0 -43
- package/dist/utils/response.d.ts +0 -6
- package/dist/utils/response.js +0 -55
- package/dist/utils/stream.d.ts +0 -9
- package/dist/utils/stream.js +0 -100
- package/dist/utils/url.d.ts +0 -4
- 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
|
-
}
|
package/dist/middleware/debug.js
DELETED
|
@@ -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
|
-
}
|
package/dist/middleware/utils.js
DELETED
|
@@ -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,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
|
-
});
|