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

Commit 2b01f10

Browse files
committed
chore: update engine API
1 parent afe556d commit 2b01f10

File tree

11 files changed

+204
-245
lines changed

11 files changed

+204
-245
lines changed

engine/cli/commands/engine_get_cmd.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
#include <json/reader.h>
33
#include <json/value.h>
44
#include <iostream>
5+
#include "common/engine_servicei.h"
56
#include "server_start_cmd.h"
6-
#include "services/engine_service.h"
77
#include "utils/curl_utils.h"
88
#include "utils/logging_utils.h"
99
#include "utils/url_parser.h"

engine/cli/commands/engine_install_cmd.cc

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -45,28 +45,28 @@ bool EngineInstallCmd::Exec(const std::string& engine,
4545
}
4646
});
4747

48-
auto versions_url = url_parser::Url{
48+
auto releases_url = url_parser::Url{
4949
.protocol = "http",
5050
.host = host_ + ":" + std::to_string(port_),
51-
.pathParams = {"v1", "engines", engine, "versions"},
51+
.pathParams = {"v1", "engines", engine, "releases"},
5252
};
53-
auto versions_result = curl_utils::SimpleGetJson(versions_url.ToFullPath());
54-
if (versions_result.has_error()) {
55-
CTL_ERR(versions_result.error());
53+
auto releases_result = curl_utils::SimpleGetJson(releases_url.ToFullPath());
54+
if (releases_result.has_error()) {
55+
CTL_ERR(releases_result.error());
5656
return false;
5757
}
5858
std::vector<std::string> version_selections;
59-
for (const auto& release_version : versions_result.value()) {
59+
for (const auto& release_version : releases_result.value()) {
6060
version_selections.push_back(release_version["name"].asString());
6161
}
6262

63-
auto selected_version =
63+
auto selected_release =
6464
cli_selection_utils::PrintSelection(version_selections);
65-
if (selected_version == std::nullopt) {
65+
if (selected_release == std::nullopt) {
6666
CTL_ERR("Invalid version selection");
6767
return false;
6868
}
69-
std::cout << "Selected version: " << selected_version.value() << std::endl;
69+
std::cout << "Selected version: " << selected_release.value() << std::endl;
7070

7171
auto variant_url = url_parser::Url{
7272
.protocol = "http",
@@ -76,8 +76,8 @@ bool EngineInstallCmd::Exec(const std::string& engine,
7676
"v1",
7777
"engines",
7878
engine,
79-
"versions",
80-
selected_version.value(),
79+
"releases",
80+
selected_release.value(),
8181
},
8282
};
8383
auto variant_result = curl_utils::SimpleGetJson(variant_url.ToFullPath());
@@ -113,23 +113,25 @@ bool EngineInstallCmd::Exec(const std::string& engine,
113113
return false;
114114
}
115115
std::cout << "Selected " << selected_variant.value() << " - "
116-
<< selected_version.value() << std::endl;
117-
118-
auto install_url =
119-
url_parser::Url{.protocol = "http",
120-
.host = host_ + ":" + std::to_string(port_),
121-
.pathParams =
122-
{
123-
"v1",
124-
"engines",
125-
engine,
126-
},
127-
.queries = {
128-
{"version", selected_version.value()},
129-
{"variant", selected_variant.value()},
130-
}};
131-
132-
auto response = curl_utils::SimplePostJson(install_url.ToFullPath());
116+
<< selected_release.value() << std::endl;
117+
118+
auto install_url = url_parser::Url{
119+
.protocol = "http",
120+
.host = host_ + ":" + std::to_string(port_),
121+
.pathParams =
122+
{
123+
"v1",
124+
"engines",
125+
engine,
126+
"install",
127+
},
128+
};
129+
Json::Value body;
130+
body["version"] = selected_release.value();
131+
body["variant"] = selected_variant.value();
132+
133+
auto response = curl_utils::SimplePostJson(install_url.ToFullPath(),
134+
body.toStyledString());
133135
if (response.has_error()) {
134136
CTL_ERR(response.error());
135137
return false;
@@ -163,14 +165,17 @@ bool EngineInstallCmd::Exec(const std::string& engine,
163165
"v1",
164166
"engines",
165167
engine,
168+
"install",
166169
},
167170
};
168171

172+
Json::Value body;
169173
if (!version.empty()) {
170-
install_url.queries = {{"version", version}};
174+
body["version"] = version;
171175
}
172176

173-
auto response = curl_utils::SimplePostJson(install_url.ToFullPath());
177+
auto response = curl_utils::SimplePostJson(install_url.ToFullPath(),
178+
body.toStyledString());
174179
if (response.has_error()) {
175180
// TODO: namh refactor later
176181
Json::Value root;

engine/cli/commands/engine_uninstall_cmd.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ void EngineUninstallCmd::Exec(const std::string& host, int port,
1717
}
1818
}
1919

20-
auto url = url_parser::Url{.protocol = "http",
21-
.host = host + ":" + std::to_string(port),
22-
.pathParams = {"v1", "engines", engine}};
20+
auto url =
21+
url_parser::Url{.protocol = "http",
22+
.host = host + ":" + std::to_string(port),
23+
.pathParams = {"v1", "engines", engine, "install"}};
2324

2425
auto result = curl_utils::SimpleDeleteJson(url.ToFullPath());
2526
if (result.has_error()) {

engine/cli/commands/engine_use_cmd.cc

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,11 @@ cpp::result<void, std::string> EngineUseCmd::Exec(const std::string& host,
6262
return cpp::fail("Invalid version selection");
6363
}
6464

65-
auto set_default_engine_variant =
66-
url_parser::Url{.protocol = "http",
67-
.host = host + ":" + std::to_string(port),
68-
.pathParams = {"v1", "engines", engine, "default"},
69-
.queries = {{"version", selected_version.value()},
70-
{"variant", selected_variant.value()}}};
65+
auto set_default_engine_variant = url_parser::Url{
66+
.protocol = "http",
67+
.host = host + ":" + std::to_string(port),
68+
.pathParams = {"v1", "engines", engine, "default"},
69+
};
7170

7271
auto response =
7372
curl_utils::SimplePostJson(set_default_engine_variant.ToFullPath());

engine/controllers/engines.cc

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,24 @@ void Engines::ListEngine(
4747
void Engines::UninstallEngine(
4848
const HttpRequestPtr& req,
4949
std::function<void(const HttpResponsePtr&)>&& callback,
50-
const std::string& engine, const std::optional<std::string> version,
51-
const std::optional<std::string> variant) {
50+
const std::string& engine) {
51+
std::optional<std::string> norm_variant = std::nullopt;
52+
std::optional<std::string> norm_version = std::nullopt;
53+
if (req->getJsonObject() != nullptr) {
54+
auto variant = (*(req->getJsonObject())).get("variant", "").asString();
55+
auto version =
56+
(*(req->getJsonObject())).get("version", "latest").asString();
5257

53-
auto result =
54-
engine_service_->UninstallEngineVariant(engine, version, variant);
58+
if (!variant.empty()) {
59+
norm_variant = variant;
60+
}
61+
if (!version.empty()) {
62+
norm_version = version;
63+
}
64+
}
65+
66+
auto result = engine_service_->UninstallEngineVariant(engine, norm_version,
67+
norm_variant);
5568

5669
Json::Value ret;
5770
if (result.has_error()) {
@@ -134,12 +147,23 @@ void Engines::GetEngineVariants(
134147
void Engines::InstallEngine(
135148
const HttpRequestPtr& req,
136149
std::function<void(const HttpResponsePtr&)>&& callback,
137-
const std::string& engine, const std::optional<std::string> version,
138-
const std::optional<std::string> variant_name) {
139-
auto normalized_version = version.value_or("latest");
150+
const std::string& engine) {
151+
std::optional<std::string> norm_variant = std::nullopt;
152+
std::string norm_version{"latest"};
153+
154+
if (req->getJsonObject() != nullptr) {
155+
auto variant = (*(req->getJsonObject())).get("variant", "").asString();
156+
auto version =
157+
(*(req->getJsonObject())).get("version", "latest").asString();
140158

141-
auto result = engine_service_->InstallEngineAsyncV2(
142-
engine, normalized_version, variant_name);
159+
if (!variant.empty()) {
160+
norm_variant = variant;
161+
}
162+
norm_version = version;
163+
}
164+
165+
auto result =
166+
engine_service_->InstallEngineAsync(engine, norm_version, norm_variant);
143167
if (result.has_error()) {
144168
Json::Value res;
145169
res["message"] = result.error();
@@ -218,8 +242,36 @@ void Engines::GetLatestEngineVersion(
218242
void Engines::SetDefaultEngineVariant(
219243
const HttpRequestPtr& req,
220244
std::function<void(const HttpResponsePtr&)>&& callback,
221-
const std::string& engine, const std::string& version,
222-
const std::string& variant) {
245+
const std::string& engine) {
246+
auto json_obj = req->getJsonObject();
247+
if (json_obj == nullptr) {
248+
Json::Value res;
249+
res["message"] = "Request body is required";
250+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(res);
251+
resp->setStatusCode(k400BadRequest);
252+
callback(resp);
253+
return;
254+
}
255+
256+
auto variant = (*(req->getJsonObject())).get("variant", "").asString();
257+
if (variant.empty()) {
258+
Json::Value ret;
259+
ret["message"] = "Variant is required";
260+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(ret);
261+
resp->setStatusCode(k400BadRequest);
262+
callback(resp);
263+
return;
264+
}
265+
auto version = (*(req->getJsonObject())).get("version", "").asString();
266+
if (version.empty()) {
267+
Json::Value ret;
268+
ret["message"] = "Version is required";
269+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(ret);
270+
resp->setStatusCode(k400BadRequest);
271+
callback(resp);
272+
return;
273+
}
274+
223275
auto result =
224276
engine_service_->SetDefaultEngineVariant(engine, version, variant);
225277
if (result.has_error()) {

engine/controllers/engines.h

Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -12,55 +12,70 @@ class Engines : public drogon::HttpController<Engines, false> {
1212
public:
1313
METHOD_LIST_BEGIN
1414

15-
METHOD_ADD(Engines::GetInstalledEngineVariants, "/{1}", Get);
16-
METHOD_ADD(Engines::InstallEngine, "/{1}?version={2}&variant={3}", Options,
17-
Post);
18-
METHOD_ADD(Engines::UninstallEngine, "/{1}?version={2}&variant={3}", Options,
19-
Delete);
20-
METHOD_ADD(Engines::SetDefaultEngineVariant,
21-
"/{1}/default?version={2}&variant={3}", Options, Post);
22-
METHOD_ADD(Engines::GetDefaultEngineVariant, "/{1}/default", Get);
15+
// install engine
16+
METHOD_ADD(Engines::InstallEngine, "/{1}/install", Options, Post);
17+
ADD_METHOD_TO(Engines::InstallEngine, "/v1/engines/{1}/install", Options,
18+
Post);
2319

24-
METHOD_ADD(Engines::LoadEngine, "/{1}/load", Options, Post);
25-
METHOD_ADD(Engines::UnloadEngine, "/{1}/load", Options, Delete);
26-
METHOD_ADD(Engines::UpdateEngine, "/{1}/update", Options, Post);
27-
METHOD_ADD(Engines::ListEngine, "", Get);
20+
// uninstall engine
21+
METHOD_ADD(Engines::UninstallEngine, "/{1}/install", Options, Delete);
22+
ADD_METHOD_TO(Engines::UninstallEngine, "/v1/engines/{1}/install", Options,
23+
Delete);
2824

29-
METHOD_ADD(Engines::GetEngineVersions, "/{1}/versions", Get);
30-
METHOD_ADD(Engines::GetEngineVariants, "/{1}/versions/{2}", Get);
31-
METHOD_ADD(Engines::GetLatestEngineVersion, "/{1}/latest", Get);
25+
// set default engine
26+
METHOD_ADD(Engines::SetDefaultEngineVariant, "/{1}/default", Options, Post);
27+
ADD_METHOD_TO(Engines::SetDefaultEngineVariant, "/v1/engines/{1}/default",
28+
Options, Post);
3229

33-
ADD_METHOD_TO(Engines::GetInstalledEngineVariants, "/v1/engines/{1}", Get);
34-
ADD_METHOD_TO(Engines::InstallEngine,
35-
"/v1/engines/{1}?version={2}&variant={3}", Options, Post);
36-
ADD_METHOD_TO(Engines::UninstallEngine,
37-
"/v1/engines/{1}?version={2}&variant={3}", Options, Delete);
38-
ADD_METHOD_TO(Engines::SetDefaultEngineVariant,
39-
"/v1/engines/{1}/default?version={2}&variant={3}", Options,
40-
Post);
30+
// get default engine
31+
METHOD_ADD(Engines::GetDefaultEngineVariant, "/{1}/default", Get);
4132
ADD_METHOD_TO(Engines::GetDefaultEngineVariant, "/v1/engines/{1}/default",
4233
Get);
4334

35+
// update engine
36+
METHOD_ADD(Engines::UpdateEngine, "/{1}/update", Options, Post);
37+
ADD_METHOD_TO(Engines::UpdateEngine, "/v1/engines/{1}/update", Options, Post);
38+
39+
// load engine
40+
METHOD_ADD(Engines::LoadEngine, "/{1}/load", Options, Post);
4441
ADD_METHOD_TO(Engines::LoadEngine, "/v1/engines/{1}/load", Options, Post);
42+
43+
// unload engine
44+
METHOD_ADD(Engines::UnloadEngine, "/{1}/load", Options, Delete);
4545
ADD_METHOD_TO(Engines::UnloadEngine, "/v1/engines/{1}/load", Options, Delete);
46-
ADD_METHOD_TO(Engines::UpdateEngine, "/v1/engines/{1}/update", Options, Post);
47-
ADD_METHOD_TO(Engines::GetEngineVersions, "/v1/engines/{1}/versions", Get);
48-
ADD_METHOD_TO(Engines::GetEngineVariants, "/v1/engines/{1}/versions/{2}",
49-
Get);
46+
47+
METHOD_ADD(Engines::GetInstalledEngineVariants, "/{1}", Get);
48+
ADD_METHOD_TO(Engines::GetInstalledEngineVariants, "/v1/engines/{1}", Get);
49+
50+
METHOD_ADD(Engines::ListEngine, "", Get);
5051
ADD_METHOD_TO(Engines::ListEngine, "/v1/engines", Get);
52+
53+
METHOD_ADD(Engines::GetEngineVersions, "/{1}/releases", Get);
54+
ADD_METHOD_TO(Engines::GetEngineVersions, "/v1/engines/{1}/releases", Get);
55+
56+
METHOD_ADD(Engines::GetEngineVariants, "/{1}/releases/{2}", Get);
57+
ADD_METHOD_TO(Engines::GetEngineVariants, "/v1/engines/{1}/releases/{2}",
58+
Get);
59+
60+
METHOD_ADD(Engines::GetLatestEngineVersion, "/{1}/releases/latest", Get);
61+
ADD_METHOD_TO(Engines::GetLatestEngineVersion,
62+
"/v1/engines/{1}/releases/latest", Get);
63+
5164
METHOD_LIST_END
5265

5366
explicit Engines(std::shared_ptr<EngineService> engine_service)
5467
: engine_service_{engine_service} {}
5568

56-
void ListEngine(const HttpRequestPtr& req,
57-
std::function<void(const HttpResponsePtr&)>&& callback) const;
69+
void InstallEngine(const HttpRequestPtr& req,
70+
std::function<void(const HttpResponsePtr&)>&& callback,
71+
const std::string& engine);
5872

5973
void UninstallEngine(const HttpRequestPtr& req,
6074
std::function<void(const HttpResponsePtr&)>&& callback,
61-
const std::string& engine,
62-
const std::optional<std::string> version,
63-
const std::optional<std::string> variant);
75+
const std::string& engine);
76+
77+
void ListEngine(const HttpRequestPtr& req,
78+
std::function<void(const HttpResponsePtr&)>&& callback) const;
6479

6580
void GetEngineVersions(const HttpRequestPtr& req,
6681
std::function<void(const HttpResponsePtr&)>&& callback,
@@ -71,12 +86,6 @@ class Engines : public drogon::HttpController<Engines, false> {
7186
const std::string& engine,
7287
const std::string& version) const;
7388

74-
void InstallEngine(const HttpRequestPtr& req,
75-
std::function<void(const HttpResponsePtr&)>&& callback,
76-
const std::string& engine,
77-
const std::optional<std::string> version,
78-
const std::optional<std::string> variant_name);
79-
8089
void GetInstalledEngineVariants(
8190
const HttpRequestPtr& req,
8291
std::function<void(const HttpResponsePtr&)>&& callback,
@@ -94,8 +103,7 @@ class Engines : public drogon::HttpController<Engines, false> {
94103
void SetDefaultEngineVariant(
95104
const HttpRequestPtr& req,
96105
std::function<void(const HttpResponsePtr&)>&& callback,
97-
const std::string& engine, const std::string& version,
98-
const std::string& variant);
106+
const std::string& engine);
99107

100108
void GetDefaultEngineVariant(
101109
const HttpRequestPtr& req,

engine/e2e-test/test_api_engine_install.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,19 @@ 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/v1/engines/llama-cpp")
21+
response = requests.post("http://localhost:3928/v1/engines/llama-cpp/install")
2222
assert response.status_code == 200
2323

2424
def test_engines_install_llamacpp_specific_version_and_variant(self):
25+
data = {"version": "v0.1.35-27.10.24", "variant": "linux-amd64-avx-cuda-11-7"}
2526
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+
"http://localhost:3928/v1/engines/llama-cpp/install", json=data
2728
)
2829
assert response.status_code == 200
2930

3031
def test_engines_install_llamacpp_specific_version_and_null_variant(self):
32+
data = {"version": "v0.1.35-27.10.24"}
3133
response = requests.post(
32-
"http://localhost:3928/v1/engines/llama-cpp?version=v0.1.35-27.10.24"
34+
"http://localhost:3928/v1/engines/llama-cpp/install", json=data
3335
)
3436
assert response.status_code == 200

0 commit comments

Comments
 (0)