fasttext_flutter
On-device text classification and sentence embeddings using fastText .ftz quantized models via Dart FFI — no internet, no server required.
⚠️ Platform Status
Only Android has been tested so far. The build infrastructure (native_toolchain_c hooks) is in place for other platforms but has not been verified. If you test on iOS, macOS, Linux, or Windows, please open a PR or report your results in the issue tracker.
👋 Contributors welcome! See Contributing below.
Platform support
| Platform | Status |
|---|---|
| Android (arm64-v8a, armeabi-v7a, x86_64) | ✅ Verified |
| iOS | 🔲 Untested — help wanted |
| macOS | 🔲 Untested — help wanted |
| Linux | 🔲 Untested — help wanted |
| Windows | 🔲 Untested — help wanted |
Features
- Load
.ftz(quantized) and.bin(full) fastText models predict()— top-k text classification for supervised modelscomputeEmbedding()— dense sentence-vector embeddings (Float32List)FastTextModel.cosineSimilarity()— static cosine-similarity helperFastTextModelType— detectsupervised,cbow, orskipgramat runtime- Background-isolate inference — never blocks the UI thread
- Automatic memory cleanup via
NativeFinalizer+ explicitclose()
Getting started
1. Add the dependency
dependencies:
fasttext_flutter: ^0.1.1
2. Add your model as an asset
flutter:
assets:
- assets/model.ftz
Download a pre-trained language-ID model (917 KB, 177 languages): fasttext.cc/docs/en/language-identification.html
Usage
Load a model
import 'package:fasttext_flutter/fasttext_flutter.dart';
// From Flutter assets
final model = await FastTextModel.loadAsset('assets/lid.176.ftz');
// From an absolute file path
final model = await FastTextModel.load('/sdcard/downloads/model.ftz');
Classify text (supervised models only)
final results = await model.predict('Bonjour le monde', k: 3);
print(results.first.cleanLabel); // fr
print(results.first.probability); // 0.9994...
Compute sentence embeddings (all model types)
final vector = await model.computeEmbedding('Flutter developer');
// → Float32List of length model.dimension
Cosine similarity
final a = await model.computeEmbedding('Flutter developer');
final b = await model.computeEmbedding('Mobile app developer');
final sim = FastTextModel.cosineSimilarity(a, b);
print(sim.toStringAsFixed(4)); // e.g. 0.9797
Check model type
print(model.modelType); // FastTextModelType.supervised / .cbow / .skipgram
print(model.isSupervised); // true for classification models
print(model.dimension); // embedding dimension
print(model.labelCount); // 0 for unsupervised models
Close the model
model.close(); // frees native memory; safe to call multiple times
FastTextPrediction
final r = results.first;
r.label // raw label e.g. '__label__en'
r.cleanLabel // stripped label e.g. 'en'
r.probability // double in [0.0, 1.0]
Error handling
try {
final model = await FastTextModel.load('/bad/path.ftz');
} on FastTextException catch (e) {
print(e.message);
}
Calling predict() on an unsupervised model throws FastTextException with a
clear message directing you to computeEmbedding() instead.
Performance notes
.ftzquantized models are 10–100× smaller than.binand nearly as accurate.- All inference runs in
Isolate.run()— the UI thread is never blocked. - Load the model once and reuse it across requests.
Contributing
This package needs your help to support more platforms!
Only Android has been tested so far. If you can verify (or fix) any of these:
- iOS — swipe
hook/build.dartflags and test on Simulator + device - macOS — test with
flutter run -d macosfrom theexample/folder - Linux — test with
flutter run -d linux - Windows — test with
flutter run -d windows
Please open an issue with your results or a PR with fixes at: github.com/FahadQasim283/fasttext_flutter
Every contribution — bug reports, test results, docs fixes — is welcome.
License
Apache-2.0. See LICENSE.
Bundled fastText C++ sources: © Facebook, Inc., MIT license.
Libraries
- fasttext_flutter
- Flutter/Dart package for on-device fastText text classification and sentence embeddings via Dart FFI.