LFM2.5-1.2B-Instruct GGUF — with tool_calls chat-template fix
GGUF builds of LiquidAI/LFM2.5-1.2B-Instruct
prepared for tool calling. Every file is the corresponding upstream quant with
bit-identical weight tensors; the embedded chat template
(tokenizer.chat_template) is extended to render the tool_calls field of
assistant messages, and the files marked in the table additionally embed
LiquidAI's recommended sampling as general.sampling.* metadata.
Model Capabilities
- Text generation — instruction-following chat model
- Tool calling — native LFM2 function-calling format; multi-turn tool use works thanks to the template fix in this repo
- Long context — 128k tokens
Getting Started
Install NobodyWho:
pip install nobodywho
Run — the model is downloaded and cached automatically on first use:
from nobodywho import Chat
chat = Chat("huggingface:NobodyWho/LFM2.5-1.2B-Instruct-GGUF/LFM2.5-1.2B-Instruct-Q8_0-vendor-sampling.gguf")
response = chat.ask("What is the capital of Denmark?").completed()
print(response) # Copenhagen!
Tool calling
from nobodywho import Chat, tool
@tool(description="Gets the current weather for a city")
def get_weather(city: str) -> str:
return f"It is sunny and 22°C in {city}."
chat = Chat(
"huggingface:NobodyWho/LFM2.5-1.2B-Instruct-GGUF/LFM2.5-1.2B-Instruct-Q8_0-vendor-sampling.gguf",
tools=[get_weather],
)
print(chat.ask("What is the weather in Paris?").completed())
[!NOTE] Tool calling with LFM models ships in the upcoming
nobodywhorelease (PR #564). These files also work in any other llama.cpp-based runtime; the original unmodified GGUFs live in the upstream LiquidAI/LFM2.5-1.2B-Instruct-GGUF repo.
Why
The upstream template renders only message.content. Runtimes that store tool
calls in the structured tool_calls field (the HF "unified tool use"
convention, used by NobodyWho and OpenAI-style APIs) re-render assistant
tool-call turns as empty turns, so the model never sees its own previous
calls — causing re-issued tool calls and degraded multi-turn tool use.
The fixed template renders them in the model's native markup:
<|tool_call_start|>[get_weather(city="Paris")]<|tool_call_end|>
Files
| File | Fix recipe | NobodyWho tool-suite score |
|---|---|---|
LFM2.5-1.2B-Instruct-Q8_0-vendor-sampling.gguf |
template + vendor sampling | 14/14 |
LFM2.5-1.2B-Instruct-F16.gguf |
template only | 14/14 |
LFM2.5-1.2B-Instruct-Q4_0-vendor-sampling.gguf |
template + vendor sampling | 12/14 (double-calls two tests) |
Sampling notes
The Q4_0 and Q8_0 files embed LiquidAI's recommended sampling as
general.sampling.* metadata, taken from the vendor's LEAP deployment config:
temperature 0.3, min_p 0.15, repetition_penalty 1.05. The F16
deliberately ships without sampling metadata: at full precision, embedding
those values drops the bash-writing test (13/14 vs 14/14 with default
sampling), so runtimes fall back to their own defaults.
The embedded values were previously
temp 0.1, top_k 50(the vendor's model-card prose, which conflicts with its LEAP config) and have been corrected to the LEAP values above. All scores re-verified against these files with the corrected sampler: Q8_0 14/14, F16 14/14 (sampling-free), F16 + vendor sampling 13/14, Q4_0 12/14 (double-calls two tests).
Use
Verified against NobodyWho's 14-test tool-calling suite (single and multi-call, nested arguments, multi-turn) — see PR #564. Works as a drop-in replacement for the upstream Q8_0 file in any llama.cpp-based runtime.
Model Details
| Property | Value |
|---|---|
| Parameters | 1.2B |
| Context length | 128,000 tokens |
| License | LFM Open License v1.0 |
| Base model | LiquidAI/LFM2.5-1.2B-Instruct |
License
LFM Open License v1.0, unchanged from upstream — see LICENSE. All credit for the model goes to Liquid AI.