Instructions to use sabeshbesh/pomo-1 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use sabeshbesh/pomo-1 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("sabeshbesh/pomo-1") 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 sabeshbesh/pomo-1 with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "sabeshbesh/pomo-1"
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "sabeshbesh/pomo-1" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent new
How to use sabeshbesh/pomo-1 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 "sabeshbesh/pomo-1"
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 sabeshbesh/pomo-1
Run Hermes
hermes
- OpenClaw new
How to use sabeshbesh/pomo-1 with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "sabeshbesh/pomo-1"
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 "sabeshbesh/pomo-1" \ --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"
- MLX LM
How to use sabeshbesh/pomo-1 with MLX LM:
Generate or start a chat session
# Install MLX LM uv tool install mlx-lm # Interactive chat REPL mlx_lm.chat --model "sabeshbesh/pomo-1"
Run an OpenAI-compatible server
# Install MLX LM uv tool install mlx-lm # Start the server mlx_lm.server --model "sabeshbesh/pomo-1" # Calling the OpenAI-compatible server with curl curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "sabeshbesh/pomo-1", "messages": [ {"role": "user", "content": "Hello"} ] }'
pomo-1
A LoRA fine-tune of LiquidAI/LFM2.5-230M
for on-device to-do tool-calling. Given a short natural-language utterance and the
user's current to-do list, pomo-1 emits a single structured tool call to create,
update, or delete a to-do. Built to run locally on Apple Silicon via MLX.
This is a task-specific model, not a general assistant. It does one thing: turn an utterance + a small list of existing to-dos into one JSON tool call.
Intended use
- In scope: single-turn to-do CRUD intent → one tool call, on-device.
- Out of scope: multi-turn dialogue, reasoning, general chat, code, or any task the base model is not recommended for (advanced math, code generation, creative writing). Inherits the base model's limits.
Tools
| tool | arguments |
|---|---|
create_todo |
title (str), due (str | null) — ignores the current list |
update_todo |
target (str), title (str | null), due (str | null) |
delete_todo |
target (str) |
none |
{} — emitted when the referenced to-do is not in the list |
For update_todo / delete_todo, target is a verbatim copy of one item in the
provided list. If the referenced item is absent, the model emits none.
Prompt format
The current to-do list (0–5 items) is injected into the prompt. Training and inference must use this exact layout:
Todos:
- <todo 1>
- <todo 2>
User: <utterance>
An empty list renders as Todos:\n(none). Output is a JSON string, e.g.:
{"name":"delete_todo","arguments":{"target":"Book the moving truck"}}
Usage (MLX)
from mlx_lm import load, generate
from mlx_lm.sample_utils import make_sampler
model, tokenizer = load("<YOUR_HF_REPO>") # e.g. sabeshbesh/pomo-1
prompt = "Todos:\n- Book the moving truck\n- Water the front yard plants\n\nUser: delete moving truck task"
tokens = tokenizer.apply_chat_template(
[{"role": "user", "content": prompt}],
add_generation_prompt=True, tokenize=True,
)
out = generate(model, tokenizer, prompt=tokens, max_tokens=96,
sampler=make_sampler(temp=0.0))
print(out) # {"name":"delete_todo","arguments":{"target":"Book the moving truck"}}
Greedy decoding (temp=0.0) is recommended for deterministic tool calls. The base
model's general-purpose defaults are temperature 0.1, top_k 50, repetition_penalty 1.05.
Training
- Base: LiquidAI/LFM2.5-230M (LFM2 hybrid: 14 layers, 8 gated short-conv + 6 GQA).
- Method: LoRA SFT via
mlx_lm.lora. - Adapter: rank 16, scale 16, dropout 0.05, applied to all 14 layers;
mask_prompt: true. - Data format: legacy
{"prompt", "completion"}JSONL; completion is a JSON-string tool call. - Hardware: Apple Silicon (MLX).
Evaluation
Held-out validation (n=300), best checkpoint, greedy decoding:
| metric | score |
|---|---|
| parse rate (valid JSON) | 1.000 |
| tool-name accuracy | 0.997 |
| argument exact-match | 0.563 |
| full match (name + args) | 0.563 |
Metric definitions: parse rate = fraction of outputs that are valid tool-call JSON; tool-name accuracy = correct tool selected; argument exact-match = arguments exactly correct; full match = both correct.
Known limitation of this eval: these figures were measured on a dataset variant
where the current to-do list was not included in the prompt, which makes correct
target selection for update/delete structurally impossible in many cases — the
argument/full-match scores are a floor, not a ceiling. No baseline comparison against
the prior model is included. Treat these numbers as provisional.
License
Governed by the base model's license, lfm1.0. See the
base model license.
Citation
Base model:
@article{liquidAI2026230M,
author = {Liquid AI},
title = {LFM2.5-230M: Built to Run Anywhere},
journal = {Liquid AI Blog},
year = {2026},
note = {www.liquid.ai/blog/lfm2-5-230m}
}
- Downloads last month
- 156
Quantized