mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
* Add WebLLM support for vectorization * Load models when WebLLM extension installed * Consistency updated * Move checkWebLlm to initEngine * Refactor vector request handling to use getAdditionalArgs * Add error handling for unsupported WebLLM extension * Add prefix to error causes
65 lines
1.9 KiB
JavaScript
65 lines
1.9 KiB
JavaScript
export class WebLlmVectorProvider {
|
|
/** @type {object?} WebLLM engine */
|
|
#engine = null;
|
|
|
|
constructor() {
|
|
this.#engine = null;
|
|
}
|
|
|
|
/**
|
|
* Check if WebLLM is available and up-to-date
|
|
* @throws {Error} If WebLLM is not available or not up-to-date
|
|
*/
|
|
#checkWebLlm() {
|
|
if (!Object.hasOwn(SillyTavern, 'llm')) {
|
|
throw new Error('WebLLM is not available', { cause: 'webllm-not-available' });
|
|
}
|
|
|
|
if (typeof SillyTavern.llm.generateEmbedding !== 'function') {
|
|
throw new Error('WebLLM is not updated', { cause: 'webllm-not-updated' });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize the engine with a model.
|
|
* @param {string} modelId Model ID to initialize the engine with
|
|
* @returns {Promise<void>} Promise that resolves when the engine is initialized
|
|
*/
|
|
#initEngine(modelId) {
|
|
this.#checkWebLlm();
|
|
if (!this.#engine) {
|
|
this.#engine = SillyTavern.llm.getEngine();
|
|
}
|
|
|
|
return this.#engine.loadModel(modelId);
|
|
}
|
|
|
|
/**
|
|
* Get available models.
|
|
* @returns {{id:string, toString: function(): string}[]} Array of available models
|
|
*/
|
|
getModels() {
|
|
this.#checkWebLlm();
|
|
return SillyTavern.llm.getEmbeddingModels();
|
|
}
|
|
|
|
/**
|
|
* Generate embeddings for a list of texts.
|
|
* @param {string[]} texts Array of texts to generate embeddings for
|
|
* @param {string} modelId Model to use for generating embeddings
|
|
* @returns {Promise<number[][]>} Array of embeddings for each text
|
|
*/
|
|
async embedTexts(texts, modelId) {
|
|
await this.#initEngine(modelId);
|
|
return this.#engine.generateEmbedding(texts);
|
|
}
|
|
|
|
/**
|
|
* Loads a model into the engine.
|
|
* @param {string} modelId Model ID to load
|
|
*/
|
|
async loadModel(modelId) {
|
|
await this.#initEngine(modelId);
|
|
}
|
|
}
|