@desert-ant-labs/emo

中文文档
4.3.0发布于 2026/11/06SEE LICENSE IN LICENSE.mdTypeScriptES Module近 30 天下载 2391

On-device multilingual emoji suggestion for JavaScript. Runs in the browser (WebAssembly + LiteRT.js) and server-side in Node (native), from one import.

原始使用文档
文档目录4 节
  1. Loading the model
  2. Bundlers and SSR
  3. Platforms
  4. License

@desert-ant-labs/emo

On-device multilingual emoji suggestions for JavaScript that run in the browser and in Node. Give Emo a short task, calendar entry, note, or message and it returns ranked emoji across 23 languages. Text stays local.

Two entries share one Emo API:

  • @desert-ant-labs/emo (default): a WebAssembly pipeline with LiteRT.js inference, for the browser. It has no native dependencies, so a single import builds cleanly for every target of a multi-target bundler (Next.js, Remix, SvelteKit, Nuxt), including the browser bundle and the Client-Component SSR pass those frameworks render in Node. It is safe to import during server-side rendering, but LiteRT.js needs a browser (or Web Worker) to initialize, so Emo.load() runs inference only in the browser; calling it in plain Node throws an actionable error pointing you to /native.
  • @desert-ant-labs/emo/native: a prebuilt native core, Core ML on macOS and LiteRT on Linux, for server-side inference in Node. No @litertjs/core, no build tools, no flags. Import it from server-only code (API routes, server actions, plain Node scripts). Do not import it from a component that also renders in the browser.
# Browser (default entry):
npm i @desert-ant-labs/emo @litertjs/core

# Server-side inference in Node (/native entry) needs no extra install:
npm i @desert-ant-labs/emo

The model is downloaded from Hugging Face on first use at the SDK's pinned tag, then cached. Nothing model-sized is shipped in the npm tarball.

import { Emo } from "@desert-ant-labs/emo";

const emo = await Emo.load();
const suggestions = await emo.suggestions("Pay my bills", { limit: 3 });
// [{ emoji: "💰", confidence: 0.65 }, ...]

emo.dispose(); // release the model (both builds)

Server-only code that wants the native core imports the same API from the /native subpath:

import { Emo } from "@desert-ant-labs/emo/native"; // server only

Loading the model

By default Emo.load() downloads the model files from Hugging Face (desert-ant-labs/emo) at the SDK's pinned tag, verifies them, and caches them. The browser build fetches the .tflite for LiteRT.js and caches it in the browser. The native build (/native) fetches the .tflite on Linux or the .mlmodelc/ on macOS and caches it under the OS cache dir.

To self-host or run fully offline, skip the Hugging Face download:

  • directory: an explicit model directory (native build, or the browser build under Node). Files already there are used offline, otherwise the model is downloaded into it.
  • modelBaseUrl: a base URL you serve the model files from, for example "/assets/emo/" (browser build).

Emo.load() also accepts:

  • cacheRoot: base directory for the managed on-disk cache, default ~/.cache (native build, or the browser build under Node).
  • onProgress: load or download progress callback, fraction in [0, 1].
  • skinTone: one of "default", "light", "mediumLight", "medium", "mediumDark", or "dark" when calling suggestions.

Browser-build-only options:

  • litert: a bring-your-own @litertjs/core module.
  • litertWasmDir: URL or path to the LiteRT.js Wasm directory.
  • accelerator: one of "wasm", "webgpu", or "webnn".

Bundlers and SSR

The default @desert-ant-labs/emo import is safe to use directly in components: it is pure JavaScript + WebAssembly with no native modules, so bundlers can build it for the browser and for the Node SSR pass from the same module graph with no configuration.

The @desert-ant-labs/emo/native subpath loads a native addon (via koffi) and is for server-only code. If you import it inside a framework that bundles server code (for example a Next.js Route Handler or Server Action), mark it external so the bundler does not try to bundle the native binary. In Next.js:

// next.config.js
module.exports = { serverExternalPackages: ["@desert-ant-labs/emo"] };

Platforms

The native server build (/native) ships for linux-x64, linux-arm64, and darwin-arm64. Other Node platforms throw a clear error at load(); use the default WebAssembly build, the Swift package, or a browser for those.

License

Desert Ant Labs Source-Available License. Free for most apps, and a commercial license is required at scale. Full terms are at the link. Licensing: [email protected].

Third-party notices for the SDK: THIRD_PARTY_NOTICES.md.

Third-party notices for the weights: THIRD_PARTY_NOTICES.md.

版本与发布记录

@desert-ant-labs/emo 共发布 37 个版本,首次发布于 2026/06/24;过去 12 个月发布了 37 个版本。

版本发布日期距今
4.3.0latest2026/11/067 天前
4.2.32026/10/3113 天前
4.2.22026/10/3113 天前
4.2.12026/10/2816 天前
4.2.02026/10/2717 天前
4.1.02026/10/2024 天前

关于 @desert-ant-labs/emo 的常见问题

@desert-ant-labs/emo 是什么?

On-device multilingual emoji suggestion for JavaScript. Runs in the browser (WebAssembly + LiteRT.js) and server-side in Node (native), from one import.

如何安装 @desert-ant-labs/emo?

在项目目录运行 npm install @desert-ant-labs/emo,或使用 pnpm add / yarn add / bun add。

@desert-ant-labs/emo 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@desert-ant-labs/emo 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@desert-ant-labs/emo 可以商用吗?

@desert-ant-labs/emo 使用 SEE LICENSE IN LICENSE.md 许可。许可条款写在包内的独立文件中,请阅读该文件确认可否商用。以上为概括,不构成法律意见,请以许可原文为准。

@desert-ant-labs/emo 的下载量有多少?

根据 npm 官方下载统计,@desert-ant-labs/emo 在 2026/10/12 – 2026/11/10 这 30 天内被下载 2,391 次,日均约 80 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@desert-ant-labs/emo 还在维护吗?

最新版本 4.3.0 发布于 2026/11/06(7 天前);至今共发布 37 个版本,其中过去 12 个月发布了 37 个;首次发布于 2026/06/24。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。