Instructions to use webAI-Official/TwIL-8B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use webAI-Official/TwIL-8B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="webAI-Official/TwIL-8B") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("webAI-Official/TwIL-8B") model = AutoModelForCausalLM.from_pretrained("webAI-Official/TwIL-8B", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use webAI-Official/TwIL-8B 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 webAI-Official/TwIL-8B:Q4_K_M # Run inference directly in the terminal: llama cli -hf webAI-Official/TwIL-8B:Q4_K_M
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf webAI-Official/TwIL-8B:Q4_K_M # Run inference directly in the terminal: llama cli -hf webAI-Official/TwIL-8B: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 webAI-Official/TwIL-8B:Q4_K_M # Run inference directly in the terminal: ./build/bin/llama cli -hf webAI-Official/TwIL-8B:Q4_K_M
Use Docker
docker model run hf.co/webAI-Official/TwIL-8B:Q4_K_M
- Llama new
- LM Studio
- Jan
- vLLM
How to use webAI-Official/TwIL-8B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "webAI-Official/TwIL-8B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "webAI-Official/TwIL-8B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/webAI-Official/TwIL-8B:Q4_K_M
- SGLang
How to use webAI-Official/TwIL-8B 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 "webAI-Official/TwIL-8B" \ --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": "webAI-Official/TwIL-8B", "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 "webAI-Official/TwIL-8B" \ --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": "webAI-Official/TwIL-8B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Ollama
How to use webAI-Official/TwIL-8B with Ollama:
ollama run hf.co/webAI-Official/TwIL-8B:Q4_K_M
- Unsloth Desktop
- Pi
How to use webAI-Official/TwIL-8B with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf webAI-Official/TwIL-8B: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": "webAI-Official/TwIL-8B:Q4_K_M" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Docker Model Runner
How to use webAI-Official/TwIL-8B with Docker Model Runner:
docker model run hf.co/webAI-Official/TwIL-8B:Q4_K_M
- Lemonade
How to use webAI-Official/TwIL-8B with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull webAI-Official/TwIL-8B:Q4_K_M
Run and chat with the model
lemonade run user.TwIL-8B-Q4_K_M
List all available models
lemonade list
- Hermes Agent
How to use webAI-Official/TwIL-8B with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf webAI-Official/TwIL-8B: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 webAI-Official/TwIL-8B:Q4_K_M
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use webAI-Official/TwIL-8B with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf webAI-Official/TwIL-8B: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 "webAI-Official/TwIL-8B: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"
TwIL-8B: an atlas no one asked for but sometimes they get anyways
TwIL-8B: a reasoning post-train of Granite 4.2 8B through a general prompt census
I ran the TwIL-8B and parent Granite 4.2 8B models through the Cartographics HF space (the Space that builds these atlases on demand). webAI describes this model as a reasoning model for math, code and instruction following, post-trained from granite-4.2-8b with full-parameter supervised fine-tuning and GRPO/DAPO reinforcement learning. The question for this census is what that post-train did to the category organization it inherited from the parent, and where in the stack it happened.
The usage-category readout barely moves: probe accuracy differs by 0.0015 on average across the 320 stream-layers, with a largest gap of 0.017, in mlp at layer 39. [data] Underneath that, 168,462 of 2,109,440 neurons (8.0%) changed their strongest label, and the share climbs with depth, from 1.6% at layer 0 to 15.0% at layer 39. [data] The drift has a direction: toward tool_use (+2,847 neurons) and core_technical (+2,357), away from roleplay (−2,941) and ml_ai (−1,953). [data] Only 5 of 1,280 attention heads changed what they respond to, and the largest measured change in the atlas is at the last_input token, where the base narrows its working space over layers 37 to 39 and TwIL-8B holds it open. [data]
Scope. This is a paired comparison against the base atlas at pinned revisions, and both model repositories' live heads still equal their pins. The two captures share the same capture code, analysis code, corpus, chat template and token ids, so a row in one table matches the row with the same keys in the other, and every contrast below is weights-only. The capture loaded the balanced variant: the repo root's weight index maps every tensor to
model-balanced.safetensors, and the verbose variant ships in a subfolder the census never touched. The corpus is 8,965 prompts across 17 usage labels and 175 fine buckets, 17 to 64 tokens, median 31. Unless stated otherwise, results use the MLP intermediate stream atmean_all_real, averaging all real input tokens, including template and special tokens;last_inputis the newline at the end of the opened generation prompt, after the<think>block the template opens, the last thing the model reads before it starts reasoning. The usage-label probe is a five-fold, 256-PC multinomial classifier with training-fold PCA and scaling; the majority-class baseline is 6.58%. The corpus has no math or code-generation label;core_technicalanddataare the closest usage categories the census can name.
Tags mark the claims: [data] is a direct measurement or calculation from the pinned atlas databases or capture metadata, [inferred] is my interpretation under stated assumptions, [data, inferred] is both, and [guess] is a mechanism I haven't tested.
Prompt type is readable from layer 10 on, and peaks at layer 25
A probe trained to name a prompt's label from one stream gets 0.605 right at layer 0, averaged over the eight streams. Accuracy steps up between layers 9 and 12, 0.701 to 0.802, and peaks at 0.815 at layer 25. [data] The most selective single stream is mlp at layer 26: 0.844 against a shuffled-label control of 0.058, with chance at 0.066. [data]
116,906 neurons lean strongly toward one label (|AUROC − 0.5| of 0.25 or more). [data] Layers 0 and 1 hold 55 and 88 of them. The rest collect in three bands: layers 10 to 15, layers 24 to 27 (8,237 at layer 25 alone), and layers 35 to 38 (between 6,342 and 7,326 per layer). [data] The labels split between the last two bands. Eleven of them, including creative_writing, introspection, roleplay and humor, peak in the middle band. The other six, tool_use, ml_ai, core_technical, research, business and design, peak in the top band. [data]
The single neurons with a clean label lean are mostly in gate and up; the best probe accuracy is in mlp, where the signal is spread across many neurons instead. [data]
| Stream | Strong-lean neurons | Share of stream | Peak probe accuracy |
|---|---|---|---|
gate |
54,111 | 10.6% | 0.833 at layer 25 |
up |
37,513 | 7.3% | 0.839 at layer 26 |
mlp |
10,991 | 2.1% | 0.845 at layer 25 |
heads |
4,296 | 2.6% | 0.827 at layer 25 |
q |
4,242 | 2.6% | 0.813 at layer 39 |
attn |
3,442 | 2.1% | 0.815 at layer 25 |
v |
1,156 | 2.8% | 0.811 at layer 39 |
k |
1,155 | 2.8% | 0.780 at layer 39 |
The sharpest single neuron in the atlas is gate layer 24, neuron 4948, with an AUROC of 0.033 for learning: learning prompts land below nearly every other prompt on it. [data] The sharpest positive lean is gate layer 36, neuron 2188, at 0.966 for the same label. gate layer 35, neuron 6889 separates creative_writing at 0.965, and the labels explain 62% of its variance. [data] Participation ratio, an effective dimension, peaks at 201.65 in mlp at layer 13. Three mean-pooled mlp rows, layers 3, 5 and 39, are dominated by a single direction, with participation ratios of 1.009, 1.003 and 1.499; geometry numbers for those rows describe that one direction. [data] None of the 2,109,440 captured neurons is dead. [data]
The map holds: the readout moves 0.0015 across 320 stream-layers
Full-parameter fine-tuning and two rounds of RL left the model's sorting of prompts by type where Granite had it. Probe accuracy at the mean position differs by 0.0015 on average across the 320 stream-layers, and the largest gap is 0.017, in mlp at layer 39. [data] The share of a prompt's ten nearest neighbours that carry its label moves by 0.012 at most. [data] The exports carry no paired per-prompt probe errors, so there is no paired test to run on these gaps, and no test isn't the same thing as equivalence.
8.0% of neurons change their strongest label, and the change climbs with depth
Matching neurons by index, 92.0% keep the same strongest label. [data] The 8.0% that changed are not spread evenly: 5.7% of neurons in layers 0 to 12, 7.4% in layers 13 to 26, and 10.9% in layers 27 to 39. [data] mlp moved most, reaching 23.2% at layer 38; k and up moved least. [data]
The per-label directions show the same gradient at smaller scale. The cosine between a label's direction in TwIL-8B and the same direction in the base averages 0.999 at layer 1, 0.998 at layer 20 and 0.994 over layers 37 to 39. [data] Of the 17 labels, core_technical rotated most over layers 33 to 39. [data] The lowest base-to-tune cosines in the atlas are in the dominated mean-pooled mlp rows at layers 3 and 5 (0.978 and 0.925 on average), where label directions are small residuals on the one direction holding the stream. [data] The drift goes with depth: the deeper the layer, the more its individual neurons reorganized, and the joint readout held anyway. [data, inferred]
The drift has a direction: toward tool use and core technical
Counting which label each neuron leans toward most, TwIL-8B has more neurons on tool_use, core_technical, learning, research and data than the base, and fewer on roleplay, ml_ai, niche and creative_writing. [data] The model was trained for math, code and instruction following, and the neurons that changed sides moved that way. [data, inferred] The corpus has no math or code label, so what this shows is the drift pointing the same way as the training target on the two nearest usage categories. It says nothing about whether the model got better at math. [data, inferred]
The same lean shows among strong-lean neurons in layers 30 to 39: data is up 4.3%, core_technical 4.2% and tool_use 4.1%. [data]
Five heads of 1,280 lose their label sensitivity
For each attention head, I correlated the eta² of its 128 output dimensions in TwIL-8B with the same dimensions in the base. The median head scores 0.996. Five score between 0.32 and 0.64, and nothing else falls below 0.85. [data] All five lost label sensitivity: mean F over the head's dimensions fell in each, most at L16H4 (32.2 to 19.8) and L18H29 (68.5 to 44.1). [data] L16H8 also shows in the per_head table: the F of its output norm across labels dropped from 84.3 to 7.6. [data]
The last input token carries the largest change in the atlas
At last_input, the newline after the opened think block, TwIL-8B's working space is a little wider than the base's through most of the stack: participation ratio is about 8% higher across layers 5 to 36, against about 2% at the mean position. [data] The top three layers are where the two models part. In Granite the working space at this token narrows sharply over layers 37 to 39. In TwIL-8B, mlp narrows one layer later, and heads, q, k and v hold their width through layer 39. [data]
| Stream, layer | Base | TwIL-8B |
|---|---|---|
mlp, 37 |
6.9 | 23.9 |
heads, 38 |
9.5 | 27.1 |
q, 38 |
12.4 | 23.2 |
k, 38 |
10.1 | 19.4 |
v, 38 |
12.9 | 21.0 |
heads, 39 |
13.6 | 24.5 |
In mlp at layer 37 the base carries a spike at this token: median row norm 425.8, median largest value 226.0, median row kurtosis 1,254.2. In TwIL-8B those read 319.3, 80.5 and 94.6. [data] No probe was run at this position, so this section is geometry only. [data] My read is that RL on reasoning traces changed how the model sets itself up at the point where the think block opens, far more than it changed how it reads the prompt. [inferred] The atlas does not capture generation, so it cannot confirm that. [data]
Verdict: a carried-through category map with the movement at the top of the stack
The readout moves 0.0015 on average across 320 stream-layers, with a largest gap of 0.017 at mlp layer 39, while 8.0% of neurons changed their strongest label, climbing from 1.6% at layer 0 to 15.0% at layer 39 and 23.2% in mlp at layer 38. The drift runs toward tool_use and core_technical and away from roleplay and ml_ai. 5 of 1,280 heads lost their label sensitivity. The largest measured change is geometric, at the last_input token, where mlp layer 37 reads participation ratio 6.9 to 23.9 and the base's norm spike (425.8 to 319.3) is gone. [data] The post-train kept the parent's map of ordinary prompts and rewrote the top of the stack and the launch token. [data, inferred] If you're editing, steering or ablating this model, what you know from the base carries through most of the stack. Check it first at layers 37 to 39 at last_input, in mlp from layer 27 up, and at heads L16H4, L16H8, L18H29, L21H25 and L32H27. [data, inferred]
Limits
- Historical runtime precision, resolved kernels and the realized batch partition remain unverified, and the exact training-parent revision of the SFT and RL stages is not pinned by either repository. The two captures share identical corpus, template and token fingerprints and the same capture and analysis code, so the paired contrasts are weights-only within this census; a full-checkpoint weight identity was not hashed. The census is the balanced variant only.
- The corpus tests short single-turn usage categories: no math problems, no code execution, no generated text, and no probe at the
last_inputposition, so that section is geometry only. There is one capture per model, so run-to-run noise is unmeasured; layer 0 gives a rough floor at 1.6% of neurons changing their strongest label. Coordinate associations, norm labels, direction cosines and head eta² profiles are observational summaries, not tested causal circuits or capability scores, and webAI's benchmark numbers are quoted documentation, not evidence from these tables. - The test that would settle the mechanism: token-resolved captures during generation on reasoning traces, probes run at the
last_inputposition, and interventions on the five named heads and on layers 37 to 39 before any blunt ablation.
Atlases
Granite 4.2 8B (base) · more under juiceb0xc0de
All six tables are Parquet and in atlas/atlas.sqlite; the queries below use the local SQLite table names. For the paired numbers, run each query against both pinned atlases and join on (layer, component, neuron) for features, (layer, component, head) for per_head, and (layer, component, position) for layers.
The strong-lean neurons by label:
SELECT top_label, COUNT(*) AS strong_lean_neurons
FROM features
WHERE ABS(top_auroc - 0.5) >= 0.25
GROUP BY top_label
ORDER BY strong_lean_neurons DESC, top_label;
The geometry and probe curves:
SELECT layer, probes_probe_accuracy, probes_probe_control_accuracy,
probes_probe_selectivity, geometry_participation_ratio, geometry_k90
FROM layers
WHERE component = 'mlp' AND position = 'mean_all_real'
ORDER BY layer;
The core_technical separators:
SELECT layer, component, neuron, top_auroc, eta2
FROM features
WHERE top_label = 'core_technical' AND q < 0.01
ORDER BY ABS(top_auroc - 0.5) DESC
LIMIT 20;
The last input token, top of the stack:
SELECT layer, component, geometry_participation_ratio
FROM layers
WHERE position = 'last_input' AND layer >= 36
ORDER BY layer, component;
Dataset revisions used for every number above:
| Atlas | revision |
|---|---|
| Granite 4.2 8B parent | c92fa5b83f2c85df746ece725da8735391f6eddc |
| TwIL-8B | d5231f8a93289a34044c612e537d93602353cdb0 |
Thanks for the detailed analysis. The report is pretty cool.






