@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 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
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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';
@@ -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.createSandboxedProxyServer = exports.createProxyServer = exports.ProxyServer = 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;
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;;;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;AAK5B,mFAAmF;AACnF,yCAAyF;AAAhF,wGAAA,WAAW,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,uHAAA,0BAA0B,OAAA"}
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"}