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"} ] }'
| library_name: mlx | |
| license: other | |
| license_name: lfm1.0 | |
| license_link: https://huggingface.co/LiquidAI/LFM2.5-230M/blob/main/LICENSE | |
| base_model: LiquidAI/LFM2.5-230M | |
| pipeline_tag: text-generation | |
| language: | |
| - en | |
| tags: | |
| - mlx | |
| - lora | |
| - tool-calling | |
| - on-device | |
| - lfm2.5 | |
| - edge | |
| # pomo-1 | |
| A LoRA fine-tune of [LiquidAI/LFM2.5-230M](https://huggingface.co/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.: | |
| ```json | |
| {"name":"delete_todo","arguments":{"target":"Book the moving truck"}} | |
| ``` | |
| ## Usage (MLX) | |
| ```python | |
| 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). | |
| <!-- FILL: dataset size, iters, and final checkpoint used for this upload. --> | |
| ## Evaluation | |
| <!-- NOTE: numbers below are from the v1 dataset (list NOT in prompt). Replace with the | |
| list-aware (v2) results before treating these as representative, and report on a | |
| held-out test split, not the selection val set. --> | |
| 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](https://huggingface.co/LiquidAI/LFM2.5-230M/blob/main/LICENSE). | |
| ## Citation | |
| Base model: | |
| ```bibtex | |
| @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} | |
| } | |
| ``` |