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.
Files changed (91) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +177 -0
  3. package/dist/adapters/anthropicAdapter.d.ts +138 -0
  4. package/dist/adapters/anthropicAdapter.js +184 -0
  5. package/dist/adapters/anthropicAdapter.js.map +1 -0
  6. package/dist/config.d.ts +27 -0
  7. package/dist/config.js +228 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/core/converters/anthropicToOpenAI.d.ts +11 -0
  10. package/dist/core/converters/anthropicToOpenAI.js +18 -0
  11. package/dist/core/converters/anthropicToOpenAI.js.map +1 -0
  12. package/dist/core/converters/openaiPassthrough.d.ts +18 -0
  13. package/dist/core/converters/openaiPassthrough.js +794 -0
  14. package/dist/core/converters/openaiPassthrough.js.map +1 -0
  15. package/dist/core/converters/types.d.ts +14 -0
  16. package/dist/core/converters/types.js +16 -0
  17. package/dist/core/converters/types.js.map +1 -0
  18. package/dist/core/ensureToolCall.d.ts +24 -0
  19. package/dist/core/ensureToolCall.js +93 -0
  20. package/dist/core/ensureToolCall.js.map +1 -0
  21. package/dist/core/modelRegistry.d.ts +46 -0
  22. package/dist/core/modelRegistry.js +92 -0
  23. package/dist/core/modelRegistry.js.map +1 -0
  24. package/dist/core/pipeline.d.ts +17 -0
  25. package/dist/core/pipeline.js +109 -0
  26. package/dist/core/pipeline.js.map +1 -0
  27. package/dist/core/pipelineControl.d.ts +12 -0
  28. package/dist/core/pipelineControl.js +51 -0
  29. package/dist/core/pipelineControl.js.map +1 -0
  30. package/dist/core/providers/openRouterProvider.d.ts +52 -0
  31. package/dist/core/providers/openRouterProvider.js +158 -0
  32. package/dist/core/providers/openRouterProvider.js.map +1 -0
  33. package/dist/core/providers/openaiProvider.d.ts +22 -0
  34. package/dist/core/providers/openaiProvider.js +79 -0
  35. package/dist/core/providers/openaiProvider.js.map +1 -0
  36. package/dist/core/providers/types.d.ts +24 -0
  37. package/dist/core/providers/types.js +14 -0
  38. package/dist/core/providers/types.js.map +1 -0
  39. package/dist/core/providers/vertexProvider.d.ts +37 -0
  40. package/dist/core/providers/vertexProvider.js +167 -0
  41. package/dist/core/providers/vertexProvider.js.map +1 -0
  42. package/dist/core/syntheticResponse.d.ts +6 -0
  43. package/dist/core/syntheticResponse.js +36 -0
  44. package/dist/core/syntheticResponse.js.map +1 -0
  45. package/dist/core/transforms/request/ClampMaxTokensTransform.d.ts +7 -0
  46. package/dist/core/transforms/request/ClampMaxTokensTransform.js +29 -0
  47. package/dist/core/transforms/request/ClampMaxTokensTransform.js.map +1 -0
  48. package/dist/core/transforms/request/DisableStreamingTransform.d.ts +7 -0
  49. package/dist/core/transforms/request/DisableStreamingTransform.js +15 -0
  50. package/dist/core/transforms/request/DisableStreamingTransform.js.map +1 -0
  51. package/dist/core/transforms/request/EnsureToolCallRequestTransform.d.ts +12 -0
  52. package/dist/core/transforms/request/EnsureToolCallRequestTransform.js +120 -0
  53. package/dist/core/transforms/request/EnsureToolCallRequestTransform.js.map +1 -0
  54. package/dist/core/transforms/response/EnsureToolCallResponseTransform.d.ts +9 -0
  55. package/dist/core/transforms/response/EnsureToolCallResponseTransform.js +223 -0
  56. package/dist/core/transforms/response/EnsureToolCallResponseTransform.js.map +1 -0
  57. package/dist/core/transforms/response/KimiResponseTransform.d.ts +7 -0
  58. package/dist/core/transforms/response/KimiResponseTransform.js +32 -0
  59. package/dist/core/transforms/response/KimiResponseTransform.js.map +1 -0
  60. package/dist/core/types.d.ts +80 -0
  61. package/dist/core/types.js +18 -0
  62. package/dist/core/types.js.map +1 -0
  63. package/dist/index.d.ts +1 -0
  64. package/dist/index.js +17 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/persistence/logStore.d.ts +43 -0
  67. package/dist/persistence/logStore.js +115 -0
  68. package/dist/persistence/logStore.js.map +1 -0
  69. package/dist/server.d.ts +3 -0
  70. package/dist/server.js +385 -0
  71. package/dist/server.js.map +1 -0
  72. package/dist/services/kimiFixer.d.ts +13 -0
  73. package/dist/services/kimiFixer.js +160 -0
  74. package/dist/services/kimiFixer.js.map +1 -0
  75. package/dist/services/streaming.d.ts +9 -0
  76. package/dist/services/streaming.js +513 -0
  77. package/dist/services/streaming.js.map +1 -0
  78. package/dist/utils/envResolver.d.ts +26 -0
  79. package/dist/utils/envResolver.js +64 -0
  80. package/dist/utils/envResolver.js.map +1 -0
  81. package/dist/utils/ids.d.ts +1 -0
  82. package/dist/utils/ids.js +7 -0
  83. package/dist/utils/ids.js.map +1 -0
  84. package/dist/utils/logger.d.ts +3 -0
  85. package/dist/utils/logger.js +12 -0
  86. package/dist/utils/logger.js.map +1 -0
  87. package/frontend/dist/assets/JSONViewer-97138fd7.js +3 -0
  88. package/frontend/dist/assets/index-0e7c091b.css +1 -0
  89. package/frontend/dist/assets/index-4b354ce2.js +40 -0
  90. package/frontend/dist/index.html +22 -0
  91. 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