@relayplane/proxy 1.8.5 → 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 +92 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +26 -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/rate-limiter.d.ts +87 -9
- package/dist/rate-limiter.d.ts.map +1 -1
- package/dist/rate-limiter.js +262 -28
- package/dist/rate-limiter.js.map +1 -1
- package/dist/standalone-proxy.d.ts +1 -1
- package/dist/standalone-proxy.d.ts.map +1 -1
- package/dist/standalone-proxy.js +334 -28
- package/dist/standalone-proxy.js.map +1 -1
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -14,6 +14,61 @@ export interface MeshConfigSection {
|
|
|
14
14
|
sync_interval_ms: number;
|
|
15
15
|
contribute: boolean;
|
|
16
16
|
}
|
|
17
|
+
export interface RateLimitModelConfig {
|
|
18
|
+
/** Requests per minute for this model */
|
|
19
|
+
rpm: number;
|
|
20
|
+
}
|
|
21
|
+
export interface ProviderRateLimitConfig {
|
|
22
|
+
/**
|
|
23
|
+
* Requests per minute for ALL models from this provider.
|
|
24
|
+
* Applies when no model-specific override exists.
|
|
25
|
+
* Example: providers.anthropic.rateLimit.rpm = 100
|
|
26
|
+
*/
|
|
27
|
+
rpm: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ProviderConfig {
|
|
30
|
+
/** Provider-level rate limit. Applies to all models for this provider unless overridden per-model. */
|
|
31
|
+
rateLimit?: ProviderRateLimitConfig;
|
|
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
|
+
}
|
|
64
|
+
export interface RateLimitConfigSection {
|
|
65
|
+
/** Per-model RPM overrides. Keys are model names (e.g. "claude-sonnet-4-6"). */
|
|
66
|
+
models?: Record<string, RateLimitModelConfig>;
|
|
67
|
+
/** Max requests to queue when limit is hit (default: 50) */
|
|
68
|
+
maxQueueDepth?: number;
|
|
69
|
+
/** Max ms a queued request waits before getting a 429 (default: 30000) */
|
|
70
|
+
queueTimeoutMs?: number;
|
|
71
|
+
}
|
|
17
72
|
export interface ProxyConfig {
|
|
18
73
|
/** Anonymous device ID (generated on first run) */
|
|
19
74
|
device_id: string;
|
|
@@ -31,6 +86,29 @@ export interface ProxyConfig {
|
|
|
31
86
|
updated_at: string;
|
|
32
87
|
/** Mesh (Osmosis) learning layer config */
|
|
33
88
|
mesh?: MeshConfigSection;
|
|
89
|
+
/** Rate limiter configuration */
|
|
90
|
+
rateLimit?: RateLimitConfigSection;
|
|
91
|
+
/**
|
|
92
|
+
* Per-provider configuration.
|
|
93
|
+
* Supported providers: anthropic, openai, google, xai, groq, perplexity.
|
|
94
|
+
*
|
|
95
|
+
* Example ~/.relayplane/config.json:
|
|
96
|
+
* ```json
|
|
97
|
+
* {
|
|
98
|
+
* "providers": {
|
|
99
|
+
* "anthropic": { "rateLimit": { "rpm": 100 } },
|
|
100
|
+
* "openai": { "rateLimit": { "rpm": 60 } }
|
|
101
|
+
* }
|
|
102
|
+
* }
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
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;
|
|
34
112
|
}
|
|
35
113
|
/**
|
|
36
114
|
* Check if credentials.json exists and has a valid apiKey
|
|
@@ -103,4 +181,18 @@ export declare function getMeshConfig(): MeshConfigSection;
|
|
|
103
181
|
* Update mesh config section
|
|
104
182
|
*/
|
|
105
183
|
export declare function updateMeshConfig(updates: Partial<MeshConfigSection>): void;
|
|
184
|
+
/**
|
|
185
|
+
* Get rate limit config section (with defaults)
|
|
186
|
+
*/
|
|
187
|
+
export declare function getRateLimitConfig(): RateLimitConfigSection;
|
|
188
|
+
/**
|
|
189
|
+
* Get per-provider configurations (with defaults).
|
|
190
|
+
* Returns empty object if no providers section exists in config.
|
|
191
|
+
*/
|
|
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;
|
|
106
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,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;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -57,6 +57,9 @@ exports.getConfigPath = getConfigPath;
|
|
|
57
57
|
exports.getCredentialsPath = getCredentialsPath;
|
|
58
58
|
exports.getMeshConfig = getMeshConfig;
|
|
59
59
|
exports.updateMeshConfig = updateMeshConfig;
|
|
60
|
+
exports.getRateLimitConfig = getRateLimitConfig;
|
|
61
|
+
exports.getProviderConfigs = getProviderConfigs;
|
|
62
|
+
exports.getCrossProviderCascadeConfig = getCrossProviderCascadeConfig;
|
|
60
63
|
const fs = __importStar(require("fs"));
|
|
61
64
|
const path = __importStar(require("path"));
|
|
62
65
|
const os = __importStar(require("os"));
|
|
@@ -314,4 +317,27 @@ function updateMeshConfig(updates) {
|
|
|
314
317
|
config.mesh = { ...getMeshConfig(), ...updates };
|
|
315
318
|
saveConfig(config);
|
|
316
319
|
}
|
|
320
|
+
/**
|
|
321
|
+
* Get rate limit config section (with defaults)
|
|
322
|
+
*/
|
|
323
|
+
function getRateLimitConfig() {
|
|
324
|
+
const config = loadConfig();
|
|
325
|
+
return config.rateLimit ?? {};
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get per-provider configurations (with defaults).
|
|
329
|
+
* Returns empty object if no providers section exists in config.
|
|
330
|
+
*/
|
|
331
|
+
function getProviderConfigs() {
|
|
332
|
+
const config = loadConfig();
|
|
333
|
+
return config.providers ?? {};
|
|
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
|
+
}
|
|
317
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":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AA4SH,oDAMC;AAhTD,8DAA8D;AACjD,QAAA,gCAAgC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEhE;;;GAGG;AACU,QAAA,sBAAsB,GAA2D;IAC5F,SAAS,EAAE;QACT,UAAU,EAAE;YACV,iBAAiB,EAAY,2BAA2B;YACxD,mBAAmB,EAAU,6BAA6B;YAC1D,kBAAkB,EAAW,4BAA4B;YACzD,0BAA0B,EAAG,6BAA6B;YAC1D,yBAAyB,EAAI,4BAA4B;YACzD,sBAAsB,EAAO,yBAAyB;SACvD;QACD,MAAM,EAAE;YACN,iBAAiB,EAAK,kBAAkB,EAAO,+BAA+B;YAC9E,mBAAmB,EAAG,kBAAkB;YACxC,kBAAkB,EAAI,uBAAuB;SAC9C;KACF;IACD,MAAM,EAAE;QACN,UAAU,EAAE;YACV,QAAQ,EAAO,eAAe;YAC9B,aAAa,EAAE,oBAAoB;YACnC,SAAS,EAAM,gBAAgB;YAC/B,IAAI,EAAW,WAAW;YAC1B,SAAS,EAAM,gBAAgB;SAChC;QACD,SAAS,EAAE;YACT,QAAQ,EAAO,mBAAmB;YAClC,aAAa,EAAE,kBAAkB;YACjC,SAAS,EAAM,mBAAmB;SACnC;KACF;IACD,UAAU,EAAE;QACV,SAAS,EAAE;YACT,2BAA2B,EAAK,iBAAiB;YACjD,6BAA6B,EAAG,mBAAmB;YACnD,4BAA4B,EAAI,kBAAkB;YAClD,eAAe,EAAiB,mBAAmB,EAAG,cAAc;SACrE;KACF;CACF,CAAC;AA4CF;;;;;GAKG;AACH,MAAa,2BAA2B;IAC9B,MAAM,GAA+B,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAE/E,6DAA6D;IAC7D,SAAS,CAAC,MAAkC;QAC1C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,oCAAoC;IACpC,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,8CAA8C;IAC9C,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,MAAc;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,wCAAgC,CAAC;QACjF,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,oBAAoB,CAAC,eAAuB;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACxC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,yDAAyD;YACzD,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAa,EAAE,YAAoB,EAAE,UAAkB;QAC9D,IAAI,YAAY,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAE9C,yCAAyC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/E,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,oBAAoB;QACpB,MAAM,OAAO,GAAG,8BAAsB,CAAC,YAAY,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5E,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAE5B,2EAA2E;QAC3E,IAAI,UAAU,KAAK,YAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxD,OAAO,GAAG,YAAY,IAAI,KAAK,EAAE,CAAC;QACpC,CAAC;QAED,uBAAuB;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,OAAO,CACX,eAAuB,EACvB,YAAoB,EACpB,aAAqB,EACrB,WAAsE,EACtE,MAA6B,GAAG,EAAE,GAAE,CAAC;QAErC,MAAM,aAAa,GAA0C;YAC3D,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE;SAC1E,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO;gBACL,MAAM,EAAE;oBACN,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,eAAe;oBACzB,KAAK,EAAE,YAAY;oBACnB,QAAQ,EAAE,CAAC;oBACX,aAAa;iBACd;aACF,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;QAC7D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,0DAA0D,eAAe,cAAc,CAAC,CAAC;YAC7F,OAAO;gBACL,MAAM,EAAE;oBACN,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,eAAe;oBACzB,KAAK,EAAE,YAAY;oBACnB,QAAQ,EAAE,CAAC;oBACX,aAAa;iBACd;aACF,CAAC;QACJ,CAAC;QAED,GAAG,CACD,mBAAmB,eAAe,aAAa,aAAa,KAAK;YACjE,iBAAiB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACzC,CAAC;QAEF,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;YAC7E,QAAQ,EAAE,CAAC;YAEX,GAAG,CACD,2BAA2B,QAAQ,KAAK,YAAY,IAAI,SAAS,GAAG;gBACpE,gBAAgB,eAAe,IAAI,YAAY,GAAG,CACnD,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBACzF,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBAEzE,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;oBAClC,GAAG,CACD,8BAA8B,YAAY,IAAI,SAAS,GAAG;wBAC1D,SAAS,QAAQ,aAAa,CAC/B,CAAC;oBACF,OAAO;wBACL,MAAM,EAAE;4BACN,OAAO,EAAE,IAAI;4BACb,QAAQ,EAAE,YAAY;4BACtB,KAAK,EAAE,SAAS;4BAChB,QAAQ;4BACR,aAAa;yBACd;wBACD,IAAI;qBACL,CAAC;gBACJ,CAAC;gBAED,0CAA0C;gBAC1C,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/B,GAAG,CACD,mBAAmB,YAAY,aAAa,MAAM,KAAK;wBACvD,sBAAsB,CACvB,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,gEAAgE;gBAChE,GAAG,CACD,mBAAmB,YAAY,2BAA2B,MAAM,KAAK;oBACrE,kBAAkB,CACnB,CAAC;gBACF,OAAO;oBACL,MAAM,EAAE;wBACN,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,YAAY;wBACtB,KAAK,EAAE,SAAS;wBAChB,QAAQ;wBACR,aAAa;qBACd;oBACD,IAAI;iBACL,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChE,GAAG,CAAC,mBAAmB,YAAY,WAAW,MAAM,yBAAyB,CAAC,CAAC;gBAC/E,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,GAAG,CAAC,8DAA8D,CAAC,CAAC;QACpE,OAAO;YACL,MAAM,EAAE;gBACN,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,eAAe;gBACzB,KAAK,EAAE,YAAY;gBACnB,QAAQ;gBACR,aAAa;aACd;SACF,CAAC;IACJ,CAAC;CACF;AAnMD,kEAmMC;AAED,sDAAsD;AACzC,QAAA,oBAAoB,GAAG,IAAI,2BAA2B,EAAE,CAAC;AAEtE;;GAEG;AACH,SAAgB,oBAAoB,CAClC,OAA8C;IAE9C,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;SAClD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
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"}
|