kimi-proxy 0.0.1
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/LICENSE +24 -0
- package/README.md +177 -0
- package/dist/adapters/anthropicAdapter.d.ts +138 -0
- package/dist/adapters/anthropicAdapter.js +184 -0
- package/dist/adapters/anthropicAdapter.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.js +228 -0
- package/dist/config.js.map +1 -0
- package/dist/core/converters/anthropicToOpenAI.d.ts +11 -0
- package/dist/core/converters/anthropicToOpenAI.js +18 -0
- package/dist/core/converters/anthropicToOpenAI.js.map +1 -0
- package/dist/core/converters/openaiPassthrough.d.ts +18 -0
- package/dist/core/converters/openaiPassthrough.js +794 -0
- package/dist/core/converters/openaiPassthrough.js.map +1 -0
- package/dist/core/converters/types.d.ts +14 -0
- package/dist/core/converters/types.js +16 -0
- package/dist/core/converters/types.js.map +1 -0
- package/dist/core/ensureToolCall.d.ts +24 -0
- package/dist/core/ensureToolCall.js +93 -0
- package/dist/core/ensureToolCall.js.map +1 -0
- package/dist/core/modelRegistry.d.ts +46 -0
- package/dist/core/modelRegistry.js +92 -0
- package/dist/core/modelRegistry.js.map +1 -0
- package/dist/core/pipeline.d.ts +17 -0
- package/dist/core/pipeline.js +109 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/pipelineControl.d.ts +12 -0
- package/dist/core/pipelineControl.js +51 -0
- package/dist/core/pipelineControl.js.map +1 -0
- package/dist/core/providers/openRouterProvider.d.ts +52 -0
- package/dist/core/providers/openRouterProvider.js +158 -0
- package/dist/core/providers/openRouterProvider.js.map +1 -0
- package/dist/core/providers/openaiProvider.d.ts +22 -0
- package/dist/core/providers/openaiProvider.js +79 -0
- package/dist/core/providers/openaiProvider.js.map +1 -0
- package/dist/core/providers/types.d.ts +24 -0
- package/dist/core/providers/types.js +14 -0
- package/dist/core/providers/types.js.map +1 -0
- package/dist/core/providers/vertexProvider.d.ts +37 -0
- package/dist/core/providers/vertexProvider.js +167 -0
- package/dist/core/providers/vertexProvider.js.map +1 -0
- package/dist/core/syntheticResponse.d.ts +6 -0
- package/dist/core/syntheticResponse.js +36 -0
- package/dist/core/syntheticResponse.js.map +1 -0
- package/dist/core/transforms/request/ClampMaxTokensTransform.d.ts +7 -0
- package/dist/core/transforms/request/ClampMaxTokensTransform.js +29 -0
- package/dist/core/transforms/request/ClampMaxTokensTransform.js.map +1 -0
- package/dist/core/transforms/request/DisableStreamingTransform.d.ts +7 -0
- package/dist/core/transforms/request/DisableStreamingTransform.js +15 -0
- package/dist/core/transforms/request/DisableStreamingTransform.js.map +1 -0
- package/dist/core/transforms/request/EnsureToolCallRequestTransform.d.ts +12 -0
- package/dist/core/transforms/request/EnsureToolCallRequestTransform.js +120 -0
- package/dist/core/transforms/request/EnsureToolCallRequestTransform.js.map +1 -0
- package/dist/core/transforms/response/EnsureToolCallResponseTransform.d.ts +9 -0
- package/dist/core/transforms/response/EnsureToolCallResponseTransform.js +223 -0
- package/dist/core/transforms/response/EnsureToolCallResponseTransform.js.map +1 -0
- package/dist/core/transforms/response/KimiResponseTransform.d.ts +7 -0
- package/dist/core/transforms/response/KimiResponseTransform.js +32 -0
- package/dist/core/transforms/response/KimiResponseTransform.js.map +1 -0
- package/dist/core/types.d.ts +80 -0
- package/dist/core/types.js +18 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/persistence/logStore.d.ts +43 -0
- package/dist/persistence/logStore.js +115 -0
- package/dist/persistence/logStore.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +385 -0
- package/dist/server.js.map +1 -0
- package/dist/services/kimiFixer.d.ts +13 -0
- package/dist/services/kimiFixer.js +160 -0
- package/dist/services/kimiFixer.js.map +1 -0
- package/dist/services/streaming.d.ts +9 -0
- package/dist/services/streaming.js +513 -0
- package/dist/services/streaming.js.map +1 -0
- package/dist/utils/envResolver.d.ts +26 -0
- package/dist/utils/envResolver.js +64 -0
- package/dist/utils/envResolver.js.map +1 -0
- package/dist/utils/ids.d.ts +1 -0
- package/dist/utils/ids.js +7 -0
- package/dist/utils/ids.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.js +12 -0
- package/dist/utils/logger.js.map +1 -0
- package/frontend/dist/assets/JSONViewer-97138fd7.js +3 -0
- package/frontend/dist/assets/index-0e7c091b.css +1 -0
- package/frontend/dist/assets/index-4b354ce2.js +40 -0
- package/frontend/dist/index.html +22 -0
- package/package.json +60 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { fetch } from "undici";
|
|
2
|
+
import { ProviderFormat, ProxyOperation, } from "../types.js";
|
|
3
|
+
import { logger } from "../../utils/logger.js";
|
|
4
|
+
export class OpenRouterProvider {
|
|
5
|
+
config;
|
|
6
|
+
key = "openrouter";
|
|
7
|
+
format = ProviderFormat.OpenAIChatCompletions;
|
|
8
|
+
supportedOperations = [
|
|
9
|
+
ProxyOperation.ChatCompletions,
|
|
10
|
+
ProxyOperation.Messages,
|
|
11
|
+
ProxyOperation.Responses,
|
|
12
|
+
];
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
resolvePath(operation) {
|
|
17
|
+
switch (operation) {
|
|
18
|
+
case ProxyOperation.ChatCompletions:
|
|
19
|
+
return "/v1/chat/completions";
|
|
20
|
+
case ProxyOperation.Messages:
|
|
21
|
+
return "/v1/messages";
|
|
22
|
+
case ProxyOperation.Responses:
|
|
23
|
+
return "/v1/responses";
|
|
24
|
+
default:
|
|
25
|
+
throw new Error(`Operation ${operation} is not supported by OpenRouter provider`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
buildUrl(operation) {
|
|
29
|
+
const baseUrl = this.config.baseUrl;
|
|
30
|
+
const path = this.resolvePath(operation);
|
|
31
|
+
const url = new URL(path, baseUrl);
|
|
32
|
+
return url;
|
|
33
|
+
}
|
|
34
|
+
buildProviderBody(config) {
|
|
35
|
+
const provider = {};
|
|
36
|
+
// Parse comma-separated providers into array if needed
|
|
37
|
+
if (config.providers) {
|
|
38
|
+
const providersList = config.providers
|
|
39
|
+
.split(",")
|
|
40
|
+
.map((p) => p.trim())
|
|
41
|
+
.filter((p) => p.length > 0);
|
|
42
|
+
if (providersList.length > 0) {
|
|
43
|
+
provider["order"] = providersList;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Use explicit order if provided
|
|
47
|
+
if (config.order && config.order.length > 0) {
|
|
48
|
+
provider["order"] = config.order;
|
|
49
|
+
}
|
|
50
|
+
if (config.sort) {
|
|
51
|
+
provider["sort"] = config.sort;
|
|
52
|
+
}
|
|
53
|
+
if (typeof config.allowFallbacks === "boolean") {
|
|
54
|
+
provider["allow_fallbacks"] = config.allowFallbacks;
|
|
55
|
+
}
|
|
56
|
+
return provider;
|
|
57
|
+
}
|
|
58
|
+
mergeConfig(modelProviderConfig) {
|
|
59
|
+
if (!modelProviderConfig) {
|
|
60
|
+
return this.config;
|
|
61
|
+
}
|
|
62
|
+
const mergedConfig = {
|
|
63
|
+
baseUrl: modelProviderConfig.baseUrl !== undefined
|
|
64
|
+
? modelProviderConfig.baseUrl
|
|
65
|
+
: this.config.baseUrl,
|
|
66
|
+
apiKey: modelProviderConfig.apiKey !== undefined
|
|
67
|
+
? modelProviderConfig.apiKey
|
|
68
|
+
: this.config.apiKey,
|
|
69
|
+
};
|
|
70
|
+
// Only add optional properties if explicitly provided
|
|
71
|
+
if (modelProviderConfig.providers !== undefined) {
|
|
72
|
+
mergedConfig.providers = modelProviderConfig.providers;
|
|
73
|
+
}
|
|
74
|
+
else if (this.config.providers !== undefined) {
|
|
75
|
+
mergedConfig.providers = this.config.providers;
|
|
76
|
+
}
|
|
77
|
+
if (modelProviderConfig.sort !== undefined) {
|
|
78
|
+
mergedConfig.sort = modelProviderConfig.sort;
|
|
79
|
+
}
|
|
80
|
+
else if (this.config.sort !== undefined) {
|
|
81
|
+
mergedConfig.sort = this.config.sort;
|
|
82
|
+
}
|
|
83
|
+
if (modelProviderConfig.order !== undefined) {
|
|
84
|
+
mergedConfig.order = modelProviderConfig.order;
|
|
85
|
+
}
|
|
86
|
+
else if (this.config.order !== undefined) {
|
|
87
|
+
mergedConfig.order = this.config.order;
|
|
88
|
+
}
|
|
89
|
+
if (modelProviderConfig.allowFallbacks !== undefined) {
|
|
90
|
+
mergedConfig.allowFallbacks = modelProviderConfig.allowFallbacks;
|
|
91
|
+
}
|
|
92
|
+
else if (this.config.allowFallbacks !== undefined) {
|
|
93
|
+
mergedConfig.allowFallbacks = this.config.allowFallbacks;
|
|
94
|
+
}
|
|
95
|
+
if (modelProviderConfig.modelShortcut !== undefined) {
|
|
96
|
+
mergedConfig.modelShortcut = modelProviderConfig.modelShortcut;
|
|
97
|
+
}
|
|
98
|
+
else if (this.config.modelShortcut !== undefined) {
|
|
99
|
+
mergedConfig.modelShortcut = this.config.modelShortcut;
|
|
100
|
+
}
|
|
101
|
+
return mergedConfig;
|
|
102
|
+
}
|
|
103
|
+
async invoke({ request, body, headers, providerConfig: modelProviderConfig, }) {
|
|
104
|
+
const url = this.buildUrl(request.operation);
|
|
105
|
+
// Merge base config with model-level overrides
|
|
106
|
+
const mergedConfig = this.mergeConfig(modelProviderConfig);
|
|
107
|
+
const upstreamHeaders = {
|
|
108
|
+
Authorization: `Bearer ${mergedConfig.apiKey}`,
|
|
109
|
+
"Content-Type": "application/json",
|
|
110
|
+
...(headers ?? {}),
|
|
111
|
+
};
|
|
112
|
+
// Merge provider configuration into request body
|
|
113
|
+
const routerProviderConfig = this.buildProviderBody(mergedConfig);
|
|
114
|
+
const bodyWithProvider = typeof body === "object" && body !== null && !Array.isArray(body)
|
|
115
|
+
? { ...body }
|
|
116
|
+
: {};
|
|
117
|
+
if (Object.keys(routerProviderConfig).length > 0) {
|
|
118
|
+
bodyWithProvider["provider"] = routerProviderConfig;
|
|
119
|
+
}
|
|
120
|
+
// Handle model shortcuts (append to model name)
|
|
121
|
+
if (mergedConfig.modelShortcut &&
|
|
122
|
+
typeof bodyWithProvider["model"] === "string") {
|
|
123
|
+
bodyWithProvider["model"] =
|
|
124
|
+
`${bodyWithProvider["model"]}${mergedConfig.modelShortcut}`;
|
|
125
|
+
}
|
|
126
|
+
logger.debug({ url: url.toString(), provider: this.key, body: bodyWithProvider }, "Making request to OpenRouter with routing parameters");
|
|
127
|
+
const response = await fetch(url, {
|
|
128
|
+
method: "POST",
|
|
129
|
+
headers: upstreamHeaders,
|
|
130
|
+
body: JSON.stringify(bodyWithProvider),
|
|
131
|
+
});
|
|
132
|
+
const responseBody = await this.safeJson(response);
|
|
133
|
+
if (!response.ok) {
|
|
134
|
+
logger.warn({ status: response.status, provider: this.key, body: responseBody }, "OpenRouter upstream returned non-200");
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
status: response.status,
|
|
138
|
+
body: responseBody,
|
|
139
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
async safeJson(response) {
|
|
143
|
+
try {
|
|
144
|
+
return (await response.json());
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return (await response.text());
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async listModels() {
|
|
151
|
+
const url = new URL("/v1/models", this.config.baseUrl);
|
|
152
|
+
const response = await fetch(url, {
|
|
153
|
+
headers: { Authorization: `Bearer ${this.config.apiKey}` },
|
|
154
|
+
});
|
|
155
|
+
return this.safeJson(response);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=openRouterProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openRouterProvider.js","sourceRoot":"","sources":["../../../src/core/providers/openRouterProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ProviderFormat, ProxyOperation, ProviderResponsePayload, JsonValue } from "../types.js";
|
|
2
|
+
import { LLMProvider, ProviderInvokeArgs } from "./types.js";
|
|
3
|
+
export interface OpenAIConfig {
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
}
|
|
7
|
+
export interface OpenAIModelConfig {
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
12
|
+
private readonly config;
|
|
13
|
+
key: string;
|
|
14
|
+
format: ProviderFormat;
|
|
15
|
+
supportedOperations: ProxyOperation[];
|
|
16
|
+
constructor(config: OpenAIConfig);
|
|
17
|
+
private resolvePath;
|
|
18
|
+
invoke({ request, body, headers, providerConfig, }: ProviderInvokeArgs): Promise<ProviderResponsePayload>;
|
|
19
|
+
private resolveConfig;
|
|
20
|
+
private safeJson;
|
|
21
|
+
listModels(): Promise<JsonValue>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { fetch } from "undici";
|
|
2
|
+
import { ProviderFormat, ProxyOperation, } from "../types.js";
|
|
3
|
+
import { logger } from "../../utils/logger.js";
|
|
4
|
+
export class OpenAIProvider {
|
|
5
|
+
config;
|
|
6
|
+
key = "openai";
|
|
7
|
+
format = ProviderFormat.OpenAIChatCompletions;
|
|
8
|
+
supportedOperations = [
|
|
9
|
+
ProxyOperation.ChatCompletions,
|
|
10
|
+
ProxyOperation.Messages,
|
|
11
|
+
ProxyOperation.Responses,
|
|
12
|
+
];
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
resolvePath(operation) {
|
|
17
|
+
switch (operation) {
|
|
18
|
+
case ProxyOperation.ChatCompletions:
|
|
19
|
+
return "/v1/chat/completions";
|
|
20
|
+
case ProxyOperation.Messages:
|
|
21
|
+
return "/v1/messages";
|
|
22
|
+
case ProxyOperation.Responses:
|
|
23
|
+
return "/v1/responses";
|
|
24
|
+
default:
|
|
25
|
+
throw new Error(`Operation ${operation} is not supported by OpenAI provider`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async invoke({ request, body, headers, providerConfig, }) {
|
|
29
|
+
// Resolve configuration with model-level overrides
|
|
30
|
+
const config = this.resolveConfig(providerConfig);
|
|
31
|
+
const url = new URL(this.resolvePath(request.operation), config.baseUrl);
|
|
32
|
+
const upstreamHeaders = {
|
|
33
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
34
|
+
"Content-Type": "application/json",
|
|
35
|
+
...(headers ?? {}),
|
|
36
|
+
};
|
|
37
|
+
const response = await fetch(url, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: upstreamHeaders,
|
|
40
|
+
body: JSON.stringify(body),
|
|
41
|
+
signal: AbortSignal.timeout(120000),
|
|
42
|
+
});
|
|
43
|
+
const responseBody = await this.safeJson(response);
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
logger.warn({ status: response.status, provider: this.key, body: responseBody }, "OpenAI upstream returned non-200");
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
status: response.status,
|
|
49
|
+
body: responseBody,
|
|
50
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
resolveConfig(providerConfig) {
|
|
54
|
+
if (!providerConfig) {
|
|
55
|
+
return this.config;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
baseUrl: providerConfig.baseUrl ?? this.config.baseUrl,
|
|
59
|
+
apiKey: providerConfig.apiKey ?? this.config.apiKey,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async safeJson(response) {
|
|
63
|
+
try {
|
|
64
|
+
return (await response.json());
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return (await response.text());
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async listModels() {
|
|
71
|
+
const url = new URL("/v1/models", this.config.baseUrl);
|
|
72
|
+
const response = await fetch(url, {
|
|
73
|
+
headers: { Authorization: `Bearer ${this.config.apiKey}` },
|
|
74
|
+
signal: AbortSignal.timeout(120000),
|
|
75
|
+
});
|
|
76
|
+
return this.safeJson(response);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=openaiProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openaiProvider.js","sourceRoot":"","sources":["../../../src/core/providers/openaiProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ProviderFormat, ProxyOperation, ProviderResponsePayload, ProxyRequest, JsonValue, JsonObject } from "../types.js";
|
|
2
|
+
export interface ProviderInvokeArgs<TBody extends JsonValue = JsonValue> {
|
|
3
|
+
request: ProxyRequest<TBody>;
|
|
4
|
+
body: TBody;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
stream: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Model-level provider configuration (optional)
|
|
9
|
+
* Can override base provider configuration
|
|
10
|
+
*/
|
|
11
|
+
providerConfig?: JsonObject;
|
|
12
|
+
}
|
|
13
|
+
export interface LLMProvider {
|
|
14
|
+
key: string;
|
|
15
|
+
format: ProviderFormat;
|
|
16
|
+
supportedOperations: ProxyOperation[];
|
|
17
|
+
invoke(args: ProviderInvokeArgs): Promise<ProviderResponsePayload<JsonValue>>;
|
|
18
|
+
listModels?(): Promise<JsonValue>;
|
|
19
|
+
}
|
|
20
|
+
export declare class ProviderRegistry {
|
|
21
|
+
private providers;
|
|
22
|
+
register(provider: LLMProvider): void;
|
|
23
|
+
get(key: string): LLMProvider;
|
|
24
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export class ProviderRegistry {
|
|
2
|
+
providers = new Map();
|
|
3
|
+
register(provider) {
|
|
4
|
+
this.providers.set(provider.key, provider);
|
|
5
|
+
}
|
|
6
|
+
get(key) {
|
|
7
|
+
const provider = this.providers.get(key);
|
|
8
|
+
if (!provider) {
|
|
9
|
+
throw new Error(`Provider ${key} is not registered`);
|
|
10
|
+
}
|
|
11
|
+
return provider;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/providers/types.ts"],"names":[],"mappings":"AA6BA,MAAM,OAAO,gBAAgB;IACnB,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEnD,QAAQ,CAAC,QAAqB;QAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,oBAAoB,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type JWTInput } from "google-auth-library";
|
|
2
|
+
import { ProviderFormat, ProxyOperation, ProviderResponsePayload } from "../types.js";
|
|
3
|
+
import { LLMProvider, ProviderInvokeArgs } from "./types.js";
|
|
4
|
+
export interface VertexConfig {
|
|
5
|
+
projectId: string;
|
|
6
|
+
location: string;
|
|
7
|
+
endpointOverride?: string;
|
|
8
|
+
credentialsPath?: string;
|
|
9
|
+
credentials?: JWTInput;
|
|
10
|
+
}
|
|
11
|
+
export interface VertexModelConfig {
|
|
12
|
+
projectId?: string;
|
|
13
|
+
location?: string;
|
|
14
|
+
endpointOverride?: string;
|
|
15
|
+
credentialsPath?: string;
|
|
16
|
+
credentials?: JWTInput;
|
|
17
|
+
}
|
|
18
|
+
export declare class VertexMaaSProvider implements LLMProvider {
|
|
19
|
+
private readonly config;
|
|
20
|
+
key: string;
|
|
21
|
+
format: ProviderFormat;
|
|
22
|
+
supportedOperations: ProxyOperation[];
|
|
23
|
+
private auth;
|
|
24
|
+
constructor(config: VertexConfig);
|
|
25
|
+
invoke({ request, body, headers, providerConfig, }: ProviderInvokeArgs): Promise<ProviderResponsePayload>;
|
|
26
|
+
private safeJson;
|
|
27
|
+
private buildHeaders;
|
|
28
|
+
private getAccessToken;
|
|
29
|
+
private buildAuth;
|
|
30
|
+
private mergeConfig;
|
|
31
|
+
private resolveEndpoint;
|
|
32
|
+
private buildEndpoint;
|
|
33
|
+
private shouldUseGlobalHost;
|
|
34
|
+
private requiresGlobalLocation;
|
|
35
|
+
private normalizeModelId;
|
|
36
|
+
private extractModelFromState;
|
|
37
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { fetch } from "undici";
|
|
2
|
+
import { GoogleAuth, } from "google-auth-library";
|
|
3
|
+
import { ProviderFormat, ProxyOperation, } from "../types.js";
|
|
4
|
+
import { logger } from "../../utils/logger.js";
|
|
5
|
+
const VERTEX_SCOPES = ["https://www.googleapis.com/auth/cloud-platform"];
|
|
6
|
+
const GLOBAL_VERTEX_HOST = "https://aiplatform.googleapis.com";
|
|
7
|
+
const MAAS_MODEL_PATTERN = /\/.*-maas$/i;
|
|
8
|
+
const GEMINI3_MODELS = new Set([
|
|
9
|
+
"gemini-3-pro-preview",
|
|
10
|
+
"google/gemini-3-pro-preview",
|
|
11
|
+
]);
|
|
12
|
+
export class VertexMaaSProvider {
|
|
13
|
+
config;
|
|
14
|
+
key = "vertex";
|
|
15
|
+
format = ProviderFormat.OpenAIChatCompletions;
|
|
16
|
+
supportedOperations = [
|
|
17
|
+
ProxyOperation.ChatCompletions,
|
|
18
|
+
ProxyOperation.Messages,
|
|
19
|
+
ProxyOperation.Responses,
|
|
20
|
+
];
|
|
21
|
+
auth;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
const authOptions = { scopes: VERTEX_SCOPES };
|
|
25
|
+
if (config.credentialsPath) {
|
|
26
|
+
authOptions.keyFilename = config.credentialsPath;
|
|
27
|
+
}
|
|
28
|
+
else if (config.credentials) {
|
|
29
|
+
authOptions.credentials = config.credentials;
|
|
30
|
+
}
|
|
31
|
+
this.auth = new GoogleAuth(authOptions);
|
|
32
|
+
}
|
|
33
|
+
async invoke({ request, body, headers, providerConfig, }) {
|
|
34
|
+
let providerBody = body;
|
|
35
|
+
let bodyModel;
|
|
36
|
+
if (isJsonObject(body)) {
|
|
37
|
+
providerBody = { ...body };
|
|
38
|
+
const candidate = body.model;
|
|
39
|
+
if (typeof candidate === "string") {
|
|
40
|
+
bodyModel = candidate;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const normalizedModel = this.normalizeModelId(bodyModel ?? this.extractModelFromState(request));
|
|
44
|
+
if (normalizedModel && isJsonObject(providerBody)) {
|
|
45
|
+
providerBody.model = normalizedModel;
|
|
46
|
+
}
|
|
47
|
+
// Merge base config with model-level overrides
|
|
48
|
+
const config = this.mergeConfig(providerConfig);
|
|
49
|
+
const upstreamHeaders = await this.buildHeaders(headers, config);
|
|
50
|
+
const endpoint = this.resolveEndpoint(normalizedModel, config);
|
|
51
|
+
const response = await fetch(endpoint, {
|
|
52
|
+
method: "POST",
|
|
53
|
+
headers: upstreamHeaders,
|
|
54
|
+
body: JSON.stringify(providerBody),
|
|
55
|
+
signal: AbortSignal.timeout(120000),
|
|
56
|
+
});
|
|
57
|
+
const responseBody = await this.safeJson(response);
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
logger.warn({ status: response.status, provider: this.key, body: responseBody }, "Vertex AI MaaS upstream returned non-200");
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
status: response.status,
|
|
63
|
+
body: responseBody,
|
|
64
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async safeJson(response) {
|
|
68
|
+
const text = await response.text();
|
|
69
|
+
try {
|
|
70
|
+
return JSON.parse(text);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return text;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async buildHeaders(extra, config) {
|
|
77
|
+
const token = await this.getAccessToken(config);
|
|
78
|
+
return {
|
|
79
|
+
"Content-Type": "application/json",
|
|
80
|
+
...(extra ?? {}),
|
|
81
|
+
Authorization: `Bearer ${token}`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async getAccessToken(config) {
|
|
85
|
+
const token = await this.buildAuth(config).getAccessToken();
|
|
86
|
+
if (!token) {
|
|
87
|
+
throw new Error("Unable to acquire access token for Vertex AI MaaS");
|
|
88
|
+
}
|
|
89
|
+
return token;
|
|
90
|
+
}
|
|
91
|
+
buildAuth(cfg) {
|
|
92
|
+
const authOptions = { scopes: VERTEX_SCOPES };
|
|
93
|
+
if (cfg.credentialsPath) {
|
|
94
|
+
authOptions.keyFilename = cfg.credentialsPath;
|
|
95
|
+
}
|
|
96
|
+
else if (cfg.credentials) {
|
|
97
|
+
authOptions.credentials = cfg.credentials;
|
|
98
|
+
}
|
|
99
|
+
return new GoogleAuth(authOptions);
|
|
100
|
+
}
|
|
101
|
+
mergeConfig(modelConfig) {
|
|
102
|
+
const merged = {
|
|
103
|
+
projectId: this.config.projectId,
|
|
104
|
+
location: this.config.location,
|
|
105
|
+
endpointOverride: this.config.endpointOverride,
|
|
106
|
+
credentialsPath: this.config.credentialsPath,
|
|
107
|
+
credentials: this.config.credentials,
|
|
108
|
+
};
|
|
109
|
+
if (!modelConfig)
|
|
110
|
+
return merged;
|
|
111
|
+
if (typeof modelConfig.projectId === "string")
|
|
112
|
+
merged.projectId = modelConfig.projectId;
|
|
113
|
+
if (typeof modelConfig.location === "string")
|
|
114
|
+
merged.location = modelConfig.location;
|
|
115
|
+
if (typeof modelConfig.endpointOverride === "string")
|
|
116
|
+
merged.endpointOverride = modelConfig.endpointOverride;
|
|
117
|
+
if (typeof modelConfig.credentialsPath === "string")
|
|
118
|
+
merged.credentialsPath = modelConfig.credentialsPath;
|
|
119
|
+
if (modelConfig.credentials)
|
|
120
|
+
merged.credentials = modelConfig.credentials;
|
|
121
|
+
return merged;
|
|
122
|
+
}
|
|
123
|
+
resolveEndpoint(model, config) {
|
|
124
|
+
if (config.endpointOverride) {
|
|
125
|
+
return config.endpointOverride;
|
|
126
|
+
}
|
|
127
|
+
if (model) {
|
|
128
|
+
const location = this.requiresGlobalLocation(model)
|
|
129
|
+
? "global"
|
|
130
|
+
: config.location;
|
|
131
|
+
if (this.shouldUseGlobalHost(model) || location === "global") {
|
|
132
|
+
return this.buildEndpoint(GLOBAL_VERTEX_HOST, location);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return this.buildEndpoint(`https://${config.location}-aiplatform.googleapis.com`, config.location);
|
|
136
|
+
}
|
|
137
|
+
buildEndpoint(host, location) {
|
|
138
|
+
return `${host}/v1/projects/${this.config.projectId}/locations/${location}/endpoints/openapi/chat/completions`;
|
|
139
|
+
}
|
|
140
|
+
shouldUseGlobalHost(model) {
|
|
141
|
+
return MAAS_MODEL_PATTERN.test(model) || GEMINI3_MODELS.has(model);
|
|
142
|
+
}
|
|
143
|
+
requiresGlobalLocation(model) {
|
|
144
|
+
return GEMINI3_MODELS.has(model);
|
|
145
|
+
}
|
|
146
|
+
normalizeModelId(model) {
|
|
147
|
+
if (!model) {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
if (GEMINI3_MODELS.has(model)) {
|
|
151
|
+
return "google/gemini-3-pro-preview";
|
|
152
|
+
}
|
|
153
|
+
return model;
|
|
154
|
+
}
|
|
155
|
+
extractModelFromState(request) {
|
|
156
|
+
const resolvedModel = request.state?.resolvedModel;
|
|
157
|
+
if (!isJsonObject(resolvedModel)) {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
const upstreamModel = resolvedModel.upstreamModel;
|
|
161
|
+
return typeof upstreamModel === "string" ? upstreamModel : undefined;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function isJsonObject(value) {
|
|
165
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=vertexProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertexProvider.js","sourceRoot":"","sources":["../../../src/core/providers/vertexProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { JsonObject, ProviderFormat, ProviderResponsePayload } from "./types.js";
|
|
2
|
+
export interface SyntheticResponseOptions {
|
|
3
|
+
status?: number;
|
|
4
|
+
providerFormat?: ProviderFormat;
|
|
5
|
+
}
|
|
6
|
+
export declare function createSyntheticProviderResponse(options?: SyntheticResponseOptions): ProviderResponsePayload<JsonObject>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function createSyntheticProviderResponse(options = {}) {
|
|
2
|
+
const status = options.status ?? 200;
|
|
3
|
+
// Currently using OpenAI format only
|
|
4
|
+
const body = {
|
|
5
|
+
id: "synth_" + Date.now(),
|
|
6
|
+
object: "chat.completion",
|
|
7
|
+
created: Math.floor(Date.now() / 1000),
|
|
8
|
+
model: "synthetic",
|
|
9
|
+
choices: [
|
|
10
|
+
{
|
|
11
|
+
index: 0,
|
|
12
|
+
message: {
|
|
13
|
+
role: "assistant",
|
|
14
|
+
content: null,
|
|
15
|
+
},
|
|
16
|
+
finish_reason: "stop",
|
|
17
|
+
logprobs: null,
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
usage: {
|
|
21
|
+
prompt_tokens: 0,
|
|
22
|
+
completion_tokens: 0,
|
|
23
|
+
total_tokens: 0,
|
|
24
|
+
},
|
|
25
|
+
system_fingerprint: "synthetic_response",
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
status,
|
|
29
|
+
body,
|
|
30
|
+
headers: {
|
|
31
|
+
"content-type": "application/json",
|
|
32
|
+
"x-synthetic-response": "true",
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=syntheticResponse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntheticResponse.js","sourceRoot":"","sources":["../../src/core/syntheticResponse.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,+BAA+B,CAC7C,UAAoC,EAAE;IAEtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;IAErC,qCAAqC;IACrC,MAAM,IAAI,GAAe;QACvB,EAAE,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE;QACzB,MAAM,EAAE,iBAAiB;QACzB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACtC,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE;oBACP,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,IAAI;iBACd;gBACD,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,IAAI;aACf;SACF;QACD,KAAK,EAAE;YACL,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,CAAC;YACpB,YAAY,EAAE,CAAC;SAChB;QACD,kBAAkB,EAAE,oBAAoB;KACzC,CAAC;IAEF,OAAO;QACL,MAAM;QACN,IAAI;QACJ,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,sBAAsB,EAAE,MAAM;SAC/B;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RequestTransform, RequestTransformContext } from "../../types.js";
|
|
2
|
+
export declare class ClampMaxTokensTransform implements RequestTransform {
|
|
3
|
+
name: string;
|
|
4
|
+
stage: RequestTransform["stage"];
|
|
5
|
+
applies(context: RequestTransformContext): boolean;
|
|
6
|
+
transform(context: RequestTransformContext): void;
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const MAX_TOKENS_CAP = Number(process.env.MAX_TOKENS_CAP ?? "4096");
|
|
2
|
+
export class ClampMaxTokensTransform {
|
|
3
|
+
name = "clamp-max-tokens";
|
|
4
|
+
stage = "post-conversion";
|
|
5
|
+
applies(context) {
|
|
6
|
+
const providerBody = getProviderBody(context);
|
|
7
|
+
if (!providerBody) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const maxTokens = providerBody.max_tokens;
|
|
11
|
+
return typeof maxTokens === "number" && maxTokens > MAX_TOKENS_CAP;
|
|
12
|
+
}
|
|
13
|
+
transform(context) {
|
|
14
|
+
const providerBody = getProviderBody(context);
|
|
15
|
+
if (!providerBody) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
providerBody.max_tokens = MAX_TOKENS_CAP;
|
|
19
|
+
context.request.state.maxTokensClamped = true;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function getProviderBody(context) {
|
|
23
|
+
const body = context.providerRequest?.body;
|
|
24
|
+
return isJsonObject(body) ? body : null;
|
|
25
|
+
}
|
|
26
|
+
function isJsonObject(value) {
|
|
27
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=ClampMaxTokensTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClampMaxTokensTransform.js","sourceRoot":"","sources":["../../../../src/core/transforms/request/ClampMaxTokensTransform.ts"],"names":[],"mappings":"AAOA,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC;AAEpE,MAAM,OAAO,uBAAuB;IAClC,IAAI,GAAG,kBAAkB,CAAC;IAC1B,KAAK,GAA8B,iBAAiB,CAAC;IAErD,OAAO,CAAC,OAAgC;QACtC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC;QAC1C,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,cAAc,CAAC;IACrE,CAAC;IAED,SAAS,CAAC,OAAgC;QACxC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,YAAY,CAAC,UAAU,GAAG,cAAc,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAChD,CAAC;CACF;AAED,SAAS,eAAe,CAAC,OAAgC;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;IAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,KAA4B;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RequestTransform, RequestTransformContext } from "../../types.js";
|
|
2
|
+
export declare class DisableStreamingTransform implements RequestTransform {
|
|
3
|
+
name: string;
|
|
4
|
+
stage: RequestTransform["stage"];
|
|
5
|
+
applies(context: RequestTransformContext): boolean;
|
|
6
|
+
transform(context: RequestTransformContext): void;
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class DisableStreamingTransform {
|
|
2
|
+
name = "disable-streaming";
|
|
3
|
+
stage = "source";
|
|
4
|
+
applies(context) {
|
|
5
|
+
return context.request.stream === true;
|
|
6
|
+
}
|
|
7
|
+
transform(context) {
|
|
8
|
+
context.request.state.originalStream = true;
|
|
9
|
+
context.request.stream = false;
|
|
10
|
+
if (context.request.body && typeof context.request.body === "object") {
|
|
11
|
+
context.request.body.stream = false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=DisableStreamingTransform.js.map
|