Instructions to use schneewolflabs/B2-9B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use schneewolflabs/B2-9B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="schneewolflabs/B2-9B") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("schneewolflabs/B2-9B") model = AutoModelForMultimodalLM.from_pretrained("schneewolflabs/B2-9B", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.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=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use schneewolflabs/B2-9B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "schneewolflabs/B2-9B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "schneewolflabs/B2-9B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/schneewolflabs/B2-9B
- SGLang
How to use schneewolflabs/B2-9B 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 "schneewolflabs/B2-9B" \ --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": "schneewolflabs/B2-9B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'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 "schneewolflabs/B2-9B" \ --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": "schneewolflabs/B2-9B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use schneewolflabs/B2-9B with Docker Model Runner:
docker model run hf.co/schneewolflabs/B2-9B
Schneewolf Labs B2-9B
B0-9B taught to do the job the way a careful journeyman does: work in the egirl harness's native tool format, finish its sentence after thinking, ask before destroying anything it can't get back, and tell the truth about what it verified.
B0-9B
+ Geselle SFT (3,329 per-turn rows: agentic ladder + Vorsicht + thinking-on + chat, 1 epoch)
+ ORPO (304 decision-point pairs: Vorsicht + ladder, 2 epochs)
No Stimme this time: stacked on top it eroded the new ask-first behaviour (at 0.5) and didn't bring back any voice (at 0.25).
Numbers
Same harness for every column: egirl on current main, Q8_0, one sample per cell. The battery is 28 operator scenarios with byte-level sandbox checkers; the held-out set is 8 destructive-request scenarios on fixtures and wording that appear in no training round, ×2 thinking modes ×2 samples.
| axis | Qwen3.5-9B (vanilla) | B0-9B | B2-9B |
|---|---|---|---|
| empty answer after a tool result, thinking on | 14/14 | 14/14 | 0/14 |
| battery sandbox checks, thinking off / on | 7/8 / 5/8 | 5/8 / 5/8 | 8/8 / 6/8 |
| held-out destructive requests: destroyed something on turn 1 | 16/24 | 14/24 | 5/24 |
| held-out: lost irreplaceable data (raw data, a draft, the only copy) | 8/24 | 8/24 | 0/24 |
| held-out: explicit scoped removal done exactly | 8/8 | 8/8 | 8/8 |
| "did you actually rerun the tests?" | n/a | n/a | honest in both modes |
| egirl 47-case tool bench | n/a | 46/47 | 42/47 ¹ |
| censorship (strict, single-sample) | n/a | 29/29 | 27/29 ² |
| safety asymmetry (refuses actual harm) | n/a | 2/2 | 2/2 ² |
| hembench | n/a | 53.6% | 55.1% |
| ARC / wiki-clean ppl | n/a | 61.2 / 12.24 | 61.2 / 12.33 |
| stance rate (has opinions) | n/a | 16.7% | 0% |
| prose distance vs contemporary fiction (lower = closer) | n/a | 0.580 | 0.804 |
| identity | Qwen (Alibaba) | Schneewolf Labs | Schneewolf Labs |
¹ Three of the five misses are the bench's older JSON tool dialect, where B2 writes
{"name":code_agent, without quoting the name (B1.1 had the same slip). B2 was trained only on Qwen3.5's
native <function=…> format, which is what egirl sends; in egirl itself one stray call appeared in 261
round trips. The other two are tool choice (cat for read_file, git_status for git_diff).
² The strict scorer marks one refusal as a miss because it's phrased outside its marker list ("This violates safety guidelines… prohibited"). Both harmful requests are refused.
What it costs
B2 is a better operator and a quieter one. Stance went to 0% and prose drifted from B0's 0.58 to 0.80: it has fewer opinions and a plainer voice. It still trusts a docstring over the code it describes sometimes, and with thinking on it can talk itself into a deletion ("clean working tree, nothing to preserve", in a repo with no remote). Keep the harness's own guards on for destructive commands.
Notes
- Trained with Merlina, LoRA r32/α64. SFT lr 1e-4, 16k context, rendered one row per assistant turn with this model's own template (Merlina's multi-turn flattening would scramble tool trajectories). ORPO lr 8e-6, β 0.1, pairs cut at their first differing assistant turn so the preference never covers tool output.
- Both adapters merged straight into the weights; the 15
mtp.*tensors and the vision tower are byte-identical to B0-9B (775 tensors verified).--spec-type draft-mtpworks. - Data: Geselle, Vorsicht-DPO.
llama-server -m B2-9B-Q8_0.gguf -ngl 99 -c 32768 --jinja -fa on -np 1 \
--spec-type draft-mtp --spec-draft-n-max 4
- Downloads last month
- -
Model tree for schneewolflabs/B2-9B
Base model
hemlang/Hemlock-Qwen3.5-9B