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

Commit 0255f3d

Browse files
fix: improve remote engine (#1787)
* fix: improve streaming message for remote engine * feat: improve remote engine * chore: cleanup * fix: correct remote engine check * chore: add unit tests * fix: cleanup * chore: cleanup --------- Co-authored-by: vansangpfiev <sang@jan.ai>
1 parent bb97612 commit 0255f3d

File tree

19 files changed

+332
-346
lines changed

19 files changed

+332
-346
lines changed

engine/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,6 @@ add_executable(${TARGET_NAME} main.cc
144144
${CMAKE_CURRENT_SOURCE_DIR}/utils/file_logger.cc
145145
${CMAKE_CURRENT_SOURCE_DIR}/utils/dylib_path_manager.cc
146146
${CMAKE_CURRENT_SOURCE_DIR}/extensions/remote-engine/remote_engine.cc
147-
${CMAKE_CURRENT_SOURCE_DIR}/extensions/remote-engine/openai_engine.cc
148-
${CMAKE_CURRENT_SOURCE_DIR}/extensions/remote-engine/anthropic_engine.cc
149147
${CMAKE_CURRENT_SOURCE_DIR}/extensions/remote-engine/template_renderer.cc
150148
)
151149

engine/cli/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@ add_executable(${TARGET_NAME} main.cc
8484
${CMAKE_CURRENT_SOURCE_DIR}/../services/inference_service.cc
8585
${CMAKE_CURRENT_SOURCE_DIR}/../services/hardware_service.cc
8686
${CMAKE_CURRENT_SOURCE_DIR}/../extensions/remote-engine/remote_engine.cc
87-
${CMAKE_CURRENT_SOURCE_DIR}/../extensions/remote-engine/openai_engine.cc
88-
${CMAKE_CURRENT_SOURCE_DIR}/../extensions/remote-engine/anthropic_engine.cc
8987
${CMAKE_CURRENT_SOURCE_DIR}/../extensions/remote-engine/template_renderer.cc
9088
${CMAKE_CURRENT_SOURCE_DIR}/utils/easywsclient.cc
9189
${CMAKE_CURRENT_SOURCE_DIR}/utils/download_progress.cc

engine/common/engine_servicei.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,6 @@ class EngineServiceI {
5858
GetEngineByNameAndVariant(
5959
const std::string& engine_name,
6060
const std::optional<std::string> variant = std::nullopt) = 0;
61+
62+
virtual bool IsRemoteEngine(const std::string& engine_name) = 0;
6163
};

engine/config/model_config.h

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,52 +8,12 @@
88
#include <stdexcept>
99
#include <string>
1010
#include <vector>
11+
#include "config/remote_template.h"
1112
#include "utils/format_utils.h"
1213
#include "utils/remote_models_utils.h"
1314

1415
namespace config {
1516

16-
namespace {
17-
const std::string kOpenAITransformReqTemplate =
18-
R"({ {% set first = true %} {% for key, value in input_request %} {% if key == \"messages\" or key == \"model\" or key == \"temperature\" or key == \"store\" or key == \"max_tokens\" or key == \"stream\" or key == \"presence_penalty\" or key == \"metadata\" or key == \"frequency_penalty\" or key == \"tools\" or key == \"tool_choice\" or key == \"logprobs\" or key == \"top_logprobs\" or key == \"logit_bias\" or key == \"n\" or key == \"modalities\" or key == \"prediction\" or key == \"response_format\" or key == \"service_tier\" or key == \"seed\" or key == \"stop\" or key == \"stream_options\" or key == \"top_p\" or key == \"parallel_tool_calls\" or key == \"user\" %} {% if not first %},{% endif %} \"{{ key }}\": {{ tojson(value) }} {% set first = false %} {% endif %} {% endfor %} })";
19-
const std::string kOpenAITransformRespTemplate =
20-
R"({ {%- set first = true -%} {%- for key, value in input_request -%} {%- if key == \"id\" or key == \"choices\" or key == \"created\" or key == \"model\" or key == \"service_tier\" or key == \"system_fingerprint\" or key == \"object\" or key == \"usage\" -%} {%- if not first -%},{%- endif -%} \"{{ key }}\": {{ tojson(value) }} {%- set first = false -%} {%- endif -%} {%- endfor -%} })";
21-
const std::string kAnthropicTransformReqTemplate =
22-
R"({ {% set first = true %} {% for key, value in input_request %} {% if key == \"system\" or key == \"messages\" or key == \"model\" or key == \"temperature\" or key == \"store\" or key == \"max_tokens\" or key == \"stream\" or key == \"presence_penalty\" or key == \"metadata\" or key == \"frequency_penalty\" or key == \"tools\" or key == \"tool_choice\" or key == \"logprobs\" or key == \"top_logprobs\" or key == \"logit_bias\" or key == \"n\" or key == \"modalities\" or key == \"prediction\" or key == \"response_format\" or key == \"service_tier\" or key == \"seed\" or key == \"stop\" or key == \"stream_options\" or key == \"top_p\" or key == \"parallel_tool_calls\" or key == \"user\" %} {% if not first %},{% endif %} \"{{ key }}\": {{ tojson(value) }} {% set first = false %} {% endif %} {% endfor %} })";
23-
const std::string kAnthropicTransformRespTemplate = R"({
24-
"id": "{{ input_request.id }}",
25-
"created": null,
26-
"object": "chat.completion",
27-
"model": "{{ input_request.model }}",
28-
"choices": [
29-
{
30-
"index": 0,
31-
"message": {
32-
"role": "{{ input_request.role }}",
33-
"content": "{% if input_request.content and input_request.content.0.type == "text" %} {{input_request.content.0.text}} {% endif %}",
34-
"refusal": null
35-
},
36-
"logprobs": null,
37-
"finish_reason": "{{ input_request.stop_reason }}"
38-
}
39-
],
40-
"usage": {
41-
"prompt_tokens": {{ input_request.usage.input_tokens }},
42-
"completion_tokens": {{ input_request.usage.output_tokens }},
43-
"total_tokens": {{ input_request.usage.input_tokens + input_request.usage.output_tokens }},
44-
"prompt_tokens_details": {
45-
"cached_tokens": 0
46-
},
47-
"completion_tokens_details": {
48-
"reasoning_tokens": 0,
49-
"accepted_prediction_tokens": 0,
50-
"rejected_prediction_tokens": 0
51-
}
52-
},
53-
"system_fingerprint": "fp_6b68a8204b"
54-
})";
55-
} // namespace
56-
5717
struct RemoteModelConfig {
5818
std::string model;
5919
std::string api_key_template;
@@ -108,6 +68,7 @@ struct RemoteModelConfig {
10868
kOpenAITransformRespTemplate;
10969
}
11070
}
71+
11172
metadata = json.get("metadata", metadata);
11273
}
11374

engine/config/remote_template.h

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include <string>
2+
3+
namespace config {
4+
const std::string kOpenAITransformReqTemplate =
5+
R"({ {% set first = true %} {% for key, value in input_request %} {% if key == "messages" or key == "model" or key == "temperature" or key == "store" or key == "max_tokens" or key == "stream" or key == "presence_penalty" or key == "metadata" or key == "frequency_penalty" or key == "tools" or key == "tool_choice" or key == "logprobs" or key == "top_logprobs" or key == "logit_bias" or key == "n" or key == "modalities" or key == "prediction" or key == "response_format" or key == "service_tier" or key == "seed" or key == "stop" or key == "stream_options" or key == "top_p" or key == "parallel_tool_calls" or key == "user" %} {% if not first %},{% endif %} "{{ key }}": {{ tojson(value) }} {% set first = false %} {% endif %} {% endfor %} })";
6+
const std::string kOpenAITransformRespTemplate =
7+
R"({ {%- set first = true -%} {%- for key, value in input_request -%} {%- if key == "id" or key == "choices" or key == "created" or key == "model" or key == "service_tier" or key == "system_fingerprint" or key == "object" or key == "usage" -%} {%- if not first -%},{%- endif -%} "{{ key }}": {{ tojson(value) }} {%- set first = false -%} {%- endif -%} {%- endfor -%} })";
8+
const std::string kAnthropicTransformReqTemplate =
9+
R"({
10+
{% for key, value in input_request %}
11+
{% if key == "messages" %}
12+
{% if input_request.messages.0.role == "system" %}
13+
"system": "{{ input_request.messages.0.content }}",
14+
"messages": [
15+
{% for message in input_request.messages %}
16+
{% if not loop.is_first %}
17+
{"role": "{{ message.role }}", "content": "{{ message.content }}" } {% if not loop.is_last %},{% endif %}
18+
{% endif %}
19+
{% endfor %}
20+
]
21+
{% else %}
22+
"messages": [
23+
{% for message in input_request.messages %}
24+
{"role": " {{ message.role}}", "content": "{{ message.content }}" } {% if not loop.is_last %},{% endif %}
25+
{% endfor %}
26+
]
27+
{% endif %}
28+
{% else if key == "system" or key == "model" or key == "temperature" or key == "store" or key == "max_tokens" or key == "stream" or key == "presence_penalty" or key == "metadata" or key == "frequency_penalty" or key == "tools" or key == "tool_choice" or key == "logprobs" or key == "top_logprobs" or key == "logit_bias" or key == "n" or key == "modalities" or key == "prediction" or key == "response_format" or key == "service_tier" or key == "seed" or key == "stop" or key == "stream_options" or key == "top_p" or key == "parallel_tool_calls" or key == "user" %}
29+
"{{ key }}": {{ tojson(value) }}
30+
{% endif %}
31+
{% if not loop.is_last %},{% endif %}
32+
{% endfor %} })";
33+
const std::string kAnthropicTransformRespTemplate = R"({
34+
"id": "{{ input_request.id }}",
35+
"created": null,
36+
"object": "chat.completion",
37+
"model": "{{ input_request.model }}",
38+
"choices": [
39+
{
40+
"index": 0,
41+
"message": {
42+
"role": "{{ input_request.role }}",
43+
"content": "{% if input_request.content and input_request.content.0.type == "text" %} {{input_request.content.0.text}} {% endif %}",
44+
"refusal": null
45+
},
46+
"logprobs": null,
47+
"finish_reason": "{{ input_request.stop_reason }}"
48+
}
49+
],
50+
"usage": {
51+
"prompt_tokens": {{ input_request.usage.input_tokens }},
52+
"completion_tokens": {{ input_request.usage.output_tokens }},
53+
"total_tokens": {{ input_request.usage.input_tokens + input_request.usage.output_tokens }},
54+
"prompt_tokens_details": {
55+
"cached_tokens": 0
56+
},
57+
"completion_tokens_details": {
58+
"reasoning_tokens": 0,
59+
"accepted_prediction_tokens": 0,
60+
"rejected_prediction_tokens": 0
61+
}
62+
},
63+
"system_fingerprint": "fp_6b68a8204b"
64+
})";
65+
66+
} // namespace config

engine/controllers/models.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ void Models::ListModel(
200200
.string());
201201
auto model_config = yaml_handler.GetModelConfig();
202202

203-
if (!remote_engine::IsRemoteEngine(model_config.engine)) {
203+
if (!engine_service_->IsRemoteEngine(model_config.engine)) {
204204
Json::Value obj = model_config.ToJson();
205205
obj["id"] = model_entry.model;
206206
obj["model"] = model_entry.model;
@@ -632,7 +632,7 @@ void Models::GetRemoteModels(
632632
const HttpRequestPtr& req,
633633
std::function<void(const HttpResponsePtr&)>&& callback,
634634
const std::string& engine_id) {
635-
if (!remote_engine::IsRemoteEngine(engine_id)) {
635+
if (!engine_service_->IsRemoteEngine(engine_id)) {
636636
Json::Value ret;
637637
ret["message"] = "Not a remote engine: " + engine_id;
638638
auto resp = cortex_utils::CreateCortexHttpJsonResponse(ret);
@@ -668,8 +668,7 @@ void Models::AddRemoteModel(
668668

669669
auto model_handle = (*(req->getJsonObject())).get("model", "").asString();
670670
auto engine_name = (*(req->getJsonObject())).get("engine", "").asString();
671-
/* To do: uncomment when remote engine is ready
672-
671+
673672
auto engine_validate = engine_service_->IsEngineReady(engine_name);
674673
if (engine_validate.has_error()) {
675674
Json::Value ret;
@@ -679,6 +678,7 @@ void Models::AddRemoteModel(
679678
callback(resp);
680679
return;
681680
}
681+
682682
if (!engine_validate.value()) {
683683
Json::Value ret;
684684
ret["message"] = "Engine is not ready! Please install first!";
@@ -687,7 +687,7 @@ void Models::AddRemoteModel(
687687
callback(resp);
688688
return;
689689
}
690-
*/
690+
691691
config::RemoteModelConfig model_config;
692692
model_config.LoadFromJson(*(req->getJsonObject()));
693693
cortex::db::Models modellist_utils_obj;

engine/extensions/remote-engine/anthropic_engine.cc

Lines changed: 0 additions & 62 deletions
This file was deleted.

engine/extensions/remote-engine/anthropic_engine.h

Lines changed: 0 additions & 13 deletions
This file was deleted.

engine/extensions/remote-engine/openai_engine.cc

Lines changed: 0 additions & 54 deletions
This file was deleted.

engine/extensions/remote-engine/openai_engine.h

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)