Instructions to use ldenoue/title-onnx with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use ldenoue/title-onnx with MLX:
# Make sure mlx-lm is installed # pip install --upgrade mlx-lm # Generate text with mlx-lm from mlx_lm import load, generate model, tokenizer = load("ldenoue/title-onnx") prompt = "Write a story about Einstein" messages = [{"role": "user", "content": prompt}] prompt = tokenizer.apply_chat_template( messages, add_generation_prompt=True ) text = generate(model, tokenizer, prompt=prompt, verbose=True) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Pi
How to use ldenoue/title-onnx with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "ldenoue/title-onnx"
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "ldenoue/title-onnx" } ] } } }Run Pi
# Start Pi in your project directory: pi
- MLX LM
How to use ldenoue/title-onnx with MLX LM:
Generate or start a chat session
# Install MLX LM uv tool install mlx-lm # Interactive chat REPL mlx_lm.chat --model "ldenoue/title-onnx"
Run an OpenAI-compatible server
# Install MLX LM uv tool install mlx-lm # Start the server mlx_lm.server --model "ldenoue/title-onnx" # Calling the OpenAI-compatible server with curl curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ldenoue/title-onnx", "messages": [ {"role": "user", "content": "Hello"} ] }' - Hermes Agent
How to use ldenoue/title-onnx with Hermes Agent:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "ldenoue/title-onnx"
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default ldenoue/title-onnx
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use ldenoue/title-onnx with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "ldenoue/title-onnx"
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "ldenoue/title-onnx" \ --custom-provider-id mlx-lm \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
Title
Suggest a title and description for any text.
On-device titles and descriptions: a short factual title and a one- to two-sentence description for any passage of text.
| Platforms | iOS, macOS, tvOS, visionOS |
| Weights | v0.1.0 |
Get a title and a one or two sentence description for any passage of text, on device.
Title is fine-tuned on transcript clips, but it works on any prose. The register is deliberately plain, with no emoji, no hashtags and no clickbait, and a description identifies this passage rather than its topic.
Install
Swift (requirements)
.package(url: "https://github.com/Desert-Ant-Labs/desert-ant-core.git", from: "4.2.3",
traits: ["MLX"])
Then add the Title product to your target. The MLX trait is required: without it the module compiles as a stub.
Usage
Title runs only on Apple platforms, on the GPU through MLX. The other Desert Ant models on Apple platforms run on Core ML. We measured Title writing text 5.7-8.3x faster on the GPU than on the Neural Engine. Because Title needs MLX, you turn Title on with the MLX package trait. A build that leaves out the trait fails at compile time, so you can't ship an app without a working model by mistake.
Loading the model is slow and writing a card is fast, so create one Titles and reuse it. Titles is an actor, because MLX isn't safe to drive from several tasks at once. Calls from several tasks run one at a time.
On iOS, call suspend() before your app enters the background and resume() when it returns. iOS revokes GPU access in the background, and MLX crashes the app if a generation is still running. suspend() cancels the running generation, and the call retries after resume().
Swift
Title doesn't download its weights. Download the model files from Hugging Face, and point the initializer at that folder:
import Title
let titles = try await Titles(directory: modelFolder)
let card = try await titles.describe(text)
card.title // "Filming a two-person podcast on iPhone"
card.description // one or two sentences
card.isEmpty // true when the model returned neither
On unusual input, Title can keep generating without end. maxTokens caps each run, at 96 tokens by default:
let titles = try await Titles(directory: modelFolder, maxTokens: 96)
With Clips
To give each clip a title and a description, pass the clips to Title. cards(for:) returns the cards in the same order as the clips.
let cards = try await titles.cards(for: moments) // index-aligned with moments
let card = try await titles.card(for: moments[0])
cards(for:) writes one card at a time. One generation already keeps the GPU busy, so parallel generations aren't faster. On a phone, parallel generations also add heat, and the phone throttles partway through a long video.
Other kinds of text
We fine-tuned Title on transcript clips. Title also writes accurate cards for news paragraphs, product descriptions and emails. Title can still get details wrong on general prose.
Files
Title's files form one MLX model folder. Pass the whole folder to Titles(directory:).
| File | Contents |
|---|---|
model.safetensors |
6-bit quantized weights |
model.safetensors.index.json |
Shard index. Keep this file: the loader needs it, even with a single shard. |
config.json |
Architecture and quantization config |
generation_config.json |
Decode defaults |
tokenizer.json, tokenizer_config.json |
Byte-level BPE with merges |
chat_template.jinja |
The chat template we trained the fine-tune against |
Keep the chat template as shipped. A different template changes the task the model performs.
The prompt
The SDK sends Title the exact instruction we fine-tuned the model on, and parses the reply for you. The model replies with two labeled lines:
TITLE: <3-8 words, no final punctuation>
DESC: <1-2 sentences>
The model sometimes drifts off this format, so parse the reply tolerantly. When the reply has no labels, the SDK takes the first line as the title. When the SDK finds neither a title nor a description, card.isEmpty is true.
Apple only
MLX runs only on Apple silicon, so Title has no Android, Linux, Windows, browser or Node build. We also built Title for Core ML, to compare. The Neural Engine is limited by memory bandwidth when a model writes short text one token at a time. The Core ML build lost to MLX on time to first token, tokens per second, load time and memory use. We don't plan to ship the Core ML build.
Limitations
- Title sometimes opens a description with a stock phrase that its instruction forbids. Read each card before it reaches a user.
- Title can get details wrong on general prose. It's most accurate on transcript clips, news paragraphs, product descriptions and emails.
- On unusual input, Title can keep generating without end.
maxTokenscaps each run.
Built on
ibm-granite/granite-4.0-350m: the base model we fine-tuned Title from.
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: licensing@desertant.com.
Third-party notices for the weights: THIRD_PARTY_NOTICES.md.
Citation
@software{title_2026,
title = {Title: On-device titles and descriptions: a short factual title and a one- to two-sentence description for any passage of text},
author = {Desert Ant Labs},
year = {2026},
url = {https://huggingface.co/desert-ant-labs/title},
}
ยฉ 2026 Desert Ant Labs ยท https://desertant.com
- Downloads last month
- 276