@relayplane/proxy 1.8.6 → 1.8.7
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/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/cross-provider-cascade.d.ts +137 -0
- package/dist/cross-provider-cascade.d.ts.map +1 -0
- package/dist/cross-provider-cascade.js +258 -0
- package/dist/cross-provider-cascade.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/ollama.d.ts +264 -0
- package/dist/ollama.d.ts.map +1 -0
- package/dist/ollama.js +510 -0
- package/dist/ollama.js.map +1 -0
- package/dist/standalone-proxy.d.ts +1 -1
- package/dist/standalone-proxy.d.ts.map +1 -1
- package/dist/standalone-proxy.js +308 -12
- package/dist/standalone-proxy.js.map +1 -1
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -30,6 +30,37 @@ export interface ProviderConfig {
|
|
|
30
30
|
/** Provider-level rate limit. Applies to all models for this provider unless overridden per-model. */
|
|
31
31
|
rateLimit?: ProviderRateLimitConfig;
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Cross-provider cascade configuration (GH #38).
|
|
35
|
+
*
|
|
36
|
+
* Example ~/.relayplane/config.json:
|
|
37
|
+
* ```json
|
|
38
|
+
* {
|
|
39
|
+
* "crossProviderCascade": {
|
|
40
|
+
* "enabled": true,
|
|
41
|
+
* "providers": ["anthropic", "openrouter", "google"],
|
|
42
|
+
* "triggerStatuses": [429, 529, 503]
|
|
43
|
+
* }
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export interface CrossProviderCascadeConfigSection {
|
|
48
|
+
/** Enable cross-provider fallback (default: false). */
|
|
49
|
+
enabled?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Ordered list of provider names to attempt.
|
|
52
|
+
* First entry is the primary; the rest are fallbacks in order.
|
|
53
|
+
*/
|
|
54
|
+
providers?: string[];
|
|
55
|
+
/**
|
|
56
|
+
* HTTP status codes that trigger a cascade. Defaults to [429, 529, 503].
|
|
57
|
+
*/
|
|
58
|
+
triggerStatuses?: number[];
|
|
59
|
+
/**
|
|
60
|
+
* Custom model name overrides: { fromProvider: { toProvider: { model: mappedModel } } }
|
|
61
|
+
*/
|
|
62
|
+
modelMapping?: Record<string, Record<string, Record<string, string>>>;
|
|
63
|
+
}
|
|
33
64
|
export interface RateLimitConfigSection {
|
|
34
65
|
/** Per-model RPM overrides. Keys are model names (e.g. "claude-sonnet-4-6"). */
|
|
35
66
|
models?: Record<string, RateLimitModelConfig>;
|
|
@@ -72,6 +103,12 @@ export interface ProxyConfig {
|
|
|
72
103
|
* ```
|
|
73
104
|
*/
|
|
74
105
|
providers?: Record<string, ProviderConfig>;
|
|
106
|
+
/**
|
|
107
|
+
* Cross-provider cascade fallback (GH #38).
|
|
108
|
+
* When enabled and a provider returns 429/529/503, the proxy will automatically
|
|
109
|
+
* retry with the next provider in the `providers` cascade list.
|
|
110
|
+
*/
|
|
111
|
+
crossProviderCascade?: CrossProviderCascadeConfigSection;
|
|
75
112
|
}
|
|
76
113
|
/**
|
|
77
114
|
* Check if credentials.json exists and has a valid apiKey
|
|
@@ -153,4 +190,9 @@ export declare function getRateLimitConfig(): RateLimitConfigSection;
|
|
|
153
190
|
* Returns empty object if no providers section exists in config.
|
|
154
191
|
*/
|
|
155
192
|
export declare function getProviderConfigs(): Record<string, ProviderConfig>;
|
|
193
|
+
/**
|
|
194
|
+
* Get cross-provider cascade configuration (GH #38).
|
|
195
|
+
* Returns the section as-is; callers are responsible for applying defaults.
|
|
196
|
+
*/
|
|
197
|
+
export declare function getCrossProviderCascadeConfig(): CrossProviderCascadeConfigSection;
|
|
156
198
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,sGAAsG;IACtG,SAAS,CAAC,EAAE,uBAAuB,CAAC;CACrC;AAED,MAAM,WAAW,sBAAsB;IACrC,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC9C,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAElB,8BAA8B;IAC9B,iBAAiB,EAAE,OAAO,CAAC;IAE3B,kDAAkD;IAClD,kBAAkB,EAAE,OAAO,CAAC;IAE5B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,oCAAoC;IACpC,cAAc,EAAE,MAAM,CAAC;IAEvB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IAEnB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IAEnB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,iBAAiB,CAAC;IAEzB,iCAAiC;IACjC,SAAS,CAAC,EAAE,sBAAsB,CAAC;IAEnC;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -59,6 +59,7 @@ exports.getMeshConfig = getMeshConfig;
|
|
|
59
59
|
exports.updateMeshConfig = updateMeshConfig;
|
|
60
60
|
exports.getRateLimitConfig = getRateLimitConfig;
|
|
61
61
|
exports.getProviderConfigs = getProviderConfigs;
|
|
62
|
+
exports.getCrossProviderCascadeConfig = getCrossProviderCascadeConfig;
|
|
62
63
|
const fs = __importStar(require("fs"));
|
|
63
64
|
const path = __importStar(require("path"));
|
|
64
65
|
const os = __importStar(require("os"));
|
|
@@ -331,4 +332,12 @@ function getProviderConfigs() {
|
|
|
331
332
|
const config = loadConfig();
|
|
332
333
|
return config.providers ?? {};
|
|
333
334
|
}
|
|
335
|
+
/**
|
|
336
|
+
* Get cross-provider cascade configuration (GH #38).
|
|
337
|
+
* Returns the section as-is; callers are responsible for applying defaults.
|
|
338
|
+
*/
|
|
339
|
+
function getCrossProviderCascadeConfig() {
|
|
340
|
+
const config = loadConfig();
|
|
341
|
+
return config.crossProviderCascade ?? {};
|
|
342
|
+
}
|
|
334
343
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Provider Cascade Fallback (GH #38)
|
|
3
|
+
*
|
|
4
|
+
* When a primary provider returns a rate-limit or unavailability error
|
|
5
|
+
* (429 / 529 / 503), automatically retry the request with the next
|
|
6
|
+
* configured provider, mapping the model name to the equivalent on that
|
|
7
|
+
* provider.
|
|
8
|
+
*
|
|
9
|
+
* Config example (~/.relayplane/config.json):
|
|
10
|
+
* ```json
|
|
11
|
+
* {
|
|
12
|
+
* "crossProviderCascade": {
|
|
13
|
+
* "enabled": true,
|
|
14
|
+
* "providers": ["anthropic", "openrouter", "google"],
|
|
15
|
+
* "triggerStatuses": [429, 529, 503]
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* Model mapping (built-in):
|
|
21
|
+
* anthropic → openrouter : claude-sonnet-4-6 → anthropic/claude-sonnet-4-6
|
|
22
|
+
* anthropic → openrouter : claude-opus-4-6 → anthropic/claude-opus-4-6
|
|
23
|
+
* anthropic → openrouter : claude-haiku-4-5 → anthropic/claude-haiku-4-5
|
|
24
|
+
*
|
|
25
|
+
* Custom overrides can be provided via `modelMapping` in the config.
|
|
26
|
+
*
|
|
27
|
+
* @packageDocumentation
|
|
28
|
+
*/
|
|
29
|
+
/** Statuses that trigger a cross-provider cascade attempt. */
|
|
30
|
+
export declare const DEFAULT_CASCADE_TRIGGER_STATUSES: number[];
|
|
31
|
+
/**
|
|
32
|
+
* Built-in model name mappings between providers.
|
|
33
|
+
* Structure: BUILT_IN_MODEL_MAPPING[fromProvider][toProvider][modelName] = mappedModel
|
|
34
|
+
*/
|
|
35
|
+
export declare const BUILT_IN_MODEL_MAPPING: Record<string, Record<string, Record<string, string>>>;
|
|
36
|
+
/** Configuration for the cross-provider cascade feature. */
|
|
37
|
+
export interface CrossProviderCascadeConfig {
|
|
38
|
+
/** Enable or disable the feature (default: false). */
|
|
39
|
+
enabled: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Ordered list of provider names to try in sequence.
|
|
42
|
+
* The first entry is the primary provider; subsequent entries are fallbacks.
|
|
43
|
+
* Example: ["anthropic", "openrouter", "google"]
|
|
44
|
+
*/
|
|
45
|
+
providers: string[];
|
|
46
|
+
/**
|
|
47
|
+
* HTTP status codes that trigger a cascade to the next provider.
|
|
48
|
+
* Defaults to [429, 529, 503].
|
|
49
|
+
*/
|
|
50
|
+
triggerStatuses?: number[];
|
|
51
|
+
/**
|
|
52
|
+
* Custom model mappings that override or extend the built-in rules.
|
|
53
|
+
* Structure: { fromProvider: { toProvider: { modelName: mappedModel } } }
|
|
54
|
+
*/
|
|
55
|
+
modelMapping?: Record<string, Record<string, Record<string, string>>>;
|
|
56
|
+
}
|
|
57
|
+
/** Result of a cascade attempt. */
|
|
58
|
+
export interface CascadeAttemptResult {
|
|
59
|
+
/** Whether the cascade attempt succeeded. */
|
|
60
|
+
success: boolean;
|
|
61
|
+
/** The provider that ultimately served the request. */
|
|
62
|
+
provider: string;
|
|
63
|
+
/** The model name used on the successful provider. */
|
|
64
|
+
model: string;
|
|
65
|
+
/** Number of providers tried before success (0 = primary succeeded). */
|
|
66
|
+
attempts: number;
|
|
67
|
+
/** Status code returned by each provider tried. */
|
|
68
|
+
statusHistory: Array<{
|
|
69
|
+
provider: string;
|
|
70
|
+
model: string;
|
|
71
|
+
status: number;
|
|
72
|
+
}>;
|
|
73
|
+
}
|
|
74
|
+
/** Information about a cascade hop. */
|
|
75
|
+
export interface CascadeHop {
|
|
76
|
+
provider: string;
|
|
77
|
+
model: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Manages cross-provider fallback cascade.
|
|
81
|
+
*
|
|
82
|
+
* This is a pure-logic class with no I/O; the actual HTTP calls are delegated
|
|
83
|
+
* to a caller-supplied `makeRequest` callback, making it fully unit-testable.
|
|
84
|
+
*/
|
|
85
|
+
export declare class CrossProviderCascadeManager {
|
|
86
|
+
private config;
|
|
87
|
+
/** Apply a new configuration. Call once at proxy startup. */
|
|
88
|
+
configure(config: CrossProviderCascadeConfig): void;
|
|
89
|
+
/** Get the active configuration. */
|
|
90
|
+
getConfig(): Readonly<CrossProviderCascadeConfig>;
|
|
91
|
+
/** Whether the cascade feature is enabled. */
|
|
92
|
+
get enabled(): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Check whether an HTTP status code should trigger a cascade to the next provider.
|
|
95
|
+
*/
|
|
96
|
+
shouldCascade(status: number): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Return the ordered list of fallback providers to try after `currentProvider` fails.
|
|
99
|
+
* The current provider is excluded from the result.
|
|
100
|
+
*/
|
|
101
|
+
getFallbackProviders(currentProvider: string): string[];
|
|
102
|
+
/**
|
|
103
|
+
* Map a model name from one provider to its equivalent on another provider.
|
|
104
|
+
*
|
|
105
|
+
* Resolution order:
|
|
106
|
+
* 1. Custom mapping from config
|
|
107
|
+
* 2. Built-in mapping table
|
|
108
|
+
* 3. Identity (return the model name unchanged as last resort)
|
|
109
|
+
*/
|
|
110
|
+
mapModel(model: string, fromProvider: string, toProvider: string): string;
|
|
111
|
+
/**
|
|
112
|
+
* Execute a cross-provider cascade.
|
|
113
|
+
*
|
|
114
|
+
* @param primaryProvider - Provider that just failed.
|
|
115
|
+
* @param primaryModel - Model name used on the primary provider.
|
|
116
|
+
* @param primaryStatus - HTTP status returned by the primary provider.
|
|
117
|
+
* @param makeRequest - Async callback that sends the request to a given provider/model.
|
|
118
|
+
* Should return `{ status, data }`.
|
|
119
|
+
* @param log - Logging callback for cascade events.
|
|
120
|
+
*
|
|
121
|
+
* @returns `CascadeAttemptResult` — callers can check `.success` and use `.provider`/`.model`.
|
|
122
|
+
*/
|
|
123
|
+
execute<T>(primaryProvider: string, primaryModel: string, primaryStatus: number, makeRequest: (hop: CascadeHop) => Promise<{
|
|
124
|
+
status: number;
|
|
125
|
+
data: T;
|
|
126
|
+
}>, log?: (msg: string) => void): Promise<{
|
|
127
|
+
result: CascadeAttemptResult;
|
|
128
|
+
data?: T;
|
|
129
|
+
}>;
|
|
130
|
+
}
|
|
131
|
+
/** Singleton instance (configure once at startup). */
|
|
132
|
+
export declare const crossProviderCascade: CrossProviderCascadeManager;
|
|
133
|
+
/**
|
|
134
|
+
* Helper: build a human-readable summary of cascade status history.
|
|
135
|
+
*/
|
|
136
|
+
export declare function formatCascadeHistory(history: CascadeAttemptResult['statusHistory']): string;
|
|
137
|
+
//# sourceMappingURL=cross-provider-cascade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-provider-cascade.d.ts","sourceRoot":"","sources":["../src/cross-provider-cascade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,gCAAgC,UAAkB,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAsCzF,CAAC;AAEF,4DAA4D;AAC5D,MAAM,WAAW,0BAA0B;IACzC,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACvE;AAED,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,aAAa,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAED,uCAAuC;AACvC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAiE;IAE/E,6DAA6D;IAC7D,SAAS,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI;IAInD,oCAAoC;IACpC,SAAS,IAAI,QAAQ,CAAC,0BAA0B,CAAC;IAIjD,8CAA8C;IAC9C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKtC;;;OAGG;IACH,oBAAoB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE;IAUvD;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAoBzE;;;;;;;;;;;OAWG;IACG,OAAO,CAAC,CAAC,EACb,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,EACtE,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAe,GACpC,OAAO,CAAC;QAAE,MAAM,EAAE,oBAAoB,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC;CA6GvD;AAED,sDAAsD;AACtD,eAAO,MAAM,oBAAoB,6BAAoC,CAAC;AAEtE;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,oBAAoB,CAAC,eAAe,CAAC,GAC7C,MAAM,CAIR"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cross-Provider Cascade Fallback (GH #38)
|
|
4
|
+
*
|
|
5
|
+
* When a primary provider returns a rate-limit or unavailability error
|
|
6
|
+
* (429 / 529 / 503), automatically retry the request with the next
|
|
7
|
+
* configured provider, mapping the model name to the equivalent on that
|
|
8
|
+
* provider.
|
|
9
|
+
*
|
|
10
|
+
* Config example (~/.relayplane/config.json):
|
|
11
|
+
* ```json
|
|
12
|
+
* {
|
|
13
|
+
* "crossProviderCascade": {
|
|
14
|
+
* "enabled": true,
|
|
15
|
+
* "providers": ["anthropic", "openrouter", "google"],
|
|
16
|
+
* "triggerStatuses": [429, 529, 503]
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Model mapping (built-in):
|
|
22
|
+
* anthropic → openrouter : claude-sonnet-4-6 → anthropic/claude-sonnet-4-6
|
|
23
|
+
* anthropic → openrouter : claude-opus-4-6 → anthropic/claude-opus-4-6
|
|
24
|
+
* anthropic → openrouter : claude-haiku-4-5 → anthropic/claude-haiku-4-5
|
|
25
|
+
*
|
|
26
|
+
* Custom overrides can be provided via `modelMapping` in the config.
|
|
27
|
+
*
|
|
28
|
+
* @packageDocumentation
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.crossProviderCascade = exports.CrossProviderCascadeManager = exports.BUILT_IN_MODEL_MAPPING = exports.DEFAULT_CASCADE_TRIGGER_STATUSES = void 0;
|
|
32
|
+
exports.formatCascadeHistory = formatCascadeHistory;
|
|
33
|
+
/** Statuses that trigger a cross-provider cascade attempt. */
|
|
34
|
+
exports.DEFAULT_CASCADE_TRIGGER_STATUSES = [429, 529, 503];
|
|
35
|
+
/**
|
|
36
|
+
* Built-in model name mappings between providers.
|
|
37
|
+
* Structure: BUILT_IN_MODEL_MAPPING[fromProvider][toProvider][modelName] = mappedModel
|
|
38
|
+
*/
|
|
39
|
+
exports.BUILT_IN_MODEL_MAPPING = {
|
|
40
|
+
anthropic: {
|
|
41
|
+
openrouter: {
|
|
42
|
+
'claude-opus-4-6': 'anthropic/claude-opus-4-6',
|
|
43
|
+
'claude-sonnet-4-6': 'anthropic/claude-sonnet-4-6',
|
|
44
|
+
'claude-haiku-4-5': 'anthropic/claude-haiku-4-5',
|
|
45
|
+
'claude-3-5-sonnet-latest': 'anthropic/claude-3-5-sonnet',
|
|
46
|
+
'claude-3-5-haiku-latest': 'anthropic/claude-3-5-haiku',
|
|
47
|
+
'claude-3-opus-latest': 'anthropic/claude-3-opus',
|
|
48
|
+
},
|
|
49
|
+
google: {
|
|
50
|
+
'claude-opus-4-6': 'gemini-2.0-flash', // best available Gemini analog
|
|
51
|
+
'claude-sonnet-4-6': 'gemini-2.0-flash',
|
|
52
|
+
'claude-haiku-4-5': 'gemini-2.0-flash-lite',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
openai: {
|
|
56
|
+
openrouter: {
|
|
57
|
+
'gpt-4o': 'openai/gpt-4o',
|
|
58
|
+
'gpt-4o-mini': 'openai/gpt-4o-mini',
|
|
59
|
+
'gpt-4.1': 'openai/gpt-4.1',
|
|
60
|
+
'o1': 'openai/o1',
|
|
61
|
+
'o3-mini': 'openai/o3-mini',
|
|
62
|
+
},
|
|
63
|
+
anthropic: {
|
|
64
|
+
'gpt-4o': 'claude-sonnet-4-6',
|
|
65
|
+
'gpt-4o-mini': 'claude-haiku-4-5',
|
|
66
|
+
'gpt-4.1': 'claude-sonnet-4-6',
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
openrouter: {
|
|
70
|
+
anthropic: {
|
|
71
|
+
'anthropic/claude-opus-4-6': 'claude-opus-4-6',
|
|
72
|
+
'anthropic/claude-sonnet-4-6': 'claude-sonnet-4-6',
|
|
73
|
+
'anthropic/claude-haiku-4-5': 'claude-haiku-4-5',
|
|
74
|
+
'openai/gpt-4o': 'claude-sonnet-4-6', // approximate
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Manages cross-provider fallback cascade.
|
|
80
|
+
*
|
|
81
|
+
* This is a pure-logic class with no I/O; the actual HTTP calls are delegated
|
|
82
|
+
* to a caller-supplied `makeRequest` callback, making it fully unit-testable.
|
|
83
|
+
*/
|
|
84
|
+
class CrossProviderCascadeManager {
|
|
85
|
+
config = { enabled: false, providers: [] };
|
|
86
|
+
/** Apply a new configuration. Call once at proxy startup. */
|
|
87
|
+
configure(config) {
|
|
88
|
+
this.config = { ...config };
|
|
89
|
+
}
|
|
90
|
+
/** Get the active configuration. */
|
|
91
|
+
getConfig() {
|
|
92
|
+
return this.config;
|
|
93
|
+
}
|
|
94
|
+
/** Whether the cascade feature is enabled. */
|
|
95
|
+
get enabled() {
|
|
96
|
+
return this.config.enabled && this.config.providers.length > 1;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check whether an HTTP status code should trigger a cascade to the next provider.
|
|
100
|
+
*/
|
|
101
|
+
shouldCascade(status) {
|
|
102
|
+
const triggers = this.config.triggerStatuses ?? exports.DEFAULT_CASCADE_TRIGGER_STATUSES;
|
|
103
|
+
return triggers.includes(status);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Return the ordered list of fallback providers to try after `currentProvider` fails.
|
|
107
|
+
* The current provider is excluded from the result.
|
|
108
|
+
*/
|
|
109
|
+
getFallbackProviders(currentProvider) {
|
|
110
|
+
const providers = this.config.providers;
|
|
111
|
+
const idx = providers.indexOf(currentProvider);
|
|
112
|
+
if (idx === -1) {
|
|
113
|
+
// Current provider not in list — return all as fallbacks
|
|
114
|
+
return [...providers];
|
|
115
|
+
}
|
|
116
|
+
return providers.slice(idx + 1);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Map a model name from one provider to its equivalent on another provider.
|
|
120
|
+
*
|
|
121
|
+
* Resolution order:
|
|
122
|
+
* 1. Custom mapping from config
|
|
123
|
+
* 2. Built-in mapping table
|
|
124
|
+
* 3. Identity (return the model name unchanged as last resort)
|
|
125
|
+
*/
|
|
126
|
+
mapModel(model, fromProvider, toProvider) {
|
|
127
|
+
if (fromProvider === toProvider)
|
|
128
|
+
return model;
|
|
129
|
+
// 1. Custom overrides (highest priority)
|
|
130
|
+
const custom = this.config.modelMapping?.[fromProvider]?.[toProvider]?.[model];
|
|
131
|
+
if (custom)
|
|
132
|
+
return custom;
|
|
133
|
+
// 2. Built-in table
|
|
134
|
+
const builtin = exports.BUILT_IN_MODEL_MAPPING[fromProvider]?.[toProvider]?.[model];
|
|
135
|
+
if (builtin)
|
|
136
|
+
return builtin;
|
|
137
|
+
// 3. Partial-match heuristic for OpenRouter: prefix model with "provider/"
|
|
138
|
+
if (toProvider === 'openrouter' && !model.includes('/')) {
|
|
139
|
+
return `${fromProvider}/${model}`;
|
|
140
|
+
}
|
|
141
|
+
// 4. Identity fallback
|
|
142
|
+
return model;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Execute a cross-provider cascade.
|
|
146
|
+
*
|
|
147
|
+
* @param primaryProvider - Provider that just failed.
|
|
148
|
+
* @param primaryModel - Model name used on the primary provider.
|
|
149
|
+
* @param primaryStatus - HTTP status returned by the primary provider.
|
|
150
|
+
* @param makeRequest - Async callback that sends the request to a given provider/model.
|
|
151
|
+
* Should return `{ status, data }`.
|
|
152
|
+
* @param log - Logging callback for cascade events.
|
|
153
|
+
*
|
|
154
|
+
* @returns `CascadeAttemptResult` — callers can check `.success` and use `.provider`/`.model`.
|
|
155
|
+
*/
|
|
156
|
+
async execute(primaryProvider, primaryModel, primaryStatus, makeRequest, log = () => { }) {
|
|
157
|
+
const statusHistory = [
|
|
158
|
+
{ provider: primaryProvider, model: primaryModel, status: primaryStatus },
|
|
159
|
+
];
|
|
160
|
+
if (!this.shouldCascade(primaryStatus)) {
|
|
161
|
+
return {
|
|
162
|
+
result: {
|
|
163
|
+
success: false,
|
|
164
|
+
provider: primaryProvider,
|
|
165
|
+
model: primaryModel,
|
|
166
|
+
attempts: 1,
|
|
167
|
+
statusHistory,
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const fallbacks = this.getFallbackProviders(primaryProvider);
|
|
172
|
+
if (fallbacks.length === 0) {
|
|
173
|
+
log(`[CROSS-CASCADE] No fallback providers configured after ${primaryProvider} — giving up`);
|
|
174
|
+
return {
|
|
175
|
+
result: {
|
|
176
|
+
success: false,
|
|
177
|
+
provider: primaryProvider,
|
|
178
|
+
model: primaryModel,
|
|
179
|
+
attempts: 1,
|
|
180
|
+
statusHistory,
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
log(`[CROSS-CASCADE] ${primaryProvider} returned ${primaryStatus} — ` +
|
|
185
|
+
`cascading to: ${fallbacks.join(' → ')}`);
|
|
186
|
+
let attempts = 1;
|
|
187
|
+
for (const nextProvider of fallbacks) {
|
|
188
|
+
const nextModel = this.mapModel(primaryModel, primaryProvider, nextProvider);
|
|
189
|
+
attempts++;
|
|
190
|
+
log(`[CROSS-CASCADE] Attempt ${attempts}: ${nextProvider}/${nextModel} ` +
|
|
191
|
+
`(mapped from ${primaryProvider}/${primaryModel})`);
|
|
192
|
+
try {
|
|
193
|
+
const { status, data } = await makeRequest({ provider: nextProvider, model: nextModel });
|
|
194
|
+
statusHistory.push({ provider: nextProvider, model: nextModel, status });
|
|
195
|
+
if (status >= 200 && status < 300) {
|
|
196
|
+
log(`[CROSS-CASCADE] Success on ${nextProvider}/${nextModel} ` +
|
|
197
|
+
`after ${attempts} attempt(s)`);
|
|
198
|
+
return {
|
|
199
|
+
result: {
|
|
200
|
+
success: true,
|
|
201
|
+
provider: nextProvider,
|
|
202
|
+
model: nextModel,
|
|
203
|
+
attempts,
|
|
204
|
+
statusHistory,
|
|
205
|
+
},
|
|
206
|
+
data,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// Non-success — should we keep cascading?
|
|
210
|
+
if (this.shouldCascade(status)) {
|
|
211
|
+
log(`[CROSS-CASCADE] ${nextProvider} returned ${status} — ` +
|
|
212
|
+
`trying next provider`);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
// Non-retryable error (4xx other than 429/529) — stop cascading
|
|
216
|
+
log(`[CROSS-CASCADE] ${nextProvider} returned non-retryable ${status} — ` +
|
|
217
|
+
`aborting cascade`);
|
|
218
|
+
return {
|
|
219
|
+
result: {
|
|
220
|
+
success: false,
|
|
221
|
+
provider: nextProvider,
|
|
222
|
+
model: nextModel,
|
|
223
|
+
attempts,
|
|
224
|
+
statusHistory,
|
|
225
|
+
},
|
|
226
|
+
data,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
231
|
+
log(`[CROSS-CASCADE] ${nextProvider} threw: ${errMsg} — trying next provider`);
|
|
232
|
+
statusHistory.push({ provider: nextProvider, model: nextModel, status: 0 });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
log(`[CROSS-CASCADE] All fallback providers exhausted. Giving up.`);
|
|
236
|
+
return {
|
|
237
|
+
result: {
|
|
238
|
+
success: false,
|
|
239
|
+
provider: primaryProvider,
|
|
240
|
+
model: primaryModel,
|
|
241
|
+
attempts,
|
|
242
|
+
statusHistory,
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
exports.CrossProviderCascadeManager = CrossProviderCascadeManager;
|
|
248
|
+
/** Singleton instance (configure once at startup). */
|
|
249
|
+
exports.crossProviderCascade = new CrossProviderCascadeManager();
|
|
250
|
+
/**
|
|
251
|
+
* Helper: build a human-readable summary of cascade status history.
|
|
252
|
+
*/
|
|
253
|
+
function formatCascadeHistory(history) {
|
|
254
|
+
return history
|
|
255
|
+
.map((h) => `${h.provider}/${h.model}→${h.status}`)
|
|
256
|
+
.join(', ');
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=cross-provider-cascade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-provider-cascade.js","sourceRoot":"","sources":["../src/cross-provider-cascade.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ export type { RelayPlaneConfig } from './relay-config.js';
|
|
|
36
36
|
export { defaultLogger } from './logger.js';
|
|
37
37
|
export type { Logger } from './logger.js';
|
|
38
38
|
export { proxyStatsCollector } from './standalone-proxy.js';
|
|
39
|
+
export { checkOllamaHealth, checkOllamaHealthCached, clearOllamaHealthCache, shouldRouteToOllama, resolveOllamaModel, forwardToOllama, forwardToOllamaStream, convertMessagesToOllama, buildOllamaRequest, convertOllamaResponse, convertOllamaStreamChunk, mapCloudModelToOllama, OLLAMA_DEFAULTS, CLOUD_TO_OLLAMA_MODEL_MAP, } from './ollama.js';
|
|
40
|
+
export type { OllamaProviderConfig, OllamaHealthResult, } from './ollama.js';
|
|
39
41
|
export type { Provider, TaskType } from '@relayplane/core';
|
|
40
42
|
export { ProxyServer, createProxyServer, createSandboxedProxyServer } from './server.js';
|
|
41
43
|
export type { ProxyServerConfig } from './server.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,EACL,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzF,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,EACL,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzF,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
* @packageDocumentation
|
|
20
20
|
*/
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.
|
|
22
|
+
exports.mapCloudModelToOllama = exports.convertOllamaStreamChunk = exports.convertOllamaResponse = exports.buildOllamaRequest = exports.convertMessagesToOllama = exports.forwardToOllamaStream = exports.forwardToOllama = exports.resolveOllamaModel = exports.shouldRouteToOllama = exports.clearOllamaHealthCache = exports.checkOllamaHealthCached = exports.checkOllamaHealth = exports.proxyStatsCollector = exports.defaultLogger = exports.resolveConfig = exports.StatusReporter = exports.StatsCollector = exports.probeHealth = exports.handleHealthRequest = exports.ProcessManager = exports.RelayPlaneMiddleware = exports.CircuitBreaker = exports.printTelemetryDisclosure = exports.getTelemetryPath = exports.clearTelemetry = exports.getTelemetryStats = exports.getLocalTelemetry = exports.clearAuditBuffer = exports.getAuditBuffer = exports.isOfflineMode = exports.setOfflineMode = exports.isAuditMode = exports.setAuditMode = exports.estimateCost = exports.inferTaskType = exports.recordTelemetry = exports.getConfigPath = exports.getConfigDir = exports.getApiKey = exports.setApiKey = exports.getDeviceId = exports.disableTelemetry = exports.enableTelemetry = exports.isTelemetryEnabled = exports.markFirstRunComplete = exports.isFirstRun = exports.updateConfig = exports.saveConfig = exports.loadConfig = exports.startProxy = void 0;
|
|
23
|
+
exports.createSandboxedProxyServer = exports.createProxyServer = exports.ProxyServer = exports.CLOUD_TO_OLLAMA_MODEL_MAP = exports.OLLAMA_DEFAULTS = void 0;
|
|
23
24
|
// Standalone proxy (requires only @relayplane/core)
|
|
24
25
|
var standalone_proxy_js_1 = require("./standalone-proxy.js");
|
|
25
26
|
Object.defineProperty(exports, "startProxy", { enumerable: true, get: function () { return standalone_proxy_js_1.startProxy; } });
|
|
@@ -75,6 +76,22 @@ Object.defineProperty(exports, "defaultLogger", { enumerable: true, get: functio
|
|
|
75
76
|
// Proxy stats collector (from standalone proxy)
|
|
76
77
|
var standalone_proxy_js_2 = require("./standalone-proxy.js");
|
|
77
78
|
Object.defineProperty(exports, "proxyStatsCollector", { enumerable: true, get: function () { return standalone_proxy_js_2.proxyStatsCollector; } });
|
|
79
|
+
// Ollama local model provider
|
|
80
|
+
var ollama_js_1 = require("./ollama.js");
|
|
81
|
+
Object.defineProperty(exports, "checkOllamaHealth", { enumerable: true, get: function () { return ollama_js_1.checkOllamaHealth; } });
|
|
82
|
+
Object.defineProperty(exports, "checkOllamaHealthCached", { enumerable: true, get: function () { return ollama_js_1.checkOllamaHealthCached; } });
|
|
83
|
+
Object.defineProperty(exports, "clearOllamaHealthCache", { enumerable: true, get: function () { return ollama_js_1.clearOllamaHealthCache; } });
|
|
84
|
+
Object.defineProperty(exports, "shouldRouteToOllama", { enumerable: true, get: function () { return ollama_js_1.shouldRouteToOllama; } });
|
|
85
|
+
Object.defineProperty(exports, "resolveOllamaModel", { enumerable: true, get: function () { return ollama_js_1.resolveOllamaModel; } });
|
|
86
|
+
Object.defineProperty(exports, "forwardToOllama", { enumerable: true, get: function () { return ollama_js_1.forwardToOllama; } });
|
|
87
|
+
Object.defineProperty(exports, "forwardToOllamaStream", { enumerable: true, get: function () { return ollama_js_1.forwardToOllamaStream; } });
|
|
88
|
+
Object.defineProperty(exports, "convertMessagesToOllama", { enumerable: true, get: function () { return ollama_js_1.convertMessagesToOllama; } });
|
|
89
|
+
Object.defineProperty(exports, "buildOllamaRequest", { enumerable: true, get: function () { return ollama_js_1.buildOllamaRequest; } });
|
|
90
|
+
Object.defineProperty(exports, "convertOllamaResponse", { enumerable: true, get: function () { return ollama_js_1.convertOllamaResponse; } });
|
|
91
|
+
Object.defineProperty(exports, "convertOllamaStreamChunk", { enumerable: true, get: function () { return ollama_js_1.convertOllamaStreamChunk; } });
|
|
92
|
+
Object.defineProperty(exports, "mapCloudModelToOllama", { enumerable: true, get: function () { return ollama_js_1.mapCloudModelToOllama; } });
|
|
93
|
+
Object.defineProperty(exports, "OLLAMA_DEFAULTS", { enumerable: true, get: function () { return ollama_js_1.OLLAMA_DEFAULTS; } });
|
|
94
|
+
Object.defineProperty(exports, "CLOUD_TO_OLLAMA_MODEL_MAP", { enumerable: true, get: function () { return ollama_js_1.CLOUD_TO_OLLAMA_MODEL_MAP; } });
|
|
78
95
|
// Advanced proxy server (requires @relayplane/ledger, @relayplane/auth-gate, etc.)
|
|
79
96
|
var server_js_1 = require("./server.js");
|
|
80
97
|
Object.defineProperty(exports, "ProxyServer", { enumerable: true, get: function () { return server_js_1.ProxyServer; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;;AAEH,oDAAoD;AACpD,6DAAmD;AAA1C,iHAAA,UAAU,OAAA;AAGnB,gBAAgB;AAChB,yCAcqB;AAbnB,uGAAA,UAAU,OAAA;AACV,uGAAA,UAAU,OAAA;AACV,yGAAA,YAAY,OAAA;AACZ,uGAAA,UAAU,OAAA;AACV,iHAAA,oBAAoB,OAAA;AACpB,+GAAA,kBAAkB,OAAA;AAClB,4GAAA,eAAe,OAAA;AACf,6GAAA,gBAAgB,OAAA;AAChB,wGAAA,WAAW,OAAA;AACX,sGAAA,SAAS,OAAA;AACT,sGAAA,SAAS,OAAA;AACT,yGAAA,YAAY,OAAA;AACZ,0GAAA,aAAa,OAAA;AAIf,YAAY;AACZ,+CAewB;AAdtB,+GAAA,eAAe,OAAA;AACf,6GAAA,aAAa,OAAA;AACb,4GAAA,YAAY,OAAA;AACZ,4GAAA,YAAY,OAAA;AACZ,2GAAA,WAAW,OAAA;AACX,8GAAA,cAAc,OAAA;AACd,6GAAA,aAAa,OAAA;AACb,8GAAA,cAAc,OAAA;AACd,gHAAA,gBAAgB,OAAA;AAChB,iHAAA,iBAAiB,OAAA;AACjB,iHAAA,iBAAiB,OAAA;AACjB,8GAAA,cAAc,OAAA;AACd,gHAAA,gBAAgB,OAAA;AAChB,wHAAA,wBAAwB,OAAA;AAI1B,iCAAiC;AACjC,2DAAoE;AAA3D,oHAAA,cAAc,OAAA;AACvB,iDAAuD;AAA9C,qHAAA,oBAAoB,OAAA;AAE7B,2DAAsD;AAA7C,oHAAA,cAAc,OAAA;AACvB,yCAA+D;AAAtD,gHAAA,mBAAmB,OAAA;AAAE,wGAAA,WAAW,OAAA;AACzC,uCAA4C;AAAnC,0GAAA,cAAc,OAAA;AACvB,yCAA6C;AAApC,2GAAA,cAAc,OAAA;AAEvB,qDAAkD;AAAzC,gHAAA,aAAa,OAAA;AAEtB,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAGtB,gDAAgD;AAChD,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAE5B,8BAA8B;AAC9B,yCAeqB;AAdnB,8GAAA,iBAAiB,OAAA;AACjB,oHAAA,uBAAuB,OAAA;AACvB,mHAAA,sBAAsB,OAAA;AACtB,gHAAA,mBAAmB,OAAA;AACnB,+GAAA,kBAAkB,OAAA;AAClB,4GAAA,eAAe,OAAA;AACf,kHAAA,qBAAqB,OAAA;AACrB,oHAAA,uBAAuB,OAAA;AACvB,+GAAA,kBAAkB,OAAA;AAClB,kHAAA,qBAAqB,OAAA;AACrB,qHAAA,wBAAwB,OAAA;AACxB,kHAAA,qBAAqB,OAAA;AACrB,4GAAA,eAAe,OAAA;AACf,sHAAA,yBAAyB,OAAA;AAU3B,mFAAmF;AACnF,yCAAyF;AAAhF,wGAAA,WAAW,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,uHAAA,0BAA0B,OAAA"}
|