LFM3-VL-2B is a vision-language model for on-device visual understanding. It takes text, images, and video as input, and combines the LFM3 language model with a new in-house vision encoder.
New in LFM3-VL-2B:
Video understanding: the first LFM vision model that takes video as input. Ask questions about a recorded lecture, a walkthrough filmed on your phone, or a clip from a camera feed.
Thinking: the model reasons step by step before it answers. This helps most with harder visual questions, such as math, charts, and multi-step problems.
Spatial and embodied reasoning: the model finds objects and reasons about how they are placed relative to each other, a strong foundation for robotics applications.
| Inputs | Text, images, and video at native resolution. Each 2×2 block of patches becomes one language token. Video is sampled at 2 fps, with 4 to 768 frames by default.
LFM3-VL-2B is designed for on-device visual tasks: questions about video, reading documents, charts, and app screens, finding objects in an image, and spatial reasoning for robots. It is not recommended for coding, multi-turn conversations, or complex reasoning.
Sampling parameters:temperature=0.1, top_p=1.0, top_k=50, min_p=0.0, repetition_penalty=1.1. For image and video preprocessing, use the values in processor_config.json.
For most on-device use cases, we recommend llama.cpp b11960 or newer with the GGUF checkpoints. To run it in a desktop app such as Llama.app or LM Studio, click Use this model on the GGUF page and pick the app.
From a terminal, start a web chat UI and an OpenAI-compatible API at http://localhost:8080. With -hf, llama.cpp downloads the model and the matching vision projector (mmproj):
To ask one question from the command line, use llama cli with the same flags, --image <IMAGE PATH> or --video <VIDEO PATH>, and -p "<PROMPT>". Video input needs ffmpeg in PATH.
GPU inference with vLLM and SGLang
For high-throughput serving on GPU, use vLLM or SGLang. Both serve an OpenAI-compatible API. Support for LFM3-VL in SGLang is in review in sgl-project/sglang#46858, and support in vLLM is in progress. We will update this card when their releases support it.
sglang serve --model-path LiquidAI/LFM3-VL-2B --trust-remote-code \
--reasoning-parser auto \
--tool-call-parser auto \
--constrained-json-disable-any-whitespace
Send an image-and-text request with the OpenAI client. Change base_url to http://localhost:30000/v1 for SGLang, or http://localhost:8080/v1 for llama.cpp:
By default, LFM3-VL-2B samples video at 2 fps, with at least 4 and at most 768 frames per video. Each frame adds vision tokens, so for long videos a lower frame rate or frame limit uses less context and memory.
Transformers: set the frame rate per call with processor.apply_chat_template(..., processor_kwargs={"fps": 1}). Set the frame limit when you load the processor: AutoProcessor.from_pretrained(model_id, trust_remote_code=True, max_frames=128).
vLLM: set a server default in --media-io-kwargs, for example '{"video": {"video_backend": "qwen3_vl", "fps": 1, "max_frames": 128}}'. Override it per request with extra_body={"media_io_kwargs": {"video": {"fps": 1, "max_frames": 128}}}.
SGLang: change fps, min_frames, and max_frames under video_processor in processor_config.json in a local copy of the checkpoint.
llama.cpp: always uses 2 fps and 4 to 768 frames for this model. --video-fps has no effect.
Chat template
LFM3-VL uses this ChatML format, generated from the checkpoint's chat template:
<|startoftext|><|im_start|>system
You are a helpful assistant trained by Liquid AI.<|im_end|>
<|im_start|>user
<|vision_start|><|image|><|vision_end|>What species is in this picture?<|im_end|>
<|im_start|>assistant
<think>
Use processor.apply_chat_template() with add_generation_prompt=True to format messages automatically. The model thinks in a <think>...</think> block before it answers.
The template inserts <|vision_start|><|image|><|vision_end|> for each image and <|vision_start|><|video|><|vision_end|> for each video. Do not put these tags in your message content.
Reasoning from turns before the latest user message is removed unless preserve_thinking=True.
Tool calling
Pass function schemas through tools=... to apply_chat_template(). The template formats tool definitions and results automatically. Generated calls use XML:
<tool_call>
<function=get_weather>
<parameter=city>
Paris
</parameter>
</function>
</tool_call>
Warning. LFM3's tool call format has changed from the custom LFM2/LFM2.5 format to a superset of qwen3_coder.
Execute the call in your application. Add the parsed assistant call to history as a tool_calls entry, then append the result as a tool message. Keep passing the tool schemas on subsequent requests and preserve the assistant's content and reasoning from the current tool-use turn.
function.arguments must be a Python mapping. Decode JSON strings with json.loads() before applying the template.
LFM3 supports deferred tools. Set defer_loading=True to keep tool definitions out of the prompt until your harness's search tool returns their names as tool_reference parts. The chat template then inserts their definitions into <additional_tools>.
Across 62 vision benchmarks, LFM3-VL-2B scores at least 8 points ahead of all models of similar size. It matches Gemma 4 12B, is within 2 points of GPT-5.6 Luna, and scores higher than Gemini 3.5 Flash Lite.
# custom terms: read the license before you download$ fw get LiquidAI/LFM3-VL-2B
# manifest sha256 d03d8fef4f6e… · 3.85 GB · 19 files$ fw verify ./LFM3-VL-2B LiquidAI/LFM3-VL-2B
Terms that come with these files. LFM 1.0: commercial use only for organisations under US$10M annual revenue. Keep a copy of the license with the files.
Custom license (custom).Read the license text first. Open this panel to show the commands once you accept its terms.
fw.pyChecks the signature and every sha256, tries each source in order, resumes.