From 8168cd8730e069746ac29e7d3c07b2dfcb90fab2 Mon Sep 17 00:00:00 2001 From: vansangpfiev Date: Tue, 17 Sep 2024 10:38:27 +0700 Subject: [PATCH 1/4] feat: download pre-release --- engine/commands/engine_init_cmd.cc | 29 +++++++++++++++++++---- engine/controllers/command_line_parser.cc | 7 ++++-- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/engine/commands/engine_init_cmd.cc b/engine/commands/engine_init_cmd.cc index 350f3c6b1..ea528dfe9 100644 --- a/engine/commands/engine_init_cmd.cc +++ b/engine/commands/engine_init_cmd.cc @@ -19,10 +19,12 @@ EngineInitCmd::EngineInitCmd(std::string engineName, std::string version) bool EngineInitCmd::Exec() const { auto system_info = system_info_utils::GetSystemInfo(); constexpr auto gitHubHost = "https://api.github.com"; - std::string version = version_.empty() ? "latest" : version_; + // std::string version = version_.empty() ? "latest" : version_; std::ostringstream engineReleasePath; - engineReleasePath << "/repos/janhq/" << engineName_ << "/releases/" - << version; + engineReleasePath << "/repos/janhq/" << engineName_ << "/releases"; + if (version_ == "latest") { + engineReleasePath << "/latest"; + } CTL_INF("Engine release path: " << gitHubHost << engineReleasePath.str()); using namespace nlohmann; @@ -31,7 +33,26 @@ bool EngineInitCmd::Exec() const { if (res->status == httplib::StatusCode::OK_200) { try { auto jsonResponse = json::parse(res->body); - auto assets = jsonResponse["assets"]; + + nlohmann::json json_data; + if (version_ == "latest") { + json_data = jsonResponse; + } else { + for (auto& jr : jsonResponse) { + // Get the latest or match version + if (auto tag = jr["tag_name"].get(); tag == version_) { + json_data = jr; + break; + } + } + } + + if (json_data.empty()) { + CLI_LOG("Version not found: " << version_); + return false; + } + + auto assets = json_data["assets"]; auto os_arch{system_info.os + "-" + system_info.arch}; std::vector variants; diff --git a/engine/controllers/command_line_parser.cc b/engine/controllers/command_line_parser.cc index b8baf3466..db773c28a 100644 --- a/engine/controllers/command_line_parser.cc +++ b/engine/controllers/command_line_parser.cc @@ -6,6 +6,7 @@ #include "commands/engine_init_cmd.h" #include "commands/engine_list_cmd.h" #include "commands/engine_uninstall_cmd.h" +#include "commands/model_del_cmd.h" #include "commands/model_get_cmd.h" #include "commands/model_list_cmd.h" #include "commands/model_pull_cmd.h" @@ -13,7 +14,6 @@ #include "commands/model_stop_cmd.h" #include "commands/run_cmd.h" #include "commands/server_stop_cmd.h" -#include "commands/model_del_cmd.h" #include "config/yaml_config.h" #include "services/engine_service.h" #include "utils/file_manager_utils.h" @@ -224,7 +224,10 @@ void CommandLineParser::EngineInstall(CLI::App* parent, std::string& version) { auto install_engine_cmd = parent->add_subcommand(engine_name, ""); - install_engine_cmd->callback([=] { + install_engine_cmd->add_option("-v, --version", version, + "Engine version to download"); + + install_engine_cmd->callback([engine_name, &version] { commands::EngineInitCmd eic(engine_name, version); eic.Exec(); }); From 1efc0b62f227b944ad450ff520cf370d8049c0e0 Mon Sep 17 00:00:00 2001 From: vansangpfiev Date: Tue, 17 Sep 2024 16:09:23 +0700 Subject: [PATCH 2/4] feat: download pre-release --- engine/main.cc | 3 ++- engine/services/engine_service.cc | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/engine/main.cc b/engine/main.cc index 79f1aaa98..06513d638 100644 --- a/engine/main.cc +++ b/engine/main.cc @@ -206,12 +206,13 @@ int main(int argc, char* argv[]) { verbose = true; } } + + trantor::FileLogger asyncFileLogger; if (!verbose) { auto config = file_manager_utils::GetCortexConfig(); std::filesystem::create_directories( std::filesystem::path(config.logFolderPath) / std::filesystem::path(cortex_utils::logs_folder)); - trantor::FileLogger asyncFileLogger; asyncFileLogger.setFileName(config.logFolderPath + "/" + cortex_utils::logs_cli_base_name); asyncFileLogger.setMaxLines( diff --git a/engine/services/engine_service.cc b/engine/services/engine_service.cc index 5691d728c..c4e7044ad 100644 --- a/engine/services/engine_service.cc +++ b/engine/services/engine_service.cc @@ -76,16 +76,42 @@ std::vector EngineService::GetEngineInfoList() const { void EngineService::InstallEngine(const std::string& engine, const std::string& version) { auto system_info = system_info_utils::GetSystemInfo(); + auto get_params = [&engine, &version]() -> std::vector { + if (version == "latest") { + return {"repos", "janhq", engine, "releases", version}; + } else { + return {"repos", "janhq", engine, "releases"}; + } + }; + auto url_obj = url_parser::Url{ .protocol = "https", .host = "api.github.com", - .pathParams = {"repos", "janhq", engine, "releases", version}, + .pathParams = get_params(), }; httplib::Client cli(url_obj.GetProtocolAndHost()); if (auto res = cli.Get(url_obj.GetPathAndQuery()); res->status == httplib::StatusCode::OK_200) { auto body = json::parse(res->body); + auto get_data = + [&version](const nlohmann::json& json_data) -> nlohmann::json { + for (auto& jr : json_data) { + // Get the latest or match version + if (auto tag = jr["tag_name"].get(); tag == version) { + return jr; + } + } + return nlohmann::json(); + }; + + if (version != "latest") { + body = get_data(body); + } + if (body.empty()) { + throw std::runtime_error("No version found for " + version); + } + auto assets = body["assets"]; auto os_arch{system_info.os + "-" + system_info.arch}; From 24cbcf1edeab29e1c8564696a60859c88e37c332 Mon Sep 17 00:00:00 2001 From: vansangpfiev Date: Tue, 17 Sep 2024 16:13:28 +0700 Subject: [PATCH 3/4] chore: add e2e test --- engine/e2e-test/test_cli_engine_install.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engine/e2e-test/test_cli_engine_install.py b/engine/e2e-test/test_cli_engine_install.py index be23167be..15cd8deb3 100644 --- a/engine/e2e-test/test_cli_engine_install.py +++ b/engine/e2e-test/test_cli_engine_install.py @@ -28,3 +28,11 @@ def test_engines_install_onnx_on_tensorrt_should_be_failed(self): ) assert "No variant found" in output, "Should display error message" assert exit_code == 0, f"Install engine failed with error: {error}" + + def test_engines_install_pre_release_llamacpp(self): + exit_code, output, error = run( + "Install Engine", ["engines", "install", "cortex.llamacpp", "-v", "v0.1.29"], timeout=60 + ) + assert "Start downloading" in output, "Should display downloading message" + assert exit_code == 0, f"Install engine failed with error: {error}" + From d3c36c106f5b7fe396f4d5eec59c46f0752a889c Mon Sep 17 00:00:00 2001 From: vansangpfiev Date: Tue, 17 Sep 2024 16:16:43 +0700 Subject: [PATCH 4/4] fix: m --- engine/services/engine_service.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/services/engine_service.cc b/engine/services/engine_service.cc index c4e7044ad..68368fe4a 100644 --- a/engine/services/engine_service.cc +++ b/engine/services/engine_service.cc @@ -109,7 +109,7 @@ void EngineService::InstallEngine(const std::string& engine, body = get_data(body); } if (body.empty()) { - throw std::runtime_error("No version found for " + version); + throw std::runtime_error("No release found for " + version); } auto assets = body["assets"];