@em3odme/agentic 0.1.0 → 0.1.1

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/package.json CHANGED
@@ -1,9 +1,8 @@
1
1
  {
2
2
  "name": "@em3odme/agentic",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
- "module": "dist/index.mjs",
7
6
  "types": "dist/index.d.ts",
8
7
  "scripts": {
9
8
  "prepare": "husky",
package/dist/index.cjs DELETED
@@ -1,782 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- ConfigurationError: () => ConfigurationError,
24
- ModelRunner: () => ModelRunner,
25
- ProviderError: () => ProviderError,
26
- cloudflareAIModel: () => cloudflareAIModel,
27
- groqAIModel: () => groqAIModel
28
- });
29
- module.exports = __toCommonJS(index_exports);
30
-
31
- // src/providers/cloudflare.ts
32
- var cloudflareAIModel = (model) => ({
33
- provider: "cloudflare",
34
- model
35
- });
36
-
37
- // src/providers/groq.ts
38
- var groqAIModel = (model) => ({
39
- provider: "groq",
40
- model
41
- });
42
-
43
- // src/types.ts
44
- var ProviderError = class extends Error {
45
- constructor(message, provider, statusCode, originalError) {
46
- super(message);
47
- this.provider = provider;
48
- this.statusCode = statusCode;
49
- this.originalError = originalError;
50
- this.name = "ProviderError";
51
- }
52
- };
53
- var ConfigurationError = class extends Error {
54
- constructor(message, provider) {
55
- super(message);
56
- this.provider = provider;
57
- this.name = "ConfigurationError";
58
- }
59
- };
60
-
61
- // src/providers/BaseModelProvider.ts
62
- var BaseModelProvider = class {
63
- constructor(environment) {
64
- this.environment = environment;
65
- }
66
- validateRequiredKeys(envKeys) {
67
- const missing = envKeys.filter((key) => !this.environment[key]);
68
- if (missing.length > 0) {
69
- throw new ConfigurationError(
70
- `Missing required environment variables: ${missing.join(", ")}`,
71
- this.providerType
72
- );
73
- }
74
- }
75
- createError(message, statusCode, originalError) {
76
- return new ProviderError(
77
- message,
78
- this.providerType,
79
- statusCode,
80
- originalError
81
- );
82
- }
83
- buildUsageObject(promptTokens, completionTokens, totalTokens) {
84
- return {
85
- promptTokens,
86
- completionTokens,
87
- totalTokens
88
- };
89
- }
90
- filterDuplicateToolCalls(toolCalls) {
91
- const seen = /* @__PURE__ */ new Set();
92
- return toolCalls.filter((toolCall) => {
93
- const key = toolCall.function.name;
94
- if (seen.has(key)) {
95
- return false;
96
- }
97
- seen.add(key);
98
- return true;
99
- });
100
- }
101
- };
102
-
103
- // src/providers/utils.ts
104
- var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
105
- async function runWithRetry(fn, maxRetries = 3, delayMs = 1e3, info) {
106
- for (let i = 0; i < maxRetries; i++) {
107
- try {
108
- return await fn();
109
- } catch (error) {
110
- const isRetryable = error instanceof Error && (error.message?.includes("1031") || error.toString().includes("1031") || error.message?.includes("500"));
111
- if (isRetryable && i < maxRetries - 1) {
112
- if (info)
113
- info(`AI Error (1031/500). Retrying ${i + 1}/${maxRetries}...`);
114
- await delay(delayMs * (i + 1));
115
- continue;
116
- }
117
- throw error;
118
- }
119
- }
120
- }
121
-
122
- // src/providers/CloudflareProvider.ts
123
- var CloudflareProvider = class extends BaseModelProvider {
124
- constructor(environment) {
125
- super(environment);
126
- this.providerType = "cloudflare";
127
- this.validateRequiredKeys(["AI"]);
128
- }
129
- supportsJsonMode() {
130
- return true;
131
- }
132
- supportsTools() {
133
- return true;
134
- }
135
- async execute(request) {
136
- const payload = {
137
- messages: request.messages,
138
- ...request.options
139
- };
140
- if (request.jsonMode) {
141
- payload.response_format = { type: "json_object" };
142
- }
143
- try {
144
- const response = await runWithRetry(
145
- async () => {
146
- return this.environment.AI.run(
147
- request.model,
148
- payload
149
- );
150
- },
151
- 3,
152
- 1e3
153
- );
154
- return this.parseResponse(response);
155
- } catch (error) {
156
- throw this.createError(
157
- `Cloudflare AI execution failed: ${error instanceof Error ? error.message : "Unknown error"}`,
158
- void 0,
159
- error
160
- );
161
- }
162
- }
163
- parseResponse(response) {
164
- const content = this.extractContent(response);
165
- const toolCalls = this.extractToolCalls(response);
166
- const usage = this.buildUsageObject(0, 0, 0);
167
- return {
168
- content,
169
- toolCalls,
170
- raw: response,
171
- usage
172
- };
173
- }
174
- extractContent(response) {
175
- if (typeof response === "string") {
176
- return response;
177
- }
178
- if (response && typeof response === "object") {
179
- if ("response" in response) {
180
- return String(response.response || "");
181
- }
182
- }
183
- return "";
184
- }
185
- extractToolCalls(response) {
186
- if (!response || typeof response !== "object") {
187
- return [];
188
- }
189
- const toolCalls = response.tool_calls;
190
- if (!Array.isArray(toolCalls) || toolCalls.length === 0) {
191
- return [];
192
- }
193
- return toolCalls.map((toolCall, index) => {
194
- const tc = toolCall;
195
- const args = tc.arguments;
196
- const argsString = typeof args === "string" ? args : JSON.stringify(args);
197
- return {
198
- id: `tool-call-${index}`,
199
- type: "function",
200
- function: {
201
- name: String(tc.name || ""),
202
- arguments: argsString
203
- }
204
- };
205
- });
206
- }
207
- };
208
-
209
- // src/providers/GroqProvider.ts
210
- var GroqProvider = class extends BaseModelProvider {
211
- constructor(environment) {
212
- super(environment);
213
- this.providerType = "groq";
214
- this.apiEndpoint = "https://api.groq.com/openai/v1/chat/completions";
215
- this.validateRequiredKeys(["GROQ_API_KEY"]);
216
- }
217
- supportsJsonMode() {
218
- return true;
219
- }
220
- supportsTools() {
221
- return true;
222
- }
223
- async execute(request) {
224
- const payload = this.buildPayload(request);
225
- try {
226
- const response = await this.makeRequest(payload);
227
- return this.parseResponse(response);
228
- } catch (error) {
229
- if (error instanceof Response) {
230
- const errorText = await error.text();
231
- throw this.createError(
232
- `Groq API Error (${error.status}): ${errorText}. Model: ${request.model}`,
233
- error.status,
234
- errorText
235
- );
236
- }
237
- throw this.createError(
238
- `Groq execution failed: ${error instanceof Error ? error.message : "Unknown error"}`,
239
- void 0,
240
- error
241
- );
242
- }
243
- }
244
- buildPayload(request) {
245
- const payload = {
246
- model: request.model,
247
- messages: request.messages,
248
- ...request.options
249
- };
250
- if (request.options?.tools) {
251
- payload.tool_choice = "auto";
252
- }
253
- if (request.jsonMode && !request.options?.tools) {
254
- payload.response_format = { type: "json_object" };
255
- }
256
- return payload;
257
- }
258
- async makeRequest(payload) {
259
- const response = await runWithRetry(
260
- async () => {
261
- return fetch(this.apiEndpoint, {
262
- method: "POST",
263
- headers: {
264
- Authorization: `Bearer ${this.environment.GROQ_API_KEY}`,
265
- "Content-Type": "application/json"
266
- },
267
- body: JSON.stringify(payload)
268
- });
269
- },
270
- 3,
271
- 1e3
272
- );
273
- if (!response) {
274
- throw this.createError(
275
- `Groq execution failed: No response from Groq API`,
276
- void 0,
277
- void 0
278
- );
279
- }
280
- return response?.json();
281
- }
282
- extractContent(data) {
283
- return data.choices?.[0]?.message?.content || "";
284
- }
285
- extractToolCalls(data) {
286
- return data.choices?.[0]?.message?.tool_calls || [];
287
- }
288
- parseResponse(data) {
289
- const content = this.extractContent(data);
290
- const toolCalls = this.filterDuplicateToolCalls(
291
- this.extractToolCalls(data)
292
- );
293
- const usage = data.usage ? this.buildUsageObject(
294
- data.usage.prompt_tokens,
295
- data.usage.completion_tokens,
296
- data.usage.total_tokens
297
- ) : this.buildUsageObject(0, 0, 0);
298
- return {
299
- content,
300
- toolCalls,
301
- raw: data,
302
- usage
303
- };
304
- }
305
- };
306
-
307
- // src/providers/ProviderFactory.ts
308
- var ProviderFactory = class {
309
- static createProvider(providerType, environment) {
310
- const ProviderClass = this.providers.get(providerType);
311
- if (!ProviderClass) {
312
- throw new ConfigurationError(
313
- `Unknown provider: ${providerType}. Supported providers: ${Array.from(this.providers.keys()).join(", ")}`,
314
- providerType
315
- );
316
- }
317
- return new ProviderClass(environment);
318
- }
319
- static getSupportedProviders() {
320
- return Array.from(this.providers.keys());
321
- }
322
- static registerProvider(providerType, providerClass) {
323
- this.providers.set(providerType, providerClass);
324
- }
325
- static isProviderSupported(providerType) {
326
- return this.providers.has(providerType);
327
- }
328
- };
329
- ProviderFactory.providers = /* @__PURE__ */ new Map([
330
- ["cloudflare", CloudflareProvider],
331
- ["groq", GroqProvider]
332
- ]);
333
-
334
- // src/response/JsonParser.ts
335
- var JsonParser = class {
336
- /**
337
- * Enhanced JSON parsing with multiple fallback strategies
338
- */
339
- static parse(input, expectJson = false) {
340
- if (!input || typeof input !== "string") {
341
- return null;
342
- }
343
- if (expectJson && !this.looksLikeJson(input)) {
344
- return null;
345
- }
346
- try {
347
- return JSON.parse(input);
348
- } catch {
349
- const markdownJson = this.extractFromMarkdown(input);
350
- if (markdownJson) {
351
- try {
352
- return JSON.parse(markdownJson);
353
- } catch {
354
- }
355
- }
356
- const genericCode = this.extractFromCodeBlock(input);
357
- if (genericCode) {
358
- try {
359
- return JSON.parse(genericCode);
360
- } catch {
361
- }
362
- }
363
- const braceMatch = this.extractByBraces(input);
364
- if (braceMatch) {
365
- try {
366
- return JSON.parse(braceMatch);
367
- } catch {
368
- }
369
- }
370
- const fixedJson = this.attemptJsonFixes(input);
371
- if (fixedJson) {
372
- try {
373
- return JSON.parse(fixedJson);
374
- } catch {
375
- }
376
- }
377
- return null;
378
- }
379
- }
380
- static looksLikeJson(input) {
381
- const trimmed = input.trim();
382
- return trimmed.startsWith("{") || trimmed.startsWith("[") || trimmed.includes('"');
383
- }
384
- static extractFromMarkdown(input) {
385
- const match = input.match(/```json\s*(\{[\s\S]*?\})\s*```/);
386
- return match ? match[1] : null;
387
- }
388
- static extractFromCodeBlock(input) {
389
- const match = input.match(/```\s*(\{[\s\S]*?\})\s*```/);
390
- return match ? match[1] : null;
391
- }
392
- static extractByBraces(input) {
393
- const match = input.match(/\{[\s\S]*\}/);
394
- return match ? match[0] : null;
395
- }
396
- static attemptJsonFixes(input) {
397
- let fixed = input.trim();
398
- fixed = fixed.replace(/,(\s*[}\]])/g, "$1");
399
- fixed = fixed.replace(/'/g, '"');
400
- fixed = fixed.replace(/"\s*:\s*"([^"]*?)"/g, (match, content) => {
401
- const escaped = content.replace(/"/g, '\\"');
402
- return `: "${escaped}"`;
403
- });
404
- fixed = fixed.replace(/\/\/.*$/gm, "");
405
- fixed = fixed.replace(/\/\*[\s\S]*?\*\//g, "");
406
- if (this.looksLikeJson(fixed)) {
407
- return fixed;
408
- }
409
- return null;
410
- }
411
- /**
412
- * Safely stringify any value to JSON
413
- */
414
- static stringify(value, pretty = false) {
415
- try {
416
- return pretty ? JSON.stringify(value, null, 2) : JSON.stringify(value);
417
- } catch {
418
- return String(value);
419
- }
420
- }
421
- };
422
-
423
- // src/response/ResponseBuilder.ts
424
- var ResponseBuilder = class _ResponseBuilder {
425
- constructor() {
426
- this.content = "";
427
- this.toolCalls = [];
428
- this.rawResponse = null;
429
- this.usage = {
430
- promptTokens: 0,
431
- completionTokens: 0,
432
- totalTokens: 0
433
- };
434
- this.jsonMode = false;
435
- }
436
- setContent(content) {
437
- this.content = content;
438
- return this;
439
- }
440
- setToolCalls(toolCalls) {
441
- this.toolCalls = toolCalls;
442
- return this;
443
- }
444
- setRawResponse(raw) {
445
- this.rawResponse = raw;
446
- return this;
447
- }
448
- setUsage(usage) {
449
- this.usage = usage;
450
- return this;
451
- }
452
- setJsonMode(jsonMode) {
453
- this.jsonMode = jsonMode;
454
- return this;
455
- }
456
- build() {
457
- const isJson = this.toolCalls.length === 0 && (this.jsonMode || this.content.trim().startsWith("{"));
458
- return {
459
- content: this.content,
460
- isJson,
461
- tool_calls: this.toolCalls,
462
- raw: this.rawResponse,
463
- usage: this.usage,
464
- json: () => JsonParser.parse(this.content, isJson)
465
- };
466
- }
467
- static create() {
468
- return new _ResponseBuilder();
469
- }
470
- };
471
-
472
- // src/config/Configuration.ts
473
- var ConfigurationValidator = class {
474
- static validateProvider(provider, environment) {
475
- const config = this.providerConfigs.get(provider);
476
- if (!config) {
477
- throw new Error(`Unknown provider: ${provider}`);
478
- }
479
- this.validateEnvironmentVariables(provider, config, environment);
480
- }
481
- static validateModel(provider, model) {
482
- const config = this.providerConfigs.get(provider);
483
- if (!config || !config.modelValidation) {
484
- return;
485
- }
486
- const validation = config.modelValidation;
487
- if (validation.minLength && model.length < validation.minLength) {
488
- throw new Error(
489
- `Model name must be at least ${validation.minLength} characters long`
490
- );
491
- }
492
- if (validation.maxLength && model.length > validation.maxLength) {
493
- throw new Error(
494
- `Model name must not exceed ${validation.maxLength} characters`
495
- );
496
- }
497
- if (validation.pattern && !validation.pattern.test(model)) {
498
- throw new Error(
499
- `Model name does not match required pattern: ${validation.pattern}`
500
- );
501
- }
502
- }
503
- static validateOptions(provider, options) {
504
- const config = this.providerConfigs.get(provider);
505
- if (!config) {
506
- return;
507
- }
508
- if ("temperature" in options) {
509
- const temp = options.temperature;
510
- if (typeof temp !== "number" || temp < 0 || temp > 2) {
511
- throw new Error("Temperature must be a number between 0 and 2");
512
- }
513
- }
514
- if ("max_tokens" in options) {
515
- const tokens = options.max_tokens;
516
- if (typeof tokens !== "number" || tokens <= 0) {
517
- throw new Error("Max tokens must be a positive number");
518
- }
519
- }
520
- }
521
- static getProviderConfig(provider) {
522
- return this.providerConfigs.get(provider);
523
- }
524
- static registerProviderConfig(provider, config) {
525
- this.providerConfigs.set(provider, config);
526
- }
527
- static validateEnvironmentVariables(provider, config, environment) {
528
- const missing = config.requiredEnvVars.filter((key) => !environment[key]);
529
- if (missing.length > 0) {
530
- throw new Error(
531
- `Missing required environment variables for ${provider}: ${missing.join(", ")}`
532
- );
533
- }
534
- }
535
- };
536
- ConfigurationValidator.providerConfigs = /* @__PURE__ */ new Map([
537
- [
538
- "cloudflare",
539
- {
540
- requiredEnvVars: ["AI"],
541
- optionalEnvVars: [],
542
- defaultOptions: {},
543
- supportedFeatures: {
544
- jsonMode: true,
545
- tools: true,
546
- streaming: false
547
- }
548
- }
549
- ],
550
- [
551
- "groq",
552
- {
553
- requiredEnvVars: ["GROQ_API_KEY"],
554
- optionalEnvVars: [],
555
- defaultOptions: {
556
- temperature: 0.7,
557
- max_tokens: 1024
558
- },
559
- supportedFeatures: {
560
- jsonMode: true,
561
- tools: true,
562
- streaming: true
563
- }
564
- }
565
- ]
566
- ]);
567
- var RuntimeConfigManager = class {
568
- static getConfig() {
569
- return { ...this.defaultConfig };
570
- }
571
- static updateConfig(updates) {
572
- this.defaultConfig = this.deepMerge(this.defaultConfig, updates);
573
- }
574
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
575
- static deepMerge(target, source) {
576
- const result = { ...target };
577
- for (const key in source) {
578
- if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key])) {
579
- result[key] = this.deepMerge(result[key] || {}, source[key]);
580
- } else {
581
- result[key] = source[key];
582
- }
583
- }
584
- return result;
585
- }
586
- };
587
- RuntimeConfigManager.defaultConfig = {
588
- timeout: 3e4,
589
- retries: {
590
- maxAttempts: 3,
591
- baseDelay: 1e3,
592
- maxDelay: 1e4
593
- },
594
- caching: {
595
- enabled: false,
596
- ttl: 3e5
597
- // 5 minutes
598
- },
599
- logging: {
600
- enabled: true,
601
- level: "info"
602
- }
603
- };
604
-
605
- // src/errors/RetryHandler.ts
606
- var RetryHandler = class {
607
- static async executeWithRetry(operation, config = {}, context) {
608
- const fullConfig = { ...this.defaultConfig, ...config };
609
- let lastError;
610
- for (let attempt = 0; attempt <= fullConfig.maxRetries; attempt++) {
611
- try {
612
- return await operation();
613
- } catch (error) {
614
- lastError = error;
615
- if (attempt === fullConfig.maxRetries) {
616
- break;
617
- }
618
- if (!this.shouldRetry(error, fullConfig)) {
619
- break;
620
- }
621
- const delay2 = this.calculateDelay(attempt, fullConfig);
622
- if (context) {
623
- console.warn(
624
- `${context} - Attempt ${attempt + 1}/${fullConfig.maxRetries + 1} failed. Retrying in ${delay2}ms...`
625
- );
626
- }
627
- await this.sleep(delay2);
628
- }
629
- }
630
- throw lastError;
631
- }
632
- static shouldRetry(error, config) {
633
- const errorMessage = error instanceof Error ? error.message : String(error);
634
- const errorString = errorMessage.toLowerCase();
635
- if (config.retryableErrors.some(
636
- (retryableError) => errorString.includes(retryableError.toLowerCase())
637
- )) {
638
- return true;
639
- }
640
- if (error && typeof error === "object" && "status" in error && typeof error.status === "number") {
641
- return config.retryableStatusCodes.includes(error.status);
642
- }
643
- if (error instanceof TypeError && error.message.includes("fetch")) {
644
- return true;
645
- }
646
- return false;
647
- }
648
- static calculateDelay(attempt, config) {
649
- const exponentialDelay = config.baseDelay * Math.pow(config.backoffFactor, attempt);
650
- const jitter = Math.random() * 0.1 * exponentialDelay;
651
- return Math.min(exponentialDelay + jitter, config.maxDelay);
652
- }
653
- static sleep(ms) {
654
- return new Promise((resolve) => setTimeout(resolve, ms));
655
- }
656
- };
657
- RetryHandler.defaultConfig = {
658
- maxRetries: 3,
659
- baseDelay: 1e3,
660
- maxDelay: 1e4,
661
- backoffFactor: 2,
662
- retryableErrors: ["1031", "500", "502", "503", "504", "timeout", "network"],
663
- retryableStatusCodes: [500, 502, 503, 504, 429]
664
- };
665
- var ErrorHandler = class {
666
- static wrapProviderError(error, provider, context) {
667
- const contextMessage = context ? ` (${context})` : "";
668
- if (error instanceof Error) {
669
- return new Error(
670
- `[${provider.toUpperCase()}]${contextMessage} ${error.message}`
671
- );
672
- }
673
- if (typeof error === "string") {
674
- return new Error(`[${provider.toUpperCase()}]${contextMessage} ${error}`);
675
- }
676
- return new Error(
677
- `[${provider.toUpperCase()}]${contextMessage} Unknown error occurred`
678
- );
679
- }
680
- static isNetworkError(error) {
681
- return error instanceof TypeError && (error.message.includes("fetch") || error.message.includes("network") || error.message.includes("ECONNREFUSED"));
682
- }
683
- static isTimeoutError(error) {
684
- const errorMessage = error instanceof Error ? error.message : String(error);
685
- return errorMessage.toLowerCase().includes("timeout");
686
- }
687
- static isRateLimitError(error) {
688
- const errorMessage = error instanceof Error ? error.message : String(error);
689
- return errorMessage.toLowerCase().includes("rate limit") || Boolean(
690
- error && typeof error === "object" && "status" in error && error.status === 429
691
- );
692
- }
693
- };
694
-
695
- // src/ModelRunner.ts
696
- var ModelRunner = class {
697
- constructor(environment) {
698
- this.environment = environment;
699
- }
700
- async run({
701
- messages,
702
- model,
703
- jsonMode = false,
704
- options = {}
705
- }) {
706
- const { provider, model: modelName } = model;
707
- try {
708
- this.validateInputs(provider, modelName, options);
709
- const providerInstance = ProviderFactory.createProvider(
710
- provider,
711
- this.environment
712
- );
713
- this.validateCapabilities(providerInstance, jsonMode, options);
714
- const response = await RetryHandler.executeWithRetry(
715
- () => providerInstance.execute({
716
- messages,
717
- jsonMode,
718
- options,
719
- model: modelName
720
- }),
721
- RuntimeConfigManager.getConfig().retries,
722
- `ModelRunner execution with ${provider}`
723
- );
724
- return ResponseBuilder.create().setContent(response.content).setToolCalls(response.toolCalls).setRawResponse(response.raw).setUsage(response.usage).setJsonMode(jsonMode).build();
725
- } catch (error) {
726
- throw ErrorHandler.wrapProviderError(error, provider, "ModelRunner.run");
727
- }
728
- }
729
- /**
730
- * Get supported providers
731
- */
732
- static getSupportedProviders() {
733
- return ProviderFactory.getSupportedProviders();
734
- }
735
- /**
736
- * Check if a provider supports specific features
737
- */
738
- static getProviderCapabilities(provider) {
739
- const config = ConfigurationValidator.getProviderConfig(provider);
740
- return config?.supportedFeatures;
741
- }
742
- /**
743
- * Update runtime configuration
744
- */
745
- static updateRuntimeConfig(config) {
746
- RuntimeConfigManager.updateConfig(config);
747
- }
748
- /**
749
- * Validate inputs before processing
750
- */
751
- validateInputs(provider, model, options) {
752
- ConfigurationValidator.validateProvider(provider, this.environment);
753
- ConfigurationValidator.validateModel(provider, model);
754
- ConfigurationValidator.validateOptions(provider, options);
755
- }
756
- /**
757
- * Validate that the provider supports the requested features
758
- */
759
- validateCapabilities(provider, jsonMode, options) {
760
- if (jsonMode && !provider.supportsJsonMode()) {
761
- throw new ConfigurationError(
762
- `Provider ${provider.providerType} does not support JSON mode`,
763
- provider.providerType
764
- );
765
- }
766
- if (options?.tools && !provider.supportsTools()) {
767
- throw new ConfigurationError(
768
- `Provider ${provider.providerType} does not support tools`,
769
- provider.providerType
770
- );
771
- }
772
- }
773
- };
774
- // Annotate the CommonJS export names for ESM import in node:
775
- 0 && (module.exports = {
776
- ConfigurationError,
777
- ModelRunner,
778
- ProviderError,
779
- cloudflareAIModel,
780
- groqAIModel
781
- });
782
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/providers/cloudflare.ts","../src/providers/groq.ts","../src/types.ts","../src/providers/BaseModelProvider.ts","../src/providers/utils.ts","../src/providers/CloudflareProvider.ts","../src/providers/GroqProvider.ts","../src/providers/ProviderFactory.ts","../src/response/JsonParser.ts","../src/response/ResponseBuilder.ts","../src/config/Configuration.ts","../src/errors/RetryHandler.ts","../src/ModelRunner.ts"],"sourcesContent":["export * from './providers';\nexport * from './ModelRunner';\nexport { ConfigurationError, ProviderError } from './types';\n","import { AiModels } from '@cloudflare/workers-types';\nimport { ModelRunnerConfig } from '../types';\n\nexport const cloudflareAIModel = (\n model: keyof AiModels\n): ModelRunnerConfig => ({\n provider: 'cloudflare',\n model,\n});\n","import type { ModelRunnerConfig } from '../types';\n\ntype GroqModelsList =\n | 'llama-3.1-8b-instant'\n | 'llama-3.3-70b-versatile'\n | 'meta-llama/llama-guard-4-12b'\n | 'openai/gpt-oss-120b'\n | 'openai/gpt-oss-20b'\n | 'whisper-large-v3'\n | 'whisper-large-v3-turbo';\n\nexport const groqAIModel = (model: GroqModelsList): ModelRunnerConfig => ({\n provider: 'groq',\n model,\n});\n","export type AgentRole = 'system' | 'user' | 'assistant';\nexport interface AgentMessage {\n role: AgentRole;\n content: string;\n name?: string;\n}\n\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport type ModelRunnerProvider = 'cloudflare' | 'groq';\n\nexport type ModelRunnerConfig = {\n provider: ModelRunnerProvider;\n model: string;\n};\n\nexport type ModelCapabilities = {\n jsonStructure?: boolean;\n tools?: boolean;\n};\n\nexport type ModelRunnerEnvironment<T> = Record<string, T>;\n\nexport type ModelRunnerRunParams = {\n messages: AgentMessage[];\n jsonMode?: boolean;\n options?: Record<string, unknown>; // Доп. настройки (temperature, max_tokens и т.д.)\n model: ModelRunnerConfig;\n};\n\nexport type ModelRunnerUsage = {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n};\n\nexport type ModelRunnerResult<T> = {\n content: string;\n isJson: boolean;\n tool_calls: ToolCall[];\n raw: unknown;\n usage: ModelRunnerUsage;\n json: () => T | null;\n};\n\n// Enhanced type definitions for new architecture\nexport interface ProviderConfig {\n provider: string;\n model: string;\n options?: Record<string, unknown>;\n}\n\nexport interface ProviderRequest {\n messages: AgentMessage[];\n jsonMode: boolean;\n options: Record<string, unknown>;\n model: string;\n}\n\nexport interface ProviderResponse {\n content: string;\n toolCalls: ToolCall[];\n raw: unknown;\n usage: ModelRunnerUsage;\n}\n\nexport interface ModelProvider {\n readonly providerType: string;\n execute(request: ProviderRequest): Promise<ProviderResponse>;\n supportsJsonMode(): boolean;\n supportsTools(): boolean;\n}\n\n// Enhanced error types\nexport class ProviderError extends Error {\n constructor(\n message: string,\n public readonly provider: string,\n public readonly statusCode?: number,\n public readonly originalError?: unknown\n ) {\n super(message);\n this.name = 'ProviderError';\n }\n}\n\nexport class ConfigurationError extends Error {\n constructor(\n message: string,\n public readonly provider: string\n ) {\n super(message);\n this.name = 'ConfigurationError';\n }\n}\n","import type {\n ModelProvider,\n ModelRunnerEnvironment,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from '../types';\nimport { ConfigurationError, ProviderError } from '../types';\n\nexport abstract class BaseModelProvider<T> implements ModelProvider {\n public abstract readonly providerType: string;\n\n constructor(protected environment: ModelRunnerEnvironment<T>) {}\n\n abstract execute(request: ProviderRequest): Promise<ProviderResponse>;\n protected abstract extractContent(response: unknown): string;\n protected abstract extractToolCalls(response: unknown): ToolCall[];\n abstract supportsJsonMode(): boolean;\n abstract supportsTools(): boolean;\n\n protected validateRequiredKeys(envKeys: string[]): void {\n const missing = envKeys.filter((key) => !this.environment[key]);\n if (missing.length > 0) {\n throw new ConfigurationError(\n `Missing required environment variables: ${missing.join(', ')}`,\n this.providerType\n );\n }\n }\n\n protected createError(\n message: string,\n statusCode?: number,\n originalError?: unknown\n ): ProviderError {\n return new ProviderError(\n message,\n this.providerType,\n statusCode,\n originalError\n );\n }\n\n protected buildUsageObject(\n promptTokens: number,\n completionTokens: number,\n totalTokens: number\n ) {\n return {\n promptTokens,\n completionTokens,\n totalTokens,\n };\n }\n\n protected filterDuplicateToolCalls(toolCalls: ToolCall[]): ToolCall[] {\n const seen = new Set<string>();\n return toolCalls.filter((toolCall) => {\n const key = toolCall.function.name;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }\n}\n","export const delay = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\nexport async function runWithRetry<T>(\n fn: () => Promise<T>,\n maxRetries = 3,\n delayMs = 1000,\n info?: (msg: string) => void\n) {\n for (let i = 0; i < maxRetries; i++) {\n try {\n return await fn();\n } catch (error: unknown) {\n const isRetryable =\n error instanceof Error &&\n (error.message?.includes('1031') ||\n error.toString().includes('1031') ||\n error.message?.includes('500'));\n\n if (isRetryable && i < maxRetries - 1) {\n if (info)\n info(`AI Error (1031/500). Retrying ${i + 1}/${maxRetries}...`);\n await delay(delayMs * (i + 1));\n continue;\n }\n throw error;\n }\n }\n}\n","import { Ai, AiModels } from '@cloudflare/workers-types';\nimport { BaseModelProvider } from './BaseModelProvider';\nimport { runWithRetry } from './utils';\nimport type {\n ModelRunnerEnvironment,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from '../types';\n\nexport class CloudflareProvider extends BaseModelProvider<Ai> {\n public readonly providerType: string = 'cloudflare';\n\n constructor(environment: ModelRunnerEnvironment<Ai>) {\n super(environment);\n this.validateRequiredKeys(['AI']);\n }\n\n supportsJsonMode(): boolean {\n return true;\n }\n\n supportsTools(): boolean {\n return true;\n }\n\n async execute(request: ProviderRequest): Promise<ProviderResponse> {\n const payload: Record<string, unknown> = {\n messages: request.messages,\n ...request.options,\n };\n\n if (request.jsonMode) {\n payload.response_format = { type: 'json_object' };\n }\n\n try {\n const response = await runWithRetry(\n async () => {\n return this.environment.AI!.run(\n request.model as keyof AiModels,\n payload\n );\n },\n 3,\n 1000\n );\n\n return this.parseResponse(response);\n } catch (error) {\n throw this.createError(\n `Cloudflare AI execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n error\n );\n }\n }\n\n private parseResponse(response: unknown): ProviderResponse {\n const content = this.extractContent(response);\n const toolCalls = this.extractToolCalls(response);\n const usage = this.buildUsageObject(0, 0, 0); // Cloudflare doesn't provide usage data\n\n return {\n content,\n toolCalls,\n raw: response,\n usage,\n };\n }\n\n protected extractContent(response: unknown): string {\n if (typeof response === 'string') {\n return response;\n }\n\n if (response && typeof response === 'object') {\n // Handle standard response format\n if ('response' in response) {\n return String(response.response || '');\n }\n }\n\n return '';\n }\n\n protected extractToolCalls(response: unknown): ToolCall[] {\n if (!response || typeof response !== 'object') {\n return [];\n }\n\n const toolCalls = (response as Record<string, unknown>).tool_calls;\n if (!Array.isArray(toolCalls) || toolCalls.length === 0) {\n return [];\n }\n\n return toolCalls.map((toolCall, index) => {\n const tc = toolCall as Record<string, unknown>;\n const args = tc.arguments as Record<string, unknown> | string;\n const argsString = typeof args === 'string' ? args : JSON.stringify(args);\n\n return {\n id: `tool-call-${index}`,\n type: 'function' as const,\n function: {\n name: String(tc.name || ''),\n arguments: argsString,\n },\n };\n });\n }\n}\n","import { BaseModelProvider } from './BaseModelProvider';\nimport type {\n ModelRunnerEnvironment,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from '../types';\nimport { runWithRetry } from './utils';\n\nexport interface GroqUsageData {\n queue_time: number;\n prompt_tokens: number;\n prompt_time: number;\n completion_tokens: number;\n completion_time: number;\n total_tokens: number;\n total_time: number;\n completion_tokens_details: { reasoning_tokens: number };\n}\n\nexport interface GroqResponse {\n choices: Array<{\n message: {\n content?: string;\n tool_calls?: ToolCall[];\n };\n }>;\n usage?: GroqUsageData;\n}\n\nexport class GroqProvider extends BaseModelProvider<string> {\n public readonly providerType: string = 'groq';\n private readonly apiEndpoint =\n 'https://api.groq.com/openai/v1/chat/completions';\n\n constructor(environment: ModelRunnerEnvironment<string>) {\n super(environment);\n this.validateRequiredKeys(['GROQ_API_KEY']);\n }\n\n supportsJsonMode(): boolean {\n return true;\n }\n\n supportsTools(): boolean {\n return true;\n }\n\n async execute(request: ProviderRequest): Promise<ProviderResponse> {\n const payload = this.buildPayload(request);\n\n try {\n const response = await this.makeRequest(payload);\n return this.parseResponse(response);\n } catch (error) {\n if (error instanceof Response) {\n const errorText = await error.text();\n throw this.createError(\n `Groq API Error (${error.status}): ${errorText}. Model: ${request.model}`,\n error.status,\n errorText\n );\n }\n throw this.createError(\n `Groq execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n error\n );\n }\n }\n\n private buildPayload(request: ProviderRequest): Record<string, unknown> {\n const payload: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n ...request.options,\n };\n\n if (request.options?.tools) {\n payload.tool_choice = 'auto';\n }\n\n if (request.jsonMode && !request.options?.tools) {\n payload.response_format = { type: 'json_object' };\n }\n\n return payload;\n }\n\n private async makeRequest(\n payload: Record<string, unknown>\n ): Promise<GroqResponse> {\n const response = await runWithRetry(\n async () => {\n return fetch(this.apiEndpoint, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.environment.GROQ_API_KEY}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n },\n 3,\n 1000\n );\n\n if (!response) {\n throw this.createError(\n `Groq execution failed: No response from Groq API`,\n undefined,\n undefined\n );\n }\n\n return response?.json() as Promise<GroqResponse>;\n }\n\n protected extractContent(data: GroqResponse): string {\n return data.choices?.[0]?.message?.content || '';\n }\n\n protected extractToolCalls(data: GroqResponse): ToolCall[] {\n return data.choices?.[0]?.message?.tool_calls || [];\n }\n\n private parseResponse(data: GroqResponse): ProviderResponse {\n const content = this.extractContent(data);\n const toolCalls = this.filterDuplicateToolCalls(\n this.extractToolCalls(data)\n );\n const usage = data.usage\n ? this.buildUsageObject(\n data.usage.prompt_tokens,\n data.usage.completion_tokens,\n data.usage.total_tokens\n )\n : this.buildUsageObject(0, 0, 0);\n\n return {\n content,\n toolCalls,\n raw: data,\n usage,\n };\n }\n}\n","import type { ModelProvider, ModelRunnerEnvironment } from '../types';\nimport { CloudflareProvider } from './CloudflareProvider';\nimport { GroqProvider } from './GroqProvider';\nimport { ConfigurationError } from '../types';\n\nexport class ProviderFactory {\n private static providers = new Map<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (environment: ModelRunnerEnvironment<any>) => ModelProvider\n >([\n ['cloudflare', CloudflareProvider],\n ['groq', GroqProvider],\n ]);\n\n static createProvider(\n providerType: string,\n environment: ModelRunnerEnvironment<unknown>\n ): ModelProvider {\n const ProviderClass = this.providers.get(providerType);\n\n if (!ProviderClass) {\n throw new ConfigurationError(\n `Unknown provider: ${providerType}. Supported providers: ${Array.from(this.providers.keys()).join(', ')}`,\n providerType\n );\n }\n\n return new ProviderClass(environment);\n }\n\n static getSupportedProviders(): string[] {\n return Array.from(this.providers.keys());\n }\n\n static registerProvider(\n providerType: string,\n providerClass: new (\n environment: ModelRunnerEnvironment<unknown>\n ) => ModelProvider\n ): void {\n this.providers.set(providerType, providerClass);\n }\n\n static isProviderSupported(providerType: string): boolean {\n return this.providers.has(providerType);\n }\n}\n","export class JsonParser {\n /**\n * Enhanced JSON parsing with multiple fallback strategies\n */\n static parse<T>(input: string, expectJson: boolean = false): T | null {\n if (!input || typeof input !== 'string') {\n return null;\n }\n\n // Quick check for obvious non-JSON content\n if (expectJson && !this.looksLikeJson(input)) {\n return null;\n }\n\n try {\n // Strategy 1: Direct JSON parsing\n return JSON.parse(input);\n } catch {\n // Strategy 2: Extract JSON from markdown code blocks\n const markdownJson = this.extractFromMarkdown(input);\n if (markdownJson) {\n try {\n return JSON.parse(markdownJson);\n } catch {\n // Continue to next strategy\n }\n }\n\n // Strategy 3: Extract JSON from generic code blocks\n const genericCode = this.extractFromCodeBlock(input);\n if (genericCode) {\n try {\n return JSON.parse(genericCode);\n } catch {\n // Continue to next strategy\n }\n }\n\n // Strategy 4: Find JSON object by braces\n const braceMatch = this.extractByBraces(input);\n if (braceMatch) {\n try {\n return JSON.parse(braceMatch);\n } catch {\n // Continue to next strategy\n }\n }\n\n // Strategy 5: Try to fix common JSON issues\n const fixedJson = this.attemptJsonFixes(input);\n if (fixedJson) {\n try {\n return JSON.parse(fixedJson);\n } catch {\n // Final fallback failed\n }\n }\n\n return null;\n }\n }\n\n private static looksLikeJson(input: string): boolean {\n const trimmed = input.trim();\n return (\n trimmed.startsWith('{') ||\n trimmed.startsWith('[') ||\n trimmed.includes('\"')\n );\n }\n\n private static extractFromMarkdown(input: string): string | null {\n const match = input.match(/```json\\s*(\\{[\\s\\S]*?\\})\\s*```/);\n return match ? match[1] : null;\n }\n\n private static extractFromCodeBlock(input: string): string | null {\n const match = input.match(/```\\s*(\\{[\\s\\S]*?\\})\\s*```/);\n return match ? match[1] : null;\n }\n\n private static extractByBraces(input: string): string | null {\n const match = input.match(/\\{[\\s\\S]*\\}/);\n return match ? match[0] : null;\n }\n\n private static attemptJsonFixes(input: string): string | null {\n let fixed = input.trim();\n\n // Remove trailing commas before closing braces/brackets\n fixed = fixed.replace(/,(\\s*[}\\]])/g, '$1');\n\n // Remove single quotes and replace with double quotes (common issue)\n fixed = fixed.replace(/'/g, '\"');\n\n // Fix unescaped quotes in strings (basic attempt)\n fixed = fixed.replace(/\"\\s*:\\s*\"([^\"]*?)\"/g, (match, content) => {\n const escaped = content.replace(/\"/g, '\\\\\"');\n return `: \"${escaped}\"`;\n });\n\n // Remove comments (basic removal)\n fixed = fixed.replace(/\\/\\/.*$/gm, '');\n fixed = fixed.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n\n // Validate that it looks like JSON now\n if (this.looksLikeJson(fixed)) {\n return fixed;\n }\n\n return null;\n }\n\n /**\n * Safely stringify any value to JSON\n */\n static stringify(value: unknown, pretty: boolean = false): string {\n try {\n return pretty ? JSON.stringify(value, null, 2) : JSON.stringify(value);\n } catch {\n // Fallback for circular references or unstringifiable values\n return String(value);\n }\n }\n}\n","import type { ModelRunnerResult, ModelRunnerUsage, ToolCall } from '../types';\nimport { JsonParser } from './JsonParser';\n\nexport class ResponseBuilder<T = unknown> {\n private content: string = '';\n private toolCalls: ToolCall[] = [];\n private rawResponse: unknown = null;\n private usage: ModelRunnerUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n private jsonMode: boolean = false;\n\n setContent(content: string): this {\n this.content = content;\n return this;\n }\n\n setToolCalls(toolCalls: ToolCall[]): this {\n this.toolCalls = toolCalls;\n return this;\n }\n\n setRawResponse(raw: unknown): this {\n this.rawResponse = raw;\n return this;\n }\n\n setUsage(usage: ModelRunnerUsage): this {\n this.usage = usage;\n return this;\n }\n\n setJsonMode(jsonMode: boolean): this {\n this.jsonMode = jsonMode;\n return this;\n }\n\n build(): ModelRunnerResult<T> {\n const isJson =\n this.toolCalls.length === 0 &&\n (this.jsonMode || this.content.trim().startsWith('{'));\n\n return {\n content: this.content,\n isJson,\n tool_calls: this.toolCalls,\n raw: this.rawResponse,\n usage: this.usage,\n json: () => JsonParser.parse<T>(this.content, isJson),\n };\n }\n\n static create<T = unknown>(): ResponseBuilder<T> {\n return new ResponseBuilder<T>();\n }\n}\n","import type { ModelRunnerEnvironment, ModelRunnerProvider } from '../types';\n\nexport interface ProviderConfigSchema {\n requiredEnvVars: string[];\n optionalEnvVars: string[];\n defaultOptions: Record<string, unknown>;\n supportedFeatures: {\n jsonMode: boolean;\n tools: boolean;\n streaming: boolean;\n };\n modelValidation?: {\n minLength?: number;\n maxLength?: number;\n pattern?: RegExp;\n };\n}\n\nexport interface RuntimeConfig {\n timeout?: number;\n retries?: {\n maxAttempts: number;\n baseDelay: number;\n maxDelay: number;\n };\n caching?: {\n enabled: boolean;\n ttl: number;\n };\n logging?: {\n enabled: boolean;\n level: 'debug' | 'info' | 'warn' | 'error';\n };\n}\n\nexport class ConfigurationValidator {\n private static providerConfigs: Map<\n ModelRunnerProvider,\n ProviderConfigSchema\n > = new Map([\n [\n 'cloudflare',\n {\n requiredEnvVars: ['AI'],\n optionalEnvVars: [],\n defaultOptions: {},\n supportedFeatures: {\n jsonMode: true,\n tools: true,\n streaming: false,\n },\n },\n ],\n [\n 'groq',\n {\n requiredEnvVars: ['GROQ_API_KEY'],\n optionalEnvVars: [],\n defaultOptions: {\n temperature: 0.7,\n max_tokens: 1024,\n },\n supportedFeatures: {\n jsonMode: true,\n tools: true,\n streaming: true,\n },\n },\n ],\n ]);\n\n static validateProvider(\n provider: ModelRunnerProvider,\n environment: ModelRunnerEnvironment<unknown>\n ): void {\n const config = this.providerConfigs.get(provider);\n if (!config) {\n throw new Error(`Unknown provider: ${provider}`);\n }\n\n this.validateEnvironmentVariables(provider, config, environment);\n }\n\n static validateModel(provider: ModelRunnerProvider, model: string): void {\n const config = this.providerConfigs.get(provider);\n if (!config || !config.modelValidation) {\n return;\n }\n\n const validation = config.modelValidation;\n\n if (validation.minLength && model.length < validation.minLength) {\n throw new Error(\n `Model name must be at least ${validation.minLength} characters long`\n );\n }\n\n if (validation.maxLength && model.length > validation.maxLength) {\n throw new Error(\n `Model name must not exceed ${validation.maxLength} characters`\n );\n }\n\n if (validation.pattern && !validation.pattern.test(model)) {\n throw new Error(\n `Model name does not match required pattern: ${validation.pattern}`\n );\n }\n }\n\n static validateOptions(\n provider: ModelRunnerProvider,\n options: Record<string, unknown>\n ): void {\n const config = this.providerConfigs.get(provider);\n if (!config) {\n return;\n }\n\n // Validate known options\n if ('temperature' in options) {\n const temp = options.temperature;\n if (typeof temp !== 'number' || temp < 0 || temp > 2) {\n throw new Error('Temperature must be a number between 0 and 2');\n }\n }\n\n if ('max_tokens' in options) {\n const tokens = options.max_tokens;\n if (typeof tokens !== 'number' || tokens <= 0) {\n throw new Error('Max tokens must be a positive number');\n }\n }\n }\n\n static getProviderConfig(\n provider: ModelRunnerProvider\n ): ProviderConfigSchema | undefined {\n return this.providerConfigs.get(provider);\n }\n\n static registerProviderConfig(\n provider: ModelRunnerProvider,\n config: ProviderConfigSchema\n ): void {\n this.providerConfigs.set(provider, config);\n }\n\n private static validateEnvironmentVariables(\n provider: ModelRunnerProvider,\n config: ProviderConfigSchema,\n environment: ModelRunnerEnvironment<unknown>\n ): void {\n const missing = config.requiredEnvVars.filter((key) => !environment[key]);\n\n if (missing.length > 0) {\n throw new Error(\n `Missing required environment variables for ${provider}: ${missing.join(', ')}`\n );\n }\n }\n}\n\nexport class RuntimeConfigManager {\n private static defaultConfig: RuntimeConfig = {\n timeout: 30000,\n retries: {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n },\n caching: {\n enabled: false,\n ttl: 300000, // 5 minutes\n },\n logging: {\n enabled: true,\n level: 'info',\n },\n };\n\n static getConfig(): RuntimeConfig {\n return { ...this.defaultConfig };\n }\n\n static updateConfig(updates: Partial<RuntimeConfig>): void {\n this.defaultConfig = this.deepMerge(this.defaultConfig, updates);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static deepMerge(target: any, source: any): any {\n const result = { ...target };\n\n for (const key in source) {\n if (\n source[key] &&\n typeof source[key] === 'object' &&\n !Array.isArray(source[key])\n ) {\n result[key] = this.deepMerge(result[key] || {}, source[key]);\n } else {\n result[key] = source[key];\n }\n }\n\n return result;\n }\n}\n","import type { ModelRunnerProvider } from '../types';\n\nexport interface RetryConfig {\n maxRetries: number;\n baseDelay: number;\n maxDelay: number;\n backoffFactor: number;\n retryableErrors: string[];\n retryableStatusCodes: number[];\n}\n\nexport class RetryHandler {\n private static defaultConfig: RetryConfig = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n backoffFactor: 2,\n retryableErrors: ['1031', '500', '502', '503', '504', 'timeout', 'network'],\n retryableStatusCodes: [500, 502, 503, 504, 429],\n };\n\n static async executeWithRetry<T>(\n operation: () => Promise<T>,\n config: Partial<RetryConfig> = {},\n context?: string\n ): Promise<T> {\n const fullConfig = { ...this.defaultConfig, ...config };\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= fullConfig.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n\n if (attempt === fullConfig.maxRetries) {\n break; // No more retries\n }\n\n if (!this.shouldRetry(error, fullConfig)) {\n break; // Error is not retryable\n }\n\n const delay = this.calculateDelay(attempt, fullConfig);\n if (context) {\n console.warn(\n `${context} - Attempt ${attempt + 1}/${fullConfig.maxRetries + 1} failed. Retrying in ${delay}ms...`\n );\n }\n await this.sleep(delay);\n }\n }\n\n throw lastError;\n }\n\n private static shouldRetry(error: unknown, config: RetryConfig): boolean {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorString = errorMessage.toLowerCase();\n\n // Check for retryable error messages\n if (\n config.retryableErrors.some((retryableError) =>\n errorString.includes(retryableError.toLowerCase())\n )\n ) {\n return true;\n }\n\n // Check for retryable HTTP status codes\n if (\n error &&\n typeof error === 'object' &&\n 'status' in error &&\n typeof error.status === 'number'\n ) {\n return config.retryableStatusCodes.includes(error.status);\n }\n\n // Check for network-related errors\n if (error instanceof TypeError && error.message.includes('fetch')) {\n return true;\n }\n\n return false;\n }\n\n private static calculateDelay(attempt: number, config: RetryConfig): number {\n const exponentialDelay =\n config.baseDelay * Math.pow(config.backoffFactor, attempt);\n\n // Add jitter to prevent thundering herd\n const jitter = Math.random() * 0.1 * exponentialDelay;\n\n return Math.min(exponentialDelay + jitter, config.maxDelay);\n }\n\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nexport class ErrorHandler {\n static wrapProviderError(\n error: unknown,\n provider: ModelRunnerProvider,\n context?: string\n ): Error {\n const contextMessage = context ? ` (${context})` : '';\n\n if (error instanceof Error) {\n return new Error(\n `[${provider.toUpperCase()}]${contextMessage} ${error.message}`\n );\n }\n\n if (typeof error === 'string') {\n return new Error(`[${provider.toUpperCase()}]${contextMessage} ${error}`);\n }\n\n return new Error(\n `[${provider.toUpperCase()}]${contextMessage} Unknown error occurred`\n );\n }\n\n static isNetworkError(error: unknown): boolean {\n return (\n error instanceof TypeError &&\n (error.message.includes('fetch') ||\n error.message.includes('network') ||\n error.message.includes('ECONNREFUSED'))\n );\n }\n\n static isTimeoutError(error: unknown): boolean {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return errorMessage.toLowerCase().includes('timeout');\n }\n\n static isRateLimitError(error: unknown): boolean {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return (\n errorMessage.toLowerCase().includes('rate limit') ||\n Boolean(\n error &&\n typeof error === 'object' &&\n 'status' in error &&\n error.status === 429\n )\n );\n }\n}\n","import type {\n ModelProvider,\n ModelRunnerEnvironment,\n ModelRunnerProvider,\n ModelRunnerResult,\n ModelRunnerRunParams,\n} from './types';\nimport { ProviderFactory } from './providers/ProviderFactory';\nimport { ResponseBuilder } from './response/ResponseBuilder';\nimport {\n ConfigurationValidator,\n RuntimeConfigManager,\n} from './config/Configuration';\nimport { RetryHandler, ErrorHandler } from './errors/RetryHandler';\nimport { ConfigurationError } from './types';\n\nexport class ModelRunner {\n private environment: ModelRunnerEnvironment<unknown>;\n\n constructor(environment: ModelRunnerEnvironment<unknown>) {\n this.environment = environment;\n }\n\n async run<T>({\n messages,\n model,\n jsonMode = false,\n options = {},\n }: ModelRunnerRunParams): Promise<ModelRunnerResult<T>> {\n const { provider, model: modelName } = model;\n\n try {\n // Validate inputs\n this.validateInputs(provider, modelName, options);\n\n // Create provider instance\n const providerInstance = ProviderFactory.createProvider(\n provider,\n this.environment\n );\n\n // Validate provider capabilities\n this.validateCapabilities(providerInstance, jsonMode, options);\n\n // Execute with retry logic\n const response = await RetryHandler.executeWithRetry(\n () =>\n providerInstance.execute({\n messages,\n jsonMode,\n options,\n model: modelName,\n }),\n RuntimeConfigManager.getConfig().retries,\n `ModelRunner execution with ${provider}`\n );\n\n // Build and return result\n return ResponseBuilder.create<T>()\n .setContent(response.content)\n .setToolCalls(response.toolCalls)\n .setRawResponse(response.raw)\n .setUsage(response.usage)\n .setJsonMode(jsonMode)\n .build();\n } catch (error) {\n throw ErrorHandler.wrapProviderError(error, provider, 'ModelRunner.run');\n }\n }\n\n /**\n * Get supported providers\n */\n static getSupportedProviders(): string[] {\n return ProviderFactory.getSupportedProviders();\n }\n\n /**\n * Check if a provider supports specific features\n */\n static getProviderCapabilities(provider: ModelRunnerProvider):\n | {\n jsonMode: boolean;\n tools: boolean;\n streaming: boolean;\n }\n | undefined {\n const config = ConfigurationValidator.getProviderConfig(provider);\n return config?.supportedFeatures;\n }\n\n /**\n * Update runtime configuration\n */\n static updateRuntimeConfig(\n config: Partial<Parameters<typeof RuntimeConfigManager.updateConfig>[0]>\n ): void {\n RuntimeConfigManager.updateConfig(config);\n }\n\n /**\n * Validate inputs before processing\n */\n private validateInputs(\n provider: ModelRunnerProvider,\n model: string,\n options: Record<string, unknown>\n ): void {\n ConfigurationValidator.validateProvider(provider, this.environment);\n ConfigurationValidator.validateModel(provider, model);\n ConfigurationValidator.validateOptions(provider, options);\n }\n\n /**\n * Validate that the provider supports the requested features\n */\n private validateCapabilities(\n provider: ModelProvider,\n jsonMode: boolean,\n options: Record<string, unknown>\n ): void {\n if (jsonMode && !provider.supportsJsonMode()) {\n throw new ConfigurationError(\n `Provider ${provider.providerType} does not support JSON mode`,\n provider.providerType\n );\n }\n\n if (options?.tools && !provider.supportsTools()) {\n throw new ConfigurationError(\n `Provider ${provider.providerType} does not support tools`,\n provider.providerType\n );\n }\n }\n}\n"],"mappings":"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","names":["delay"]}
package/dist/index.d.cts DELETED
@@ -1,111 +0,0 @@
1
- import { AiModels } from '@cloudflare/workers-types';
2
-
3
- type AgentRole = 'system' | 'user' | 'assistant';
4
- interface AgentMessage {
5
- role: AgentRole;
6
- content: string;
7
- name?: string;
8
- }
9
- interface ToolCall {
10
- id: string;
11
- type: 'function';
12
- function: {
13
- name: string;
14
- arguments: string;
15
- };
16
- }
17
- type ModelRunnerProvider = 'cloudflare' | 'groq';
18
- type ModelRunnerConfig = {
19
- provider: ModelRunnerProvider;
20
- model: string;
21
- };
22
- type ModelRunnerEnvironment<T> = Record<string, T>;
23
- type ModelRunnerRunParams = {
24
- messages: AgentMessage[];
25
- jsonMode?: boolean;
26
- options?: Record<string, unknown>;
27
- model: ModelRunnerConfig;
28
- };
29
- type ModelRunnerUsage = {
30
- promptTokens: number;
31
- completionTokens: number;
32
- totalTokens: number;
33
- };
34
- type ModelRunnerResult<T> = {
35
- content: string;
36
- isJson: boolean;
37
- tool_calls: ToolCall[];
38
- raw: unknown;
39
- usage: ModelRunnerUsage;
40
- json: () => T | null;
41
- };
42
- declare class ProviderError extends Error {
43
- readonly provider: string;
44
- readonly statusCode?: number | undefined;
45
- readonly originalError?: unknown | undefined;
46
- constructor(message: string, provider: string, statusCode?: number | undefined, originalError?: unknown | undefined);
47
- }
48
- declare class ConfigurationError extends Error {
49
- readonly provider: string;
50
- constructor(message: string, provider: string);
51
- }
52
-
53
- declare const cloudflareAIModel: (model: keyof AiModels) => ModelRunnerConfig;
54
-
55
- type GroqModelsList = 'llama-3.1-8b-instant' | 'llama-3.3-70b-versatile' | 'meta-llama/llama-guard-4-12b' | 'openai/gpt-oss-120b' | 'openai/gpt-oss-20b' | 'whisper-large-v3' | 'whisper-large-v3-turbo';
56
- declare const groqAIModel: (model: GroqModelsList) => ModelRunnerConfig;
57
-
58
- interface RuntimeConfig {
59
- timeout?: number;
60
- retries?: {
61
- maxAttempts: number;
62
- baseDelay: number;
63
- maxDelay: number;
64
- };
65
- caching?: {
66
- enabled: boolean;
67
- ttl: number;
68
- };
69
- logging?: {
70
- enabled: boolean;
71
- level: 'debug' | 'info' | 'warn' | 'error';
72
- };
73
- }
74
- declare class RuntimeConfigManager {
75
- private static defaultConfig;
76
- static getConfig(): RuntimeConfig;
77
- static updateConfig(updates: Partial<RuntimeConfig>): void;
78
- private static deepMerge;
79
- }
80
-
81
- declare class ModelRunner {
82
- private environment;
83
- constructor(environment: ModelRunnerEnvironment<unknown>);
84
- run<T>({ messages, model, jsonMode, options, }: ModelRunnerRunParams): Promise<ModelRunnerResult<T>>;
85
- /**
86
- * Get supported providers
87
- */
88
- static getSupportedProviders(): string[];
89
- /**
90
- * Check if a provider supports specific features
91
- */
92
- static getProviderCapabilities(provider: ModelRunnerProvider): {
93
- jsonMode: boolean;
94
- tools: boolean;
95
- streaming: boolean;
96
- } | undefined;
97
- /**
98
- * Update runtime configuration
99
- */
100
- static updateRuntimeConfig(config: Partial<Parameters<typeof RuntimeConfigManager.updateConfig>[0]>): void;
101
- /**
102
- * Validate inputs before processing
103
- */
104
- private validateInputs;
105
- /**
106
- * Validate that the provider supports the requested features
107
- */
108
- private validateCapabilities;
109
- }
110
-
111
- export { ConfigurationError, ModelRunner, ProviderError, cloudflareAIModel, groqAIModel };