@burtson-labs/bandit-engine 2.0.160 → 2.0.162
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -77
- package/dist/{aiProviderStore-BNZGM6QU.mjs → aiProviderStore-JOB2H4LP.mjs} +2 -2
- package/dist/chat-LB6UEEEW.mjs +16 -0
- package/dist/chat-provider.js +281 -142
- package/dist/chat-provider.js.map +1 -1
- package/dist/chat-provider.mjs +6 -6
- package/dist/{chunk-MHF76C2F.mjs → chunk-3ACT5BTW.mjs} +1343 -1222
- package/dist/chunk-3ACT5BTW.mjs.map +1 -0
- package/dist/{chunk-LFQH6M6B.mjs → chunk-47MOBOP3.mjs} +5 -5
- package/dist/chunk-47MOBOP3.mjs.map +1 -0
- package/dist/chunk-G5POQT2R.mjs +390 -0
- package/dist/chunk-G5POQT2R.mjs.map +1 -0
- package/dist/{chunk-PDQT564P.mjs → chunk-ODGVCSKV.mjs} +18 -12
- package/dist/{chunk-PDQT564P.mjs.map → chunk-ODGVCSKV.mjs.map} +1 -1
- package/dist/{chunk-TKSOJGHX.mjs → chunk-OGMXL7BF.mjs} +62 -61
- package/dist/chunk-OGMXL7BF.mjs.map +1 -0
- package/dist/{chunk-B3HAQC6F.mjs → chunk-Q6LXVYTC.mjs} +68 -25
- package/dist/chunk-Q6LXVYTC.mjs.map +1 -0
- package/dist/{chunk-LTWMMHFT.mjs → chunk-R6HMLYKQ.mjs} +1820 -3260
- package/dist/chunk-R6HMLYKQ.mjs.map +1 -0
- package/dist/{chunk-IABD4L6K.mjs → chunk-RUXYVMW2.mjs} +3841 -4457
- package/dist/chunk-RUXYVMW2.mjs.map +1 -0
- package/dist/{chunk-XTB6ZLUI.mjs → chunk-WQEBTH2R.mjs} +7 -2
- package/dist/{chunk-XTB6ZLUI.mjs.map → chunk-WQEBTH2R.mjs.map} +1 -1
- package/dist/{chunk-PXCIDXRP.mjs → chunk-YHSYHU5P.mjs} +6 -6
- package/dist/{chunk-P6SLB5RC.mjs → chunk-ZNK3ELTZ.mjs} +3 -3
- package/dist/index.d.mts +85 -2
- package/dist/index.d.ts +85 -2
- package/dist/index.js +8080 -9868
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -15
- package/dist/index.mjs.map +1 -1
- package/dist/management/management.js +7681 -9478
- package/dist/management/management.js.map +1 -1
- package/dist/management/management.mjs +9 -9
- package/dist/modals/chat-modal/chat-modal.js +1714 -3302
- package/dist/modals/chat-modal/chat-modal.js.map +1 -1
- package/dist/modals/chat-modal/chat-modal.mjs +5 -5
- package/dist/{modelStore-NMCRL3FR.mjs → modelStore-FGUGOWTL.mjs} +2 -2
- package/package.json +4 -2
- package/dist/chat-4BOIV4VP.mjs +0 -16
- package/dist/chunk-B3HAQC6F.mjs.map +0 -1
- package/dist/chunk-IABD4L6K.mjs.map +0 -1
- package/dist/chunk-LFQH6M6B.mjs.map +0 -1
- package/dist/chunk-LNGF2XAZ.mjs +0 -311
- package/dist/chunk-LNGF2XAZ.mjs.map +0 -1
- package/dist/chunk-LTWMMHFT.mjs.map +0 -1
- package/dist/chunk-MHF76C2F.mjs.map +0 -1
- package/dist/chunk-TKSOJGHX.mjs.map +0 -1
- /package/dist/{aiProviderStore-BNZGM6QU.mjs.map → aiProviderStore-JOB2H4LP.mjs.map} +0 -0
- /package/dist/{chat-4BOIV4VP.mjs.map → chat-LB6UEEEW.mjs.map} +0 -0
- /package/dist/{chunk-PXCIDXRP.mjs.map → chunk-YHSYHU5P.mjs.map} +0 -0
- /package/dist/{chunk-P6SLB5RC.mjs.map → chunk-ZNK3ELTZ.mjs.map} +0 -0
- /package/dist/{modelStore-NMCRL3FR.mjs.map → modelStore-FGUGOWTL.mjs.map} +0 -0
|
@@ -10,6 +10,36 @@ import { map as map2 } from "rxjs";
|
|
|
10
10
|
|
|
11
11
|
// src/services/ollama/ollama.service.ts
|
|
12
12
|
import { catchError, from, lastValueFrom, map, Observable, of, shareReplay, switchMap, throwError, timeout } from "rxjs";
|
|
13
|
+
|
|
14
|
+
// src/services/stream/streamLineParser.ts
|
|
15
|
+
var SKIP = { kind: "skip" };
|
|
16
|
+
var StreamLineParser = class {
|
|
17
|
+
/** Set by `event: ping` until the frame's blank-line terminator. */
|
|
18
|
+
inHeartbeatFrame = false;
|
|
19
|
+
next(rawLine) {
|
|
20
|
+
const line = rawLine.trim();
|
|
21
|
+
if (!line) {
|
|
22
|
+
this.inHeartbeatFrame = false;
|
|
23
|
+
return SKIP;
|
|
24
|
+
}
|
|
25
|
+
if (line.startsWith(":")) return SKIP;
|
|
26
|
+
if (line.startsWith("event:")) {
|
|
27
|
+
this.inHeartbeatFrame = line.slice(6).trim().toLowerCase() === "ping";
|
|
28
|
+
return SKIP;
|
|
29
|
+
}
|
|
30
|
+
if (line.startsWith("id:") || line.startsWith("retry:")) return SKIP;
|
|
31
|
+
if (line.startsWith("data:")) {
|
|
32
|
+
if (this.inHeartbeatFrame) return SKIP;
|
|
33
|
+
const data = line.slice(5).trim();
|
|
34
|
+
if (!data) return SKIP;
|
|
35
|
+
if (data === "[DONE]") return { kind: "done" };
|
|
36
|
+
return { kind: "json", text: data };
|
|
37
|
+
}
|
|
38
|
+
return { kind: "json", text: line };
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// src/services/ollama/ollama.service.ts
|
|
13
43
|
var handleError = () => (obs) => obs.pipe(
|
|
14
44
|
switchMap(
|
|
15
45
|
(response) => response.ok ? of(response) : throwError(() => new Error(`Request failed: ${response.status} ${response.statusText}`))
|
|
@@ -100,13 +130,15 @@ var OllamaService = class {
|
|
|
100
130
|
this._throwErrorIfNotOk(url, response);
|
|
101
131
|
const reader = response.body?.getReader();
|
|
102
132
|
const decoder = new TextDecoder();
|
|
133
|
+
const lineParser = new StreamLineParser();
|
|
103
134
|
let buffer = "";
|
|
104
135
|
const read = () => {
|
|
105
136
|
reader?.read().then(({ done, value }) => {
|
|
106
137
|
if (done) {
|
|
107
|
-
|
|
138
|
+
const tail = lineParser.next(buffer);
|
|
139
|
+
if (tail.kind === "json") {
|
|
108
140
|
try {
|
|
109
|
-
observer.next(JSON.parse(
|
|
141
|
+
observer.next(JSON.parse(tail.text));
|
|
110
142
|
} catch (err) {
|
|
111
143
|
observer.error(err);
|
|
112
144
|
debugLogger.error("Final chunk parsing error (generate):", { buffer });
|
|
@@ -119,9 +151,10 @@ var OllamaService = class {
|
|
|
119
151
|
const lines = buffer.split("\n");
|
|
120
152
|
buffer = lines.pop() ?? "";
|
|
121
153
|
for (const line of lines) {
|
|
122
|
-
|
|
154
|
+
const classified = lineParser.next(line);
|
|
155
|
+
if (classified.kind === "json") {
|
|
123
156
|
try {
|
|
124
|
-
observer.next(JSON.parse(
|
|
157
|
+
observer.next(JSON.parse(classified.text));
|
|
125
158
|
} catch (err) {
|
|
126
159
|
observer.error(err);
|
|
127
160
|
debugLogger.error("Error parsing JSON line (generate):", { line });
|
|
@@ -151,13 +184,15 @@ var OllamaService = class {
|
|
|
151
184
|
this._throwErrorIfNotOk(url, response);
|
|
152
185
|
const reader = response.body?.getReader();
|
|
153
186
|
const decoder = new TextDecoder();
|
|
187
|
+
const lineParser = new StreamLineParser();
|
|
154
188
|
let buffer = "";
|
|
155
189
|
const read = () => {
|
|
156
190
|
reader?.read().then(({ done, value }) => {
|
|
157
191
|
if (done) {
|
|
158
|
-
|
|
192
|
+
const tail = lineParser.next(buffer);
|
|
193
|
+
if (tail.kind === "json") {
|
|
159
194
|
try {
|
|
160
|
-
observer.next(JSON.parse(
|
|
195
|
+
observer.next(JSON.parse(tail.text));
|
|
161
196
|
} catch (err) {
|
|
162
197
|
observer.error(err);
|
|
163
198
|
debugLogger.error("Final chunk parsing error (chat):", { buffer });
|
|
@@ -170,9 +205,10 @@ var OllamaService = class {
|
|
|
170
205
|
const lines = buffer.split("\n");
|
|
171
206
|
buffer = lines.pop() ?? "";
|
|
172
207
|
for (const line of lines) {
|
|
173
|
-
|
|
208
|
+
const classified = lineParser.next(line);
|
|
209
|
+
if (classified.kind === "json") {
|
|
174
210
|
try {
|
|
175
|
-
observer.next(JSON.parse(
|
|
211
|
+
observer.next(JSON.parse(classified.text));
|
|
176
212
|
} catch (err) {
|
|
177
213
|
observer.error(err);
|
|
178
214
|
debugLogger.error("Error parsing JSON line (chat):", { line });
|
|
@@ -1323,13 +1359,15 @@ var GatewayService = class {
|
|
|
1323
1359
|
const handleStreamingResponse = async (response) => {
|
|
1324
1360
|
const reader = response.body?.getReader();
|
|
1325
1361
|
const decoder = new TextDecoder();
|
|
1362
|
+
const lineParser = new StreamLineParser();
|
|
1326
1363
|
let buffer = "";
|
|
1327
1364
|
const read = () => {
|
|
1328
1365
|
reader?.read().then(({ done, value }) => {
|
|
1329
1366
|
if (done) {
|
|
1330
|
-
|
|
1367
|
+
const tail = lineParser.next(buffer);
|
|
1368
|
+
if (tail.kind === "json") {
|
|
1331
1369
|
try {
|
|
1332
|
-
const finalResponse = JSON.parse(
|
|
1370
|
+
const finalResponse = JSON.parse(tail.text);
|
|
1333
1371
|
observer.next(finalResponse);
|
|
1334
1372
|
} catch (err) {
|
|
1335
1373
|
debugLogger.error("GatewayService chat final chunk parsing error", { buffer, error: err });
|
|
@@ -1343,16 +1381,14 @@ var GatewayService = class {
|
|
|
1343
1381
|
const lines = buffer.split("\n");
|
|
1344
1382
|
buffer = lines.pop() ?? "";
|
|
1345
1383
|
for (const line of lines) {
|
|
1346
|
-
const
|
|
1347
|
-
if (
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
}
|
|
1355
|
-
}
|
|
1384
|
+
const classified = lineParser.next(line);
|
|
1385
|
+
if (classified.kind === "done") {
|
|
1386
|
+
observer.complete();
|
|
1387
|
+
return;
|
|
1388
|
+
}
|
|
1389
|
+
if (classified.kind === "json") {
|
|
1390
|
+
const trimmed = line.trim();
|
|
1391
|
+
const data = classified.text;
|
|
1356
1392
|
try {
|
|
1357
1393
|
const parsed = JSON.parse(data);
|
|
1358
1394
|
if (request.provider === "ollama" && parsed.message) {
|
|
@@ -1519,13 +1555,15 @@ var GatewayService = class {
|
|
|
1519
1555
|
}
|
|
1520
1556
|
const reader = response.body?.getReader();
|
|
1521
1557
|
const decoder = new TextDecoder();
|
|
1558
|
+
const lineParser = new StreamLineParser();
|
|
1522
1559
|
let buffer = "";
|
|
1523
1560
|
const read = () => {
|
|
1524
1561
|
reader?.read().then(({ done, value }) => {
|
|
1525
1562
|
if (done) {
|
|
1526
|
-
|
|
1563
|
+
const tail = lineParser.next(buffer);
|
|
1564
|
+
if (tail.kind === "json") {
|
|
1527
1565
|
try {
|
|
1528
|
-
observer.next(JSON.parse(
|
|
1566
|
+
observer.next(JSON.parse(tail.text));
|
|
1529
1567
|
} catch (err) {
|
|
1530
1568
|
observer.error(err);
|
|
1531
1569
|
debugLogger.error("Final chunk parsing error (gateway generate):", { buffer });
|
|
@@ -1538,9 +1576,14 @@ var GatewayService = class {
|
|
|
1538
1576
|
const lines = buffer.split("\n");
|
|
1539
1577
|
buffer = lines.pop() ?? "";
|
|
1540
1578
|
for (const line of lines) {
|
|
1541
|
-
|
|
1579
|
+
const classified = lineParser.next(line);
|
|
1580
|
+
if (classified.kind === "done") {
|
|
1581
|
+
observer.complete();
|
|
1582
|
+
return;
|
|
1583
|
+
}
|
|
1584
|
+
if (classified.kind === "json") {
|
|
1542
1585
|
try {
|
|
1543
|
-
observer.next(JSON.parse(
|
|
1586
|
+
observer.next(JSON.parse(classified.text));
|
|
1544
1587
|
} catch (err) {
|
|
1545
1588
|
observer.error(err);
|
|
1546
1589
|
debugLogger.error("Error parsing JSON line (gateway generate):", { line });
|
|
@@ -3111,4 +3154,4 @@ export {
|
|
|
3111
3154
|
AIProviderFactory,
|
|
3112
3155
|
useAIProviderStore
|
|
3113
3156
|
};
|
|
3114
|
-
//# sourceMappingURL=chunk-
|
|
3157
|
+
//# sourceMappingURL=chunk-Q6LXVYTC.mjs.map
|