@burtson-labs/bandit-engine 2.0.167 → 2.1.0
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 +31 -0
- package/LICENSE +189 -31
- package/NOTICE +26 -0
- package/README.md +15 -59
- package/dist/aiProviderStore-DKQCCDWF.mjs +8 -0
- package/dist/aiProviderStore-DKQCCDWF.mjs.map +1 -0
- package/dist/chat-VYZFUECC.mjs +10 -0
- package/dist/chat-VYZFUECC.mjs.map +1 -0
- package/dist/{chunk-GRPTCHFN.mjs → chunk-BJT6KPUG.mjs} +309 -154
- package/dist/chunk-BJT6KPUG.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-HD4PJNPH.mjs +29034 -0
- package/dist/chunk-HD4PJNPH.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 +115 -57
- package/dist/index.d.ts +115 -57
- package/dist/index.js +15660 -7577
- 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-CKQQDOoy.d.mts} +8 -8
- package/dist/{public-DJa4Db00.d.ts → public-CKQQDOoy.d.ts} +8 -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-6N5B7A7F.mjs +0 -15
- package/dist/chat-6N5B7A7F.mjs.map +0 -1
- package/dist/chat-provider.js +0 -10964
- 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-46OGYEME.mjs +0 -5895
- package/dist/chunk-46OGYEME.mjs.map +0 -1
- package/dist/chunk-5BZWJQ5O.mjs +0 -516
- package/dist/chunk-5BZWJQ5O.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-KDIL5WUL.mjs +0 -7323
- package/dist/chunk-KDIL5WUL.mjs.map +0 -1
- package/dist/chunk-N4BQ6HKL.mjs +0 -2945
- package/dist/chunk-N4BQ6HKL.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-PK3LFBGC.mjs +0 -10575
- package/dist/chunk-PK3LFBGC.mjs.map +0 -1
- package/dist/chunk-SHYNXDRO.mjs +0 -11906
- package/dist/chunk-SHYNXDRO.mjs.map +0 -1
- package/dist/chunk-SZJB5FLZ.mjs.map +0 -1
- package/dist/chunk-US4TG745.mjs +0 -194
- package/dist/chunk-US4TG745.mjs.map +0 -1
- package/dist/management/management.js +0 -44217
- 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 -19613
- 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
|
}),
|
|
@@ -1055,7 +1111,16 @@ import { map as map12 } from "rxjs";
|
|
|
1055
1111
|
|
|
1056
1112
|
// src/services/gateway/gateway.service.ts
|
|
1057
1113
|
import axios, { AxiosHeaders } from "axios";
|
|
1058
|
-
import {
|
|
1114
|
+
import {
|
|
1115
|
+
catchError as catchError2,
|
|
1116
|
+
from as from5,
|
|
1117
|
+
lastValueFrom as lastValueFrom2,
|
|
1118
|
+
map as map6,
|
|
1119
|
+
Observable as Observable6,
|
|
1120
|
+
of as of2,
|
|
1121
|
+
shareReplay as shareReplay2,
|
|
1122
|
+
timeout as timeout2
|
|
1123
|
+
} from "rxjs";
|
|
1059
1124
|
|
|
1060
1125
|
// src/store/authenticationStore.ts
|
|
1061
1126
|
import { create } from "zustand";
|
|
@@ -1122,9 +1187,11 @@ function emitAuthTokenChanged(token) {
|
|
|
1122
1187
|
if (typeof window === "undefined") {
|
|
1123
1188
|
return;
|
|
1124
1189
|
}
|
|
1125
|
-
window.dispatchEvent(
|
|
1126
|
-
|
|
1127
|
-
|
|
1190
|
+
window.dispatchEvent(
|
|
1191
|
+
new CustomEvent(AUTH_TOKEN_CHANGED_EVENT, {
|
|
1192
|
+
detail: { token }
|
|
1193
|
+
})
|
|
1194
|
+
);
|
|
1128
1195
|
}
|
|
1129
1196
|
var readLocalStorage = () => {
|
|
1130
1197
|
try {
|
|
@@ -1238,8 +1305,10 @@ var AuthenticationService = class {
|
|
|
1238
1305
|
}
|
|
1239
1306
|
}
|
|
1240
1307
|
parseJwtClaims(token) {
|
|
1308
|
+
const parts = token ? token.split(".") : [];
|
|
1309
|
+
if (parts.length !== 3) return null;
|
|
1241
1310
|
try {
|
|
1242
|
-
const base64Url =
|
|
1311
|
+
const base64Url = parts[1];
|
|
1243
1312
|
const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
|
|
1244
1313
|
const jsonPayload = decodeURIComponent(
|
|
1245
1314
|
atob(base64).split("").map((c) => {
|
|
@@ -1323,7 +1392,8 @@ var GatewayService = class {
|
|
|
1323
1392
|
*/
|
|
1324
1393
|
async _retryAfterRefresh(instance, error) {
|
|
1325
1394
|
const config = error.config;
|
|
1326
|
-
if (!config || config._banditAuthRetried || error.response?.status !== 401)
|
|
1395
|
+
if (!config || config._banditAuthRetried || error.response?.status !== 401)
|
|
1396
|
+
return null;
|
|
1327
1397
|
if (!authenticationService.canRefresh()) return null;
|
|
1328
1398
|
const data = error.response?.data;
|
|
1329
1399
|
if (data?.code && data.code !== "TOKEN_EXPIRED") return null;
|
|
@@ -1418,7 +1488,9 @@ var GatewayService = class {
|
|
|
1418
1488
|
return availability;
|
|
1419
1489
|
} catch (e) {
|
|
1420
1490
|
if (fallbackUrl) {
|
|
1421
|
-
debugLogger.warn(
|
|
1491
|
+
debugLogger.warn(
|
|
1492
|
+
`Gateway service not available at ${this._baseUrl}, trying fallback URL: ${fallbackUrl}`
|
|
1493
|
+
);
|
|
1422
1494
|
try {
|
|
1423
1495
|
availability.url = fallbackUrl.replace(/\/$/, "");
|
|
1424
1496
|
availability.isAvailable = await lastValueFrom2(
|
|
@@ -1434,7 +1506,9 @@ var GatewayService = class {
|
|
|
1434
1506
|
this._setBaseUrl(availability.url);
|
|
1435
1507
|
return availability;
|
|
1436
1508
|
} catch (e2) {
|
|
1437
|
-
debugLogger.error(
|
|
1509
|
+
debugLogger.error(
|
|
1510
|
+
`Gateway service not available at fallback URL: ${fallbackUrl}`
|
|
1511
|
+
);
|
|
1438
1512
|
throw e2;
|
|
1439
1513
|
}
|
|
1440
1514
|
} else {
|
|
@@ -1460,7 +1534,11 @@ var GatewayService = class {
|
|
|
1460
1534
|
const trimmed = (request.model ?? "").replace(/^bandit:/, "").trim();
|
|
1461
1535
|
return trimmed !== "" ? trimmed : "bandit-core-1";
|
|
1462
1536
|
})() : request.model;
|
|
1463
|
-
const requestBody = {
|
|
1537
|
+
const requestBody = {
|
|
1538
|
+
...request,
|
|
1539
|
+
model: normalizedModel,
|
|
1540
|
+
stream: request.stream !== false
|
|
1541
|
+
};
|
|
1464
1542
|
return new Observable6((observer) => {
|
|
1465
1543
|
const controller = new AbortController();
|
|
1466
1544
|
const handleStreamingResponse = async (response) => {
|
|
@@ -1477,7 +1555,10 @@ var GatewayService = class {
|
|
|
1477
1555
|
const finalResponse = JSON.parse(tail.text);
|
|
1478
1556
|
observer.next(finalResponse);
|
|
1479
1557
|
} catch (err) {
|
|
1480
|
-
debugLogger.error("GatewayService chat final chunk parsing error", {
|
|
1558
|
+
debugLogger.error("GatewayService chat final chunk parsing error", {
|
|
1559
|
+
buffer,
|
|
1560
|
+
error: err
|
|
1561
|
+
});
|
|
1481
1562
|
observer.error(err);
|
|
1482
1563
|
}
|
|
1483
1564
|
}
|
|
@@ -1502,17 +1583,21 @@ var GatewayService = class {
|
|
|
1502
1583
|
const transformed = {
|
|
1503
1584
|
id: `chatcmpl-${Date.now()}`,
|
|
1504
1585
|
object: "chat.completion.chunk",
|
|
1505
|
-
created: Math.floor(
|
|
1586
|
+
created: Math.floor(
|
|
1587
|
+
new Date(parsed.created_at || Date.now()).getTime() / 1e3
|
|
1588
|
+
),
|
|
1506
1589
|
model: parsed.model,
|
|
1507
|
-
choices: [
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1590
|
+
choices: [
|
|
1591
|
+
{
|
|
1592
|
+
index: 0,
|
|
1593
|
+
delta: {
|
|
1594
|
+
role: parsed.message.role,
|
|
1595
|
+
content: parsed.message.content,
|
|
1596
|
+
tool_calls: parsed.message.tool_calls
|
|
1597
|
+
},
|
|
1598
|
+
finish_reason: parsed.done ? parsed.done_reason || "stop" : null
|
|
1599
|
+
}
|
|
1600
|
+
]
|
|
1516
1601
|
};
|
|
1517
1602
|
if (parsed.done && parsed.total_duration) {
|
|
1518
1603
|
transformed.usage = {
|
|
@@ -1542,25 +1627,33 @@ var GatewayService = class {
|
|
|
1542
1627
|
};
|
|
1543
1628
|
const sendRequest = (targetEndpoint, allowFallback) => {
|
|
1544
1629
|
const url = `${this._baseUrl}${targetEndpoint}`;
|
|
1545
|
-
debugLogger.debug(
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1630
|
+
debugLogger.debug(
|
|
1631
|
+
`Gateway chat request to ${url} with provider: ${request.provider || "default"}`,
|
|
1632
|
+
{
|
|
1633
|
+
model: normalizedModel,
|
|
1634
|
+
messageCount: request.messages.length,
|
|
1635
|
+
hasImages: !!(request.images && request.images.length > 0),
|
|
1636
|
+
imageCount: request.images?.length || 0
|
|
1637
|
+
}
|
|
1638
|
+
);
|
|
1551
1639
|
fetch(url, {
|
|
1552
1640
|
method: "POST",
|
|
1553
1641
|
headers: this._getHeaders(),
|
|
1554
1642
|
body: JSON.stringify(requestBody),
|
|
1555
1643
|
signal: controller.signal
|
|
1556
1644
|
}).then(async (response) => {
|
|
1557
|
-
debugLogger.debug(
|
|
1645
|
+
debugLogger.debug(
|
|
1646
|
+
`Gateway chat response status: ${response.status} for provider: ${request.provider || "default"}`
|
|
1647
|
+
);
|
|
1558
1648
|
if (response.status === 404 && allowFallback && fallbackEndpoint) {
|
|
1559
|
-
debugLogger.warn(
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1649
|
+
debugLogger.warn(
|
|
1650
|
+
"GatewayService chat endpoint returned 404, attempting fallback route",
|
|
1651
|
+
{
|
|
1652
|
+
provider: request.provider,
|
|
1653
|
+
attemptedEndpoint: targetEndpoint,
|
|
1654
|
+
fallbackEndpoint
|
|
1655
|
+
}
|
|
1656
|
+
);
|
|
1564
1657
|
sendRequest(fallbackEndpoint, false);
|
|
1565
1658
|
return;
|
|
1566
1659
|
}
|
|
@@ -1576,7 +1669,10 @@ var GatewayService = class {
|
|
|
1576
1669
|
body: errorText
|
|
1577
1670
|
});
|
|
1578
1671
|
} catch (readError) {
|
|
1579
|
-
debugLogger.error(
|
|
1672
|
+
debugLogger.error(
|
|
1673
|
+
"GatewayService chat failed to read error response body",
|
|
1674
|
+
{ error: readError }
|
|
1675
|
+
);
|
|
1580
1676
|
errorText = `Request failed with status ${response.status}`;
|
|
1581
1677
|
}
|
|
1582
1678
|
try {
|
|
@@ -1626,14 +1722,21 @@ var GatewayService = class {
|
|
|
1626
1722
|
const trimmed = (request.model ?? "").replace(/^bandit:/, "").trim();
|
|
1627
1723
|
return trimmed !== "" ? trimmed : "bandit-core-1";
|
|
1628
1724
|
})() : request.model;
|
|
1629
|
-
debugLogger.debug(
|
|
1630
|
-
|
|
1631
|
-
|
|
1725
|
+
debugLogger.debug(
|
|
1726
|
+
`Gateway generate request to ${url} with provider: ${request.provider || "default"}`,
|
|
1727
|
+
{
|
|
1728
|
+
model: normalizedModel
|
|
1729
|
+
}
|
|
1730
|
+
);
|
|
1632
1731
|
return new Observable6((observer) => {
|
|
1633
1732
|
const task = fetch(url, {
|
|
1634
1733
|
method: "POST",
|
|
1635
1734
|
headers: this._getHeaders(),
|
|
1636
|
-
body: JSON.stringify({
|
|
1735
|
+
body: JSON.stringify({
|
|
1736
|
+
...request,
|
|
1737
|
+
model: normalizedModel,
|
|
1738
|
+
stream: request.stream !== false
|
|
1739
|
+
})
|
|
1637
1740
|
});
|
|
1638
1741
|
task.then(async (response) => {
|
|
1639
1742
|
if (!response.ok) {
|
|
@@ -1673,7 +1776,9 @@ var GatewayService = class {
|
|
|
1673
1776
|
observer.next(JSON.parse(tail.text));
|
|
1674
1777
|
} catch (err) {
|
|
1675
1778
|
observer.error(err);
|
|
1676
|
-
debugLogger.error("Final chunk parsing error (gateway generate):", {
|
|
1779
|
+
debugLogger.error("Final chunk parsing error (gateway generate):", {
|
|
1780
|
+
buffer
|
|
1781
|
+
});
|
|
1677
1782
|
}
|
|
1678
1783
|
}
|
|
1679
1784
|
observer.complete();
|
|
@@ -1693,7 +1798,9 @@ var GatewayService = class {
|
|
|
1693
1798
|
observer.next(JSON.parse(classified.text));
|
|
1694
1799
|
} catch (err) {
|
|
1695
1800
|
observer.error(err);
|
|
1696
|
-
debugLogger.error("Error parsing JSON line (gateway generate):", {
|
|
1801
|
+
debugLogger.error("Error parsing JSON line (gateway generate):", {
|
|
1802
|
+
line
|
|
1803
|
+
});
|
|
1697
1804
|
}
|
|
1698
1805
|
}
|
|
1699
1806
|
}
|
|
@@ -1817,7 +1924,9 @@ var GatewayService = class {
|
|
|
1817
1924
|
* Generate a mailto URL as fallback for feedback submission
|
|
1818
1925
|
*/
|
|
1819
1926
|
_generateMailtoUrl(feedback) {
|
|
1820
|
-
const subject = encodeURIComponent(
|
|
1927
|
+
const subject = encodeURIComponent(
|
|
1928
|
+
`[${feedback.category.toUpperCase()}] ${feedback.title}`
|
|
1929
|
+
);
|
|
1821
1930
|
let body = `Category: ${feedback.category}
|
|
1822
1931
|
`;
|
|
1823
1932
|
body += `Priority: ${feedback.priority}
|
|
@@ -2341,7 +2450,9 @@ var GatewayProvider = class {
|
|
|
2341
2450
|
throw new Error("Gateway provider requires gatewayUrl in config");
|
|
2342
2451
|
}
|
|
2343
2452
|
if (!config.provider) {
|
|
2344
|
-
throw new Error(
|
|
2453
|
+
throw new Error(
|
|
2454
|
+
"Gateway provider requires provider field to specify backend (openai, azure-openai, anthropic, ollama)"
|
|
2455
|
+
);
|
|
2345
2456
|
}
|
|
2346
2457
|
const tokenFactory = config.tokenFactory || (() => null);
|
|
2347
2458
|
this.gatewayService = new GatewayService(config.gatewayUrl, tokenFactory);
|
|
@@ -2358,7 +2469,9 @@ var GatewayProvider = class {
|
|
|
2358
2469
|
break;
|
|
2359
2470
|
case "azure-openai":
|
|
2360
2471
|
if (!this.config.deploymentName || !this.config.apiVersion) {
|
|
2361
|
-
throw new Error(
|
|
2472
|
+
throw new Error(
|
|
2473
|
+
"Azure OpenAI gateway provider requires deploymentName and apiVersion"
|
|
2474
|
+
);
|
|
2362
2475
|
}
|
|
2363
2476
|
this.providerSpecificService = new AzureOpenAIGatewayService(
|
|
2364
2477
|
gatewayUrl,
|
|
@@ -2370,10 +2483,16 @@ var GatewayProvider = class {
|
|
|
2370
2483
|
);
|
|
2371
2484
|
break;
|
|
2372
2485
|
case "anthropic":
|
|
2373
|
-
this.providerSpecificService = new AnthropicGatewayService(
|
|
2486
|
+
this.providerSpecificService = new AnthropicGatewayService(
|
|
2487
|
+
gatewayUrl,
|
|
2488
|
+
tokenFactory
|
|
2489
|
+
);
|
|
2374
2490
|
break;
|
|
2375
2491
|
case "bandit":
|
|
2376
|
-
this.providerSpecificService = new BanditAIGatewayService(
|
|
2492
|
+
this.providerSpecificService = new BanditAIGatewayService(
|
|
2493
|
+
gatewayUrl,
|
|
2494
|
+
tokenFactory
|
|
2495
|
+
);
|
|
2377
2496
|
break;
|
|
2378
2497
|
case "ollama":
|
|
2379
2498
|
this.providerSpecificService = new OllamaGatewayService(gatewayUrl, tokenFactory);
|
|
@@ -2411,7 +2530,9 @@ var GatewayProvider = class {
|
|
|
2411
2530
|
images: request.images
|
|
2412
2531
|
};
|
|
2413
2532
|
}
|
|
2414
|
-
} else if (["openai", "azure-openai", "anthropic", "bandit", "playground"].includes(
|
|
2533
|
+
} else if (["openai", "azure-openai", "anthropic", "bandit", "playground"].includes(
|
|
2534
|
+
this.config.provider || ""
|
|
2535
|
+
)) {
|
|
2415
2536
|
if (lastUserMessageIndex !== -1) {
|
|
2416
2537
|
const currentMessage = messages[lastUserMessageIndex];
|
|
2417
2538
|
const contentArray = [
|
|
@@ -2460,7 +2581,9 @@ var GatewayProvider = class {
|
|
|
2460
2581
|
stream: request.stream,
|
|
2461
2582
|
hasImages: !!(request.images && request.images.length > 0),
|
|
2462
2583
|
imageCount: request.images?.length || 0,
|
|
2463
|
-
imageStrategy: this.config.provider === "ollama" ? "message-level-array" : ["openai", "azure-openai", "anthropic", "playground"].includes(
|
|
2584
|
+
imageStrategy: this.config.provider === "ollama" ? "message-level-array" : ["openai", "azure-openai", "anthropic", "playground"].includes(
|
|
2585
|
+
this.config.provider || ""
|
|
2586
|
+
) ? "structured-content" : "top-level-fallback",
|
|
2464
2587
|
finalMessages: messages.map((m) => ({
|
|
2465
2588
|
role: m.role,
|
|
2466
2589
|
hasImages: Array.isArray(m.images) && m.images.length > 0,
|
|
@@ -2503,26 +2626,32 @@ var GatewayProvider = class {
|
|
|
2503
2626
|
);
|
|
2504
2627
|
}
|
|
2505
2628
|
listModels() {
|
|
2506
|
-
debugLogger.debug("Gateway provider listing models", {
|
|
2629
|
+
debugLogger.debug("Gateway provider listing models", {
|
|
2630
|
+
provider: this.config.provider
|
|
2631
|
+
});
|
|
2507
2632
|
if (this.config.provider) {
|
|
2508
2633
|
return this.gatewayService.listModelsByProvider(this.config.provider).pipe(
|
|
2509
|
-
map12(
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2634
|
+
map12(
|
|
2635
|
+
(models) => models.map((model) => ({
|
|
2636
|
+
name: model.id || model.name,
|
|
2637
|
+
size: model.size,
|
|
2638
|
+
details: model.details,
|
|
2639
|
+
digest: model.digest,
|
|
2640
|
+
modified_at: model.modified_at
|
|
2641
|
+
}))
|
|
2642
|
+
)
|
|
2516
2643
|
);
|
|
2517
2644
|
} else {
|
|
2518
2645
|
return this.gatewayService.listModels().pipe(
|
|
2519
|
-
map12(
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2646
|
+
map12(
|
|
2647
|
+
(models) => models.map((model) => ({
|
|
2648
|
+
name: model.id || model.name,
|
|
2649
|
+
size: model.size,
|
|
2650
|
+
details: model.details,
|
|
2651
|
+
digest: model.digest,
|
|
2652
|
+
modified_at: model.modified_at
|
|
2653
|
+
}))
|
|
2654
|
+
)
|
|
2526
2655
|
);
|
|
2527
2656
|
}
|
|
2528
2657
|
}
|
|
@@ -2663,9 +2792,7 @@ var PlaygroundProvider = class {
|
|
|
2663
2792
|
}
|
|
2664
2793
|
chat(request) {
|
|
2665
2794
|
const lastUserMessage = [...request.messages].reverse().find((m) => m.role === "user")?.content ?? "";
|
|
2666
|
-
const script = PLAYGROUND_SCRIPTS.find(
|
|
2667
|
-
(scenario) => scenario.match(lastUserMessage)
|
|
2668
|
-
);
|
|
2795
|
+
const script = PLAYGROUND_SCRIPTS.find((scenario) => scenario.match(lastUserMessage));
|
|
2669
2796
|
const responseText = script?.response ?? FALLBACK_RESPONSE;
|
|
2670
2797
|
const chunks = this.splitIntoChunks(responseText);
|
|
2671
2798
|
return new Observable8((observer) => {
|
|
@@ -2774,9 +2901,11 @@ var XAIProvider = class {
|
|
|
2774
2901
|
}
|
|
2775
2902
|
listModels() {
|
|
2776
2903
|
const url = `${this.baseUrl}/models`;
|
|
2777
|
-
return from6(
|
|
2778
|
-
|
|
2779
|
-
|
|
2904
|
+
return from6(
|
|
2905
|
+
fetch(url, {
|
|
2906
|
+
headers: this.getHeaders()
|
|
2907
|
+
})
|
|
2908
|
+
).pipe(
|
|
2780
2909
|
switchMap5((response) => {
|
|
2781
2910
|
if (!response.ok) {
|
|
2782
2911
|
return throwError5(() => new Error(`Failed to list models: ${response.status}`));
|
|
@@ -2892,7 +3021,10 @@ var XAIProvider = class {
|
|
|
2892
3021
|
});
|
|
2893
3022
|
}
|
|
2894
3023
|
} catch (err) {
|
|
2895
|
-
debugLogger.error("Error parsing xAI stream data:", {
|
|
3024
|
+
debugLogger.error("Error parsing xAI stream data:", {
|
|
3025
|
+
data,
|
|
3026
|
+
error: err
|
|
3027
|
+
});
|
|
2896
3028
|
}
|
|
2897
3029
|
}
|
|
2898
3030
|
}
|
|
@@ -2904,14 +3036,16 @@ var XAIProvider = class {
|
|
|
2904
3036
|
});
|
|
2905
3037
|
}
|
|
2906
3038
|
nonStreamChatRequest(url, payload) {
|
|
2907
|
-
return from6(
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
3039
|
+
return from6(
|
|
3040
|
+
fetch(url, {
|
|
3041
|
+
method: "POST",
|
|
3042
|
+
headers: {
|
|
3043
|
+
...this.getHeaders(),
|
|
3044
|
+
"Content-Type": "application/json"
|
|
3045
|
+
},
|
|
3046
|
+
body: JSON.stringify(payload)
|
|
3047
|
+
})
|
|
3048
|
+
).pipe(
|
|
2915
3049
|
switchMap5((response) => {
|
|
2916
3050
|
if (!response.ok) {
|
|
2917
3051
|
return throwError5(() => new Error(`xAI request failed: ${response.status}`));
|
|
@@ -3026,8 +3160,13 @@ var BanditAIProvider = class {
|
|
|
3026
3160
|
return from7(fetch(url, { headers: this.getHeaders() })).pipe(
|
|
3027
3161
|
switchMap6((response) => {
|
|
3028
3162
|
if (!response.ok) {
|
|
3029
|
-
debugLogger.error("BanditAI listModels failed", {
|
|
3030
|
-
|
|
3163
|
+
debugLogger.error("BanditAI listModels failed", {
|
|
3164
|
+
status: response.status,
|
|
3165
|
+
url
|
|
3166
|
+
});
|
|
3167
|
+
return throwError6(
|
|
3168
|
+
() => new Error(`Failed to list Bandit models: ${response.status}`)
|
|
3169
|
+
);
|
|
3031
3170
|
}
|
|
3032
3171
|
return from7(response.json());
|
|
3033
3172
|
}),
|
|
@@ -3098,7 +3237,10 @@ var BanditAIProvider = class {
|
|
|
3098
3237
|
const read = () => {
|
|
3099
3238
|
reader?.read().then(({ done, value }) => {
|
|
3100
3239
|
if (done) {
|
|
3101
|
-
observer.next({
|
|
3240
|
+
observer.next({
|
|
3241
|
+
message: { content: "", role: "assistant" },
|
|
3242
|
+
done: true
|
|
3243
|
+
});
|
|
3102
3244
|
observer.complete();
|
|
3103
3245
|
return;
|
|
3104
3246
|
}
|
|
@@ -3112,7 +3254,10 @@ var BanditAIProvider = class {
|
|
|
3112
3254
|
}
|
|
3113
3255
|
const data = line.slice(6).trim();
|
|
3114
3256
|
if (data === "[DONE]") {
|
|
3115
|
-
observer.next({
|
|
3257
|
+
observer.next({
|
|
3258
|
+
message: { content: "", role: "assistant" },
|
|
3259
|
+
done: true
|
|
3260
|
+
});
|
|
3116
3261
|
observer.complete();
|
|
3117
3262
|
return;
|
|
3118
3263
|
}
|
|
@@ -3120,10 +3265,16 @@ var BanditAIProvider = class {
|
|
|
3120
3265
|
const parsed = JSON.parse(data);
|
|
3121
3266
|
const content = parsed.choices?.[0]?.delta?.content ?? "";
|
|
3122
3267
|
if (content) {
|
|
3123
|
-
observer.next({
|
|
3268
|
+
observer.next({
|
|
3269
|
+
message: { content, role: "assistant" },
|
|
3270
|
+
done: false
|
|
3271
|
+
});
|
|
3124
3272
|
}
|
|
3125
3273
|
} catch (error) {
|
|
3126
|
-
debugLogger.error("BanditAI stream chunk parse failure", {
|
|
3274
|
+
debugLogger.error("BanditAI stream chunk parse failure", {
|
|
3275
|
+
data,
|
|
3276
|
+
error
|
|
3277
|
+
});
|
|
3127
3278
|
}
|
|
3128
3279
|
}
|
|
3129
3280
|
read();
|
|
@@ -3134,17 +3285,21 @@ var BanditAIProvider = class {
|
|
|
3134
3285
|
});
|
|
3135
3286
|
}
|
|
3136
3287
|
nonStreamChatRequest(url, payload) {
|
|
3137
|
-
return from7(
|
|
3138
|
-
|
|
3139
|
-
|
|
3140
|
-
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3288
|
+
return from7(
|
|
3289
|
+
fetch(url, {
|
|
3290
|
+
method: "POST",
|
|
3291
|
+
headers: {
|
|
3292
|
+
...this.getHeaders(),
|
|
3293
|
+
"Content-Type": "application/json"
|
|
3294
|
+
},
|
|
3295
|
+
body: JSON.stringify(payload)
|
|
3296
|
+
})
|
|
3297
|
+
).pipe(
|
|
3145
3298
|
switchMap6((response) => {
|
|
3146
3299
|
if (!response.ok) {
|
|
3147
|
-
return throwError6(
|
|
3300
|
+
return throwError6(
|
|
3301
|
+
() => new Error(`BanditAI request failed: ${response.status}`)
|
|
3302
|
+
);
|
|
3148
3303
|
}
|
|
3149
3304
|
return from7(response.json());
|
|
3150
3305
|
}),
|
|
@@ -3262,4 +3417,4 @@ export {
|
|
|
3262
3417
|
AIProviderFactory,
|
|
3263
3418
|
useAIProviderStore
|
|
3264
3419
|
};
|
|
3265
|
-
//# sourceMappingURL=chunk-
|
|
3420
|
+
//# sourceMappingURL=chunk-BJT6KPUG.mjs.map
|