Skip to content
This repository was archived by the owner on Jul 4, 2025. It is now read-only.

Commit 76481c5

Browse files
committed
fix ci
1 parent 923882d commit 76481c5

16 files changed

+508
-86
lines changed

engine/cli/commands/engine_install_cmd.cc

Lines changed: 71 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#include "engine_install_cmd.h"
22
#include <future>
33
#include "server_start_cmd.h"
4+
#include "utils/cli_selection_utils.h"
45
#include "utils/download_progress.h"
5-
#include "utils/json_helper.h"
66
#include "utils/logging_utils.h"
77

88
namespace commands {
@@ -38,27 +38,77 @@ bool EngineInstallCmd::Exec(const std::string& engine,
3838
[&dp, &engine] { return dp.Handle(engine); });
3939
CLI_LOG("Validating download items, please wait..")
4040

41-
httplib::Client cli(host_ + ":" + std::to_string(port_));
42-
Json::Value json_data;
43-
json_data["version"] = version.empty() ? "latest" : version;
44-
auto data_str = json_data.toStyledString();
45-
cli.set_read_timeout(std::chrono::seconds(60));
46-
auto res = cli.Post("/v1/engines/install/" + engine, httplib::Headers(),
47-
data_str.data(), data_str.size(), "application/json");
41+
auto versions_url = url_parser::Url{
42+
.protocol = "http",
43+
.host = host_ + ":" + std::to_string(port_),
44+
.pathParams = {"v1", "engines", engine, "versions"},
45+
};
46+
auto versions_result = curl_utils::SimpleGetJson(versions_url.ToFullPath());
47+
if (versions_result.has_error()) {
48+
CTL_ERR(versions_result.error());
49+
return false;
50+
}
51+
std::vector<std::string> version_selections;
52+
for (const auto& release_version : versions_result.value()) {
53+
version_selections.push_back(release_version["name"].asString());
54+
}
4855

49-
if (res) {
50-
if (res->status != httplib::StatusCode::OK_200) {
51-
auto root = json_helper::ParseJsonString(res->body);
52-
CLI_LOG(root["message"].asString());
53-
dp.ForceStop();
54-
return false;
55-
} else {
56-
CLI_LOG("Start downloading..");
57-
}
58-
} else {
59-
auto err = res.error();
60-
CTL_ERR("HTTP error: " << httplib::to_string(err));
61-
dp.ForceStop();
56+
auto selected_version =
57+
cli_selection_utils::PrintSelection(version_selections);
58+
if (selected_version == std::nullopt) {
59+
CTL_ERR("Invalid version selection");
60+
return false;
61+
}
62+
std::cout << "Selected version: " << selected_version.value() << std::endl;
63+
64+
auto variant_url = url_parser::Url{
65+
.protocol = "http",
66+
.host = host_ + ":" + std::to_string(port_),
67+
.pathParams =
68+
{
69+
"v1",
70+
"engines",
71+
engine,
72+
"versions",
73+
selected_version.value(),
74+
},
75+
};
76+
auto variant_result = curl_utils::SimpleGetJson(variant_url.ToFullPath());
77+
if (variant_result.has_error()) {
78+
CTL_ERR(variant_result.error());
79+
return false;
80+
}
81+
82+
std::vector<std::string> variant_selections;
83+
for (const auto& variant : variant_result.value()) {
84+
variant_selections.push_back(variant["name"].asString());
85+
}
86+
auto selected_variant =
87+
cli_selection_utils::PrintSelection(variant_selections);
88+
if (selected_variant == std::nullopt) {
89+
CTL_ERR("Invalid variant selection");
90+
return false;
91+
}
92+
std::cout << "Selected " << selected_variant.value() << " - "
93+
<< selected_version.value() << std::endl;
94+
95+
auto install_url =
96+
url_parser::Url{.protocol = "http",
97+
.host = host_ + ":" + std::to_string(port_),
98+
.pathParams =
99+
{
100+
"v1",
101+
"engines",
102+
engine,
103+
},
104+
.queries = {
105+
{"version", selected_version.value()},
106+
{"variant", selected_variant.value()},
107+
}};
108+
109+
auto response = curl_utils::SimplePostJson(install_url.ToFullPath());
110+
if (response.has_error()) {
111+
CTL_ERR(response.error());
62112
return false;
63113
}
64114

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
#include "engine_update_cmd.h"
2+
#include <future>
3+
#include "server_start_cmd.h"
4+
#include "utils/cli_selection_utils.h"
5+
#include "utils/download_progress.h"
6+
#include "utils/logging_utils.h"
7+
8+
namespace commands {
9+
bool EngineUpdateCmd::Exec(const std::string& engine) {
10+
// Start server if server is not started yet
11+
if (!commands::IsServerAlive(host_, port_)) {
12+
CLI_LOG("Starting server ...");
13+
commands::ServerStartCmd ssc;
14+
if (!ssc.Exec(host_, port_)) {
15+
return false;
16+
}
17+
}
18+
// TODO: implement this
19+
DownloadProgress dp;
20+
dp.Connect(host_, port_);
21+
// engine can be small, so need to start ws first
22+
auto dp_res = std::async(std::launch::deferred,
23+
[&dp, &engine] { return dp.Handle(engine); });
24+
CLI_LOG("Validating download items, please wait..")
25+
26+
auto versions_url = url_parser::Url{
27+
.protocol = "http",
28+
.host = host_ + ":" + std::to_string(port_),
29+
.pathParams = {"v1", "engines", engine, "versions"},
30+
};
31+
auto versions_result = curl_utils::SimpleGetJson(versions_url.ToFullPath());
32+
if (versions_result.has_error()) {
33+
CTL_ERR(versions_result.error());
34+
return false;
35+
}
36+
std::vector<std::string> version_selections;
37+
for (const auto& release_version : versions_result.value()) {
38+
version_selections.push_back(release_version["name"].asString());
39+
}
40+
41+
auto selected_version =
42+
cli_selection_utils::PrintSelection(version_selections);
43+
if (selected_version == std::nullopt) {
44+
CTL_ERR("Invalid version selection");
45+
return false;
46+
}
47+
std::cout << "Selected version: " << selected_version.value() << std::endl;
48+
49+
auto variant_url = url_parser::Url{
50+
.protocol = "http",
51+
.host = host_ + ":" + std::to_string(port_),
52+
.pathParams =
53+
{
54+
"v1",
55+
"engines",
56+
engine,
57+
"versions",
58+
selected_version.value(),
59+
},
60+
};
61+
auto variant_result = curl_utils::SimpleGetJson(variant_url.ToFullPath());
62+
if (variant_result.has_error()) {
63+
CTL_ERR(variant_result.error());
64+
return false;
65+
}
66+
67+
std::vector<std::string> variant_selections;
68+
for (const auto& variant : variant_result.value()) {
69+
variant_selections.push_back(variant["name"].asString());
70+
}
71+
auto selected_variant =
72+
cli_selection_utils::PrintSelection(variant_selections);
73+
if (selected_variant == std::nullopt) {
74+
CTL_ERR("Invalid variant selection");
75+
return false;
76+
}
77+
std::cout << "Selected " << selected_variant.value() << " - "
78+
<< selected_version.value() << std::endl;
79+
80+
auto install_url =
81+
url_parser::Url{.protocol = "http",
82+
.host = host_ + ":" + std::to_string(port_),
83+
.pathParams =
84+
{
85+
"v1",
86+
"engines",
87+
engine,
88+
},
89+
.queries = {
90+
{"version", selected_version.value()},
91+
{"variant", selected_variant.value()},
92+
}};
93+
94+
auto response = curl_utils::SimplePostJson(install_url.ToFullPath());
95+
if (response.has_error()) {
96+
CTL_ERR(response.error());
97+
return false;
98+
}
99+
100+
if (!dp_res.get())
101+
return false;
102+
103+
bool check_cuda_download = !system_info_utils::GetCudaVersion().empty();
104+
if (check_cuda_download) {
105+
if (!dp.Handle("cuda"))
106+
return false;
107+
}
108+
109+
CLI_LOG("Engine " << engine << " downloaded successfully!")
110+
return true;
111+
}
112+
}; // namespace commands
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
3+
#include <string>
4+
#include "services/engine_service.h"
5+
6+
namespace commands {
7+
8+
class EngineUpdateCmd {
9+
public:
10+
explicit EngineUpdateCmd(std::shared_ptr<DownloadService> download_service,
11+
const std::string& host, int port)
12+
: engine_service_{EngineService(download_service)},
13+
host_(host),
14+
port_(port) {};
15+
16+
bool Exec(const std::string& engine);
17+
18+
private:
19+
EngineService engine_service_;
20+
std::string host_;
21+
int port_;
22+
};
23+
} // namespace commands

engine/controllers/engines.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ void Engines::ListEngine(
4444
void Engines::UninstallEngine(
4545
const HttpRequestPtr& req,
4646
std::function<void(const HttpResponsePtr&)>&& callback,
47-
const std::string& engine, const std::string& version,
48-
const std::string& variant) {
47+
const std::string& engine, const std::optional<std::string> version,
48+
const std::optional<std::string> variant) {
4949

5050
auto result =
51-
engine_service_->UninstallEngineVariant(engine, variant, version);
51+
engine_service_->UninstallEngineVariant(engine, version, variant);
5252

5353
Json::Value ret;
5454
if (result.has_error()) {
@@ -128,7 +128,7 @@ void Engines::GetEngineVariants(
128128
callback(resp);
129129
}
130130

131-
void Engines::InstallEngineVariant(
131+
void Engines::InstallEngine(
132132
const HttpRequestPtr& req,
133133
std::function<void(const HttpResponsePtr&)>&& callback,
134134
const std::string& engine, const std::optional<std::string> version,
@@ -152,7 +152,7 @@ void Engines::InstallEngineVariant(
152152
}
153153
}
154154

155-
void Engines::GetEnginesInstalledVariants(
155+
void Engines::GetInstalledEngineVariants(
156156
const HttpRequestPtr& req,
157157
std::function<void(const HttpResponsePtr&)>&& callback,
158158
const std::string& engine) const {

engine/controllers/engines.h

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,36 @@ class Engines : public drogon::HttpController<Engines, false> {
1212
public:
1313
METHOD_LIST_BEGIN
1414

15-
METHOD_ADD(Engines::InstallEngineVariant, "/{1}?version={2}&variant={3}",
16-
Post);
17-
METHOD_ADD(Engines::UninstallEngine, "/{1}/{2}/{3}", Delete);
18-
METHOD_ADD(Engines::ListEngine, "", Get);
19-
20-
METHOD_ADD(Engines::GetEngineVersions, "/{1}/versions", Get);
21-
METHOD_ADD(Engines::GetEngineVariants, "/{1}/versions/{2}", Get);
22-
METHOD_ADD(Engines::InstallEngineVariant, "/{1}/versions/{2}/{3}", Post);
23-
METHOD_ADD(Engines::GetEnginesInstalledVariants, "/{1}", Get);
24-
25-
// METHOD_ADD(Engines::GetLatestEngineVersion, "/{1}/update", Get);
26-
METHOD_ADD(Engines::UpdateEngine, "/{1}/update", Post);
27-
METHOD_ADD(Engines::SetDefaultEngineVariant, "/{1}/default/{2}/{3}", Post);
15+
METHOD_ADD(Engines::GetInstalledEngineVariants, "/{1}", Get);
16+
METHOD_ADD(Engines::InstallEngine, "/{1}?version={2}&variant={3}", Post);
17+
METHOD_ADD(Engines::UninstallEngine, "/{1}?version={2}&variant={3}", Delete);
18+
METHOD_ADD(Engines::SetDefaultEngineVariant,
19+
"/{1}/default?version={2}&variant={3}", Post);
2820
METHOD_ADD(Engines::GetDefaultEngineVariant, "/{1}/default", Get);
2921

3022
METHOD_ADD(Engines::LoadEngine, "/{1}/load", Post);
3123
METHOD_ADD(Engines::UnloadEngine, "/{1}/load", Delete);
24+
METHOD_ADD(Engines::UpdateEngine, "/{1}/update", Post);
25+
METHOD_ADD(Engines::ListEngine, "", Get);
26+
METHOD_ADD(Engines::GetEngineVersions, "/{1}/versions", Get);
27+
METHOD_ADD(Engines::GetEngineVariants, "/{1}/versions/{2}", Get);
3228

33-
ADD_METHOD_TO(Engines::UninstallEngine, "/v1/engines/{1}/{2}/{3}", Delete);
29+
ADD_METHOD_TO(Engines::GetInstalledEngineVariants, "/v1/engines/{1}", Get);
30+
ADD_METHOD_TO(Engines::InstallEngine,
31+
"/v1/engines/{1}?version={2}&variant={3}", Post);
32+
ADD_METHOD_TO(Engines::UninstallEngine,
33+
"/v1/engines/{1}?version={2}&variant={3}", Delete);
34+
ADD_METHOD_TO(Engines::SetDefaultEngineVariant,
35+
"/v1/engines/{1}/default?version={2}&variant={3}", Post);
36+
ADD_METHOD_TO(Engines::GetDefaultEngineVariant, "/v1/engines/{1}/default",
37+
Get);
38+
39+
ADD_METHOD_TO(Engines::LoadEngine, "/v1/engines/{1}/load", Post);
40+
ADD_METHOD_TO(Engines::UnloadEngine, "/v1/engines/{1}/load", Post);
41+
ADD_METHOD_TO(Engines::UpdateEngine, "/v1/engines/{1}/update", Post);
42+
ADD_METHOD_TO(Engines::GetEngineVersions, "/v1/engines/{1}/versions", Get);
43+
ADD_METHOD_TO(Engines::GetEngineVariants, "/v1/engines/{1}/versions/{2}",
44+
Get);
3445

3546
METHOD_LIST_END
3647

@@ -42,8 +53,9 @@ class Engines : public drogon::HttpController<Engines, false> {
4253

4354
void UninstallEngine(const HttpRequestPtr& req,
4455
std::function<void(const HttpResponsePtr&)>&& callback,
45-
const std::string& engine, const std::string& version,
46-
const std::string& variant);
56+
const std::string& engine,
57+
const std::optional<std::string> version,
58+
const std::optional<std::string> variant);
4759

4860
void GetEngineVersions(const HttpRequestPtr& req,
4961
std::function<void(const HttpResponsePtr&)>&& callback,
@@ -54,13 +66,13 @@ class Engines : public drogon::HttpController<Engines, false> {
5466
const std::string& engine,
5567
const std::string& version) const;
5668

57-
void InstallEngineVariant(
58-
const HttpRequestPtr& req,
59-
std::function<void(const HttpResponsePtr&)>&& callback,
60-
const std::string& engine, const std::optional<std::string> version,
61-
const std::optional<std::string> variant_name);
69+
void InstallEngine(const HttpRequestPtr& req,
70+
std::function<void(const HttpResponsePtr&)>&& callback,
71+
const std::string& engine,
72+
const std::optional<std::string> version,
73+
const std::optional<std::string> variant_name);
6274

63-
void GetEnginesInstalledVariants(
75+
void GetInstalledEngineVariants(
6476
const HttpRequestPtr& req,
6577
std::function<void(const HttpResponsePtr&)>&& callback,
6678
const std::string& engine) const;

engine/e2e-test/test_api_engine_install.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,17 @@ def setup_and_teardown(self):
1818
stop_server()
1919

2020
def test_engines_install_llamacpp_should_be_successful(self):
21-
response = requests.post("http://localhost:3928/engines/install/llama-cpp")
21+
response = requests.post("http://localhost:3928/v1/engines/llama-cpp")
22+
assert response.status_code == 200
23+
24+
def test_engines_install_llamacpp_specific_version_and_variant(self):
25+
response = requests.post(
26+
"http://localhost:3928/v1/engines/llama-cpp?version=v0.1.35-27.10.24&variant=linux-amd64-avx-cuda-11-7"
27+
)
28+
assert response.status_code == 200
29+
30+
def test_engines_install_llamacpp_specific_version_and_null_variant(self):
31+
response = requests.post(
32+
"http://localhost:3928/v1/engines/llama-cpp?version=v0.1.35-27.10.24"
33+
)
2234
assert response.status_code == 200

0 commit comments

Comments
 (0)