* fix: move tensorrt executable to engine (#2400) * fix: move tensorrt executable to engine Signed-off-by: James <james@jan.ai> * some update Signed-off-by: hiro <hiro@jan.ai> * chore: bump tensorrt version * fix: wrong destroy path * fix: install extensions in parallel * chore: update path for tensorrt engine (#2404) Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> --------- Signed-off-by: James <james@jan.ai> Signed-off-by: hiro <hiro@jan.ai> Co-authored-by: James <james@jan.ai> Co-authored-by: hiro <hiro@jan.ai> Co-authored-by: Louis <louis@jan.ai> * Release/v0.4.9 (#2421) * fix: turn off experimental settings should also turn off quick ask (#2411) * fix: app glitches 1s generating response before starting model (#2412) * fix: disable experimental feature should also disable vulkan (#2414) * fix: model load stuck on windows when can't get CPU core count (#2413) Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> * feat: TensorRT-LLM engine update support (#2415) * fix: engine update * chore: add remove prepopulated models Signed-off-by: James <james@jan.ai> * update tinyjensen url Signed-off-by: James <james@jan.ai> * update llamacorn Signed-off-by: James <james@jan.ai> * update Mistral 7B Instruct v0.1 int4 Signed-off-by: James <james@jan.ai> * update tensorrt Signed-off-by: James <james@jan.ai> * update Signed-off-by: hiro <hiro@jan.ai> * update Signed-off-by: James <james@jan.ai> * prettier Signed-off-by: James <james@jan.ai> * update mistral config Signed-off-by: James <james@jan.ai> * fix some lint Signed-off-by: James <james@jan.ai> --------- Signed-off-by: James <james@jan.ai> Signed-off-by: hiro <hiro@jan.ai> Co-authored-by: James <james@jan.ai> Co-authored-by: hiro <hiro@jan.ai> * Tensorrt LLM disable turing support (#2418) Co-authored-by: Hien To <tominhhien97@gmail.com> * chore: add prompt template tensorrtllm (#2375) * chore: add prompt template tensorrtllm * Add Prompt template for mistral and correct model metadata --------- Co-authored-by: Hien To <tominhhien97@gmail.com> * fix: correct tensorrt mistral model.json (#2419) --------- Signed-off-by: James <james@jan.ai> Signed-off-by: hiro <hiro@jan.ai> Co-authored-by: Louis <louis@jan.ai> Co-authored-by: James <james@jan.ai> Co-authored-by: hiro <hiro@jan.ai> Co-authored-by: hiento09 <136591877+hiento09@users.noreply.github.com> Co-authored-by: Hien To <tominhhien97@gmail.com> --------- Signed-off-by: James <james@jan.ai> Signed-off-by: hiro <hiro@jan.ai> Co-authored-by: NamH <NamNh0122@gmail.com> Co-authored-by: James <james@jan.ai> Co-authored-by: hiro <hiro@jan.ai> Co-authored-by: hiento09 <136591877+hiento09@users.noreply.github.com> Co-authored-by: Hien To <tominhhien97@gmail.com>
126 lines
3.9 KiB
TypeScript
126 lines
3.9 KiB
TypeScript
import { writeFileSync } from 'fs'
|
|
import Extension from './extension'
|
|
import { ExtensionManager } from './manager'
|
|
|
|
/**
|
|
* @module store
|
|
* @private
|
|
*/
|
|
|
|
/**
|
|
* Register of installed extensions
|
|
* @type {Object.<string, Extension>} extension - List of installed extensions
|
|
*/
|
|
const extensions: Record<string, Extension> = {}
|
|
|
|
/**
|
|
* Get a extension from the stored extensions.
|
|
* @param {string} name Name of the extension to retrieve
|
|
* @returns {Extension} Retrieved extension
|
|
* @alias extensionManager.getExtension
|
|
*/
|
|
export function getExtension(name: string) {
|
|
if (!Object.prototype.hasOwnProperty.call(extensions, name)) {
|
|
throw new Error(`Extension ${name} does not exist`)
|
|
}
|
|
|
|
return extensions[name]
|
|
}
|
|
|
|
/**
|
|
* Get list of all extension objects.
|
|
* @returns {Array.<Extension>} All extension objects
|
|
* @alias extensionManager.getAllExtensions
|
|
*/
|
|
export function getAllExtensions() {
|
|
return Object.values(extensions)
|
|
}
|
|
|
|
/**
|
|
* Get list of active extension objects.
|
|
* @returns {Array.<Extension>} Active extension objects
|
|
* @alias extensionManager.getActiveExtensions
|
|
*/
|
|
export function getActiveExtensions() {
|
|
return Object.values(extensions).filter((extension) => extension.active)
|
|
}
|
|
|
|
/**
|
|
* Remove extension from store and maybe save stored extensions to file
|
|
* @param {string} name Name of the extension to remove
|
|
* @param {boolean} persist Whether to save the changes to extensions to file
|
|
* @returns {boolean} Whether the delete was successful
|
|
* @alias extensionManager.removeExtension
|
|
*/
|
|
export function removeExtension(name: string, persist = true) {
|
|
const del = delete extensions[name]
|
|
if (persist) persistExtensions()
|
|
return del
|
|
}
|
|
|
|
/**
|
|
* Add extension to store and maybe save stored extensions to file
|
|
* @param {Extension} extension Extension to add to store
|
|
* @param {boolean} persist Whether to save the changes to extensions to file
|
|
* @returns {void}
|
|
*/
|
|
export function addExtension(extension: Extension, persist = true) {
|
|
if (extension.name) extensions[extension.name] = extension
|
|
if (persist) {
|
|
persistExtensions()
|
|
extension.subscribe('pe-persist', persistExtensions)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Save stored extensions to file
|
|
* @returns {void}
|
|
*/
|
|
export function persistExtensions() {
|
|
const persistData: Record<string, Extension> = {}
|
|
for (const name in extensions) {
|
|
persistData[name] = extensions[name]
|
|
}
|
|
writeFileSync(ExtensionManager.instance.getExtensionsFile(), JSON.stringify(persistData))
|
|
}
|
|
|
|
/**
|
|
* Create and install a new extension for the given specifier.
|
|
* @param {Array.<installOptions | string>} extensions A list of NPM specifiers, or installation configuration objects.
|
|
* @param {boolean} [store=true] Whether to store the installed extensions in the store
|
|
* @returns {Promise.<Array.<Extension>>} New extension
|
|
* @alias extensionManager.installExtensions
|
|
*/
|
|
export async function installExtensions(extensions: any) {
|
|
const installed: Extension[] = []
|
|
const installations = extensions.map((ext: any): Promise<void> => {
|
|
const isObject = typeof ext === 'object'
|
|
const spec = isObject ? [ext.specifier, ext] : [ext]
|
|
const activate = isObject ? ext.activate !== false : true
|
|
|
|
// Install and possibly activate extension
|
|
const extension = new Extension(...spec)
|
|
if (!extension.origin) {
|
|
return Promise.resolve()
|
|
}
|
|
return extension._install().then(() => {
|
|
if (activate) extension.setActive(true)
|
|
// Add extension to store if needed
|
|
addExtension(extension)
|
|
installed.push(extension)
|
|
})
|
|
})
|
|
|
|
await Promise.all(installations)
|
|
|
|
// Return list of all installed extensions
|
|
return installed
|
|
}
|
|
|
|
/**
|
|
* @typedef {Object.<string, any>} installOptions The {@link https://www.npmjs.com/package/pacote|pacote}
|
|
* options used to install the extension with some extra options.
|
|
* @param {string} specifier the NPM specifier that identifies the package.
|
|
* @param {boolean} [activate] Whether this extension should be activated after installation. Defaults to true.
|
|
*/
|