@elizaos/plugin-xai 2.0.3-beta.6 → 2.0.3-beta.7

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,eAAe,CAAC;AAQvB,eAAO,MAAM,SAAS,EAAE,MAiEvB,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./index";
2
+ export { default } from "./index";
3
+ //# sourceMappingURL=index.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.node.d.ts","sourceRoot":"","sources":["../index.node.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type GenerateTextParams, type IAgentRuntime, type TextEmbeddingParams, type TextStreamResult } from "@elizaos/core";
2
+ export declare function handleTextSmall(runtime: IAgentRuntime, params: GenerateTextParams): Promise<string | TextStreamResult>;
3
+ export declare function handleTextLarge(runtime: IAgentRuntime, params: GenerateTextParams): Promise<string | TextStreamResult>;
4
+ export declare function handleTextEmbedding(runtime: IAgentRuntime, params: TextEmbeddingParams | string | null): Promise<number[]>;
5
+ export declare function listModels(runtime: IAgentRuntime): Promise<Record<string, unknown>[]>;
6
+ export declare function isGrokConfigured(runtime: IAgentRuntime): boolean;
7
+ //# sourceMappingURL=grok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.d.ts","sourceRoot":"","sources":["../../models/grok.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAKlB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAwvBvB,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAepC;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAUpC;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,GAC1C,OAAO,CAAC,MAAM,EAAE,CAAC,CAUnB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAcpC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAKhE"}
@@ -0,0 +1,2 @@
1
+ export * from '../index';
2
+ export { default } from '../index';
@@ -0,0 +1,542 @@
1
+ // index.ts
2
+ import {
3
+ logger as logger2,
4
+ ModelType as ModelType2
5
+ } from "@elizaos/core";
6
+
7
+ // models/grok.ts
8
+ import {
9
+ EventType,
10
+ logger,
11
+ ModelType,
12
+ recordLlmCall
13
+ } from "@elizaos/core";
14
+ var XAI_API_BASE = "https://api.x.ai/v1";
15
+ var DEFAULT_MODELS = {
16
+ small: "grok-3-mini",
17
+ large: "grok-3",
18
+ embedding: "grok-embedding"
19
+ };
20
+ function getSettingString(runtime, key) {
21
+ const value = runtime.getSetting(key);
22
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
23
+ }
24
+ function normalizeBaseUrl(value) {
25
+ const raw = typeof value === "string" && value.trim() ? value.trim() : XAI_API_BASE;
26
+ let url;
27
+ try {
28
+ url = new URL(raw);
29
+ } catch {
30
+ throw new Error("XAI_BASE_URL must be a valid URL");
31
+ }
32
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
33
+ throw new Error("XAI_BASE_URL must use http or https");
34
+ }
35
+ return url.toString().replace(/\/+$/, "");
36
+ }
37
+ function normalizeModelName(value, fallback, settingName) {
38
+ if (value === undefined || value === null)
39
+ return fallback;
40
+ if (typeof value !== "string" || !value.trim()) {
41
+ throw new Error(`${settingName} must be a non-empty string`);
42
+ }
43
+ return value.trim();
44
+ }
45
+ function getConfig(runtime) {
46
+ const apiKey = getSettingString(runtime, "XAI_API_KEY") ?? getSettingString(runtime, "GROK_API_KEY");
47
+ if (!apiKey) {
48
+ throw new Error("XAI_API_KEY is required");
49
+ }
50
+ const baseUrl = runtime.getSetting("XAI_BASE_URL");
51
+ const smallModel = runtime.getSetting("XAI_SMALL_MODEL");
52
+ const largeModel = runtime.getSetting("XAI_MODEL") || runtime.getSetting("XAI_LARGE_MODEL");
53
+ const embeddingModel = runtime.getSetting("XAI_EMBEDDING_MODEL");
54
+ return {
55
+ apiKey,
56
+ baseUrl: normalizeBaseUrl(baseUrl),
57
+ smallModel: normalizeModelName(smallModel, DEFAULT_MODELS.small, "XAI_SMALL_MODEL"),
58
+ largeModel: normalizeModelName(largeModel, DEFAULT_MODELS.large, "XAI_MODEL"),
59
+ embeddingModel: normalizeModelName(embeddingModel, DEFAULT_MODELS.embedding, "XAI_EMBEDDING_MODEL")
60
+ };
61
+ }
62
+ function getFetch(runtime) {
63
+ const runtimeFetch = runtime.fetch;
64
+ return typeof runtimeFetch === "function" ? runtimeFetch.bind(runtime) : fetch;
65
+ }
66
+ function getAuthHeader(config) {
67
+ return {
68
+ Authorization: `Bearer ${config.apiKey}`,
69
+ "Content-Type": "application/json"
70
+ };
71
+ }
72
+ function normalizeXaiTools(tools) {
73
+ if (!tools)
74
+ return;
75
+ if (Array.isArray(tools)) {
76
+ return tools.map((tool) => normalizeXaiTool(tool)).filter((tool) => tool !== undefined);
77
+ }
78
+ if (typeof tools === "object") {
79
+ const out = [];
80
+ for (const [name, value] of Object.entries(tools)) {
81
+ const normalized = normalizeXaiTool({ ...value, name });
82
+ if (normalized)
83
+ out.push(normalized);
84
+ }
85
+ return out.length > 0 ? out : undefined;
86
+ }
87
+ return;
88
+ }
89
+ function normalizeXaiTool(tool) {
90
+ const name = tool.name ?? tool.function?.name;
91
+ if (!name)
92
+ return;
93
+ const description = tool.description ?? tool.function?.description;
94
+ const parameters = tool.parameters ?? tool.function?.parameters ?? tool.inputSchema ?? { type: "object" };
95
+ return {
96
+ type: "function",
97
+ function: {
98
+ name,
99
+ ...description ? { description } : {},
100
+ parameters
101
+ }
102
+ };
103
+ }
104
+ function normalizeXaiToolChoice(toolChoice) {
105
+ if (!toolChoice)
106
+ return;
107
+ if (typeof toolChoice === "string" && (toolChoice === "auto" || toolChoice === "none" || toolChoice === "required")) {
108
+ return toolChoice;
109
+ }
110
+ const choice = toolChoice;
111
+ if (choice.type === "function")
112
+ return toolChoice;
113
+ if (choice.type === "tool" && typeof choice.toolName === "string") {
114
+ return { type: "function", function: { name: choice.toolName } };
115
+ }
116
+ if (typeof choice.name === "string") {
117
+ return { type: "function", function: { name: choice.name } };
118
+ }
119
+ return;
120
+ }
121
+ function buildXaiResponseFormat(responseSchema) {
122
+ if (!responseSchema)
123
+ return;
124
+ const r = responseSchema;
125
+ const schema = r.schema ?? responseSchema;
126
+ const name = typeof r.name === "string" ? r.name : "structured_response";
127
+ return {
128
+ type: "json_schema",
129
+ json_schema: { name, schema, strict: true }
130
+ };
131
+ }
132
+ function toFiniteNumber(value) {
133
+ if (typeof value !== "number" || !Number.isFinite(value)) {
134
+ return;
135
+ }
136
+ return Math.max(0, Math.round(value));
137
+ }
138
+ function normalizeTokenUsage(usage) {
139
+ if (!usage || typeof usage !== "object") {
140
+ return null;
141
+ }
142
+ const record = usage;
143
+ const promptTokens = toFiniteNumber(record.prompt_tokens ?? record.inputTokens);
144
+ const completionTokens = toFiniteNumber(record.completion_tokens ?? record.outputTokens);
145
+ const totalTokens = toFiniteNumber(record.total_tokens ?? record.totalTokens);
146
+ if (promptTokens === undefined && completionTokens === undefined && totalTokens === undefined) {
147
+ return null;
148
+ }
149
+ const normalizedPromptTokens = promptTokens ?? (completionTokens === undefined && totalTokens !== undefined ? totalTokens : Math.max(0, (totalTokens ?? 0) - (completionTokens ?? 0)));
150
+ const normalizedCompletionTokens = completionTokens ?? Math.max(0, (totalTokens ?? normalizedPromptTokens) - normalizedPromptTokens);
151
+ return {
152
+ promptTokens: normalizedPromptTokens,
153
+ completionTokens: normalizedCompletionTokens,
154
+ totalTokens: totalTokens ?? normalizedPromptTokens + normalizedCompletionTokens
155
+ };
156
+ }
157
+ function estimateTokenCount(text) {
158
+ return text.length === 0 ? 0 : Math.ceil(text.length / 4);
159
+ }
160
+ function estimateUsage(prompt, response) {
161
+ const promptTokens = estimateTokenCount(prompt);
162
+ const completionTokens = estimateTokenCount(typeof response === "string" ? response : String(response));
163
+ return {
164
+ promptTokens,
165
+ completionTokens,
166
+ totalTokens: promptTokens + completionTokens,
167
+ estimated: true
168
+ };
169
+ }
170
+ function estimateEmbeddingUsage(text) {
171
+ const promptTokens = estimateTokenCount(text);
172
+ return {
173
+ promptTokens,
174
+ completionTokens: 0,
175
+ totalTokens: promptTokens,
176
+ estimated: true
177
+ };
178
+ }
179
+ function sanitizeTemperature(value) {
180
+ if (value === undefined)
181
+ return;
182
+ if (typeof value !== "number" || !Number.isFinite(value)) {
183
+ throw new Error("temperature must be a finite number");
184
+ }
185
+ return Math.min(2, Math.max(0, value));
186
+ }
187
+ function sanitizeMaxTokens(value) {
188
+ if (value === undefined)
189
+ return;
190
+ if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value) || value < 1) {
191
+ throw new Error("maxTokens must be a positive finite integer");
192
+ }
193
+ return value;
194
+ }
195
+ function sanitizeStopSequences(value) {
196
+ if (value === undefined)
197
+ return;
198
+ if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) {
199
+ throw new Error("stopSequences must be an array of strings");
200
+ }
201
+ return value;
202
+ }
203
+ function normalizePrompt(value) {
204
+ if (value === undefined)
205
+ return "";
206
+ if (typeof value !== "string") {
207
+ throw new Error("prompt must be a string");
208
+ }
209
+ return value;
210
+ }
211
+ function normalizeEmbeddingText(params) {
212
+ if (params === null) {
213
+ throw new Error("Null params provided for embedding");
214
+ }
215
+ if (typeof params === "string")
216
+ return params.trim();
217
+ if (!params || typeof params !== "object" || typeof params.text !== "string") {
218
+ throw new Error("Embedding text must be a string");
219
+ }
220
+ return params.text.trim();
221
+ }
222
+ function validateEmbeddingVector(embedding) {
223
+ if (!Array.isArray(embedding) || embedding.length === 0) {
224
+ throw new Error("No embedding in Grok response");
225
+ }
226
+ if (embedding.some((value) => typeof value !== "number" || !Number.isFinite(value))) {
227
+ throw new Error("Grok embedding response contained non-finite values");
228
+ }
229
+ return embedding;
230
+ }
231
+ function emitModelUsed(runtime, type, model, usage) {
232
+ runtime.emitEvent(EventType.MODEL_USED, {
233
+ runtime,
234
+ source: "xai",
235
+ provider: "xai",
236
+ type,
237
+ model,
238
+ modelName: model,
239
+ tokens: {
240
+ prompt: usage.promptTokens,
241
+ completion: usage.completionTokens,
242
+ total: usage.totalTokens,
243
+ ...usage.estimated ? { estimated: true } : {}
244
+ },
245
+ ...usage.estimated ? { usageEstimated: true } : {}
246
+ });
247
+ }
248
+ async function generateText(runtime, config, modelType, model, params) {
249
+ const paramsWithNative = params;
250
+ const promptText = normalizePrompt(params.prompt);
251
+ const tools = normalizeXaiTools(paramsWithNative.tools);
252
+ const toolChoice = normalizeXaiToolChoice(paramsWithNative.toolChoice);
253
+ const responseFormat = buildXaiResponseFormat(paramsWithNative.responseSchema);
254
+ const returnNative = Boolean(paramsWithNative.messages || paramsWithNative.tools || paramsWithNative.toolChoice || paramsWithNative.responseSchema);
255
+ const messages = paramsWithNative.messages?.length ? paramsWithNative.messages : [{ role: "user", content: promptText }];
256
+ const body = {
257
+ model,
258
+ messages
259
+ };
260
+ const temperature = sanitizeTemperature(params.temperature);
261
+ if (temperature !== undefined) {
262
+ body.temperature = temperature;
263
+ }
264
+ const maxTokens = params.omitMaxTokens ? undefined : sanitizeMaxTokens(params.maxTokens);
265
+ if (maxTokens !== undefined) {
266
+ body.max_tokens = maxTokens;
267
+ }
268
+ const stopSequences = sanitizeStopSequences(params.stopSequences);
269
+ if (stopSequences) {
270
+ body.stop = stopSequences;
271
+ }
272
+ if (tools) {
273
+ body.tools = tools;
274
+ }
275
+ if (toolChoice) {
276
+ body.tool_choice = toolChoice;
277
+ }
278
+ if (responseFormat) {
279
+ body.response_format = responseFormat;
280
+ }
281
+ if (params.stream && params.onStreamChunk) {
282
+ return createStreamTextResult(runtime, config, modelType, model, params, body, promptText);
283
+ }
284
+ if (params.stream) {
285
+ return createStreamTextResult(runtime, config, modelType, model, params, body, promptText);
286
+ }
287
+ return recordLlmCall(runtime, {
288
+ model,
289
+ systemPrompt: "",
290
+ userPrompt: promptText,
291
+ temperature: params.temperature ?? 0,
292
+ maxTokens: params.maxTokens ?? 0,
293
+ purpose: "external_llm",
294
+ actionType: "xai.chat.completions.create"
295
+ }, async () => {
296
+ const response = await getFetch(runtime)(`${config.baseUrl}/chat/completions`, {
297
+ method: "POST",
298
+ headers: getAuthHeader(config),
299
+ body: JSON.stringify(body)
300
+ });
301
+ if (!response.ok) {
302
+ const error = await response.text();
303
+ throw new Error(`Grok API error (${response.status}): ${error}`);
304
+ }
305
+ const data = await response.json();
306
+ const choice = data.choices?.[0];
307
+ const rawText = choice?.message?.content ?? "";
308
+ const rawToolCalls = choice?.message?.tool_calls ?? [];
309
+ if (!returnNative && !rawText) {
310
+ throw new Error("No content in Grok response");
311
+ }
312
+ emitModelUsed(runtime, modelType, data.model || model, normalizeTokenUsage(data.usage) ?? estimateUsage(params.prompt ?? "", rawText));
313
+ if (returnNative) {
314
+ const usage = normalizeTokenUsage(data.usage);
315
+ const native = {
316
+ text: rawText,
317
+ toolCalls: rawToolCalls.map((tc) => ({
318
+ toolCallId: tc.id,
319
+ toolName: tc.function.name,
320
+ input: parseJsonOrRaw(tc.function.arguments)
321
+ })),
322
+ finishReason: choice?.finish_reason,
323
+ ...usage ? {
324
+ usage: {
325
+ promptTokens: usage.promptTokens,
326
+ completionTokens: usage.completionTokens,
327
+ totalTokens: usage.totalTokens
328
+ }
329
+ } : {}
330
+ };
331
+ return native;
332
+ }
333
+ return rawText;
334
+ });
335
+ }
336
+ function createStreamTextResult(runtime, config, modelType, model, params, body, promptText) {
337
+ body.stream = true;
338
+ const onStreamChunk = params.onStreamChunk;
339
+ const fetchImpl = getFetch(runtime);
340
+ const state = recordLlmCall(runtime, {
341
+ model,
342
+ systemPrompt: "",
343
+ userPrompt: promptText,
344
+ temperature: params.temperature ?? 0,
345
+ maxTokens: params.maxTokens ?? 0,
346
+ purpose: "external_llm",
347
+ actionType: "xai.chat.completions.stream"
348
+ }, async () => {
349
+ const response = await fetchImpl(`${config.baseUrl}/chat/completions`, {
350
+ method: "POST",
351
+ headers: getAuthHeader(config),
352
+ body: JSON.stringify(body)
353
+ });
354
+ if (!response.ok) {
355
+ const error = await response.text();
356
+ throw new Error(`Grok API error (${response.status}): ${error}`);
357
+ }
358
+ const reader = response.body?.getReader();
359
+ if (!reader) {
360
+ throw new Error("No response body");
361
+ }
362
+ const decoder = new TextDecoder;
363
+ const chunks = [];
364
+ let buffered = "";
365
+ let usage = null;
366
+ let responseModel = model;
367
+ let finishReason;
368
+ const readLine = (line) => {
369
+ if (!line.startsWith("data: "))
370
+ return;
371
+ const data = line.slice(6).trim();
372
+ if (!data || data === "[DONE]")
373
+ return;
374
+ const parsed = JSON.parse(data);
375
+ const chunkUsage = normalizeTokenUsage(parsed.usage);
376
+ if (chunkUsage) {
377
+ usage = chunkUsage;
378
+ }
379
+ if (typeof parsed.model === "string" && parsed.model.length > 0) {
380
+ responseModel = parsed.model;
381
+ }
382
+ const choice = parsed.choices?.[0];
383
+ if (typeof choice?.finish_reason === "string") {
384
+ finishReason = choice.finish_reason;
385
+ }
386
+ const content = choice?.delta?.content;
387
+ if (content) {
388
+ chunks.push(content);
389
+ onStreamChunk?.(content);
390
+ }
391
+ };
392
+ while (true) {
393
+ const { done, value } = await reader.read();
394
+ if (done)
395
+ break;
396
+ buffered += decoder.decode(value, { stream: true });
397
+ const lines = buffered.split(/\r?\n/);
398
+ buffered = lines.pop() ?? "";
399
+ for (const line of lines) {
400
+ readLine(line);
401
+ }
402
+ }
403
+ buffered += decoder.decode();
404
+ for (const line of buffered.split(/\r?\n/)) {
405
+ readLine(line);
406
+ }
407
+ const fullText = chunks.join("");
408
+ const finalUsage = usage ?? estimateUsage(promptText, fullText);
409
+ emitModelUsed(runtime, modelType, responseModel, finalUsage);
410
+ return {
411
+ fullText,
412
+ chunks,
413
+ usage: finalUsage,
414
+ finishReason
415
+ };
416
+ });
417
+ return {
418
+ textStream: async function* () {
419
+ const result = await state;
420
+ yield* result.chunks;
421
+ }(),
422
+ text: state.then((result) => result.fullText),
423
+ usage: state.then((result) => result.usage),
424
+ finishReason: state.then((result) => result.finishReason)
425
+ };
426
+ }
427
+ function parseJsonOrRaw(value) {
428
+ if (typeof value !== "string")
429
+ return value;
430
+ try {
431
+ return JSON.parse(value);
432
+ } catch {
433
+ return value;
434
+ }
435
+ }
436
+ async function createEmbedding(runtime, config, text) {
437
+ const response = await getFetch(runtime)(`${config.baseUrl}/embeddings`, {
438
+ method: "POST",
439
+ headers: getAuthHeader(config),
440
+ body: JSON.stringify({
441
+ model: config.embeddingModel,
442
+ input: text
443
+ })
444
+ });
445
+ if (!response.ok) {
446
+ const error = await response.text();
447
+ throw new Error(`Grok Embedding API error (${response.status}): ${error}`);
448
+ }
449
+ const data = await response.json();
450
+ const embedding = validateEmbeddingVector(data.data?.[0]?.embedding);
451
+ emitModelUsed(runtime, ModelType.TEXT_EMBEDDING, data.model || config.embeddingModel, normalizeTokenUsage(data.usage) ?? estimateEmbeddingUsage(text));
452
+ return embedding;
453
+ }
454
+ async function handleTextSmall(runtime, params) {
455
+ const config = getConfig(runtime);
456
+ logger.debug(`[Grok] Generating text with model: ${config.smallModel}`);
457
+ return await generateText(runtime, config, ModelType.TEXT_SMALL, config.smallModel, params);
458
+ }
459
+ async function handleTextLarge(runtime, params) {
460
+ const config = getConfig(runtime);
461
+ logger.debug(`[Grok] Generating text with model: ${config.largeModel}`);
462
+ return await generateText(runtime, config, ModelType.TEXT_LARGE, config.largeModel, params);
463
+ }
464
+ async function handleTextEmbedding(runtime, params) {
465
+ const config = getConfig(runtime);
466
+ const text = normalizeEmbeddingText(params);
467
+ if (!text) {
468
+ throw new Error("Empty text provided for embedding");
469
+ }
470
+ logger.debug(`[Grok] Creating embedding with model: ${config.embeddingModel}`);
471
+ return createEmbedding(runtime, config, text);
472
+ }
473
+ function isGrokConfigured(runtime) {
474
+ return !!(getSettingString(runtime, "XAI_API_KEY") ?? getSettingString(runtime, "GROK_API_KEY"));
475
+ }
476
+
477
+ // index.ts
478
+ var XAIPlugin = {
479
+ name: "xai",
480
+ description: "xAI Grok models for text generation and embeddings",
481
+ autoEnable: {
482
+ envKeys: ["XAI_API_KEY", "GROK_API_KEY"]
483
+ },
484
+ init: async (_config, runtime) => {
485
+ logger2.log("Initializing xAI plugin...");
486
+ if (isGrokConfigured(runtime)) {
487
+ logger2.log("✓ Grok API configured");
488
+ } else {
489
+ logger2.warn("XAI_API_KEY not set; Grok models will fail at call time.");
490
+ }
491
+ },
492
+ models: {
493
+ [ModelType2.TEXT_SMALL]: handleTextSmall,
494
+ [ModelType2.TEXT_LARGE]: handleTextLarge,
495
+ [ModelType2.TEXT_EMBEDDING]: handleTextEmbedding
496
+ },
497
+ tests: [
498
+ {
499
+ name: "xai_plugin_tests",
500
+ tests: [
501
+ {
502
+ name: "grok_api_connectivity",
503
+ fn: async (runtime) => {
504
+ const apiKey = runtime.getSetting("XAI_API_KEY");
505
+ if (!apiKey)
506
+ return;
507
+ const baseUrl = runtime.getSetting("XAI_BASE_URL") || "https://api.x.ai/v1";
508
+ const response = await fetch(`${baseUrl}/models`, {
509
+ headers: { Authorization: `Bearer ${apiKey}` }
510
+ });
511
+ if (!response.ok) {
512
+ throw new Error(`Grok API error: ${response.status}`);
513
+ }
514
+ const data = await response.json();
515
+ logger2.info(`Grok connected: ${data.data.length} models`);
516
+ }
517
+ },
518
+ {
519
+ name: "grok_text_generation",
520
+ fn: async (runtime) => {
521
+ if (!isGrokConfigured(runtime))
522
+ return;
523
+ const text = await runtime.useModel(ModelType2.TEXT_SMALL, {
524
+ prompt: "Say hello in exactly 5 words."
525
+ });
526
+ if (typeof text !== "string" || !text) {
527
+ throw new Error("Expected non-empty string");
528
+ }
529
+ logger2.info(`Generated: "${text.slice(0, 50)}..."`);
530
+ }
531
+ }
532
+ ]
533
+ }
534
+ ]
535
+ };
536
+ var plugin_xai_default = XAIPlugin;
537
+ export {
538
+ plugin_xai_default as default,
539
+ XAIPlugin
540
+ };
541
+
542
+ //# debugId=4F413B4A6457E08764756E2164756E21
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../index.ts", "../../models/grok.ts"],
4
+ "sourcesContent": [
5
+ "import {\n type IAgentRuntime,\n logger,\n ModelType,\n type Plugin,\n} from \"@elizaos/core\";\nimport {\n handleTextEmbedding,\n handleTextLarge,\n handleTextSmall,\n isGrokConfigured,\n} from \"./models/grok\";\n\nexport const XAIPlugin: Plugin = {\n name: \"xai\",\n description: \"xAI Grok models for text generation and embeddings\",\n autoEnable: {\n envKeys: [\"XAI_API_KEY\", \"GROK_API_KEY\"],\n },\n\n init: async (_config: Record<string, string>, runtime: IAgentRuntime) => {\n logger.log(\"Initializing xAI plugin...\");\n if (isGrokConfigured(runtime)) {\n logger.log(\"✓ Grok API configured\");\n } else {\n logger.warn(\"XAI_API_KEY not set; Grok models will fail at call time.\");\n }\n },\n\n models: {\n [ModelType.TEXT_SMALL]: handleTextSmall,\n [ModelType.TEXT_LARGE]: handleTextLarge,\n [ModelType.TEXT_EMBEDDING]: handleTextEmbedding,\n },\n\n tests: [\n {\n name: \"xai_plugin_tests\",\n tests: [\n {\n name: \"grok_api_connectivity\",\n fn: async (runtime: IAgentRuntime): Promise<void> => {\n const apiKey = runtime.getSetting(\"XAI_API_KEY\");\n if (!apiKey) return;\n\n const baseUrl =\n runtime.getSetting(\"XAI_BASE_URL\") || \"https://api.x.ai/v1\";\n const response = await fetch(`${baseUrl}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n\n if (!response.ok) {\n throw new Error(`Grok API error: ${response.status}`);\n }\n\n const data = (await response.json()) as { data: unknown[] };\n logger.info(`Grok connected: ${data.data.length} models`);\n },\n },\n {\n name: \"grok_text_generation\",\n fn: async (runtime: IAgentRuntime): Promise<void> => {\n if (!isGrokConfigured(runtime)) return;\n\n const text = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: \"Say hello in exactly 5 words.\",\n });\n\n if (typeof text !== \"string\" || !text) {\n throw new Error(\"Expected non-empty string\");\n }\n\n logger.info(`Generated: \"${text.slice(0, 50)}...\"`);\n },\n },\n ],\n },\n ],\n};\n\nexport default XAIPlugin;\n",
6
+ "import {\n type EventPayload,\n EventType,\n type GenerateTextParams,\n type IAgentRuntime,\n logger,\n ModelType,\n type ModelTypeName,\n recordLlmCall,\n type TextEmbeddingParams,\n type TextStreamResult,\n} from \"@elizaos/core\";\n\nconst XAI_API_BASE = \"https://api.x.ai/v1\";\n\nconst DEFAULT_MODELS = {\n small: \"grok-3-mini\",\n large: \"grok-3\",\n embedding: \"grok-embedding\",\n} as const;\n\ninterface GrokConfig {\n apiKey: string;\n baseUrl: string;\n smallModel: string;\n largeModel: string;\n embeddingModel: string;\n}\n\nfunction getSettingString(\n runtime: IAgentRuntime,\n key: string,\n): string | undefined {\n const value = runtime.getSetting(key);\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeBaseUrl(value: unknown): string {\n const raw =\n typeof value === \"string\" && value.trim() ? value.trim() : XAI_API_BASE;\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new Error(\"XAI_BASE_URL must be a valid URL\");\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"XAI_BASE_URL must use http or https\");\n }\n return url.toString().replace(/\\/+$/, \"\");\n}\n\nfunction normalizeModelName(\n value: unknown,\n fallback: string,\n settingName: string,\n): string {\n if (value === undefined || value === null) return fallback;\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`${settingName} must be a non-empty string`);\n }\n return value.trim();\n}\n\nfunction getConfig(runtime: IAgentRuntime): GrokConfig {\n const apiKey =\n getSettingString(runtime, \"XAI_API_KEY\") ??\n getSettingString(runtime, \"GROK_API_KEY\");\n if (!apiKey) {\n throw new Error(\"XAI_API_KEY is required\");\n }\n\n const baseUrl = runtime.getSetting(\"XAI_BASE_URL\");\n const smallModel = runtime.getSetting(\"XAI_SMALL_MODEL\");\n const largeModel =\n runtime.getSetting(\"XAI_MODEL\") || runtime.getSetting(\"XAI_LARGE_MODEL\");\n const embeddingModel = runtime.getSetting(\"XAI_EMBEDDING_MODEL\");\n\n return {\n apiKey,\n baseUrl: normalizeBaseUrl(baseUrl),\n smallModel: normalizeModelName(\n smallModel,\n DEFAULT_MODELS.small,\n \"XAI_SMALL_MODEL\",\n ),\n largeModel: normalizeModelName(\n largeModel,\n DEFAULT_MODELS.large,\n \"XAI_MODEL\",\n ),\n embeddingModel: normalizeModelName(\n embeddingModel,\n DEFAULT_MODELS.embedding,\n \"XAI_EMBEDDING_MODEL\",\n ),\n };\n}\n\nfunction getFetch(runtime: IAgentRuntime): typeof fetch {\n const runtimeFetch = (runtime as { fetch?: typeof fetch }).fetch;\n return typeof runtimeFetch === \"function\"\n ? runtimeFetch.bind(runtime)\n : fetch;\n}\n\nfunction getAuthHeader(config: GrokConfig): Record<string, string> {\n return {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\ninterface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | unknown[];\n tool_call_id?: string;\n tool_calls?: unknown[];\n name?: string;\n}\n\ninterface ChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason: string;\n }>;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\ninterface XaiNativeTextResult {\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n finishReason?: string;\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\ntype XaiToolDefinition = {\n type?: \"function\";\n name?: string;\n description?: string;\n parameters?: unknown;\n inputSchema?: unknown;\n function?: { name?: string; description?: string; parameters?: unknown };\n};\n\ntype XaiToolChoice =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { type: \"function\"; function: { name: string } }\n | { type: \"tool\"; toolName: string }\n | { name: string };\n\nfunction normalizeXaiTools(tools: unknown): unknown[] | undefined {\n if (!tools) return undefined;\n if (Array.isArray(tools)) {\n return tools\n .map((tool) => normalizeXaiTool(tool as XaiToolDefinition))\n .filter((tool): tool is Record<string, unknown> => tool !== undefined);\n }\n if (typeof tools === \"object\") {\n const out: Record<string, unknown>[] = [];\n for (const [name, value] of Object.entries(\n tools as Record<string, XaiToolDefinition>,\n )) {\n const normalized = normalizeXaiTool({ ...value, name });\n if (normalized) out.push(normalized);\n }\n return out.length > 0 ? out : undefined;\n }\n return undefined;\n}\n\nfunction normalizeXaiTool(\n tool: XaiToolDefinition,\n): Record<string, unknown> | undefined {\n const name = tool.name ?? tool.function?.name;\n if (!name) return undefined;\n const description = tool.description ?? tool.function?.description;\n const parameters = tool.parameters ??\n tool.function?.parameters ??\n tool.inputSchema ?? { type: \"object\" };\n return {\n type: \"function\",\n function: {\n name,\n ...(description ? { description } : {}),\n parameters,\n },\n };\n}\n\nfunction normalizeXaiToolChoice(toolChoice: unknown): unknown {\n if (!toolChoice) return undefined;\n if (\n typeof toolChoice === \"string\" &&\n (toolChoice === \"auto\" ||\n toolChoice === \"none\" ||\n toolChoice === \"required\")\n ) {\n return toolChoice;\n }\n const choice = toolChoice as Record<string, unknown>;\n if (choice.type === \"function\") return toolChoice;\n if (choice.type === \"tool\" && typeof choice.toolName === \"string\") {\n return { type: \"function\", function: { name: choice.toolName } };\n }\n if (typeof choice.name === \"string\") {\n return { type: \"function\", function: { name: choice.name } };\n }\n return undefined;\n}\n\nfunction buildXaiResponseFormat(responseSchema: unknown): unknown {\n if (!responseSchema) return undefined;\n const r = responseSchema as Record<string, unknown>;\n const schema = (r.schema ?? responseSchema) as Record<string, unknown>;\n const name = typeof r.name === \"string\" ? r.name : \"structured_response\";\n return {\n type: \"json_schema\",\n json_schema: { name, schema, strict: true },\n };\n}\n\ninterface StreamCompletionChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n };\n }>;\n usage?: OpenAIUsage;\n model?: string;\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n}\n\ninterface EmbeddingResponse {\n object: string;\n data: Array<{\n object: string;\n embedding: number[];\n index: number;\n }>;\n model: string;\n usage: {\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n\ntype NormalizedUsage = {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n estimated?: boolean;\n};\n\nfunction toFiniteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return undefined;\n }\n return Math.max(0, Math.round(value));\n}\n\nfunction normalizeTokenUsage(usage: unknown): NormalizedUsage | null {\n if (!usage || typeof usage !== \"object\") {\n return null;\n }\n\n const record = usage as OpenAIUsage;\n const promptTokens = toFiniteNumber(\n record.prompt_tokens ?? record.inputTokens,\n );\n const completionTokens = toFiniteNumber(\n record.completion_tokens ?? record.outputTokens,\n );\n const totalTokens = toFiniteNumber(record.total_tokens ?? record.totalTokens);\n\n if (\n promptTokens === undefined &&\n completionTokens === undefined &&\n totalTokens === undefined\n ) {\n return null;\n }\n\n const normalizedPromptTokens =\n promptTokens ??\n (completionTokens === undefined && totalTokens !== undefined\n ? totalTokens\n : Math.max(0, (totalTokens ?? 0) - (completionTokens ?? 0)));\n const normalizedCompletionTokens =\n completionTokens ??\n Math.max(\n 0,\n (totalTokens ?? normalizedPromptTokens) - normalizedPromptTokens,\n );\n\n return {\n promptTokens: normalizedPromptTokens,\n completionTokens: normalizedCompletionTokens,\n totalTokens:\n totalTokens ?? normalizedPromptTokens + normalizedCompletionTokens,\n };\n}\n\nfunction estimateTokenCount(text: string): number {\n return text.length === 0 ? 0 : Math.ceil(text.length / 4);\n}\n\nfunction estimateUsage(prompt: string, response: unknown): NormalizedUsage {\n const promptTokens = estimateTokenCount(prompt);\n const completionTokens = estimateTokenCount(\n typeof response === \"string\" ? response : String(response),\n );\n return {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n estimated: true,\n };\n}\n\nfunction estimateEmbeddingUsage(text: string): NormalizedUsage {\n const promptTokens = estimateTokenCount(text);\n return {\n promptTokens,\n completionTokens: 0,\n totalTokens: promptTokens,\n estimated: true,\n };\n}\n\nfunction sanitizeTemperature(value: unknown): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(\"temperature must be a finite number\");\n }\n return Math.min(2, Math.max(0, value));\n}\n\nfunction sanitizeMaxTokens(value: unknown): number | undefined {\n if (value === undefined) return undefined;\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n !Number.isInteger(value) ||\n value < 1\n ) {\n throw new Error(\"maxTokens must be a positive finite integer\");\n }\n return value;\n}\n\nfunction sanitizeStopSequences(value: unknown): string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(\"stopSequences must be an array of strings\");\n }\n return value;\n}\n\nfunction normalizePrompt(value: unknown): string {\n if (value === undefined) return \"\";\n if (typeof value !== \"string\") {\n throw new Error(\"prompt must be a string\");\n }\n return value;\n}\n\nfunction normalizeEmbeddingText(\n params: TextEmbeddingParams | string | null,\n): string {\n if (params === null) {\n throw new Error(\"Null params provided for embedding\");\n }\n if (typeof params === \"string\") return params.trim();\n if (\n !params ||\n typeof params !== \"object\" ||\n typeof params.text !== \"string\"\n ) {\n throw new Error(\"Embedding text must be a string\");\n }\n return params.text.trim();\n}\n\nfunction validateEmbeddingVector(embedding: unknown): number[] {\n if (!Array.isArray(embedding) || embedding.length === 0) {\n throw new Error(\"No embedding in Grok response\");\n }\n if (\n embedding.some(\n (value) => typeof value !== \"number\" || !Number.isFinite(value),\n )\n ) {\n throw new Error(\"Grok embedding response contained non-finite values\");\n }\n return embedding;\n}\n\nfunction emitModelUsed(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n model: string,\n usage: NormalizedUsage,\n): void {\n void runtime.emitEvent(\n EventType.MODEL_USED as string,\n {\n runtime,\n source: \"xai\",\n provider: \"xai\",\n type,\n model,\n modelName: model,\n tokens: {\n prompt: usage.promptTokens,\n completion: usage.completionTokens,\n total: usage.totalTokens,\n ...(usage.estimated ? { estimated: true } : {}),\n },\n ...(usage.estimated ? { usageEstimated: true } : {}),\n } as EventPayload,\n );\n}\n\nasync function generateText(\n runtime: IAgentRuntime,\n config: GrokConfig,\n modelType: ModelTypeName,\n model: string,\n params: GenerateTextParams,\n): Promise<string | TextStreamResult | XaiNativeTextResult> {\n const paramsWithNative = params as GenerateTextParams & {\n messages?: ChatMessage[];\n tools?: unknown;\n toolChoice?: XaiToolChoice;\n responseSchema?: unknown;\n };\n const promptText = normalizePrompt(params.prompt);\n const tools = normalizeXaiTools(paramsWithNative.tools);\n const toolChoice = normalizeXaiToolChoice(paramsWithNative.toolChoice);\n const responseFormat = buildXaiResponseFormat(\n paramsWithNative.responseSchema,\n );\n const returnNative = Boolean(\n paramsWithNative.messages ||\n paramsWithNative.tools ||\n paramsWithNative.toolChoice ||\n paramsWithNative.responseSchema,\n );\n\n const messages: ChatMessage[] = paramsWithNative.messages?.length\n ? (paramsWithNative.messages as ChatMessage[])\n : [{ role: \"user\", content: promptText }];\n\n const body: Record<string, unknown> = {\n model,\n messages,\n };\n\n const temperature = sanitizeTemperature(params.temperature);\n if (temperature !== undefined) {\n body.temperature = temperature;\n }\n const maxTokens = params.omitMaxTokens\n ? undefined\n : sanitizeMaxTokens(params.maxTokens);\n if (maxTokens !== undefined) {\n body.max_tokens = maxTokens;\n }\n const stopSequences = sanitizeStopSequences(params.stopSequences);\n if (stopSequences) {\n body.stop = stopSequences;\n }\n if (tools) {\n body.tools = tools;\n }\n if (toolChoice) {\n body.tool_choice = toolChoice;\n }\n if (responseFormat) {\n body.response_format = responseFormat;\n }\n\n if (params.stream && params.onStreamChunk) {\n return createStreamTextResult(\n runtime,\n config,\n modelType,\n model,\n params,\n body,\n promptText,\n );\n }\n\n if (params.stream) {\n return createStreamTextResult(\n runtime,\n config,\n modelType,\n model,\n params,\n body,\n promptText,\n );\n }\n\n return recordLlmCall(\n runtime,\n {\n model,\n systemPrompt: \"\",\n userPrompt: promptText,\n temperature: params.temperature ?? 0,\n maxTokens: params.maxTokens ?? 0,\n purpose: \"external_llm\",\n actionType: \"xai.chat.completions.create\",\n },\n async () => {\n const response = await getFetch(runtime)(\n `${config.baseUrl}/chat/completions`,\n {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as ChatCompletionResponse;\n\n const choice = data.choices?.[0];\n const rawText = choice?.message?.content ?? \"\";\n const rawToolCalls = choice?.message?.tool_calls ?? [];\n\n if (!returnNative && !rawText) {\n throw new Error(\"No content in Grok response\");\n }\n\n emitModelUsed(\n runtime,\n modelType,\n data.model || model,\n normalizeTokenUsage(data.usage) ??\n estimateUsage(params.prompt ?? \"\", rawText),\n );\n\n if (returnNative) {\n const usage = normalizeTokenUsage(data.usage);\n const native: XaiNativeTextResult = {\n text: rawText,\n toolCalls: rawToolCalls.map((tc) => ({\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: parseJsonOrRaw(tc.function.arguments),\n })),\n finishReason: choice?.finish_reason,\n ...(usage\n ? {\n usage: {\n promptTokens: usage.promptTokens,\n completionTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n },\n }\n : {}),\n };\n return native;\n }\n\n return rawText;\n },\n );\n}\n\nfunction createStreamTextResult(\n runtime: IAgentRuntime,\n config: GrokConfig,\n modelType: ModelTypeName,\n model: string,\n params: GenerateTextParams,\n body: Record<string, unknown>,\n promptText: string,\n): TextStreamResult {\n body.stream = true;\n const onStreamChunk = params.onStreamChunk;\n const fetchImpl = getFetch(runtime);\n const state = recordLlmCall(\n runtime,\n {\n model,\n systemPrompt: \"\",\n userPrompt: promptText,\n temperature: params.temperature ?? 0,\n maxTokens: params.maxTokens ?? 0,\n purpose: \"external_llm\",\n actionType: \"xai.chat.completions.stream\",\n },\n async () => {\n const response = await fetchImpl(`${config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n const chunks: string[] = [];\n let buffered = \"\";\n let usage: NormalizedUsage | null = null;\n let responseModel = model;\n let finishReason: string | undefined;\n\n const readLine = (line: string) => {\n if (!line.startsWith(\"data: \")) return;\n const data = line.slice(6).trim();\n if (!data || data === \"[DONE]\") return;\n\n const parsed = JSON.parse(data) as StreamCompletionChunk & {\n choices?: Array<{\n finish_reason?: string;\n delta?: { content?: string };\n }>;\n };\n const chunkUsage = normalizeTokenUsage(parsed.usage);\n if (chunkUsage) {\n usage = chunkUsage;\n }\n if (typeof parsed.model === \"string\" && parsed.model.length > 0) {\n responseModel = parsed.model;\n }\n\n const choice = parsed.choices?.[0];\n if (typeof choice?.finish_reason === \"string\") {\n finishReason = choice.finish_reason;\n }\n const content = choice?.delta?.content;\n if (content) {\n chunks.push(content);\n onStreamChunk?.(content);\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffered += decoder.decode(value, { stream: true });\n const lines = buffered.split(/\\r?\\n/);\n buffered = lines.pop() ?? \"\";\n for (const line of lines) {\n readLine(line);\n }\n }\n\n buffered += decoder.decode();\n for (const line of buffered.split(/\\r?\\n/)) {\n readLine(line);\n }\n\n const fullText = chunks.join(\"\");\n const finalUsage = usage ?? estimateUsage(promptText, fullText);\n emitModelUsed(runtime, modelType, responseModel, finalUsage);\n\n return {\n fullText,\n chunks,\n usage: finalUsage,\n finishReason,\n };\n },\n );\n\n return {\n textStream: (async function* () {\n const result = await state;\n yield* result.chunks;\n })(),\n text: state.then((result) => result.fullText),\n usage: state.then((result) => result.usage),\n finishReason: state.then((result) => result.finishReason),\n };\n}\n\nfunction parseJsonOrRaw(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nasync function createEmbedding(\n runtime: IAgentRuntime,\n config: GrokConfig,\n text: string,\n): Promise<number[]> {\n const response = await getFetch(runtime)(`${config.baseUrl}/embeddings`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify({\n model: config.embeddingModel,\n input: text,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok Embedding API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as EmbeddingResponse;\n\n const embedding = validateEmbeddingVector(data.data?.[0]?.embedding);\n\n emitModelUsed(\n runtime,\n ModelType.TEXT_EMBEDDING,\n data.model || config.embeddingModel,\n normalizeTokenUsage(data.usage) ?? estimateEmbeddingUsage(text),\n );\n return embedding;\n}\n\nexport async function handleTextSmall(\n runtime: IAgentRuntime,\n params: GenerateTextParams,\n): Promise<string | TextStreamResult> {\n const config = getConfig(runtime);\n logger.debug(`[Grok] Generating text with model: ${config.smallModel}`);\n // Native result (with toolCalls) is cast through the string return type:\n // elizaOS's plugin Model handler signature is\n // `Promise<string | TextStreamResult>`. Consumers that pass `tools` /\n // `messages` / `responseSchema` / `toolChoice` unwrap the native shape from\n // `useModel`.\n return (await generateText(\n runtime,\n config,\n ModelType.TEXT_SMALL,\n config.smallModel,\n params,\n )) as string | TextStreamResult;\n}\n\nexport async function handleTextLarge(\n runtime: IAgentRuntime,\n params: GenerateTextParams,\n): Promise<string | TextStreamResult> {\n const config = getConfig(runtime);\n logger.debug(`[Grok] Generating text with model: ${config.largeModel}`);\n return (await generateText(\n runtime,\n config,\n ModelType.TEXT_LARGE,\n config.largeModel,\n params,\n )) as string | TextStreamResult;\n}\n\nexport async function handleTextEmbedding(\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null,\n): Promise<number[]> {\n const config = getConfig(runtime);\n const text = normalizeEmbeddingText(params);\n if (!text) {\n throw new Error(\"Empty text provided for embedding\");\n }\n logger.debug(\n `[Grok] Creating embedding with model: ${config.embeddingModel}`,\n );\n return createEmbedding(runtime, config, text);\n}\n\nexport async function listModels(\n runtime: IAgentRuntime,\n): Promise<Record<string, unknown>[]> {\n const config = getConfig(runtime);\n\n const response = await fetch(`${config.baseUrl}/models`, {\n headers: getAuthHeader(config),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as { data: Record<string, unknown>[] };\n return data.data;\n}\n\nexport function isGrokConfigured(runtime: IAgentRuntime): boolean {\n return !!(\n getSettingString(runtime, \"XAI_API_KEY\") ??\n getSettingString(runtime, \"GROK_API_KEY\")\n );\n}\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "4F413B4A6457E08764756E2164756E21",
10
+ "names": []
11
+ }