libre-webui 0.17.0 → 0.18.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/backend/dist/db.d.ts.map +1 -1
- package/backend/dist/db.js +150 -6
- package/backend/dist/db.js.map +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +15 -10
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/middleware/auth.d.ts.map +1 -1
- package/backend/dist/middleware/auth.js +35 -3
- package/backend/dist/middleware/auth.js.map +1 -1
- package/backend/dist/models/userModel.d.ts +23 -0
- package/backend/dist/models/userModel.d.ts.map +1 -1
- package/backend/dist/models/userModel.js +89 -24
- package/backend/dist/models/userModel.js.map +1 -1
- package/backend/dist/routes/agentCli.d.ts.map +1 -1
- package/backend/dist/routes/agentCli.js +2 -0
- package/backend/dist/routes/agentCli.js.map +1 -1
- package/backend/dist/routes/auth.d.ts.map +1 -1
- package/backend/dist/routes/auth.js +46 -33
- package/backend/dist/routes/auth.js.map +1 -1
- package/backend/dist/routes/chat.d.ts.map +1 -1
- package/backend/dist/routes/chat.js +3 -1
- package/backend/dist/routes/chat.js.map +1 -1
- package/backend/dist/routes/documents.d.ts.map +1 -1
- package/backend/dist/routes/documents.js +49 -41
- package/backend/dist/routes/documents.js.map +1 -1
- package/backend/dist/routes/embeddings.js +2 -2
- package/backend/dist/routes/embeddings.js.map +1 -1
- package/backend/dist/routes/huggingfaceHub.d.ts.map +1 -1
- package/backend/dist/routes/huggingfaceHub.js +3 -1
- package/backend/dist/routes/huggingfaceHub.js.map +1 -1
- package/backend/dist/routes/imageGen.d.ts.map +1 -1
- package/backend/dist/routes/imageGen.js +2 -0
- package/backend/dist/routes/imageGen.js.map +1 -1
- package/backend/dist/routes/media.d.ts +3 -0
- package/backend/dist/routes/media.d.ts.map +1 -0
- package/backend/dist/routes/media.js +429 -0
- package/backend/dist/routes/media.js.map +1 -0
- package/backend/dist/routes/ollama.d.ts.map +1 -1
- package/backend/dist/routes/ollama.js +15 -83
- package/backend/dist/routes/ollama.js.map +1 -1
- package/backend/dist/routes/personas.d.ts.map +1 -1
- package/backend/dist/routes/personas.js +2 -0
- package/backend/dist/routes/personas.js.map +1 -1
- package/backend/dist/routes/plugins.d.ts.map +1 -1
- package/backend/dist/routes/plugins.js +28 -0
- package/backend/dist/routes/plugins.js.map +1 -1
- package/backend/dist/routes/systemDiagnostics.d.ts +3 -0
- package/backend/dist/routes/systemDiagnostics.d.ts.map +1 -0
- package/backend/dist/routes/systemDiagnostics.js +49 -0
- package/backend/dist/routes/systemDiagnostics.js.map +1 -0
- package/backend/dist/routes/tts.d.ts.map +1 -1
- package/backend/dist/routes/tts.js +4 -0
- package/backend/dist/routes/tts.js.map +1 -1
- package/backend/dist/routes/users.d.ts.map +1 -1
- package/backend/dist/routes/users.js +58 -0
- package/backend/dist/routes/users.js.map +1 -1
- package/backend/dist/routes/work.d.ts.map +1 -1
- package/backend/dist/routes/work.js +84 -0
- package/backend/dist/routes/work.js.map +1 -1
- package/backend/dist/services/authService.d.ts +15 -9
- package/backend/dist/services/authService.d.ts.map +1 -1
- package/backend/dist/services/authService.js +34 -29
- package/backend/dist/services/authService.js.map +1 -1
- package/backend/dist/services/chatRequestService.d.ts +8 -2
- package/backend/dist/services/chatRequestService.d.ts.map +1 -1
- package/backend/dist/services/chatRequestService.js +30 -3
- package/backend/dist/services/chatRequestService.js.map +1 -1
- package/backend/dist/services/documentService.d.ts +11 -10
- package/backend/dist/services/documentService.d.ts.map +1 -1
- package/backend/dist/services/documentService.js +62 -54
- package/backend/dist/services/documentService.js.map +1 -1
- package/backend/dist/services/encryptionService.d.ts.map +1 -1
- package/backend/dist/services/encryptionService.js +18 -8
- package/backend/dist/services/encryptionService.js.map +1 -1
- package/backend/dist/services/galleryService.d.ts +23 -1
- package/backend/dist/services/galleryService.d.ts.map +1 -1
- package/backend/dist/services/galleryService.js +125 -8
- package/backend/dist/services/galleryService.js.map +1 -1
- package/backend/dist/services/mediaGenerationJobService.d.ts +25 -0
- package/backend/dist/services/mediaGenerationJobService.d.ts.map +1 -0
- package/backend/dist/services/mediaGenerationJobService.js +82 -0
- package/backend/dist/services/mediaGenerationJobService.js.map +1 -0
- package/backend/dist/services/pluginAudioGenerationService.d.ts +34 -0
- package/backend/dist/services/pluginAudioGenerationService.d.ts.map +1 -0
- package/backend/dist/services/pluginAudioGenerationService.js +211 -0
- package/backend/dist/services/pluginAudioGenerationService.js.map +1 -0
- package/backend/dist/services/pluginCapabilityRegistryService.d.ts.map +1 -1
- package/backend/dist/services/pluginCapabilityRegistryService.js +6 -0
- package/backend/dist/services/pluginCapabilityRegistryService.js.map +1 -1
- package/backend/dist/services/pluginEmbeddingService.d.ts +2 -0
- package/backend/dist/services/pluginEmbeddingService.d.ts.map +1 -1
- package/backend/dist/services/pluginEmbeddingService.js +66 -35
- package/backend/dist/services/pluginEmbeddingService.js.map +1 -1
- package/backend/dist/services/pluginImageGenerationService.d.ts +2 -0
- package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
- package/backend/dist/services/pluginImageGenerationService.js +63 -38
- package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
- package/backend/dist/services/pluginService.d.ts +38 -1
- package/backend/dist/services/pluginService.d.ts.map +1 -1
- package/backend/dist/services/pluginService.js +390 -69
- package/backend/dist/services/pluginService.js.map +1 -1
- package/backend/dist/services/pluginTTSService.d.ts +2 -0
- package/backend/dist/services/pluginTTSService.d.ts.map +1 -1
- package/backend/dist/services/pluginTTSService.js +27 -2
- package/backend/dist/services/pluginTTSService.js.map +1 -1
- package/backend/dist/services/pluginUsageService.d.ts +82 -0
- package/backend/dist/services/pluginUsageService.d.ts.map +1 -0
- package/backend/dist/services/pluginUsageService.js +238 -0
- package/backend/dist/services/pluginUsageService.js.map +1 -0
- package/backend/dist/services/pluginVideoGenerationService.d.ts +45 -0
- package/backend/dist/services/pluginVideoGenerationService.d.ts.map +1 -0
- package/backend/dist/services/pluginVideoGenerationService.js +198 -0
- package/backend/dist/services/pluginVideoGenerationService.js.map +1 -0
- package/backend/dist/services/preferencesService.d.ts.map +1 -1
- package/backend/dist/services/preferencesService.js +15 -1
- package/backend/dist/services/preferencesService.js.map +1 -1
- package/backend/dist/services/registrationPolicy.d.ts +5 -0
- package/backend/dist/services/registrationPolicy.d.ts.map +1 -0
- package/backend/dist/services/registrationPolicy.js +21 -0
- package/backend/dist/services/registrationPolicy.js.map +1 -0
- package/backend/dist/services/simpleGitHubOAuth.d.ts.map +1 -1
- package/backend/dist/services/simpleGitHubOAuth.js +8 -12
- package/backend/dist/services/simpleGitHubOAuth.js.map +1 -1
- package/backend/dist/services/simpleHuggingFaceOAuth.d.ts.map +1 -1
- package/backend/dist/services/simpleHuggingFaceOAuth.js +7 -12
- package/backend/dist/services/simpleHuggingFaceOAuth.js.map +1 -1
- package/backend/dist/services/systemDiagnosticsService.d.ts +117 -0
- package/backend/dist/services/systemDiagnosticsService.d.ts.map +1 -0
- package/backend/dist/services/systemDiagnosticsService.js +326 -0
- package/backend/dist/services/systemDiagnosticsService.js.map +1 -0
- package/backend/dist/services/turnstileService.d.ts +2 -1
- package/backend/dist/services/turnstileService.d.ts.map +1 -1
- package/backend/dist/services/turnstileService.js +28 -2
- package/backend/dist/services/turnstileService.js.map +1 -1
- package/backend/dist/services/workModelProviderService.d.ts +3 -0
- package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
- package/backend/dist/services/workModelProviderService.js +37 -4
- package/backend/dist/services/workModelProviderService.js.map +1 -1
- package/backend/dist/services/workPreviewProxyService.d.ts +27 -0
- package/backend/dist/services/workPreviewProxyService.d.ts.map +1 -0
- package/backend/dist/services/workPreviewProxyService.js +514 -0
- package/backend/dist/services/workPreviewProxyService.js.map +1 -0
- package/backend/dist/services/workRuntimeService.d.ts +22 -1
- package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeService.js +287 -8
- package/backend/dist/services/workRuntimeService.js.map +1 -1
- package/backend/dist/storage.d.ts.map +1 -1
- package/backend/dist/storage.js +3 -3
- package/backend/dist/storage.js.map +1 -1
- package/backend/dist/types/index.d.ts +77 -1
- package/backend/dist/types/index.d.ts.map +1 -1
- package/backend/dist/types/index.js.map +1 -1
- package/backend/dist/types/work.d.ts +31 -0
- package/backend/dist/types/work.d.ts.map +1 -1
- package/backend/dist/utils/chatDocumentContext.d.ts +1 -1
- package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
- package/backend/dist/utils/chatDocumentContext.js +4 -4
- package/backend/dist/utils/chatDocumentContext.js.map +1 -1
- package/backend/dist/utils/pluginDefinitionTrust.js +1 -1
- package/backend/dist/utils/pluginValidation.d.ts +3 -2
- package/backend/dist/utils/pluginValidation.d.ts.map +1 -1
- package/backend/dist/utils/pluginValidation.js +30 -2
- package/backend/dist/utils/pluginValidation.js.map +1 -1
- package/backend/dist/utils/workGit.d.ts +14 -0
- package/backend/dist/utils/workGit.d.ts.map +1 -0
- package/backend/dist/utils/workGit.js +207 -0
- package/backend/dist/utils/workGit.js.map +1 -0
- package/backend/dist/websocketServer.d.ts +1 -0
- package/backend/dist/websocketServer.d.ts.map +1 -1
- package/backend/dist/websocketServer.js +108 -24
- package/backend/dist/websocketServer.js.map +1 -1
- package/backend/dist/workTerminalServer.d.ts.map +1 -1
- package/backend/dist/workTerminalServer.js +3 -1
- package/backend/dist/workTerminalServer.js.map +1 -1
- package/backend/package.json +1 -1
- package/frontend/dist/assets/index-ChhWhug2.css +1 -0
- package/frontend/dist/assets/index-CmZntyR1.js +3 -0
- package/frontend/dist/index.html +26 -6
- package/frontend/dist/js/ArtifactContainer-CBAbdoIJ.js +1 -0
- package/frontend/dist/js/{ArtifactDemoPage-B4qsvUnF.js → ArtifactDemoPage-BWN0MWCx.js} +1 -1
- package/frontend/dist/js/ArtifactSlideOutPanel-D-AvYkfk.js +1 -0
- package/frontend/dist/js/ChatPage-w2FkF_fE.js +16 -0
- package/frontend/dist/js/FirstTimeSetup-CzBxl7UH.js +1 -0
- package/frontend/dist/js/GalleryPage-Cv8pniRW.js +1 -0
- package/frontend/dist/js/HomePage-Vyj4ndU4.js +1 -0
- package/frontend/dist/js/LibreClawPage-CYhLgQB-.js +1 -0
- package/frontend/dist/js/{ModelManagerModals-DMoEav1l.js → ModelManagerModals-C2rwHd01.js} +1 -1
- package/frontend/dist/js/ModelSelector-D7kDjZV9.js +1 -0
- package/frontend/dist/js/ModelsPage-BnUddkrs.js +2 -0
- package/frontend/dist/js/PersonasPage-BL5XlrEm.js +13 -0
- package/frontend/dist/js/PluginUsagePage-BXqweCCs.js +1 -0
- package/frontend/dist/js/{RichMessageContent-BJ49VN9j.js → RichMessageContent-nAEaPTpH.js} +2 -2
- package/frontend/dist/js/SettingsModal-DZYCI5-y.js +1 -0
- package/frontend/dist/js/SystemPage-jdHYfn9A.js +1 -0
- package/frontend/dist/js/UserManagementPage-BpOnt6os.js +1 -0
- package/frontend/dist/js/WorkPage-DAp1T1dl.js +5 -0
- package/frontend/dist/js/api-BCqWXjZI.js +19 -0
- package/frontend/dist/js/appStore-CDM6V5ny.js +2 -0
- package/frontend/dist/js/ar-DS8gs8WK.js +2 -0
- package/frontend/dist/js/{authStore-mOYH_AXI.js → authStore-Bl5ofD_h.js} +3 -3
- package/frontend/dist/js/bn-CrMPJwTR.js +2 -0
- package/frontend/dist/js/cs-BL116Ezu.js +2 -0
- package/frontend/dist/js/da-TDNaKzqy.js +2 -0
- package/frontend/dist/js/de-DkIqdAB5.js +2 -0
- package/frontend/dist/js/es-CHRXt6Fd.js +2 -0
- package/frontend/dist/js/{estree-0vwU39qX.js → estree-BFya-bSu.js} +1 -1
- package/frontend/dist/js/fr-8715yUKq.js +2 -0
- package/frontend/dist/js/hi-C2O08SBU.js +2 -0
- package/frontend/dist/js/{html-CApr2Bvi.js → html-DJot0Wwf.js} +1 -1
- package/frontend/dist/js/id-Dq7UXUEV.js +2 -0
- package/frontend/dist/js/is-B3dbbhSl.js +2 -0
- package/frontend/dist/js/it-CLSuu2K7.js +2 -0
- package/frontend/dist/js/ja-CthrqyCR.js +2 -0
- package/frontend/dist/js/ko-BJvFDJ82.js +2 -0
- package/frontend/dist/js/{markdown-C78Qc6xu.js → markdown-CXwWsPYG.js} +1 -1
- package/frontend/dist/js/ms-QV0202Mj.js +2 -0
- package/frontend/dist/js/nl-Dob1m1pV.js +2 -0
- package/frontend/dist/js/pl-urfOKnYI.js +2 -0
- package/frontend/dist/js/pt-D52Xkpi0.js +2 -0
- package/frontend/dist/js/ru-CwnW9Xe2.js +2 -0
- package/frontend/dist/js/{standalone-DmLfI4Qj.js → standalone-C0NjJpWr.js} +1 -1
- package/frontend/dist/js/sv-BNclj-Fo.js +2 -0
- package/frontend/dist/js/th-BlQ4PL57.js +2 -0
- package/frontend/dist/js/tr-B80aZ1px.js +2 -0
- package/frontend/dist/js/{typescript-Bcq62agC.js → typescript-d0TUM2-0.js} +1 -1
- package/frontend/dist/js/ui-vendor-ChfdHf5M.js +177 -0
- package/frontend/dist/js/uk-DZuuaI56.js +2 -0
- package/frontend/dist/js/vi-Bg42fPfF.js +2 -0
- package/frontend/dist/js/zh-BSt87zs6.js +2 -0
- package/package.json +3 -3
- package/plugins/openrouter.json +89 -0
- package/backend/dist/services/systemSettingsService.d.ts +0 -12
- package/backend/dist/services/systemSettingsService.d.ts.map +0 -1
- package/backend/dist/services/systemSettingsService.js +0 -70
- package/backend/dist/services/systemSettingsService.js.map +0 -1
- package/frontend/dist/assets/index-BqI0kezz.css +0 -1
- package/frontend/dist/assets/index-CRC6g6bL.js +0 -3
- package/frontend/dist/js/ArtifactContainer-Cdy-973y.js +0 -1
- package/frontend/dist/js/ArtifactSlideOutPanel-CmKgQ4eD.js +0 -1
- package/frontend/dist/js/ChatPage-CYT69oBR.js +0 -16
- package/frontend/dist/js/FirstTimeSetup-C8LdLP5J.js +0 -1
- package/frontend/dist/js/GalleryPage-Bm89pnS8.js +0 -1
- package/frontend/dist/js/HomePage-CeCYnMUG.js +0 -1
- package/frontend/dist/js/LibreClawPage-DGMEV6dm.js +0 -1
- package/frontend/dist/js/ModelSelector-DXPdGdQ_.js +0 -1
- package/frontend/dist/js/ModelsPage-D-FIy2x-.js +0 -2
- package/frontend/dist/js/PersonasPage-CIrEVFo5.js +0 -13
- package/frontend/dist/js/SettingsModal-CxtOXPY7.js +0 -1
- package/frontend/dist/js/UserManagementPage-BfyYGGFQ.js +0 -1
- package/frontend/dist/js/WorkPage-C7bW6Hxx.js +0 -4
- package/frontend/dist/js/api-DCD41-l9.js +0 -19
- package/frontend/dist/js/appStore-Bw-8Exsx.js +0 -2
- package/frontend/dist/js/ar-BAHlIvy0.js +0 -2
- package/frontend/dist/js/bn-BxquDVbd.js +0 -2
- package/frontend/dist/js/cs-C4DoKzRm.js +0 -2
- package/frontend/dist/js/da-CFslpGTw.js +0 -2
- package/frontend/dist/js/de-ChudoRh2.js +0 -2
- package/frontend/dist/js/es-B36fefE-.js +0 -2
- package/frontend/dist/js/fr-BSVeTM5W.js +0 -2
- package/frontend/dist/js/hi-BGoFbl5V.js +0 -2
- package/frontend/dist/js/id-BfYs2p_j.js +0 -2
- package/frontend/dist/js/is-DZ1MS-5A.js +0 -2
- package/frontend/dist/js/it-CXtrPCG1.js +0 -2
- package/frontend/dist/js/ja-FPJ_NK_y.js +0 -2
- package/frontend/dist/js/ko-DVwD4ZZF.js +0 -2
- package/frontend/dist/js/ms-PKPP0RX3.js +0 -2
- package/frontend/dist/js/nl-DWM5HJZ8.js +0 -2
- package/frontend/dist/js/pl-B9va8Tuf.js +0 -2
- package/frontend/dist/js/pt-P0IQi-Zr.js +0 -2
- package/frontend/dist/js/ru-Ca2bxYnc.js +0 -2
- package/frontend/dist/js/sv-DI4RDwyZ.js +0 -2
- package/frontend/dist/js/th-DN0bDS9d.js +0 -2
- package/frontend/dist/js/tr-ChqMv5Q4.js +0 -2
- package/frontend/dist/js/ui-vendor-DohPFHDW.js +0 -177
- package/frontend/dist/js/uk-Cr51h_XQ.js +0 -2
- package/frontend/dist/js/useBaseQuery-BAOlhjar.js +0 -1
- package/frontend/dist/js/useQuery-CcRqxveh.js +0 -1
- package/frontend/dist/js/vi-D4OhoVMH.js +0 -2
- package/frontend/dist/js/zh-Bvau7hlR.js +0 -2
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { randomUUID } from 'crypto';
|
|
18
|
+
import { getDatabaseSafe } from '../db.js';
|
|
19
|
+
import { createLogger } from '../utils/logger.js';
|
|
20
|
+
const logger = createLogger('plugin-usage');
|
|
21
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
22
|
+
const MIN_ANALYTICS_DAYS = 1;
|
|
23
|
+
const MAX_ANALYTICS_DAYS = 365;
|
|
24
|
+
const RETENTION_DAYS = 400;
|
|
25
|
+
const asNumber = (value) => typeof value === 'bigint' ? Number(value) : Number(value ?? 0);
|
|
26
|
+
const nonNegativeInteger = (value) => {
|
|
27
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return Math.round(value);
|
|
31
|
+
};
|
|
32
|
+
const asRecord = (value) => value && typeof value === 'object'
|
|
33
|
+
? value
|
|
34
|
+
: null;
|
|
35
|
+
/** Normalize the usage shapes returned by OpenAI-compatible and Anthropic APIs. */
|
|
36
|
+
export function normalizeProviderTokenUsage(response) {
|
|
37
|
+
const root = asRecord(response);
|
|
38
|
+
const usage = asRecord(root?.usage) || asRecord(root?.usage_metadata);
|
|
39
|
+
if (!usage)
|
|
40
|
+
return undefined;
|
|
41
|
+
const promptTokens = nonNegativeInteger(usage.prompt_tokens ??
|
|
42
|
+
usage.input_tokens ??
|
|
43
|
+
usage.promptTokenCount ??
|
|
44
|
+
usage.inputTokenCount);
|
|
45
|
+
const completionTokens = nonNegativeInteger(usage.completion_tokens ??
|
|
46
|
+
usage.output_tokens ??
|
|
47
|
+
usage.candidatesTokenCount ??
|
|
48
|
+
usage.outputTokenCount);
|
|
49
|
+
const reportedTotal = nonNegativeInteger(usage.total_tokens ?? usage.totalTokenCount);
|
|
50
|
+
if (promptTokens === undefined &&
|
|
51
|
+
completionTokens === undefined &&
|
|
52
|
+
reportedTotal === undefined) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const normalizedPrompt = promptTokens ?? 0;
|
|
56
|
+
const normalizedCompletion = completionTokens ?? 0;
|
|
57
|
+
return {
|
|
58
|
+
promptTokens: normalizedPrompt,
|
|
59
|
+
completionTokens: normalizedCompletion,
|
|
60
|
+
totalTokens: reportedTotal ?? normalizedPrompt + normalizedCompletion,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
class PluginUsageService {
|
|
64
|
+
constructor() {
|
|
65
|
+
this.lastPrunedAt = 0;
|
|
66
|
+
}
|
|
67
|
+
record(input) {
|
|
68
|
+
const db = getDatabaseSafe();
|
|
69
|
+
if (!db)
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
const createdAt = input.createdAt ?? Date.now();
|
|
73
|
+
if (createdAt - this.lastPrunedAt >= DAY_MS) {
|
|
74
|
+
db.prepare('DELETE FROM plugin_usage_events WHERE created_at < ?').run(createdAt - RETENTION_DAYS * DAY_MS);
|
|
75
|
+
this.lastPrunedAt = createdAt;
|
|
76
|
+
}
|
|
77
|
+
const tokens = input.tokens;
|
|
78
|
+
db.prepare(`INSERT INTO plugin_usage_events
|
|
79
|
+
(id, user_id, plugin_id, plugin_name, capability, model, status,
|
|
80
|
+
prompt_tokens, completion_tokens, total_tokens, input_units,
|
|
81
|
+
output_units, unit_kind, duration_ms, created_at)
|
|
82
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(randomUUID(), input.userId || 'default', input.pluginId, input.pluginName, input.capability, input.model, input.status, tokens?.promptTokens ?? null, tokens?.completionTokens ?? null, tokens?.totalTokens ?? null, Math.max(0, Math.round(input.inputUnits ?? 0)), Math.max(0, Math.round(input.outputUnits ?? 0)), input.unitKind ?? null, Math.max(0, Math.round(input.durationMs)), createdAt);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
// Metering must never make a provider request fail.
|
|
86
|
+
logger.warn('Failed to record plugin usage:', error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
getAnalytics(requestedDays = 30) {
|
|
90
|
+
const days = Math.min(MAX_ANALYTICS_DAYS, Math.max(MIN_ANALYTICS_DAYS, Math.round(requestedDays)));
|
|
91
|
+
const to = Date.now();
|
|
92
|
+
const startOfToday = new Date(to);
|
|
93
|
+
startOfToday.setUTCHours(0, 0, 0, 0);
|
|
94
|
+
const from = startOfToday.getTime() - (days - 1) * DAY_MS;
|
|
95
|
+
const empty = this.emptyAnalytics(from, to, days);
|
|
96
|
+
const db = getDatabaseSafe();
|
|
97
|
+
if (!db)
|
|
98
|
+
return empty;
|
|
99
|
+
const totals = db
|
|
100
|
+
.prepare(`SELECT
|
|
101
|
+
COUNT(*) AS calls,
|
|
102
|
+
SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END) AS successful_calls,
|
|
103
|
+
SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) AS failed_calls,
|
|
104
|
+
SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS cancelled_calls,
|
|
105
|
+
SUM(CASE WHEN total_tokens IS NOT NULL THEN 1 ELSE 0 END) AS metered_calls,
|
|
106
|
+
SUM(COALESCE(prompt_tokens, 0)) AS prompt_tokens,
|
|
107
|
+
SUM(COALESCE(completion_tokens, 0)) AS completion_tokens,
|
|
108
|
+
SUM(COALESCE(total_tokens, 0)) AS reported_tokens,
|
|
109
|
+
ROUND(AVG(duration_ms)) AS average_latency_ms,
|
|
110
|
+
COUNT(DISTINCT user_id) AS unique_users
|
|
111
|
+
FROM plugin_usage_events
|
|
112
|
+
WHERE created_at >= ? AND created_at <= ?`)
|
|
113
|
+
.get(from, to);
|
|
114
|
+
const seriesRows = db
|
|
115
|
+
.prepare(`SELECT
|
|
116
|
+
CAST((created_at - ?) / ? AS INTEGER) AS bucket,
|
|
117
|
+
COUNT(*) AS calls,
|
|
118
|
+
SUM(COALESCE(total_tokens, 0)) AS tokens,
|
|
119
|
+
SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) AS errors
|
|
120
|
+
FROM plugin_usage_events
|
|
121
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
122
|
+
GROUP BY bucket
|
|
123
|
+
ORDER BY bucket ASC`)
|
|
124
|
+
.all(from, DAY_MS, from, to);
|
|
125
|
+
const seriesByBucket = new Map(seriesRows.map(row => [asNumber(row.bucket), row]));
|
|
126
|
+
const series = Array.from({ length: days }, (_, bucket) => {
|
|
127
|
+
const row = seriesByBucket.get(bucket);
|
|
128
|
+
return {
|
|
129
|
+
timestamp: from + bucket * DAY_MS,
|
|
130
|
+
calls: asNumber(row?.calls),
|
|
131
|
+
tokens: asNumber(row?.tokens),
|
|
132
|
+
errors: asNumber(row?.errors),
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
const plugins = db
|
|
136
|
+
.prepare(`SELECT plugin_id, plugin_name, COUNT(*) AS calls,
|
|
137
|
+
SUM(COALESCE(total_tokens, 0)) AS tokens,
|
|
138
|
+
SUM(CASE WHEN status != 'success' THEN 1 ELSE 0 END) AS errors,
|
|
139
|
+
ROUND(AVG(duration_ms)) AS average_latency_ms
|
|
140
|
+
FROM plugin_usage_events
|
|
141
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
142
|
+
GROUP BY plugin_id, plugin_name
|
|
143
|
+
ORDER BY calls DESC, tokens DESC
|
|
144
|
+
LIMIT 50`)
|
|
145
|
+
.all(from, to);
|
|
146
|
+
const models = db
|
|
147
|
+
.prepare(`SELECT model, plugin_id, plugin_name, COUNT(*) AS calls,
|
|
148
|
+
SUM(COALESCE(total_tokens, 0)) AS tokens,
|
|
149
|
+
SUM(CASE WHEN status != 'success' THEN 1 ELSE 0 END) AS errors,
|
|
150
|
+
ROUND(AVG(duration_ms)) AS average_latency_ms
|
|
151
|
+
FROM plugin_usage_events
|
|
152
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
153
|
+
GROUP BY model, plugin_id, plugin_name
|
|
154
|
+
ORDER BY calls DESC, tokens DESC
|
|
155
|
+
LIMIT 100`)
|
|
156
|
+
.all(from, to);
|
|
157
|
+
const capabilities = db
|
|
158
|
+
.prepare(`SELECT capability, COUNT(*) AS calls,
|
|
159
|
+
SUM(COALESCE(total_tokens, 0)) AS tokens,
|
|
160
|
+
SUM(input_units) AS input_units,
|
|
161
|
+
SUM(output_units) AS output_units
|
|
162
|
+
FROM plugin_usage_events
|
|
163
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
164
|
+
GROUP BY capability
|
|
165
|
+
ORDER BY calls DESC`)
|
|
166
|
+
.all(from, to);
|
|
167
|
+
return {
|
|
168
|
+
range: { from, to, days },
|
|
169
|
+
totals: {
|
|
170
|
+
calls: asNumber(totals.calls),
|
|
171
|
+
successfulCalls: asNumber(totals.successful_calls),
|
|
172
|
+
failedCalls: asNumber(totals.failed_calls),
|
|
173
|
+
cancelledCalls: asNumber(totals.cancelled_calls),
|
|
174
|
+
meteredCalls: asNumber(totals.metered_calls),
|
|
175
|
+
promptTokens: asNumber(totals.prompt_tokens),
|
|
176
|
+
completionTokens: asNumber(totals.completion_tokens),
|
|
177
|
+
reportedTokens: asNumber(totals.reported_tokens),
|
|
178
|
+
averageLatencyMs: asNumber(totals.average_latency_ms),
|
|
179
|
+
uniqueUsers: asNumber(totals.unique_users),
|
|
180
|
+
},
|
|
181
|
+
series,
|
|
182
|
+
plugins: plugins.map(row => ({
|
|
183
|
+
pluginId: String(row.plugin_id),
|
|
184
|
+
pluginName: String(row.plugin_name),
|
|
185
|
+
calls: asNumber(row.calls),
|
|
186
|
+
tokens: asNumber(row.tokens),
|
|
187
|
+
errors: asNumber(row.errors),
|
|
188
|
+
averageLatencyMs: asNumber(row.average_latency_ms),
|
|
189
|
+
})),
|
|
190
|
+
models: models.map(row => ({
|
|
191
|
+
model: String(row.model),
|
|
192
|
+
pluginId: String(row.plugin_id),
|
|
193
|
+
pluginName: String(row.plugin_name),
|
|
194
|
+
calls: asNumber(row.calls),
|
|
195
|
+
tokens: asNumber(row.tokens),
|
|
196
|
+
errors: asNumber(row.errors),
|
|
197
|
+
averageLatencyMs: asNumber(row.average_latency_ms),
|
|
198
|
+
})),
|
|
199
|
+
capabilities: capabilities.map(row => ({
|
|
200
|
+
capability: String(row.capability),
|
|
201
|
+
calls: asNumber(row.calls),
|
|
202
|
+
tokens: asNumber(row.tokens),
|
|
203
|
+
inputUnits: asNumber(row.input_units),
|
|
204
|
+
outputUnits: asNumber(row.output_units),
|
|
205
|
+
})),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
emptyAnalytics(from, to, days) {
|
|
209
|
+
return {
|
|
210
|
+
range: { from, to, days },
|
|
211
|
+
totals: {
|
|
212
|
+
calls: 0,
|
|
213
|
+
successfulCalls: 0,
|
|
214
|
+
failedCalls: 0,
|
|
215
|
+
cancelledCalls: 0,
|
|
216
|
+
meteredCalls: 0,
|
|
217
|
+
promptTokens: 0,
|
|
218
|
+
completionTokens: 0,
|
|
219
|
+
reportedTokens: 0,
|
|
220
|
+
averageLatencyMs: 0,
|
|
221
|
+
uniqueUsers: 0,
|
|
222
|
+
},
|
|
223
|
+
series: Array.from({ length: days }, (_, bucket) => ({
|
|
224
|
+
timestamp: from + bucket * DAY_MS,
|
|
225
|
+
calls: 0,
|
|
226
|
+
tokens: 0,
|
|
227
|
+
errors: 0,
|
|
228
|
+
})),
|
|
229
|
+
plugins: [],
|
|
230
|
+
models: [],
|
|
231
|
+
capabilities: [],
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const pluginUsageService = new PluginUsageService();
|
|
236
|
+
export { PluginUsageService };
|
|
237
|
+
export default pluginUsageService;
|
|
238
|
+
//# sourceMappingURL=pluginUsageService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginUsageService.js","sourceRoot":"","sources":["../../src/services/pluginUsageService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Plugin, VideoGenConfig } from '../types/index.js';
|
|
2
|
+
import type { PluginUsageEventInput } from './pluginUsageService.js';
|
|
3
|
+
type PluginVariables = Record<string, string | number | boolean>;
|
|
4
|
+
export interface VideoGenerationJobStatus {
|
|
5
|
+
status: 'pending' | 'in_progress' | 'completed' | 'failed';
|
|
6
|
+
error?: string;
|
|
7
|
+
usage?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export interface PluginVideoGenerationServiceDependencies {
|
|
10
|
+
getAllPlugins(userId?: string): Plugin[];
|
|
11
|
+
getPlugin(id: string, userId?: string): Plugin | null;
|
|
12
|
+
getApiKey(plugin: Plugin, userId?: string): string | null;
|
|
13
|
+
getPluginVariables(plugin: Plugin, userId?: string): PluginVariables;
|
|
14
|
+
validateEndpointUrl(endpoint: string): string;
|
|
15
|
+
recordUsage?(usage: PluginUsageEventInput): void;
|
|
16
|
+
}
|
|
17
|
+
export declare class PluginVideoGenerationService {
|
|
18
|
+
private readonly deps;
|
|
19
|
+
constructor(deps: PluginVideoGenerationServiceDependencies);
|
|
20
|
+
getAvailableModels(userId?: string): Array<{
|
|
21
|
+
model: string;
|
|
22
|
+
plugin: string;
|
|
23
|
+
config?: VideoGenConfig;
|
|
24
|
+
}>;
|
|
25
|
+
submit(model: string, prompt: string, options: {
|
|
26
|
+
pluginId: string;
|
|
27
|
+
userId: string;
|
|
28
|
+
duration?: number;
|
|
29
|
+
resolution?: string;
|
|
30
|
+
aspectRatio?: string;
|
|
31
|
+
generateAudio?: boolean;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
providerJobId: string;
|
|
34
|
+
status: string;
|
|
35
|
+
}>;
|
|
36
|
+
poll(model: string, providerJobId: string, pluginId: string, userId: string): Promise<VideoGenerationJobStatus>;
|
|
37
|
+
download(model: string, providerJobId: string, pluginId: string, userId: string): Promise<{
|
|
38
|
+
video: Buffer;
|
|
39
|
+
mimeType: string;
|
|
40
|
+
}>;
|
|
41
|
+
private resolve;
|
|
42
|
+
private recordError;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=pluginVideoGenerationService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginVideoGenerationService.d.ts","sourceRoot":"","sources":["../../src/services/pluginVideoGenerationService.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOhE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAEjE,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,wCAAwC;IACvD,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACtD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1D,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;IACrE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9C,WAAW,CAAC,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAClD;AAED,qBAAa,4BAA4B;IAErC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,wCAAwC;IAGjE,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,cAAc,CAAC;KACzB,CAAC;IAkBI,MAAM,CACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GACA,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAqD/C,IAAI,CACR,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC;IA8B9B,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B/C,OAAO,CAAC,OAAO;IAoCf,OAAO,CAAC,WAAW;CAkBpB"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
*/
|
|
7
|
+
import axios from 'axios';
|
|
8
|
+
import { assertSafePluginEndpoint, buildPluginAuthHeaders, resolvePluginOperationEndpoint, validatePluginModel, } from '../utils/pluginValidation.js';
|
|
9
|
+
export class PluginVideoGenerationService {
|
|
10
|
+
constructor(deps) {
|
|
11
|
+
this.deps = deps;
|
|
12
|
+
}
|
|
13
|
+
getAvailableModels(userId) {
|
|
14
|
+
return this.deps.getAllPlugins(userId).flatMap(plugin => {
|
|
15
|
+
const capability = plugin.capabilities?.video;
|
|
16
|
+
if (!plugin.active ||
|
|
17
|
+
!capability ||
|
|
18
|
+
!this.deps.getApiKey(plugin, userId)) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
return capability.model_map.map(model => ({
|
|
22
|
+
model,
|
|
23
|
+
plugin: plugin.id,
|
|
24
|
+
config: capability.config,
|
|
25
|
+
}));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async submit(model, prompt, options) {
|
|
29
|
+
validatePluginModel(model);
|
|
30
|
+
const { plugin, endpoint, config, headers } = this.resolve(model, options.pluginId, options.userId);
|
|
31
|
+
if (config?.max_prompt_length && prompt.length > config.max_prompt_length) {
|
|
32
|
+
throw new Error(`Prompt exceeds maximum length of ${config.max_prompt_length} characters`);
|
|
33
|
+
}
|
|
34
|
+
const payload = { model, prompt };
|
|
35
|
+
const duration = options.duration ?? config?.default_duration;
|
|
36
|
+
const resolution = options.resolution ?? config?.default_resolution;
|
|
37
|
+
const aspectRatio = options.aspectRatio ?? config?.default_aspect_ratio;
|
|
38
|
+
const generateAudio = options.generateAudio ?? config?.default_generate_audio;
|
|
39
|
+
if (duration !== undefined)
|
|
40
|
+
payload.duration = duration;
|
|
41
|
+
if (resolution)
|
|
42
|
+
payload.resolution = resolution;
|
|
43
|
+
if (aspectRatio)
|
|
44
|
+
payload.aspect_ratio = aspectRatio;
|
|
45
|
+
if (generateAudio !== undefined)
|
|
46
|
+
payload.generate_audio = generateAudio;
|
|
47
|
+
const startedAt = Date.now();
|
|
48
|
+
try {
|
|
49
|
+
const response = await axios.post(endpoint, payload, {
|
|
50
|
+
headers,
|
|
51
|
+
timeout: 30000,
|
|
52
|
+
maxRedirects: 0,
|
|
53
|
+
});
|
|
54
|
+
const providerJobId = response.data?.id;
|
|
55
|
+
if (typeof providerJobId !== 'string' || providerJobId.length === 0) {
|
|
56
|
+
throw new Error('Video provider returned no job ID');
|
|
57
|
+
}
|
|
58
|
+
this.deps.recordUsage?.({
|
|
59
|
+
userId: options.userId,
|
|
60
|
+
pluginId: plugin.id,
|
|
61
|
+
pluginName: plugin.name,
|
|
62
|
+
capability: 'video',
|
|
63
|
+
model,
|
|
64
|
+
status: 'success',
|
|
65
|
+
durationMs: Date.now() - startedAt,
|
|
66
|
+
outputUnits: 0,
|
|
67
|
+
unitKind: 'jobs',
|
|
68
|
+
});
|
|
69
|
+
return { providerJobId, status: response.data?.status || 'pending' };
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
this.recordError(plugin, model, options.userId, startedAt);
|
|
73
|
+
throw toVideoError(error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async poll(model, providerJobId, pluginId, userId) {
|
|
77
|
+
const { endpoint, headers } = this.resolve(model, pluginId, userId);
|
|
78
|
+
const statusEndpoint = `${endpoint.replace(/\/+$/, '')}/${encodeURIComponent(providerJobId)}`;
|
|
79
|
+
assertSafePluginEndpoint(statusEndpoint, 'video status endpoint');
|
|
80
|
+
try {
|
|
81
|
+
const response = await axios.get(statusEndpoint, {
|
|
82
|
+
headers,
|
|
83
|
+
timeout: 15000,
|
|
84
|
+
maxRedirects: 0,
|
|
85
|
+
});
|
|
86
|
+
const status = response.data?.status;
|
|
87
|
+
if (!['pending', 'in_progress', 'completed', 'failed'].includes(status)) {
|
|
88
|
+
throw new Error('Video provider returned an invalid job status');
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
status,
|
|
92
|
+
...(typeof response.data?.error === 'string'
|
|
93
|
+
? { error: response.data.error }
|
|
94
|
+
: {}),
|
|
95
|
+
...(response.data?.usage && typeof response.data.usage === 'object'
|
|
96
|
+
? { usage: response.data.usage }
|
|
97
|
+
: {}),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
throw toVideoError(error);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async download(model, providerJobId, pluginId, userId) {
|
|
105
|
+
const { endpoint, headers } = this.resolve(model, pluginId, userId);
|
|
106
|
+
const contentEndpoint = `${endpoint.replace(/\/+$/, '')}/${encodeURIComponent(providerJobId)}/content?index=0`;
|
|
107
|
+
assertSafePluginEndpoint(contentEndpoint, 'video content endpoint');
|
|
108
|
+
try {
|
|
109
|
+
const response = await axios.get(contentEndpoint, {
|
|
110
|
+
headers,
|
|
111
|
+
timeout: 120000,
|
|
112
|
+
responseType: 'arraybuffer',
|
|
113
|
+
maxRedirects: 0,
|
|
114
|
+
maxContentLength: 200 * 1024 * 1024,
|
|
115
|
+
});
|
|
116
|
+
const mimeType = String(response.headers['content-type'] || 'video/mp4')
|
|
117
|
+
.split(';')[0]
|
|
118
|
+
.trim();
|
|
119
|
+
if (!mimeType.startsWith('video/')) {
|
|
120
|
+
throw new Error('Video provider returned non-video content');
|
|
121
|
+
}
|
|
122
|
+
return { video: Buffer.from(response.data), mimeType };
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
throw toVideoError(error);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
resolve(model, pluginId, userId) {
|
|
129
|
+
const plugin = this.deps.getPlugin(pluginId, userId);
|
|
130
|
+
const capability = plugin?.capabilities?.video;
|
|
131
|
+
if (!plugin?.active ||
|
|
132
|
+
!capability ||
|
|
133
|
+
!capability.model_map.includes(model)) {
|
|
134
|
+
throw new Error(`No video generation plugin found for model: ${model}`);
|
|
135
|
+
}
|
|
136
|
+
const apiKey = this.deps.getApiKey(plugin, userId);
|
|
137
|
+
if (!apiKey) {
|
|
138
|
+
throw new Error(`API key not found for plugin ${plugin.id} (save a provider credential in Settings)`);
|
|
139
|
+
}
|
|
140
|
+
const variables = this.deps.getPluginVariables(plugin, userId);
|
|
141
|
+
let endpoint = capability.endpoint;
|
|
142
|
+
const endpointVariable = capability.config?.endpoint_variable;
|
|
143
|
+
if (endpointVariable) {
|
|
144
|
+
const override = variables[endpointVariable];
|
|
145
|
+
if (typeof override === 'string' && override.trim()) {
|
|
146
|
+
endpoint = this.deps.validateEndpointUrl(override.trim());
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else if (plugin.type === 'video') {
|
|
150
|
+
endpoint = resolvePluginOperationEndpoint(endpoint, variables);
|
|
151
|
+
}
|
|
152
|
+
assertSafePluginEndpoint(endpoint, 'video generation endpoint');
|
|
153
|
+
return {
|
|
154
|
+
plugin,
|
|
155
|
+
endpoint,
|
|
156
|
+
config: capability.config,
|
|
157
|
+
headers: buildPluginAuthHeaders(plugin, apiKey, endpoint),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
recordError(plugin, model, userId, startedAt) {
|
|
161
|
+
this.deps.recordUsage?.({
|
|
162
|
+
userId,
|
|
163
|
+
pluginId: plugin.id,
|
|
164
|
+
pluginName: plugin.name,
|
|
165
|
+
capability: 'video',
|
|
166
|
+
model,
|
|
167
|
+
status: 'error',
|
|
168
|
+
durationMs: Date.now() - startedAt,
|
|
169
|
+
outputUnits: 0,
|
|
170
|
+
unitKind: 'jobs',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function toVideoError(error) {
|
|
175
|
+
if (axios.isAxiosError(error)) {
|
|
176
|
+
const data = error.response?.data;
|
|
177
|
+
let message = error.message;
|
|
178
|
+
if (Buffer.isBuffer(data) || data instanceof ArrayBuffer) {
|
|
179
|
+
const bytes = Buffer.isBuffer(data)
|
|
180
|
+
? data
|
|
181
|
+
: Buffer.from(new Uint8Array(data));
|
|
182
|
+
try {
|
|
183
|
+
const parsed = JSON.parse(bytes.toString('utf8'));
|
|
184
|
+
message =
|
|
185
|
+
parsed.error?.message || parsed.error || parsed.message || message;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
message = bytes.toString('utf8').slice(0, 200) || message;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else if (data && typeof data === 'object') {
|
|
192
|
+
message = data.error?.message || data.error || data.message || message;
|
|
193
|
+
}
|
|
194
|
+
return new Error(`Video generation failed: ${message}`);
|
|
195
|
+
}
|
|
196
|
+
return error instanceof Error ? error : new Error('Video generation failed');
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=pluginVideoGenerationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginVideoGenerationService.js","sourceRoot":"","sources":["../../src/services/pluginVideoGenerationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preferencesService.d.ts","sourceRoot":"","sources":["../../src/services/preferencesService.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAO3B,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,cAAM,kBAAkB;IACtB,OAAO,CAAC,kBAAkB,
|
|
1
|
+
{"version":3,"file":"preferencesService.d.ts","sourceRoot":"","sources":["../../src/services/preferencesService.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAO3B,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,cAAM,kBAAkB;IACtB,OAAO,CAAC,kBAAkB,CA+DxB;;IAMF,OAAO,CAAC,sBAAsB;IAe9B,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe;IAiBhD,OAAO,CAAC,iBAAiB;IA+BzB,iBAAiB,CACf,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,GACd,eAAe;IAsHlB,eAAe,CACb,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,iBAAiB,CAAC,EAAE,qBAAqB,GACxC,eAAe;IAYlB,QAAQ,CACN,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,EACnC,MAAM,CAAC,EAAE,MAAM,GACd,eAAe;IAIlB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe;IAIzE,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAIzC,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAIxC,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB;IAIxD,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAOjD,uBAAuB,CACrB,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,MAAM,CAAC,EAAE,MAAM,GACd,eAAe;IAalB,oBAAoB,CAClB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,CAAC,EAAE,MAAM,GACd,eAAe;IAIlB,sBAAsB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe;IASxD,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB;IAIxD,uBAAuB,CACrB,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACpC,MAAM,CAAC,EAAE,MAAM,GACd,eAAe;IAalB,oBAAoB,CAClB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,eAAe;IAIlB,sBAAsB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe;IASxD,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe;IAUjD,UAAU,CACR,IAAI,EAAE,UAAU,EAChB,aAAa,GAAE,OAAO,GAAG,SAAmB,EAC5C,MAAM,CAAC,EAAE,MAAM,GACd,eAAe;CA6CnB;AAED,QAAA,MAAM,kBAAkB,oBAA2B,CAAC;AACpD,eAAe,kBAAkB,CAAC"}
|
|
@@ -22,8 +22,9 @@ class PreferencesService {
|
|
|
22
22
|
constructor() {
|
|
23
23
|
this.defaultPreferences = {
|
|
24
24
|
defaultModel: '',
|
|
25
|
+
visionModel: '',
|
|
25
26
|
theme: {
|
|
26
|
-
mode: '
|
|
27
|
+
mode: 'dark',
|
|
27
28
|
adaptToAccent: false,
|
|
28
29
|
accent: 'blue',
|
|
29
30
|
customAccent: '#2563eb',
|
|
@@ -155,6 +156,19 @@ class PreferencesService {
|
|
|
155
156
|
normalizedUpdates.defaultProviderType = provider?.providerType;
|
|
156
157
|
normalizedUpdates.defaultProviderId = provider?.providerId;
|
|
157
158
|
}
|
|
159
|
+
const hasVisionProviderUpdate = Object.prototype.hasOwnProperty.call(updates, 'visionProviderType') ||
|
|
160
|
+
Object.prototype.hasOwnProperty.call(updates, 'visionProviderId');
|
|
161
|
+
if (hasVisionProviderUpdate ||
|
|
162
|
+
Object.prototype.hasOwnProperty.call(updates, 'visionModel')) {
|
|
163
|
+
const provider = hasVisionProviderUpdate
|
|
164
|
+
? normalizeChatProviderSelection({
|
|
165
|
+
providerType: updates.visionProviderType,
|
|
166
|
+
providerId: updates.visionProviderId,
|
|
167
|
+
})
|
|
168
|
+
: undefined;
|
|
169
|
+
normalizedUpdates.visionProviderType = provider?.providerType;
|
|
170
|
+
normalizedUpdates.visionProviderId = provider?.providerId;
|
|
171
|
+
}
|
|
158
172
|
if (updates.titleSettings) {
|
|
159
173
|
const currentTitleSettings = currentPreferences.titleSettings;
|
|
160
174
|
const titleSettings = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preferencesService.js","sourceRoot":"","sources":["../../src/services/preferencesService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,cAAc,MAAM,eAAe,CAAC;AAO3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAEnF,MAAM,MAAM,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAY5D,MAAM,kBAAkB;
|
|
1
|
+
{"version":3,"file":"preferencesService.js","sourceRoot":"","sources":["../../src/services/preferencesService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Public account registration is enabled unless explicitly disabled. */
|
|
2
|
+
export declare const isPublicRegistrationEnabled: (value?: string | undefined) => boolean;
|
|
3
|
+
/** Disabled registration is absolute, including on an empty database. */
|
|
4
|
+
export declare const canCreateLocalAccount: (_userCount: number, registrationEnabled?: boolean) => boolean;
|
|
5
|
+
//# sourceMappingURL=registrationPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registrationPolicy.d.ts","sourceRoot":"","sources":["../../src/services/registrationPolicy.ts"],"names":[],"mappings":"AAiBA,yEAAyE;AACzE,eAAO,MAAM,2BAA2B,GACtC,QAAO,MAAM,GAAG,SAAqC,KACpD,OAAkD,CAAC;AAEtD,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,GAChC,YAAY,MAAM,EAClB,6BAAmD,KAClD,OAA8B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/** Public account registration is enabled unless explicitly disabled. */
|
|
18
|
+
export const isPublicRegistrationEnabled = (value = process.env.ENABLE_SIGNUP) => value?.trim().toLowerCase() !== 'false';
|
|
19
|
+
/** Disabled registration is absolute, including on an empty database. */
|
|
20
|
+
export const canCreateLocalAccount = (_userCount, registrationEnabled = isPublicRegistrationEnabled()) => registrationEnabled;
|
|
21
|
+
//# sourceMappingURL=registrationPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registrationPolicy.js","sourceRoot":"","sources":["../../src/services/registrationPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,QAA4B,OAAO,CAAC,GAAG,CAAC,aAAa,EAC5C,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;AAEtD,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,UAAkB,EAClB,mBAAmB,GAAG,2BAA2B,EAAE,EAC1C,EAAE,CAAC,mBAAmB,CAAC"}
|