@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 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
- //# sourceMappingURL=index.d.ts.map
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
- // Event type guards
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
- // Subagent event type guards
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
- const DEFAULT_FALLBACK_MODELS = [
32
- { providerID: "anthropic", modelID: "claude-3-5-sonnet-20250514" },
33
- { providerID: "google", modelID: "gemini-2.5-pro" },
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
- const rateLimitedModels = new Map();
188
- const retryState = new Map();
189
- const currentSessionModel = new Map();
190
- const fallbackInProgress = new Map(); // sessionID:messageID -> timestamp (message scope)
191
- const fallbackMessages = new Map(); // Track fallback messages for completion detection
192
- // Subagent session tracking
193
- const sessionHierarchies = new Map(); // rootSessionID -> SessionHierarchy
194
- const sessionToRootMap = new Map(); // sessionID -> rootSessionID
195
- const maxSubagentDepth = config.maxSubagentDepth ?? 10;
196
- // Helper functions for session hierarchy management
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
- const now = Date.now();
251
- for (const [sessionID, entry] of currentSessionModel.entries()) {
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
- // Check if this message is a fallback message and clear its in-progress state
636
- const fallbackKey = getStateKey(info.sessionID, info.id);
637
- const fallbackInfo = fallbackMessages.get(fallbackKey);
638
- if (fallbackInfo) {
639
- // Clear fallback in progress for this message
640
- fallbackInProgress.delete(fallbackKey);
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
- // Clean up all session hierarchies
675
- sessionHierarchies.clear();
676
- sessionToRootMap.clear();
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
- //# sourceMappingURL=index.js.map
163
+ export { MetricsManager } from "./src/metrics/MetricsManager.js";
164
+ export { createLogger } from "./logger.js";
package/dist/logger.d.ts CHANGED
@@ -57,4 +57,3 @@ export declare class Logger {
57
57
  * Create a new logger instance
58
58
  */
59
59
  export declare function createLogger(config?: Partial<LogConfig>, component?: string): Logger;
60
- //# sourceMappingURL=logger.d.ts.map
package/dist/logger.js CHANGED
@@ -150,4 +150,3 @@ export class Logger {
150
150
  export function createLogger(config, component) {
151
151
  return new Logger(config, component);
152
152
  }
153
- //# sourceMappingURL=logger.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azumag/opencode-rate-limit-fallback",
3
- "version": "1.16.0",
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
  ],
@@ -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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"}
@@ -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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../logger.ts"],"names":[],"mappings":"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"}