@modular-prompt/driver 0.16.0 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -10
- package/dist/cache-controller.d.ts +4 -0
- package/dist/cache-controller.d.ts.map +1 -1
- package/dist/driver-registry/config-based-factory.d.ts +3 -0
- package/dist/driver-registry/config-based-factory.d.ts.map +1 -1
- package/dist/driver-registry/config-based-factory.js +8 -1
- package/dist/driver-registry/config-based-factory.js.map +1 -1
- package/dist/driver-registry/factory-helper.d.ts.map +1 -1
- package/dist/driver-registry/factory-helper.js +9 -2
- package/dist/driver-registry/factory-helper.js.map +1 -1
- package/dist/driver-registry/index.d.ts +1 -1
- package/dist/driver-registry/index.d.ts.map +1 -1
- package/dist/driver-registry/types.d.ts +15 -1
- package/dist/driver-registry/types.d.ts.map +1 -1
- package/dist/formatter/converter.d.ts.map +1 -1
- package/dist/formatter/converter.js +31 -2
- package/dist/formatter/converter.js.map +1 -1
- package/dist/google-genai/google-genai-driver.d.ts +1 -0
- package/dist/google-genai/google-genai-driver.d.ts.map +1 -1
- package/dist/google-genai/google-genai-driver.js +36 -27
- package/dist/google-genai/google-genai-driver.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/local-inference/adapters.d.ts +6 -0
- package/dist/local-inference/adapters.d.ts.map +1 -1
- package/dist/local-inference/driver.d.ts.map +1 -1
- package/dist/local-inference/driver.js +45 -24
- package/dist/local-inference/driver.js.map +1 -1
- package/dist/local-inference/process-client.d.ts +4 -2
- package/dist/local-inference/process-client.d.ts.map +1 -1
- package/dist/local-inference/process-client.js +24 -8
- package/dist/local-inference/process-client.js.map +1 -1
- package/dist/local-inference/process-communication.d.ts +9 -2
- package/dist/local-inference/process-communication.d.ts.map +1 -1
- package/dist/local-inference/process-communication.js +37 -5
- package/dist/local-inference/process-communication.js.map +1 -1
- package/dist/local-inference/protocol.d.ts +4 -0
- package/dist/local-inference/protocol.d.ts.map +1 -1
- package/dist/local-inference/request-queue.d.ts +1 -1
- package/dist/local-inference/request-queue.d.ts.map +1 -1
- package/dist/local-inference/request-queue.js +26 -7
- package/dist/local-inference/request-queue.js.map +1 -1
- package/dist/local-inference/stream-utils.d.ts +6 -0
- package/dist/local-inference/stream-utils.d.ts.map +1 -1
- package/dist/local-inference/stream-utils.js.map +1 -1
- package/dist/mlx-ml/mlx-cache-controller.d.ts +9 -0
- package/dist/mlx-ml/mlx-cache-controller.d.ts.map +1 -1
- package/dist/mlx-ml/mlx-cache-controller.js +158 -33
- package/dist/mlx-ml/mlx-cache-controller.js.map +1 -1
- package/dist/mlx-ml/mlx-cache-support.d.ts +2 -2
- package/dist/mlx-ml/mlx-cache-support.d.ts.map +1 -1
- package/dist/mlx-ml/mlx-cache-support.js +8 -3
- package/dist/mlx-ml/mlx-cache-support.js.map +1 -1
- package/dist/mlx-ml/mlx-driver.d.ts +0 -1
- package/dist/mlx-ml/mlx-driver.d.ts.map +1 -1
- package/dist/mlx-ml/mlx-driver.js +1 -8
- package/dist/mlx-ml/mlx-driver.js.map +1 -1
- package/dist/mlx-ml/process/index.d.ts +1 -1
- package/dist/mlx-ml/process/index.d.ts.map +1 -1
- package/dist/mlx-ml/process/index.js +2 -2
- package/dist/mlx-ml/process/index.js.map +1 -1
- package/dist/models-config/index.d.ts +1 -1
- package/dist/models-config/index.d.ts.map +1 -1
- package/dist/models-config/index.js +1 -1
- package/dist/models-config/index.js.map +1 -1
- package/dist/models-config/resolve.d.ts +9 -1
- package/dist/models-config/resolve.d.ts.map +1 -1
- package/dist/models-config/resolve.js +94 -2
- package/dist/models-config/resolve.js.map +1 -1
- package/dist/models-config/types.d.ts +3 -1
- package/dist/models-config/types.d.ts.map +1 -1
- package/dist/pytorch/process/index.d.ts +4 -2
- package/dist/pytorch/process/index.d.ts.map +1 -1
- package/dist/pytorch/process/index.js +24 -7
- package/dist/pytorch/process/index.js.map +1 -1
- package/dist/pytorch/pytorch-cache-controller.d.ts +84 -0
- package/dist/pytorch/pytorch-cache-controller.d.ts.map +1 -0
- package/dist/pytorch/pytorch-cache-controller.js +742 -0
- package/dist/pytorch/pytorch-cache-controller.js.map +1 -0
- package/dist/pytorch/pytorch-cache-support.d.ts +23 -0
- package/dist/pytorch/pytorch-cache-support.d.ts.map +1 -0
- package/dist/pytorch/pytorch-cache-support.js +47 -0
- package/dist/pytorch/pytorch-cache-support.js.map +1 -0
- package/dist/pytorch/pytorch-driver.d.ts +8 -1
- package/dist/pytorch/pytorch-driver.d.ts.map +1 -1
- package/dist/pytorch/pytorch-driver.js +40 -0
- package/dist/pytorch/pytorch-driver.js.map +1 -1
- package/dist/runtime/check.d.ts.map +1 -1
- package/dist/runtime/check.js +8 -6
- package/dist/runtime/check.js.map +1 -1
- package/dist/runtime/index.d.ts +2 -2
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +2 -2
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/manifest-core.d.mts +1 -0
- package/dist/runtime/manifest-core.mjs +1 -0
- package/dist/runtime/manifest-core.mjs.map +1 -1
- package/dist/runtime/manifest.d.ts +2 -0
- package/dist/runtime/manifest.d.ts.map +1 -1
- package/dist/runtime/manifest.js.map +1 -1
- package/dist/runtime/paths-core.d.mts +15 -1
- package/dist/runtime/paths-core.d.mts.map +1 -1
- package/dist/runtime/paths-core.mjs +50 -5
- package/dist/runtime/paths-core.mjs.map +1 -1
- package/dist/runtime/paths.d.ts +2 -2
- package/dist/runtime/paths.d.ts.map +1 -1
- package/dist/runtime/paths.js +2 -2
- package/dist/runtime/paths.js.map +1 -1
- package/dist/runtime/pytorch-template-core.d.mts +11 -0
- package/dist/runtime/pytorch-template-core.d.mts.map +1 -0
- package/dist/runtime/pytorch-template-core.mjs +54 -0
- package/dist/runtime/pytorch-template-core.mjs.map +1 -0
- package/dist/runtime/setup-commands-core.d.mts +3 -0
- package/dist/runtime/setup-commands-core.d.mts.map +1 -1
- package/dist/runtime/setup-commands-core.mjs +4 -0
- package/dist/runtime/setup-commands-core.mjs.map +1 -1
- package/dist/runtime/setup-commands.d.ts +1 -1
- package/dist/runtime/setup-commands.d.ts.map +1 -1
- package/dist/runtime/setup-commands.js +1 -1
- package/dist/runtime/setup-commands.js.map +1 -1
- package/dist/vertexai/vertexai-driver.d.ts +6 -0
- package/dist/vertexai/vertexai-driver.d.ts.map +1 -1
- package/dist/vertexai/vertexai-driver.js +106 -36
- package/dist/vertexai/vertexai-driver.js.map +1 -1
- package/docs/DRIVER_API.md +455 -0
- package/docs/LOCAL_MODEL_SETUP.md +765 -0
- package/docs/mlx-api-selection.md +301 -0
- package/package.json +10 -6
- package/scripts/runtime-cli.bin.test.ts +142 -0
- package/scripts/runtime-cli.js +305 -35
- package/scripts/runtime-cli.test.ts +163 -0
- package/skills/driver-usage/SKILL.md +29 -0
- package/src/mlx-ml/python/__main__.py +1 -1
- package/src/mlx-ml/python/backends/base.py +88 -18
- package/src/mlx-ml/python/backends/mlx_lm.py +28 -3
- package/src/mlx-ml/python/backends/mlx_vlm.py +679 -2
- package/src/mlx-ml/python/handlers/cache.py +4 -0
- package/src/mlx-ml/python/handlers/generate.py +33 -10
- package/src/mlx-ml/python/handlers/tokenize.py +1 -4
- package/src/mlx-ml/python/pyproject.toml +2 -2
- package/src/mlx-ml/python/server.py +2 -0
- package/src/mlx-ml/python/uv.lock +12 -12
- package/src/pytorch/templates/cpu-minimal/backends/base.py +139 -0
- package/src/pytorch/templates/cpu-minimal/backends/transformers_lm.py +1167 -0
- package/src/pytorch/{python → templates/cpu-minimal}/handlers/__init__.py +1 -0
- package/src/pytorch/templates/cpu-minimal/handlers/cache.py +88 -0
- package/src/pytorch/templates/cpu-minimal/handlers/generate.py +157 -0
- package/src/pytorch/{python → templates/cpu-minimal}/pyproject.toml +2 -2
- package/src/pytorch/{python → templates/cpu-minimal}/server.py +20 -2
- package/src/pytorch/templates/cpu-minimal/tests/test_cache_handler.py +284 -0
- package/src/pytorch/templates/cpu-minimal/tests/test_capabilities.py +14 -0
- package/src/pytorch/templates/cpu-minimal/tests/test_server.py +141 -0
- package/src/pytorch/templates/cpu-minimal/tests/test_transformers_errors.py +89 -0
- package/src/pytorch/templates/cpu-minimal/tests/test_transformers_lm_cache.py +554 -0
- package/src/pytorch/templates/cpu-minimal/utils/__init__.py +0 -0
- package/src/pytorch/{python → templates/cpu-minimal}/utils/token_utils.py +2 -2
- package/src/pytorch/templates/cpu-minimal/utils/transformers_errors.py +54 -0
- package/src/pytorch/{python → templates/cpu-minimal}/uv.lock +149 -109
- package/src/pytorch/templates/cuda/__main__.py +19 -0
- package/src/pytorch/templates/cuda/backends/__init__.py +3 -0
- package/src/pytorch/{python → templates/cuda}/backends/base.py +54 -6
- package/src/pytorch/templates/cuda/backends/transformers_lm.py +379 -0
- package/src/pytorch/templates/cuda/handlers/__init__.py +7 -0
- package/src/pytorch/templates/cuda/handlers/cache.py +93 -0
- package/src/pytorch/templates/cuda/handlers/cancel.py +53 -0
- package/src/pytorch/templates/cuda/handlers/capabilities.py +6 -0
- package/src/pytorch/templates/cuda/handlers/completion.py +15 -0
- package/src/pytorch/templates/cuda/handlers/format_test.py +70 -0
- package/src/pytorch/templates/cuda/handlers/generate.py +152 -0
- package/src/pytorch/templates/cuda/handlers/render.py +40 -0
- package/src/pytorch/templates/cuda/handlers/tokenize.py +63 -0
- package/src/pytorch/templates/cuda/pyproject.toml +37 -0
- package/src/pytorch/templates/cuda/server.py +158 -0
- package/src/pytorch/templates/cuda/tests/__init__.py +0 -0
- package/src/pytorch/templates/cuda/tests/test_cache_handler.py +207 -0
- package/src/pytorch/templates/cuda/tests/test_capabilities.py +14 -0
- package/src/pytorch/templates/cuda/tests/test_server.py +145 -0
- package/src/pytorch/templates/cuda/tests/test_transformers_errors.py +89 -0
- package/src/pytorch/templates/cuda/tests/test_transformers_lm_cache.py +288 -0
- package/src/pytorch/templates/cuda/utils/__init__.py +0 -0
- package/src/pytorch/templates/cuda/utils/chat_template_constraints.py +164 -0
- package/src/pytorch/templates/cuda/utils/prompt_builder.py +54 -0
- package/src/pytorch/templates/cuda/utils/template_render.py +80 -0
- package/src/pytorch/templates/cuda/utils/token_utils.py +376 -0
- package/src/pytorch/templates/cuda/utils/transformers_errors.py +54 -0
- package/src/pytorch/templates/cuda/uv.lock +734 -0
- package/src/pytorch/python/backends/transformers_lm.py +0 -127
- package/src/pytorch/python/handlers/generate.py +0 -68
- /package/src/pytorch/{python → templates/cpu-minimal}/__main__.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/backends/__init__.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/cancel.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/capabilities.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/completion.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/format_test.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/render.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/tokenize.py +0 -0
- /package/src/pytorch/{python/utils → templates/cpu-minimal/tests}/__init__.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/utils/chat_template_constraints.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/utils/prompt_builder.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/utils/template_render.py +0 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from types import SimpleNamespace
|
|
3
|
+
from unittest.mock import MagicMock, patch
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class _Tokenizer:
|
|
7
|
+
bos_token = "<bos>"
|
|
8
|
+
chat_template = "template"
|
|
9
|
+
|
|
10
|
+
def apply_chat_template(self, messages, **kwargs):
|
|
11
|
+
del messages, kwargs
|
|
12
|
+
return "prefix"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class _Backend:
|
|
16
|
+
model_kind = "lm"
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
self.tokenizer = _Tokenizer()
|
|
20
|
+
self.cache = None
|
|
21
|
+
self.generate_prompt = None
|
|
22
|
+
self.pending_cache_write_tokens = 0
|
|
23
|
+
|
|
24
|
+
def get_tokenizer(self):
|
|
25
|
+
return self.tokenizer
|
|
26
|
+
|
|
27
|
+
def cache_prefill(self, cache_path, prompt, **kwargs):
|
|
28
|
+
del prompt, kwargs
|
|
29
|
+
self.cache = object()
|
|
30
|
+
self.pending_cache_write_tokens = 2
|
|
31
|
+
return {
|
|
32
|
+
"cache_path": cache_path,
|
|
33
|
+
"token_count": 2,
|
|
34
|
+
"cache_write_tokens": 2,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
def load_cache_from_file(self, cache_path, **kwargs):
|
|
38
|
+
del kwargs
|
|
39
|
+
return self.cache if cache_path == "memory://prefix" else None
|
|
40
|
+
|
|
41
|
+
def get_cache_offset(self, prompt_cache):
|
|
42
|
+
return 2 if prompt_cache is self.cache else 0
|
|
43
|
+
|
|
44
|
+
def consume_cache_write_tokens(self, cache_path):
|
|
45
|
+
del cache_path
|
|
46
|
+
result = self.pending_cache_write_tokens
|
|
47
|
+
self.pending_cache_write_tokens = 0
|
|
48
|
+
return result
|
|
49
|
+
|
|
50
|
+
def tokenize_prompt(self, prompt):
|
|
51
|
+
assert prompt == "prefix suffix"
|
|
52
|
+
return [1, 2, 3]
|
|
53
|
+
|
|
54
|
+
def stream_generate(self, prompt, options, images=None, prompt_cache=None):
|
|
55
|
+
del options, images
|
|
56
|
+
self.generate_prompt = prompt
|
|
57
|
+
assert prompt_cache is self.cache
|
|
58
|
+
yield SimpleNamespace(
|
|
59
|
+
text="ok",
|
|
60
|
+
prompt_tokens=3,
|
|
61
|
+
generation_tokens=1,
|
|
62
|
+
cache_read_tokens=2,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _make_server():
|
|
67
|
+
from server import Server
|
|
68
|
+
|
|
69
|
+
backend = MagicMock()
|
|
70
|
+
return Server(backend, {"methods": ["capabilities"], "model_kind": "lm"})
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_cache_prefill_dispatches_to_handler(capsys):
|
|
74
|
+
server = _make_server()
|
|
75
|
+
|
|
76
|
+
with patch("server.handle_cache_prefill") as mock_prefill:
|
|
77
|
+
server._dispatch(
|
|
78
|
+
{
|
|
79
|
+
"method": "cache_prefill",
|
|
80
|
+
"cache_path": "memory://prefix",
|
|
81
|
+
"messages": [{"role": "user", "content": "hello"}],
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
mock_prefill.assert_called_once()
|
|
86
|
+
assert mock_prefill.call_args.args[2:] == (
|
|
87
|
+
"memory://prefix",
|
|
88
|
+
[{"role": "user", "content": "hello"}],
|
|
89
|
+
)
|
|
90
|
+
assert capsys.readouterr().out == ""
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_cache_prefill_requires_path_and_messages(capsys):
|
|
94
|
+
server = _make_server()
|
|
95
|
+
|
|
96
|
+
server._dispatch({"method": "cache_prefill"})
|
|
97
|
+
|
|
98
|
+
assert capsys.readouterr().out.endswith("\0")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def test_cache_prefill_then_generate_with_cache_via_server(capsys):
|
|
102
|
+
from server import Server
|
|
103
|
+
|
|
104
|
+
backend = _Backend()
|
|
105
|
+
server = Server(backend, {"methods": ["cache_prefill"], "model_kind": "lm"})
|
|
106
|
+
|
|
107
|
+
server._dispatch(
|
|
108
|
+
{
|
|
109
|
+
"method": "cache_prefill",
|
|
110
|
+
"cache_path": "memory://prefix",
|
|
111
|
+
"messages": [{"role": "user", "content": "hello"}],
|
|
112
|
+
}
|
|
113
|
+
)
|
|
114
|
+
prefill_output = capsys.readouterr().out
|
|
115
|
+
assert json.loads(prefill_output.split("\0", 1)[0]) == {
|
|
116
|
+
"cache_path": "memory://prefix",
|
|
117
|
+
"token_count": 2,
|
|
118
|
+
"cache_write_tokens": 2,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
server._dispatch(
|
|
122
|
+
{
|
|
123
|
+
"method": "generate",
|
|
124
|
+
"prompt": "prefix suffix",
|
|
125
|
+
"options": {"max_tokens": 1},
|
|
126
|
+
"cache_path": "memory://prefix",
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
generate_output = capsys.readouterr().out
|
|
130
|
+
assert generate_output.startswith("ok")
|
|
131
|
+
meta = json.loads(
|
|
132
|
+
generate_output.split("\x1e__META__:", 1)[1].split("\0", 1)[0]
|
|
133
|
+
)
|
|
134
|
+
assert meta == {
|
|
135
|
+
"prompt_tokens": 3,
|
|
136
|
+
"generation_tokens": 1,
|
|
137
|
+
"cache_read_tokens": 2,
|
|
138
|
+
"cache_write_tokens": 2,
|
|
139
|
+
"cache_loaded": True,
|
|
140
|
+
}
|
|
141
|
+
assert backend.generate_prompt == [3]
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from types import SimpleNamespace
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from utils.transformers_errors import (
|
|
6
|
+
MIN_TRANSFORMERS_VERSION,
|
|
7
|
+
extract_unsupported_model_type,
|
|
8
|
+
unsupported_model_type_error,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_extracts_model_type_from_transformers_value_error():
|
|
13
|
+
error = ValueError(
|
|
14
|
+
"The checkpoint has model type `qwen3_5` but Transformers does not "
|
|
15
|
+
"recognize this architecture."
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
assert extract_unsupported_model_type(error) == "qwen3_5"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_extracts_model_type_from_older_registry_key_error():
|
|
22
|
+
assert extract_unsupported_model_type(KeyError("qwen3_5")) == "qwen3_5"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_leaves_unrelated_errors_unchanged():
|
|
26
|
+
assert extract_unsupported_model_type(ValueError("invalid weights")) is None
|
|
27
|
+
assert extract_unsupported_model_type(KeyError("model_type")) is None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_error_includes_runtime_requirement_and_setup_guidance():
|
|
31
|
+
error = unsupported_model_type_error("Qwen/Qwen3.5-0.8B", "qwen3_5", "4.57.6")
|
|
32
|
+
message = str(error)
|
|
33
|
+
|
|
34
|
+
assert "qwen3_5" in message
|
|
35
|
+
assert "transformers 4.57.6" in message
|
|
36
|
+
assert f"transformers>={MIN_TRANSFORMERS_VERSION}" in message
|
|
37
|
+
assert "setup-pytorch" in message
|
|
38
|
+
assert "modular-prompt-runtime sync pytorch" in message
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_backend_wraps_unknown_architecture_error(monkeypatch):
|
|
42
|
+
pytest.importorskip("torch")
|
|
43
|
+
import backends.transformers_lm as backend_module
|
|
44
|
+
|
|
45
|
+
tokenizer = SimpleNamespace(pad_token=None, eos_token="<eos>")
|
|
46
|
+
backend = backend_module.TransformersLmBackend(device="cpu")
|
|
47
|
+
|
|
48
|
+
def load_tokenizer(*args, **kwargs):
|
|
49
|
+
return tokenizer
|
|
50
|
+
|
|
51
|
+
def load_model(*args, **kwargs):
|
|
52
|
+
raise ValueError(
|
|
53
|
+
"The checkpoint has model type `qwen3_5` but Transformers does not "
|
|
54
|
+
"recognize this architecture."
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
monkeypatch.setattr(backend_module.AutoTokenizer, "from_pretrained", load_tokenizer)
|
|
58
|
+
monkeypatch.setattr(
|
|
59
|
+
backend_module.AutoModelForCausalLM,
|
|
60
|
+
"from_pretrained",
|
|
61
|
+
load_model,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
with pytest.raises(RuntimeError, match="qwen3_5") as raised:
|
|
65
|
+
backend.load("Qwen/Qwen3.5-0.8B")
|
|
66
|
+
|
|
67
|
+
assert f"transformers {backend_module.transformers.__version__}" in str(raised.value)
|
|
68
|
+
assert "transformers>=5.14.0" in str(raised.value)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_backend_wraps_unknown_architecture_error_from_tokenizer(monkeypatch):
|
|
72
|
+
pytest.importorskip("torch")
|
|
73
|
+
import backends.transformers_lm as backend_module
|
|
74
|
+
|
|
75
|
+
backend = backend_module.TransformersLmBackend(device="cpu")
|
|
76
|
+
|
|
77
|
+
def load_tokenizer(*args, **kwargs):
|
|
78
|
+
raise ValueError(
|
|
79
|
+
"The checkpoint has model type `qwen3_5` but Transformers does not "
|
|
80
|
+
"recognize this architecture."
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
monkeypatch.setattr(backend_module.AutoTokenizer, "from_pretrained", load_tokenizer)
|
|
84
|
+
|
|
85
|
+
with pytest.raises(RuntimeError, match="qwen3_5") as raised:
|
|
86
|
+
backend.load("Qwen/Qwen3.5-0.8B")
|
|
87
|
+
|
|
88
|
+
assert f"transformers {backend_module.transformers.__version__}" in str(raised.value)
|
|
89
|
+
assert "transformers>=5.14.0" in str(raised.value)
|