@burtson-labs/bandit-engine 2.0.35 → 2.0.36

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.
Files changed (43) hide show
  1. package/README.md +3 -2
  2. package/dist/{aiProviderStore-3YS2BZU3.mjs → aiProviderStore-UJRDUYOF.mjs} +2 -2
  3. package/dist/{chat-2LYIZNWZ.mjs → chat-SZK3EBDO.mjs} +5 -5
  4. package/dist/chat-provider.js +227 -11
  5. package/dist/chat-provider.js.map +1 -1
  6. package/dist/chat-provider.mjs +4 -4
  7. package/dist/{chunk-6PQRG6W4.mjs → chunk-2ZZA2IFL.mjs} +3 -3
  8. package/dist/{chunk-GBANNFRD.mjs → chunk-ED5NNDKO.mjs} +3 -3
  9. package/dist/{chunk-XD5VJCFN.mjs → chunk-FJO5ZWYU.mjs} +3 -3
  10. package/dist/{chunk-XXMCI2WK.mjs → chunk-G4OXOTNJ.mjs} +41 -8
  11. package/dist/{chunk-XXMCI2WK.mjs.map → chunk-G4OXOTNJ.mjs.map} +1 -1
  12. package/dist/{chunk-LG2JCTOE.mjs → chunk-PLNFTIGX.mjs} +4 -4
  13. package/dist/{chunk-7RLN6ZGT.mjs → chunk-S635Q6OQ.mjs} +3 -3
  14. package/dist/{chunk-IGD4KGB5.mjs → chunk-ZAVV2AT5.mjs} +4 -4
  15. package/dist/{chunk-IHJPVIGB.mjs → chunk-ZNNOTDRD.mjs} +208 -1
  16. package/dist/chunk-ZNNOTDRD.mjs.map +1 -0
  17. package/dist/cli/cli.js +1078 -62
  18. package/dist/cli/cli.js.map +1 -1
  19. package/dist/{gateway-BiHRHJMM.d.ts → gateway-Ckf_KusF.d.mts} +4 -4
  20. package/dist/{gateway-BiHRHJMM.d.mts → gateway-Ckf_KusF.d.ts} +4 -4
  21. package/dist/index.d.mts +2 -2
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.js +318 -69
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.mjs +8 -8
  26. package/dist/management/management.js +316 -67
  27. package/dist/management/management.js.map +1 -1
  28. package/dist/management/management.mjs +6 -6
  29. package/dist/modals/chat-modal/chat-modal.js +236 -20
  30. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  31. package/dist/modals/chat-modal/chat-modal.mjs +4 -4
  32. package/dist/public-types.d.mts +1 -1
  33. package/dist/public-types.d.ts +1 -1
  34. package/package.json +1 -1
  35. package/dist/chunk-IHJPVIGB.mjs.map +0 -1
  36. /package/dist/{aiProviderStore-3YS2BZU3.mjs.map → aiProviderStore-UJRDUYOF.mjs.map} +0 -0
  37. /package/dist/{chat-2LYIZNWZ.mjs.map → chat-SZK3EBDO.mjs.map} +0 -0
  38. /package/dist/{chunk-6PQRG6W4.mjs.map → chunk-2ZZA2IFL.mjs.map} +0 -0
  39. /package/dist/{chunk-GBANNFRD.mjs.map → chunk-ED5NNDKO.mjs.map} +0 -0
  40. /package/dist/{chunk-XD5VJCFN.mjs.map → chunk-FJO5ZWYU.mjs.map} +0 -0
  41. /package/dist/{chunk-LG2JCTOE.mjs.map → chunk-PLNFTIGX.mjs.map} +0 -0
  42. /package/dist/{chunk-7RLN6ZGT.mjs.map → chunk-S635Q6OQ.mjs.map} +0 -0
  43. /package/dist/{chunk-IGD4KGB5.mjs.map → chunk-ZAVV2AT5.mjs.map} +0 -0
package/README.md CHANGED
@@ -20,7 +20,7 @@ An AI chat toolkit built for speed, design, and control. Power branded AI assist
20
20
  - 🔌 Plug-and-play React chat, modal, and management surfaces
21
21
  - 🧠 Memory, vector knowledge, and provider switching behind a secure gateway
22
22
  - 🎨 Full MUI theming, dark mode, and branding controls out of the box
23
- - 🌐 Multimodal support (voice, images, documents) with Ollama, OpenAI, Azure OpenAI, and Anthropic today — tell us which providers you need next so we can prioritize them
23
+ - 🌐 Multimodal support (voice, images, documents) with Ollama, OpenAI, Azure OpenAI, Anthropic, and xAI today — tell us which providers you need next so we can prioritize them
24
24
  - 🛠️ CLI scaffolding, sample gateway, and docs to launch in minutes
25
25
 
26
26
  ## Quick Links
@@ -44,7 +44,8 @@ npx @burtson-labs/bandit-engine create my-bandit-app
44
44
  What you get out of the box:
45
45
 
46
46
  - Vite + React project wired with `Chat`, `ChatModal`, and `ChatProvider`
47
- - Express gateway that proxies OpenAI or Ollama behind `/api`
47
+ - Express gateway that proxies OpenAI, Azure OpenAI, Anthropic, xAI, or Ollama behind `/api`
48
+ - Next.js App Router gateway scaffold (in `server/next-app/`) ready to copy into a Next project
48
49
  - Branding + persona config in `public/config.json`, ready for your logo or prompts
49
50
 
50
51
  Customize the output with options such as:
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  useAIProviderStore
3
- } from "./chunk-IHJPVIGB.mjs";
3
+ } from "./chunk-ZNNOTDRD.mjs";
4
4
  import "./chunk-KCI46M23.mjs";
5
5
  import "./chunk-BJTO5JO5.mjs";
6
6
  export {
7
7
  useAIProviderStore
8
8
  };
9
- //# sourceMappingURL=aiProviderStore-3YS2BZU3.mjs.map
9
+ //# sourceMappingURL=aiProviderStore-UJRDUYOF.mjs.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  chat_default
3
- } from "./chunk-IGD4KGB5.mjs";
3
+ } from "./chunk-ZAVV2AT5.mjs";
4
4
  import "./chunk-ONQMRE2G.mjs";
5
5
  import "./chunk-RTQDQ6TC.mjs";
6
- import "./chunk-GBANNFRD.mjs";
7
- import "./chunk-XD5VJCFN.mjs";
6
+ import "./chunk-ED5NNDKO.mjs";
7
+ import "./chunk-FJO5ZWYU.mjs";
8
8
  import "./chunk-XUBYA5I7.mjs";
9
- import "./chunk-IHJPVIGB.mjs";
9
+ import "./chunk-ZNNOTDRD.mjs";
10
10
  import "./chunk-KCI46M23.mjs";
11
11
  import "./chunk-BJTO5JO5.mjs";
12
12
  export {
13
13
  chat_default as default
14
14
  };
15
- //# sourceMappingURL=chat-2LYIZNWZ.mjs.map
15
+ //# sourceMappingURL=chat-SZK3EBDO.mjs.map
@@ -12,11 +12,11 @@ var __export = (target, all) => {
12
12
  for (var name in all)
13
13
  __defProp(target, name, { get: all[name], enumerable: true });
14
14
  };
15
- var __copyProps = (to, from6, except, desc) => {
16
- if (from6 && typeof from6 === "object" || typeof from6 === "function") {
17
- for (let key of __getOwnPropNames(from6))
15
+ var __copyProps = (to, from7, except, desc) => {
16
+ if (from7 && typeof from7 === "object" || typeof from7 === "function") {
17
+ for (let key of __getOwnPropNames(from7))
18
18
  if (!__hasOwnProp.call(to, key) && key !== except)
19
- __defProp(to, key, { get: () => from6[key], enumerable: !(desc = __getOwnPropDesc(from6, key)) || desc.enumerable });
19
+ __defProp(to, key, { get: () => from7[key], enumerable: !(desc = __getOwnPropDesc(from7, key)) || desc.enumerable });
20
20
  }
21
21
  return to;
22
22
  };
@@ -3363,6 +3363,216 @@ var init_playground_provider = __esm({
3363
3363
  }
3364
3364
  });
3365
3365
 
3366
+ // src/services/ai-provider/providers/xai.provider.ts
3367
+ var import_rxjs9, XAIProvider;
3368
+ var init_xai_provider = __esm({
3369
+ "src/services/ai-provider/providers/xai.provider.ts"() {
3370
+ "use strict";
3371
+ import_rxjs9 = require("rxjs");
3372
+ init_common_types();
3373
+ init_debugLogger();
3374
+ XAIProvider = class {
3375
+ config;
3376
+ baseUrl;
3377
+ constructor(config) {
3378
+ this.config = config;
3379
+ this.baseUrl = config.baseUrl || "https://api.x.ai/v1";
3380
+ }
3381
+ chat(request) {
3382
+ const url = `${this.baseUrl}/chat/completions`;
3383
+ const payload = {
3384
+ model: request.model,
3385
+ messages: request.messages,
3386
+ stream: Boolean(request.stream),
3387
+ temperature: request.temperature,
3388
+ max_tokens: request.maxTokens
3389
+ };
3390
+ if (request.stream) {
3391
+ return this.streamChatRequest(url, payload);
3392
+ } else {
3393
+ return this.nonStreamChatRequest(url, payload);
3394
+ }
3395
+ }
3396
+ generate(request) {
3397
+ const chatRequest = {
3398
+ model: request.model,
3399
+ messages: [{ role: "user", content: request.prompt }],
3400
+ stream: request.stream,
3401
+ options: request.options
3402
+ };
3403
+ return this.chat(chatRequest).pipe(
3404
+ (0, import_rxjs9.map)((response) => ({
3405
+ response: response.message.content,
3406
+ done: response.done
3407
+ }))
3408
+ );
3409
+ }
3410
+ listModels() {
3411
+ const url = `${this.baseUrl}/models`;
3412
+ return (0, import_rxjs9.from)(fetch(url, {
3413
+ headers: this.getHeaders()
3414
+ })).pipe(
3415
+ (0, import_rxjs9.switchMap)((response) => {
3416
+ if (!response.ok) {
3417
+ return (0, import_rxjs9.throwError)(() => new Error(`Failed to list models: ${response.status}`));
3418
+ }
3419
+ return (0, import_rxjs9.from)(response.json());
3420
+ }),
3421
+ (0, import_rxjs9.map)(
3422
+ (data) => data.data.map((model) => ({
3423
+ name: model.id,
3424
+ details: {
3425
+ format: "xai",
3426
+ family: model.object
3427
+ }
3428
+ }))
3429
+ )
3430
+ );
3431
+ }
3432
+ async validateServiceAvailability(args) {
3433
+ try {
3434
+ const controller = new AbortController();
3435
+ const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);
3436
+ const response = await fetch(`${this.baseUrl}/models`, {
3437
+ headers: this.getHeaders(),
3438
+ signal: controller.signal
3439
+ });
3440
+ clearTimeout(timeoutId);
3441
+ return {
3442
+ url: this.baseUrl,
3443
+ isAvailable: response.ok
3444
+ };
3445
+ } catch (error) {
3446
+ if (args.fallbackUrl) {
3447
+ try {
3448
+ const controller = new AbortController();
3449
+ const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);
3450
+ const response = await fetch(`${args.fallbackUrl}/models`, {
3451
+ headers: this.getHeaders(),
3452
+ signal: controller.signal
3453
+ });
3454
+ clearTimeout(timeoutId);
3455
+ if (response.ok) {
3456
+ this.baseUrl = args.fallbackUrl;
3457
+ return {
3458
+ url: args.fallbackUrl,
3459
+ isAvailable: true
3460
+ };
3461
+ }
3462
+ } catch (fallbackError) {
3463
+ debugLogger.warn("xAI fallback validation failed", { error: fallbackError });
3464
+ }
3465
+ }
3466
+ return {
3467
+ url: this.baseUrl,
3468
+ isAvailable: false
3469
+ };
3470
+ }
3471
+ }
3472
+ getProviderType() {
3473
+ return "xai" /* XAI */;
3474
+ }
3475
+ getConfig() {
3476
+ return this.config;
3477
+ }
3478
+ streamChatRequest(url, payload) {
3479
+ return new import_rxjs9.Observable((observer) => {
3480
+ const task = fetch(url, {
3481
+ method: "POST",
3482
+ headers: {
3483
+ ...this.getHeaders(),
3484
+ "Content-Type": "application/json"
3485
+ },
3486
+ body: JSON.stringify(payload)
3487
+ });
3488
+ task.then((response) => {
3489
+ if (!response.ok) {
3490
+ observer.error(new Error(`xAI request failed: ${response.status}`));
3491
+ return;
3492
+ }
3493
+ const reader = response.body?.getReader();
3494
+ const decoder = new TextDecoder();
3495
+ let buffer = "";
3496
+ const read = () => {
3497
+ reader?.read().then(({ done, value }) => {
3498
+ if (done) {
3499
+ observer.next({
3500
+ message: { content: "", role: "assistant" },
3501
+ done: true
3502
+ });
3503
+ observer.complete();
3504
+ return;
3505
+ }
3506
+ buffer += decoder.decode(value, { stream: true });
3507
+ const lines = buffer.split("\n");
3508
+ buffer = lines.pop() ?? "";
3509
+ for (const line of lines) {
3510
+ if (line.trim() && line.startsWith("data: ")) {
3511
+ const data = line.slice(6).trim();
3512
+ if (data === "[DONE]") {
3513
+ observer.next({
3514
+ message: { content: "", role: "assistant" },
3515
+ done: true
3516
+ });
3517
+ observer.complete();
3518
+ return;
3519
+ }
3520
+ try {
3521
+ const parsed = JSON.parse(data);
3522
+ const content = parsed.choices?.[0]?.delta?.content ?? "";
3523
+ if (content) {
3524
+ observer.next({
3525
+ message: { content, role: "assistant" },
3526
+ done: false
3527
+ });
3528
+ }
3529
+ } catch (err) {
3530
+ debugLogger.error("Error parsing xAI stream data:", { data, error: err });
3531
+ }
3532
+ }
3533
+ }
3534
+ read();
3535
+ }).catch((err) => observer.error(err));
3536
+ };
3537
+ read();
3538
+ }).catch((err) => observer.error(err));
3539
+ });
3540
+ }
3541
+ nonStreamChatRequest(url, payload) {
3542
+ return (0, import_rxjs9.from)(fetch(url, {
3543
+ method: "POST",
3544
+ headers: {
3545
+ ...this.getHeaders(),
3546
+ "Content-Type": "application/json"
3547
+ },
3548
+ body: JSON.stringify(payload)
3549
+ })).pipe(
3550
+ (0, import_rxjs9.switchMap)((response) => {
3551
+ if (!response.ok) {
3552
+ return (0, import_rxjs9.throwError)(() => new Error(`xAI request failed: ${response.status}`));
3553
+ }
3554
+ return (0, import_rxjs9.from)(response.json());
3555
+ }),
3556
+ (0, import_rxjs9.map)((data) => ({
3557
+ message: {
3558
+ content: data.choices?.[0]?.message?.content ?? "",
3559
+ role: "assistant"
3560
+ },
3561
+ done: true
3562
+ }))
3563
+ );
3564
+ }
3565
+ getHeaders() {
3566
+ const headers = {};
3567
+ if (this.config.apiKey) {
3568
+ headers["Authorization"] = `Bearer ${this.config.apiKey}`;
3569
+ }
3570
+ return headers;
3571
+ }
3572
+ };
3573
+ }
3574
+ });
3575
+
3366
3576
  // src/services/ai-provider/ai-provider.factory.ts
3367
3577
  var AIProviderFactory;
3368
3578
  var init_ai_provider_factory = __esm({
@@ -3375,6 +3585,7 @@ var init_ai_provider_factory = __esm({
3375
3585
  init_anthropic_provider();
3376
3586
  init_gateway_provider();
3377
3587
  init_playground_provider();
3588
+ init_xai_provider();
3378
3589
  AIProviderFactory = class {
3379
3590
  static createProvider(config) {
3380
3591
  switch (config.type) {
@@ -3386,6 +3597,8 @@ var init_ai_provider_factory = __esm({
3386
3597
  return new AzureOpenAIProvider(config);
3387
3598
  case "anthropic" /* ANTHROPIC */:
3388
3599
  return new AnthropicProvider(config);
3600
+ case "xai" /* XAI */:
3601
+ return new XAIProvider(config);
3389
3602
  case "gateway" /* GATEWAY */:
3390
3603
  return new GatewayProvider(config);
3391
3604
  case "playground" /* PLAYGROUND */:
@@ -3400,6 +3613,7 @@ var init_ai_provider_factory = __esm({
3400
3613
  "openai" /* OPENAI */,
3401
3614
  "azure-openai" /* AZURE_OPENAI */,
3402
3615
  "anthropic" /* ANTHROPIC */,
3616
+ "xai" /* XAI */,
3403
3617
  "gateway" /* GATEWAY */,
3404
3618
  "playground" /* PLAYGROUND */
3405
3619
  ];
@@ -3415,6 +3629,8 @@ var init_ai_provider_factory = __esm({
3415
3629
  return !!(config.baseUrl && config.apiKey && config.apiVersion && config.deploymentName);
3416
3630
  case "anthropic" /* ANTHROPIC */:
3417
3631
  return !!config.apiKey;
3632
+ case "xai" /* XAI */:
3633
+ return !!config.apiKey;
3418
3634
  case "gateway" /* GATEWAY */:
3419
3635
  return !!(config.gatewayUrl && config.provider);
3420
3636
  case "playground" /* PLAYGROUND */:
@@ -5865,7 +6081,7 @@ var import_mammoth = __toESM(require("mammoth"));
5865
6081
  var pdfjsLib = __toESM(require("pdfjs-dist/legacy/build/pdf"));
5866
6082
 
5867
6083
  // src/services/prompts/conversationStarters.ts
5868
- var import_rxjs9 = require("rxjs");
6084
+ var import_rxjs10 = require("rxjs");
5869
6085
  init_aiProviderStore();
5870
6086
  init_packageSettingsStore();
5871
6087
 
@@ -6023,19 +6239,19 @@ var NotificationService = class {
6023
6239
  var notificationService = new NotificationService();
6024
6240
 
6025
6241
  // src/services/prompts/moodDetection.ts
6026
- var import_rxjs10 = require("rxjs");
6242
+ var import_rxjs11 = require("rxjs");
6027
6243
  init_aiProviderStore();
6028
6244
  init_packageSettingsStore();
6029
6245
  init_debugLogger();
6030
6246
 
6031
6247
  // src/services/prompts/detectUserInterestAndExcitement.ts
6032
- var import_rxjs11 = require("rxjs");
6248
+ var import_rxjs12 = require("rxjs");
6033
6249
  init_aiProviderStore();
6034
6250
  init_packageSettingsStore();
6035
6251
  init_debugLogger();
6036
6252
 
6037
6253
  // src/services/prompts/documentSummarization.ts
6038
- var import_rxjs12 = require("rxjs");
6254
+ var import_rxjs13 = require("rxjs");
6039
6255
  init_aiProviderStore();
6040
6256
  init_packageSettingsStore();
6041
6257
  init_debugLogger();
@@ -6063,8 +6279,8 @@ ${content.slice(0, 4e3)}
6063
6279
  stream: false,
6064
6280
  options: { temperature: 0.3, num_predict: 100 }
6065
6281
  });
6066
- const summary$ = data$.pipe((0, import_rxjs12.map)((d) => d.response.trim()));
6067
- const summary = await (0, import_rxjs12.lastValueFrom)(summary$);
6282
+ const summary$ = data$.pipe((0, import_rxjs13.map)((d) => d.response.trim()));
6283
+ const summary = await (0, import_rxjs13.lastValueFrom)(summary$);
6068
6284
  debugLogger.ragDebug("summarizeDocument result", { name, summary });
6069
6285
  return summary || `Document summary for ${name}`;
6070
6286
  } catch (error) {
@@ -6074,7 +6290,7 @@ ${content.slice(0, 4e3)}
6074
6290
  };
6075
6291
 
6076
6292
  // src/services/prompts/documentRelevance.ts
6077
- var import_rxjs13 = require("rxjs");
6293
+ var import_rxjs14 = require("rxjs");
6078
6294
  init_aiProviderStore();
6079
6295
  init_packageSettingsStore();
6080
6296
  init_debugLogger();