@cuylabs/agent-core 0.7.0 → 0.8.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/dist/{builder-BRvqCcIk.d.ts → builder-UpOWQMW3.d.ts} +2 -2
- package/dist/{chunk-3HNO5SVI.js → chunk-4BDA7DQY.js} +3 -3
- package/dist/chunk-BFM2YHNM.js +222 -0
- package/dist/chunk-CAA7FHIH.js +280 -0
- package/dist/chunk-DWYX7ASF.js +26 -0
- package/dist/chunk-KUVSERLJ.js +50 -0
- package/dist/{chunk-5K7AQVOU.js → chunk-N6HWIEEA.js} +8 -204
- package/dist/{chunk-QGOGIP7T.js → chunk-RFEKJKTO.js} +131 -25
- package/dist/chunk-RZITT45F.js +202 -0
- package/dist/{chunk-ZPMACVZK.js → chunk-SQU2AJHO.js} +1 -1
- package/dist/{chunk-BNSHUWCV.js → chunk-WWYYNWEW.js} +1 -1
- package/dist/{chunk-CDTV2UYU.js → chunk-YSLSEQ6B.js} +52 -252
- package/dist/context/index.js +1 -1
- package/dist/errors/index.d.ts +11 -0
- package/dist/errors/index.js +16 -0
- package/dist/events-CE72w8W4.d.ts +149 -0
- package/dist/{index-C33hlD6H.d.ts → index-CWSchSql.d.ts} +36 -50
- package/dist/index.d.ts +36 -109
- package/dist/index.js +213 -396
- package/dist/inference/index.d.ts +10 -7
- package/dist/inference/index.js +7 -5
- package/dist/llm-error-D93FNNLY.d.ts +32 -0
- package/dist/middleware/index.d.ts +245 -7
- package/dist/middleware/index.js +3 -1
- package/dist/models/index.d.ts +125 -4
- package/dist/models/index.js +7 -3
- package/dist/presets/index.d.ts +53 -0
- package/dist/presets/index.js +28 -0
- package/dist/prompt/index.d.ts +10 -8
- package/dist/reasoning/index.d.ts +1 -2
- package/dist/reasoning/index.js +3 -7
- package/dist/{registry-BDLIHOQB.d.ts → registry-DwYqsQkX.d.ts} +1 -1
- package/dist/{runner-DSKaEz3z.d.ts → runner-e2YRcUoX.d.ts} +58 -151
- package/dist/runtime/index.d.ts +11 -8
- package/dist/runtime/index.js +9 -7
- package/dist/safety/index.d.ts +38 -0
- package/dist/safety/index.js +12 -0
- package/dist/scope/index.d.ts +2 -2
- package/dist/signal/index.d.ts +28 -0
- package/dist/signal/index.js +6 -0
- package/dist/skill/index.d.ts +7 -6
- package/dist/sub-agent/index.d.ts +14 -9
- package/dist/tool/index.d.ts +7 -5
- package/dist/tool/index.js +2 -2
- package/dist/tool-BHbyUAy3.d.ts +150 -0
- package/dist/{tool-HUtkiVBx.d.ts → tool-DLXAR9Ce.d.ts} +1 -1
- package/dist/tracking/index.d.ts +2 -2
- package/dist/{tool-Db1Ue-1U.d.ts → types-BfNpU8NS.d.ts} +1 -150
- package/dist/types-BnpEOYV-.d.ts +50 -0
- package/dist/{types-9jGQUjqW.d.ts → types-CQL-SvTn.d.ts} +1 -1
- package/dist/types-CWm-7rvB.d.ts +55 -0
- package/dist/{types-FRpzzg_9.d.ts → types-KKDrdU9Y.d.ts} +5 -35
- package/dist/{capability-resolver-CgRGsWVX.d.ts → types-QA4WhEfz.d.ts} +1 -117
- package/dist/{types-CqDZTh4d.d.ts → types-QKHHQLLq.d.ts} +5 -4
- package/dist/types-YuWV4ag7.d.ts +72 -0
- package/package.json +58 -3
- package/dist/index-CfBGYrpd.d.ts +0 -317
- package/dist/{chunk-IEFIQENH.js → chunk-7VKQ4WPB.js} +4 -4
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
buildReasoningOptionsSync
|
|
3
|
-
} from "./chunk-ZPMACVZK.js";
|
|
4
1
|
import {
|
|
5
2
|
executeAgentToolCall
|
|
6
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7VKQ4WPB.js";
|
|
4
|
+
import {
|
|
5
|
+
buildReasoningOptionsSync
|
|
6
|
+
} from "./chunk-SQU2AJHO.js";
|
|
7
7
|
import {
|
|
8
8
|
snapshotScope
|
|
9
9
|
} from "./chunk-N7P4PN3O.js";
|
|
10
|
+
import {
|
|
11
|
+
LLMError,
|
|
12
|
+
isRetryable
|
|
13
|
+
} from "./chunk-RZITT45F.js";
|
|
10
14
|
|
|
11
15
|
// src/inference/toolset.ts
|
|
12
16
|
import { tool, zodSchema } from "ai";
|
|
@@ -44,200 +48,6 @@ import {
|
|
|
44
48
|
streamText
|
|
45
49
|
} from "ai";
|
|
46
50
|
|
|
47
|
-
// src/errors/classify.ts
|
|
48
|
-
function isRetryableCategory(category) {
|
|
49
|
-
switch (category) {
|
|
50
|
-
case "rate_limit":
|
|
51
|
-
case "overloaded":
|
|
52
|
-
case "network":
|
|
53
|
-
case "timeout":
|
|
54
|
-
return true;
|
|
55
|
-
case "auth":
|
|
56
|
-
case "invalid_request":
|
|
57
|
-
case "context_overflow":
|
|
58
|
-
case "content_filter":
|
|
59
|
-
case "cancelled":
|
|
60
|
-
case "unknown":
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
function classifyFromStatusAndMessage(status, message) {
|
|
65
|
-
const lowerMessage = message.toLowerCase();
|
|
66
|
-
if (status) {
|
|
67
|
-
if (status === 429) return "rate_limit";
|
|
68
|
-
if (status === 401 || status === 403) return "auth";
|
|
69
|
-
if (status === 400) {
|
|
70
|
-
if (lowerMessage.includes("context") || lowerMessage.includes("token")) {
|
|
71
|
-
return "context_overflow";
|
|
72
|
-
}
|
|
73
|
-
return "invalid_request";
|
|
74
|
-
}
|
|
75
|
-
if (status === 503 || status === 502) return "overloaded";
|
|
76
|
-
if (status >= 500) return "network";
|
|
77
|
-
}
|
|
78
|
-
if (lowerMessage.includes("rate") && lowerMessage.includes("limit")) {
|
|
79
|
-
return "rate_limit";
|
|
80
|
-
}
|
|
81
|
-
if (lowerMessage.includes("overload") || lowerMessage.includes("capacity")) {
|
|
82
|
-
return "overloaded";
|
|
83
|
-
}
|
|
84
|
-
if (lowerMessage.includes("too_many_requests")) {
|
|
85
|
-
return "rate_limit";
|
|
86
|
-
}
|
|
87
|
-
if (lowerMessage.includes("unauthorized") || lowerMessage.includes("invalid api key")) {
|
|
88
|
-
return "auth";
|
|
89
|
-
}
|
|
90
|
-
if (lowerMessage.includes("context") && lowerMessage.includes("length")) {
|
|
91
|
-
return "context_overflow";
|
|
92
|
-
}
|
|
93
|
-
if (lowerMessage.includes("content") && lowerMessage.includes("filter")) {
|
|
94
|
-
return "content_filter";
|
|
95
|
-
}
|
|
96
|
-
if (lowerMessage.includes("timeout") || lowerMessage.includes("timed out")) {
|
|
97
|
-
return "timeout";
|
|
98
|
-
}
|
|
99
|
-
if (lowerMessage.includes("network") || lowerMessage.includes("econnrefused") || lowerMessage.includes("econnreset")) {
|
|
100
|
-
return "network";
|
|
101
|
-
}
|
|
102
|
-
return "unknown";
|
|
103
|
-
}
|
|
104
|
-
function parseRetryDelay(headers) {
|
|
105
|
-
const retryAfterMs = headers["retry-after-ms"];
|
|
106
|
-
if (retryAfterMs) {
|
|
107
|
-
const parsed = parseFloat(retryAfterMs);
|
|
108
|
-
if (!Number.isNaN(parsed) && parsed > 0) {
|
|
109
|
-
return parsed;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
const retryAfter = headers["retry-after"];
|
|
113
|
-
if (retryAfter) {
|
|
114
|
-
const seconds = parseFloat(retryAfter);
|
|
115
|
-
if (!Number.isNaN(seconds) && seconds > 0) {
|
|
116
|
-
return Math.ceil(seconds * 1e3);
|
|
117
|
-
}
|
|
118
|
-
const dateMs = Date.parse(retryAfter);
|
|
119
|
-
if (!Number.isNaN(dateMs)) {
|
|
120
|
-
const delayMs = dateMs - Date.now();
|
|
121
|
-
if (delayMs > 0) {
|
|
122
|
-
return Math.ceil(delayMs);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return void 0;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// src/errors/extract.ts
|
|
130
|
-
function extractFromAISDKError(error) {
|
|
131
|
-
const result = {};
|
|
132
|
-
const anyError = error;
|
|
133
|
-
if (typeof anyError.status === "number") {
|
|
134
|
-
result.status = anyError.status;
|
|
135
|
-
} else if (typeof anyError.statusCode === "number") {
|
|
136
|
-
result.status = anyError.statusCode;
|
|
137
|
-
}
|
|
138
|
-
if (anyError.responseHeaders && typeof anyError.responseHeaders === "object") {
|
|
139
|
-
result.headers = anyError.responseHeaders;
|
|
140
|
-
} else if (anyError.headers && typeof anyError.headers === "object") {
|
|
141
|
-
result.headers = anyError.headers;
|
|
142
|
-
}
|
|
143
|
-
if (anyError.data && typeof anyError.data === "object") {
|
|
144
|
-
const data = anyError.data;
|
|
145
|
-
if (data.type === "error" && typeof data.error === "object") {
|
|
146
|
-
const innerError = data.error;
|
|
147
|
-
if (innerError.type === "too_many_requests") {
|
|
148
|
-
result.category = "rate_limit";
|
|
149
|
-
} else if (innerError.type === "overloaded") {
|
|
150
|
-
result.category = "overloaded";
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
if (typeof data.isRetryable === "boolean" && !data.isRetryable && !result.category) {
|
|
154
|
-
result.category = "invalid_request";
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return result;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// src/errors/llm-error.ts
|
|
161
|
-
var LLMError = class _LLMError extends Error {
|
|
162
|
-
category;
|
|
163
|
-
status;
|
|
164
|
-
headers;
|
|
165
|
-
provider;
|
|
166
|
-
model;
|
|
167
|
-
isRetryable;
|
|
168
|
-
retryDelayMs;
|
|
169
|
-
constructor(options) {
|
|
170
|
-
super(options.message, { cause: options.cause });
|
|
171
|
-
this.name = "LLMError";
|
|
172
|
-
this.status = options.status;
|
|
173
|
-
this.headers = options.headers;
|
|
174
|
-
this.provider = options.provider;
|
|
175
|
-
this.model = options.model;
|
|
176
|
-
this.category = options.category ?? classifyFromStatusAndMessage(
|
|
177
|
-
options.status,
|
|
178
|
-
options.message
|
|
179
|
-
);
|
|
180
|
-
this.isRetryable = isRetryableCategory(this.category);
|
|
181
|
-
this.retryDelayMs = this.headers ? parseRetryDelay(this.headers) : void 0;
|
|
182
|
-
}
|
|
183
|
-
static from(error, context) {
|
|
184
|
-
if (error instanceof _LLMError) {
|
|
185
|
-
return error;
|
|
186
|
-
}
|
|
187
|
-
if (error instanceof Error) {
|
|
188
|
-
if (error.name === "AbortError" || error.message.includes("abort")) {
|
|
189
|
-
return new _LLMError({
|
|
190
|
-
message: error.message,
|
|
191
|
-
category: "cancelled",
|
|
192
|
-
cause: error,
|
|
193
|
-
...context
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
return new _LLMError({
|
|
197
|
-
message: error.message,
|
|
198
|
-
cause: error,
|
|
199
|
-
...extractFromAISDKError(error),
|
|
200
|
-
...context
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
return new _LLMError({
|
|
204
|
-
message: String(error),
|
|
205
|
-
category: "unknown",
|
|
206
|
-
...context
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
get description() {
|
|
210
|
-
const parts = [this.message];
|
|
211
|
-
if (this.provider) parts.unshift(`[${this.provider}]`);
|
|
212
|
-
if (this.status) parts.push(`(HTTP ${this.status})`);
|
|
213
|
-
if (this.isRetryable && this.retryDelayMs) {
|
|
214
|
-
parts.push(`retry in ${Math.ceil(this.retryDelayMs / 1e3)}s`);
|
|
215
|
-
}
|
|
216
|
-
return parts.join(" ");
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
// src/errors/utils.ts
|
|
221
|
-
function isRetryable(error) {
|
|
222
|
-
if (error instanceof LLMError) {
|
|
223
|
-
return error.isRetryable;
|
|
224
|
-
}
|
|
225
|
-
return LLMError.from(error).isRetryable;
|
|
226
|
-
}
|
|
227
|
-
function getRetryDelay(error) {
|
|
228
|
-
if (error instanceof LLMError) {
|
|
229
|
-
return error.isRetryable ? error.retryDelayMs : void 0;
|
|
230
|
-
}
|
|
231
|
-
const llmError = LLMError.from(error);
|
|
232
|
-
return llmError.isRetryable ? llmError.retryDelayMs : void 0;
|
|
233
|
-
}
|
|
234
|
-
function getErrorCategory(error) {
|
|
235
|
-
if (error instanceof LLMError) {
|
|
236
|
-
return error.category;
|
|
237
|
-
}
|
|
238
|
-
return LLMError.from(error).category;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
51
|
// src/retry.ts
|
|
242
52
|
var DEFAULT_RETRY_CONFIG = {
|
|
243
53
|
maxAttempts: 3,
|
|
@@ -596,12 +406,6 @@ var LLM = Inference;
|
|
|
596
406
|
|
|
597
407
|
export {
|
|
598
408
|
buildToolSet,
|
|
599
|
-
isRetryableCategory,
|
|
600
|
-
parseRetryDelay,
|
|
601
|
-
LLMError,
|
|
602
|
-
isRetryable,
|
|
603
|
-
getRetryDelay,
|
|
604
|
-
getErrorCategory,
|
|
605
409
|
DEFAULT_RETRY_CONFIG,
|
|
606
410
|
createRetryState,
|
|
607
411
|
calculateDelay,
|
|
@@ -1,24 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
return String(model.modelId);
|
|
6
|
-
}
|
|
7
|
-
return String(model);
|
|
8
|
-
}
|
|
9
|
-
function getProviderId(model) {
|
|
10
|
-
if (typeof model === "string") {
|
|
11
|
-
if (model.includes("/")) {
|
|
12
|
-
return model.split("/")[0];
|
|
13
|
-
}
|
|
14
|
-
return void 0;
|
|
15
|
-
}
|
|
16
|
-
if (typeof model === "object" && model !== null && "provider" in model) {
|
|
17
|
-
const provider = String(model.provider);
|
|
18
|
-
return provider.split(".")[0];
|
|
19
|
-
}
|
|
20
|
-
return void 0;
|
|
21
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
getModelId,
|
|
3
|
+
getProviderId
|
|
4
|
+
} from "./chunk-DWYX7ASF.js";
|
|
22
5
|
|
|
23
6
|
// src/models/resolver.ts
|
|
24
7
|
function parseKey(input) {
|
|
@@ -102,6 +85,69 @@ async function createFactory(adapter, settings) {
|
|
|
102
85
|
});
|
|
103
86
|
return (modelId) => provider.languageModel(modelId);
|
|
104
87
|
}
|
|
88
|
+
case "openrouter": {
|
|
89
|
+
const { createOpenRouter } = await import("@openrouter/ai-sdk-provider").catch(() => {
|
|
90
|
+
throw new Error(
|
|
91
|
+
`Provider "@openrouter/ai-sdk-provider" is required for the "openrouter" adapter. Install it with: pnpm add @openrouter/ai-sdk-provider`
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
const provider = createOpenRouter(opts);
|
|
95
|
+
return (modelId) => asModel(provider.languageModel(modelId));
|
|
96
|
+
}
|
|
97
|
+
case "azure": {
|
|
98
|
+
const { createAzure } = await import("@ai-sdk/azure").catch(() => {
|
|
99
|
+
throw new Error(
|
|
100
|
+
`Provider "@ai-sdk/azure" is required for the "azure" adapter. Install it with: pnpm add @ai-sdk/azure`
|
|
101
|
+
);
|
|
102
|
+
});
|
|
103
|
+
const provider = createAzure(opts);
|
|
104
|
+
return (modelId) => provider.languageModel(modelId);
|
|
105
|
+
}
|
|
106
|
+
case "bedrock": {
|
|
107
|
+
const { createAmazonBedrock } = await import("@ai-sdk/amazon-bedrock").catch(() => {
|
|
108
|
+
throw new Error(
|
|
109
|
+
`Provider "@ai-sdk/amazon-bedrock" is required for the "bedrock" adapter. Install it with: pnpm add @ai-sdk/amazon-bedrock`
|
|
110
|
+
);
|
|
111
|
+
});
|
|
112
|
+
const provider = createAmazonBedrock(opts);
|
|
113
|
+
return (modelId) => provider.languageModel(modelId);
|
|
114
|
+
}
|
|
115
|
+
case "vertex": {
|
|
116
|
+
const { createVertex } = await import("@ai-sdk/google-vertex").catch(() => {
|
|
117
|
+
throw new Error(
|
|
118
|
+
`Provider "@ai-sdk/google-vertex" is required for the "vertex" adapter. Install it with: pnpm add @ai-sdk/google-vertex`
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
const provider = createVertex(opts);
|
|
122
|
+
return (modelId) => asModel(provider.languageModel(modelId));
|
|
123
|
+
}
|
|
124
|
+
case "xai": {
|
|
125
|
+
const { createXai } = await import("@ai-sdk/xai").catch(() => {
|
|
126
|
+
throw new Error(
|
|
127
|
+
`Provider "@ai-sdk/xai" is required for the "xai" adapter. Install it with: pnpm add @ai-sdk/xai`
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
const provider = createXai(opts);
|
|
131
|
+
return (modelId) => provider.languageModel(modelId);
|
|
132
|
+
}
|
|
133
|
+
case "mistral": {
|
|
134
|
+
const { createMistral } = await import("@ai-sdk/mistral").catch(() => {
|
|
135
|
+
throw new Error(
|
|
136
|
+
`Provider "@ai-sdk/mistral" is required for the "mistral" adapter. Install it with: pnpm add @ai-sdk/mistral`
|
|
137
|
+
);
|
|
138
|
+
});
|
|
139
|
+
const provider = createMistral(opts);
|
|
140
|
+
return (modelId) => provider.languageModel(modelId);
|
|
141
|
+
}
|
|
142
|
+
case "groq": {
|
|
143
|
+
const { createGroq } = await import("@ai-sdk/groq").catch(() => {
|
|
144
|
+
throw new Error(
|
|
145
|
+
`Provider "@ai-sdk/groq" is required for the "groq" adapter. Install it with: pnpm add @ai-sdk/groq`
|
|
146
|
+
);
|
|
147
|
+
});
|
|
148
|
+
const provider = createGroq(opts);
|
|
149
|
+
return (modelId) => provider.languageModel(modelId);
|
|
150
|
+
}
|
|
105
151
|
default:
|
|
106
152
|
throw new Error(`No factory registered for adapter: ${adapter}`);
|
|
107
153
|
}
|
|
@@ -240,6 +286,63 @@ var PROVIDER_PATTERNS = [
|
|
|
240
286
|
{ pattern: /^qwen/i, provider: "alibaba" },
|
|
241
287
|
{ pattern: /^command/i, provider: "cohere" }
|
|
242
288
|
];
|
|
289
|
+
var CONTEXT_WINDOW_PROFILES = [
|
|
290
|
+
// Anthropic Claude 4.x — 200k
|
|
291
|
+
{ pattern: /claude[_-]?(opus|sonnet)[_-]?4/i, tokens: 2e5 },
|
|
292
|
+
// Anthropic Claude 3.5 — 200k
|
|
293
|
+
{ pattern: /claude[_-]?3[._-]?5/i, tokens: 2e5 },
|
|
294
|
+
// Anthropic Claude 3 Opus/Sonnet/Haiku — 200k
|
|
295
|
+
{ pattern: /claude[_-]?3/i, tokens: 2e5 },
|
|
296
|
+
// Anthropic Claude 2 — 100k
|
|
297
|
+
{ pattern: /claude[_-]?2/i, tokens: 1e5 },
|
|
298
|
+
// OpenAI o-series (o1, o3, o4) — 200k
|
|
299
|
+
{ pattern: /^o[134]-?(mini|pro|preview)?$/i, tokens: 2e5 },
|
|
300
|
+
// OpenAI GPT-5.x — 1M
|
|
301
|
+
{ pattern: /gpt-?5/i, tokens: 1e6 },
|
|
302
|
+
// OpenAI GPT-4o — 128k
|
|
303
|
+
{ pattern: /gpt-?4o/i, tokens: 128e3 },
|
|
304
|
+
// OpenAI GPT-4 turbo — 128k
|
|
305
|
+
{ pattern: /gpt-?4[_-]?turbo/i, tokens: 128e3 },
|
|
306
|
+
// OpenAI GPT-4 — 8k (original)
|
|
307
|
+
{ pattern: /gpt-?4(?!o|[_-]?turbo)/i, tokens: 8192 },
|
|
308
|
+
// OpenAI GPT-3.5 turbo — 16k
|
|
309
|
+
{ pattern: /gpt-?3[._-]?5/i, tokens: 16384 },
|
|
310
|
+
// Google Gemini 2.5 Pro — 1M
|
|
311
|
+
{ pattern: /gemini[_-]?2[._-]?5[_-]?pro/i, tokens: 1e6 },
|
|
312
|
+
// Google Gemini 2.x Flash — 1M
|
|
313
|
+
{ pattern: /gemini[_-]?2.*flash/i, tokens: 1e6 },
|
|
314
|
+
// Google Gemini 2.x Pro — 1M
|
|
315
|
+
{ pattern: /gemini[_-]?2[._-]?\d?[_-]?pro/i, tokens: 1e6 },
|
|
316
|
+
// Google Gemini 1.5 Pro/Flash — 1M
|
|
317
|
+
{ pattern: /gemini[_-]?1[._-]?5/i, tokens: 1e6 },
|
|
318
|
+
// xAI Grok 3+ — 128k
|
|
319
|
+
{ pattern: /grok[_-]?\d/i, tokens: 128e3 },
|
|
320
|
+
// Mistral Large — 128k
|
|
321
|
+
{ pattern: /mistral[_-]?large/i, tokens: 128e3 },
|
|
322
|
+
// Mistral Medium — 32k
|
|
323
|
+
{ pattern: /mistral[_-]?medium/i, tokens: 32768 },
|
|
324
|
+
// Codestral — 256k
|
|
325
|
+
{ pattern: /codestral/i, tokens: 256e3 },
|
|
326
|
+
// Mistral generic — 32k
|
|
327
|
+
{ pattern: /mistral|mixtral/i, tokens: 32768 },
|
|
328
|
+
// DeepSeek R1/V3 — 128k
|
|
329
|
+
{ pattern: /deepseek/i, tokens: 128e3 },
|
|
330
|
+
// Qwen 3 — 128k
|
|
331
|
+
{ pattern: /qwen/i, tokens: 128e3 },
|
|
332
|
+
// Meta Llama 3 — 128k
|
|
333
|
+
{ pattern: /llama[_-]?3/i, tokens: 128e3 },
|
|
334
|
+
// Cohere Command R+ — 128k
|
|
335
|
+
{ pattern: /command[_-]?r/i, tokens: 128e3 }
|
|
336
|
+
];
|
|
337
|
+
function inferContextWindow(modelId) {
|
|
338
|
+
const normalized = modelId.toLowerCase();
|
|
339
|
+
for (const { pattern, tokens } of CONTEXT_WINDOW_PROFILES) {
|
|
340
|
+
if (pattern.test(normalized)) {
|
|
341
|
+
return tokens;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return void 0;
|
|
345
|
+
}
|
|
243
346
|
function inferProvider(modelId) {
|
|
244
347
|
const normalized = modelId.toLowerCase();
|
|
245
348
|
for (const { pattern, provider } of PROVIDER_PATTERNS) {
|
|
@@ -290,7 +393,8 @@ var PatternCapabilitySource = class {
|
|
|
290
393
|
provider: match.rule.provider || provider || "unknown",
|
|
291
394
|
capabilities: {
|
|
292
395
|
...baseCapabilities,
|
|
293
|
-
...match.rule.capabilities
|
|
396
|
+
...match.rule.capabilities,
|
|
397
|
+
contextWindow: inferContextWindow(modelId)
|
|
294
398
|
},
|
|
295
399
|
compatibility: match.rule.compatibility
|
|
296
400
|
};
|
|
@@ -305,7 +409,10 @@ var PatternCapabilitySource = class {
|
|
|
305
409
|
id: modelId,
|
|
306
410
|
name: modelId,
|
|
307
411
|
provider: provider || "unknown",
|
|
308
|
-
capabilities:
|
|
412
|
+
capabilities: {
|
|
413
|
+
...baseCapabilities,
|
|
414
|
+
contextWindow: inferContextWindow(modelId)
|
|
415
|
+
}
|
|
309
416
|
},
|
|
310
417
|
source: this.priority,
|
|
311
418
|
confident: false
|
|
@@ -988,11 +1095,10 @@ function configureResolver(options) {
|
|
|
988
1095
|
}
|
|
989
1096
|
|
|
990
1097
|
export {
|
|
991
|
-
getModelId,
|
|
992
|
-
getProviderId,
|
|
993
1098
|
createResolver,
|
|
994
1099
|
SourcePriority,
|
|
995
1100
|
DEFAULT_RESOLVER_OPTIONS,
|
|
1101
|
+
inferContextWindow,
|
|
996
1102
|
inferProvider,
|
|
997
1103
|
PatternCapabilitySource,
|
|
998
1104
|
likelySupportsReasoning,
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// src/errors/classify.ts
|
|
2
|
+
function isRetryableCategory(category) {
|
|
3
|
+
switch (category) {
|
|
4
|
+
case "rate_limit":
|
|
5
|
+
case "overloaded":
|
|
6
|
+
case "network":
|
|
7
|
+
case "timeout":
|
|
8
|
+
return true;
|
|
9
|
+
case "auth":
|
|
10
|
+
case "invalid_request":
|
|
11
|
+
case "context_overflow":
|
|
12
|
+
case "content_filter":
|
|
13
|
+
case "cancelled":
|
|
14
|
+
case "unknown":
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function classifyFromStatusAndMessage(status, message) {
|
|
19
|
+
const lowerMessage = message.toLowerCase();
|
|
20
|
+
if (status) {
|
|
21
|
+
if (status === 429) return "rate_limit";
|
|
22
|
+
if (status === 401 || status === 403) return "auth";
|
|
23
|
+
if (status === 400) {
|
|
24
|
+
if (lowerMessage.includes("context") || lowerMessage.includes("token")) {
|
|
25
|
+
return "context_overflow";
|
|
26
|
+
}
|
|
27
|
+
return "invalid_request";
|
|
28
|
+
}
|
|
29
|
+
if (status === 503 || status === 502) return "overloaded";
|
|
30
|
+
if (status >= 500) return "network";
|
|
31
|
+
}
|
|
32
|
+
if (lowerMessage.includes("rate") && lowerMessage.includes("limit")) {
|
|
33
|
+
return "rate_limit";
|
|
34
|
+
}
|
|
35
|
+
if (lowerMessage.includes("overload") || lowerMessage.includes("capacity")) {
|
|
36
|
+
return "overloaded";
|
|
37
|
+
}
|
|
38
|
+
if (lowerMessage.includes("too_many_requests")) {
|
|
39
|
+
return "rate_limit";
|
|
40
|
+
}
|
|
41
|
+
if (lowerMessage.includes("unauthorized") || lowerMessage.includes("invalid api key")) {
|
|
42
|
+
return "auth";
|
|
43
|
+
}
|
|
44
|
+
if (lowerMessage.includes("context") && lowerMessage.includes("length")) {
|
|
45
|
+
return "context_overflow";
|
|
46
|
+
}
|
|
47
|
+
if (lowerMessage.includes("content") && lowerMessage.includes("filter")) {
|
|
48
|
+
return "content_filter";
|
|
49
|
+
}
|
|
50
|
+
if (lowerMessage.includes("timeout") || lowerMessage.includes("timed out")) {
|
|
51
|
+
return "timeout";
|
|
52
|
+
}
|
|
53
|
+
if (lowerMessage.includes("network") || lowerMessage.includes("econnrefused") || lowerMessage.includes("econnreset")) {
|
|
54
|
+
return "network";
|
|
55
|
+
}
|
|
56
|
+
return "unknown";
|
|
57
|
+
}
|
|
58
|
+
function parseRetryDelay(headers) {
|
|
59
|
+
const retryAfterMs = headers["retry-after-ms"];
|
|
60
|
+
if (retryAfterMs) {
|
|
61
|
+
const parsed = parseFloat(retryAfterMs);
|
|
62
|
+
if (!Number.isNaN(parsed) && parsed > 0) {
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const retryAfter = headers["retry-after"];
|
|
67
|
+
if (retryAfter) {
|
|
68
|
+
const seconds = parseFloat(retryAfter);
|
|
69
|
+
if (!Number.isNaN(seconds) && seconds > 0) {
|
|
70
|
+
return Math.ceil(seconds * 1e3);
|
|
71
|
+
}
|
|
72
|
+
const dateMs = Date.parse(retryAfter);
|
|
73
|
+
if (!Number.isNaN(dateMs)) {
|
|
74
|
+
const delayMs = dateMs - Date.now();
|
|
75
|
+
if (delayMs > 0) {
|
|
76
|
+
return Math.ceil(delayMs);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return void 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// src/errors/extract.ts
|
|
84
|
+
function extractFromAISDKError(error) {
|
|
85
|
+
const result = {};
|
|
86
|
+
const anyError = error;
|
|
87
|
+
if (typeof anyError.status === "number") {
|
|
88
|
+
result.status = anyError.status;
|
|
89
|
+
} else if (typeof anyError.statusCode === "number") {
|
|
90
|
+
result.status = anyError.statusCode;
|
|
91
|
+
}
|
|
92
|
+
if (anyError.responseHeaders && typeof anyError.responseHeaders === "object") {
|
|
93
|
+
result.headers = anyError.responseHeaders;
|
|
94
|
+
} else if (anyError.headers && typeof anyError.headers === "object") {
|
|
95
|
+
result.headers = anyError.headers;
|
|
96
|
+
}
|
|
97
|
+
if (anyError.data && typeof anyError.data === "object") {
|
|
98
|
+
const data = anyError.data;
|
|
99
|
+
if (data.type === "error" && typeof data.error === "object") {
|
|
100
|
+
const innerError = data.error;
|
|
101
|
+
if (innerError.type === "too_many_requests") {
|
|
102
|
+
result.category = "rate_limit";
|
|
103
|
+
} else if (innerError.type === "overloaded") {
|
|
104
|
+
result.category = "overloaded";
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (typeof data.isRetryable === "boolean" && !data.isRetryable && !result.category) {
|
|
108
|
+
result.category = "invalid_request";
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// src/errors/llm-error.ts
|
|
115
|
+
var LLMError = class _LLMError extends Error {
|
|
116
|
+
category;
|
|
117
|
+
status;
|
|
118
|
+
headers;
|
|
119
|
+
provider;
|
|
120
|
+
model;
|
|
121
|
+
isRetryable;
|
|
122
|
+
retryDelayMs;
|
|
123
|
+
constructor(options) {
|
|
124
|
+
super(options.message, { cause: options.cause });
|
|
125
|
+
this.name = "LLMError";
|
|
126
|
+
this.status = options.status;
|
|
127
|
+
this.headers = options.headers;
|
|
128
|
+
this.provider = options.provider;
|
|
129
|
+
this.model = options.model;
|
|
130
|
+
this.category = options.category ?? classifyFromStatusAndMessage(
|
|
131
|
+
options.status,
|
|
132
|
+
options.message
|
|
133
|
+
);
|
|
134
|
+
this.isRetryable = isRetryableCategory(this.category);
|
|
135
|
+
this.retryDelayMs = this.headers ? parseRetryDelay(this.headers) : void 0;
|
|
136
|
+
}
|
|
137
|
+
static from(error, context) {
|
|
138
|
+
if (error instanceof _LLMError) {
|
|
139
|
+
return error;
|
|
140
|
+
}
|
|
141
|
+
if (error instanceof Error) {
|
|
142
|
+
if (error.name === "AbortError" || error.message.includes("abort")) {
|
|
143
|
+
return new _LLMError({
|
|
144
|
+
message: error.message,
|
|
145
|
+
category: "cancelled",
|
|
146
|
+
cause: error,
|
|
147
|
+
...context
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return new _LLMError({
|
|
151
|
+
message: error.message,
|
|
152
|
+
cause: error,
|
|
153
|
+
...extractFromAISDKError(error),
|
|
154
|
+
...context
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return new _LLMError({
|
|
158
|
+
message: String(error),
|
|
159
|
+
category: "unknown",
|
|
160
|
+
...context
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
get description() {
|
|
164
|
+
const parts = [this.message];
|
|
165
|
+
if (this.provider) parts.unshift(`[${this.provider}]`);
|
|
166
|
+
if (this.status) parts.push(`(HTTP ${this.status})`);
|
|
167
|
+
if (this.isRetryable && this.retryDelayMs) {
|
|
168
|
+
parts.push(`retry in ${Math.ceil(this.retryDelayMs / 1e3)}s`);
|
|
169
|
+
}
|
|
170
|
+
return parts.join(" ");
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// src/errors/utils.ts
|
|
175
|
+
function isRetryable(error) {
|
|
176
|
+
if (error instanceof LLMError) {
|
|
177
|
+
return error.isRetryable;
|
|
178
|
+
}
|
|
179
|
+
return LLMError.from(error).isRetryable;
|
|
180
|
+
}
|
|
181
|
+
function getRetryDelay(error) {
|
|
182
|
+
if (error instanceof LLMError) {
|
|
183
|
+
return error.isRetryable ? error.retryDelayMs : void 0;
|
|
184
|
+
}
|
|
185
|
+
const llmError = LLMError.from(error);
|
|
186
|
+
return llmError.isRetryable ? llmError.retryDelayMs : void 0;
|
|
187
|
+
}
|
|
188
|
+
function getErrorCategory(error) {
|
|
189
|
+
if (error instanceof LLMError) {
|
|
190
|
+
return error.category;
|
|
191
|
+
}
|
|
192
|
+
return LLMError.from(error).category;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export {
|
|
196
|
+
isRetryableCategory,
|
|
197
|
+
parseRetryDelay,
|
|
198
|
+
LLMError,
|
|
199
|
+
isRetryable,
|
|
200
|
+
getRetryDelay,
|
|
201
|
+
getErrorCategory
|
|
202
|
+
};
|