Overview
Proton is the enterprise model in the Atom family. Where Neutron finds and ranks
the material an organisation holds, Proton is the model that reads that material
and does something with it: extracting structure from documents, drafting and
reviewing written work, and carrying out the ordinary reasoning that enterprise
workflows are built from.
This model was prepared for a BrowseComp Plus submission and uses:
Base model
- Base model: Qwen/Qwen3.8-27B-FP8
- Training type: proprietary post-training on long-horizon tasks
- Adapter: merged into the base model for this standalone checkpoint
Evaluation
Evaluation date: 2026-09-16
The BrowseComp Plus system uses the following language model and retriever:
{
"LLM": "Atom-Proton-1.0-27B-FP8 (proprietarily post-trained Qwen3.8-27B-FP8)",
"Retriever": "Atom-Neutron-1.0 (proprietarily post-trained Qwen3-Embed-0.6B)",
"Accuracy (%)": 95.3,
"Recall (%)": 67.48,
"Search Calls": 12.61,
"Calibration Error (%)": 6.89,
"Link": "https://huggingface.co/CrowtherLabs/atom-proton-1.0",
"Evaluation Date": "2026-09-16"
}
The related Atom Electron model page is available at
https://huggingface.co/CrowtherLabs/Atom-Electron-1.0.
Loading
The model is a native vision-language model and loads through
AutoModelForImageTextToText.
import torch
from transformers import AutoModelForImageTextToText, AutoTokenizer
REPO = "CrowtherLabs/atom-proton-1.0"
model = AutoModelForImageTextToText.from_pretrained(
REPO,
dtype=torch.bfloat16,
device_map="auto",
)
model.eval()
tokenizer = AutoTokenizer.from_pretrained(REPO)
Use AutoModelForCausalLM instead only if you intend to drop the vision tower and
serve the text-only decoder.
The weights occupy approximately 55 GB in bfloat16, so plan for an 80 GB
accelerator, or pass a quantization_config to fit a smaller one.
The architecture interleaves two attention types across its 64 layers, and the
linear-attention layers have a fast path that transformers does not ship. Without
it you will see
The fast path is not available ... Falling back to torch implementation
and noticeably slower inference. Install
flash-linear-attention and
causal-conv1d to enable it.
Generating
Serve this model at xhigh reasoning effort, which is the setting it was
adapted under. The chat template resolves effort as follows:
Table with columns: value, effect on the system prefix| value | effect on the system prefix |
|---|
| omitted | defaults to xhigh |
xhigh | full deliberation instruction |
high | alias for xhigh, identical output |
medium | no instruction line at all |
low | brief-thinking instruction |
Any other value raises an exception. Omitting the argument therefore gives the
correct prefix already, but set it explicitly so that a client configured with a
different default cannot silently change the prompt the model sees.
messages = [
{"role": "system", "content": "You are Atom, one of Crowther's specialised AI models."},
{"role": "user", "content": "Summarise the attached procurement policy in five points."},
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
reasoning_effort="xhigh",
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=1024, do_sample=False)
decoded = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
Reading the output
add_generation_prompt=True ends the prompt with <|im_start|>assistant\n<think>\n,
so generation begins inside the thinking block. The model emits its reasoning,
closes it with </think>, then writes the answer. Separate them on the closing
tag:
reasoning, _, answer = decoded.partition("</think>")
Show the answer to users, not the reasoning. Setting enable_thinking=False in
apply_chat_template suppresses reasoning, but the model was adapted exclusively
on thinking-enabled examples, so behaviour at that setting was not exercised.
Serving
The weights are a standard qwen3_5 architecture checkpoint, so any runtime with
support for that architecture can serve them:
vllm serve CrowtherLabs/atom-proton-1.0 --dtype bfloat16
Pass the reasoning effort through the client's chat-template arguments so that the
system prefix matches adaptation. In an OpenAI-compatible request that is
chat_template_kwargs: {"reasoning_effort": "xhigh"}. Serving configuration was
not exercised during adaptation, so verify the rendered prompt before relying on
it in production.
Notes
This checkpoint is a research artifact from the CrowtherLabs project. It is
optimized for BrowseComp Plus-style long-horizon search and reasoning tasks and
should be evaluated carefully in any downstream setting.
Model card
For questions or collaboration inquiries, please reach out through the CrowtherLabs organization account.