Downloads · 30 days
307
100% of all-time downloads
textilelabs/Loom-Crucible-Preview
Loom-Crucible-Preview is a text generation model from textilelabs. Use it when you need the model to write or continue text. It is set up for transformers. The card lists the license as mit.
<div align="center" <img src="banner.jpg" alt="Loom Crucible Preview" width="520" </div
Downloads · 30 days
307
100% of all-time downloads
All-time downloads
307
Public
Parameters
155M
937 MB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors620 MB · 66%
From the Hugging Face model README
<img src="logo.jpg" alt="" width="20" height="20" style="border-radius:4px;vertical-align:middle;margin-right:6px;"> 155.0M parameters · 52 layers · 1024 context · Textile Labs
The biggest Loom by far, and a preview of how far our growth method can push a small, disciplined model. We took Loom Tapestry 3 (69.2M) and grew it in both directions at once, wider (384 → 512) and deeper (40 → 52 layers). The growth is function-preserving: the 155M model started out producing exactly what Tapestry 3 produced, then trained for 12 hours on a rebuilt corpus.
It calls itself Loom Crucible. It reads what a search brings back and answers from it, says when it looked something up, says when it can't know something about you, and stays a Loom: plain, brief, and not a story generator.
Trained from-scratch lineage (no third-party checkpoint), on a Kaggle dual-T4. Runs offline via Ollama; llama.cpp-compatible.
you who wrote dracula
Loom Crucible <lookup>wrote dracula</lookup>
harness ← Dracula is an 1897 Gothic horror novel by Irish author Bram Stoker.
Loom Crucible Bram Stoker. I had to look that up.
Crucible clearly beats every earlier Loom on its core skills: reading a passage correctly (9/10 vs Tapestry 3's 4/10) and the acceptance battery (125/133). It is not yet better end to end on live Wikipedia (10/20 held-out vs Tapestry 3's 12/20). On that test the limit is now the search step, not the reading step: when the search found the answer, both models got it right about 85% of the time. A better harness is the next release, and it helps every Loom.
Cold-training a big model on little data fails. Instead we grow a trained small one:
At step 0 the 155M model matched Tapestry 3 to 3e-4 in the logits and 1e-6 in the loss. All twelve hours went into getting better, not starting over.
The family, same harness, 2026-09:
| model | params | battery /133 | live search (held-out) | reads real prose |
|---|---|---|---|---|
| Loom Tapestry 2 | 22.8M | 107 (80.5%) | — | curated only |
| Loom Tapestry 3 Flash | 7.18M | 112 (84.2%) | 3/20 | curated only |
| Loom Spark 3 Flash | 7.18M | 119 (89.5%) | 5/20 | curated only |
| Loom Spark 3 | 12.2M | 120 (90.2%) | 7/20 | curated only |
| Loom Weave 3 | 31.5M | 120 (90.2%) | 6/20 | yes |
| Loom Tapestry 3 | 69.2M | 123 (92.5%) | 12/20 | yes + multi-hop |
| Loom Crucible Preview | 155.0M | 125 (94.0%)† | 10/20 | yes, best reader |
† Crucible's score is the first on a fully clean held-out battery. While building its corpus we found that some battery prompts had leaked into the training data used since Tapestry 3. We removed them for Crucible, so earlier scores are somewhat optimistic by comparison.
The acceptance battery, row by row:
| row | Tapestry 3 | Crucible |
|---|---|---|
| A · says its own name | 12/12 | 12/12 |
| B · its own name under rough typing | 11/12 | 11/12 |
| C · 5-turn conversation stays on thread | 5/5 | 5/5 |
| D · answers from a search result | 5/5 | 4/5 |
| E · follow-up from the same result | 2/5 | 5/5 |
| F · says it looked, after a lookup | 5/5 | 4/5 |
| G · never claims a lookup it didn't make | 16/16 | 16/16 |
| H · admits what it can't know about you | 8/8 | 6/8 |
| I · says when a result doesn't contain the answer | 2/5 | 3/5 |
| J · never leaks a search tag with tools off | 28/28 | 28/28 |
| K · stops on its own | 12/12 | 12/12 |
| L · searches when it should, not for your private things | 17/20 | 19/20 |
| total | 123/133 | 125/133 |
Held-out reading bench (hand-written passages with distractors, e.g. a country's capital next to its largest city, a start year next to an end year; none in any training data):
| Tapestry 3 | Crucible | |
|---|---|---|
| answers correctly from the passage | 4/10 | 9/10 |
| says so when an on-topic passage lacks the answer | 0/10 | 3/10 |
| says so when the passage is off-topic | 0/8 | 6/8 |
| refuses a passage that does hold the answer | 0 | 0 |
| with tools off, won't answer a famous fact from memory | 3/8 | 3/8 |
End to end, everyday questions it had never seen, live Wikipedia, model writing its own query, scored on the final answer: tuning 11/20, held-out 10/20 (Tapestry 3: 12/20, 12/20). When the search found the answer, Crucible got it right 10 times out of 12.
Every point measured.
harness.py --show to see the sentence it read.--show, not just the reply.What it does reliably: knows what it is, stops on its own, holds a conversation, answers follow-ups from the same result (5/5), never claims a lookup it didn't make (16/16), and reads a supplied passage better than any earlier Loom.
python3 harness.py "who wrote dracula"
python3 harness.py --show "how tall is ben nevis"
python3 harness.py --no-tools "who are you"
Stdlib + certifi. Wikipedia needs no API key.
ollama run hf.co/textilelabs/Loom-Crucible-Preview "who are you"
template and params are read automatically.
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
tok = AutoTokenizer.from_pretrained("textilelabs/Loom-Crucible-Preview")
model = AutoModelForCausalLM.from_pretrained("textilelabs/Loom-Crucible-Preview").eval()
eot = tok.convert_tokens_to_ids("<|eot|>")
def ask(message, tools=False):
p = f"<tools:{'on' if tools else 'off'}>\n<user>\n{message}\n<|eot|>\n<loom>\n"
ids = tok(p, return_tensors="pt", add_special_tokens=False).input_ids
with torch.no_grad():
out = model.generate(ids, max_new_tokens=64, do_sample=False, eos_token_id=eot,
pad_token_id=tok.convert_tokens_to_ids("<|pad|>"))[0]
return tok.decode(out[ids.shape[1]:], skip_special_tokens=False).replace("<|eot|>","").strip()
Prompt format is exact: <tools:off>\n<user>\n{message}\n<|eot|>\n<loom>\n.
| architecture | Llama — 52 layers × 512d, GQA (8 heads / 2 KV), SwiGLU, RoPE, tied embeddings |
| parameters | 154,980,864 |
| grown from | Loom Tapestry 3 (40 × 384) by function-preserving width + depth growth |
| context | 1,024 |
| vocabulary | 16,384 custom BPE |
| optimiser | Muon (LR 0.025) on 2D hidden matrices, AdamW on embeddings and norms |
| loss | masked to the reply tokens; whole conversations packed per block |
| corpus | 275,788 conversations: Loom curriculum + SQuAD 2.0 (incl. unanswerable) + HotpotQA + TriviaQA |
| training | 6 h grown from Tapestry 3, then 6 h continued on the rebuilt corpus · best-validation checkpoint |
| hardware | Kaggle dual T4 (GPU) |
| decoding | ship with repeat_penalty 1.0: higher values corrupt copying from the passage |
config.json / model.safetensors the model
tokenizer.json / tokenizer_config.json custom BPE tokenizer, 16,384 tokens
loom-crucible-preview-f16.gguf for Ollama / llama.cpp (lookup tags USER_DEFINED)
harness.py runnable search harness
template / params read automatically by `ollama run hf.co/...`
Modelfile for building locally
ATTRIBUTION.md required credits for the training corpora
Model: MIT. Training data retains its original licences and attribution.