import importlib.util import json import struct import tempfile import unittest from pathlib import Path MODULE_PATH = ( Path(__file__).resolve().parent.parent / "tools" / "lmstudio" / "wrapper_generator.py" ) if MODULE_PATH.exists(): spec = importlib.util.spec_from_file_location("wrapper_generator", MODULE_PATH) module = importlib.util.module_from_spec(spec) assert spec is not None and spec.loader is not None spec.loader.exec_module(module) gen = module else: # pragma: no cover gen = None class WrapperGeneratorTests(unittest.TestCase): def setUp(self): if gen is None: self.fail("tools.lmstudio.wrapper_generator is not available") self.official_model_yaml = """\ model: qwen/qwen3.6-35b-a3b base: - key: lmstudio-community/qwen3.6-35b-a3b-gguf metadataOverrides: domain: llm architectures: - qwen35moe compatibilityTypes: - gguf reasoning: true config: operation: fields: - key: llm.prediction.promptTemplate value: type: jinja jinjaPromptTemplate: template: | {%- if add_generation_prompt %} {%- if enable_thinking is defined and enable_thinking is false %} {{- '\\n\\n\\n\\n' }} {%- else %} {{- '\\n' }} {%- endif %} {%- endif %} customFields: - key: enableThinking effects: - type: setJinjaVariable variable: enable_thinking - key: preserveThinking effects: - type: setJinjaVariable variable: preserve_thinking """ self.official_manifest = { "type": "model", "owner": "qwen", "name": "qwen3.6-35b-a3b", "dependencies": [ { "type": "model", "purpose": "baseModel", "modelKeys": ["lmstudio-community/qwen3.6-35b-a3b-gguf"], } ], "revision": 1, } def _write_gguf_metadata(self, path: Path, metadata: dict[str, object]) -> None: type_string = 8 type_bool = 7 def write_string(value: str) -> bytes: raw = value.encode("utf-8") return struct.pack(" tuple[int, bytes]: if isinstance(value, bool): return type_bool, struct.pack("