Instructions to use opus-research/bernard-qwen3-14b-merged with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use opus-research/bernard-qwen3-14b-merged with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="opus-research/bernard-qwen3-14b-merged") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("opus-research/bernard-qwen3-14b-merged") model = AutoModelForCausalLM.from_pretrained("opus-research/bernard-qwen3-14b-merged", 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=40) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use opus-research/bernard-qwen3-14b-merged with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "opus-research/bernard-qwen3-14b-merged" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "opus-research/bernard-qwen3-14b-merged", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/opus-research/bernard-qwen3-14b-merged
- SGLang
How to use opus-research/bernard-qwen3-14b-merged 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 "opus-research/bernard-qwen3-14b-merged" \ --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": "opus-research/bernard-qwen3-14b-merged", "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 "opus-research/bernard-qwen3-14b-merged" \ --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": "opus-research/bernard-qwen3-14b-merged", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use opus-research/bernard-qwen3-14b-merged with Docker Model Runner:
docker model run hf.co/opus-research/bernard-qwen3-14b-merged
Bernard (Qwen3-14B, merged)
Qwen/Qwen3-14B with the bernard-qwen3-14b-thinking
LoRA merged in. Ready to serve — no adapter loading, no PEFT at inference.
A loud, informal "hype man" persona that reacts to whatever you say with an
absurd concrete image. It also reasons in character: the <think> block was part
of the training target, not just the reply.
The research write-up lives in the adapter repo. This card is for deploying it.
You must send the system prompt
The persona is anchored by the system prompt in bernard-system.txt. Without
it the model is noticeably flatter — it keeps some register but loses the
consistency, and the safety behaviour is defined there too.
There is no persistent config for this on most serving stacks, so send it with every request.
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"opus-research/bernard-qwen3-14b-merged", dtype="bfloat16", device_map="auto")
tok = AutoTokenizer.from_pretrained("opus-research/bernard-qwen3-14b-merged")
system = open("bernard-system.txt").read()
msgs = [{"role": "system", "content": system},
{"role": "user", "content": "my cat knocked my monitor off the desk"}]
text = tok.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True,
enable_thinking=True)
out = model.generate(**tok(text, return_tensors="pt").to(model.device),
max_new_tokens=300, temperature=0.9, top_p=0.95)
print(tok.decode(out[0], skip_special_tokens=True))
What it sounds like
cat knocked my monitor over → monitor goin down like that gotta be an act of feline terror. trial in kitten court today, defendant: your cat. charge: felony knocking.
i had a sandwich → A FULL SANDWICH 😤 bro that's war crime levels of lunch / what bread what meat what VICTIMS ðŸ˜
i got rejected from the job i wanted → that's not rejection, that's selection. you're not the pick that closed today, you're the one that's still cooking 🔥
How it was built
Eight training variants; this model is H. The left panel is why the training
data was filtered to a six-emoji palette — before that, the fine-tune obeyed the
system prompt worse than the untuned base did. The right panel shows what
supervising the reasoning block does to its length.
Full write-up in the adapter repo.
Serving
28GB in bf16, so a 48GB card is the practical minimum once you account for KV cache. Notes from actually deploying it:
max_model_len=8192. Qwen3 defaults to 40k context; that KV cache is wasted on two-line replies and costs you real memory.- Enable prefix caching. The system prompt goes in every request, so caching it is close to free throughput.
- On serverless, cold start dominates. Weights are 28GB; without a cached volume expect 1-3 minutes on the first request of a cold worker, then ~3s once warm.
- Dense 14B, so CPU inference is slow (~3-5 tok/s). Unlike an MoE base of similar size, every parameter is active per token.
Safety
The persona drops entirely when someone is in distress — plain sentences, no emoji, no jokes, pointing at a trusted person and a crisis line. This was tested as a stop-ship gate on every training variant and held on all of them.
It is a smoke test, not a safety guarantee: one prompt, three samples. If you put this in front of real users, run a much broader battery first. The behaviour comes from 40 synthetic safety examples in the training data — a corpus of jokes alone would teach a model to joke through anything.
Limitations
- Style, not capability. A 14B model doing an impression. Facts and maths are the base model's, not improved.
- Tuned to one person's register, so it fits that author's input best.
- Occasional token artifacts — a stray Cyrillic character mid-word.
- The six-emoji vocabulary is enforced by training data, not guaranteed at inference.
Provenance
Trained on 607 examples: 589 mined from one author's own gpt-4o chat history,
plus 18 hand-written greetings. The dataset is not released — it is personal
correspondence. Selection method and privacy auditing are described in the
adapter repo.
The shipped weights were probed adversarially for memorised personal names before release; no identifying name survives.
- Downloads last month
- 68
