alwaysai
Version:
The alwaysAI command-line interface (CLI)
72 lines • 2.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = require("path");
const model_id_1 = require("../util/model-id");
const model_config_file_1 = require("../subcommands/model/model-config-file");
const get_random_string_1 = require("../util/get-random-string");
const package_stream_from_cache_1 = require("../model-manager/package-stream-from-cache");
const MODELS_DIR = 'models';
function runBestEffortBackgroundTask(fn, ...args) {
(async () => {
try {
await fn(...args);
}
catch (ex) { }
})();
}
function InstallModels(spawner) {
return async function installModels(models) {
let changed = false;
if (models) {
await Promise.all(Object.entries(models).map(async ([id, version]) => {
changed = changed || (await installModel(id, version)).changed;
}));
}
return { changed };
};
async function installModel(id, version) {
let changed = false;
const { publisher, name } = model_id_1.ModelId.parse(id);
const modelDir = path_1.posix.join(MODELS_DIR, publisher, name);
let installedVersion = undefined;
try {
const output = await spawner.run({
exe: 'cat',
args: [spawner.resolvePath(modelDir, model_config_file_1.MODEL_CONFIG_FILE_NAME)],
});
const parsed = JSON.parse(output);
installedVersion = parsed.version;
}
catch (_) {
// TODO finer-grained error handling
}
if (installedVersion !== version) {
changed = true;
const tmpId = get_random_string_1.getRandomString();
const tmpDir = `${modelDir}.${tmpId}.download`;
await spawner.mkdirp(tmpDir);
try {
await spawner.untar(await package_stream_from_cache_1.PackageStreamFromCache({ id, version }), tmpDir);
const fileNames = await spawner.readdir(tmpDir);
if (fileNames.length !== 1 || !fileNames[0]) {
throw new Error('Expected package to contain single directory');
}
await spawner.rimraf(modelDir);
await spawner.mkdirp(path_1.dirname(modelDir));
await spawner.run({
exe: 'mv',
args: [
spawner.resolvePath(tmpDir, fileNames[0]),
spawner.resolvePath(modelDir),
],
});
}
finally {
runBestEffortBackgroundTask(spawner.rimraf, tmpDir);
}
}
return { changed };
}
}
exports.InstallModels = InstallModels;
//# sourceMappingURL=install-models.js.map