alt.freeweights.lfm / LFM3-Omni-2B
From: LiquidAI <huggingface.co/LiquidAI>Newsgroups: alt.freeweights.lfmSubject:

LFM3-Omni-2B

Date: 2026-11-15Commit: 21d7512Signed: 2DC28CC7B26A283B ✓

Any to any model with 2.2B parameters. Safetensors weights, 4.50 GB in all. Published by LiquidAI under LFM-1.0 (custom).

2.2B params4.50GBLFM3-Omni-2Bsafetensorscustom terms
FactsParams2.2BSize4.50 GBFormatssafetensorsTaskany to anyLicenseLFM-1.0 (custom)From sourcecustom termsread terms
# custom terms: read the license before you download
$ fw get LiquidAI/LFM3-Omni-2B
# manifest sha256 f5c0dd3d361e… · 4.50 GB · 29 files
$ fw verify ./LFM3-Omni-2B LiquidAI/LFM3-Omni-2B
From sourceHosted (signed)LiquidAI/LFM3-Omni-2BLast check: 2026-11-15 02:38 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Works with

Runs with

Ranked by fit to this model (safetensors), then by GitHub stars.

Overview

Size
4.50 GB
Weights
4.48 GB (safetensors)
Parameters
2.2B
Formats
safetensors
Task
any to any
License
LFM-1.0 (custom) (custom)
Files
29, each with a sha256
Publisher
LiquidAI
Added
2026-11-15
Section
alt.freeweights.lfm
Lineage

Original release from the publisher.

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-15 02:38 UTCpassed

Model card

From the publisher at commit 21d7512. Shown as plain text with links; images open at the publisher.

Image: Liquid AI

API Try Docs Blog

LFM3-Omni-2B#

LFM3-Omni-2B is Liquid AI's first omni-modal model in the LFM3 family: a single end-to-end model that understands text, images, video and audio, and answers in text and speech. It is built for on-device use: one model replaces a separate ASR model, vision-language model, LLM and TTS model.

  • Any input, text or speech output: ask about a photo by voice, transcribe or translate speech, chat out loud, or ask questions about a video and its soundtrack together.
  • Watches and listens together: for videos with sound, the model sees and hears them at the same time, so it can answer questions that need both.
  • Small enough for devices: at 2.2B parameters, it is designed to run efficiently on phones, laptops and other edge hardware.

Find more information about the LFM3 family in our release blog post.

Model details#


The LFM3 family includes base, text, vision, audio, omni, and decision models.

Image: LFM3-Omni architecture: a spoken question passes through the LFM3 audio encoder and audio connector, an image through the LFM3 vision encoder and vision connector, and a text prompt through the tokenizer and embedding, all into the LFM3-1.7B Liquid Foundation Model. Its output stream of text and audio tokens drives the LM head for text and the depthformer and Liquid Audio Codec for 24 kHz speech.

| Property | Specification

| Checkpoint | Post-trained omni-modal model

| Parameters | 2.17B total

| Architecture | LFM3 backbone, LFM3 vision encoder, LFM3 causal audio encoder, LiquidCodec audio tokenizer.

| Inputs | Text, images, video with or without its soundtrack, and 16 kHz audio. Images and video are processed at native resolution; each 2×2 block of patches becomes one language token. Video is sampled at 2 fps, with 4 to 384 frames by default.

| Outputs | Text, 24 kHz speech, or interleaved text and speech

| Context length | 32K tokens (input + output)

| Vocabulary | 128,000 text tokens

| Text languages | English, Arabic, Chinese, French, German, Italian, Japanese, Korean, Portuguese, Spanish, Vietnamese, Thai, Indonesian, Hindi, Russian, Polish

| Speech languages and locales | Arabic, Danish, German, Greek, British English, American English, Finnish, French, Hebrew, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Spanish, Swedish, Turkish, Chinese

| License | LFM Open License v1.0

This is a non-reasoning model. enable_thinking=True is not supported.

Inference#


Choose a checkpoint variant for your inference framework and hardware.

| Checkpoint | Framework | Description

| BF16 | SGLang, Transformers | BF16 weights for GPU inference. SGLang serves text output.

| GGUF | llama.cpp | Local inference on CPUs and GPUs, including a realtime speech server.

Sampling parameters#
  • Text output: greedy decoding works well.
  • Speech or interleaved output: use audio_temperature=0.4, audio_repetition_penalty=1.2
Generation modes (optional)#

To force a generation mode, pass the optional generation_mode argument to model.generate.

| Mode | generation_mode (optional) | Opening token

| Text | "text" | none

| Speech | "audio" | &lt;|audio_start|&gt;

| Text and speech, interleaved | "interleaved" | &lt;|mixed_start|&gt;

By default, the model selects the output modality based on the system prompt and input modality, typically matching the input modality. To encourage a specific output modality, append the corresponding instructions to the end of your system prompt.

| Mode | System Prompt

| Text | Respond in text.

| Text and speech, interleaved | Respond in interleaved text and audio.

Transformers quick start#

Install the dependencies, then load the model and processor with the checkpoint's custom code. The codec implementation is included in this repository, and the processor loads its weights from audio_tokenizer/.

pip install "transformers>=5.20.2" torch torchvision torchcodec accelerate pillow librosa soundfile
import torch
import soundfile as sf

from transformers import AutoModelForMultimodalLM, AutoProcessor

model_id = "LiquidAI/LFM3-Omni-2B"
device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.bfloat16 if device == "cuda" else torch.float32

model = AutoModelForMultimodalLM.from_pretrained(
    model_id, dtype=dtype, device_map=device, trust_remote_code=True
).eval()
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)
codec = processor.audio_tokenizer.to(device=device).eval()

Chat template

LFM3-Omni uses a ChatML-like format, which processor.apply_chat_template() renders for you, generated from the checkpoint's chat template:

<|startoftext|><|im_start|>system
Respond with text.<|im_end|>
<|im_start|>user
Name a famous bridge in San Francisco.<|im_end|>
<|im_start|>assistant
<think></think>The Golden Gate Bridge.<|im_end|>
<|im_start|>user
When did it open?<|im_end|>
<|im_start|>assistant
<think></think>

The system turn is optional, and every assistant turn opens with an empty <think></think>. Each image, video or audio clip is wrapped in <|vision_start|> / <|vision_end|>, which the template adds. Here is an image and a spoken question:

<|startoftext|><|im_start|>user
<|vision_start|><|image|><|vision_end|><|vision_start|><|audio|><|vision_end|>Answer in one sentence.<|im_end|>
<|im_start|>assistant
<think></think>
Usage examples#

The examples below reuse the model, codec, and processor loaded above. Replace audio.wav, question.wav, recording.wav, photo.jpg, or clip.mp4 with your own files. Audio files are resampled to 16 kHz mono on load.

Speech recognition (ASR)

To use the model for transcription, use the system prompt Perform ASR in <language>., where <language> is the English name of the language.

Below, we transcribe a .wav file containing English speech.

conversation = [
    {"role": "system", "content": "Perform ASR in English."},
    {"role": "user", "content": [{"type": "audio", "audio": "audio.wav"}]},
]

inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
).to(device)
with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=1024, generation_mode="text")
text = processor.decode(
    outputs.sequences[0, inputs["input_ids"].shape[1]:outputs.sequence_lengths[0]],
    skip_special_tokens=True,
)
print(text)

Speech synthesis (TTS)

For speech synthesis, use the system prompt Perform TTS in <language> using a <gender> voice.. Use one of the speech languages listed in Model details and a female or male voice. For English, say American English or British English. Pass generation_mode="audio" so the answer opens with <|audio_start|>.

conversation = [
    {"role": "system", "content": "Perform TTS in American English using a female voice."},
    {"role": "user", "content": "The quick brown fox jumps over the lazy dog"},
]
inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
).to(device)
with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=256,
        generation_mode="audio",
        audio_temperature=0.4,
        audio_repetition_penalty=1.2,
    )
    waveform = codec.decode(
        outputs.audio_codes[:1, :, :outputs.audio_lengths[0]]
    ).audio_values[0]  # 24 kHz

sf.write("tts.wav", waveform.squeeze(0).float().cpu().numpy(), 24_000)

Voice chat: speech and text responses

In this mode, the model will respond to the user in both speech and text. The recommended system prompt is Respond with interleaved text and audio.. User input can be either text or audio, and we pass generation_mode="interleaved" so the answer opens with <|mixed_start|>.

The assistant responds in a conversational style with interleaved text and speech. This example saves the complete response.

conversation = [
    {"role": "system", "content": "Respond with interleaved text and audio."},
    {"role": "user", "content": [{"type": "audio", "audio": "question.wav"}]},
]
inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
).to(device)
with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=1024,
        generation_mode="interleaved",
        audio_temperature=0.4,
        audio_repetition_penalty=1.2,
    )

    text = processor.decode(
        outputs.sequences[0, inputs["input_ids"].shape[1]:outputs.sequence_lengths[0]],
        skip_special_tokens=True,
    )
    waveform = codec.decode(
        outputs.audio_codes[:1, :, :outputs.audio_lengths[0]]
    ).audio_values[0]  # 24 kHz
print(text)
sf.write("reply.wav", waveform.squeeze(0).float().cpu().numpy(), 24_000)

Speech-to-text chat

For a text-only answer, no specific system prompt is needed. Respond with text. makes it explicit. Pass generation_mode="text". LFM3-Omni-2B is a non-reasoning model: every answer opens with an empty <think></think>.

conversation = [
    {"role": "user", "content": [{"type": "audio", "audio": "question.wav"}]},
]
inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
).to(device)
with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=1024, generation_mode="text")
    text = processor.decode(
        outputs.sequences[0, inputs["input_ids"].shape[1]:outputs.sequence_lengths[0]],
        skip_special_tokens=True,
    )
print(text)

Audio understanding

Include the recording and a question in the user turn. Questions can address speech, music, background sounds, or events. No specific system prompt is required. To ground answers in the recording, use Answer questions about the provided audio clip. Base every answer only on what can be heard..

conversation = [
    {
        "role": "system",
        "content": "Answer questions about the provided audio clip. Base every answer only on what can be heard.",
    },
    {
        "role": "user",
        "content": [
            {"type": "audio", "audio": "recording.wav"},
            {"type": "text", "text": "What is happening in this recording?"},
        ],
    },
]
inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
).to(device)

with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=1024, generation_mode="text")

print(processor.decode(
    outputs.sequences[0, inputs["input_ids"].shape[1]:outputs.sequence_lengths[0]],
    skip_special_tokens=True,
))

For multiple-choice questions, include the choices in the text part and end it with Please choose the answer from the options.

Translation

Use a system prompt that specifies the source language, target language, and output format:

  • Speech to text: Please translate the following spoken {source} into {target} text.

Replace {source} and {target} with the English names of the source and target languages. For text input, set the user message's content to the text to translate. Translation to or from English generally works best.

Image understanding

Include the image and a question in the user turn. To ground answers in the image, use the system prompt Answer questions about the provided image. Base every answer only on what can be seen.. For captions, use Describe the provided image.. Images are processed at their native resolution, up to 2,048 tokens per image.

conversation = [
    {
        "role": "system",
        "content": "Answer questions about the provided image. Base every answer only on what can be seen.",
    },
    {
        "role": "user",
        "content": [
            {"type": "image", "image": "photo.jpg"},
            {"type": "text", "text": "What is written on the sign?"},
        ],
    },
]
inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
).to(device)

with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=1024, generation_mode="text")

print(processor.decode(
    outputs.sequences[0, inputs["input_ids"].shape[1]:outputs.sequence_lengths[0]],
    skip_special_tokens=True,
))

Spoken questions about an image

The question can be asked by voice, with the recording in place of the text. Add Respond with text. to the system prompt for a text answer, or follow the voice chat example with Respond with interleaved text and audio. for a spoken one.

conversation = [
    {
        "role": "system",
        "content": "Answer questions about the provided image. Base every answer only on what can be seen. Respond with text.",
    },
    {
        "role": "user",
        "content": [
            {"type": "image", "image": "photo.jpg"},
            {"type": "audio", "audio": "question.wav"},
        ],
    },
]
inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
).to(device)

with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=1024, generation_mode="text")

print(processor.decode(
    outputs.sequences[0, inputs["input_ids"].shape[1]:outputs.sequence_lengths[0]],
    skip_special_tokens=True,
))

Video understanding

Include the video and a question in the user turn. No specific system prompt is required. Video is sampled at 2 frames per second (4 to 384 frames), and each pair of frames is prefixed with its timestamp.

conversation = [
    {
        "role": "user",
        "content": [
            {"type": "video", "video": "clip.mp4"},
            {"type": "text", "text": "What happens in this video?"},
        ],
    },
]
inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
).to(device)

with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=1024, generation_mode="text")

print(processor.decode(
    outputs.sequences[0, inputs["input_ids"].shape[1]:outputs.sequence_lengths[0]],
    skip_special_tokens=True,
))

Video with its soundtrack

To let the model see and hear a video, use the system prompt Answer questions about the video using what you see and hear. and pass two flags:

  • load_audio_from_video=True reads the audio track out of the video file.
  • use_audio_in_video=True interleaves that audio with the frames, so each pair of frames is followed by the sound that goes with it.

Without them, the model gets the frames only.

conversation = [
    {"role": "system", "content": "Answer questions about the video using what you see and hear."},
    {
        "role": "user",
        "content": [
            {"type": "video", "video": "clip.mp4"},
            {"type": "text", "text": "What happens here, and what can you hear?"},
        ],
    },
]
inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
    load_audio_from_video=True,
    processor_kwargs={"use_audio_in_video": True},
).to(device)

with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=1024, generation_mode="text")

print(processor.decode(
    outputs.sequences[0, inputs["input_ids"].shape[1]:outputs.sequence_lengths[0]],
    skip_special_tokens=True,
))

Video frame rate and frame limit

By default, LFM3-Omni-2B samples video at 2 fps, with at least 4 and at most 384 frames per video. Each frame adds vision tokens, so for long videos a lower frame rate or frame limit uses less context and memory. These settings do not change the soundtrack: the model always hears all of it.

  • Transformers: set the frame rate per call with processor.apply_chat_template(..., processor_kwargs={"fps": 1}). With the soundtrack, use processor_kwargs={"use_audio_in_video": True, "fps": 1}. Set the frame limit when you load the processor: AutoProcessor.from_pretrained(model_id, trust_remote_code=True, 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 384 frames for this model. --video-fps has no effect.

Tool calling from spoken requests

Pass function schemas through tools=... to apply_chat_template(). The chat template places them in the system prompt between <tools> and </tools>. Requests may be spoken or written. A tool call looks like this:

<tool_call>
<function=set_volume>
<parameter=volume>
30
</parameter>
</function>
</tool_call>

Values other than strings are written as JSON. Your application parses and runs the calls, then appends the assistant's tool_calls (with arguments as a dict) and a tool message with the results to the conversation. Generate again with the same tools: the model either makes more calls or answers.

import json
import re

tools = [{
    "type": "function",
    "function": {
        "name": "set_volume",
        "description": "Set the device speaker volume.",
        "parameters": {
            "type": "object",
            "properties": {
                "volume": {"type": "integer", "description": "Volume from 0 to 100."}
            },
            "required": ["volume"],
        },
    },
}]
functions = {"set_volume": lambda volume: {"volume": volume}}  # your implementations

CALL_RE = re.compile(r"<tool_call>\s*<function=([^>\n]+)>(.*?)</function>\s*</tool_call>", re.DOTALL)
PARAM_RE = re.compile(r"<parameter=([^>\n]+)>\n?(.*?)\n?</parameter>", re.DOTALL)


def parse_tool_calls(text):
    calls = []
    for name, body in CALL_RE.findall(text):
        arguments = {}
        for key, value in PARAM_RE.findall(body):
            try:
                arguments[key] = json.loads(value)
            except json.JSONDecodeError:
                arguments[key] = value  # plain string
        calls.append({"type": "function", "function": {"name": name, "arguments": arguments}})
    return calls


def respond(conversation):
    inputs = processor.apply_chat_template(
        conversation,
        tools=tools,
        add_generation_prompt=True,
        tokenize=True,
        return_dict=True,
        return_tensors="pt",
    ).to(device)
    with torch.no_grad():
        outputs = model.generate(**inputs, max_new_tokens=1024, generation_mode="text")
    return processor.decode(
        outputs.sequences[0, inputs["input_ids"].shape[1]:outputs.sequence_lengths[0]],
        skip_special_tokens=True,
    )


conversation = [
    {"role": "user", "content": [{"type": "audio", "audio": "question.wav"}]},
]
text = respond(conversation)
while calls := parse_tool_calls(text):
    results = [functions[c["function"]["name"]](**c["function"]["arguments"]) for c in calls]
    conversation += [
        {"role": "assistant", "tool_calls": calls},
        {"role": "tool", "content": json.dumps(results)},
    ]
    text = respond(conversation)

print(text)

See the Tool Use documentation for details.

Fine-tuning#


LFM3-Omni-2B is designed for easy customization for a given domain, task, or application with Hugging Face Transformers.

| Training | Use case | Notebook

| SFT | Fine-tune on your own omni data (text, audio, images) with Transformers | Open in Colab

| SFT | Visual question answering | Open in Colab

Performance#


Image: LFM3-Omni radar chart: one model scored across text (IFEval, GSM8K, MMLU-Pro, BFCL v4, RULER), vision (general, perception, documents, math and reasoning, grounding, embodied, GUI, video, multilingual), speech (English and multilingual ASR, TTS quality, VoiceBench, MMAR, voice tool calling) and omni tasks (image and audio, video and audio, spoken VQA, spoken embodied).

Omni#

| Benchmark | LFM3-Omni 2B | Qwen2.5-Omni 3B | Qwen2.5-Omni 7B | Gemma 4 E2B | Gemma 4 E4B | Phi-4 multimodal

| Total parameters | 2.2B | 6B | 10.7B | 5B | 8B | 5.6B

| Video + audio understanding | |

| Daily-Omni | 70.09 | 58.81 | 61.32 | 50.63 | 54.14 | 48.87

| WorldSense | 47.10 | 44.99 | 45.37 | 38.11 | 43.51 | 42.37

| AV-SpeakerBench | 46.79 | 40.44 | 43.24 | 32.32 | 36.36 | 37.95

| Image + audio understanding | |

| OmniBench (overall) | 46.32 | 47.11 | 49.65 | 16.81 | 20.67 | 38.97

| OmniBench (speech) | 48.25 | 45.65 | 47.99 | 16.08 | 21.27 | 38.91

| Spoken visual QA | |

| RealWorldQA | 64.68 | 61.05 | 69.93 | 39.35 | 49.02 | 64.31

| MMStar | 51.79 | 50.80 | 57.27 | 38.87 | 44.60 | 54.80

| POPE | 83.78 | 85.34 | 85.37 | 74.20 | 77.82 | 83.00

| ERQA | 39.43 | 37.34 | 39.16 | 20.63 | 32.12 | 30.81

| EmbSpatial | 67.59 | 53.40 | 59.51 | 44.08 | 54.01 | 42.60

Vision#

| Benchmark | LFM3-Omni 2B | Qwen2.5-Omni 3B | Gemma 4 E2B | Gemma 4 E4B | Phi-4 multimodal | Cosmos3 Edge

| Total parameters | 2.2B | 6B | 5B | 8B | 5.6B | 4B

| General | |

| MMStar | 55.67 | 55.67 | 46.47 | 52.00 | 59.33 | 56.07

| MMMU (val) | 42.44 | 48.00 | 37.81 | 43.14 | 54.76 | 37.14

| MMMU-Pro | 27.28 | 24.80 | 24.34 | 28.67 | 27.63 | 13.76

| MMBench | 73.68 | 79.30 | 67.61 | 73.54 | 82.73 | 76.63

| SEEDBench (image) | 75.07 | 75.27 | 72.53 | 74.78 | 72.24 | 74.73

| RealWorldQA | 66.54 | 63.14 | 48.63 | 53.07 | 64.84 | 72.81

| MathVista (mini) | 62.50 | 58.80 | 51.00 | 54.30 | 65.40 | 53.90

| POPE | 89.34 | 84.62 | 78.78 | 81.24 | 83.34 | 83.52

| Documents and OCR | |

| DocVQA | 92.47 | 92.71 | 73.49 | 77.91 | 92.60 | 84.43

| InfoVQA | 64.08 | 74.55 | 38.72 | 48.30 | 65.98 | 60.94

| OCRBench | 806 | 863 | 731 | 761 | 795 | 751

| Grounding | |

| RefCOCO | 73.55 | 78.76 | 63.18 | 63.36 | —* | 74.53

| Video | |

| MVBench | 58.03 | 66.43

The publisher's README is longer; it is cut here. Read the rest at the source.

Files

29 files · 4.50 GBWeights 4.48 GB (safetensors). Sizes and sha256 from the signed manifest.
Show all 29 files with their sha256
FileSizesha256
.gitattributes1.72 KB1ac2c590b2ff1ecfa63e3f5da44ec7ece12b2c5c4ccbc88cee6db3283d306d41
LICENSE10.6 KB4d28ca14dedc0b3d0fcc2b3339f0e79931faa33874f3d24f522183a8fc70068c
README.md76.8 KBd33f901744f236bc8592db93581f1ff840fb3028e2042a0a7b30e36140d23cf0
assets/lfm3-omni-architecture-light.png188 KB950e15b1f21ab682b461375b1be91ef8422de1f00c5bf064f2c9ea28d556d4bc
assets/lfm3-omni-family-radar-light.png208 KB0a90156e50907d71e7fe7e352c428eeaad863a425052250e115d10e903ae1d6d
audio_tokenizer/config.json512 B04d24ad70085288c0c10a8788e470fabd0a786c27b772bfd90ea1cde1cf3ac6d
audio_tokenizer/model.safetensors147 MB45984a872fdcf0b94cd0ec68822bbf26f0c6fcb580cfaba0f7fa3ee60355137f
chat_template.jinja13.5 KBea74cc1d14319ed436dc0f37632893004d436913113e7605267f2b01694d65e4
config.json5.91 KB17e3792551ef56b37e85bbd1e6e968f70dc5b4b14c96f1339d0be85e0ba46875
configuration_lfm3.py6.11 KB176cced35657aedfea7d7002221360582d1c05fcaca882c21508bc3a73b282e5
configuration_lfm3_omni.py14.6 KB9eccce3925353022c9a4d1cf59111830bbb2694e8c8d12ea439304e48a173c6a
configuration_lfm3_vl.py9.16 KB249e980a0b0ebd355be18bc0119b33809fa618b777c46f5424445a196c5cbc2e
configuration_liquid_codec.py5.40 KBad89deb17164b8ae9a59d9c86545fd01ad281786c8702850aff9042e5f94a463
feature_extraction_lfm3_omni.py8.94 KBbafd4bcf85d17c0bbf5cf213633935a6b03c731e55a348e70b0ecaf5a876ef5e
generation_config.json392 B5f069cac2df137d9ac81bdd7aee88d48052a3897f9761cc9ba2f357f93405b85
image_processing_lfm3_vl.py12.0 KB57db0cfa668bf89a6ff898874e1321e78c257d200f25c98e0ea52b30b8740088
lfm3_conv.py8.53 KB80d4a985382a22774212759248a6b4c737bfbf9c2a47b3dd7f797dda748e4bb4
model.safetensors4.33 GB76c0ec2c3e27832fb19f886d5eb0afe37f03c5c32c4a796a7ce08cef119d2763
modeling_lfm3.py42.4 KBe8cd5254ea99ce6bd731b57b10908c2e8b5010ce8315341f895a38484885eeab
modeling_lfm3_omni.py98.3 KB9872e64112f9e255fba43212771226772af521e93f99c1984ecba1049664c465
modeling_lfm3_vl.py45.0 KB06d98684d2f4322bf65140f206f0bf194d14f6587387cd354ad580c12585ff28
modeling_liquid_codec.py17.9 KB5ca87e1b6e0549b40dc90fad5ee9d55620e9defb78c67e19c5937208c8e14f74
processing_lfm3_omni.py39.0 KB07f97f35ccd0262b586c8878251f46c6a84e1e15ed92b0072a3acd3a63d2de5f
processing_lfm3_vl.py12.2 KBd770011e71c8b8e94ea9436d4f6768b42db60c5db70145d47f326f5d76f633f6
processor_config.json2.37 KBdd756829f85a10d343c4488c7d3479d3dc782e6f35721b7dae2fb588f781fc4a
tokenizer.json17.9 MB41927bd314d17d7d7fadb44e10cd0919f7b71528d7741596d8cbd15c6945ec44
tokenizer_config.json674 Bee4860abad5b84284f816d2812fc23a7477ce827ed6b4708af9a02c68ed00c7c
video_preprocessor_config.json706 B1ed75befc55ce0eda07fdcd7ad02c08605a973fcb1aebfbd0b86bb5221ae7c97
video_processing_lfm3_vl.py17.2 KB9a6b7804c520b59ae6a20bff4814196c187ef5b3ed8c93cbd7d0a9a66c413478
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
21d75123f8 pinned now2026-11-15 02:38 UTC29 files · 4.50 GB

Use it

# custom terms: read the license before you download
$ fw get LiquidAI/LFM3-Omni-2B
# manifest sha256 f5c0dd3d361e… · 4.50 GB · 29 files
$ fw verify ./LFM3-Omni-2B LiquidAI/LFM3-Omni-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.
$ python3 fw.py get https://freeweights.allternit.com/manifests/LiquidAI/LFM3-Omni-2B.json --dir ./LFM3-Omni-2B $ python3 fw.py verify ./LFM3-Omni-2B ./LiquidAI__LFM3-Omni-2B.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download LiquidAI/LFM3-Omni-2B --revision 21d75123f86c1f7ffb4bef1ea202710c4e7ebe67 --local-dir ./LFM3-Omni-2B

License

Name
LFM Open License v1.0
Id
LicenseRef-LFM-1.0
Class
Custom terms
Redistribution
click-through
Listing
Hosted (signed)
Terms
LFM 1.0: commercial use only for organisations under US$10M annual revenue. Keep a copy of the license with the files.
Decided
License as declared by the publisher. No person read it. 2026-11-15
Text in
LICENSE
Text sha256
4d28ca14dedc0b3d0fcc2b3339f0e79931faa33874f3d24f522183a8fc70068c
Terms gate
Yes. The commands stay folded until you open them after reading the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: LiquidAI <huggingface.co/LiquidAI>Newsgroups: alt.freeweights.lfmSubject: LFM3-Omni-2BDate: 2026-11-15Commit: 21d7512Signed: 2DC28CC7B26A283B ✓
Upstream
LiquidAI/LFM3-Omni-2B
Pinned commit
21d75123f86c1f7ffb4bef1ea202710c4e7ebe67
Manifest
LFM3-Omni-2B.json · .minisig
Manifest sha256
f5c0dd3d361e98f84a6c3529b13b1f747181d8a3c433e57d540eeb732484745e
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 02:38 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/LiquidAI/LFM3-Omni-2B.json $ curl -O https://freeweights.allternit.com/manifests/LiquidAI/LFM3-Omni-2B.json.minisig $ minisign -Vm LFM3-Omni-2B.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

2 models in the catalog name this one as their parent.

Fine-tunes
1
Quantizations
1
Fine-tunes 1
Quantizations 1
Get it
Read license, then download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download LiquidAI/LFM3-Omni-2B
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. LFM3-Omni-2B.json. Provenance. Takedown history: none.

Variants

1 quantized or adapter build of LFM3-Omni-2B. Each has its own license check and page.

From: LiquidAI <huggingface.co/LiquidAI>Subject: LFM2-1.2B
From: LiquidAI <huggingface.co/LiquidAI>Subject: LFM2-1.2B-Extract
From: LiquidAI <huggingface.co/LiquidAI>Subject: LFM2-1.2B-RAG
From: LiquidAI <huggingface.co/LiquidAI>Subject: LFM2-1.2B-Tool
From: LiquidAI <huggingface.co/LiquidAI>Subject: LFM2-2.6B
From: LiquidAI <huggingface.co/LiquidAI>Subject: LFM2-2.6B-Exp