@relayplane/proxy 1.8.10 → 1.8.11

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.
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Adaptive Provider Recovery — Phase 1: Local Recovery
3
+ *
4
+ * Detects provider errors, applies recovery strategies with exponential backoff,
5
+ * extracts recovery patterns from successful retries, and applies them preemptively.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { type Logger } from './logger.js';
10
+ /** Categories of recovery patterns the system can detect and apply */
11
+ export type RecoveryPatternType = 'auth-header' | 'model-rename' | 'timeout-tune' | 'provider-fallback';
12
+ /** Context captured when a provider request fails */
13
+ export interface FailureContext {
14
+ provider: string;
15
+ model: string;
16
+ authMethod: string;
17
+ errorCode: number;
18
+ errorMessage: string;
19
+ errorType: string;
20
+ tokenPrefix?: string;
21
+ timestamp: number;
22
+ requestHeaders: Record<string, string>;
23
+ estimatedTokens?: number;
24
+ timeoutMs?: number;
25
+ }
26
+ /** A discovered recovery pattern */
27
+ export interface RecoveryPattern {
28
+ id: string;
29
+ type: RecoveryPatternType;
30
+ provider: string;
31
+ trigger: {
32
+ errorCode: number;
33
+ errorType?: string;
34
+ tokenPrefix?: string;
35
+ model?: string;
36
+ minTokens?: number;
37
+ };
38
+ fix: {
39
+ authHeader?: string;
40
+ model?: string;
41
+ timeoutMs?: number;
42
+ provider?: string;
43
+ };
44
+ confidence: number;
45
+ successCount: number;
46
+ failureCount: number;
47
+ firstSeen: string;
48
+ lastSeen: string;
49
+ lastApplied?: string;
50
+ }
51
+ /** Result of a recovery attempt */
52
+ export interface RecoveryResult {
53
+ recovered: boolean;
54
+ strategy: string;
55
+ pattern?: RecoveryPattern;
56
+ response?: ProviderResponse;
57
+ attempts: number;
58
+ totalLatencyMs: number;
59
+ }
60
+ /** Provider response shape (simplified) */
61
+ export interface ProviderResponse {
62
+ success: boolean;
63
+ status?: number;
64
+ data?: unknown;
65
+ usage?: {
66
+ prompt_tokens: number;
67
+ completion_tokens: number;
68
+ total_tokens: number;
69
+ };
70
+ ttft_ms?: number;
71
+ error?: {
72
+ code: string;
73
+ message: string;
74
+ status: number;
75
+ retryable: boolean;
76
+ raw?: unknown;
77
+ };
78
+ }
79
+ /** A recovery event logged for observability */
80
+ export interface RecoveryEvent {
81
+ id: string;
82
+ timestamp: string;
83
+ provider: string;
84
+ model: string;
85
+ originalError: {
86
+ code: number;
87
+ type: string;
88
+ message: string;
89
+ };
90
+ strategy: string;
91
+ recovered: boolean;
92
+ attempts: number;
93
+ latencyMs: number;
94
+ patternId?: string;
95
+ delta?: Record<string, unknown>;
96
+ }
97
+ /** Function that forwards a request to a provider */
98
+ export type ForwardFn = (provider: string, request: Record<string, unknown>, config: {
99
+ apiKey: string;
100
+ baseUrl?: string;
101
+ }, runId: string, overrides?: RequestOverrides) => Promise<ProviderResponse>;
102
+ /** Overrides that recovery strategies can apply to a request */
103
+ export interface RequestOverrides {
104
+ authHeader?: string;
105
+ model?: string;
106
+ timeoutMs?: number;
107
+ }
108
+ export interface RecoveryConfig {
109
+ /** Enable/disable recovery (default: true) */
110
+ enabled?: boolean;
111
+ /** Maximum retry attempts per failure (default: 2) */
112
+ maxRetries?: number;
113
+ /** Base delay for exponential backoff in ms (default: 500) */
114
+ baseDelayMs?: number;
115
+ /** Maximum backoff delay in ms (default: 5000) */
116
+ maxDelayMs?: number;
117
+ /** Minimum confidence for preemptive pattern application (default: 0.8) */
118
+ minPreemptiveConfidence?: number;
119
+ /** Maximum stored patterns (default: 100) */
120
+ maxPatterns?: number;
121
+ /** Pattern expiry in days (default: 30) */
122
+ patternExpiryDays?: number;
123
+ /** Logger */
124
+ logger?: Logger;
125
+ }
126
+ /**
127
+ * In-memory store for recovery patterns.
128
+ * Phase 1 uses in-memory; Phase 2 could use SQLite.
129
+ */
130
+ export declare class RecoveryPatternStore {
131
+ private patterns;
132
+ private readonly maxPatterns;
133
+ private readonly expiryDays;
134
+ constructor(maxPatterns?: number, expiryDays?: number);
135
+ /** Get all patterns */
136
+ getAll(): RecoveryPattern[];
137
+ /** Find patterns matching a failure context */
138
+ findMatching(ctx: FailureContext): RecoveryPattern[];
139
+ /** Find preemptive patterns for a request (before any failure) */
140
+ findPreemptive(provider: string, model: string, tokenPrefix?: string): RecoveryPattern[];
141
+ /** Store or update a pattern */
142
+ upsert(pattern: RecoveryPattern): void;
143
+ /** Record a successful application of a pattern */
144
+ recordSuccess(patternId: string): void;
145
+ /** Record a failed application of a pattern */
146
+ recordFailure(patternId: string): void;
147
+ /** Get store stats */
148
+ stats(): {
149
+ total: number;
150
+ highConfidence: number;
151
+ avgConfidence: number;
152
+ };
153
+ private pruneExpired;
154
+ }
155
+ /**
156
+ * Observes provider failures and determines if they are recovery-eligible.
157
+ */
158
+ export declare class FailureObserver {
159
+ private readonly logger;
160
+ private readonly events;
161
+ private readonly maxEvents;
162
+ constructor(logger?: Logger);
163
+ /** Determine if a failure is eligible for recovery attempt */
164
+ isRecoverable(response: ProviderResponse): boolean;
165
+ /** Build failure context from a failed request */
166
+ buildContext(provider: string, model: string, request: Record<string, unknown>, config: {
167
+ apiKey: string;
168
+ baseUrl?: string;
169
+ }, response: ProviderResponse, overrides?: RequestOverrides): FailureContext;
170
+ /** Log a recovery event */
171
+ logEvent(event: RecoveryEvent): void;
172
+ /** Get recent recovery events */
173
+ getRecentEvents(limit?: number): RecoveryEvent[];
174
+ /** Get recovery stats */
175
+ getStats(): {
176
+ total: number;
177
+ recovered: number;
178
+ failed: number;
179
+ recoveryRate: number;
180
+ };
181
+ }
182
+ /**
183
+ * Applies stored recovery patterns preemptively before forwarding requests.
184
+ */
185
+ export declare class PatternApplicator {
186
+ private readonly store;
187
+ private readonly minConfidence;
188
+ private readonly logger;
189
+ private preemptiveHits;
190
+ private preemptiveMisses;
191
+ constructor(store: RecoveryPatternStore, minConfidence?: number, logger?: Logger);
192
+ /**
193
+ * Check for preemptive patterns and return overrides to apply.
194
+ * Called before forwarding a request.
195
+ */
196
+ getPreemptiveOverrides(provider: string, model: string, apiKey?: string): RequestOverrides | null;
197
+ /** Record that a preemptive application worked */
198
+ recordPreemptiveSuccess(provider: string, model: string): void;
199
+ /** Record that a preemptive application failed */
200
+ recordPreemptiveFailure(provider: string, model: string): void;
201
+ /** Get preemptive application stats */
202
+ getStats(): {
203
+ hits: number;
204
+ misses: number;
205
+ hitRate: number;
206
+ };
207
+ }
208
+ /**
209
+ * Main recovery engine that orchestrates failure observation,
210
+ * recovery strategies, pattern extraction, and preemptive application.
211
+ */
212
+ export declare class RecoveryEngine {
213
+ readonly observer: FailureObserver;
214
+ readonly store: RecoveryPatternStore;
215
+ readonly applicator: PatternApplicator;
216
+ private readonly config;
217
+ private readonly logger;
218
+ constructor(config?: RecoveryConfig);
219
+ /** Check if recovery is enabled */
220
+ get enabled(): boolean;
221
+ /**
222
+ * Get preemptive overrides to apply before forwarding.
223
+ * Called by the request pipeline before forwardToProvider.
224
+ */
225
+ getPreemptiveOverrides(provider: string, model: string, apiKey?: string): RequestOverrides | null;
226
+ /**
227
+ * Attempt to recover from a provider failure.
228
+ * Tries applicable strategies with exponential backoff.
229
+ *
230
+ * @returns RecoveryResult with the outcome
231
+ */
232
+ attemptRecovery(provider: string, model: string, request: Record<string, unknown>, providerConfig: {
233
+ apiKey: string;
234
+ baseUrl?: string;
235
+ }, runId: string, failedResponse: ProviderResponse, forwardFn: ForwardFn): Promise<RecoveryResult>;
236
+ /**
237
+ * Get recovery dashboard data
238
+ */
239
+ getDashboardData(): {
240
+ enabled: boolean;
241
+ patterns: RecoveryPattern[];
242
+ patternStats: {
243
+ total: number;
244
+ highConfidence: number;
245
+ avgConfidence: number;
246
+ };
247
+ recoveryStats: {
248
+ total: number;
249
+ recovered: number;
250
+ failed: number;
251
+ recoveryRate: number;
252
+ };
253
+ preemptiveStats: {
254
+ hits: number;
255
+ misses: number;
256
+ hitRate: number;
257
+ };
258
+ recentEvents: RecoveryEvent[];
259
+ };
260
+ private logRecoveryEvent;
261
+ }
262
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,aAAa,CAAC;AAIzD,sEAAsE;AACtE,MAAM,MAAM,mBAAmB,GAC3B,aAAa,GACb,cAAc,GACd,cAAc,GACd,mBAAmB,CAAC;AAExB,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,GAAG,EAAE;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,OAAO,CAAC;QACnB,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;CACH;AAED,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,qDAAqD;AACrD,MAAM,MAAM,SAAS,GAAG,CACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5C,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,gBAAgB,KACzB,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,WAAW,SAAM,EAAE,UAAU,SAAK;IAK9C,uBAAuB;IACvB,MAAM,IAAI,eAAe,EAAE;IAK3B,+CAA+C;IAC/C,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,eAAe,EAAE;IAapD,kEAAkE;IAClE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE;IAWxF,gCAAgC;IAChC,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAyBtC,mDAAmD;IACnD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAStC,+CAA+C;IAC/C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQtC,sBAAsB;IACtB,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IAWzE,OAAO,CAAC,YAAY;CAQrB;AAID;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAO;gBAErB,MAAM,CAAC,EAAE,MAAM;IAI3B,8DAA8D;IAC9D,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO;IAclD,kDAAkD;IAClD,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAC5C,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,CAAC,EAAE,gBAAgB,GAC3B,cAAc;IAmCjB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAkBpC,iCAAiC;IACjC,eAAe,CAAC,KAAK,SAAK,GAAG,aAAa,EAAE;IAI5C,yBAAyB;IACzB,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;CAUvF;AAwID;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAK;gBAEjB,KAAK,EAAE,oBAAoB,EAAE,aAAa,SAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAM7E;;;OAGG;IACH,sBAAsB,CACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,gBAAgB,GAAG,IAAI;IAmB1B,kDAAkD;IAClD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9D,kDAAkD;IAClD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ9D,uCAAuC;IACvC,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAQ9D;AAID;;;GAGG;AACH,qBAAa,cAAc;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IAEvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,CAAC,EAAE,cAAc;IAsBnC,mCAAmC;IACnC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACH,sBAAsB,CACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,gBAAgB,GAAG,IAAI;IAK1B;;;;;OAKG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,cAAc,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EACpD,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,gBAAgB,EAChC,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,cAAc,CAAC;IAoG1B;;OAEG;IACH,gBAAgB,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,eAAe,EAAE,CAAC;QAC5B,YAAY,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAC;YAAC,aAAa,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/E,aAAa,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1F,eAAe,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QACnE,YAAY,EAAE,aAAa,EAAE,CAAC;KAC/B;IAWD,OAAO,CAAC,gBAAgB;CA4BzB"}