diff --git a/sdkjs-plugins/content/ai/scripts/aiModelEdit.js b/sdkjs-plugins/content/ai/scripts/aiModelEdit.js index bf01ed3a..989ee299 100644 --- a/sdkjs-plugins/content/ai/scripts/aiModelEdit.js +++ b/sdkjs-plugins/content/ai/scripts/aiModelEdit.js @@ -172,6 +172,7 @@ window.Asc.plugin.init = function() { window.Asc.plugin.attachEvent("onThemeChanged", onThemeChanged); window.Asc.plugin.attachEvent("onModelInfo", onModelInfo); window.Asc.plugin.attachEvent("onSubmit", onSubmit); + window.Asc.plugin.attachEvent("onProvidersUpdate", onProvidersUpdate); window.Asc.plugin.attachEvent("onGetModels", function(data) { if(data.error == 1) { rejectModels && rejectModels(data.message); @@ -250,6 +251,22 @@ function onResize () { }); } +function onProvidersUpdate(info) { + providersList = []; + + for (let i = 0, len = info.providers.length; i < len; i++) { + let srcProvider = info.providers[i]; + providersList.push({ + id : srcProvider.name, + name : srcProvider.name, + url : srcProvider.url, + key : srcProvider.key, + }); + } + + updateProviderComboBox(false); +} + function onModelInfo(info) { type = (info.model ? 'edit' : 'add'); diff --git a/sdkjs-plugins/content/ai/scripts/code.js b/sdkjs-plugins/content/ai/scripts/code.js index 7632a58e..e1d88d46 100644 --- a/sdkjs-plugins/content/ai/scripts/code.js +++ b/sdkjs-plugins/content/ai/scripts/code.js @@ -197,23 +197,24 @@ function onOpenCustomProvidersModal() { if (!customProvidersWindow) { customProvidersWindow = new window.Asc.PluginWindow(); customProvidersWindow.attachEvent("onInit", function() { - //TODO: Add set custom providers - customProvidersWindow.command('onSetCustomProvider', []); + customProvidersWindow.command('onSetCustomProvider', AI.getCustomProviders()); }); customProvidersWindow.attachEvent("onAddCustomProvider", function(item) { - console.log('Add custom provider', item); - - // If the provider addition is successful, then call "onAddCustomProvider" - // Else call "onErrorCustomProvider" - let isError = false; - if(isError) { + let isError = !AI.addCustomProvider(item.content); + if (isError) { customProvidersWindow.command('onErrorCustomProvider'); } else { - customProvidersWindow.command('onAddCustomProvider', item); + customProvidersWindow.command('onSetCustomProvider', AI.getCustomProviders()); + + if (aiModelEditWindow) + aiModelEditWindow.command('onProvidersUpdate', { providers : AI.serializeProviders() }); } }); customProvidersWindow.attachEvent("onDeleteCustomProvider", function(item) { - console.log('Delete custom provider', item); + AI.removeCustomProvider(item.name); + + if (aiModelEditWindow) + aiModelEditWindow.command('onProvidersUpdate', { providers : AI.serializeProviders() }); }); } customProvidersWindow.show(variation); diff --git a/sdkjs-plugins/content/ai/scripts/customProviders.js b/sdkjs-plugins/content/ai/scripts/customProviders.js index 321d5ce5..999c6da5 100644 --- a/sdkjs-plugins/content/ai/scripts/customProviders.js +++ b/sdkjs-plugins/content/ai/scripts/customProviders.js @@ -79,10 +79,13 @@ let templateFilePath = document.currentScript.src + '/../engine/providers/provid window.Asc.plugin.init = function() { window.Asc.plugin.sendToPlugin("onInit"); window.Asc.plugin.attachEvent("onSetCustomProvider", function(list) { - providersList.set(list); + let items = []; + for (let i = 0, len = list.length; i < len; i++) + items.push({ name : list[i] }); + providersList.set(items); }); window.Asc.plugin.attachEvent("onAddCustomProvider", function(item) { - providersList.add({name: item.name}); + providersList.add({name: item}); }); window.Asc.plugin.attachEvent("onErrorCustomProvider", function(item) { showErrorLabel('Error adding provider from file, please try again'); diff --git a/sdkjs-plugins/content/ai/scripts/engine/local_storage.js b/sdkjs-plugins/content/ai/scripts/engine/local_storage.js index bd2a0c59..6c81b3e0 100644 --- a/sdkjs-plugins/content/ai/scripts/engine/local_storage.js +++ b/sdkjs-plugins/content/ai/scripts/engine/local_storage.js @@ -31,7 +31,8 @@ let obj = { version : AI.Storage.Version, providers : {}, - models : AI.Models + models : AI.Models, + customProviders : AI.InternalCustomProvidersSources }; for (let pr in AI.Providers) @@ -87,6 +88,21 @@ let oldProviders = AI.Providers; AI.Providers = {}; + AI.InternalCustomProvidersSources = obj.customProviders || {}; + AI.loadCustomProviders(); + + for (let i = 0, len = AI.InternalCustomProviders.length; i < len; i++) { + let pr = AI.InternalCustomProviders[i]; + oldProviders[pr.name] = pr; + } + + for (let i = 0, len = AI.InternalCustomProviders.length; i < len; i++) { + if (AI.InternalCustomProviders[i].name === name) { + AI.InternalCustomProviders.splice(i, 1); + break; + } + } + for (let i in obj.providers) { let pr = obj.providers[i]; AI.Providers[i] = AI.createProviderInstance(pr.name, pr.url, pr.key, pr.addon); @@ -203,6 +219,6 @@ AI.Providers[pr.name] = pr; } AI.Storage.load(); - } + }; })(window); diff --git a/sdkjs-plugins/content/ai/scripts/engine/providers/base.js b/sdkjs-plugins/content/ai/scripts/engine/providers/base.js index aa45492e..fc854cbe 100644 --- a/sdkjs-plugins/content/ai/scripts/engine/providers/base.js +++ b/sdkjs-plugins/content/ai/scripts/engine/providers/base.js @@ -117,11 +117,15 @@ AI.InternalProviders = []; AI.createProviderInstance = function(name, url, key, addon) { + for (let i = 0, len = window.AI.InternalCustomProviders.length; i < len; i++) { + if (name === AI.InternalCustomProviders[i].name) + return AI.InternalCustomProviders[i].createInstance(name, url, key, addon || AI.InternalCustomProviders[i].addon); + } for (let i = 0, len = window.AI.InternalProviders.length; i < len; i++) { if (name === AI.InternalProviders[i].name) return AI.InternalProviders[i].createInstance(name, url, key, addon || AI.InternalProviders[i].addon); } - return new Provider(name, url, key); + return new AI.Provider(name, url, key); }; AI.isInternalProvider = function(name) { @@ -157,4 +161,85 @@ AI.onLoadInternalProviders(); }; + AI.InternalCustomProvidersSources = {}; + AI.InternalCustomProviders = []; + + AI.loadCustomProviders = function() { + + AI.InternalCustomProviders = []; + for (let name in AI.InternalCustomProvidersSources) { + AI.addCustomProvider(AI.InternalCustomProvidersSources[name], true); + } + + }; + + AI.addCustomProvider = function(providerContent, isRegister) { + + try { + let content = "(function(){\n" + providerContent + "\nreturn new Provider();})();"; + let provider = eval(content); + + if (!provider.name) + return false; + + if (provider.isOnlyDesktop() && (-1 === navigator.userAgent.indexOf("AscDesktopEditor"))) + return false; + + AI.InternalCustomProvidersSources[provider.name] = providerContent; + + for (let i = 0, len = AI.InternalCustomProviders.length; i < len; i++) { + if (AI.InternalCustomProviders[i].name === provider.name) { + AI.InternalCustomProviders.splice(i, 1); + break; + } + } + + AI.InternalCustomProviders.push(provider); + + if (!isRegister) + { + AI.Storage.save(); + AI.Storage.load(); + } + + return true; + + } catch(err) { + } + + return false; + + }; + + AI.removeCustomProvider = function(name) { + + if (AI.InternalCustomProvidersSources[name]) + delete AI.InternalCustomProvidersSources[name]; + + for (let i = 0, len = AI.InternalCustomProviders.length; i < len; i++) { + if (AI.InternalCustomProviders[i].name === name) { + AI.InternalCustomProviders.splice(i, 1); + + if (!AI.isInternalProvider(name) && AI.Providers[name]) { + delete AI.Providers[name]; + } + + AI.Storage.save(); + AI.Storage.load(); + break; + } + } + + }; + + AI.getCustomProviders = function() { + + let names = []; + for (let i = 0, len = AI.InternalCustomProviders.length; i < len; i++) { + names.push(AI.InternalCustomProviders[i].name); + } + return names; + + }; + })();