llama.cpp 修復了啟用語法(grammar)取樣時長 token 被誤判拒絕的問題。此前 llama_grammar_reject_candidates_for_stack 的深度限制按 token 的碼點數計算,凡是 256 字元及以上的 token 在 grammar 下都會被拒絕,例如 GLM-4.7-Flash 的 512 空格 token 和 Laguna-S-2.1 的長空格 token。
修復了 GLM-4.7-Flash、Laguna 等模型的長空格 token 在 grammar 下總被拒絕的 bug,同時帶來可測量的取樣提速,對用 llama.cpp 做結構化輸出的本地推理影響最直接。
common, grammar: add recursive depth limit, make it a requirement ( #31153 )
common, grammar: add recursive depth limit, make it a requirement
catch more recursive functions
common : tidy up peg parser changes
grammar : reject candidates in a loop, without a depth limit
The depth limit in llama_grammar_reject_candidates_for_stack counted
the code points of a vocab token, so any token of 256 chars or more
was always rejected under a grammar, such as the 512-space token of
GLM-4.7-Flash or the long space tokens of Laguna-S-2.1.
The rejection now walks the code points with its own stack of levels
instead of recursing: there is no limit and no stack risk, whatever
the length of a token from the GGUF, and the masks match master.
grammar : track rejected candidates as indices into the input
At a given code point a candidate only differs from its input by the
position of its code point pointer, so the levels now carry indices
into the input candidates instead of copies. The first level needs no
special case and the rejects map back to the input directly.
Grammar sampling gets faster than master on GLM-4.7, Laguna, Qwen3.6
and gemma-4 with the json, list and spaces grammars, same masks.
nit : shorten the comment of llama_grammar_reject_step
common : add depth_guard for schema walks
grammar : move GRAMMAR_RECURSIVE_LIMIT into the .cpp
common : reduce recursion limit for peg parser
improve
Co-authored-by: Alde Rojas
[email protected]
Co-authored-by: Pascal
[email protected]
Website:
https://llama.app
Attestations:
https://github.com/ggml-org/llama.cpp/attestations/59723426
macOS/iOS:
macOS Apple Silicon (arm64)
macOS Apple Silicon (arm64, KleidiAI enabled) DISABLED
macOS Intel (x64)
iOS XCFramework
Linux:
Ubuntu x64 (CPU)
Ubuntu arm64 (CPU)
Ubuntu s390x (CPU)
Ubuntu x64 (Vulkan)
Ubuntu arm64 (Vulkan)
Ubuntu x64 (CUDA 12) - CUDA 12.8 libraries
Ubuntu x64 (CUDA 13) - CUDA 13.4 libraries
Ubuntu arm64 (CUDA 13) - CUDA 13.4 libraries
Ubuntu x64 (ROCm 10.0)
Ubuntu x64 (OpenVINO)
Ubuntu x64 (SYCL FP32)
Ubuntu x64 (SYCL FP16)
Linux arm64 (Snapdragon: CPU, Adreno GPU, Hexagon NPU) - setup guide
Android:
Android arm64 (CPU)
Android arm64 (Snapdragon: CPU, Adreno GPU, Hexagon NPU) - setup guide
Windows:
Windows x64 (CPU)
Windows arm64 (CPU)
Windows arm64 (OpenCL Adreno)
Windows x64 (CUDA 12) - CUDA 12.4 DLLs
Windows x64 (CUDA 13) - CUDA 13.4 DLLs
Windows arm64 (CUDA 13) - CUDA 13.4 DLLs
Windows x64 (Vulkan)
Windows arm64 (Vulkan)
Windows x64 (OpenVINO)
Windows x64 (SYCL)
Windows x64 (ROCm 10.0)
openEuler:
DISABLED
openEuler x86 (310p)
openEuler x86 (910b, ACL Graph)
openEuler aarch64 (310p)
openEuler aarch64 (910b, ACL Graph)
UI:
UI