Worked version

This commit is contained in:
Oleg Korshul
2025-02-10 22:00:20 +03:00
parent c601ab9ee2
commit dff84387af
10 changed files with 129 additions and 34 deletions

View File

@ -22,10 +22,9 @@
<script type="text/javascript" src="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.js"></script>
<script type="text/javascript" src="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins-ui.js"></script>
<script type="text/javascript" src="scripts/engine/providers/base.js"></script>
<script src="vendor/jQuery-2.2.2-min/jquery-v2.2.2-min.js"></script>
<script src="vendor/select2-4.0.6-rc.1/dist/js/select2.js"></script>
<script type="text/javascript" src="scripts/engine/storage.js"></script>
<link rel="stylesheet" href="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.css">
<script src="vendor/select2-4.0.6-rc.1/dist/js/select2.js"></script>
<link rel="stylesheet" href="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.css">
<link rel="stylesheet" href="vendor/select2-4.0.6-rc.1/dist/css/select2.css"/>
<link rel="stylesheet" href="./resources/styles/common.css">

View File

@ -22,8 +22,7 @@
<script type="text/javascript" src="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.js"></script>
<script type="text/javascript" src="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins-ui.js"></script>
<link rel="stylesheet" href="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.css">
<link rel="stylesheet" href="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.css">
<link rel="stylesheet" href="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.css">
<link rel="stylesheet" href="./resources/styles/common.css">
<link rel="stylesheet" href="./resources/styles/aiModelsList.css">
</head>

View File

@ -114,7 +114,7 @@
AI._getHeaders = function(_provider) {
let provider = _provider.createInstance ? _provider : AI.Storage.getProvider(_provider.name);
if (!provider) provider = new AI.Provider();
return provider.getRequestHeaderOptions(_provider.key);
return provider.getRequestHeaderOptions();
};
AI._extendBody = function(_provider, body) {
@ -133,10 +133,13 @@
return provider.isUseProxy();
};
AI._getEndpointUrl = function(_provider, endpoint) {
AI._getEndpointUrl = function(_provider, endpoint, model) {
let provider = _provider.createInstance ? _provider : AI.Storage.getProvider(_provider.name);
if (!provider) provider = new AI.Provider(_provider.name, _provider.url, _provider.key);
if (_provider.key && !provider.key)
provider.key = _provider.key;
let url = provider.url;
if (url.endsWith("/"))
url = url.substring(0, url.length - 1);
@ -148,10 +151,7 @@
url += plus;
}
let override = provider.overrideEndpointUrl(endpoint);
if (undefined !== override)
return override;
return url + AI.Endpoints.getUrl(endpoint);
return url + provider.getEndpointUrl(endpoint, model);
};
AI.getModels = async function(provider)
@ -171,16 +171,20 @@
models : []
});
else {
AI.TmpProviderForModels = AI.Provider.createInstance(provider.name, provider.url, provider.key);
for (let i = 0, len = data.data.length; i < len; i++)
AI.TmpProviderForModels = AI.createProviderInstance(provider.name, provider.url, provider.key);
let models = data.data;
if (data.data.models)
models = data.data.models;
for (let i = 0, len = models.length; i < len; i++)
{
let model = data.data[i];
let model = models[i];
AI.TmpProviderForModels.correctModelInfo(model);
if (!model.id)
continue;
model.name = model.id;
model.endpoints = [];
model.options = {};
model.options = {};
if (AI.TmpProviderForModels.checkExcludeModel(model))
continue;
@ -357,7 +361,7 @@
let endpointType = isUseCompletionsInsteadChat ? AI.Endpoints.Types.v1.Completions :
AI.Endpoints.Types.v1.Chat_Completions;
objRequest.url = AI._getEndpointUrl(provider, endpointType);
objRequest.url = AI._getEndpointUrl(provider, endpointType, this.model);
objRequest.body = {
model : this.modelUI.id

View File

@ -78,11 +78,11 @@
for (let i in obj.providers) {
let pr = obj.providers[i];
AI.Providers[i] = AI.Provider.createInstance(pr.name, pr.url, pr.key);
AI.Providers[i] = AI.createProviderInstance(pr.name, pr.url, pr.key);
AI.Providers[i].models = pr.models || [];
if (fixVersion2) {
if (!AI.Storage.isInternalProvider(pr.name))
if (!AI.isInternalProvider(pr.name))
AI.Providers[i].addon = "v1";
}
}
@ -111,7 +111,7 @@
AI.Providers[model.provider.name].key = model.provider.key;
} else {
AI.Providers[model.provider.name] =
AI.Provider.createInstance(model.provider.name, model.provider.url, model.provider.key);
AI.createProviderInstance(model.provider.name, model.provider.url, model.provider.key);
}
if (AI.TmpProviderForModels &&

View File

@ -119,7 +119,7 @@
AI.createProviderInstance = function(name, url, key) {
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);
return AI.InternalProviders[i].createInstance(name, url, key, AI.InternalProviders[i].addon);
}
return new Provider(name, url, key);
};

View File

@ -26,20 +26,20 @@ class Provider extends AI.Provider {
return AI.CapabilitiesUI.Chat | AI.CapabilitiesUI.Vision;
}
getEndpointUrl(endpoint) {
getEndpointUrl(endpoint, model) {
if (AI.Endpoints.Types.v1.Chat_Completions === endpoint)
return "/messages";
return super.getEndpointUrl();
}
getRequestHeaderOptions(key) {
getRequestHeaderOptions() {
let headers = {
"Content-Type" : "application/json",
"anthropic-version" : "2023-06-01",
"anthropic-dangerous-direct-browser-access": "true"
};
if (key)
headers["x-api-key"] = key;
if (this.key)
headers["x-api-key"] = this.key;
return headers;
}

View File

@ -3,7 +3,74 @@
class Provider extends AI.Provider {
constructor() {
super("Google-Gemini", "https://generativelanguage.googleapis.com/v1beta", "", "");
super("Google-Gemini", "https://generativelanguage.googleapis.com", "", "v1beta");
}
correctModelInfo(model) {
model.id = model.name;
let index = model.name.indexOf("models/");
if (index === 0)
model.name = model.name.substring(7);
}
checkExcludeModel(model) {
if (model.id === "models/chat-bison-001" ||
model.id === "models/text-bison-001")
return true;
if (-1 !== model.id.indexOf("gemini-1.0"))
return true;
return false;
}
checkModelCapability(model) {
if (model.inputTokenLimit)
model.options.max_input_tokens = model.inputTokenLimit;
if (Array.isArray(model.supportedGenerationMethods) &&
model.supportedGenerationMethods.includes("generateContent"))
{
model.endpoints.push(AI.Endpoints.Types.v1.Chat_Completions);
let caps = AI.CapabilitiesUI.Chat;
if (-1 !== model.id.indexOf("vision"))
caps |= AI.CapabilitiesUI.Vision;
return AI.CapabilitiesUI.Chat | AI.CapabilitiesUI.Vision;
}
if (Array.isArray(model.supportedGenerationMethods) &&
model.supportedGenerationMethods.includes("embedContent"))
{
model.endpoints.push(AI.Endpoints.Types.v1.Embeddings);
return AI.CapabilitiesUI.Embeddings;
}
return AI.CapabilitiesUI.All;
}
getEndpointUrl(endpoint, model) {
let Types = AI.Endpoints.Types;
let url = "";
switch (endpoint)
{
case Types.v1.Models:
url = "/models";
break;
default:
url = "/" + model.id + ":generateContent";
break;
}
if (this.key)
url += "?key=" + this.key;
return url;
}
getRequestHeaderOptions() {
let headers = {
"Content-Type" : "application/json"
};
return headers;
}
}

View File

@ -6,4 +6,22 @@ class Provider extends AI.Provider {
super("Ollama", "http://localhost:11434/api", "", "");
}
getEndpointUrl(endpoint, model) {
let Types = AI.Endpoints.Types;
switch (endpoint)
{
case Types.v1.Models:
return "/tags";
case Types.v1.Chat_Completions:
return "/chat";
case Types.v1.Completions:
return "/generate";
default:
break;
}
return super.getEndpointUrl();
}
}

View File

@ -19,6 +19,13 @@
this.models = [];
this.modelsUI = [];
}
/**
* Correct received (*models* endpoint) model object.
*/
correctModelInfo(model) {
model.name = model.id;
}
/**
* Return *true* if you do not want to work with a specific model (model.id).
@ -42,7 +49,7 @@
* Url for a specific endpoint.
* @returns {string}
*/
getEndpointUrl(endpoint) {
getEndpointUrl(endpoint, model) {
let Types = AI.Endpoints.Types;
switch (endpoint)
{
@ -94,7 +101,7 @@
* Don't override this method unless you know what you're doing.
* @returns {Object}
*/
getRequestBodyOptions = function() {
getRequestBodyOptions() {
return {};
}
@ -102,12 +109,12 @@
* The returned object is an enumeration of all the headers for the requests.
* @returns {Object}
*/
getRequestHeaderOptions = function(key) {
getRequestHeaderOptions() {
let headers = {
"Content-Type" : "application/json"
};
if (key)
headers["Authorization"] = "Bearer " + key;
if (this.key)
headers["Authorization"] = "Bearer " + this.key;
return headers;
}
@ -135,11 +142,12 @@
* ========================================================================================
*/
createInstance(name, url, key, addon) {
let inst = Object.create(Object.getPrototypeOf(this));
//let inst = Object.create(Object.getPrototypeOf(this));
let inst = new this.constructor();
inst.name = name;
inst.url = url;
inst.key = key;
inst.addon = addon;
inst.addon = addon || "";
return inst;
}

View File

@ -24,7 +24,7 @@
<script type="text/javascript" src="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins-ui.js"></script>
<script src="vendor/jQuery-2.2.2-min/jquery-v2.2.2-min.js"></script>
<script src="vendor/select2-4.0.6-rc.1/dist/js/select2.js"></script>
<script type="text/javascript" src="scripts/engine/storage.js"></script>
<script type="text/javascript" src="scripts/engine/providers/base.js"></script>
<link rel="stylesheet" href="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.css">
<link rel="stylesheet" href="vendor/select2-4.0.6-rc.1/dist/css/select2.css"/>
<link rel="stylesheet" href="./resources/styles/common.css">