Skip to content

Commit a970acf

Browse files
committed
fix(server): preserve delimiters in string metadata overrides
1 parent 1652066 commit a970acf

3 files changed

Lines changed: 62 additions & 2 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
- fix(server): preserve delimiters in string metadata overrides by @allenflux
11+
1012
## [0.3.36]
1113

1214
- feat: update llama.cpp to ggml-org/llama.cpp@0c1e57098

‎llama_cpp/server/model.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,9 @@ def load_llama_from_model_settings(settings: ModelSettings) -> llama_cpp.Llama:
236236
assert isinstance(settings.kv_overrides, list)
237237
kv_overrides = {}
238238
for kv in settings.kv_overrides:
239-
key, value = kv.split("=")
239+
key, value = kv.split("=", 1)
240240
if ":" in value:
241-
value_type, value = value.split(":")
241+
value_type, value = value.split(":", 1)
242242
if value_type == "bool":
243243
kv_overrides[key] = value.lower() in ["true", "1"]
244244
elif value_type == "int":

‎tests/test_server_model.py‎

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from unittest.mock import Mock
2+
3+
import pytest
4+
5+
import llama_cpp
6+
from llama_cpp.server.model import LlamaProxy
7+
from llama_cpp.server.settings import ModelSettings
8+
9+
10+
@pytest.mark.parametrize(
11+
"value",
12+
[
13+
"user: ",
14+
"{{ messages[0]['role'] == 'user' }}",
15+
"user: name=value",
16+
"",
17+
":",
18+
"=",
19+
"用户: name=value",
20+
],
21+
)
22+
def test_server_kv_overrides_preserve_string_values(monkeypatch, value):
23+
create_model = Mock()
24+
monkeypatch.setattr(llama_cpp, "Llama", create_model)
25+
settings = ModelSettings(
26+
model="unused.gguf",
27+
kv_overrides=[f"tokenizer.chat_template=str:{value}"],
28+
)
29+
30+
result = LlamaProxy.load_llama_from_model_settings(settings)
31+
32+
assert result is create_model.return_value
33+
assert create_model.call_args.kwargs["kv_overrides"] == {
34+
"tokenizer.chat_template": value
35+
}
36+
37+
38+
def test_server_kv_overrides_preserve_numeric_and_bool_values(monkeypatch):
39+
create_model = Mock()
40+
monkeypatch.setattr(llama_cpp, "Llama", create_model)
41+
settings = ModelSettings(
42+
model="unused.gguf",
43+
kv_overrides=[
44+
"tokenizer.ggml.add_bos_token=bool:true",
45+
"tokenizer.ggml.add_eos_token=bool:false",
46+
"llama.context_length=int:2048",
47+
"llama.rope.freq_base=float:10000.5",
48+
],
49+
)
50+
51+
LlamaProxy.load_llama_from_model_settings(settings)
52+
53+
assert create_model.call_args.kwargs["kv_overrides"] == {
54+
"tokenizer.ggml.add_bos_token": True,
55+
"tokenizer.ggml.add_eos_token": False,
56+
"llama.context_length": 2048,
57+
"llama.rope.freq_base": 10000.5,
58+
}

0 commit comments

Comments
 (0)