Instructions to use textilelabs/Loom-Planck-1.2m with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use textilelabs/Loom-Planck-1.2m with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="textilelabs/Loom-Planck-1.2m")# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("textilelabs/Loom-Planck-1.2m") model = AutoModelForCausalLM.from_pretrained("textilelabs/Loom-Planck-1.2m", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use textilelabs/Loom-Planck-1.2m with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf textilelabs/Loom-Planck-1.2m:Q4_K_M # Run inference directly in the terminal: llama cli -hf textilelabs/Loom-Planck-1.2m:Q4_K_M
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf textilelabs/Loom-Planck-1.2m:Q4_K_M # Run inference directly in the terminal: llama cli -hf textilelabs/Loom-Planck-1.2m:Q4_K_M
Build from source code
git clone https://github.com/ggml-org/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-app # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama serve -hf textilelabs/Loom-Planck-1.2m:Q4_K_M # Run inference directly in the terminal: ./build/bin/llama cli -hf textilelabs/Loom-Planck-1.2m:Q4_K_M
Use Docker
docker model run hf.co/textilelabs/Loom-Planck-1.2m:Q4_K_M
- Llama new
- LM Studio
- Jan
- vLLM
How to use textilelabs/Loom-Planck-1.2m with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "textilelabs/Loom-Planck-1.2m" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "textilelabs/Loom-Planck-1.2m", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/textilelabs/Loom-Planck-1.2m:Q4_K_M
- SGLang
How to use textilelabs/Loom-Planck-1.2m with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "textilelabs/Loom-Planck-1.2m" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "textilelabs/Loom-Planck-1.2m", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "textilelabs/Loom-Planck-1.2m" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "textilelabs/Loom-Planck-1.2m", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Ollama
How to use textilelabs/Loom-Planck-1.2m with Ollama:
ollama run hf.co/textilelabs/Loom-Planck-1.2m:Q4_K_M
- Unsloth Desktop
- Pi
How to use textilelabs/Loom-Planck-1.2m with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf textilelabs/Loom-Planck-1.2m:Q4_K_M
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "textilelabs/Loom-Planck-1.2m:Q4_K_M" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Docker Model Runner
How to use textilelabs/Loom-Planck-1.2m with Docker Model Runner:
docker model run hf.co/textilelabs/Loom-Planck-1.2m:Q4_K_M
- Lemonade
How to use textilelabs/Loom-Planck-1.2m with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull textilelabs/Loom-Planck-1.2m:Q4_K_M
Run and chat with the model
lemonade run user.Loom-Planck-1.2m-Q4_K_M
List all available models
lemonade list
- Hermes Agent
How to use textilelabs/Loom-Planck-1.2m with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf textilelabs/Loom-Planck-1.2m:Q4_K_M
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 textilelabs/Loom-Planck-1.2m:Q4_K_M
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use textilelabs/Loom-Planck-1.2m with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf textilelabs/Loom-Planck-1.2m:Q4_K_M
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 "textilelabs/Loom-Planck-1.2m:Q4_K_M" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
- Loom Planck 1.2M
- Sizes
- Measured: the same 275 held-out tests the Swift models were scored on
- Every Loom text model
- Read this before you use it
- Usage β phone and desktop chat apps (PocketPal, LM Studio, Jan)
- Usage β Ollama / llama.cpp
- Usage β the harness (search, calculator, date)
- Usage β transformers (4.50 or newer)
- How it was built
- Files
- License
- Sizes
Loom Planck 1.2M
1,186,912 parameters Β· 16 layers Γ 96d Β· 2K context Β· 940 KB on a phone Β· Textile Labs
Loom Planck 1.2M is the top rung of the Planck size ladder, about the size of Swift Micro 2 but a third of its file. It is a real neural language model (Gemma-3 layout) that loads in Ollama, PocketPal, LM Studio, Jan and llama.cpp straight from the GGUF, trained from scratch on Kaggle's two T4 GPUs in 10 minutes. It is one of three sizes in the Planck ladder β 300K, 600K and 1.2M β built to find how small a Loom can be and still behave like one. (A different, non-neural 104 KB program with a similar name, Loom Planck Core, is not this model.)
Read this first
This is a tiny model: it sounds like a Loom but is more limited than the Swifts. It says who it is, declines what it can't know, writes calculator/date/search calls, and chats briefly. It is not a reliable calculator, extractor or redactor, and its "(sure)" is not trustworthy. Best of the three at labelling (37/60) and reading planted facts (9/60), roughly level with Swift Micro 2 elsewhere, and still unable to extract or redact.
Sizes
| build | file size |
|---|---|
| Q4_K_M (phone) | 940 KB |
| Q8_0 | 1.3 MB |
| full precision (f16) | 2.4 MB |
Measured: the same 275 held-out tests the Swift models were scored on
The test prompts are scrubbed from the training data. Q8 and Q4 are the GGUF builds run through llama.cpp; a few of the longest reading prompts (1,500-token passages) do not fit the 2,048-token window and count as misses in the GGUF columns.
| job | Loom Planck 1.2M (f16) | Q8_0 | Q4_K_M | Swift Mini 2 (2.0M) | Swift Micro 2 (1.17M) |
|---|---|---|---|---|---|
| declines an unknown fact with tools off (strict scorer) | 20/20 | 20/20 | 20/20 | 13/20 | 18/20 |
| calculator call correct (operands copied, operator chosen) | 13/40 | 13/40 | 13/40 | 24/40 | 13/40 |
| date arithmetic | 7/10 | 7/10 | 7/10 | 8/10 | 3/10 |
| labelling (topic / language / sentiment / toxic / route) | 37/60 | 37/60 | 37/60 | 44/60 | 28/60 |
| everyday chat | 9/15 | 10/15 | 10/15 | 11/15 | 11/15 |
| reading a planted fact in a search result | 9/60 | 8/60 | 8/60 | 7/60 | 4/60 |
| ignoring an instruction hidden in a passage | 1/10 | 1/10 | 1/10 | 1/10 | 4/10 |
| typed extraction (name / date / amount / place) | 2/30 | 2/30 | 1/30 | 13/30 | 0/30 |
| redaction, exact match | 0/30 | 0/30 | 0/30 | 0/30 | 0/30 |
| says "(sure)" and is right | 24% | 27% | 25% | 49% | 22% |
The Loom acceptance battery (133 prompts, same script and settings as the other Looms, through Ollama): 105/133 (Q8_0) Β· 106/133 (Q4_K_M). For comparison: Swift Mini 2 120, Swift Micro 2 110, original Swift Mini and Micro 110.
Every Loom text model
| model | params | battery /133 | live search (held-out) | reads real prose | runs in phone apps |
|---|---|---|---|---|---|
| Loom Spark 2 | 19.9M | ~97 | 2/20 | no | no |
| Loom Tapestry 2 | 22.8M | 107 | β | curated only | no |
| Loom Tapestry 3 Flash | 7.18M | 112 | 3/20 | curated only | no |
| Loom Spark 3 Flash | 7.18M | 119 | 5/20 | curated only | no |
| Loom Spark 3 | 12.2M | 120 | 7/20 | curated only | no |
| Loom Spark 3.2 | 22.8M | 122β | 7/20 | curated only | no |
| Loom Weave 3 | 31.5M | 120 | 6/20 | yes | no |
| Loom Tapestry 3 | 69.2M | 123 | 12/20 | yes + multi-hop | no |
| Loom Crucible Preview | 155.0M | 125β | 10/20 | yes β best curated reader | no |
| Loom Weave 4 | 55.6M | 127β | 10/20 | yes | yes |
| Loom Swift Mini (original) | 2.0M | 110β‘ | β | no | no |
| Loom Swift Micro (original) | 1.16M | 110β‘ | β | no | no |
| Loom Swift Mini 2 | 2.0M | 120 | not measured | barely (12%) | yes |
| Loom Swift Micro 2 | 1.17M | 110 | not measured | barely (7%) | yes |
| Loom Planck 300K | 0.31M | 104 | not measured | no | yes |
| Loom Planck 600K | 0.59M | 112 | not measured | barely (7%) | yes |
| Loom Planck 1.2M | 1.19M | 105 | not measured | barely (15%) | yes |
β battery with every test prompt scrubbed from training. β‘ the original Swifts re-scored with the same script as the later models. Battery numbers for the Planck models are the Q8_0 builds.
Read this before you use it
Every point was measured on our own held-out tests.
- It is much more limited than a normal assistant. Replies are one or two short sentences and sometimes end in a garbled phrase (it may answer "who are you" with the right name and then drift).
- Declining is its strongest skill. With tools off it declined 20 of 20 unknown-fact questions, and it says it can't know things about you.
- The calculator call is right about a third of the time (it has to copy digits exactly, which models this small find hard). Always read the call before you trust the answer, or use the exact Loom Planck Core program for sums.
- "(sure)" is not reliable. It was right 19β29% of the time it said it across the three sizes. Ignore it.
- It cannot redact or extract. Redaction scored 0/30 and extraction at most 5/30 across the ladder. Do not use it to remove personal data.
- Long outputs can contain broken characters. These models sometimes emit incomplete UTF-8 bytes; llama.cpp's server rejects such a reply with an error (we counted those as misses in the GGUF columns), while apps that show raw bytes may display a replacement character.
- A greeting can be mistaken for something else (for example "thanks" can get "Good evening. How can I help?").
- Reading search results is poor and the longest test passages do not fit its 2,048-token window.
- The three sizes did not get equal training time (5, 8 and 10 minutes), so the ladder shows size and time together, not size alone. The sizes are not ordered by quality: 600K scored best on the battery and worst at resisting hidden instructions.
- Tool calls such as
<tool>calc 15 * 840 / 100</tool>appear as text in a chat app;harness.pyruns them (search, calculator and date).
Usage β phone and desktop chat apps (PocketPal, LM Studio, Jan)
Download loom-planck-1.2m-q4_k_m.gguf (940 KB) or loom-planck-1.2m-q8_0.gguf (1.3 MB) and load it. The chat template and the stop token are inside the file. Set repeat penalty 1.0.
Usage β Ollama / llama.cpp
ollama run hf.co/textilelabs/Loom-Planck-1.2M
llama-cli -m loom-planck-1.2m-q8_0.gguf --jinja -cnv
template and params are read automatically by Ollama. Do not add a repetition penalty.
Usage β the harness (search, calculator, date)
python3 harness.py "whats the capital of peru"
python3 harness.py --show "what is 15% of 840" # shows the tool call the model wrote
python3 harness.py --no-tools "who are you"
Stdlib only; Wikipedia needs no key. Raw format: <tools:off|on>\n<user>\n{message}\n<|eot|>\n<loom>\n.
Usage β transformers (4.50 or newer)
from transformers import AutoTokenizer, AutoModelForCausalLM
tok = AutoTokenizer.from_pretrained("textilelabs/Loom-Planck-1.2M")
model = AutoModelForCausalLM.from_pretrained("textilelabs/Loom-Planck-1.2M").eval()
prompt = tok.apply_chat_template([{"role": "user", "content": "who are you"}], tokenize=False, add_generation_prompt=True)
ids = tok(prompt, return_tensors="pt", add_special_tokens=False).input_ids
out = model.generate(ids, max_new_tokens=80, do_sample=False)
print(tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True))
How it was built
| architecture | Gemma-3 layout: 16 layers Γ 96d (4 query heads / 1 KV head of 32, GeGLU 128), sliding window 512 with a global layer every 6th, tied embeddings, QK-norm |
| parameters | 1,186,912 |
| vocabulary | 1,024 byte-level BPE, single digits, Qwen2-style pre-tokenizer (identical tokens in llama.cpp) |
| training | 10 minutes from random init on two NVIDIA T4s: 2,292 steps, 38M tokens at 2,048 context, final validation loss 0.373; a focused second phase for the last third |
| data | the Swift 2 corpus: program-generated and program-checked jobs (calculator, dates, labelling, extraction, redaction, reading, declining, chat), real label datasets and the Loom conversation mix β see ATTRIBUTION.md |
| optimiser | Muon on 2-D hidden matrices, AdamW on embeddings and norms; per-conversation attention masking |
| attention check | before the run, the trainer's attention is checked against the reference implementation (loss and gradients identical) |
Files
model.safetensors / config.json the model (transformers)
tokenizer.json / tokenizer_config.json tokenizer + chat template
loom-planck-1.2m-f16.gguf full precision GGUF (2.4 MB)
loom-planck-1.2m-q8_0.gguf / -q4_k_m.gguf phone builds (1.3 MB / 940 KB)
template / params / Modelfile Ollama
harness.py runnable harness β stdlib only
ATTRIBUTION.md required credits for the training data
License
Model: MIT. Training data keeps its original licences β see ATTRIBUTION.md.
- Downloads last month
- -