@vybestack/llxprt-code-core 0.4.3 → 0.4.5
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 +8 -0
- package/dist/prompt-config/defaults/default-prompts.json +42 -0
- package/dist/src/config/config.d.ts +2 -6
- package/dist/src/config/config.js +60 -17
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/index.d.ts +1 -1
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/core/client.d.ts +10 -6
- package/dist/src/core/client.js +128 -68
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +6 -5
- package/dist/src/core/geminiChat.js +90 -56
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/prompts.js +8 -3
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/prompt-config/TemplateEngine.js +46 -9
- package/dist/src/prompt-config/TemplateEngine.js.map +1 -1
- package/dist/src/prompt-config/defaults/core-defaults.js +15 -1
- package/dist/src/prompt-config/defaults/core-defaults.js.map +1 -1
- package/dist/src/prompt-config/defaults/core.md +15 -1
- package/dist/src/prompt-config/defaults/manifest-loader.d.ts +9 -0
- package/dist/src/prompt-config/defaults/manifest-loader.js +98 -0
- package/dist/src/prompt-config/defaults/manifest-loader.js.map +1 -0
- package/dist/src/prompt-config/defaults/prompt-warnings.d.ts +8 -0
- package/dist/src/prompt-config/defaults/prompt-warnings.js +29 -0
- package/dist/src/prompt-config/defaults/prompt-warnings.js.map +1 -0
- package/dist/src/prompt-config/defaults/provider-defaults.js +15 -1
- package/dist/src/prompt-config/defaults/provider-defaults.js.map +1 -1
- package/dist/src/prompt-config/defaults/providers/anthropic/core.md +16 -0
- package/dist/src/prompt-config/defaults/providers/gemini/core.md +7 -2
- package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +6 -2
- package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/gemini-2-5-flash/core.md +6 -2
- package/dist/src/prompt-config/defaults/providers/openai/core.md +16 -0
- package/dist/src/prompt-config/defaults/providers/openai/tools/todo-pause.md +1 -1
- package/dist/src/prompt-config/defaults/tool-defaults.js +14 -1
- package/dist/src/prompt-config/defaults/tool-defaults.js.map +1 -1
- package/dist/src/prompt-config/defaults/tools/memory.md +1 -1
- package/dist/src/prompt-config/defaults/tools/save-memory.md +1 -0
- package/dist/src/prompt-config/defaults/tools/todo-pause.md +28 -0
- package/dist/src/prompt-config/types.d.ts +3 -0
- package/dist/src/providers/BaseProvider.d.ts +4 -0
- package/dist/src/providers/BaseProvider.js +18 -0
- package/dist/src/providers/BaseProvider.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.d.ts +2 -0
- package/dist/src/providers/anthropic/AnthropicProvider.js +30 -1
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.d.ts +3 -0
- package/dist/src/providers/gemini/GeminiProvider.js +105 -80
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.d.ts +10 -5
- package/dist/src/providers/openai/OpenAIProvider.js +291 -62
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/providers/openai/parseResponsesStream.js +14 -3
- package/dist/src/providers/openai/parseResponsesStream.js.map +1 -1
- package/dist/src/providers/openai-responses/OpenAIResponsesProvider.d.ts +2 -0
- package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js +42 -12
- package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js.map +1 -1
- package/dist/src/services/complexity-analyzer.d.ts +10 -1
- package/dist/src/services/complexity-analyzer.js +57 -10
- package/dist/src/services/complexity-analyzer.js.map +1 -1
- package/dist/src/services/history/HistoryService.d.ts +8 -0
- package/dist/src/services/history/HistoryService.js +37 -4
- package/dist/src/services/history/HistoryService.js.map +1 -1
- package/dist/src/services/todo-reminder-service.d.ts +5 -0
- package/dist/src/services/todo-reminder-service.js +26 -3
- package/dist/src/services/todo-reminder-service.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +0 -1
- package/dist/src/telemetry/constants.js +0 -1
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +2 -2
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +1 -2
- package/dist/src/telemetry/loggers.js +1 -17
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +1 -7
- package/dist/src/telemetry/types.js +0 -10
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +9 -0
- package/dist/src/tools/mcp-tool.js +13 -1
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/tool-registry.js +7 -8
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/utils/errorParsing.js +70 -5
- package/dist/src/utils/errorParsing.js.map +1 -1
- package/dist/src/utils/retry.d.ts +4 -2
- package/dist/src/utils/retry.js +129 -86
- package/dist/src/utils/retry.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,6 +7,7 @@ import { isProQuotaExceededError, isGenericQuotaExceededError, isApiError, isStr
|
|
|
7
7
|
import { DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_FLASH_MODEL, } from '../config/models.js';
|
|
8
8
|
import { UserTierId } from '../code_assist/types.js';
|
|
9
9
|
import { AuthType } from '../core/contentGenerator.js';
|
|
10
|
+
import { getErrorStatus, STREAM_INTERRUPTED_ERROR_CODE } from './retry.js';
|
|
10
11
|
// Free Tier message functions
|
|
11
12
|
const getRateLimitErrorMessageGoogleFree = (fallbackModel = DEFAULT_GEMINI_FLASH_MODEL) => `\nPossible quota limitations in place or slow response times detected. Switching to the ${fallbackModel} model for the rest of this session.`;
|
|
12
13
|
const getRateLimitErrorMessageGoogleProQuotaFree = (currentModel = DEFAULT_GEMINI_MODEL, fallbackModel = DEFAULT_GEMINI_FLASH_MODEL) => `\nYou have reached your daily ${currentModel} quota limit. You will be switched to the ${fallbackModel} model for the rest of this session. To increase your limits, upgrade to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist, or use /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
|
|
@@ -18,6 +19,48 @@ const getRateLimitErrorMessageGoogleGenericQuotaPaid = (currentModel = DEFAULT_G
|
|
|
18
19
|
const RATE_LIMIT_ERROR_MESSAGE_USE_GEMINI = '\nPlease wait and try again later. To increase your limits, request a quota increase through AI Studio, or switch to another /auth method';
|
|
19
20
|
const RATE_LIMIT_ERROR_MESSAGE_VERTEX = '\nPlease wait and try again later. To increase your limits, request a quota increase through Vertex, or switch to another /auth method';
|
|
20
21
|
const getRateLimitErrorMessageDefault = (fallbackModel = DEFAULT_GEMINI_FLASH_MODEL) => `\nPossible quota limitations in place or slow response times detected. Switching to the ${fallbackModel} model for the rest of this session.`;
|
|
22
|
+
function buildStatusSuffix(status, statusLabel) {
|
|
23
|
+
const parts = [];
|
|
24
|
+
if (typeof status === 'number' && Number.isFinite(status)) {
|
|
25
|
+
parts.push(String(status));
|
|
26
|
+
}
|
|
27
|
+
if (typeof statusLabel === 'string') {
|
|
28
|
+
const trimmed = statusLabel.trim();
|
|
29
|
+
if (trimmed.length > 0 && !parts.includes(trimmed)) {
|
|
30
|
+
parts.push(trimmed);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (parts.length === 0) {
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
return ` (Status: ${parts.join(', ')})`;
|
|
37
|
+
}
|
|
38
|
+
function formatErrorMessageWithStatus(message, status, statusLabel) {
|
|
39
|
+
if (message.includes('(Status:')) {
|
|
40
|
+
return message;
|
|
41
|
+
}
|
|
42
|
+
const suffix = buildStatusSuffix(status, statusLabel);
|
|
43
|
+
if (!suffix) {
|
|
44
|
+
return message;
|
|
45
|
+
}
|
|
46
|
+
return `${message}${suffix}`;
|
|
47
|
+
}
|
|
48
|
+
function getErrorCodeFromUnknown(error) {
|
|
49
|
+
if (typeof error === 'object' && error !== null) {
|
|
50
|
+
if ('code' in error &&
|
|
51
|
+
typeof error.code === 'string') {
|
|
52
|
+
return error.code;
|
|
53
|
+
}
|
|
54
|
+
if ('error' in error &&
|
|
55
|
+
typeof error.error === 'object' &&
|
|
56
|
+
error.error !== null &&
|
|
57
|
+
'code' in error.error &&
|
|
58
|
+
typeof error.error.code === 'string') {
|
|
59
|
+
return error.error.code;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
21
64
|
function getRateLimitMessage(authType, error, userTier, currentModel, fallbackModel) {
|
|
22
65
|
switch (authType) {
|
|
23
66
|
case AuthType.LOGIN_WITH_GOOGLE: {
|
|
@@ -48,19 +91,32 @@ function getRateLimitMessage(authType, error, userTier, currentModel, fallbackMo
|
|
|
48
91
|
}
|
|
49
92
|
}
|
|
50
93
|
export function parseAndFormatApiError(error, authType, userTier, currentModel, fallbackModel) {
|
|
94
|
+
const errorCode = getErrorCodeFromUnknown(error);
|
|
95
|
+
if (errorCode === STREAM_INTERRUPTED_ERROR_CODE) {
|
|
96
|
+
const baseMessage = typeof error === 'object' &&
|
|
97
|
+
error !== null &&
|
|
98
|
+
'message' in error &&
|
|
99
|
+
typeof error.message === 'string'
|
|
100
|
+
? error.message
|
|
101
|
+
: 'Streaming parse error: model response contained malformed data.';
|
|
102
|
+
const formattedMessage = formatErrorMessageWithStatus(baseMessage, undefined, 'STREAM_INTERRUPTED');
|
|
103
|
+
return `[API Error: ${formattedMessage}]\nStreaming data from the provider became invalid before the response completed. Please retry.`;
|
|
104
|
+
}
|
|
51
105
|
// For provider auth type, don't add Gemini-specific rate limit messages
|
|
52
106
|
if (authType === AuthType.USE_PROVIDER) {
|
|
53
107
|
if (isStructuredError(error)) {
|
|
54
|
-
|
|
55
|
-
|
|
108
|
+
const status = getErrorStatus(error);
|
|
109
|
+
let text = `[API Error: ${formatErrorMessageWithStatus(error.message, status)}]`;
|
|
110
|
+
if (status === 429) {
|
|
56
111
|
text += '\nRate limit exceeded. Please wait and try again later.';
|
|
57
112
|
}
|
|
58
113
|
return text;
|
|
59
114
|
}
|
|
60
115
|
}
|
|
61
116
|
if (isStructuredError(error)) {
|
|
62
|
-
|
|
63
|
-
|
|
117
|
+
const status = getErrorStatus(error);
|
|
118
|
+
let text = `[API Error: ${formatErrorMessageWithStatus(error.message, status)}]`;
|
|
119
|
+
if (status === 429) {
|
|
64
120
|
text += getRateLimitMessage(authType, error, userTier, currentModel, fallbackModel);
|
|
65
121
|
}
|
|
66
122
|
return text;
|
|
@@ -86,7 +142,12 @@ export function parseAndFormatApiError(error, authType, userTier, currentModel,
|
|
|
86
142
|
catch (_e) {
|
|
87
143
|
// It's not a nested JSON error, so we just use the message as is.
|
|
88
144
|
}
|
|
89
|
-
|
|
145
|
+
const statusSuffix = buildStatusSuffix(typeof parsedError.error.code === 'number'
|
|
146
|
+
? parsedError.error.code
|
|
147
|
+
: undefined, typeof parsedError.error.status === 'string'
|
|
148
|
+
? parsedError.error.status
|
|
149
|
+
: undefined);
|
|
150
|
+
let text = `[API Error: ${finalMessage}${statusSuffix}]`;
|
|
90
151
|
if (parsedError.error.code === 429) {
|
|
91
152
|
// For provider auth type, use generic rate limit message
|
|
92
153
|
if (authType === AuthType.USE_PROVIDER) {
|
|
@@ -104,6 +165,10 @@ export function parseAndFormatApiError(error, authType, userTier, currentModel,
|
|
|
104
165
|
}
|
|
105
166
|
return `[API Error: ${error}]`;
|
|
106
167
|
}
|
|
168
|
+
const fallbackStatusSuffix = buildStatusSuffix(getErrorStatus(error));
|
|
169
|
+
if (fallbackStatusSuffix) {
|
|
170
|
+
return `[API Error: An unknown error occurred.${fallbackStatusSuffix}]`;
|
|
171
|
+
}
|
|
107
172
|
return '[API Error: An unknown error occurred.]';
|
|
108
173
|
}
|
|
109
174
|
//# sourceMappingURL=errorParsing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorParsing.js","sourceRoot":"","sources":["../../../src/utils/errorParsing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,UAAU,EACV,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"errorParsing.js","sourceRoot":"","sources":["../../../src/utils/errorParsing.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,10 +12,12 @@ export interface RetryOptions {
|
|
|
12
12
|
initialDelayMs: number;
|
|
13
13
|
maxDelayMs: number;
|
|
14
14
|
shouldRetry: (error: Error) => boolean;
|
|
15
|
-
onPersistent429?: (authType?: string, error?: unknown) => Promise<string | boolean | null>;
|
|
16
|
-
authType?: string;
|
|
17
15
|
trackThrottleWaitTime?: (waitTimeMs: number) => void;
|
|
18
16
|
}
|
|
17
|
+
export declare const STREAM_INTERRUPTED_ERROR_CODE = "LLXPRT_STREAM_INTERRUPTED";
|
|
18
|
+
export declare function createStreamInterruptionError(message: string, details?: Record<string, unknown>, cause?: unknown): Error;
|
|
19
|
+
export declare function getErrorCode(error: unknown): string | undefined;
|
|
20
|
+
export declare function isNetworkTransientError(error: unknown): boolean;
|
|
19
21
|
/**
|
|
20
22
|
* Retries a function with exponential backoff and jitter.
|
|
21
23
|
* @param fn The asynchronous function to retry.
|
package/dist/src/utils/retry.js
CHANGED
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
* @plan PLAN-20250909-TOKTRACK.P08
|
|
6
6
|
*/
|
|
7
|
-
import { AuthType } from '../core/contentGenerator.js';
|
|
8
|
-
import { isProQuotaExceededError, isGenericQuotaExceededError, } from './quotaErrorDetection.js';
|
|
9
7
|
import { DebugLogger } from '../debug/index.js';
|
|
10
8
|
const DEFAULT_RETRY_OPTIONS = {
|
|
11
9
|
maxAttempts: 5,
|
|
@@ -13,6 +11,131 @@ const DEFAULT_RETRY_OPTIONS = {
|
|
|
13
11
|
maxDelayMs: 30000, // 30 seconds
|
|
14
12
|
shouldRetry: defaultShouldRetry,
|
|
15
13
|
};
|
|
14
|
+
export const STREAM_INTERRUPTED_ERROR_CODE = 'LLXPRT_STREAM_INTERRUPTED';
|
|
15
|
+
const TRANSIENT_ERROR_PHRASES = [
|
|
16
|
+
'connection error',
|
|
17
|
+
'connection terminated',
|
|
18
|
+
'connection reset',
|
|
19
|
+
'socket hang up',
|
|
20
|
+
'socket hung up',
|
|
21
|
+
'socket closed',
|
|
22
|
+
'socket timeout',
|
|
23
|
+
'network timeout',
|
|
24
|
+
'network error',
|
|
25
|
+
'fetch failed',
|
|
26
|
+
'request aborted',
|
|
27
|
+
'request timeout',
|
|
28
|
+
'stream closed',
|
|
29
|
+
'stream prematurely closed',
|
|
30
|
+
'read econnreset',
|
|
31
|
+
'write econnreset',
|
|
32
|
+
];
|
|
33
|
+
const TRANSIENT_ERROR_REGEXES = [
|
|
34
|
+
/econn(reset|refused|aborted)/i,
|
|
35
|
+
/etimedout/i,
|
|
36
|
+
/und_err_(socket|connect|headers_timeout|body_timeout)/i,
|
|
37
|
+
/tcp connection.*(reset|closed)/i,
|
|
38
|
+
];
|
|
39
|
+
const TRANSIENT_ERROR_CODES = new Set([
|
|
40
|
+
'ECONNRESET',
|
|
41
|
+
'ECONNREFUSED',
|
|
42
|
+
'ECONNABORTED',
|
|
43
|
+
'ENETUNREACH',
|
|
44
|
+
'EHOSTUNREACH',
|
|
45
|
+
'ETIMEDOUT',
|
|
46
|
+
'EPIPE',
|
|
47
|
+
'EAI_AGAIN',
|
|
48
|
+
'UND_ERR_SOCKET',
|
|
49
|
+
'UND_ERR_CONNECT_TIMEOUT',
|
|
50
|
+
'UND_ERR_HEADERS_TIMEOUT',
|
|
51
|
+
'UND_ERR_BODY_TIMEOUT',
|
|
52
|
+
STREAM_INTERRUPTED_ERROR_CODE,
|
|
53
|
+
]);
|
|
54
|
+
function collectErrorDetails(error) {
|
|
55
|
+
const messages = [];
|
|
56
|
+
const codes = [];
|
|
57
|
+
const stack = [error];
|
|
58
|
+
const visited = new Set();
|
|
59
|
+
while (stack.length > 0) {
|
|
60
|
+
const current = stack.pop();
|
|
61
|
+
if (current === null || current === undefined) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (typeof current === 'string') {
|
|
65
|
+
messages.push(current);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (typeof current !== 'object') {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (visited.has(current)) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
visited.add(current);
|
|
75
|
+
const errorObject = current;
|
|
76
|
+
if ('message' in errorObject && typeof errorObject.message === 'string') {
|
|
77
|
+
messages.push(errorObject.message);
|
|
78
|
+
}
|
|
79
|
+
if ('code' in errorObject && typeof errorObject.code === 'string') {
|
|
80
|
+
codes.push(errorObject.code);
|
|
81
|
+
}
|
|
82
|
+
const possibleNestedErrors = [
|
|
83
|
+
errorObject.cause,
|
|
84
|
+
errorObject.originalError,
|
|
85
|
+
errorObject.error,
|
|
86
|
+
];
|
|
87
|
+
for (const nested of possibleNestedErrors) {
|
|
88
|
+
if (nested && nested !== current) {
|
|
89
|
+
stack.push(nested);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { messages, codes };
|
|
94
|
+
}
|
|
95
|
+
export function createStreamInterruptionError(message, details, cause) {
|
|
96
|
+
const error = new Error(message);
|
|
97
|
+
error.name = 'StreamInterruptionError';
|
|
98
|
+
error.code = STREAM_INTERRUPTED_ERROR_CODE;
|
|
99
|
+
if (details) {
|
|
100
|
+
error.details = details;
|
|
101
|
+
}
|
|
102
|
+
if (cause && !error.cause) {
|
|
103
|
+
error.cause = cause;
|
|
104
|
+
}
|
|
105
|
+
return error;
|
|
106
|
+
}
|
|
107
|
+
export function getErrorCode(error) {
|
|
108
|
+
if (typeof error === 'object' && error !== null) {
|
|
109
|
+
if ('code' in error &&
|
|
110
|
+
typeof error.code === 'string') {
|
|
111
|
+
return error.code;
|
|
112
|
+
}
|
|
113
|
+
if ('error' in error &&
|
|
114
|
+
typeof error.error === 'object' &&
|
|
115
|
+
error.error !== null &&
|
|
116
|
+
'code' in error.error &&
|
|
117
|
+
typeof error.error.code === 'string') {
|
|
118
|
+
return error.error.code;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
export function isNetworkTransientError(error) {
|
|
124
|
+
const { messages, codes } = collectErrorDetails(error);
|
|
125
|
+
const lowerMessages = messages.map((msg) => msg.toLowerCase());
|
|
126
|
+
if (lowerMessages.some((msg) => TRANSIENT_ERROR_PHRASES.some((phrase) => msg.includes(phrase)))) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
if (messages.some((msg) => TRANSIENT_ERROR_REGEXES.some((regex) => regex.test(msg)))) {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
if (codes
|
|
133
|
+
.map((code) => code.toUpperCase())
|
|
134
|
+
.some((code) => TRANSIENT_ERROR_CODES.has(code))) {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
16
139
|
/**
|
|
17
140
|
* Default predicate function to determine if a retry should be attempted.
|
|
18
141
|
* Retries on 429 (Too Many Requests) and 5xx server errors.
|
|
@@ -33,6 +156,9 @@ function defaultShouldRetry(error) {
|
|
|
33
156
|
if (error.message.match(/5\d{2}/))
|
|
34
157
|
return true;
|
|
35
158
|
}
|
|
159
|
+
if (isNetworkTransientError(error)) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
36
162
|
return false;
|
|
37
163
|
}
|
|
38
164
|
/**
|
|
@@ -51,14 +177,13 @@ function delay(ms) {
|
|
|
51
177
|
* @throws The last error encountered if all attempts fail.
|
|
52
178
|
*/
|
|
53
179
|
export async function retryWithBackoff(fn, options) {
|
|
54
|
-
const { maxAttempts, initialDelayMs, maxDelayMs,
|
|
180
|
+
const { maxAttempts, initialDelayMs, maxDelayMs, shouldRetry } = {
|
|
55
181
|
...DEFAULT_RETRY_OPTIONS,
|
|
56
182
|
...options,
|
|
57
183
|
};
|
|
58
184
|
const logger = new DebugLogger('llxprt:retry');
|
|
59
185
|
let attempt = 0;
|
|
60
186
|
let currentDelay = initialDelayMs;
|
|
61
|
-
let consecutive429Count = 0;
|
|
62
187
|
while (attempt < maxAttempts) {
|
|
63
188
|
attempt++;
|
|
64
189
|
try {
|
|
@@ -66,88 +191,6 @@ export async function retryWithBackoff(fn, options) {
|
|
|
66
191
|
}
|
|
67
192
|
catch (error) {
|
|
68
193
|
const errorStatus = getErrorStatus(error);
|
|
69
|
-
// Check for Pro quota exceeded error first - immediate fallback for OAuth users
|
|
70
|
-
if (errorStatus === 429 &&
|
|
71
|
-
authType === AuthType.LOGIN_WITH_GOOGLE &&
|
|
72
|
-
isProQuotaExceededError(error) &&
|
|
73
|
-
onPersistent429) {
|
|
74
|
-
try {
|
|
75
|
-
const fallbackModel = await onPersistent429(authType, error);
|
|
76
|
-
if (fallbackModel !== false && fallbackModel !== null) {
|
|
77
|
-
// Reset attempt counter and try with new model
|
|
78
|
-
attempt = 0;
|
|
79
|
-
consecutive429Count = 0;
|
|
80
|
-
currentDelay = initialDelayMs;
|
|
81
|
-
// With the model updated, we continue to the next attempt
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
// Fallback handler returned null/false, meaning don't continue - stop retry process
|
|
86
|
-
throw error;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch (fallbackError) {
|
|
90
|
-
// If fallback fails, continue with original error
|
|
91
|
-
logger.debug(() => `Fallback to Flash model failed: ${fallbackError}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Check for generic quota exceeded error (but not Pro, which was handled above) - immediate fallback for OAuth users
|
|
95
|
-
if (errorStatus === 429 &&
|
|
96
|
-
authType === AuthType.LOGIN_WITH_GOOGLE &&
|
|
97
|
-
!isProQuotaExceededError(error) &&
|
|
98
|
-
isGenericQuotaExceededError(error) &&
|
|
99
|
-
onPersistent429) {
|
|
100
|
-
try {
|
|
101
|
-
const fallbackModel = await onPersistent429(authType, error);
|
|
102
|
-
if (fallbackModel !== false && fallbackModel !== null) {
|
|
103
|
-
// Reset attempt counter and try with new model
|
|
104
|
-
attempt = 0;
|
|
105
|
-
consecutive429Count = 0;
|
|
106
|
-
currentDelay = initialDelayMs;
|
|
107
|
-
// With the model updated, we continue to the next attempt
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
// Fallback handler returned null/false, meaning don't continue - stop retry process
|
|
112
|
-
throw error;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
catch (fallbackError) {
|
|
116
|
-
// If fallback fails, continue with original error
|
|
117
|
-
logger.debug(() => `Fallback to Flash model failed: ${fallbackError}`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
// Track consecutive 429 errors
|
|
121
|
-
if (errorStatus === 429) {
|
|
122
|
-
consecutive429Count++;
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
consecutive429Count = 0;
|
|
126
|
-
}
|
|
127
|
-
// If we have persistent 429s and a fallback callback for OAuth
|
|
128
|
-
if (consecutive429Count >= 2 &&
|
|
129
|
-
onPersistent429 &&
|
|
130
|
-
authType === AuthType.LOGIN_WITH_GOOGLE) {
|
|
131
|
-
try {
|
|
132
|
-
const fallbackModel = await onPersistent429(authType, error);
|
|
133
|
-
if (fallbackModel !== false && fallbackModel !== null) {
|
|
134
|
-
// Reset attempt counter and try with new model
|
|
135
|
-
attempt = 0;
|
|
136
|
-
consecutive429Count = 0;
|
|
137
|
-
currentDelay = initialDelayMs;
|
|
138
|
-
// With the model updated, we continue to the next attempt
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
// Fallback handler returned null/false, meaning don't continue - stop retry process
|
|
143
|
-
throw error;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
catch (fallbackError) {
|
|
147
|
-
// If fallback fails, continue with original error
|
|
148
|
-
logger.debug(() => `Fallback to Flash model failed: ${fallbackError}`);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
194
|
// Check if we've exhausted retries or shouldn't retry
|
|
152
195
|
if (attempt >= maxAttempts || !shouldRetry(error)) {
|
|
153
196
|
throw error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"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"}
|