Add custom providers realization

This commit is contained in:
Oleg Korshul
2025-02-28 11:58:15 +03:00
parent 41d4494016
commit 1d784fdf9c
5 changed files with 137 additions and 15 deletions

View File

@ -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');

View File

@ -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);

View File

@ -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');

View File

@ -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);

View File

@ -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;
};
})();