Bläddra i källkod

fix(lmstudio): 修复推理能力检测逻辑

当模型仅支持preserve_thinking而不支持enable_thinking时,
不应该被视为具备推理能力,因为preserve_thinking只影响之前
推理的回放,而不是当前生成的思考能力。
kekeZack 1 månad sedan
förälder
incheckning
d52994f501
2 ändrade filer med 32 tillägg och 1 borttagningar
  1. 28 0
      tests/test_lmstudio_wrapper_generator.py
  2. 4 1
      tools/lmstudio/wrapper_generator.py

+ 28 - 0
tests/test_lmstudio_wrapper_generator.py

@@ -524,6 +524,34 @@ class WrapperGeneratorTests(unittest.TestCase):
         self.assertFalse(profile["capabilities"]["reasoning"])
         self.assertFalse(profile["needs_enable_thinking"])
 
+    def test_preserve_thinking_without_enable_thinking_is_not_reasoning_capable(self):
+        metadata = {
+            "general.architecture": "qwen35moe",
+            "general.name": "Preserve Only Model",
+            "general.basename": "Preserve Only Model",
+            "tokenizer.chat_template": (
+                "{%- if preserve_thinking is defined and preserve_thinking is true %}"
+                "{{ '<think>\\nold reasoning\\n</think>\\n\\n' }}"
+                "{%- endif %}<tools>"
+            ),
+            "qwen2.context_length": "262144",
+        }
+
+        profile = gen.build_virtual_model_profile(metadata)
+        files = gen.build_virtual_model_files(
+            publisher="publisher-d",
+            slug="preserve-only-model",
+            model_key="publisher-d/Preserve-Only-Model-GGUF/model.gguf",
+            profile=profile,
+        )
+
+        self.assertFalse(profile["capabilities"]["reasoning"])
+        self.assertFalse(profile["needs_enable_thinking"])
+        self.assertFalse(profile["needs_preserve_thinking"])
+        self.assertIn("reasoning: false", files["model.yaml"])
+        self.assertNotIn("key: enableThinking", files["model.yaml"])
+        self.assertNotIn("key: preserveThinking", files["model.yaml"])
+
     def test_gemma4_pipe_style_tool_tokens_are_detected(self):
         metadata = {
             "general.architecture": "gemma4",

+ 4 - 1
tools/lmstudio/wrapper_generator.py

@@ -229,7 +229,10 @@ def _extract_base_name(metadata: dict[str, object]) -> str:
 
 def _detect_capabilities(chat_template: str) -> dict[str, bool]:
     lowered = chat_template.lower()
-    has_reasoning = "enable_thinking" in lowered or "preserve_thinking" in lowered
+    # `preserve_thinking` only affects whether prior reasoning is replayed.
+    # Treat the model as reasoning-capable only when the template can switch
+    # or emit thinking for the current generation.
+    has_reasoning = "enable_thinking" in lowered
     has_tools = any(
         token in lowered
         for token in (