@elizaos/plugin-groq 1.0.4 → 2.0.0-alpha.10

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/index.js DELETED
@@ -1,1041 +0,0 @@
1
- // src/index.ts
2
- import { createGroq } from "@ai-sdk/groq";
3
- import {
4
- ModelType,
5
- ServiceType,
6
- logger
7
- } from "@elizaos/core";
8
- import { generateObject, generateText } from "ai";
9
- import { encodingForModel } from "js-tiktoken";
10
-
11
- // node_modules/@opentelemetry/api/build/esm/platform/node/globalThis.js
12
- var _globalThis = typeof globalThis === "object" ? globalThis : global;
13
-
14
- // node_modules/@opentelemetry/api/build/esm/version.js
15
- var VERSION = "1.9.0";
16
-
17
- // node_modules/@opentelemetry/api/build/esm/internal/semver.js
18
- var re = /^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;
19
- function _makeCompatibilityCheck(ownVersion) {
20
- var acceptedVersions = /* @__PURE__ */ new Set([ownVersion]);
21
- var rejectedVersions = /* @__PURE__ */ new Set();
22
- var myVersionMatch = ownVersion.match(re);
23
- if (!myVersionMatch) {
24
- return function() {
25
- return false;
26
- };
27
- }
28
- var ownVersionParsed = {
29
- major: +myVersionMatch[1],
30
- minor: +myVersionMatch[2],
31
- patch: +myVersionMatch[3],
32
- prerelease: myVersionMatch[4]
33
- };
34
- if (ownVersionParsed.prerelease != null) {
35
- return function isExactmatch(globalVersion) {
36
- return globalVersion === ownVersion;
37
- };
38
- }
39
- function _reject(v) {
40
- rejectedVersions.add(v);
41
- return false;
42
- }
43
- function _accept(v) {
44
- acceptedVersions.add(v);
45
- return true;
46
- }
47
- return function isCompatible2(globalVersion) {
48
- if (acceptedVersions.has(globalVersion)) {
49
- return true;
50
- }
51
- if (rejectedVersions.has(globalVersion)) {
52
- return false;
53
- }
54
- var globalVersionMatch = globalVersion.match(re);
55
- if (!globalVersionMatch) {
56
- return _reject(globalVersion);
57
- }
58
- var globalVersionParsed = {
59
- major: +globalVersionMatch[1],
60
- minor: +globalVersionMatch[2],
61
- patch: +globalVersionMatch[3],
62
- prerelease: globalVersionMatch[4]
63
- };
64
- if (globalVersionParsed.prerelease != null) {
65
- return _reject(globalVersion);
66
- }
67
- if (ownVersionParsed.major !== globalVersionParsed.major) {
68
- return _reject(globalVersion);
69
- }
70
- if (ownVersionParsed.major === 0) {
71
- if (ownVersionParsed.minor === globalVersionParsed.minor && ownVersionParsed.patch <= globalVersionParsed.patch) {
72
- return _accept(globalVersion);
73
- }
74
- return _reject(globalVersion);
75
- }
76
- if (ownVersionParsed.minor <= globalVersionParsed.minor) {
77
- return _accept(globalVersion);
78
- }
79
- return _reject(globalVersion);
80
- };
81
- }
82
- var isCompatible = _makeCompatibilityCheck(VERSION);
83
-
84
- // node_modules/@opentelemetry/api/build/esm/internal/global-utils.js
85
- var major = VERSION.split(".")[0];
86
- var GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for("opentelemetry.js.api." + major);
87
- var _global = _globalThis;
88
- function registerGlobal(type, instance, diag, allowOverride) {
89
- var _a;
90
- if (allowOverride === void 0) {
91
- allowOverride = false;
92
- }
93
- var api = _global[GLOBAL_OPENTELEMETRY_API_KEY] = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) !== null && _a !== void 0 ? _a : {
94
- version: VERSION
95
- };
96
- if (!allowOverride && api[type]) {
97
- var err = new Error("@opentelemetry/api: Attempted duplicate registration of API: " + type);
98
- diag.error(err.stack || err.message);
99
- return false;
100
- }
101
- if (api.version !== VERSION) {
102
- var err = new Error("@opentelemetry/api: Registration of version v" + api.version + " for " + type + " does not match previously registered API v" + VERSION);
103
- diag.error(err.stack || err.message);
104
- return false;
105
- }
106
- api[type] = instance;
107
- diag.debug("@opentelemetry/api: Registered a global for " + type + " v" + VERSION + ".");
108
- return true;
109
- }
110
- function getGlobal(type) {
111
- var _a, _b;
112
- var globalVersion = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _a === void 0 ? void 0 : _a.version;
113
- if (!globalVersion || !isCompatible(globalVersion)) {
114
- return;
115
- }
116
- return (_b = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _b === void 0 ? void 0 : _b[type];
117
- }
118
- function unregisterGlobal(type, diag) {
119
- diag.debug("@opentelemetry/api: Unregistering a global for " + type + " v" + VERSION + ".");
120
- var api = _global[GLOBAL_OPENTELEMETRY_API_KEY];
121
- if (api) {
122
- delete api[type];
123
- }
124
- }
125
-
126
- // node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js
127
- var __read = function(o, n) {
128
- var m = typeof Symbol === "function" && o[Symbol.iterator];
129
- if (!m) return o;
130
- var i = m.call(o), r, ar = [], e;
131
- try {
132
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
133
- } catch (error) {
134
- e = { error };
135
- } finally {
136
- try {
137
- if (r && !r.done && (m = i["return"])) m.call(i);
138
- } finally {
139
- if (e) throw e.error;
140
- }
141
- }
142
- return ar;
143
- };
144
- var __spreadArray = function(to, from, pack) {
145
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
146
- if (ar || !(i in from)) {
147
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
148
- ar[i] = from[i];
149
- }
150
- }
151
- return to.concat(ar || Array.prototype.slice.call(from));
152
- };
153
- var DiagComponentLogger = (
154
- /** @class */
155
- function() {
156
- function DiagComponentLogger2(props) {
157
- this._namespace = props.namespace || "DiagComponentLogger";
158
- }
159
- DiagComponentLogger2.prototype.debug = function() {
160
- var args = [];
161
- for (var _i = 0; _i < arguments.length; _i++) {
162
- args[_i] = arguments[_i];
163
- }
164
- return logProxy("debug", this._namespace, args);
165
- };
166
- DiagComponentLogger2.prototype.error = function() {
167
- var args = [];
168
- for (var _i = 0; _i < arguments.length; _i++) {
169
- args[_i] = arguments[_i];
170
- }
171
- return logProxy("error", this._namespace, args);
172
- };
173
- DiagComponentLogger2.prototype.info = function() {
174
- var args = [];
175
- for (var _i = 0; _i < arguments.length; _i++) {
176
- args[_i] = arguments[_i];
177
- }
178
- return logProxy("info", this._namespace, args);
179
- };
180
- DiagComponentLogger2.prototype.warn = function() {
181
- var args = [];
182
- for (var _i = 0; _i < arguments.length; _i++) {
183
- args[_i] = arguments[_i];
184
- }
185
- return logProxy("warn", this._namespace, args);
186
- };
187
- DiagComponentLogger2.prototype.verbose = function() {
188
- var args = [];
189
- for (var _i = 0; _i < arguments.length; _i++) {
190
- args[_i] = arguments[_i];
191
- }
192
- return logProxy("verbose", this._namespace, args);
193
- };
194
- return DiagComponentLogger2;
195
- }()
196
- );
197
- function logProxy(funcName, namespace, args) {
198
- var logger2 = getGlobal("diag");
199
- if (!logger2) {
200
- return;
201
- }
202
- args.unshift(namespace);
203
- return logger2[funcName].apply(logger2, __spreadArray([], __read(args), false));
204
- }
205
-
206
- // node_modules/@opentelemetry/api/build/esm/diag/types.js
207
- var DiagLogLevel;
208
- (function(DiagLogLevel2) {
209
- DiagLogLevel2[DiagLogLevel2["NONE"] = 0] = "NONE";
210
- DiagLogLevel2[DiagLogLevel2["ERROR"] = 30] = "ERROR";
211
- DiagLogLevel2[DiagLogLevel2["WARN"] = 50] = "WARN";
212
- DiagLogLevel2[DiagLogLevel2["INFO"] = 60] = "INFO";
213
- DiagLogLevel2[DiagLogLevel2["DEBUG"] = 70] = "DEBUG";
214
- DiagLogLevel2[DiagLogLevel2["VERBOSE"] = 80] = "VERBOSE";
215
- DiagLogLevel2[DiagLogLevel2["ALL"] = 9999] = "ALL";
216
- })(DiagLogLevel || (DiagLogLevel = {}));
217
-
218
- // node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js
219
- function createLogLevelDiagLogger(maxLevel, logger2) {
220
- if (maxLevel < DiagLogLevel.NONE) {
221
- maxLevel = DiagLogLevel.NONE;
222
- } else if (maxLevel > DiagLogLevel.ALL) {
223
- maxLevel = DiagLogLevel.ALL;
224
- }
225
- logger2 = logger2 || {};
226
- function _filterFunc(funcName, theLevel) {
227
- var theFunc = logger2[funcName];
228
- if (typeof theFunc === "function" && maxLevel >= theLevel) {
229
- return theFunc.bind(logger2);
230
- }
231
- return function() {
232
- };
233
- }
234
- return {
235
- error: _filterFunc("error", DiagLogLevel.ERROR),
236
- warn: _filterFunc("warn", DiagLogLevel.WARN),
237
- info: _filterFunc("info", DiagLogLevel.INFO),
238
- debug: _filterFunc("debug", DiagLogLevel.DEBUG),
239
- verbose: _filterFunc("verbose", DiagLogLevel.VERBOSE)
240
- };
241
- }
242
-
243
- // node_modules/@opentelemetry/api/build/esm/api/diag.js
244
- var __read2 = function(o, n) {
245
- var m = typeof Symbol === "function" && o[Symbol.iterator];
246
- if (!m) return o;
247
- var i = m.call(o), r, ar = [], e;
248
- try {
249
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
250
- } catch (error) {
251
- e = { error };
252
- } finally {
253
- try {
254
- if (r && !r.done && (m = i["return"])) m.call(i);
255
- } finally {
256
- if (e) throw e.error;
257
- }
258
- }
259
- return ar;
260
- };
261
- var __spreadArray2 = function(to, from, pack) {
262
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
263
- if (ar || !(i in from)) {
264
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
265
- ar[i] = from[i];
266
- }
267
- }
268
- return to.concat(ar || Array.prototype.slice.call(from));
269
- };
270
- var API_NAME = "diag";
271
- var DiagAPI = (
272
- /** @class */
273
- function() {
274
- function DiagAPI2() {
275
- function _logProxy(funcName) {
276
- return function() {
277
- var args = [];
278
- for (var _i = 0; _i < arguments.length; _i++) {
279
- args[_i] = arguments[_i];
280
- }
281
- var logger2 = getGlobal("diag");
282
- if (!logger2)
283
- return;
284
- return logger2[funcName].apply(logger2, __spreadArray2([], __read2(args), false));
285
- };
286
- }
287
- var self = this;
288
- var setLogger = function(logger2, optionsOrLogLevel) {
289
- var _a, _b, _c;
290
- if (optionsOrLogLevel === void 0) {
291
- optionsOrLogLevel = { logLevel: DiagLogLevel.INFO };
292
- }
293
- if (logger2 === self) {
294
- var err = new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");
295
- self.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);
296
- return false;
297
- }
298
- if (typeof optionsOrLogLevel === "number") {
299
- optionsOrLogLevel = {
300
- logLevel: optionsOrLogLevel
301
- };
302
- }
303
- var oldLogger = getGlobal("diag");
304
- var newLogger = createLogLevelDiagLogger((_b = optionsOrLogLevel.logLevel) !== null && _b !== void 0 ? _b : DiagLogLevel.INFO, logger2);
305
- if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {
306
- var stack = (_c = new Error().stack) !== null && _c !== void 0 ? _c : "<failed to generate stacktrace>";
307
- oldLogger.warn("Current logger will be overwritten from " + stack);
308
- newLogger.warn("Current logger will overwrite one already registered from " + stack);
309
- }
310
- return registerGlobal("diag", newLogger, self, true);
311
- };
312
- self.setLogger = setLogger;
313
- self.disable = function() {
314
- unregisterGlobal(API_NAME, self);
315
- };
316
- self.createComponentLogger = function(options) {
317
- return new DiagComponentLogger(options);
318
- };
319
- self.verbose = _logProxy("verbose");
320
- self.debug = _logProxy("debug");
321
- self.info = _logProxy("info");
322
- self.warn = _logProxy("warn");
323
- self.error = _logProxy("error");
324
- }
325
- DiagAPI2.instance = function() {
326
- if (!this._instance) {
327
- this._instance = new DiagAPI2();
328
- }
329
- return this._instance;
330
- };
331
- return DiagAPI2;
332
- }()
333
- );
334
-
335
- // node_modules/@opentelemetry/api/build/esm/context/context.js
336
- var BaseContext = (
337
- /** @class */
338
- /* @__PURE__ */ function() {
339
- function BaseContext2(parentContext) {
340
- var self = this;
341
- self._currentContext = parentContext ? new Map(parentContext) : /* @__PURE__ */ new Map();
342
- self.getValue = function(key) {
343
- return self._currentContext.get(key);
344
- };
345
- self.setValue = function(key, value) {
346
- var context2 = new BaseContext2(self._currentContext);
347
- context2._currentContext.set(key, value);
348
- return context2;
349
- };
350
- self.deleteValue = function(key) {
351
- var context2 = new BaseContext2(self._currentContext);
352
- context2._currentContext.delete(key);
353
- return context2;
354
- };
355
- }
356
- return BaseContext2;
357
- }()
358
- );
359
- var ROOT_CONTEXT = new BaseContext();
360
-
361
- // node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js
362
- var __read3 = function(o, n) {
363
- var m = typeof Symbol === "function" && o[Symbol.iterator];
364
- if (!m) return o;
365
- var i = m.call(o), r, ar = [], e;
366
- try {
367
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
368
- } catch (error) {
369
- e = { error };
370
- } finally {
371
- try {
372
- if (r && !r.done && (m = i["return"])) m.call(i);
373
- } finally {
374
- if (e) throw e.error;
375
- }
376
- }
377
- return ar;
378
- };
379
- var __spreadArray3 = function(to, from, pack) {
380
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
381
- if (ar || !(i in from)) {
382
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
383
- ar[i] = from[i];
384
- }
385
- }
386
- return to.concat(ar || Array.prototype.slice.call(from));
387
- };
388
- var NoopContextManager = (
389
- /** @class */
390
- function() {
391
- function NoopContextManager2() {
392
- }
393
- NoopContextManager2.prototype.active = function() {
394
- return ROOT_CONTEXT;
395
- };
396
- NoopContextManager2.prototype.with = function(_context, fn, thisArg) {
397
- var args = [];
398
- for (var _i = 3; _i < arguments.length; _i++) {
399
- args[_i - 3] = arguments[_i];
400
- }
401
- return fn.call.apply(fn, __spreadArray3([thisArg], __read3(args), false));
402
- };
403
- NoopContextManager2.prototype.bind = function(_context, target) {
404
- return target;
405
- };
406
- NoopContextManager2.prototype.enable = function() {
407
- return this;
408
- };
409
- NoopContextManager2.prototype.disable = function() {
410
- return this;
411
- };
412
- return NoopContextManager2;
413
- }()
414
- );
415
-
416
- // node_modules/@opentelemetry/api/build/esm/api/context.js
417
- var __read4 = function(o, n) {
418
- var m = typeof Symbol === "function" && o[Symbol.iterator];
419
- if (!m) return o;
420
- var i = m.call(o), r, ar = [], e;
421
- try {
422
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
423
- } catch (error) {
424
- e = { error };
425
- } finally {
426
- try {
427
- if (r && !r.done && (m = i["return"])) m.call(i);
428
- } finally {
429
- if (e) throw e.error;
430
- }
431
- }
432
- return ar;
433
- };
434
- var __spreadArray4 = function(to, from, pack) {
435
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
436
- if (ar || !(i in from)) {
437
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
438
- ar[i] = from[i];
439
- }
440
- }
441
- return to.concat(ar || Array.prototype.slice.call(from));
442
- };
443
- var API_NAME2 = "context";
444
- var NOOP_CONTEXT_MANAGER = new NoopContextManager();
445
- var ContextAPI = (
446
- /** @class */
447
- function() {
448
- function ContextAPI2() {
449
- }
450
- ContextAPI2.getInstance = function() {
451
- if (!this._instance) {
452
- this._instance = new ContextAPI2();
453
- }
454
- return this._instance;
455
- };
456
- ContextAPI2.prototype.setGlobalContextManager = function(contextManager) {
457
- return registerGlobal(API_NAME2, contextManager, DiagAPI.instance());
458
- };
459
- ContextAPI2.prototype.active = function() {
460
- return this._getContextManager().active();
461
- };
462
- ContextAPI2.prototype.with = function(context2, fn, thisArg) {
463
- var _a;
464
- var args = [];
465
- for (var _i = 3; _i < arguments.length; _i++) {
466
- args[_i - 3] = arguments[_i];
467
- }
468
- return (_a = this._getContextManager()).with.apply(_a, __spreadArray4([context2, fn, thisArg], __read4(args), false));
469
- };
470
- ContextAPI2.prototype.bind = function(context2, target) {
471
- return this._getContextManager().bind(context2, target);
472
- };
473
- ContextAPI2.prototype._getContextManager = function() {
474
- return getGlobal(API_NAME2) || NOOP_CONTEXT_MANAGER;
475
- };
476
- ContextAPI2.prototype.disable = function() {
477
- this._getContextManager().disable();
478
- unregisterGlobal(API_NAME2, DiagAPI.instance());
479
- };
480
- return ContextAPI2;
481
- }()
482
- );
483
-
484
- // node_modules/@opentelemetry/api/build/esm/trace/status.js
485
- var SpanStatusCode;
486
- (function(SpanStatusCode2) {
487
- SpanStatusCode2[SpanStatusCode2["UNSET"] = 0] = "UNSET";
488
- SpanStatusCode2[SpanStatusCode2["OK"] = 1] = "OK";
489
- SpanStatusCode2[SpanStatusCode2["ERROR"] = 2] = "ERROR";
490
- })(SpanStatusCode || (SpanStatusCode = {}));
491
-
492
- // node_modules/@opentelemetry/api/build/esm/context-api.js
493
- var context = ContextAPI.getInstance();
494
-
495
- // src/index.ts
496
- function getBaseURL(runtime) {
497
- return runtime.getSetting("GROQ_BASE_URL") || "https://api.groq.com/openai/v1";
498
- }
499
- function findModelName(runtime, model) {
500
- try {
501
- const name = model === ModelType.TEXT_SMALL ? runtime.getSetting("GROQ_SMALL_MODEL") ?? "llama-3.1-8b-instant" : runtime.getSetting("GROQ_LARGE_MODEL") ?? "qwen-qwq-32b";
502
- return name;
503
- } catch (error) {
504
- logger.error("Error in findModelName:", error);
505
- return "llama-3.1-8b-instant";
506
- }
507
- }
508
- async function tokenizeText(runtime, model, prompt) {
509
- try {
510
- const encoding = encodingForModel(findModelName(runtime, model));
511
- const tokens = encoding.encode(prompt);
512
- return tokens;
513
- } catch (error) {
514
- logger.error("Error in tokenizeText:", error);
515
- return [];
516
- }
517
- }
518
- async function detokenizeText(runtime, model, tokens) {
519
- try {
520
- const modelName = findModelName(runtime, model);
521
- const encoding = encodingForModel(modelName);
522
- return encoding.decode(tokens);
523
- } catch (error) {
524
- logger.error("Error in detokenizeText:", error);
525
- return "";
526
- }
527
- }
528
- async function handleRateLimitError(error, retryFn) {
529
- try {
530
- if (error.message.includes("Rate limit reached")) {
531
- logger.warn("Groq rate limit reached", { error: error.message });
532
- let retryDelay = 1e4;
533
- const delayMatch = error.message.match(/try again in (\d+\.?\d*)s/i);
534
- if (delayMatch?.[1]) {
535
- retryDelay = Math.ceil(Number.parseFloat(delayMatch[1]) * 1e3) + 1e3;
536
- }
537
- logger.info(`Will retry after ${retryDelay}ms delay`);
538
- await new Promise((resolve) => setTimeout(resolve, retryDelay));
539
- logger.info("Retrying request after rate limit delay");
540
- return await retryFn();
541
- }
542
- logger.error("Error with Groq API:", error);
543
- throw error;
544
- } catch (retryError) {
545
- logger.error("Error during retry handling:", retryError);
546
- throw retryError;
547
- }
548
- }
549
- function getTracer(runtime) {
550
- const availableServices = Array.from(runtime.getAllServices().keys());
551
- logger.debug(`[getTracer] Available services: ${JSON.stringify(availableServices)}`);
552
- logger.debug(`[getTracer] Attempting to get service with key: ${ServiceType.INSTRUMENTATION}`);
553
- const instrumentationService = runtime.getService(
554
- ServiceType.INSTRUMENTATION
555
- );
556
- if (!instrumentationService) {
557
- logger.warn(`[getTracer] Service ${ServiceType.INSTRUMENTATION} not found in runtime.`);
558
- return null;
559
- }
560
- if (!instrumentationService.isEnabled()) {
561
- logger.debug("[getTracer] Instrumentation service found but is disabled.");
562
- return null;
563
- }
564
- logger.debug("[getTracer] Successfully retrieved enabled instrumentation service.");
565
- return instrumentationService.getTracer("eliza.llm.openai");
566
- }
567
- async function startLlmSpan(runtime, spanName, attributes, fn) {
568
- const tracer = getTracer(runtime);
569
- if (!tracer) {
570
- const dummySpan = {
571
- setAttribute: () => {
572
- },
573
- setAttributes: () => {
574
- },
575
- addEvent: () => {
576
- },
577
- recordException: () => {
578
- },
579
- setStatus: () => {
580
- },
581
- end: () => {
582
- },
583
- spanContext: () => ({ traceId: "", spanId: "", traceFlags: 0 })
584
- };
585
- return fn(dummySpan);
586
- }
587
- const activeContext = context.active();
588
- return tracer.startActiveSpan(spanName, { attributes }, activeContext, async (span) => {
589
- try {
590
- const result = await fn(span);
591
- span.setStatus({ code: SpanStatusCode.OK });
592
- span.end();
593
- return result;
594
- } catch (error) {
595
- const message = error instanceof Error ? error.message : String(error);
596
- span.recordException(error);
597
- span.setStatus({ code: SpanStatusCode.ERROR, message });
598
- span.end();
599
- throw error;
600
- }
601
- });
602
- }
603
- async function generateGroqText(groq, model, params) {
604
- try {
605
- const { text: groqResponse } = await generateText({
606
- model: groq.languageModel(model),
607
- prompt: params.prompt,
608
- system: params.system,
609
- temperature: params.temperature,
610
- maxTokens: params.maxTokens,
611
- frequencyPenalty: params.frequencyPenalty,
612
- presencePenalty: params.presencePenalty,
613
- stopSequences: params.stopSequences
614
- });
615
- return groqResponse;
616
- } catch (error) {
617
- try {
618
- return await handleRateLimitError(error, async () => {
619
- const { text: groqRetryResponse } = await generateText({
620
- model: groq.languageModel(model),
621
- prompt: params.prompt,
622
- system: params.system,
623
- temperature: params.temperature,
624
- maxTokens: params.maxTokens,
625
- frequencyPenalty: params.frequencyPenalty,
626
- presencePenalty: params.presencePenalty,
627
- stopSequences: params.stopSequences
628
- });
629
- return groqRetryResponse;
630
- });
631
- } catch (retryError) {
632
- logger.error("Final error in generateGroqText:", retryError);
633
- return "Error generating text. Please try again later.";
634
- }
635
- }
636
- }
637
- async function generateGroqObject(groq, model, params) {
638
- try {
639
- const { object } = await generateObject({
640
- model: groq.languageModel(model),
641
- output: "no-schema",
642
- prompt: params.prompt,
643
- temperature: params.temperature
644
- });
645
- return object;
646
- } catch (error) {
647
- logger.error("Error generating object:", error);
648
- return {};
649
- }
650
- }
651
- var groqPlugin = {
652
- name: "groq",
653
- description: "Groq plugin",
654
- async init(config, runtime) {
655
- if (!runtime.getSetting("GROQ_API_KEY")) {
656
- throw Error("Missing GROQ_API_KEY in environment variables");
657
- }
658
- },
659
- models: {
660
- [ModelType.TEXT_TOKENIZER_ENCODE]: async (runtime, { prompt, modelType = ModelType.TEXT_LARGE }) => {
661
- try {
662
- return await tokenizeText(runtime, modelType ?? ModelType.TEXT_LARGE, prompt);
663
- } catch (error) {
664
- logger.error("Error in TEXT_TOKENIZER_ENCODE model:", error);
665
- return [];
666
- }
667
- },
668
- [ModelType.TEXT_TOKENIZER_DECODE]: async (runtime, { tokens, modelType = ModelType.TEXT_LARGE }) => {
669
- try {
670
- return await detokenizeText(runtime, modelType ?? ModelType.TEXT_LARGE, tokens);
671
- } catch (error) {
672
- logger.error("Error in TEXT_TOKENIZER_DECODE model:", error);
673
- return "";
674
- }
675
- },
676
- [ModelType.TEXT_SMALL]: async (runtime, { prompt, stopSequences = [] }) => {
677
- try {
678
- const temperature = 0.7;
679
- const frequency_penalty = 0.7;
680
- const presence_penalty = 0.7;
681
- const max_response_length = 8e3;
682
- const baseURL = getBaseURL(runtime);
683
- const groq = createGroq({
684
- apiKey: runtime.getSetting("GROQ_API_KEY"),
685
- fetch: runtime.fetch,
686
- baseURL
687
- });
688
- const model = runtime.getSetting("GROQ_SMALL_MODEL") ?? runtime.getSetting("SMALL_MODEL") ?? "llama-3.1-8b-instant";
689
- logger.log("generating text");
690
- logger.log(prompt);
691
- return await generateGroqText(groq, model, {
692
- prompt,
693
- system: runtime.character.system ?? void 0,
694
- temperature,
695
- maxTokens: max_response_length,
696
- frequencyPenalty: frequency_penalty,
697
- presencePenalty: presence_penalty,
698
- stopSequences
699
- });
700
- } catch (error) {
701
- logger.error("Error in TEXT_SMALL model:", error);
702
- return "Error generating text. Please try again later.";
703
- }
704
- },
705
- [ModelType.TEXT_LARGE]: async (runtime, {
706
- prompt,
707
- stopSequences = [],
708
- maxTokens = 8192,
709
- temperature = 0.7,
710
- frequencyPenalty = 0.7,
711
- presencePenalty = 0.7
712
- }) => {
713
- try {
714
- const model = runtime.getSetting("GROQ_LARGE_MODEL") ?? runtime.getSetting("LARGE_MODEL") ?? "qwen-qwq-32b";
715
- const baseURL = getBaseURL(runtime);
716
- const groq = createGroq({
717
- apiKey: runtime.getSetting("GROQ_API_KEY"),
718
- fetch: runtime.fetch,
719
- baseURL
720
- });
721
- return await generateGroqText(groq, model, {
722
- prompt,
723
- system: runtime.character.system ?? void 0,
724
- temperature,
725
- maxTokens,
726
- frequencyPenalty,
727
- presencePenalty,
728
- stopSequences
729
- });
730
- } catch (error) {
731
- logger.error("Error in TEXT_LARGE model:", error);
732
- return "Error generating text. Please try again later.";
733
- }
734
- },
735
- [ModelType.IMAGE]: async (runtime, params) => {
736
- try {
737
- const baseURL = getBaseURL(runtime);
738
- const response = await fetch(`${baseURL}/images/generations`, {
739
- method: "POST",
740
- headers: {
741
- Authorization: `Bearer ${runtime.getSetting("GROQ_API_KEY")}`,
742
- "Content-Type": "application/json"
743
- },
744
- body: JSON.stringify({
745
- prompt: params.prompt,
746
- n: params.n || 1,
747
- size: params.size || "1024x1024"
748
- })
749
- });
750
- if (!response.ok) {
751
- logger.error(`Failed to generate image: ${response.statusText}`);
752
- return [{ url: "" }];
753
- }
754
- const data = await response.json();
755
- const typedData = data;
756
- return typedData.data;
757
- } catch (error) {
758
- logger.error("Error in IMAGE model:", error);
759
- return [{ url: "" }];
760
- }
761
- },
762
- [ModelType.TRANSCRIPTION]: async (runtime, audioBuffer) => {
763
- try {
764
- const baseURL = getBaseURL(runtime);
765
- const formData = new FormData();
766
- const file = new File([audioBuffer], "audio.mp3", { type: "audio/mp3" });
767
- formData.append("file", file);
768
- formData.append("model", "distil-whisper-large-v3-en");
769
- const response = await fetch(`${baseURL}/audio/transcriptions`, {
770
- method: "POST",
771
- headers: {
772
- Authorization: `Bearer ${runtime.getSetting("GROQ_API_KEY")}`
773
- },
774
- body: formData
775
- });
776
- if (!response.ok) {
777
- logger.error(`Failed to transcribe audio: ${response.statusText}`);
778
- return "Error transcribing audio. Please try again later.";
779
- }
780
- const data = await response.json();
781
- return data.text;
782
- } catch (error) {
783
- logger.error("Error in TRANSCRIPTION model:", error);
784
- return "Error transcribing audio. Please try again later.";
785
- }
786
- },
787
- // you can include elevenlabs before this plugin to prefer elevenlabs voice
788
- // The model playai-tts requires terms acceptance. Please have the org admin accept the terms at https://console.groq.com/playground?model=playai-tts"
789
- [ModelType.TEXT_TO_SPEECH]: async (runtime, text) => {
790
- const ttsModelName = runtime.getSetting("GROQ_TTS_MODEL") || "playai-tts";
791
- const voice = runtime.getSetting("GROQ_TTS_VOICE") || "Chip-PlayAI";
792
- const attributes = {
793
- "llm.vendor": "Groq",
794
- "llm.request.type": "tts",
795
- "llm.request.model": ttsModelName,
796
- "input.text.length": text.length
797
- };
798
- return startLlmSpan(runtime, "LLM.tts", attributes, async (span) => {
799
- logger.log(`[Groq] Using TEXT_TO_SPEECH model: ${ttsModelName}`);
800
- span.addEvent("llm.prompt", { "prompt.content": text });
801
- try {
802
- const baseURL = getBaseURL(runtime);
803
- const res = await fetch(`${baseURL}/audio/speech`, {
804
- method: "POST",
805
- headers: {
806
- Authorization: `Bearer ${runtime.getSetting("GROQ_API_KEY")}`,
807
- "Content-Type": "application/json"
808
- },
809
- body: JSON.stringify({
810
- model: ttsModelName,
811
- voice,
812
- input: text
813
- //...(instructions && { instructions }),
814
- })
815
- });
816
- if (!res.ok) {
817
- const err = await res.text();
818
- throw new Error(`Groq TTS error ${res.status}: ${err}`);
819
- }
820
- const speechStream = res.body;
821
- span.addEvent("llm.response.success", {
822
- info: "Speech stream generated"
823
- });
824
- return speechStream;
825
- } catch (error) {
826
- const message = error instanceof Error ? error.message : String(error);
827
- const exception = error instanceof Error ? error : new Error(message);
828
- span.recordException(exception);
829
- span.setStatus({ code: SpanStatusCode.ERROR, message });
830
- throw error;
831
- }
832
- });
833
- },
834
- [ModelType.OBJECT_SMALL]: async (runtime, params) => {
835
- try {
836
- const baseURL = getBaseURL(runtime);
837
- const groq = createGroq({
838
- apiKey: runtime.getSetting("GROQ_API_KEY"),
839
- baseURL
840
- });
841
- const model = runtime.getSetting("GROQ_SMALL_MODEL") ?? runtime.getSetting("SMALL_MODEL") ?? "llama-3.1-8b-instant";
842
- if (params.schema) {
843
- logger.info("Using OBJECT_SMALL without schema validation");
844
- }
845
- return await generateGroqObject(groq, model, params);
846
- } catch (error) {
847
- logger.error("Error in OBJECT_SMALL model:", error);
848
- return {};
849
- }
850
- },
851
- [ModelType.OBJECT_LARGE]: async (runtime, params) => {
852
- try {
853
- const baseURL = getBaseURL(runtime);
854
- const groq = createGroq({
855
- apiKey: runtime.getSetting("GROQ_API_KEY"),
856
- baseURL
857
- });
858
- const model = runtime.getSetting("GROQ_LARGE_MODEL") ?? runtime.getSetting("LARGE_MODEL") ?? "qwen-qwq-32b";
859
- if (params.schema) {
860
- logger.info("Using OBJECT_LARGE without schema validation");
861
- }
862
- return await generateGroqObject(groq, model, params);
863
- } catch (error) {
864
- logger.error("Error in OBJECT_LARGE model:", error);
865
- return {};
866
- }
867
- }
868
- },
869
- tests: [
870
- {
871
- name: "groq_plugin_tests",
872
- tests: [
873
- {
874
- name: "groq_test_url_and_api_key_validation",
875
- fn: async (runtime) => {
876
- try {
877
- const baseURL = getBaseURL(runtime) ?? "https://api.groq.com/openai/v1";
878
- const response = await fetch(`${baseURL}/models`, {
879
- headers: {
880
- Authorization: `Bearer ${runtime.getSetting("GROQ_API_KEY")}`
881
- }
882
- });
883
- const data = await response.json();
884
- logger.log("Models Available:", data?.data?.length);
885
- if (!response.ok) {
886
- logger.error(`Failed to validate Groq API key: ${response.statusText}`);
887
- return;
888
- }
889
- } catch (error) {
890
- logger.error("Error in groq_test_url_and_api_key_validation:", error);
891
- }
892
- }
893
- },
894
- {
895
- name: "groq_test_text_large",
896
- fn: async (runtime) => {
897
- try {
898
- const text = await runtime.useModel(ModelType.TEXT_LARGE, {
899
- prompt: "What is the nature of reality in 10 words?"
900
- });
901
- if (text.length === 0) {
902
- logger.error("Failed to generate text");
903
- return;
904
- }
905
- logger.log("generated with test_text_large:", text);
906
- } catch (error) {
907
- logger.error("Error in test_text_large:", error);
908
- }
909
- }
910
- },
911
- {
912
- name: "groq_test_text_small",
913
- fn: async (runtime) => {
914
- try {
915
- const text = await runtime.useModel(ModelType.TEXT_SMALL, {
916
- prompt: "What is the nature of reality in 10 words?"
917
- });
918
- if (text.length === 0) {
919
- logger.error("Failed to generate text");
920
- return;
921
- }
922
- logger.log("generated with test_text_small:", text);
923
- } catch (error) {
924
- logger.error("Error in test_text_small:", error);
925
- }
926
- }
927
- },
928
- {
929
- name: "groq_test_image_generation",
930
- fn: async (runtime) => {
931
- try {
932
- logger.log("groq_test_image_generation");
933
- const image = await runtime.useModel(ModelType.IMAGE, {
934
- prompt: "A beautiful sunset over a calm ocean",
935
- n: 1,
936
- size: "1024x1024"
937
- });
938
- logger.log("generated with test_image_generation:", image);
939
- } catch (error) {
940
- logger.error("Error in test_image_generation:", error);
941
- }
942
- }
943
- },
944
- {
945
- name: "groq_test_transcription",
946
- fn: async (runtime) => {
947
- try {
948
- logger.log("groq_test_transcription");
949
- const response = await fetch(
950
- "https://upload.wikimedia.org/wikipedia/en/4/40/Chris_Benoit_Voice_Message.ogg"
951
- );
952
- if (!response.ok) {
953
- logger.error(`Failed to fetch audio sample: ${response.statusText}`);
954
- return;
955
- }
956
- const arrayBuffer = await response.arrayBuffer();
957
- const transcription = await runtime.useModel(
958
- ModelType.TRANSCRIPTION,
959
- Buffer.from(new Uint8Array(arrayBuffer))
960
- );
961
- logger.log("generated with test_transcription:", transcription);
962
- } catch (error) {
963
- logger.error("Error in test_transcription:", error);
964
- }
965
- }
966
- },
967
- {
968
- name: "groq_test_text_tokenizer_encode",
969
- fn: async (runtime) => {
970
- try {
971
- const prompt = "Hello tokenizer encode!";
972
- const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, { prompt });
973
- if (!Array.isArray(tokens) || tokens.length === 0) {
974
- logger.error("Failed to tokenize text: expected non-empty array of tokens");
975
- return;
976
- }
977
- logger.log("Tokenized output:", tokens);
978
- } catch (error) {
979
- logger.error("Error in test_text_tokenizer_encode:", error);
980
- }
981
- }
982
- },
983
- {
984
- name: "groq_test_text_tokenizer_decode",
985
- fn: async (runtime) => {
986
- try {
987
- const prompt = "Hello tokenizer decode!";
988
- const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, { prompt });
989
- const decodedText = await runtime.useModel(ModelType.TEXT_TOKENIZER_DECODE, {
990
- tokens
991
- });
992
- if (decodedText !== prompt) {
993
- logger.error(
994
- `Decoded text does not match original. Expected "${prompt}", got "${decodedText}"`
995
- );
996
- return;
997
- }
998
- logger.log("Decoded text:", decodedText);
999
- } catch (error) {
1000
- logger.error("Error in test_text_tokenizer_decode:", error);
1001
- }
1002
- }
1003
- },
1004
- {
1005
- name: "groq_test_object_small",
1006
- fn: async (runtime) => {
1007
- try {
1008
- const object = await runtime.useModel(ModelType.OBJECT_SMALL, {
1009
- prompt: "Generate a JSON object representing a user profile with name, age, and hobbies",
1010
- temperature: 0.7
1011
- });
1012
- logger.log("Generated object:", object);
1013
- } catch (error) {
1014
- logger.error("Error in test_object_small:", error);
1015
- }
1016
- }
1017
- },
1018
- {
1019
- name: "groq_test_object_large",
1020
- fn: async (runtime) => {
1021
- try {
1022
- const object = await runtime.useModel(ModelType.OBJECT_LARGE, {
1023
- prompt: "Generate a detailed JSON object representing a restaurant with name, cuisine type, menu items with prices, and customer reviews",
1024
- temperature: 0.7
1025
- });
1026
- logger.log("Generated object:", object);
1027
- } catch (error) {
1028
- logger.error("Error in test_object_large:", error);
1029
- }
1030
- }
1031
- }
1032
- ]
1033
- }
1034
- ]
1035
- };
1036
- var index_default = groqPlugin;
1037
- export {
1038
- index_default as default,
1039
- groqPlugin
1040
- };
1041
- //# sourceMappingURL=index.js.map