@azumag/opencode-rate-limit-fallback 1.16.0 → 1.21.0
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/README.md +132 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +60 -579
- package/dist/logger.d.ts +0 -1
- package/dist/logger.js +0 -1
- package/package.json +5 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js.map +0 -1
package/README.md
CHANGED
|
@@ -15,6 +15,7 @@ OpenCode plugin that automatically switches to fallback models when rate limited
|
|
|
15
15
|
- Toast notifications for user feedback
|
|
16
16
|
- Subagent session support with automatic fallback propagation to parent sessions
|
|
17
17
|
- Configurable maximum subagent nesting depth
|
|
18
|
+
- **Metrics collection** to track rate limits, fallbacks, and model performance
|
|
18
19
|
|
|
19
20
|
## Installation
|
|
20
21
|
|
|
@@ -62,7 +63,15 @@ Create a configuration file at one of these locations:
|
|
|
62
63
|
{ "providerID": "anthropic", "modelID": "claude-3-5-sonnet-20250514" },
|
|
63
64
|
{ "providerID": "google", "modelID": "gemini-2.5-pro" },
|
|
64
65
|
{ "providerID": "google", "modelID": "gemini-2.5-flash" }
|
|
65
|
-
]
|
|
66
|
+
],
|
|
67
|
+
"metrics": {
|
|
68
|
+
"enabled": true,
|
|
69
|
+
"output": {
|
|
70
|
+
"console": true,
|
|
71
|
+
"format": "pretty"
|
|
72
|
+
},
|
|
73
|
+
"resetInterval": "daily"
|
|
74
|
+
}
|
|
66
75
|
}
|
|
67
76
|
```
|
|
68
77
|
|
|
@@ -122,6 +131,128 @@ When OpenCode uses subagents (e.g., for complex tasks requiring specialized agen
|
|
|
122
131
|
| `maxSubagentDepth` | number | `10` | Maximum nesting depth for subagent hierarchies |
|
|
123
132
|
| `enableSubagentFallback` | boolean | `true` | Enable/disable fallback for subagent sessions |
|
|
124
133
|
|
|
134
|
+
## Metrics
|
|
135
|
+
|
|
136
|
+
The plugin includes a metrics collection feature that tracks:
|
|
137
|
+
- Rate limit events per provider/model
|
|
138
|
+
- Fallback statistics (total, successful, failed, average duration)
|
|
139
|
+
- Model performance (requests, successes, failures, response time)
|
|
140
|
+
|
|
141
|
+
### Metrics Configuration
|
|
142
|
+
|
|
143
|
+
Metrics can be configured via the `metrics` section in your config file:
|
|
144
|
+
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"metrics": {
|
|
148
|
+
"enabled": true,
|
|
149
|
+
"output": {
|
|
150
|
+
"console": true,
|
|
151
|
+
"file": "/path/to/metrics.json",
|
|
152
|
+
"format": "pretty"
|
|
153
|
+
},
|
|
154
|
+
"resetInterval": "daily"
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Metrics Options
|
|
160
|
+
|
|
161
|
+
| Option | Type | Default | Description |
|
|
162
|
+
|--------|------|---------|-------------|
|
|
163
|
+
| `enabled` | boolean | `false` | Enable/disable metrics collection |
|
|
164
|
+
| `output.console` | boolean | `true` | Print metrics to console |
|
|
165
|
+
| `output.file` | string | `undefined` | Path to save metrics file |
|
|
166
|
+
| `output.format` | string | `"pretty"` | Output format: `"pretty"`, `"json"`, or `"csv"` |
|
|
167
|
+
| `resetInterval` | string | `"daily"` | Reset interval: `"hourly"`, `"daily"`, or `"weekly"` |
|
|
168
|
+
|
|
169
|
+
### Output Formats
|
|
170
|
+
|
|
171
|
+
**Pretty** (human-readable):
|
|
172
|
+
```
|
|
173
|
+
============================================================
|
|
174
|
+
Rate Limit Fallback Metrics
|
|
175
|
+
============================================================
|
|
176
|
+
Started: 2025-02-10T02:00:00.000Z
|
|
177
|
+
Generated: 2025-02-10T02:30:00.000Z
|
|
178
|
+
|
|
179
|
+
Rate Limits:
|
|
180
|
+
----------------------------------------
|
|
181
|
+
anthropic/claude-3-5-sonnet-20250514:
|
|
182
|
+
Count: 5
|
|
183
|
+
First: 2025-02-10T02:00:00.000Z
|
|
184
|
+
Last: 2025-02-10T02:29:00.000Z
|
|
185
|
+
Avg Interval: 3.50s
|
|
186
|
+
|
|
187
|
+
Fallbacks:
|
|
188
|
+
----------------------------------------
|
|
189
|
+
Total: 3
|
|
190
|
+
Successful: 2
|
|
191
|
+
Failed: 1
|
|
192
|
+
Avg Duration: 1.25s
|
|
193
|
+
|
|
194
|
+
Model Performance:
|
|
195
|
+
----------------------------------------
|
|
196
|
+
google/gemini-2.5-pro:
|
|
197
|
+
Requests: 10
|
|
198
|
+
Successes: 9
|
|
199
|
+
Failures: 1
|
|
200
|
+
Avg Response: 0.85s
|
|
201
|
+
Success Rate: 90.0%
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**JSON** (machine-readable):
|
|
205
|
+
```json
|
|
206
|
+
{
|
|
207
|
+
"rateLimits": {
|
|
208
|
+
"anthropic/claude-3-5-sonnet-20250514": {
|
|
209
|
+
"count": 5,
|
|
210
|
+
"firstOccurrence": 1739148000000,
|
|
211
|
+
"lastOccurrence": 1739149740000,
|
|
212
|
+
"averageInterval": 3500
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
"fallbacks": {
|
|
216
|
+
"total": 3,
|
|
217
|
+
"successful": 2,
|
|
218
|
+
"failed": 1,
|
|
219
|
+
"averageDuration": 1250,
|
|
220
|
+
"byTargetModel": {
|
|
221
|
+
"google/gemini-2.5-pro": {
|
|
222
|
+
"usedAsFallback": 2,
|
|
223
|
+
"successful": 2,
|
|
224
|
+
"failed": 0
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"modelPerformance": {
|
|
229
|
+
"google/gemini-2.5-pro": {
|
|
230
|
+
"requests": 10,
|
|
231
|
+
"successes": 9,
|
|
232
|
+
"failures": 1,
|
|
233
|
+
"averageResponseTime": 850
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
"startedAt": 1739148000000,
|
|
237
|
+
"generatedAt": 1739149800000
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**CSV** (spreadsheet-friendly):
|
|
242
|
+
```
|
|
243
|
+
=== RATE_LIMITS ===
|
|
244
|
+
model,count,first_occurrence,last_occurrence,avg_interval_ms
|
|
245
|
+
anthropic/claude-3-5-sonnet-20250514,5,1739148000000,1739149740000,3500
|
|
246
|
+
|
|
247
|
+
=== FALLBACKS_SUMMARY ===
|
|
248
|
+
total,successful,failed,avg_duration_ms
|
|
249
|
+
3,2,1,1250
|
|
250
|
+
|
|
251
|
+
=== MODEL_PERFORMANCE ===
|
|
252
|
+
model,requests,successes,failures,avg_response_time_ms,success_rate
|
|
253
|
+
google/gemini-2.5-pro,10,9,1,850,90.0
|
|
254
|
+
```
|
|
255
|
+
|
|
125
256
|
## License
|
|
126
257
|
|
|
127
258
|
MIT
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Fallback Plugin - Main entry point
|
|
3
|
+
*
|
|
4
|
+
* This plugin automatically switches to fallback models when rate limited
|
|
5
|
+
*/
|
|
1
6
|
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
7
|
export declare const RateLimitFallback: Plugin;
|
|
3
8
|
export default RateLimitFallback;
|
|
4
|
-
|
|
9
|
+
export type { PluginConfig, MetricsConfig, FallbackModel, FallbackMode } from "./src/types/index.js";
|
|
10
|
+
export { MetricsManager } from "./src/metrics/MetricsManager.js";
|
|
11
|
+
export { createLogger, type LogConfig, type Logger } from "./logger.js";
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Fallback Plugin - Main entry point
|
|
3
|
+
*
|
|
4
|
+
* This plugin automatically switches to fallback models when rate limited
|
|
5
|
+
*/
|
|
1
6
|
import { existsSync, readFileSync } from "fs";
|
|
2
7
|
import { join } from "path";
|
|
3
8
|
import { createLogger } from "./logger.js";
|
|
4
|
-
|
|
9
|
+
import { MetricsManager } from "./src/metrics/MetricsManager.js";
|
|
10
|
+
import { FallbackHandler } from "./src/fallback/FallbackHandler.js";
|
|
11
|
+
import { loadConfig } from "./src/utils/config.js";
|
|
12
|
+
import { isRateLimitError } from "./src/utils/errorDetection.js";
|
|
13
|
+
import { initSubagentTracker, registerSubagent, getRootSession, getHierarchy, cleanupStaleEntries as clearHierarchyEntries, clearAll as clearAllHierarchies, } from "./src/session/SubagentTracker.js";
|
|
14
|
+
import { CLEANUP_INTERVAL_MS } from "./src/types/index.js";
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Event Type Guards
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Check if event is a session error event
|
|
20
|
+
*/
|
|
5
21
|
function isSessionErrorEvent(event) {
|
|
6
22
|
return event.type === "session.error" &&
|
|
7
23
|
typeof event.properties === "object" &&
|
|
@@ -9,18 +25,26 @@ function isSessionErrorEvent(event) {
|
|
|
9
25
|
"sessionID" in event.properties &&
|
|
10
26
|
"error" in event.properties;
|
|
11
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if event is a message updated event
|
|
30
|
+
*/
|
|
12
31
|
function isMessageUpdatedEvent(event) {
|
|
13
32
|
return event.type === "message.updated" &&
|
|
14
33
|
typeof event.properties === "object" &&
|
|
15
34
|
event.properties !== null &&
|
|
16
35
|
"info" in event.properties;
|
|
17
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if event is a session status event
|
|
39
|
+
*/
|
|
18
40
|
function isSessionStatusEvent(event) {
|
|
19
41
|
return event.type === "session.status" &&
|
|
20
42
|
typeof event.properties === "object" &&
|
|
21
43
|
event.properties !== null;
|
|
22
44
|
}
|
|
23
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Check if event is a subagent session created event
|
|
47
|
+
*/
|
|
24
48
|
function isSubagentSessionCreatedEvent(event) {
|
|
25
49
|
return event.type === "subagent.session.created" &&
|
|
26
50
|
typeof event.properties === "object" &&
|
|
@@ -28,130 +52,9 @@ function isSubagentSessionCreatedEvent(event) {
|
|
|
28
52
|
"sessionID" in event.properties &&
|
|
29
53
|
"parentSessionID" in event.properties;
|
|
30
54
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
{ providerID: "google", modelID: "gemini-2.5-flash" },
|
|
35
|
-
];
|
|
36
|
-
const VALID_FALLBACK_MODES = ["cycle", "stop", "retry-last"];
|
|
37
|
-
const DEFAULT_CONFIG = {
|
|
38
|
-
fallbackModels: DEFAULT_FALLBACK_MODELS,
|
|
39
|
-
cooldownMs: 60 * 1000,
|
|
40
|
-
enabled: true,
|
|
41
|
-
fallbackMode: "cycle",
|
|
42
|
-
log: {
|
|
43
|
-
level: "warn",
|
|
44
|
-
format: "simple",
|
|
45
|
-
enableTimestamp: true,
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
function loadConfig(directory) {
|
|
49
|
-
const homedir = process.env.HOME || "";
|
|
50
|
-
const configPaths = [
|
|
51
|
-
join(directory, ".opencode", "rate-limit-fallback.json"),
|
|
52
|
-
join(directory, "rate-limit-fallback.json"),
|
|
53
|
-
join(homedir, ".opencode", "rate-limit-fallback.json"),
|
|
54
|
-
join(homedir, ".config", "opencode", "rate-limit-fallback.json"),
|
|
55
|
-
];
|
|
56
|
-
for (const configPath of configPaths) {
|
|
57
|
-
if (existsSync(configPath)) {
|
|
58
|
-
try {
|
|
59
|
-
const content = readFileSync(configPath, "utf-8");
|
|
60
|
-
const userConfig = JSON.parse(content);
|
|
61
|
-
const mode = userConfig.fallbackMode;
|
|
62
|
-
return {
|
|
63
|
-
...DEFAULT_CONFIG,
|
|
64
|
-
...userConfig,
|
|
65
|
-
fallbackModels: userConfig.fallbackModels || DEFAULT_CONFIG.fallbackModels,
|
|
66
|
-
fallbackMode: VALID_FALLBACK_MODES.includes(mode) ? mode : DEFAULT_CONFIG.fallbackMode,
|
|
67
|
-
log: userConfig.log ? { ...DEFAULT_CONFIG.log, ...userConfig.log } : DEFAULT_CONFIG.log,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
// Silently ignore config load errors - will be logged after logger is initialized
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return DEFAULT_CONFIG;
|
|
76
|
-
}
|
|
77
|
-
function getModelKey(providerID, modelID) {
|
|
78
|
-
return `${providerID}/${modelID}`;
|
|
79
|
-
}
|
|
80
|
-
function getStateKey(sessionID, messageID) {
|
|
81
|
-
return `${sessionID}:${messageID}`;
|
|
82
|
-
}
|
|
83
|
-
function isRateLimitError(error) {
|
|
84
|
-
if (!error || typeof error !== "object")
|
|
85
|
-
return false;
|
|
86
|
-
// More type-safe error object structure
|
|
87
|
-
const err = error;
|
|
88
|
-
// Check for 429 status code in APIError (strict check)
|
|
89
|
-
if (err.name === "APIError" && err.data?.statusCode === 429) {
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
// Type-safe access to error fields
|
|
93
|
-
const responseBody = String(err.data?.responseBody || "").toLowerCase();
|
|
94
|
-
const message = String(err.data?.message || err.message || "").toLowerCase();
|
|
95
|
-
// Strict rate limit indicators only - avoid false positives
|
|
96
|
-
const strictRateLimitIndicators = [
|
|
97
|
-
"rate limit",
|
|
98
|
-
"rate_limit",
|
|
99
|
-
"ratelimit",
|
|
100
|
-
"too many requests",
|
|
101
|
-
"quota exceeded",
|
|
102
|
-
];
|
|
103
|
-
// Check for 429 in text (explicit HTTP status code)
|
|
104
|
-
if (responseBody.includes("429") || message.includes("429")) {
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
// Check for strict rate limit keywords
|
|
108
|
-
return strictRateLimitIndicators.some((indicator) => responseBody.includes(indicator) ||
|
|
109
|
-
message.includes(indicator));
|
|
110
|
-
}
|
|
111
|
-
// Constants for deduplication and state management
|
|
112
|
-
const DEDUP_WINDOW_MS = 5000;
|
|
113
|
-
const STATE_TIMEOUT_MS = 30000;
|
|
114
|
-
const CLEANUP_INTERVAL_MS = 300000; // 5 minutes
|
|
115
|
-
const SESSION_ENTRY_TTL_MS = 3600000; // 1 hour
|
|
116
|
-
/**
|
|
117
|
-
* Extract toast message properties with fallback values
|
|
118
|
-
*/
|
|
119
|
-
function getToastMessage(toast) {
|
|
120
|
-
const title = toast?.body?.title || toast?.title || "Toast";
|
|
121
|
-
const message = toast?.body?.message || toast?.message || "";
|
|
122
|
-
const variant = toast?.body?.variant || toast?.variant || "info";
|
|
123
|
-
return { title, message, variant };
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Safely show toast, falling back to console logging if TUI is missing or fails
|
|
127
|
-
*/
|
|
128
|
-
const safeShowToast = async (client, toast) => {
|
|
129
|
-
const { title, message, variant } = getToastMessage(toast);
|
|
130
|
-
const logToConsole = () => {
|
|
131
|
-
if (variant === "error") {
|
|
132
|
-
console.error(`[RateLimitFallback] ${title}: ${message}`);
|
|
133
|
-
}
|
|
134
|
-
else if (variant === "warning") {
|
|
135
|
-
console.warn(`[RateLimitFallback] ${title}: ${message}`);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
console.log(`[RateLimitFallback] ${title}: ${message}`);
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
try {
|
|
142
|
-
if (client.tui) {
|
|
143
|
-
await client.tui.showToast(toast);
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
// TUI doesn't exist - log to console
|
|
147
|
-
logToConsole();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
// TUI exists but failed to show toast - log to console
|
|
152
|
-
logToConsole();
|
|
153
|
-
}
|
|
154
|
-
};
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// Main Plugin Export
|
|
57
|
+
// ============================================================================
|
|
155
58
|
export const RateLimitFallback = async ({ client, directory }) => {
|
|
156
59
|
const config = loadConfig(directory);
|
|
157
60
|
// Detect headless mode (no TUI)
|
|
@@ -184,465 +87,45 @@ export const RateLimitFallback = async ({ client, directory }) => {
|
|
|
184
87
|
if (!config.enabled) {
|
|
185
88
|
return {};
|
|
186
89
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const
|
|
196
|
-
//
|
|
197
|
-
function getOrCreateHierarchy(rootSessionID) {
|
|
198
|
-
let hierarchy = sessionHierarchies.get(rootSessionID);
|
|
199
|
-
if (!hierarchy) {
|
|
200
|
-
hierarchy = {
|
|
201
|
-
rootSessionID,
|
|
202
|
-
subagents: new Map(),
|
|
203
|
-
sharedFallbackState: "none",
|
|
204
|
-
sharedConfig: config,
|
|
205
|
-
createdAt: Date.now(),
|
|
206
|
-
lastActivity: Date.now(),
|
|
207
|
-
};
|
|
208
|
-
sessionHierarchies.set(rootSessionID, hierarchy);
|
|
209
|
-
sessionToRootMap.set(rootSessionID, rootSessionID);
|
|
210
|
-
}
|
|
211
|
-
return hierarchy;
|
|
212
|
-
}
|
|
213
|
-
function registerSubagent(sessionID, parentSessionID) {
|
|
214
|
-
// Validate parent session exists
|
|
215
|
-
// Parent session must either be registered in sessionToRootMap or be a new root session
|
|
216
|
-
const parentRootSessionID = sessionToRootMap.get(parentSessionID);
|
|
217
|
-
// Determine root session - if parent doesn't exist, treat it as a new root
|
|
218
|
-
const rootSessionID = parentRootSessionID || parentSessionID;
|
|
219
|
-
// If parent is not a subagent but we're treating it as a root, create a hierarchy for it
|
|
220
|
-
// This allows sessions to become roots when their first subagent is registered
|
|
221
|
-
const hierarchy = getOrCreateHierarchy(rootSessionID);
|
|
222
|
-
const parentSubagent = hierarchy.subagents.get(parentSessionID);
|
|
223
|
-
const depth = parentSubagent ? parentSubagent.depth + 1 : 1;
|
|
224
|
-
// Enforce max depth
|
|
225
|
-
if (depth > maxSubagentDepth) {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
const subagent = {
|
|
229
|
-
sessionID,
|
|
230
|
-
parentSessionID,
|
|
231
|
-
depth,
|
|
232
|
-
fallbackState: "none",
|
|
233
|
-
createdAt: Date.now(),
|
|
234
|
-
lastActivity: Date.now(),
|
|
235
|
-
};
|
|
236
|
-
hierarchy.subagents.set(sessionID, subagent);
|
|
237
|
-
sessionToRootMap.set(sessionID, rootSessionID);
|
|
238
|
-
hierarchy.lastActivity = Date.now();
|
|
239
|
-
return true;
|
|
240
|
-
}
|
|
241
|
-
function getRootSession(sessionID) {
|
|
242
|
-
return sessionToRootMap.get(sessionID) || null;
|
|
243
|
-
}
|
|
244
|
-
function getHierarchy(sessionID) {
|
|
245
|
-
const rootSessionID = getRootSession(sessionID);
|
|
246
|
-
return rootSessionID ? sessionHierarchies.get(rootSessionID) || null : null;
|
|
247
|
-
}
|
|
248
|
-
// Cleanup stale session model entries (every 5 minutes)
|
|
90
|
+
// Initialize components
|
|
91
|
+
initSubagentTracker(config);
|
|
92
|
+
const metricsManager = new MetricsManager(config.metrics ?? { enabled: false, output: { console: true, format: "pretty" }, resetInterval: "daily" }, logger);
|
|
93
|
+
// Create hierarchy resolver to avoid circular dependency
|
|
94
|
+
const hierarchyResolver = {
|
|
95
|
+
getRootSession: getRootSession,
|
|
96
|
+
getHierarchy: getHierarchy,
|
|
97
|
+
};
|
|
98
|
+
const fallbackHandler = new FallbackHandler(config, client, logger, metricsManager, hierarchyResolver);
|
|
99
|
+
// Cleanup stale entries periodically
|
|
249
100
|
const cleanupInterval = setInterval(() => {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
// Remove entries older than 1 hour
|
|
253
|
-
if (now - entry.lastUpdated > SESSION_ENTRY_TTL_MS) {
|
|
254
|
-
currentSessionModel.delete(sessionID);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
// Clean up stale session hierarchies
|
|
258
|
-
for (const [rootSessionID, hierarchy] of sessionHierarchies.entries()) {
|
|
259
|
-
if (now - hierarchy.lastActivity > SESSION_ENTRY_TTL_MS) {
|
|
260
|
-
// Clean up all subagents in this hierarchy
|
|
261
|
-
for (const subagentID of hierarchy.subagents.keys()) {
|
|
262
|
-
sessionToRootMap.delete(subagentID);
|
|
263
|
-
}
|
|
264
|
-
sessionHierarchies.delete(rootSessionID);
|
|
265
|
-
sessionToRootMap.delete(rootSessionID);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
// Clean up stale retry state entries to prevent memory leaks
|
|
269
|
-
for (const [stateKey, state] of retryState.entries()) {
|
|
270
|
-
if (now - state.lastAttemptTime > STATE_TIMEOUT_MS) {
|
|
271
|
-
retryState.delete(stateKey);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
// Clean up stale fallback messages
|
|
275
|
-
for (const [fallbackKey, fallbackInfo] of fallbackMessages.entries()) {
|
|
276
|
-
if (now - fallbackInfo.timestamp > SESSION_ENTRY_TTL_MS) {
|
|
277
|
-
fallbackInProgress.delete(fallbackKey);
|
|
278
|
-
fallbackMessages.delete(fallbackKey);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
101
|
+
clearHierarchyEntries();
|
|
102
|
+
fallbackHandler.cleanupStaleEntries();
|
|
281
103
|
}, CLEANUP_INTERVAL_MS);
|
|
282
|
-
function isModelRateLimited(providerID, modelID) {
|
|
283
|
-
const key = getModelKey(providerID, modelID);
|
|
284
|
-
const limitedAt = rateLimitedModels.get(key);
|
|
285
|
-
if (!limitedAt)
|
|
286
|
-
return false;
|
|
287
|
-
if (Date.now() - limitedAt > config.cooldownMs) {
|
|
288
|
-
rateLimitedModels.delete(key);
|
|
289
|
-
return false;
|
|
290
|
-
}
|
|
291
|
-
return true;
|
|
292
|
-
}
|
|
293
|
-
function markModelRateLimited(providerID, modelID) {
|
|
294
|
-
const key = getModelKey(providerID, modelID);
|
|
295
|
-
rateLimitedModels.set(key, Date.now());
|
|
296
|
-
}
|
|
297
|
-
function findNextAvailableModel(currentProviderID, currentModelID, attemptedModels) {
|
|
298
|
-
const currentKey = getModelKey(currentProviderID, currentModelID);
|
|
299
|
-
const startIndex = config.fallbackModels.findIndex(m => getModelKey(m.providerID, m.modelID) === currentKey);
|
|
300
|
-
// If current model is not in the fallback list (startIndex is -1), start from 0
|
|
301
|
-
const searchStartIndex = Math.max(0, startIndex);
|
|
302
|
-
for (let i = searchStartIndex + 1; i < config.fallbackModels.length; i++) {
|
|
303
|
-
const model = config.fallbackModels[i];
|
|
304
|
-
const key = getModelKey(model.providerID, model.modelID);
|
|
305
|
-
if (!attemptedModels.has(key) && !isModelRateLimited(model.providerID, model.modelID)) {
|
|
306
|
-
return model;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
for (let i = 0; i <= searchStartIndex && i < config.fallbackModels.length; i++) {
|
|
310
|
-
const model = config.fallbackModels[i];
|
|
311
|
-
const key = getModelKey(model.providerID, model.modelID);
|
|
312
|
-
if (!attemptedModels.has(key) && !isModelRateLimited(model.providerID, model.modelID)) {
|
|
313
|
-
return model;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
return null;
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Check and mark fallback in progress for deduplication.
|
|
320
|
-
* Uses message scope (sessionID:messageID) for better tracking.
|
|
321
|
-
* Returns true if processing should continue, false if it should be skipped.
|
|
322
|
-
*/
|
|
323
|
-
function checkAndMarkFallbackInProgress(sessionID, messageID) {
|
|
324
|
-
const key = getStateKey(sessionID, messageID);
|
|
325
|
-
const lastFallback = fallbackInProgress.get(key);
|
|
326
|
-
if (lastFallback && Date.now() - lastFallback < DEDUP_WINDOW_MS) {
|
|
327
|
-
return false; // Skip - already processing
|
|
328
|
-
}
|
|
329
|
-
fallbackInProgress.set(key, Date.now());
|
|
330
|
-
return true; // Continue processing
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Resolve the target session for fallback processing.
|
|
334
|
-
* For subagent sessions, the target is the root session (parent-centered approach).
|
|
335
|
-
* Uses message scope (sessionID:messageID) for deduplication.
|
|
336
|
-
* Updates hierarchy state and returns { targetSessionID, hierarchy }.
|
|
337
|
-
*/
|
|
338
|
-
function resolveTargetSessionWithDedup(sessionID, messageID) {
|
|
339
|
-
const hierarchy = getHierarchy(sessionID);
|
|
340
|
-
const rootSessionID = getRootSession(sessionID);
|
|
341
|
-
if (rootSessionID && hierarchy) {
|
|
342
|
-
// Check deduplication with message scope
|
|
343
|
-
if (!checkAndMarkFallbackInProgress(rootSessionID, messageID)) {
|
|
344
|
-
return null; // Skip - already processing
|
|
345
|
-
}
|
|
346
|
-
// Update the shared fallback state
|
|
347
|
-
hierarchy.sharedFallbackState = "in_progress";
|
|
348
|
-
hierarchy.lastActivity = Date.now();
|
|
349
|
-
// Update the subagent's state
|
|
350
|
-
const subagent = hierarchy.subagents.get(sessionID);
|
|
351
|
-
if (subagent) {
|
|
352
|
-
subagent.fallbackState = "in_progress";
|
|
353
|
-
subagent.lastActivity = Date.now();
|
|
354
|
-
}
|
|
355
|
-
return { targetSessionID: rootSessionID, hierarchy };
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
// Prevent duplicate fallback processing for non-subagent sessions with message scope
|
|
359
|
-
if (!checkAndMarkFallbackInProgress(sessionID, messageID)) {
|
|
360
|
-
return null; // Skip - already processing
|
|
361
|
-
}
|
|
362
|
-
return { targetSessionID: sessionID, hierarchy: null };
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Get or create retry state for a specific message.
|
|
367
|
-
*/
|
|
368
|
-
function getOrCreateRetryState(sessionID, messageID) {
|
|
369
|
-
const stateKey = getStateKey(sessionID, messageID);
|
|
370
|
-
let state = retryState.get(stateKey);
|
|
371
|
-
if (!state || Date.now() - state.lastAttemptTime > STATE_TIMEOUT_MS) {
|
|
372
|
-
state = { attemptedModels: new Set(), lastAttemptTime: Date.now() };
|
|
373
|
-
retryState.set(stateKey, state);
|
|
374
|
-
}
|
|
375
|
-
return state;
|
|
376
|
-
}
|
|
377
|
-
/**
|
|
378
|
-
* Select the next fallback model based on current state and fallback mode.
|
|
379
|
-
* Returns the selected model or null if no model is available.
|
|
380
|
-
*/
|
|
381
|
-
async function selectFallbackModel(currentProviderID, currentModelID, state) {
|
|
382
|
-
// Mark current model as rate limited and add to attempted
|
|
383
|
-
if (currentProviderID && currentModelID) {
|
|
384
|
-
markModelRateLimited(currentProviderID, currentModelID);
|
|
385
|
-
state.attemptedModels.add(getModelKey(currentProviderID, currentModelID));
|
|
386
|
-
}
|
|
387
|
-
let nextModel = findNextAvailableModel(currentProviderID || "", currentModelID || "", state.attemptedModels);
|
|
388
|
-
// Handle when no model is found based on fallbackMode
|
|
389
|
-
if (!nextModel && state.attemptedModels.size > 0) {
|
|
390
|
-
if (config.fallbackMode === "cycle") {
|
|
391
|
-
// Reset and retry from the first model
|
|
392
|
-
state.attemptedModels.clear();
|
|
393
|
-
if (currentProviderID && currentModelID) {
|
|
394
|
-
state.attemptedModels.add(getModelKey(currentProviderID, currentModelID));
|
|
395
|
-
}
|
|
396
|
-
nextModel = findNextAvailableModel("", "", state.attemptedModels);
|
|
397
|
-
}
|
|
398
|
-
else if (config.fallbackMode === "retry-last") {
|
|
399
|
-
// Try the last model in the list once, then reset on next prompt
|
|
400
|
-
const lastModel = config.fallbackModels[config.fallbackModels.length - 1];
|
|
401
|
-
if (lastModel) {
|
|
402
|
-
const isLastModelCurrent = currentProviderID === lastModel.providerID && currentModelID === lastModel.modelID;
|
|
403
|
-
if (!isLastModelCurrent && !isModelRateLimited(lastModel.providerID, lastModel.modelID)) {
|
|
404
|
-
// Use the last model for one more try
|
|
405
|
-
nextModel = lastModel;
|
|
406
|
-
await safeShowToast(client, {
|
|
407
|
-
body: {
|
|
408
|
-
title: "Last Resort",
|
|
409
|
-
message: `Trying ${lastModel.modelID} one more time...`,
|
|
410
|
-
variant: "warning",
|
|
411
|
-
duration: 3000,
|
|
412
|
-
},
|
|
413
|
-
});
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
// Last model also failed, reset for next prompt
|
|
417
|
-
state.attemptedModels.clear();
|
|
418
|
-
if (currentProviderID && currentModelID) {
|
|
419
|
-
state.attemptedModels.add(getModelKey(currentProviderID, currentModelID));
|
|
420
|
-
}
|
|
421
|
-
nextModel = findNextAvailableModel("", "", state.attemptedModels);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
// "stop" mode: nextModel remains null, will show error below
|
|
426
|
-
}
|
|
427
|
-
return nextModel;
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Extract and validate message parts from a user message.
|
|
431
|
-
*/
|
|
432
|
-
function extractMessageParts(message) {
|
|
433
|
-
const msg = message;
|
|
434
|
-
return msg.parts
|
|
435
|
-
.filter((p) => {
|
|
436
|
-
const part = p;
|
|
437
|
-
return part.type === "text" || part.type === "file";
|
|
438
|
-
})
|
|
439
|
-
.map((p) => {
|
|
440
|
-
const part = p;
|
|
441
|
-
if (part.type === "text")
|
|
442
|
-
return { type: "text", text: String(part.text) };
|
|
443
|
-
if (part.type === "file")
|
|
444
|
-
return { type: "file", path: String(part.path), mediaType: String(part.mediaType) };
|
|
445
|
-
return null;
|
|
446
|
-
})
|
|
447
|
-
.filter((p) => p !== null);
|
|
448
|
-
}
|
|
449
|
-
/**
|
|
450
|
-
* Convert internal MessagePart to SDK-compatible format.
|
|
451
|
-
*/
|
|
452
|
-
function convertPartsToSDKFormat(parts) {
|
|
453
|
-
return parts.map((part) => {
|
|
454
|
-
if (part.type === "text") {
|
|
455
|
-
return { type: "text", text: part.text };
|
|
456
|
-
}
|
|
457
|
-
// For file parts, we need to match the FilePartInput format
|
|
458
|
-
// Using path as url since we're dealing with local files
|
|
459
|
-
return {
|
|
460
|
-
type: "file",
|
|
461
|
-
url: part.path,
|
|
462
|
-
mime: part.mediaType || "application/octet-stream",
|
|
463
|
-
};
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
/**
|
|
467
|
-
* Propagate model changes to all subagents in the hierarchy.
|
|
468
|
-
*/
|
|
469
|
-
function propagateModelToSubagents(hierarchy, targetSessionID, providerID, modelID) {
|
|
470
|
-
if (hierarchy.rootSessionID === targetSessionID) {
|
|
471
|
-
hierarchy.sharedFallbackState = "completed";
|
|
472
|
-
hierarchy.lastActivity = Date.now();
|
|
473
|
-
// Update model tracking for all subagents
|
|
474
|
-
for (const [subagentID, subagent] of hierarchy.subagents.entries()) {
|
|
475
|
-
currentSessionModel.set(subagentID, {
|
|
476
|
-
providerID,
|
|
477
|
-
modelID,
|
|
478
|
-
lastUpdated: Date.now(),
|
|
479
|
-
});
|
|
480
|
-
subagent.fallbackState = "completed";
|
|
481
|
-
subagent.lastActivity = Date.now();
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
/**
|
|
486
|
-
* Retry the prompt with a different model.
|
|
487
|
-
*/
|
|
488
|
-
async function retryWithModel(targetSessionID, model, parts, hierarchy) {
|
|
489
|
-
// Track the new model for this session
|
|
490
|
-
currentSessionModel.set(targetSessionID, {
|
|
491
|
-
providerID: model.providerID,
|
|
492
|
-
modelID: model.modelID,
|
|
493
|
-
lastUpdated: Date.now(),
|
|
494
|
-
});
|
|
495
|
-
// If this is a root session with subagents, propagate the model to all subagents
|
|
496
|
-
if (hierarchy) {
|
|
497
|
-
propagateModelToSubagents(hierarchy, targetSessionID, model.providerID, model.modelID);
|
|
498
|
-
}
|
|
499
|
-
// Convert internal MessagePart to SDK-compatible format
|
|
500
|
-
const sdkParts = convertPartsToSDKFormat(parts);
|
|
501
|
-
await client.session.prompt({
|
|
502
|
-
path: { id: targetSessionID },
|
|
503
|
-
body: {
|
|
504
|
-
parts: sdkParts,
|
|
505
|
-
model: { providerID: model.providerID, modelID: model.modelID },
|
|
506
|
-
},
|
|
507
|
-
});
|
|
508
|
-
await safeShowToast(client, {
|
|
509
|
-
body: {
|
|
510
|
-
title: "Fallback Successful",
|
|
511
|
-
message: `Now using ${model.modelID}`,
|
|
512
|
-
variant: "success",
|
|
513
|
-
duration: 3000,
|
|
514
|
-
},
|
|
515
|
-
});
|
|
516
|
-
}
|
|
517
|
-
async function handleRateLimitFallback(sessionID, currentProviderID, currentModelID) {
|
|
518
|
-
try {
|
|
519
|
-
// If no model info provided, try to get from tracked session model
|
|
520
|
-
const rootSessionID = getRootSession(sessionID);
|
|
521
|
-
const targetSessionID = rootSessionID || sessionID;
|
|
522
|
-
if (!currentProviderID || !currentModelID) {
|
|
523
|
-
const tracked = currentSessionModel.get(targetSessionID);
|
|
524
|
-
if (tracked) {
|
|
525
|
-
currentProviderID = tracked.providerID;
|
|
526
|
-
currentModelID = tracked.modelID;
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
// Abort current session with error handling
|
|
530
|
-
try {
|
|
531
|
-
await client.session.abort({ path: { id: targetSessionID } });
|
|
532
|
-
}
|
|
533
|
-
catch (abortError) {
|
|
534
|
-
// Silently ignore abort errors and continue with fallback
|
|
535
|
-
logger.debug(`Failed to abort session ${targetSessionID}`, { error: abortError });
|
|
536
|
-
}
|
|
537
|
-
await safeShowToast(client, {
|
|
538
|
-
body: {
|
|
539
|
-
title: "Rate Limit Detected",
|
|
540
|
-
message: `Switching from ${currentModelID || 'current model'}...`,
|
|
541
|
-
variant: "warning",
|
|
542
|
-
duration: 3000,
|
|
543
|
-
},
|
|
544
|
-
});
|
|
545
|
-
// Get messages from the session
|
|
546
|
-
const messagesResult = await client.session.messages({ path: { id: targetSessionID } });
|
|
547
|
-
if (!messagesResult.data) {
|
|
548
|
-
return;
|
|
549
|
-
}
|
|
550
|
-
const messages = messagesResult.data;
|
|
551
|
-
const lastUserMessage = [...messages].reverse().find(m => m.info.role === "user");
|
|
552
|
-
if (!lastUserMessage) {
|
|
553
|
-
return;
|
|
554
|
-
}
|
|
555
|
-
// Resolve the target session for fallback processing with message scope
|
|
556
|
-
const resolution = resolveTargetSessionWithDedup(sessionID, lastUserMessage.info.id);
|
|
557
|
-
if (!resolution) {
|
|
558
|
-
return; // Skipped due to deduplication
|
|
559
|
-
}
|
|
560
|
-
// Get or create retry state for this message
|
|
561
|
-
const state = getOrCreateRetryState(sessionID, lastUserMessage.info.id);
|
|
562
|
-
const stateKey = getStateKey(sessionID, lastUserMessage.info.id);
|
|
563
|
-
const fallbackKey = getStateKey(resolution.targetSessionID, lastUserMessage.info.id);
|
|
564
|
-
// Select the next fallback model
|
|
565
|
-
const nextModel = await selectFallbackModel(currentProviderID, currentModelID, state);
|
|
566
|
-
// Show error if no model is available
|
|
567
|
-
if (!nextModel) {
|
|
568
|
-
await safeShowToast(client, {
|
|
569
|
-
body: {
|
|
570
|
-
title: "No Fallback Available",
|
|
571
|
-
message: config.fallbackMode === "stop"
|
|
572
|
-
? "All fallback models exhausted"
|
|
573
|
-
: "All models are rate limited",
|
|
574
|
-
variant: "error",
|
|
575
|
-
duration: 5000,
|
|
576
|
-
},
|
|
577
|
-
});
|
|
578
|
-
retryState.delete(stateKey);
|
|
579
|
-
fallbackInProgress.delete(fallbackKey);
|
|
580
|
-
return;
|
|
581
|
-
}
|
|
582
|
-
state.attemptedModels.add(getModelKey(nextModel.providerID, nextModel.modelID));
|
|
583
|
-
state.lastAttemptTime = Date.now();
|
|
584
|
-
// Extract message parts
|
|
585
|
-
const parts = extractMessageParts(lastUserMessage);
|
|
586
|
-
if (parts.length === 0) {
|
|
587
|
-
fallbackInProgress.delete(fallbackKey);
|
|
588
|
-
return;
|
|
589
|
-
}
|
|
590
|
-
await safeShowToast(client, {
|
|
591
|
-
body: {
|
|
592
|
-
title: "Retrying",
|
|
593
|
-
message: `Using ${nextModel.providerID}/${nextModel.modelID}`,
|
|
594
|
-
variant: "info",
|
|
595
|
-
duration: 3000,
|
|
596
|
-
},
|
|
597
|
-
});
|
|
598
|
-
// Track this message as a fallback message for completion detection
|
|
599
|
-
// Note: The new message will have a new ID after prompting, but we use the original message ID
|
|
600
|
-
// to correlate with the fallback in progress state
|
|
601
|
-
fallbackMessages.set(fallbackKey, {
|
|
602
|
-
sessionID: resolution.targetSessionID,
|
|
603
|
-
messageID: lastUserMessage.info.id,
|
|
604
|
-
timestamp: Date.now(),
|
|
605
|
-
});
|
|
606
|
-
// Retry with the selected model
|
|
607
|
-
await retryWithModel(resolution.targetSessionID, nextModel, parts, resolution.hierarchy);
|
|
608
|
-
// Clean up state
|
|
609
|
-
retryState.delete(stateKey);
|
|
610
|
-
}
|
|
611
|
-
catch (err) {
|
|
612
|
-
// Silently ignore fallback errors - log only limited error info
|
|
613
|
-
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
614
|
-
const errorName = err instanceof Error ? err.name : undefined;
|
|
615
|
-
logger.debug(`Fallback error for session ${sessionID}`, {
|
|
616
|
-
error: errorMessage,
|
|
617
|
-
name: errorName,
|
|
618
|
-
});
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
104
|
return {
|
|
622
105
|
event: async ({ event }) => {
|
|
106
|
+
// Handle session.error events
|
|
623
107
|
if (isSessionErrorEvent(event)) {
|
|
624
108
|
const { sessionID, error } = event.properties;
|
|
625
109
|
if (sessionID && error && isRateLimitError(error)) {
|
|
626
|
-
await handleRateLimitFallback(sessionID, "", "");
|
|
110
|
+
await fallbackHandler.handleRateLimitFallback(sessionID, "", "");
|
|
627
111
|
}
|
|
628
112
|
}
|
|
113
|
+
// Handle message.updated events
|
|
629
114
|
if (isMessageUpdatedEvent(event)) {
|
|
630
115
|
const info = event.properties.info;
|
|
631
116
|
if (info?.error && isRateLimitError(info.error)) {
|
|
632
|
-
await handleRateLimitFallback(info.sessionID, info.providerID || "", info.modelID || "");
|
|
117
|
+
await fallbackHandler.handleRateLimitFallback(info.sessionID, info.providerID || "", info.modelID || "");
|
|
633
118
|
}
|
|
634
|
-
else if (info?.status === "completed" && !info?.error) {
|
|
635
|
-
//
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
fallbackMessages.delete(fallbackKey);
|
|
642
|
-
logger.debug(`Fallback completed for message ${info.id}`, { sessionID: info.sessionID });
|
|
643
|
-
}
|
|
119
|
+
else if (info?.status === "completed" && !info?.error && info?.id) {
|
|
120
|
+
// Record fallback success
|
|
121
|
+
fallbackHandler.handleMessageUpdated(info.sessionID, info.id, false, false);
|
|
122
|
+
}
|
|
123
|
+
else if (info?.error && !isRateLimitError(info.error) && info?.id) {
|
|
124
|
+
// Record non-rate-limit error
|
|
125
|
+
fallbackHandler.handleMessageUpdated(info.sessionID, info.id, true, false);
|
|
644
126
|
}
|
|
645
127
|
}
|
|
128
|
+
// Handle session.status events
|
|
646
129
|
if (isSessionStatusEvent(event)) {
|
|
647
130
|
const props = event.properties;
|
|
648
131
|
const status = props?.status;
|
|
@@ -654,30 +137,28 @@ export const RateLimitFallback = async ({ client, directory }) => {
|
|
|
654
137
|
message.includes("reduce concurrency");
|
|
655
138
|
if (isRateLimitRetry) {
|
|
656
139
|
// Try fallback on any attempt, handleRateLimitFallback will manage state
|
|
657
|
-
await handleRateLimitFallback(props.sessionID, "", "");
|
|
140
|
+
await fallbackHandler.handleRateLimitFallback(props.sessionID, "", "");
|
|
658
141
|
}
|
|
659
142
|
}
|
|
660
143
|
}
|
|
661
144
|
// Handle subagent session creation events
|
|
662
|
-
// Note: Using type assertion for subagent events since they may not be in the official Event union yet
|
|
663
145
|
const rawEvent = event;
|
|
664
146
|
if (isSubagentSessionCreatedEvent(rawEvent)) {
|
|
665
147
|
const { sessionID, parentSessionID } = rawEvent.properties;
|
|
666
148
|
if (config.enableSubagentFallback !== false) {
|
|
667
|
-
registerSubagent(sessionID, parentSessionID);
|
|
149
|
+
registerSubagent(sessionID, parentSessionID, config);
|
|
668
150
|
}
|
|
669
151
|
}
|
|
670
152
|
},
|
|
671
153
|
// Cleanup function to prevent memory leaks
|
|
672
154
|
cleanup: () => {
|
|
673
155
|
clearInterval(cleanupInterval);
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
// Clean up fallback messages
|
|
678
|
-
fallbackMessages.clear();
|
|
156
|
+
clearAllHierarchies();
|
|
157
|
+
metricsManager.destroy();
|
|
158
|
+
fallbackHandler.destroy();
|
|
679
159
|
},
|
|
680
160
|
};
|
|
681
161
|
};
|
|
682
162
|
export default RateLimitFallback;
|
|
683
|
-
|
|
163
|
+
export { MetricsManager } from "./src/metrics/MetricsManager.js";
|
|
164
|
+
export { createLogger } from "./logger.js";
|
package/dist/logger.d.ts
CHANGED
package/dist/logger.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@azumag/opencode-rate-limit-fallback",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.21.0",
|
|
4
4
|
"description": "OpenCode plugin that automatically switches to fallback models when rate limited",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -32,7 +32,10 @@
|
|
|
32
32
|
"test:coverage": "vitest run --coverage"
|
|
33
33
|
},
|
|
34
34
|
"files": [
|
|
35
|
-
"dist",
|
|
35
|
+
"dist/index.js",
|
|
36
|
+
"dist/index.d.ts",
|
|
37
|
+
"dist/logger.js",
|
|
38
|
+
"dist/logger.d.ts",
|
|
36
39
|
"README.md",
|
|
37
40
|
"LICENSE"
|
|
38
41
|
],
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AA0QlD,eAAO,MAAM,iBAAiB,EAAE,MAmmB/B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAiDD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,MAAM,GAAE,OAAO,CAAC,SAAS,CAAM,EAAE,SAAS,GAAE,MAA4B;IAmBpF;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,MAAM;IAUd;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,GAAG;IAcX;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;CAG7C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpF"}
|
package/dist/logger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../logger.ts"],"names":[],"mappings":"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"}
|