@burtson-labs/bandit-engine 2.0.168 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/LICENSE +189 -31
- package/NOTICE +26 -0
- package/README.md +15 -59
- package/dist/aiProviderStore-42S3LW2J.mjs +8 -0
- package/dist/aiProviderStore-42S3LW2J.mjs.map +1 -0
- package/dist/chat-GDC4ZVCF.mjs +10 -0
- package/dist/chat-GDC4ZVCF.mjs.map +1 -0
- package/dist/{chunk-GRPTCHFN.mjs → chunk-5KC42IIR.mjs} +339 -155
- package/dist/chunk-5KC42IIR.mjs.map +1 -0
- package/dist/chunk-7QYA3PAF.mjs +29521 -0
- package/dist/chunk-7QYA3PAF.mjs.map +1 -0
- package/dist/{chunk-SZJB5FLZ.mjs → chunk-FCQN3LKT.mjs} +251 -77
- package/dist/chunk-FCQN3LKT.mjs.map +1 -0
- package/dist/{chunk-HNXPDIWC.mjs → chunk-NI7BKLC7.mjs} +1 -1
- package/dist/chunk-NI7BKLC7.mjs.map +1 -0
- package/dist/index.d.mts +63 -57
- package/dist/index.d.ts +63 -57
- package/dist/index.js +18053 -9606
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16630 -142
- package/dist/index.mjs.map +1 -1
- package/dist/{memoryUtils-HGCYEUCD.mjs → memoryUtils-UBZ33DNA.mjs} +8 -3
- package/dist/memoryUtils-UBZ33DNA.mjs.map +1 -0
- package/dist/modelStore-SEC34WRM.mjs +8 -0
- package/dist/modelStore-SEC34WRM.mjs.map +1 -0
- package/dist/{public-DJa4Db00.d.mts → public-D8UsefSk.d.mts} +21 -8
- package/dist/{public-DJa4Db00.d.ts → public-D8UsefSk.d.ts} +21 -8
- package/dist/public-types.d.mts +1 -1
- package/dist/public-types.d.ts +1 -1
- package/docs/00_intro.md +2 -2
- package/docs/05_contributing.md +2 -2
- package/docs/06_licensing.md +18 -0
- package/docs/07_custom_tools.md +233 -0
- package/docs/README.md +2 -1
- package/package.json +23 -20
- package/dist/aiProviderStore-HY5G4QAK.mjs +0 -8
- package/dist/aiProviderStore-HY5G4QAK.mjs.map +0 -1
- package/dist/chat-7LOFYEWE.mjs +0 -15
- package/dist/chat-7LOFYEWE.mjs.map +0 -1
- package/dist/chat-provider.js +0 -11080
- package/dist/chat-provider.js.map +0 -1
- package/dist/chat-provider.mjs +0 -16
- package/dist/chat-provider.mjs.map +0 -1
- package/dist/chunk-4SXXEGEK.mjs +0 -10690
- package/dist/chunk-4SXXEGEK.mjs.map +0 -1
- package/dist/chunk-62IYSU3I.mjs +0 -7324
- package/dist/chunk-62IYSU3I.mjs.map +0 -1
- package/dist/chunk-CABOLDNR.mjs +0 -216
- package/dist/chunk-CABOLDNR.mjs.map +0 -1
- package/dist/chunk-E5WMDLE3.mjs +0 -390
- package/dist/chunk-E5WMDLE3.mjs.map +0 -1
- package/dist/chunk-GRPTCHFN.mjs.map +0 -1
- package/dist/chunk-HNXPDIWC.mjs.map +0 -1
- package/dist/chunk-JD6C64CT.mjs +0 -516
- package/dist/chunk-JD6C64CT.mjs.map +0 -1
- package/dist/chunk-KAXUI5H7.mjs +0 -6009
- package/dist/chunk-KAXUI5H7.mjs.map +0 -1
- package/dist/chunk-ONQMRE2G.mjs +0 -26
- package/dist/chunk-ONQMRE2G.mjs.map +0 -1
- package/dist/chunk-P4C5IRM5.mjs +0 -39
- package/dist/chunk-P4C5IRM5.mjs.map +0 -1
- package/dist/chunk-QI67R5F6.mjs +0 -194
- package/dist/chunk-QI67R5F6.mjs.map +0 -1
- package/dist/chunk-R3NOM2DG.mjs +0 -2945
- package/dist/chunk-R3NOM2DG.mjs.map +0 -1
- package/dist/chunk-SZJB5FLZ.mjs.map +0 -1
- package/dist/chunk-YGOLNWXJ.mjs +0 -11906
- package/dist/chunk-YGOLNWXJ.mjs.map +0 -1
- package/dist/management/management.js +0 -44454
- package/dist/management/management.js.map +0 -1
- package/dist/management/management.mjs +0 -16
- package/dist/management/management.mjs.map +0 -1
- package/dist/memoryUtils-HGCYEUCD.mjs.map +0 -1
- package/dist/modals/chat-modal/chat-modal.js +0 -19730
- package/dist/modals/chat-modal/chat-modal.js.map +0 -1
- package/dist/modals/chat-modal/chat-modal.mjs +0 -18
- package/dist/modals/chat-modal/chat-modal.mjs.map +0 -1
- package/dist/modelStore-TFNX4GEC.mjs +0 -8
- package/dist/modelStore-TFNX4GEC.mjs.map +0 -1
- package/dist/shared/custom-element.js +0 -73
- package/dist/shared/custom-element.js.map +0 -1
- package/dist/shared/custom-element.mjs +0 -7
- package/dist/shared/custom-element.mjs.map +0 -1
- package/docs/06_busl_licensing.md +0 -25
- package/docs/api_reference/.nojekyll +0 -1
- package/docs/api_reference/assets/bandit-docs.js +0 -462
- package/docs/api_reference/assets/highlight.css +0 -141
- package/docs/api_reference/assets/icons.js +0 -18
- package/docs/api_reference/assets/icons.svg +0 -1
- package/docs/api_reference/assets/main.js +0 -61
- package/docs/api_reference/assets/navigation.js +0 -1
- package/docs/api_reference/assets/search.js +0 -1
- package/docs/api_reference/assets/style.css +0 -1664
- package/docs/api_reference/classes/DebugLogger.html +0 -29
- package/docs/api_reference/classes/FeatureFlagService.html +0 -28
- package/docs/api_reference/classes/NotificationService.html +0 -21
- package/docs/api_reference/classes/StreamingTTSClient.html +0 -19
- package/docs/api_reference/classes/VectorDatabaseService.html +0 -63
- package/docs/api_reference/classes/VectorMigrationService.html +0 -27
- package/docs/api_reference/classes/VoiceService.html +0 -4
- package/docs/api_reference/enums/TTSState.html +0 -6
- package/docs/api_reference/functions/Chat.html +0 -1
- package/docs/api_reference/functions/ChatModal.html +0 -29
- package/docs/api_reference/functions/ChatProvider.html +0 -29
- package/docs/api_reference/functions/FeatureFlagProvider.html +0 -30
- package/docs/api_reference/functions/FeedbackButton.html +0 -29
- package/docs/api_reference/functions/FeedbackModal.html +0 -29
- package/docs/api_reference/functions/InterestsEditor.html +0 -5
- package/docs/api_reference/functions/Management.html +0 -1
- package/docs/api_reference/functions/NotificationProvider.html +0 -29
- package/docs/api_reference/functions/SubscriptionExpiredGuard.html +0 -31
- package/docs/api_reference/functions/SubscriptionExpiredModal.html +0 -31
- package/docs/api_reference/functions/defineCustomElement.html +0 -1
- package/docs/api_reference/functions/getCriticalConfig.html +0 -2
- package/docs/api_reference/functions/getFeatureMatrix.html +0 -1
- package/docs/api_reference/functions/getStreamingTTSClient.html +0 -1
- package/docs/api_reference/functions/getSystemConstants.html +0 -2
- package/docs/api_reference/functions/getTTSState.html +0 -1
- package/docs/api_reference/functions/handleHttpError.html +0 -2
- package/docs/api_reference/functions/handleSubscriptionUpgrade.html +0 -1
- package/docs/api_reference/functions/handleValidationError.html +0 -2
- package/docs/api_reference/functions/initializeCoreSystem.html +0 -2
- package/docs/api_reference/functions/isWorkspaceAdminRole.html +0 -6
- package/docs/api_reference/functions/pauseTTS.html +0 -1
- package/docs/api_reference/functions/previewTierUpgrade.html +0 -1
- package/docs/api_reference/functions/resolveManagementSections.html +0 -2
- package/docs/api_reference/functions/resumeTTS.html +0 -1
- package/docs/api_reference/functions/showInfoNotification.html +0 -2
- package/docs/api_reference/functions/showSuccessNotification.html +0 -2
- package/docs/api_reference/functions/speakWithStreaming.html +0 -1
- package/docs/api_reference/functions/stopTTS.html +0 -1
- package/docs/api_reference/functions/syncSubscriptionWithAPI.html +0 -1
- package/docs/api_reference/functions/updateSubscriptionTier.html +0 -2
- package/docs/api_reference/functions/useFeatureFlag.html +0 -2
- package/docs/api_reference/functions/useFeatureVisibility.html +0 -2
- package/docs/api_reference/functions/useFeatures.html +0 -2
- package/docs/api_reference/functions/useGatewayHealth.html +0 -1
- package/docs/api_reference/functions/useGatewayMemory.html +0 -1
- package/docs/api_reference/functions/useGatewayModels.html +0 -1
- package/docs/api_reference/functions/useGlobalTTS.html +0 -2
- package/docs/api_reference/functions/useManagementAccess.html +0 -2
- package/docs/api_reference/functions/useNotification.html +0 -1
- package/docs/api_reference/functions/useNotificationService.html +0 -6
- package/docs/api_reference/functions/useTTS.html +0 -2
- package/docs/api_reference/functions/useVectorStore.html +0 -13
- package/docs/api_reference/functions/useVoiceStore.html +0 -8
- package/docs/api_reference/functions/useVoices.html +0 -3
- package/docs/api_reference/functions/validateEnvironment.html +0 -2
- package/docs/api_reference/functions/validateSystemIntegrity.html +0 -2
- package/docs/api_reference/index.html +0 -916
- package/docs/api_reference/interfaces/AIChatRequest.html +0 -8
- package/docs/api_reference/interfaces/AIChatResponse.html +0 -3
- package/docs/api_reference/interfaces/AIGenerateRequest.html +0 -5
- package/docs/api_reference/interfaces/AIGenerateResponse.html +0 -3
- package/docs/api_reference/interfaces/AIMessage.html +0 -4
- package/docs/api_reference/interfaces/AIModel.html +0 -6
- package/docs/api_reference/interfaces/AIProviderConfig.html +0 -12
- package/docs/api_reference/interfaces/ChatConfig.html +0 -5
- package/docs/api_reference/interfaces/ChatModalProps.html +0 -7
- package/docs/api_reference/interfaces/CreateMemoryOptions.html +0 -7
- package/docs/api_reference/interfaces/FeatureEvaluation.html +0 -14
- package/docs/api_reference/interfaces/FeatureFlagConfig.html +0 -18
- package/docs/api_reference/interfaces/FeatureFlagContextValue.html +0 -16
- package/docs/api_reference/interfaces/FeatureFlagProviderProps.html +0 -4
- package/docs/api_reference/interfaces/FeedbackButtonProps.html +0 -19
- package/docs/api_reference/interfaces/FeedbackCategories.html +0 -6
- package/docs/api_reference/interfaces/FeedbackModalProps.html +0 -4
- package/docs/api_reference/interfaces/FeedbackPriorities.html +0 -5
- package/docs/api_reference/interfaces/FeedbackRequest.html +0 -12
- package/docs/api_reference/interfaces/FeedbackResponse.html +0 -7
- package/docs/api_reference/interfaces/FileUploadResult.html +0 -4
- package/docs/api_reference/interfaces/GatewayChatRequest.html +0 -13
- package/docs/api_reference/interfaces/GatewayChatResponse.html +0 -7
- package/docs/api_reference/interfaces/GatewayContract.html +0 -4
- package/docs/api_reference/interfaces/GatewayGenerateRequest.html +0 -8
- package/docs/api_reference/interfaces/GatewayGenerateResponse.html +0 -12
- package/docs/api_reference/interfaces/GatewayHealthResponse.html +0 -5
- package/docs/api_reference/interfaces/GatewayMemoryRecord.html +0 -7
- package/docs/api_reference/interfaces/GatewayMemoryResponse.html +0 -4
- package/docs/api_reference/interfaces/GatewayMessage.html +0 -5
- package/docs/api_reference/interfaces/GatewayMessageContent.html +0 -4
- package/docs/api_reference/interfaces/GatewayModel.html +0 -9
- package/docs/api_reference/interfaces/GatewayModelsResponse.html +0 -2
- package/docs/api_reference/interfaces/ManagementAccess.html +0 -5
- package/docs/api_reference/interfaces/ManagementAccessInput.html +0 -5
- package/docs/api_reference/interfaces/ManagementLink.html +0 -7
- package/docs/api_reference/interfaces/ManagementProps.html +0 -22
- package/docs/api_reference/interfaces/ManagementSectionDef.html +0 -10
- package/docs/api_reference/interfaces/MemorySearchFilters.html +0 -5
- package/docs/api_reference/interfaces/MigrationProgress.html +0 -6
- package/docs/api_reference/interfaces/MigrationStatus.html +0 -7
- package/docs/api_reference/interfaces/NotificationConfig.html +0 -5
- package/docs/api_reference/interfaces/NotificationContextType.html +0 -6
- package/docs/api_reference/interfaces/NotificationProviderProps.html +0 -4
- package/docs/api_reference/interfaces/PackageSettings.html +0 -22
- package/docs/api_reference/interfaces/SearchOptions.html +0 -6
- package/docs/api_reference/interfaces/SearchResult.html +0 -5
- package/docs/api_reference/interfaces/SubscriptionExpiredGuardProps.html +0 -7
- package/docs/api_reference/interfaces/SubscriptionExpiredModalProps.html +0 -6
- package/docs/api_reference/interfaces/TTSOptions.html +0 -5
- package/docs/api_reference/interfaces/TTSProgress.html +0 -6
- package/docs/api_reference/interfaces/TrialUsage.html +0 -6
- package/docs/api_reference/interfaces/UploadRequest.html +0 -9
- package/docs/api_reference/interfaces/UseTTSReturn.html +0 -14
- package/docs/api_reference/interfaces/VectorDocument.html +0 -11
- package/docs/api_reference/interfaces/VectorMemory.html +0 -12
- package/docs/api_reference/interfaces/VectorMemoryMetadata.html +0 -7
- package/docs/api_reference/interfaces/VectorStoreStatus.html +0 -7
- package/docs/api_reference/interfaces/VoiceModelsResponse.html +0 -4
- package/docs/api_reference/interfaces/VoiceState.html +0 -12
- package/docs/api_reference/media/02_gateway_api.md +0 -123
- package/docs/api_reference/media/05_cli_quickstart.md +0 -87
- package/docs/api_reference/media/LICENSE +0 -43
- package/docs/api_reference/media/PRE-PUSH-CHECKLIST.md +0 -10
- package/docs/api_reference/media/PROTECTION-NOTICE.md +0 -11
- package/docs/api_reference/media/README.md +0 -58
- package/docs/api_reference/modules.html +0 -136
- package/docs/api_reference/types/FeatureKey.html +0 -2
- package/docs/api_reference/types/FeatureMatrix.html +0 -2
- package/docs/api_reference/types/GatewayQueryOptions.html +0 -1
- package/docs/api_reference/types/LogContext.html +0 -14
- package/docs/api_reference/types/ManagementRequest.html +0 -1
- package/docs/api_reference/types/ManagementSectionId.html +0 -2
- package/docs/api_reference/types/SubscriptionTier.html +0 -2
- package/docs/api_reference/variables/DEFAULT_TIER_FEATURES.html +0 -2
- package/docs/api_reference/variables/FeatureFlagContext.html +0 -1
- package/docs/api_reference/variables/MANAGEMENT_SECTIONS.html +0 -1
- package/docs/api_reference/variables/OSS_DEFAULT_FEATURES.html +0 -2
- package/docs/api_reference/variables/SYSTEM_FLAGS.html +0 -2
- package/docs/api_reference/variables/authenticationService.html +0 -1
- package/docs/api_reference/variables/debugLogger-1.html +0 -1
- package/docs/api_reference/variables/featureFlagService-1.html +0 -2
- package/docs/api_reference/variables/notificationService-1.html +0 -1
- package/docs/api_reference/variables/vectorDatabaseService-1.html +0 -1
- package/docs/api_reference/variables/vectorMigrationService-1.html +0 -1
- package/docs/api_reference/variables/voiceService-1.html +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
debugLogger
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NI7BKLC7.mjs";
|
|
4
4
|
|
|
5
5
|
// src/store/aiProviderStore.ts
|
|
6
6
|
import { create as create2 } from "zustand";
|
|
@@ -9,7 +9,18 @@ import { create as create2 } from "zustand";
|
|
|
9
9
|
import { map as map2 } from "rxjs";
|
|
10
10
|
|
|
11
11
|
// src/services/ollama/ollama.service.ts
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
catchError,
|
|
14
|
+
from,
|
|
15
|
+
lastValueFrom,
|
|
16
|
+
map,
|
|
17
|
+
Observable,
|
|
18
|
+
of,
|
|
19
|
+
shareReplay,
|
|
20
|
+
switchMap,
|
|
21
|
+
throwError,
|
|
22
|
+
timeout
|
|
23
|
+
} from "rxjs";
|
|
13
24
|
|
|
14
25
|
// src/services/stream/streamLineParser.ts
|
|
15
26
|
var SKIP = { kind: "skip" };
|
|
@@ -42,7 +53,9 @@ var StreamLineParser = class {
|
|
|
42
53
|
// src/services/ollama/ollama.service.ts
|
|
43
54
|
var handleError = () => (obs) => obs.pipe(
|
|
44
55
|
switchMap(
|
|
45
|
-
(response) => response.ok ? of(response) : throwError(
|
|
56
|
+
(response) => response.ok ? of(response) : throwError(
|
|
57
|
+
() => new Error(`Request failed: ${response.status} ${response.statusText}`)
|
|
58
|
+
)
|
|
46
59
|
)
|
|
47
60
|
);
|
|
48
61
|
var parseResponseBody = async (response, responseType) => {
|
|
@@ -97,7 +110,9 @@ var OllamaService = class {
|
|
|
97
110
|
}
|
|
98
111
|
return availablility;
|
|
99
112
|
} catch (e) {
|
|
100
|
-
debugLogger.warn(
|
|
113
|
+
debugLogger.warn(
|
|
114
|
+
`Service not available at ${this._baseUrl}, trying fallback URL: ${fallbackUrl}`
|
|
115
|
+
);
|
|
101
116
|
try {
|
|
102
117
|
availablility.url = fallbackUrl;
|
|
103
118
|
availablility.isAvailable = await lastValueFrom(
|
|
@@ -124,7 +139,10 @@ var OllamaService = class {
|
|
|
124
139
|
const task = fetch(url, {
|
|
125
140
|
method: "POST",
|
|
126
141
|
headers: this._getHeaders(),
|
|
127
|
-
body: JSON.stringify({
|
|
142
|
+
body: JSON.stringify({
|
|
143
|
+
...request,
|
|
144
|
+
stream: request.stream === false ? false : true
|
|
145
|
+
})
|
|
128
146
|
});
|
|
129
147
|
task.then((response) => {
|
|
130
148
|
this._throwErrorIfNotOk(url, response);
|
|
@@ -141,7 +159,9 @@ var OllamaService = class {
|
|
|
141
159
|
observer.next(JSON.parse(tail.text));
|
|
142
160
|
} catch (err) {
|
|
143
161
|
observer.error(err);
|
|
144
|
-
debugLogger.error("Final chunk parsing error (generate):", {
|
|
162
|
+
debugLogger.error("Final chunk parsing error (generate):", {
|
|
163
|
+
buffer
|
|
164
|
+
});
|
|
145
165
|
}
|
|
146
166
|
}
|
|
147
167
|
observer.complete();
|
|
@@ -238,18 +258,24 @@ var OllamaService = class {
|
|
|
238
258
|
};
|
|
239
259
|
const response = from(fetch(url, requestInit));
|
|
240
260
|
const handleFetchError = response.pipe(handleError());
|
|
241
|
-
const data = handleFetchError.pipe(
|
|
261
|
+
const data = handleFetchError.pipe(
|
|
262
|
+
switchMap((res) => from(parseResponseBody(res, responseType)))
|
|
263
|
+
);
|
|
242
264
|
const result = data.pipe(shareReplay(1));
|
|
243
265
|
return result;
|
|
244
266
|
}
|
|
245
267
|
_post(url, body) {
|
|
246
|
-
const response = from(
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
268
|
+
const response = from(
|
|
269
|
+
fetch(url, {
|
|
270
|
+
method: "POST",
|
|
271
|
+
headers: this._getHeaders(),
|
|
272
|
+
body: JSON.stringify(body)
|
|
273
|
+
})
|
|
274
|
+
);
|
|
251
275
|
const handleFetchError = response.pipe(handleError());
|
|
252
|
-
const json = handleFetchError.pipe(
|
|
276
|
+
const json = handleFetchError.pipe(
|
|
277
|
+
switchMap((res) => from(parseResponseBody(res, "json")))
|
|
278
|
+
);
|
|
253
279
|
const result = json.pipe(shareReplay(1));
|
|
254
280
|
return result;
|
|
255
281
|
}
|
|
@@ -261,27 +287,37 @@ var OllamaService = class {
|
|
|
261
287
|
_getHeaders() {
|
|
262
288
|
const token = this._tokenFactory();
|
|
263
289
|
if (!token) {
|
|
264
|
-
debugLogger.warn(
|
|
290
|
+
debugLogger.warn(
|
|
291
|
+
"OllamaService: No token found, using empty string for Authorization header"
|
|
292
|
+
);
|
|
265
293
|
}
|
|
266
294
|
return {
|
|
267
295
|
"Content-Type": "application/json",
|
|
268
|
-
|
|
296
|
+
Authorization: `Bearer ${token || ""}`
|
|
269
297
|
};
|
|
270
298
|
}
|
|
271
299
|
};
|
|
272
300
|
|
|
273
301
|
// src/services/ai-provider/providers/deprecated.ts
|
|
274
302
|
function deprecatedOpenAIProvider() {
|
|
275
|
-
debugLogger.warn(
|
|
303
|
+
debugLogger.warn(
|
|
304
|
+
'\u26A0\uFE0F DEPRECATION WARNING: Direct OpenAI provider is deprecated. Please migrate to GatewayProvider with provider: "openai". See GATEWAY_MIGRATION_GUIDE.md for details.'
|
|
305
|
+
);
|
|
276
306
|
}
|
|
277
307
|
function deprecatedAzureOpenAIProvider() {
|
|
278
|
-
debugLogger.warn(
|
|
308
|
+
debugLogger.warn(
|
|
309
|
+
'\u26A0\uFE0F DEPRECATION WARNING: Direct Azure OpenAI provider is deprecated. Please migrate to GatewayProvider with provider: "azure-openai". See GATEWAY_MIGRATION_GUIDE.md for details.'
|
|
310
|
+
);
|
|
279
311
|
}
|
|
280
312
|
function deprecatedAnthropicProvider() {
|
|
281
|
-
debugLogger.warn(
|
|
313
|
+
debugLogger.warn(
|
|
314
|
+
'\u26A0\uFE0F DEPRECATION WARNING: Direct Anthropic provider is deprecated. Please migrate to GatewayProvider with provider: "anthropic". See GATEWAY_MIGRATION_GUIDE.md for details.'
|
|
315
|
+
);
|
|
282
316
|
}
|
|
283
317
|
function deprecatedOllamaProvider() {
|
|
284
|
-
debugLogger.info(
|
|
318
|
+
debugLogger.info(
|
|
319
|
+
'\u2139\uFE0F INFO: Direct Ollama provider is available for local development. For production environments, consider using GatewayProvider with provider: "ollama" for enhanced management. See GATEWAY_MIGRATION_GUIDE.md for details.'
|
|
320
|
+
);
|
|
285
321
|
}
|
|
286
322
|
|
|
287
323
|
// src/services/ai-provider/providers/ollama.provider.ts
|
|
@@ -297,10 +333,7 @@ var OllamaProvider = class {
|
|
|
297
333
|
finalBaseUrl: baseUrl,
|
|
298
334
|
hasTokenFactory: !!config.tokenFactory
|
|
299
335
|
});
|
|
300
|
-
this.ollamaService = new OllamaService(
|
|
301
|
-
baseUrl,
|
|
302
|
-
config.tokenFactory || (() => null)
|
|
303
|
-
);
|
|
336
|
+
this.ollamaService = new OllamaService(baseUrl, config.tokenFactory || (() => null));
|
|
304
337
|
}
|
|
305
338
|
chat(request) {
|
|
306
339
|
const ollamaRequest = {
|
|
@@ -339,13 +372,15 @@ var OllamaProvider = class {
|
|
|
339
372
|
}
|
|
340
373
|
listModels() {
|
|
341
374
|
return this.ollamaService.listModels().pipe(
|
|
342
|
-
map2(
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
375
|
+
map2(
|
|
376
|
+
(models) => models.map((model) => ({
|
|
377
|
+
name: model.name,
|
|
378
|
+
size: model.size,
|
|
379
|
+
details: model.details,
|
|
380
|
+
digest: model.digest,
|
|
381
|
+
modified_at: model.modified_at
|
|
382
|
+
}))
|
|
383
|
+
)
|
|
349
384
|
);
|
|
350
385
|
}
|
|
351
386
|
async validateServiceAvailability(args) {
|
|
@@ -403,9 +438,11 @@ var OpenAIProvider = class {
|
|
|
403
438
|
}
|
|
404
439
|
listModels() {
|
|
405
440
|
const url = `${this.baseUrl}/models`;
|
|
406
|
-
return from2(
|
|
407
|
-
|
|
408
|
-
|
|
441
|
+
return from2(
|
|
442
|
+
fetch(url, {
|
|
443
|
+
headers: this.getHeaders()
|
|
444
|
+
})
|
|
445
|
+
).pipe(
|
|
409
446
|
switchMap2((response) => {
|
|
410
447
|
if (!response.ok) {
|
|
411
448
|
return throwError2(() => new Error(`Failed to list models: ${response.status}`));
|
|
@@ -520,7 +557,10 @@ var OpenAIProvider = class {
|
|
|
520
557
|
});
|
|
521
558
|
}
|
|
522
559
|
} catch (err) {
|
|
523
|
-
debugLogger.error("Error parsing OpenAI stream data:", {
|
|
560
|
+
debugLogger.error("Error parsing OpenAI stream data:", {
|
|
561
|
+
data,
|
|
562
|
+
error: err
|
|
563
|
+
});
|
|
524
564
|
}
|
|
525
565
|
}
|
|
526
566
|
}
|
|
@@ -532,14 +572,16 @@ var OpenAIProvider = class {
|
|
|
532
572
|
});
|
|
533
573
|
}
|
|
534
574
|
nonStreamChatRequest(url, payload) {
|
|
535
|
-
return from2(
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
575
|
+
return from2(
|
|
576
|
+
fetch(url, {
|
|
577
|
+
method: "POST",
|
|
578
|
+
headers: {
|
|
579
|
+
...this.getHeaders(),
|
|
580
|
+
"Content-Type": "application/json"
|
|
581
|
+
},
|
|
582
|
+
body: JSON.stringify(payload)
|
|
583
|
+
})
|
|
584
|
+
).pipe(
|
|
543
585
|
switchMap2((response) => {
|
|
544
586
|
if (!response.ok) {
|
|
545
587
|
return throwError2(() => new Error(`OpenAI request failed: ${response.status}`));
|
|
@@ -728,7 +770,10 @@ var AzureOpenAIProvider = class {
|
|
|
728
770
|
});
|
|
729
771
|
}
|
|
730
772
|
} catch (err) {
|
|
731
|
-
debugLogger.error("Error parsing Azure OpenAI stream data:", {
|
|
773
|
+
debugLogger.error("Error parsing Azure OpenAI stream data:", {
|
|
774
|
+
data,
|
|
775
|
+
error: err
|
|
776
|
+
});
|
|
732
777
|
}
|
|
733
778
|
}
|
|
734
779
|
}
|
|
@@ -740,17 +785,21 @@ var AzureOpenAIProvider = class {
|
|
|
740
785
|
});
|
|
741
786
|
}
|
|
742
787
|
nonStreamChatRequest(url, payload) {
|
|
743
|
-
return from3(
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
788
|
+
return from3(
|
|
789
|
+
fetch(url, {
|
|
790
|
+
method: "POST",
|
|
791
|
+
headers: {
|
|
792
|
+
...this.getHeaders(),
|
|
793
|
+
"Content-Type": "application/json"
|
|
794
|
+
},
|
|
795
|
+
body: JSON.stringify(payload)
|
|
796
|
+
})
|
|
797
|
+
).pipe(
|
|
751
798
|
switchMap3((response) => {
|
|
752
799
|
if (!response.ok) {
|
|
753
|
-
return throwError3(
|
|
800
|
+
return throwError3(
|
|
801
|
+
() => new Error(`Azure OpenAI request failed: ${response.status}`)
|
|
802
|
+
);
|
|
754
803
|
}
|
|
755
804
|
return from3(response.json());
|
|
756
805
|
}),
|
|
@@ -979,7 +1028,10 @@ var AnthropicProvider = class {
|
|
|
979
1028
|
});
|
|
980
1029
|
}
|
|
981
1030
|
} catch (err) {
|
|
982
|
-
debugLogger.error("Error parsing Anthropic stream data:", {
|
|
1031
|
+
debugLogger.error("Error parsing Anthropic stream data:", {
|
|
1032
|
+
data,
|
|
1033
|
+
error: err
|
|
1034
|
+
});
|
|
983
1035
|
}
|
|
984
1036
|
}
|
|
985
1037
|
}
|
|
@@ -991,17 +1043,21 @@ var AnthropicProvider = class {
|
|
|
991
1043
|
});
|
|
992
1044
|
}
|
|
993
1045
|
nonStreamChatRequest(url, payload) {
|
|
994
|
-
return from4(
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1046
|
+
return from4(
|
|
1047
|
+
fetch(url, {
|
|
1048
|
+
method: "POST",
|
|
1049
|
+
headers: {
|
|
1050
|
+
...this.getHeaders(),
|
|
1051
|
+
"Content-Type": "application/json"
|
|
1052
|
+
},
|
|
1053
|
+
body: JSON.stringify(payload)
|
|
1054
|
+
})
|
|
1055
|
+
).pipe(
|
|
1002
1056
|
switchMap4((response) => {
|
|
1003
1057
|
if (!response.ok) {
|
|
1004
|
-
return throwError4(
|
|
1058
|
+
return throwError4(
|
|
1059
|
+
() => new Error(`Anthropic request failed: ${response.status}`)
|
|
1060
|
+
);
|
|
1005
1061
|
}
|
|
1006
1062
|
return from4(response.json());
|
|
1007
1063
|
}),
|
|
@@ -1053,9 +1109,42 @@ var AnthropicProvider = class {
|
|
|
1053
1109
|
// src/services/ai-provider/providers/gateway.provider.ts
|
|
1054
1110
|
import { map as map12 } from "rxjs";
|
|
1055
1111
|
|
|
1112
|
+
// src/services/ai-provider/context-sources.ts
|
|
1113
|
+
var MAX_LABEL = 120;
|
|
1114
|
+
var clean = (value) => {
|
|
1115
|
+
if (typeof value !== "string") return void 0;
|
|
1116
|
+
const trimmed = value.trim();
|
|
1117
|
+
if (!trimmed) return void 0;
|
|
1118
|
+
return trimmed.length > MAX_LABEL ? `${trimmed.slice(0, MAX_LABEL - 1)}\u2026` : trimmed;
|
|
1119
|
+
};
|
|
1120
|
+
var readContextSourcesField = (chunk) => {
|
|
1121
|
+
if (!chunk || typeof chunk !== "object") return void 0;
|
|
1122
|
+
const record = chunk;
|
|
1123
|
+
const raw = record.context_sources ?? record.contextSources;
|
|
1124
|
+
if (!Array.isArray(raw)) return void 0;
|
|
1125
|
+
const out = [];
|
|
1126
|
+
for (const entry of raw) {
|
|
1127
|
+
if (!entry || typeof entry !== "object") continue;
|
|
1128
|
+
const label = clean(entry.label);
|
|
1129
|
+
if (!label) continue;
|
|
1130
|
+
const detail = clean(entry.detail);
|
|
1131
|
+
out.push(detail ? { label, detail } : { label });
|
|
1132
|
+
}
|
|
1133
|
+
return out.length ? out : void 0;
|
|
1134
|
+
};
|
|
1135
|
+
|
|
1056
1136
|
// src/services/gateway/gateway.service.ts
|
|
1057
1137
|
import axios, { AxiosHeaders } from "axios";
|
|
1058
|
-
import {
|
|
1138
|
+
import {
|
|
1139
|
+
catchError as catchError2,
|
|
1140
|
+
from as from5,
|
|
1141
|
+
lastValueFrom as lastValueFrom2,
|
|
1142
|
+
map as map6,
|
|
1143
|
+
Observable as Observable6,
|
|
1144
|
+
of as of2,
|
|
1145
|
+
shareReplay as shareReplay2,
|
|
1146
|
+
timeout as timeout2
|
|
1147
|
+
} from "rxjs";
|
|
1059
1148
|
|
|
1060
1149
|
// src/store/authenticationStore.ts
|
|
1061
1150
|
import { create } from "zustand";
|
|
@@ -1122,9 +1211,11 @@ function emitAuthTokenChanged(token) {
|
|
|
1122
1211
|
if (typeof window === "undefined") {
|
|
1123
1212
|
return;
|
|
1124
1213
|
}
|
|
1125
|
-
window.dispatchEvent(
|
|
1126
|
-
|
|
1127
|
-
|
|
1214
|
+
window.dispatchEvent(
|
|
1215
|
+
new CustomEvent(AUTH_TOKEN_CHANGED_EVENT, {
|
|
1216
|
+
detail: { token }
|
|
1217
|
+
})
|
|
1218
|
+
);
|
|
1128
1219
|
}
|
|
1129
1220
|
var readLocalStorage = () => {
|
|
1130
1221
|
try {
|
|
@@ -1238,8 +1329,10 @@ var AuthenticationService = class {
|
|
|
1238
1329
|
}
|
|
1239
1330
|
}
|
|
1240
1331
|
parseJwtClaims(token) {
|
|
1332
|
+
const parts = token ? token.split(".") : [];
|
|
1333
|
+
if (parts.length !== 3) return null;
|
|
1241
1334
|
try {
|
|
1242
|
-
const base64Url =
|
|
1335
|
+
const base64Url = parts[1];
|
|
1243
1336
|
const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
|
|
1244
1337
|
const jsonPayload = decodeURIComponent(
|
|
1245
1338
|
atob(base64).split("").map((c) => {
|
|
@@ -1323,7 +1416,8 @@ var GatewayService = class {
|
|
|
1323
1416
|
*/
|
|
1324
1417
|
async _retryAfterRefresh(instance, error) {
|
|
1325
1418
|
const config = error.config;
|
|
1326
|
-
if (!config || config._banditAuthRetried || error.response?.status !== 401)
|
|
1419
|
+
if (!config || config._banditAuthRetried || error.response?.status !== 401)
|
|
1420
|
+
return null;
|
|
1327
1421
|
if (!authenticationService.canRefresh()) return null;
|
|
1328
1422
|
const data = error.response?.data;
|
|
1329
1423
|
if (data?.code && data.code !== "TOKEN_EXPIRED") return null;
|
|
@@ -1418,7 +1512,9 @@ var GatewayService = class {
|
|
|
1418
1512
|
return availability;
|
|
1419
1513
|
} catch (e) {
|
|
1420
1514
|
if (fallbackUrl) {
|
|
1421
|
-
debugLogger.warn(
|
|
1515
|
+
debugLogger.warn(
|
|
1516
|
+
`Gateway service not available at ${this._baseUrl}, trying fallback URL: ${fallbackUrl}`
|
|
1517
|
+
);
|
|
1422
1518
|
try {
|
|
1423
1519
|
availability.url = fallbackUrl.replace(/\/$/, "");
|
|
1424
1520
|
availability.isAvailable = await lastValueFrom2(
|
|
@@ -1434,7 +1530,9 @@ var GatewayService = class {
|
|
|
1434
1530
|
this._setBaseUrl(availability.url);
|
|
1435
1531
|
return availability;
|
|
1436
1532
|
} catch (e2) {
|
|
1437
|
-
debugLogger.error(
|
|
1533
|
+
debugLogger.error(
|
|
1534
|
+
`Gateway service not available at fallback URL: ${fallbackUrl}`
|
|
1535
|
+
);
|
|
1438
1536
|
throw e2;
|
|
1439
1537
|
}
|
|
1440
1538
|
} else {
|
|
@@ -1460,7 +1558,11 @@ var GatewayService = class {
|
|
|
1460
1558
|
const trimmed = (request.model ?? "").replace(/^bandit:/, "").trim();
|
|
1461
1559
|
return trimmed !== "" ? trimmed : "bandit-core-1";
|
|
1462
1560
|
})() : request.model;
|
|
1463
|
-
const requestBody = {
|
|
1561
|
+
const requestBody = {
|
|
1562
|
+
...request,
|
|
1563
|
+
model: normalizedModel,
|
|
1564
|
+
stream: request.stream !== false
|
|
1565
|
+
};
|
|
1464
1566
|
return new Observable6((observer) => {
|
|
1465
1567
|
const controller = new AbortController();
|
|
1466
1568
|
const handleStreamingResponse = async (response) => {
|
|
@@ -1477,7 +1579,10 @@ var GatewayService = class {
|
|
|
1477
1579
|
const finalResponse = JSON.parse(tail.text);
|
|
1478
1580
|
observer.next(finalResponse);
|
|
1479
1581
|
} catch (err) {
|
|
1480
|
-
debugLogger.error("GatewayService chat final chunk parsing error", {
|
|
1582
|
+
debugLogger.error("GatewayService chat final chunk parsing error", {
|
|
1583
|
+
buffer,
|
|
1584
|
+
error: err
|
|
1585
|
+
});
|
|
1481
1586
|
observer.error(err);
|
|
1482
1587
|
}
|
|
1483
1588
|
}
|
|
@@ -1502,17 +1607,21 @@ var GatewayService = class {
|
|
|
1502
1607
|
const transformed = {
|
|
1503
1608
|
id: `chatcmpl-${Date.now()}`,
|
|
1504
1609
|
object: "chat.completion.chunk",
|
|
1505
|
-
created: Math.floor(
|
|
1610
|
+
created: Math.floor(
|
|
1611
|
+
new Date(parsed.created_at || Date.now()).getTime() / 1e3
|
|
1612
|
+
),
|
|
1506
1613
|
model: parsed.model,
|
|
1507
|
-
choices: [
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1614
|
+
choices: [
|
|
1615
|
+
{
|
|
1616
|
+
index: 0,
|
|
1617
|
+
delta: {
|
|
1618
|
+
role: parsed.message.role,
|
|
1619
|
+
content: parsed.message.content,
|
|
1620
|
+
tool_calls: parsed.message.tool_calls
|
|
1621
|
+
},
|
|
1622
|
+
finish_reason: parsed.done ? parsed.done_reason || "stop" : null
|
|
1623
|
+
}
|
|
1624
|
+
]
|
|
1516
1625
|
};
|
|
1517
1626
|
if (parsed.done && parsed.total_duration) {
|
|
1518
1627
|
transformed.usage = {
|
|
@@ -1542,25 +1651,33 @@ var GatewayService = class {
|
|
|
1542
1651
|
};
|
|
1543
1652
|
const sendRequest = (targetEndpoint, allowFallback) => {
|
|
1544
1653
|
const url = `${this._baseUrl}${targetEndpoint}`;
|
|
1545
|
-
debugLogger.debug(
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1654
|
+
debugLogger.debug(
|
|
1655
|
+
`Gateway chat request to ${url} with provider: ${request.provider || "default"}`,
|
|
1656
|
+
{
|
|
1657
|
+
model: normalizedModel,
|
|
1658
|
+
messageCount: request.messages.length,
|
|
1659
|
+
hasImages: !!(request.images && request.images.length > 0),
|
|
1660
|
+
imageCount: request.images?.length || 0
|
|
1661
|
+
}
|
|
1662
|
+
);
|
|
1551
1663
|
fetch(url, {
|
|
1552
1664
|
method: "POST",
|
|
1553
1665
|
headers: this._getHeaders(),
|
|
1554
1666
|
body: JSON.stringify(requestBody),
|
|
1555
1667
|
signal: controller.signal
|
|
1556
1668
|
}).then(async (response) => {
|
|
1557
|
-
debugLogger.debug(
|
|
1669
|
+
debugLogger.debug(
|
|
1670
|
+
`Gateway chat response status: ${response.status} for provider: ${request.provider || "default"}`
|
|
1671
|
+
);
|
|
1558
1672
|
if (response.status === 404 && allowFallback && fallbackEndpoint) {
|
|
1559
|
-
debugLogger.warn(
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1673
|
+
debugLogger.warn(
|
|
1674
|
+
"GatewayService chat endpoint returned 404, attempting fallback route",
|
|
1675
|
+
{
|
|
1676
|
+
provider: request.provider,
|
|
1677
|
+
attemptedEndpoint: targetEndpoint,
|
|
1678
|
+
fallbackEndpoint
|
|
1679
|
+
}
|
|
1680
|
+
);
|
|
1564
1681
|
sendRequest(fallbackEndpoint, false);
|
|
1565
1682
|
return;
|
|
1566
1683
|
}
|
|
@@ -1576,7 +1693,10 @@ var GatewayService = class {
|
|
|
1576
1693
|
body: errorText
|
|
1577
1694
|
});
|
|
1578
1695
|
} catch (readError) {
|
|
1579
|
-
debugLogger.error(
|
|
1696
|
+
debugLogger.error(
|
|
1697
|
+
"GatewayService chat failed to read error response body",
|
|
1698
|
+
{ error: readError }
|
|
1699
|
+
);
|
|
1580
1700
|
errorText = `Request failed with status ${response.status}`;
|
|
1581
1701
|
}
|
|
1582
1702
|
try {
|
|
@@ -1626,14 +1746,21 @@ var GatewayService = class {
|
|
|
1626
1746
|
const trimmed = (request.model ?? "").replace(/^bandit:/, "").trim();
|
|
1627
1747
|
return trimmed !== "" ? trimmed : "bandit-core-1";
|
|
1628
1748
|
})() : request.model;
|
|
1629
|
-
debugLogger.debug(
|
|
1630
|
-
|
|
1631
|
-
|
|
1749
|
+
debugLogger.debug(
|
|
1750
|
+
`Gateway generate request to ${url} with provider: ${request.provider || "default"}`,
|
|
1751
|
+
{
|
|
1752
|
+
model: normalizedModel
|
|
1753
|
+
}
|
|
1754
|
+
);
|
|
1632
1755
|
return new Observable6((observer) => {
|
|
1633
1756
|
const task = fetch(url, {
|
|
1634
1757
|
method: "POST",
|
|
1635
1758
|
headers: this._getHeaders(),
|
|
1636
|
-
body: JSON.stringify({
|
|
1759
|
+
body: JSON.stringify({
|
|
1760
|
+
...request,
|
|
1761
|
+
model: normalizedModel,
|
|
1762
|
+
stream: request.stream !== false
|
|
1763
|
+
})
|
|
1637
1764
|
});
|
|
1638
1765
|
task.then(async (response) => {
|
|
1639
1766
|
if (!response.ok) {
|
|
@@ -1673,7 +1800,9 @@ var GatewayService = class {
|
|
|
1673
1800
|
observer.next(JSON.parse(tail.text));
|
|
1674
1801
|
} catch (err) {
|
|
1675
1802
|
observer.error(err);
|
|
1676
|
-
debugLogger.error("Final chunk parsing error (gateway generate):", {
|
|
1803
|
+
debugLogger.error("Final chunk parsing error (gateway generate):", {
|
|
1804
|
+
buffer
|
|
1805
|
+
});
|
|
1677
1806
|
}
|
|
1678
1807
|
}
|
|
1679
1808
|
observer.complete();
|
|
@@ -1693,7 +1822,9 @@ var GatewayService = class {
|
|
|
1693
1822
|
observer.next(JSON.parse(classified.text));
|
|
1694
1823
|
} catch (err) {
|
|
1695
1824
|
observer.error(err);
|
|
1696
|
-
debugLogger.error("Error parsing JSON line (gateway generate):", {
|
|
1825
|
+
debugLogger.error("Error parsing JSON line (gateway generate):", {
|
|
1826
|
+
line
|
|
1827
|
+
});
|
|
1697
1828
|
}
|
|
1698
1829
|
}
|
|
1699
1830
|
}
|
|
@@ -1817,7 +1948,9 @@ var GatewayService = class {
|
|
|
1817
1948
|
* Generate a mailto URL as fallback for feedback submission
|
|
1818
1949
|
*/
|
|
1819
1950
|
_generateMailtoUrl(feedback) {
|
|
1820
|
-
const subject = encodeURIComponent(
|
|
1951
|
+
const subject = encodeURIComponent(
|
|
1952
|
+
`[${feedback.category.toUpperCase()}] ${feedback.title}`
|
|
1953
|
+
);
|
|
1821
1954
|
let body = `Category: ${feedback.category}
|
|
1822
1955
|
`;
|
|
1823
1956
|
body += `Priority: ${feedback.priority}
|
|
@@ -2341,7 +2474,9 @@ var GatewayProvider = class {
|
|
|
2341
2474
|
throw new Error("Gateway provider requires gatewayUrl in config");
|
|
2342
2475
|
}
|
|
2343
2476
|
if (!config.provider) {
|
|
2344
|
-
throw new Error(
|
|
2477
|
+
throw new Error(
|
|
2478
|
+
"Gateway provider requires provider field to specify backend (openai, azure-openai, anthropic, ollama)"
|
|
2479
|
+
);
|
|
2345
2480
|
}
|
|
2346
2481
|
const tokenFactory = config.tokenFactory || (() => null);
|
|
2347
2482
|
this.gatewayService = new GatewayService(config.gatewayUrl, tokenFactory);
|
|
@@ -2358,7 +2493,9 @@ var GatewayProvider = class {
|
|
|
2358
2493
|
break;
|
|
2359
2494
|
case "azure-openai":
|
|
2360
2495
|
if (!this.config.deploymentName || !this.config.apiVersion) {
|
|
2361
|
-
throw new Error(
|
|
2496
|
+
throw new Error(
|
|
2497
|
+
"Azure OpenAI gateway provider requires deploymentName and apiVersion"
|
|
2498
|
+
);
|
|
2362
2499
|
}
|
|
2363
2500
|
this.providerSpecificService = new AzureOpenAIGatewayService(
|
|
2364
2501
|
gatewayUrl,
|
|
@@ -2370,10 +2507,16 @@ var GatewayProvider = class {
|
|
|
2370
2507
|
);
|
|
2371
2508
|
break;
|
|
2372
2509
|
case "anthropic":
|
|
2373
|
-
this.providerSpecificService = new AnthropicGatewayService(
|
|
2510
|
+
this.providerSpecificService = new AnthropicGatewayService(
|
|
2511
|
+
gatewayUrl,
|
|
2512
|
+
tokenFactory
|
|
2513
|
+
);
|
|
2374
2514
|
break;
|
|
2375
2515
|
case "bandit":
|
|
2376
|
-
this.providerSpecificService = new BanditAIGatewayService(
|
|
2516
|
+
this.providerSpecificService = new BanditAIGatewayService(
|
|
2517
|
+
gatewayUrl,
|
|
2518
|
+
tokenFactory
|
|
2519
|
+
);
|
|
2377
2520
|
break;
|
|
2378
2521
|
case "ollama":
|
|
2379
2522
|
this.providerSpecificService = new OllamaGatewayService(gatewayUrl, tokenFactory);
|
|
@@ -2411,7 +2554,9 @@ var GatewayProvider = class {
|
|
|
2411
2554
|
images: request.images
|
|
2412
2555
|
};
|
|
2413
2556
|
}
|
|
2414
|
-
} else if (["openai", "azure-openai", "anthropic", "bandit", "playground"].includes(
|
|
2557
|
+
} else if (["openai", "azure-openai", "anthropic", "bandit", "playground"].includes(
|
|
2558
|
+
this.config.provider || ""
|
|
2559
|
+
)) {
|
|
2415
2560
|
if (lastUserMessageIndex !== -1) {
|
|
2416
2561
|
const currentMessage = messages[lastUserMessageIndex];
|
|
2417
2562
|
const contentArray = [
|
|
@@ -2460,7 +2605,9 @@ var GatewayProvider = class {
|
|
|
2460
2605
|
stream: request.stream,
|
|
2461
2606
|
hasImages: !!(request.images && request.images.length > 0),
|
|
2462
2607
|
imageCount: request.images?.length || 0,
|
|
2463
|
-
imageStrategy: this.config.provider === "ollama" ? "message-level-array" : ["openai", "azure-openai", "anthropic", "playground"].includes(
|
|
2608
|
+
imageStrategy: this.config.provider === "ollama" ? "message-level-array" : ["openai", "azure-openai", "anthropic", "playground"].includes(
|
|
2609
|
+
this.config.provider || ""
|
|
2610
|
+
) ? "structured-content" : "top-level-fallback",
|
|
2464
2611
|
finalMessages: messages.map((m) => ({
|
|
2465
2612
|
role: m.role,
|
|
2466
2613
|
hasImages: Array.isArray(m.images) && m.images.length > 0,
|
|
@@ -2471,12 +2618,14 @@ var GatewayProvider = class {
|
|
|
2471
2618
|
map12((response) => {
|
|
2472
2619
|
const choice = response.choices?.[0];
|
|
2473
2620
|
const toolCalls = choice?.message?.tool_calls ?? choice?.delta?.tool_calls;
|
|
2621
|
+
const contextSources = readContextSourcesField(response);
|
|
2474
2622
|
return {
|
|
2475
2623
|
message: {
|
|
2476
2624
|
content: choice?.message?.content ?? choice?.delta?.content ?? "",
|
|
2477
2625
|
role: "assistant",
|
|
2478
2626
|
tool_calls: toolCalls
|
|
2479
2627
|
},
|
|
2628
|
+
...contextSources ? { contextSources } : {},
|
|
2480
2629
|
done: choice?.finish_reason === "stop" || choice?.finish_reason === "length" || choice?.finish_reason === "tool_calls"
|
|
2481
2630
|
};
|
|
2482
2631
|
})
|
|
@@ -2503,26 +2652,32 @@ var GatewayProvider = class {
|
|
|
2503
2652
|
);
|
|
2504
2653
|
}
|
|
2505
2654
|
listModels() {
|
|
2506
|
-
debugLogger.debug("Gateway provider listing models", {
|
|
2655
|
+
debugLogger.debug("Gateway provider listing models", {
|
|
2656
|
+
provider: this.config.provider
|
|
2657
|
+
});
|
|
2507
2658
|
if (this.config.provider) {
|
|
2508
2659
|
return this.gatewayService.listModelsByProvider(this.config.provider).pipe(
|
|
2509
|
-
map12(
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2660
|
+
map12(
|
|
2661
|
+
(models) => models.map((model) => ({
|
|
2662
|
+
name: model.id || model.name,
|
|
2663
|
+
size: model.size,
|
|
2664
|
+
details: model.details,
|
|
2665
|
+
digest: model.digest,
|
|
2666
|
+
modified_at: model.modified_at
|
|
2667
|
+
}))
|
|
2668
|
+
)
|
|
2516
2669
|
);
|
|
2517
2670
|
} else {
|
|
2518
2671
|
return this.gatewayService.listModels().pipe(
|
|
2519
|
-
map12(
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2672
|
+
map12(
|
|
2673
|
+
(models) => models.map((model) => ({
|
|
2674
|
+
name: model.id || model.name,
|
|
2675
|
+
size: model.size,
|
|
2676
|
+
details: model.details,
|
|
2677
|
+
digest: model.digest,
|
|
2678
|
+
modified_at: model.modified_at
|
|
2679
|
+
}))
|
|
2680
|
+
)
|
|
2526
2681
|
);
|
|
2527
2682
|
}
|
|
2528
2683
|
}
|
|
@@ -2663,9 +2818,7 @@ var PlaygroundProvider = class {
|
|
|
2663
2818
|
}
|
|
2664
2819
|
chat(request) {
|
|
2665
2820
|
const lastUserMessage = [...request.messages].reverse().find((m) => m.role === "user")?.content ?? "";
|
|
2666
|
-
const script = PLAYGROUND_SCRIPTS.find(
|
|
2667
|
-
(scenario) => scenario.match(lastUserMessage)
|
|
2668
|
-
);
|
|
2821
|
+
const script = PLAYGROUND_SCRIPTS.find((scenario) => scenario.match(lastUserMessage));
|
|
2669
2822
|
const responseText = script?.response ?? FALLBACK_RESPONSE;
|
|
2670
2823
|
const chunks = this.splitIntoChunks(responseText);
|
|
2671
2824
|
return new Observable8((observer) => {
|
|
@@ -2774,9 +2927,11 @@ var XAIProvider = class {
|
|
|
2774
2927
|
}
|
|
2775
2928
|
listModels() {
|
|
2776
2929
|
const url = `${this.baseUrl}/models`;
|
|
2777
|
-
return from6(
|
|
2778
|
-
|
|
2779
|
-
|
|
2930
|
+
return from6(
|
|
2931
|
+
fetch(url, {
|
|
2932
|
+
headers: this.getHeaders()
|
|
2933
|
+
})
|
|
2934
|
+
).pipe(
|
|
2780
2935
|
switchMap5((response) => {
|
|
2781
2936
|
if (!response.ok) {
|
|
2782
2937
|
return throwError5(() => new Error(`Failed to list models: ${response.status}`));
|
|
@@ -2892,7 +3047,10 @@ var XAIProvider = class {
|
|
|
2892
3047
|
});
|
|
2893
3048
|
}
|
|
2894
3049
|
} catch (err) {
|
|
2895
|
-
debugLogger.error("Error parsing xAI stream data:", {
|
|
3050
|
+
debugLogger.error("Error parsing xAI stream data:", {
|
|
3051
|
+
data,
|
|
3052
|
+
error: err
|
|
3053
|
+
});
|
|
2896
3054
|
}
|
|
2897
3055
|
}
|
|
2898
3056
|
}
|
|
@@ -2904,14 +3062,16 @@ var XAIProvider = class {
|
|
|
2904
3062
|
});
|
|
2905
3063
|
}
|
|
2906
3064
|
nonStreamChatRequest(url, payload) {
|
|
2907
|
-
return from6(
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
3065
|
+
return from6(
|
|
3066
|
+
fetch(url, {
|
|
3067
|
+
method: "POST",
|
|
3068
|
+
headers: {
|
|
3069
|
+
...this.getHeaders(),
|
|
3070
|
+
"Content-Type": "application/json"
|
|
3071
|
+
},
|
|
3072
|
+
body: JSON.stringify(payload)
|
|
3073
|
+
})
|
|
3074
|
+
).pipe(
|
|
2915
3075
|
switchMap5((response) => {
|
|
2916
3076
|
if (!response.ok) {
|
|
2917
3077
|
return throwError5(() => new Error(`xAI request failed: ${response.status}`));
|
|
@@ -3026,8 +3186,13 @@ var BanditAIProvider = class {
|
|
|
3026
3186
|
return from7(fetch(url, { headers: this.getHeaders() })).pipe(
|
|
3027
3187
|
switchMap6((response) => {
|
|
3028
3188
|
if (!response.ok) {
|
|
3029
|
-
debugLogger.error("BanditAI listModels failed", {
|
|
3030
|
-
|
|
3189
|
+
debugLogger.error("BanditAI listModels failed", {
|
|
3190
|
+
status: response.status,
|
|
3191
|
+
url
|
|
3192
|
+
});
|
|
3193
|
+
return throwError6(
|
|
3194
|
+
() => new Error(`Failed to list Bandit models: ${response.status}`)
|
|
3195
|
+
);
|
|
3031
3196
|
}
|
|
3032
3197
|
return from7(response.json());
|
|
3033
3198
|
}),
|
|
@@ -3098,7 +3263,10 @@ var BanditAIProvider = class {
|
|
|
3098
3263
|
const read = () => {
|
|
3099
3264
|
reader?.read().then(({ done, value }) => {
|
|
3100
3265
|
if (done) {
|
|
3101
|
-
observer.next({
|
|
3266
|
+
observer.next({
|
|
3267
|
+
message: { content: "", role: "assistant" },
|
|
3268
|
+
done: true
|
|
3269
|
+
});
|
|
3102
3270
|
observer.complete();
|
|
3103
3271
|
return;
|
|
3104
3272
|
}
|
|
@@ -3112,18 +3280,29 @@ var BanditAIProvider = class {
|
|
|
3112
3280
|
}
|
|
3113
3281
|
const data = line.slice(6).trim();
|
|
3114
3282
|
if (data === "[DONE]") {
|
|
3115
|
-
observer.next({
|
|
3283
|
+
observer.next({
|
|
3284
|
+
message: { content: "", role: "assistant" },
|
|
3285
|
+
done: true
|
|
3286
|
+
});
|
|
3116
3287
|
observer.complete();
|
|
3117
3288
|
return;
|
|
3118
3289
|
}
|
|
3119
3290
|
try {
|
|
3120
3291
|
const parsed = JSON.parse(data);
|
|
3121
3292
|
const content = parsed.choices?.[0]?.delta?.content ?? "";
|
|
3122
|
-
|
|
3123
|
-
|
|
3293
|
+
const contextSources = readContextSourcesField(parsed);
|
|
3294
|
+
if (content || contextSources) {
|
|
3295
|
+
observer.next({
|
|
3296
|
+
message: { content, role: "assistant" },
|
|
3297
|
+
...contextSources ? { contextSources } : {},
|
|
3298
|
+
done: false
|
|
3299
|
+
});
|
|
3124
3300
|
}
|
|
3125
3301
|
} catch (error) {
|
|
3126
|
-
debugLogger.error("BanditAI stream chunk parse failure", {
|
|
3302
|
+
debugLogger.error("BanditAI stream chunk parse failure", {
|
|
3303
|
+
data,
|
|
3304
|
+
error
|
|
3305
|
+
});
|
|
3127
3306
|
}
|
|
3128
3307
|
}
|
|
3129
3308
|
read();
|
|
@@ -3134,17 +3313,21 @@ var BanditAIProvider = class {
|
|
|
3134
3313
|
});
|
|
3135
3314
|
}
|
|
3136
3315
|
nonStreamChatRequest(url, payload) {
|
|
3137
|
-
return from7(
|
|
3138
|
-
|
|
3139
|
-
|
|
3140
|
-
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3316
|
+
return from7(
|
|
3317
|
+
fetch(url, {
|
|
3318
|
+
method: "POST",
|
|
3319
|
+
headers: {
|
|
3320
|
+
...this.getHeaders(),
|
|
3321
|
+
"Content-Type": "application/json"
|
|
3322
|
+
},
|
|
3323
|
+
body: JSON.stringify(payload)
|
|
3324
|
+
})
|
|
3325
|
+
).pipe(
|
|
3145
3326
|
switchMap6((response) => {
|
|
3146
3327
|
if (!response.ok) {
|
|
3147
|
-
return throwError6(
|
|
3328
|
+
return throwError6(
|
|
3329
|
+
() => new Error(`BanditAI request failed: ${response.status}`)
|
|
3330
|
+
);
|
|
3148
3331
|
}
|
|
3149
3332
|
return from7(response.json());
|
|
3150
3333
|
}),
|
|
@@ -3258,8 +3441,9 @@ export {
|
|
|
3258
3441
|
TOKEN_KEY2 as TOKEN_KEY,
|
|
3259
3442
|
AUTH_TOKEN_CHANGED_EVENT,
|
|
3260
3443
|
authenticationService,
|
|
3444
|
+
readContextSourcesField,
|
|
3261
3445
|
GatewayService,
|
|
3262
3446
|
AIProviderFactory,
|
|
3263
3447
|
useAIProviderStore
|
|
3264
3448
|
};
|
|
3265
|
-
//# sourceMappingURL=chunk-
|
|
3449
|
+
//# sourceMappingURL=chunk-5KC42IIR.mjs.map
|