From cd9388ac71fb989c3a590668fb3542f5b85a8fdb Mon Sep 17 00:00:00 2001 From: Abdullah Date: Mon, 6 Apr 2026 09:59:22 +0300 Subject: [PATCH] fix(chat): support tool_choice in Qwen3.5-VL chat handler - 'none': tools are not injected into the prompt - 'required': model is instructed to always call a tool - 'auto'/None: model follows each tool's description to decide Fixes: tools were always injected regardless of tool_choice value --- llama_cpp/llama_chat_format.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/llama_cpp/llama_chat_format.py b/llama_cpp/llama_chat_format.py index 3c426b38f..029f53d15 100644 --- a/llama_cpp/llama_chat_format.py +++ b/llama_cpp/llama_chat_format.py @@ -5371,7 +5371,7 @@ class Qwen35ChatHandler(MTMDChatHandler): "{%- if not messages -%}" " {{- raise_exception('No messages provided.') -}}" "{%- endif -%}" - "{%- if tools and tools is iterable and tools is not mapping -%}" + "{%- if tools and tools is iterable and tools is not mapping and tool_choice != 'none' -%}" " {{- '<|im_start|>system\n' -}}" " {{- '# Tools\n\nYou have access to the following functions:\n\n' -}}" " {%- for tool in tools -%}" @@ -5379,6 +5379,11 @@ class Qwen35ChatHandler(MTMDChatHandler): " {{- tool | tojson -}}" " {%- endfor -%}" " {{- '\n' -}}" + " {%- if tool_choice == 'required' -%}" + " {{- '\n\nYou MUST call at least one function in your response. Answering without a function call is not allowed. Select the most appropriate tool based on the user request and its description.\n' -}}" + " {%- else -%}" + " {{- '\n\nYou have access to tools. Use them only when necessary.\nFollow the description of each tool to determine if and when to call it.\nIf no tool is needed, respond directly.\n' -}}" + " {%- endif -%}" " {{- '\n\nIf you choose to call a function ONLY reply in the following format with NO suffix:\n\n\n\n\nvalue_1\n\n\nThis is the value for the second parameter\nthat can span\nmultiple lines\n\n\n\n\n\nReminder:\n- Function calls MUST follow the specified format: an inner block must be nested within XML tags\n- Required parameters MUST be specified\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\n' -}}" " {%- if messages[0].role == 'system' -%}" " {%- set content = render_content(messages[0].content, false, true) | trim -%}"