Instructions to use agentionai/Signal-3.8-27B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use agentionai/Signal-3.8-27B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="agentionai/Signal-3.8-27B") 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("agentionai/Signal-3.8-27B") model = AutoModelForMultimodalLM.from_pretrained("agentionai/Signal-3.8-27B", 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 agentionai/Signal-3.8-27B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "agentionai/Signal-3.8-27B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "agentionai/Signal-3.8-27B", "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/agentionai/Signal-3.8-27B
- SGLang
How to use agentionai/Signal-3.8-27B 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 "agentionai/Signal-3.8-27B" \ --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": "agentionai/Signal-3.8-27B", "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 "agentionai/Signal-3.8-27B" \ --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": "agentionai/Signal-3.8-27B", "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 agentionai/Signal-3.8-27B with Docker Model Runner:
docker model run hf.co/agentionai/Signal-3.8-27B
Signal 3.8 27B
This is Qwen3.8-27B that gets to the answer faster.
AgentionAI Signal is a minimally invasive fine-tune of Qwen3.8-27B designed for lower generation latency and better token efficiency. On our held-out general-prompt evaluation, Signal produces 57% fewer answer tokens and uses 52% fewer thinking tokens, while matching or improving the measured answer quality of the base model.
The result is substantially faster end-to-end generation: on typical chat prompts, Signal can finish in less than half the wall time of the untouched Qwen3.8-27B on the same hardware.
Signal gets there by being more direct rather than by truncating answers. It removes unnecessary preambles, excessive formatting, sign-offs, and explanatory narration while preserving the substance of the response. In thinking mode, it keeps the useful reasoning steps while spending fewer tokens describing the process.
Signal is trained by self-distillation: on Qwen3.8-27B's own answers, generated under an instruction to be direct that the released model no longer needs. No external data and no other model's outputs went into it, which is why it keeps the base model's knowledge and voice intact.
These are the full BF16 weights in Hugging Face format, a drop-in replacement for Qwen3.8-27B in transformers, vLLM, SGLang and any quantization pipeline. Quantized GGUF tiers from IQ4_XS to Q8_0 are in agentionai/Signal-3.8-27B-GGUF.
What changes, measured
We evaluated Signal against the untouched Qwen3.8-27B, both at Q8_0 in llama.cpp, using the same server, sampling settings, prompts, and otherwise identical model file. All prompts in these evaluations were held out from tuning.
| base Q8_0 | Signal | change | |
|---|---|---|---|
| general answers, median tokens | 243 | 104 | -57% |
| answers opening with a preamble ("Sure!", "Great question") | 13% | 0% | gone |
| answers with markdown headers | 47% | 18% | -62% |
| answers with bold | 85% | 52% | -39% |
| coding answers, median tokens | 159 | 142 | -11% |
| coding answers, p90 tokens | 1026 | 914 | -11% |
Thinking mode, same prompts with reasoning on:
| base Q8_0 | Signal | change | |
|---|---|---|---|
| reasoning tokens, general prompts, median | 153 | 74 | -52% |
| reasoning tokens, coding prompts, median | 225 | 166 | -26% |
| reasoning tokens, GSM8K, median | 119 | 81 | -32% |
Quality, exact match on GSM8K:
| base Q8_0 | Signal | |
|---|---|---|
| thinking off, 60 problems | 98.3% | 98.3% |
| thinking on, 40 problems | 92.5% | 95.0% |
Shorter is not cheaper: no answer in the 100-prompt style set was cut off early (0 answers ending on a header or a colon, 0 unclosed code blocks), and no reasoning trace in 50 thinking-mode outputs looped or hit the token cap.
Faster with speculative decoding
Qwen3.8-27B carries a built-in multi-token-prediction draft head. Signal's answers are more predictable, so the drafter agrees with the model more often:
Draft acceptance and decode speed with --spec-type draft-mtp, both models Q8_0 on the same
machine (Strix Halo, Vulkan), 200-token greedy runs for the fixed-draft rows:
| prompt / draft length | base acceptance | Signal acceptance | decode speed vs base |
|---|---|---|---|
| prose, draft 3 | 39% | 47% | +10% |
| prose, draft 4 | 35% | 28% | -9% |
| structured output (JSON), draft 3 | 72% | 94% | +20% |
| structured output (JSON), draft 4 | 66% | 87% | +22% |
| chat prompts, sampled at 0.7, adaptive draft ≤4 (40 prompts) | 57% | 60% | — |
Combined with the shorter answers, a typical chat reply finishes in well under half the wall time of the base model on the same hardware. Because of the specific finetuning there is no degredation over long context length.
What is in the repository
The complete Qwen3.8-27B checkpoint, 18 safetensors shards in BF16, with one tensor replaced: lm_head.weight. Every other tensor, the vision encoder, the projector, the MTP draft head, the tokenizer and the chat template are byte-identical to Qwen/Qwen3.8-27B. The head delta has a norm of 4.1% of the original head. Vision input works as in the base model.
Because only the output layer differs, any quantization recipe, LoRA, or serving setup that works on Qwen3.8-27B works on Signal unchanged.
Running
Thinking on and off both work; the chat template is the original Qwen3.8 template.
Sampling: temperature 0.7, top-p 0.95, top-k 20, min-p 0. Use sampling rather than greedy decoding. We saw a single loop at temperature 0.
transformers
from transformers import AutoProcessor, AutoModelForImageTextToText
model_id = "agentionai/Signal-3.8-27B"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForImageTextToText.from_pretrained(model_id, dtype="bfloat16", device_map="auto")
messages = [{"role": "user", "content": "Explain how a hash map works."}]
inputs = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=True,
return_dict=True, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=1024, do_sample=True, temperature=0.7, top_p=0.95, top_k=20)
print(processor.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
Thinking is on by default. Pass enable_thinking=False to apply_chat_template to turn it off.
vLLM
vllm serve agentionai/Signal-3.8-27B --dtype bfloat16 --max-model-len 65536 --reasoning-parser qwen3
Then call the OpenAI-compatible endpoint with the sampling settings above. Send
"chat_template_kwargs": {"enable_thinking": false} to turn thinking off per request.
llama.cpp
Use the prebuilt tiers in agentionai/Signal-3.8-27B-GGUF, which include the vision projector and the multi-token-prediction draft head, or convert this checkpoint with convert_hf_to_gguf.py.
Support AgentionAI
Signal3.8 is released freely. If it saves you compute or makes Qwen more useful, you can sponsor continued tuning, quantization and benchmarking on GitHub.
- Downloads last month
- 20
