FastFlowLM

ROCm活跃维护

专为 AMD Ryzen AI NPU 深度优化的本地大模型推理引擎,几分钟内就能在 AMD NPU 上跑起 LLM,省去繁琐配置。

Run LLMs on AMD Ryzen™ AI NPUs in minutes; purpose-built and deeply optimized for the AMD NPUs.

v1.0.12发布于 2026-11-05 01:48 UTC2,034star +7 / 7 天176fork同步于 2026-11-10 05:48 UTC

怎么上手

由 README 提炼,执行前请确认
flm run llama3.2:1b
硬件要求按 README 说明

需要带 XDNA2 NPU 的 AMD Ryzen AI 芯片(Strix、Strix Halo、Kraken、Gorgon Point),无需 GPU;README 未说明显存要求。

纯 CPU 可运行支持 ROCm / AMD
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

在 AMD Ryzen AI NPU 上几分钟内跑起大模型的轻量运行时,无需 GPU

专为 AMD Ryzen AI NPU 深度优化的本地大模型推理引擎,几分钟内就能在 AMD NPU 上跑起 LLM,省去繁琐配置。

核心能力

  • 完全跑在 Ryzen AI NPU 上,不占 GPU 与 CPU
  • 运行时仅 17 MB,安装约 20 秒
  • 单命令 CLI,另有 REST 与 OpenAI 兼容 API
  • 支持最长 256k token 上下文窗口
  • 支持 LLM、视觉、音频、Embedding 与 MoE 模型

容易踩的坑

需先装最新 AMD NPU 驱动 32.0.203.311 或以上,旧版本不再支持;首次运行需联网从 HuggingFace 下载模型内核,下载损坏可用 flm pull <model_tag> --force 重下;本地服务默认占用 52625 端口。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v1.0.12
  1. v1.0.12🚀 FastFlowLM v1.0.12 — Speculative Decoding, MiniCPM-V MoE & Less RAM最新正式版2026-11-05 · 2026-11-05 01:48 UTC

    This release does four things:

    • New models. MiniCPM-V 4.7 35B-A3B, two more Decision 3.0 sizes (d3:edge, d3:flash), and qwen3.5-flash:2b.
    • Faster decoding. New DFlash speculative-decoding tags for Nemotron 3.5 Bolt (up to 1.9× faster) and Qwen3.8-27B. qwen3.8-mtp:27b itself decodes 1.6× faster. The Whisper encoder is about 3× faster.
    • Less host memory. Gemma 4, Nemotron 3.5 Bolt and Qwen3.5 (0.8B/2B/4B) read their embedding tables from disk instead of copying them into RAM. That saves up to 3.7 GiB per model.
    • Many server fixes. These include a server that stopped accepting connections after clients hung up, Qwen3.5 answering ////// after hitting the context limit, wrong vectors from embed-gemma, and Gemma 4 tool-call parsing.

    🆕 New Models

    🖼️ MiniCPM-V 4.7 35B-A3B: minicpm-v-4.7-moe:35b-a3b

    openbmb/MiniCPM-V-4.7-35B-A3B is a Mixture-of-Experts vision model: 35B parameters, about 3B active per token.

    • Takes text and images.
    • Thinking can be turned on. It is off by default, as the model card recommends.
    • Supports tool calling and the prefix cache, pictures included.
    • Context: up to 256k tokens (32k by default).
    • Needs about 22 GB of memory.
    flm run minicpm-v-4.7-moe:35b-a3b
    

    ⚡ DFlash Speculative Decoding: nemotron3.5-bolt-dflash:e4b, qwen3.8-dflash2:27b

    A DFlash draft model proposes up to 7 tokens at a time, and the NPU checks all of them in one pass. The output follows the main model's own distribution.

    TagMain modelDecode speed
    nemotron3.5-bolt-dflash:e4bnemotron3.5-bolt:e4b + NVIDIA's DFlash draft1.3×–1.9× the base model, from short prompts to 16k tokens of context
    qwen3.8-dflash2:27bqwen3.8-mtp:27b + z-lab's DFlash 2 draft1.16× the MTP head on average (0.9×–1.5× per prompt). Code and structured answers gain most.
    • Two-package tags. A DFlash tag downloads only its small draft (0.27 GB for Bolt, 1.4 GB for Qwen3.8) and reuses the main model's package. flm pull downloads whichever is missing. flm rm removes only the draft, and warns when another tag still needs a base model.
    • Everything else works as on the main model: thinking, tool calls, vision, audio (Bolt) and the prefix cache.
    • With a long context, qwen3.8-dflash2:27b is about level with qwen3.8-mtp:27b.
    • Set FLM_DFLASH=0 to turn speculation off and compare against the main model.
    flm run nemotron3.5-bolt-dflash:e4b
    flm run qwen3.8-dflash2:27b
    

    📖 Nemotron Bolt DFlash · Qwen3.8 benchmarks


    ⚡ New Flash Models: qwen3.5-flash:2b, nemotron3.5-bolt-dflash-flash:e4b

    Flash models are built for single-turn requests: a fixed 1k context, a clean state for every request, and a system prompt that is saved once and reused. That makes the first token come back faster.

    • qwen3.5-flash:2b runs the same weights as qwen3.5:2b, so there's nothing new to download. Time to first token is 0.49 s instead of 0.81 s at 1k tokens. Decode is 33 tok/s instead of 29. Large pictures need -r 1.
    • nemotron3.5-bolt-dflash-flash:e4b combines Flash serving with DFlash speculation. It uses the two packages above, so there's no new download. Time to first token is 0.32 s at 64 tokens, and decode is 33–40 tok/s on code.

    Flash models don't support tool calling or continue_final_message.

    📖 Flash Models · Flash benchmarks


    🧭 Decision 3.0: d3:edge and d3:flash

    Two more sizes of the d3 decision model, served with flm serve --decision <tag> on /v1/systemone. They take text and images, like d3:lite,

  2. v1.0.11🚀 FastFlowLM v1.0.11 — Decision Models, a Prefix Cache for Every Chat Model & Logprobs2026-10-29 · 2026-10-29 01:20 UTC
    查看更新说明

    This release does four things:

    • New models. The Decision 3.0 (d3) family from vLLM Semantic Router: five decision models from 0.8B to 27B, served through a new /v1/systemone endpoint. Also LFM3-1.7B and Nemotron 3.5 Bolt E4B.
    • The prefix cache now covers almost every chat model. flm serve keeps several saved prompts at once, so agents that share a system prompt and tools, or switch between conversations, don't re-read the whole prompt on every request.
    • More OpenAI API fields: logprobs / top_logprobs, seed, continue_final_message and repeat_last_n.
    • max_tokens is exact. A reply used to be one token longer than max_tokens asked for.

    It also fixes a gemma4-it:12b crash on repeated image or audio requests.


    🆕 New Models

    🧭 Decision 3.0 (d3): d3:lite, d3:nano, d3:mini, d3:turbo, d3:ultra

    d3 is the decision model that vLLM Semantic Router calls for routing, guardrails and tool selection. It doesn't generate text. You send it a state (any JSON) and one or more questions, and it returns a probability for every option:

    • choice: pick one of up to 255 options
    • noul: no / yes
    • score: 2 to 10 ordered levels

    FLM serves the same HTTP API as the upstream d3 server, so vLLM Semantic Router can use FLM as its d3 backend without changes.

    A decision model runs in server mode, on its own or next to a chat model:

    flm serve --decision d3:lite                 # decision model only
    flm serve qwen3.5:4b --decision d3:lite      # next to a chat model
    
    TagBackboneDownloadInputsOne short question*
    d3:liteQwen3.5-0.8B0.8 GBtext, images~0.16 s
    d3:nanoQwen3.5-2B2.0 GBtext, images~0.26 s
    d3:miniQwen3.5-4B3.4 GBtext, images~0.56 s
    d3:turboQwen3.5-27B16.6 GBtext, images, videos, box / track / assets~3 s
    d3:ultraQwen3.5-27B (newer fine-tune)16.6 GBsame as d3:turbo~3 s

    * About 330 tokens, over HTTP, on an idle machine.

    • Endpoints.
      • POST /v1/systemone (alias /v1/decisions) answers decision requests.
      • GET /v1/systemone/models lists the decision models this build can serve.
    • Input limit: 32,768 tokens per question. A longer prompt gets max_length_exceeded for that question. Nothing is truncated.
    • Accuracy. On the Decision Index public suite, every model stays close to the upstream BF16 model. Each model's numbers are on the benchmark page.
    • d3:turbo and d3:ultra:
      • The state is computed once per request. Every question then reads it, so many questions about one state cost little more than one. That is 2.5× faster at 16 questions and up to 32× with a 4k-token state.
      • box and track questions locate objects in images and follow them through videos. assets put images in questions, options and instructions.
      • Videos need the FFmpeg shared libraries (FFmpeg 6, 7 or 8) on the machine. FLM doesn't ship FFmpeg. It loads it the first time a video arrives. Without it, encoded videos get a clear 422, and frame lists ({"frames": [...]}) still work. See the d3 page for install steps.
      • Memory. Plan for about 28 GB of free memory.
      • long_context: true is refused with a 422.

    📖 d3 models · d3 benchmarks


    💧 LFM3-1.7B: lfm3:1.7b

    LiquidAI LFM3-1.7B runs fully on the NPU, prefill, all 24 layers and the LM head included.

    • Thinking is on by default. You can turn it off.
    • Supports tool calling.
    • Context: up to 32k tokens.
    • Uses LiquidAI's Q4_0 quantization-aware b
  3. v1.0.10🚀 FastFlowLM v1.0.10 — Constrained Decoding & More Accurate Whisper2026-10-22 · 2026-10-22 22:59 UTC
    查看更新说明

    This release does three things:

    • Reasoning, tool calls and structured output are handled one way for every model on /v1/chat/completions.
    • tool_choice and response_format are enforced while the model generates, not just requested.
    • Whisper transcription is more accurate, and /v1/audio/transcriptions now supports language, prompt and response_format.

    It also fixes several flm serve bugs, including Lemonade failing to launch FLM on Linux.


    ✨ New Features

    🧩 OpenAI API: Shared Chat Parsing and Constrained Decoding

    PR #790

    Every model writes its answer in its own markup. Qwen3 uses <think> and <tool_call>, Gemma 4 uses a thought channel and call:f{…}, GPT-OSS uses Harmony channels, and LFM2 writes Python calls. Until now each model had its own parser for this. In v1.0.10, one shared parser handles all of them, so /v1/chat/completions returns the same OpenAI-shaped message whatever the model:

    • reasoning_content, content and tool_calls are split the same way for every model, streamed or not.
    • The streamed deltas add up to exactly the non-streamed reply.
    • Tool-call markup counts as a call only when the request includes tools. A reply that is only tool calls has content: null, as in the OpenAI API.

    Constrained decoding. Before each token is sampled, FLM works out which tokens can still lead to valid output and rules out the rest. This uses xgrammar. The model can't misspell a tool name, give an argument the wrong type, leave out a required field, or wrap your JSON in a Markdown fence. You control it with the standard OpenAI request fields:

    FieldWhat FLM enforces
    tool_choice: "none"No tool call
    tool_choice: "auto"Any tool call is well-formed and names a real tool
    tool_choice: "required"At least one tool call
    tool_choice: {"type": "function", ...}A call to that function
    parallel_tool_callsOne call or several
    response_format: {"type": "json_object"}Valid JSON
    response_format: {"type": "json_schema", ...}JSON that matches your schema

    Bad values return a clear 400 error instead of being ignored. This covers a malformed tool_choice, an unknown function name, "required" with no tools, and a schema that can't be compiled. Small models that don't see tools in their prompt (Qwen3 up to 1.7B, Qwen3.5 0.8B) also return a 400 for a forced tool call, instead of making up a call to a tool they never saw.

    When the model's thinking is off, it can no longer slip its answer into a reasoning block. It answers directly in the requested format.

    Coming later: a grammar request field, so you can pass your own grammar for output that isn't JSON (for example, digits only or a fixed set of labels). The constrained-decoding engine in this release already supports this. Only the API field is still to come.

    Other API changes:

    • Streaming usage now follows OpenAI. A streamed response carries usage only when the request sets stream_options: {"include_usage": true}. In that case the usage comes in one final chunk before [DONE]. ⚠️ If your client read usage from streamed responses, add include_usage.
    • null request fields are treated as unset. Some OpenAI clients send null for every option they leave out. Before, this could return a 400 or 500 error, for example for parallel_tool_calls: null or tool_choice: null.

    New docs:


    🎙️ Audio Transcription: /v1/audio/transcriptions

    PR #794, by community contributor [@quine00](https://github.com

  4. v1.0.9🚀 FastFlowLM v1.0.9 — `flm validate` Fix2026-10-15 · 2026-10-15 21:35 UTC
    查看更新说明

    This is a maintenance release. It fixes flm validate on Linux, which wrongly reported "No NPU device found." in v1.0.8.


    🐛 Bug Fixes

    ✅ flm validate Finds the NPU Again on Linux

    PR #796

    In v1.0.8, flm validate on Linux printed "No NPU device found." and exited with status 1, even on systems where the NPU worked fine and flm run and flm serve had no problems.

    The cause: since v1.0.8, flm opens the NPU device at startup, before it runs any command. flm validate then tried to open the same /dev/accel/accel* device a second time to check it. The amdxdna driver allows only one open of a device per process, so the second open failed with EBUSY. The check skipped busy devices without saying anything, so it found no device at all.

    What changed:

    • flm validate now runs before flm opens the NPU, so its check gets the device.
    • If a device node is busy, flm validate now reports it (device busy) instead of skipping it silently. The --json output marks it with "busy": true.

    If you run flm validate in a setup script or CI job, upgrade to get the right result back.


    📦 MSI Installer: Uninstall v1.0.8 First

    The v1.0.8 MSI (flm-setup.msi) was published with the wrong version number. Windows registered it as version 8 instead of 1.0.8, so it shows up as "8" in Installed apps. Because 8 is higher than 1.0.9, the v1.0.9 MSI treats v1.0.8 as a newer install and stops with "A newer version of flm is already installed."

    If you installed v1.0.8 with the MSI, uninstall FLM from Settings → Apps → Installed apps first, then run the v1.0.9 MSI. Your downloaded models are kept. The v1.0.9 MSI has the right version number, so later upgrades will work normally again.

    This only affects the MSI. The portable .zip packages and the Linux packages are not affected.


    🌟 Summary

    Highlight
    ✅flm validate on Linux finds the NPU again, instead of reporting "No NPU device found." (broken in v1.0.8)
    📦If you installed v1.0.8 with the MSI, uninstall it before running the v1.0.9 MSI

    Thanks for your support — see you in the next one! 🚀

  5. v1.0.8Release v1.0.82026-10-12 · 2026-10-12 17:36 UTC
    查看更新说明

    This release adds minicpm-v-4.7:1b, a 1B vision-language model with toggleable thinking and tool calling. It also opens up the source of the Gemma 4 engine, so you can build it yourself and swap individual operators through new override hooks. And for the first time, the release ships HRX packages as a preview: builds of FastFlowLM that run on the HRX NPU runtime instead of XRT.


    📦 New Model Support

    👁️ MiniCPM-V-4.7-1B

    FastFlowLM now supports minicpm-v-4.7:1b, a compact image-text-to-text model from OpenBMB, with toggleable thinking and tool calling.

    • Tag: minicpm-v-4.7:1b
    • Context: 32k by default, up to 256k

    Run in CLI mode:

    flm run minicpm-v-4.7:1b
    

    Run in server mode:

    flm serve minicpm-v-4.7:1b
    

    🖼️ How It Sees Images

    MiniCPM-V-4.7 handles images the same way the original MiniCPM-V does:

    • The model always sees a downscaled view of the whole image. Large images are also split into up to 9 tiles of about 448 × 448 pixels each.
    • Image TTFT stops growing at about 1080p. From that size up, every image uses the maximum 9 tiles, so a 4K image costs about the same as a 1080p one. Very fine detail in large images is downscaled.
    • --img-pre-resize (-r) has no effect on this model, because the tiling already decides the input resolution.
    • Video and audio input are not supported.

    🎛️ MiniCPM-V does not ship its own sampling defaults. FLM starts from temperature 0.7, top_p 0.8, top_k 20 and presence penalty 1.5. These are the Qwen3.5 non-thinking defaults, because MiniCPM-V-4.7-1B's language model has the same architecture as Qwen3.5-0.8B.

    For more details, see the model card and benchmark results.


    🔓 The Gemma 4 Engine Is Now Open Source

    PR #763

    Until now, every model engine in FastFlowLM shipped only as a prebuilt library. In this release the source of the Gemma 4 E2B/E4B engine is public. It covers the text decode and prefill paths, the vision encoder and the audio encoder, plus the shared host code they depend on. You can now read exactly how each Gemma 4 operator is dispatched to the NPU, and build the engine yourself. The other engines, including the Gemma 4 flash and 12B variants, still ship prebuilt.

    🛠️ Build It from Source

    Source builds are opt-in. By default, FLM still links the prebuilt engine, so nothing changes unless you ask for it.

    Linux:

    cd src
    cmake --preset linux-default -DFLM_BUILD_GEMMA4E=ON
    cmake --build build
    

    Windows (developer command prompt):

    cd src
    cmake --preset windows-default -DFLM_BUILD_GEMMA4E=ON
    cmake --build build
    

    The source-built library goes into the build tree and does not overwrite the prebuilt one. CMake caches the option, so to switch back, reconfigure with -DFLM_BUILD_GEMMA4E=OFF or use a fresh build directory.

    OptionDefaultEffect
    FLM_BUILD_GEMMA4EOFFBuild the Gemma 4 engine from src/detail/ instead of using the prebuilt one
    FLM_ENGINE_NATIVE_ARCHOFFAdd -march=native. The result only runs on CPUs like the build machine, so do not redistribute it
    FLM_ENGINE_VERBOSE0Logging level for the source-built engine
    FLM_ENGINE_DEBUG_LEVEL0Debug level for the source-built engine
    FLM_OVERRIDE_FLAGSemptyExtra compile flags for operator overrides (see below)

    Source builds work on Linux, Windows and the HRX backend. CI now builds and sweep-tests a source-built Gemma 4 package on both Linux and Windows.

    🧩 Operator Override Hooks for IRON

    Every Gemma 4 operator dispatch (52 sites across text, vision, audio and weight preload) is now wrapped in an FLM_OVERRIDE annotation. In a normal build the annotation expan

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    ⚡ FastFlowLM (FLM) — Unlock Ryzen™ AI NPUs

    Run large language models — now with Vision, Audio, Embedding and MoE support — on AMD Ryzen™ AI NPUs in minutes.
    No GPU required. Faster and over 10× more power-efficient. Supports context lengths up to 256k tokens. Ultra-Lightweight (17 MB). Installs within 20 seconds.

    📦 The only out-of-box, NPU-first runtime built exclusively for Ryzen™ AI.
    🤝 A familiar single-command CLI — deeply optimized for NPUs.
    ✨ From Idle Silicon to Instant Power — FastFlowLM Makes Ryzen™ AI Shine.

    FastFlowLM (FLM) supports all Ryzen™ AI Series chips with XDNA2 NPUs (Strix, Strix Halo, Kraken, and Gorgon Point).


    🔗 Quick Links

    🔽 Download | 📊 Benchmarks | 📦 Model List

    🐧 Linux Getting Started Guide

    📖 Docs | 📺 Demos | 💬 Discord


    🚀 Quick Start

    A packaged FLM Windows installer is available here: flm-setup.msi. For more details, see the release notes.

    📺 Watch the quick start video (Windows)

    [!IMPORTANT]
    ⚠️ Use the latest AMD NPU driver — 32.0.203.311 or above (check via Task Manager→Performance→NPU or Device Manager). Earlier versions are no longer supported.
    ⚙️ Tip:

    After installation, open PowerShell (Win + X → I). To run a model in terminal (CLI Mode):

    flm run llama3.2:1b
    

    Notes:

    • Internet access to HuggingFace is required to download the optimized model kernels.
    • Sometimes downloads from HuggingFace may get corrupted. If this happens, run flm pull <model_tag> --force (e.g. flm pull llama3.2:1b --force) to re-download and fix them.
    • By default, models are stored in:
      • Windows: C:\Users\<USER>\.flm\models\
      • Linux: ~/.config/flm/
    • During installation on Windows, you can select a different base folder (e.g., if you choose C:\Users\<USER>\flm, models will be saved under C:\Users\<USER>\flm\models\).
    • On Linux, you can override the default location by setting the FLM_MODEL_PATH environment variable.
    • To disable the startup version check, set FLM_DISABLE_UPDATE_CHECK=1.
    • ⚠️ If HuggingFace is not accessible in your region, manually download the model (check this issue) and place it in the chosen directory.

    🎉🚀 FastFlowLM (FLM) is ready — your NPU is unlocked and you can start chatting with models right away!

    Open Task Manager (Ctrl + Shift + Esc). Go to the Performance tab → click NPU to monitor usage.

    ⚡ Quick Tips:

    • Use /verbose during a session to turn on performance reporting (toggle off with /verbose again).
    • Type /bye to exit a conversation.
    • Run flm list in PowerShell to show all available models.

    To start the local server (Server Mode):

    flm serve llama3.2:1b
    

    The model tag (e.g., llama3.2:1b) sets the initial model, which is optional. If another model is requested, FastFlowLM will automatically switch to it. The local server runs on port 52625 (default).

    FastFlowLM Docs


    📰 In the News

    • 08/11/2026 🎉 FLM is now part of ROCm (v1.0.0) — the repo has moved to AMD's open-source ROCm organization.

    • 08/11/2026 🎉 FLM releases its first SmolVLA model (v1.0.0) — a Vision-Language-Action robotics policy running on the NPU. See the model card and benchmarks.

    • 07/17/2026 🎉 FLM is now part of AMD news. Read our story — from a 2025 university project to AMD.

    • 03/11/2026 🎉 FLM now supports Linux 🐧 ! To get started, check out the quick start guide or the Lemonade Server docs, and watch the short video for a quick walkthrough of FLM on Linux via Lemonade 🍋.

    • 10/01/2025 🎉 FLM was integrated into AMD's Lemonade Server 🍋. Watch this short demo about using FLM in Lemonade.


    🧠 Local AI on NPU

    FLM makes it easy to run cutting-edge LLMs (and now VLMs) locally with:

    • ⚡ Fast and low power
    • 🧰 Simple CLI and API (REST and OpenAI API)
    • 🔐 Fully private and offline

    No model rewrites, no tuning — it just works.


    ✅ Highlights

    • Runs fully on AMD Ryzen™ AI NPU — no GPU or CPU load
    • Lightweight runtime (17 MB) — installs within 20 seconds, easy to integrate
    • Developer-first flow — a familiar single-command CLI, optimized for NPU
    • Support for long context windows — up to 256k tokens (e.g., Qwen3-4B-Thinking-2507)
    • No low-level tuning required — You focus on your app, we handle the rest

    📄 License

    • All orchestration code and CLI tools are open-source under the MIT License.
    • The NPU-accelerated binary kernels are not open source, but are completely free for any use, including non-commercial and commercial use, and may be freely redistributed in unmodified form under the FastFlowLM NPU Binary License.
    • Please acknowledge FastFlowLM in your README/project page (or product) as follows:
      Powered by [FastFlowLM](https://github.com/ROCm/FastFlowLM)
      

    💬 Have feedback/issues or want early access to our new releases? Open an issue or Join our Discord community


    🙏 Acknowledgements


    🛠️ Building from Source

    For developers who want to build FastFlowLM from source, we provide CMake presets for a convenient and consistent build experience.

    Prerequisites

    • Git
    • CMake (version 3.22 or higher)
    • A C++20 compatible compiler (e.g., GCC, Clang, MSVC)
    • Ninja (recommended)

    Build Instructions

    More details on the exact procedure, with dependencies to be installed, for Linux can be found in linux-getting-started.md.

    1. Clone the repository:

      git clone --recursive https://github.com/ROCm/FastFlowLM.git
      cd FastFlowLM/src
      
    2. Configure CMake using presets:

      • For Linux:

        cmake --preset linux-default
        

        This will configure the build to install to /opt/fastflowlm.

        To build the Gemma 4 engine from source instead of using the prebuilt engine:

        cmake --preset linux-default -DFLM_BUILD_GEMMA4E=ON
        cmake --build build
        

        CMake caches this option. To switch back to the prebuilt engine, reconfigure with -DFLM_BUILD_GEMMA4E=OFF or use a fresh build directory.

      • For Windows (in a developer command prompt):

        cmake --preset windows-default
        

        Add -DFLM_BUILD_GEMMA4E=ON to build the Gemma 4 engine from source.

    3. Build the project:

      cmake --build build
      
    4. Install the project (optional):

      • For Linux:

        sudo cmake --install build
        
      • For Windows (with administrator privileges):

        cmake --install build