Skip to content

Commit eb7cf15

Browse files
authored
server : add /apply-template endpoint for additional use cases of Minja functionality (#11489)
* add /apply-template endpoint to server * remove unnecessary line * add /apply-template documentation * return only "prompt" field in /apply-template * use suggested idea instead of my overly verbose way
1 parent 66ee4f2 commit eb7cf15

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

examples/server/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,14 @@ With input 'á' (utf8 hex: C3 A1) on tinyllama/stories260k
576576

577577
`tokens`: Set the tokens to detokenize.
578578

579+
### POST `/apply-template`: Apply chat template to a conversation
580+
581+
Uses the server's prompt template formatting functionality to convert chat messages to a single string expected by a chat model as input, but does not perform inference. Instead, the prompt string is returned in the `prompt` field of the JSON response. The prompt can then be modified as desired (for example, to insert "Sure!" at the beginning of the model's response) before sending to `/completion` to generate the chat response.
582+
583+
*Options:*
584+
585+
`messages`: (Required) Chat turns in the same format as `/v1/chat/completions`.
586+
579587
### POST `/embedding`: Generate embedding of a given text
580588

581589
> [!IMPORTANT]

examples/server/server.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4124,6 +4124,14 @@ int main(int argc, char ** argv) {
41244124
res_ok(res, root);
41254125
};
41264126

4127+
const auto handle_apply_template = [&ctx_server, &params, &res_ok](const httplib::Request & req, httplib::Response & res) {
4128+
auto body = json::parse(req.body);
4129+
const auto & chat_template = body.contains("tools") && ctx_server.chat_templates.template_tool_use ? *ctx_server.chat_templates.template_tool_use : *ctx_server.chat_templates.template_default;
4130+
json data = oaicompat_completion_params_parse(body, chat_template, params.use_jinja);
4131+
4132+
res_ok(res, {{ "prompt", data.at("prompt") }});
4133+
};
4134+
41274135
const auto handle_embeddings = [&handle_embeddings_impl](const httplib::Request & req, httplib::Response & res) {
41284136
handle_embeddings_impl(req, res, OAICOMPAT_TYPE_NONE);
41294137
};
@@ -4300,6 +4308,7 @@ int main(int argc, char ** argv) {
43004308
svr->Post("/v1/reranking", handle_rerank);
43014309
svr->Post("/tokenize", handle_tokenize);
43024310
svr->Post("/detokenize", handle_detokenize);
4311+
svr->Post("/apply-template", handle_apply_template);
43034312
// LoRA adapters hotswap
43044313
svr->Get ("/lora-adapters", handle_lora_adapters_list);
43054314
svr->Post("/lora-adapters", handle_lora_adapters_apply);

examples/server/tests/unit/test_chat_completion.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,21 @@ def test_chat_template():
121121
assert res.body["__verbose"]["prompt"] == "<s> <|start_header_id|>system<|end_header_id|>\n\nBook<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nWhat is the best book<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n"
122122

123123

124+
def test_apply_chat_template():
125+
global server
126+
server.chat_template = "command-r"
127+
server.start()
128+
res = server.make_request("POST", "/apply-template", data={
129+
"messages": [
130+
{"role": "system", "content": "You are a test."},
131+
{"role": "user", "content":"Hi there"},
132+
]
133+
})
134+
assert res.status_code == 200
135+
assert "prompt" in res.body
136+
assert res.body["prompt"] == "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>You are a test.<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|>Hi there<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>"
137+
138+
124139
@pytest.mark.parametrize("response_format,n_predicted,re_content", [
125140
({"type": "json_object", "schema": {"const": "42"}}, 6, "\"42\""),
126141
({"type": "json_object", "schema": {"items": [{"type": "integer"}]}}, 10, "[ -3000 ]"),

0 commit comments

Comments
 (0)