@cuylabs/agent-core 0.6.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/README.md +5 -1
- package/dist/{builder-BKkipazh.d.ts → builder-UpOWQMW3.d.ts} +2 -2
- package/dist/{chunk-3C4VKG4P.js → chunk-4BDA7DQY.js} +273 -807
- package/dist/chunk-7VKQ4WPB.js +73 -0
- package/dist/chunk-BFM2YHNM.js +222 -0
- package/dist/chunk-CAA7FHIH.js +280 -0
- package/dist/chunk-KUVSERLJ.js +50 -0
- package/dist/chunk-N6HWIEEA.js +423 -0
- package/dist/chunk-N7P4PN3O.js +84 -0
- package/dist/{chunk-QWFMX226.js → chunk-RFEKJKTO.js} +252 -13
- package/dist/chunk-RZITT45F.js +202 -0
- package/dist/{chunk-X635CM2F.js → chunk-SQU2AJHO.js} +1 -1
- package/dist/chunk-VNQBHPCT.js +398 -0
- package/dist/{chunk-QAQADS4X.js → chunk-WWYYNWEW.js} +2 -1
- package/dist/{chunk-O2ZCFQL6.js → chunk-YSLSEQ6B.js} +105 -220
- 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/host/index.d.ts +45 -0
- package/dist/host/index.js +8 -0
- package/dist/{index-DZQJD_hp.d.ts → index-CWSchSql.d.ts} +42 -51
- package/dist/index.d.ts +98 -190
- package/dist/index.js +476 -939
- package/dist/inference/index.d.ts +62 -0
- package/dist/inference/index.js +27 -0
- package/dist/llm-error-D93FNNLY.d.ts +32 -0
- package/dist/middleware/index.d.ts +246 -5
- package/dist/middleware/index.js +7 -3
- package/dist/models/index.d.ts +226 -3
- package/dist/models/index.js +41 -3
- package/dist/presets/index.d.ts +53 -0
- package/dist/presets/index.js +28 -0
- package/dist/prompt/index.d.ts +12 -7
- package/dist/reasoning/index.d.ts +53 -8
- package/dist/reasoning/index.js +2 -7
- package/dist/{registry-CuRWWtcT.d.ts → registry-DwYqsQkX.d.ts} +1 -1
- package/dist/{runner-G1wxEgac.d.ts → runner-e2YRcUoX.d.ts} +82 -148
- package/dist/runtime/index.d.ts +44 -7
- package/dist/runtime/index.js +16 -5
- package/dist/safety/index.d.ts +38 -0
- package/dist/safety/index.js +12 -0
- package/dist/scope/index.d.ts +10 -0
- package/dist/scope/index.js +14 -0
- package/dist/{session-manager-Uawm2Le7.d.ts → session-manager-B_CWGTsl.d.ts} +1 -1
- package/dist/signal/index.d.ts +28 -0
- package/dist/signal/index.js +6 -0
- package/dist/skill/index.d.ts +8 -5
- package/dist/storage/index.d.ts +2 -2
- package/dist/sub-agent/index.d.ts +17 -8
- package/dist/tool/index.d.ts +9 -4
- package/dist/tool/index.js +4 -3
- package/dist/tool-BHbyUAy3.d.ts +150 -0
- package/dist/{tool-DYp6-cC3.d.ts → tool-DLXAR9Ce.d.ts} +5 -99
- package/dist/tracking/index.d.ts +3 -1
- package/dist/{tool-pFAnJc5Y.d.ts → types-BfNpU8NS.d.ts} +1 -150
- package/dist/types-BnpEOYV-.d.ts +50 -0
- package/dist/types-CHiPh8U2.d.ts +100 -0
- package/dist/types-CQL-SvTn.d.ts +29 -0
- package/dist/types-CWm-7rvB.d.ts +55 -0
- package/dist/types-KKDrdU9Y.d.ts +325 -0
- package/dist/{resolver-DOfZ-xuk.d.ts → types-QA4WhEfz.d.ts} +1 -117
- package/dist/types-QKHHQLLq.d.ts +336 -0
- package/dist/types-YuWV4ag7.d.ts +72 -0
- package/package.json +74 -8
- package/dist/capabilities/index.d.ts +0 -97
- package/dist/capabilities/index.js +0 -46
- package/dist/chunk-6TDTQJ4P.js +0 -116
- package/dist/chunk-FG4MD5MU.js +0 -54
- package/dist/config-D2xeGEHK.d.ts +0 -52
- package/dist/identifiers-BLUxFqV_.d.ts +0 -12
- package/dist/index-ipP3_ztp.d.ts +0 -198
- package/dist/network-D76DS5ot.d.ts +0 -5
- package/dist/types-BWo810L_.d.ts +0 -648
|
@@ -3,7 +3,183 @@ import {
|
|
|
3
3
|
getProviderId
|
|
4
4
|
} from "./chunk-DWYX7ASF.js";
|
|
5
5
|
|
|
6
|
-
// src/
|
|
6
|
+
// src/models/resolver.ts
|
|
7
|
+
function parseKey(input) {
|
|
8
|
+
const [engineId, ...rest] = input.split("/");
|
|
9
|
+
if (!engineId || rest.length === 0) return null;
|
|
10
|
+
return { engineId, modelId: rest.join("/") };
|
|
11
|
+
}
|
|
12
|
+
function mergeSettings(base, override) {
|
|
13
|
+
return {
|
|
14
|
+
apiKey: override?.apiKey ?? base?.apiKey,
|
|
15
|
+
baseUrl: override?.baseUrl ?? base?.baseUrl,
|
|
16
|
+
headers: {
|
|
17
|
+
...base?.headers ?? {},
|
|
18
|
+
...override?.headers ?? {}
|
|
19
|
+
},
|
|
20
|
+
extra: {
|
|
21
|
+
...base?.extra ?? {},
|
|
22
|
+
...override?.extra ?? {}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function settingsKey(settings, adapter, engineId) {
|
|
27
|
+
return JSON.stringify({
|
|
28
|
+
engineId,
|
|
29
|
+
adapter,
|
|
30
|
+
apiKey: settings.apiKey ?? "",
|
|
31
|
+
baseUrl: settings.baseUrl ?? "",
|
|
32
|
+
headers: settings.headers ?? {},
|
|
33
|
+
extra: settings.extra ?? {}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function buildOptions(settings) {
|
|
37
|
+
const opts = { ...settings.extra ?? {} };
|
|
38
|
+
if (settings.apiKey) opts.apiKey = settings.apiKey;
|
|
39
|
+
if (settings.baseUrl) opts.baseURL = settings.baseUrl;
|
|
40
|
+
if (settings.headers && Object.keys(settings.headers).length > 0) opts.headers = settings.headers;
|
|
41
|
+
return opts;
|
|
42
|
+
}
|
|
43
|
+
async function createFactory(adapter, settings) {
|
|
44
|
+
const asModel = (m) => m;
|
|
45
|
+
const opts = buildOptions(settings);
|
|
46
|
+
switch (adapter) {
|
|
47
|
+
case "openai": {
|
|
48
|
+
const { createOpenAI } = await import("@ai-sdk/openai").catch(() => {
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Provider "@ai-sdk/openai" is required for the "openai" adapter. Install it with: pnpm add @ai-sdk/openai`
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
const provider = createOpenAI(opts);
|
|
54
|
+
return (modelId) => provider.languageModel(modelId);
|
|
55
|
+
}
|
|
56
|
+
case "anthropic": {
|
|
57
|
+
const { createAnthropic } = await import("@ai-sdk/anthropic").catch(() => {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`Provider "@ai-sdk/anthropic" is required for the "anthropic" adapter. Install it with: pnpm add @ai-sdk/anthropic`
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
const provider = createAnthropic(opts);
|
|
63
|
+
return (modelId) => provider.languageModel(modelId);
|
|
64
|
+
}
|
|
65
|
+
case "google": {
|
|
66
|
+
const { createGoogleGenerativeAI } = await import("@ai-sdk/google").catch(() => {
|
|
67
|
+
throw new Error(
|
|
68
|
+
`Provider "@ai-sdk/google" is required for the "google" adapter. Install it with: pnpm add @ai-sdk/google`
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
const provider = createGoogleGenerativeAI(opts);
|
|
72
|
+
return (modelId) => asModel(provider.languageModel(modelId));
|
|
73
|
+
}
|
|
74
|
+
case "openai-compatible": {
|
|
75
|
+
const { createOpenAICompatible } = await import("@ai-sdk/openai-compatible").catch(() => {
|
|
76
|
+
throw new Error(
|
|
77
|
+
`Provider "@ai-sdk/openai-compatible" is required for the "openai-compatible" adapter. Install it with: pnpm add @ai-sdk/openai-compatible`
|
|
78
|
+
);
|
|
79
|
+
});
|
|
80
|
+
const provider = createOpenAICompatible({
|
|
81
|
+
name: opts.name ?? "custom",
|
|
82
|
+
baseURL: opts.baseURL ?? "",
|
|
83
|
+
...opts.apiKey ? { apiKey: opts.apiKey } : {},
|
|
84
|
+
...opts.headers ? { headers: opts.headers } : {}
|
|
85
|
+
});
|
|
86
|
+
return (modelId) => provider.languageModel(modelId);
|
|
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
|
+
}
|
|
151
|
+
default:
|
|
152
|
+
throw new Error(`No factory registered for adapter: ${adapter}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function createResolver(directory) {
|
|
156
|
+
const factoryCache = /* @__PURE__ */ new Map();
|
|
157
|
+
return async (key) => {
|
|
158
|
+
const parsed = parseKey(key);
|
|
159
|
+
const entry = parsed ? void 0 : directory.entries?.[key];
|
|
160
|
+
const engineId = parsed?.engineId ?? entry?.engine;
|
|
161
|
+
const modelId = parsed?.modelId ?? entry?.id;
|
|
162
|
+
if (!engineId || !modelId) {
|
|
163
|
+
throw new Error(`Unknown model reference: ${key}`);
|
|
164
|
+
}
|
|
165
|
+
const engine = directory.engines[engineId];
|
|
166
|
+
if (!engine) {
|
|
167
|
+
throw new Error(`Unknown engine: ${engineId}`);
|
|
168
|
+
}
|
|
169
|
+
const settings = mergeSettings(engine.settings, entry?.settings);
|
|
170
|
+
if (engine.build) {
|
|
171
|
+
return engine.build(modelId, settings);
|
|
172
|
+
}
|
|
173
|
+
const cacheKey2 = settingsKey(settings, engine.adapter, engineId);
|
|
174
|
+
const cached = factoryCache.get(cacheKey2);
|
|
175
|
+
if (cached) return cached(modelId);
|
|
176
|
+
const factory = await createFactory(engine.adapter, settings);
|
|
177
|
+
factoryCache.set(cacheKey2, factory);
|
|
178
|
+
return factory(modelId);
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/models/types.ts
|
|
7
183
|
var SourcePriority = /* @__PURE__ */ ((SourcePriority3) => {
|
|
8
184
|
SourcePriority3[SourcePriority3["UserConfig"] = 0] = "UserConfig";
|
|
9
185
|
SourcePriority3[SourcePriority3["LocalCache"] = 1] = "LocalCache";
|
|
@@ -23,7 +199,7 @@ var DEFAULT_RESOLVER_OPTIONS = {
|
|
|
23
199
|
modelOverrides: {}
|
|
24
200
|
};
|
|
25
201
|
|
|
26
|
-
// src/
|
|
202
|
+
// src/models/profiles.ts
|
|
27
203
|
var REASONING_PATTERNS = [
|
|
28
204
|
// OpenAI o-series
|
|
29
205
|
{
|
|
@@ -110,6 +286,63 @@ var PROVIDER_PATTERNS = [
|
|
|
110
286
|
{ pattern: /^qwen/i, provider: "alibaba" },
|
|
111
287
|
{ pattern: /^command/i, provider: "cohere" }
|
|
112
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
|
+
}
|
|
113
346
|
function inferProvider(modelId) {
|
|
114
347
|
const normalized = modelId.toLowerCase();
|
|
115
348
|
for (const { pattern, provider } of PROVIDER_PATTERNS) {
|
|
@@ -160,7 +393,8 @@ var PatternCapabilitySource = class {
|
|
|
160
393
|
provider: match.rule.provider || provider || "unknown",
|
|
161
394
|
capabilities: {
|
|
162
395
|
...baseCapabilities,
|
|
163
|
-
...match.rule.capabilities
|
|
396
|
+
...match.rule.capabilities,
|
|
397
|
+
contextWindow: inferContextWindow(modelId)
|
|
164
398
|
},
|
|
165
399
|
compatibility: match.rule.compatibility
|
|
166
400
|
};
|
|
@@ -175,7 +409,10 @@ var PatternCapabilitySource = class {
|
|
|
175
409
|
id: modelId,
|
|
176
410
|
name: modelId,
|
|
177
411
|
provider: provider || "unknown",
|
|
178
|
-
capabilities:
|
|
412
|
+
capabilities: {
|
|
413
|
+
...baseCapabilities,
|
|
414
|
+
contextWindow: inferContextWindow(modelId)
|
|
415
|
+
}
|
|
179
416
|
},
|
|
180
417
|
source: this.priority,
|
|
181
418
|
confident: false
|
|
@@ -194,7 +431,7 @@ function getProviderCompatibility(modelId, provider) {
|
|
|
194
431
|
return match?.rule.compatibility;
|
|
195
432
|
}
|
|
196
433
|
|
|
197
|
-
// src/
|
|
434
|
+
// src/models/overrides.ts
|
|
198
435
|
function normalizeKey(value) {
|
|
199
436
|
const trimmed = value?.trim();
|
|
200
437
|
return trimmed && trimmed.length > 0 ? trimmed : void 0;
|
|
@@ -228,7 +465,7 @@ function applyCapabilityOverride(entry, override) {
|
|
|
228
465
|
};
|
|
229
466
|
}
|
|
230
467
|
|
|
231
|
-
// src/
|
|
468
|
+
// src/models/cache/adapters.ts
|
|
232
469
|
function isNodeEnvironment() {
|
|
233
470
|
return typeof process !== "undefined" && process.versions != null && process.versions.node != null;
|
|
234
471
|
}
|
|
@@ -325,7 +562,7 @@ function createCapabilityCacheAdapter(cachePath) {
|
|
|
325
562
|
return new MemoryAdapter();
|
|
326
563
|
}
|
|
327
564
|
|
|
328
|
-
// src/
|
|
565
|
+
// src/models/cache/types.ts
|
|
329
566
|
var CACHE_VERSION = 1;
|
|
330
567
|
function cacheKey(modelId, provider) {
|
|
331
568
|
return provider ? `${provider}:${modelId}` : modelId;
|
|
@@ -334,7 +571,7 @@ function isExpired(data) {
|
|
|
334
571
|
return Date.now() > new Date(data.expiresAt).getTime();
|
|
335
572
|
}
|
|
336
573
|
|
|
337
|
-
// src/
|
|
574
|
+
// src/models/cache/manager.ts
|
|
338
575
|
var CapabilityCache = class {
|
|
339
576
|
adapter;
|
|
340
577
|
memoryCache = /* @__PURE__ */ new Map();
|
|
@@ -436,7 +673,7 @@ var CacheCapabilitySource = class {
|
|
|
436
673
|
}
|
|
437
674
|
};
|
|
438
675
|
|
|
439
|
-
// src/
|
|
676
|
+
// src/models/remote/network.ts
|
|
440
677
|
function hasBrowserNetworkAPI() {
|
|
441
678
|
return typeof globalThis.navigator !== "undefined" && "onLine" in globalThis.navigator;
|
|
442
679
|
}
|
|
@@ -509,7 +746,7 @@ async function fetchWithTimeout(url, timeoutMs) {
|
|
|
509
746
|
}
|
|
510
747
|
}
|
|
511
748
|
|
|
512
|
-
// src/
|
|
749
|
+
// src/models/remote/transform.ts
|
|
513
750
|
function transformModelsDevEntry(raw) {
|
|
514
751
|
const capabilities = {
|
|
515
752
|
reasoning: raw.reasoning ?? false,
|
|
@@ -533,7 +770,7 @@ function transformModelsDevEntry(raw) {
|
|
|
533
770
|
};
|
|
534
771
|
}
|
|
535
772
|
|
|
536
|
-
// src/
|
|
773
|
+
// src/models/remote/fetcher.ts
|
|
537
774
|
var RemoteCapabilityFetcher = class {
|
|
538
775
|
apiUrl;
|
|
539
776
|
timeoutMs;
|
|
@@ -592,7 +829,7 @@ var RemoteCapabilityFetcher = class {
|
|
|
592
829
|
}
|
|
593
830
|
};
|
|
594
831
|
|
|
595
|
-
// src/
|
|
832
|
+
// src/models/remote/source.ts
|
|
596
833
|
var RemoteCapabilitySource = class {
|
|
597
834
|
priority = 4 /* RemoteAPI */;
|
|
598
835
|
name = "Remote API (models.dev)";
|
|
@@ -659,7 +896,7 @@ var RemoteCapabilitySource = class {
|
|
|
659
896
|
}
|
|
660
897
|
};
|
|
661
898
|
|
|
662
|
-
// src/
|
|
899
|
+
// src/models/capability-resolver.ts
|
|
663
900
|
function extractModelId(model) {
|
|
664
901
|
return getModelId(model);
|
|
665
902
|
}
|
|
@@ -858,8 +1095,10 @@ function configureResolver(options) {
|
|
|
858
1095
|
}
|
|
859
1096
|
|
|
860
1097
|
export {
|
|
1098
|
+
createResolver,
|
|
861
1099
|
SourcePriority,
|
|
862
1100
|
DEFAULT_RESOLVER_OPTIONS,
|
|
1101
|
+
inferContextWindow,
|
|
863
1102
|
inferProvider,
|
|
864
1103
|
PatternCapabilitySource,
|
|
865
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
|
+
};
|