Downloads · 30 days
77.3K
76% of all-time downloads
LessThanThreeAI/Qwen3.8-27B-Humanlike-Chat-GGUF
Qwen3.8-27B-Humanlike-Chat-GGUF is a text generation model from LessThanThreeAI. Use it when you need the model to write or continue text. It is set up for gguf. The card lists the license as apache-2.0.
A 27B model that texts like a person and still does the work. No system prompt needed. Text it and it texts back like someone you know. Ask for a formal email, a tool call or a proper explanation and it does that, the…
Downloads · 30 days
77.3K
76% of all-time downloads
All-time downloads
102K
Public
Repo size
971 GB
Likes
200
Trending 20
Click a slice to open those files.
.gguf161 GB · 100%
From the Hugging Face model README
A 27B model that texts like a person and still does the work. No system prompt needed. Text it and it texts back like someone you know. Ask for a formal email, a tool call or a proper explanation and it does that, then goes back to texting.
Quick start · Download · vLLM / safetensors · Free endpoint · Results · How it was made · Custom finetunes
<p align="center"><img src="images/01-cover.png" width="560" alt="Same casual texts sent to both models with no system prompt. 2.0 texts back in short lines; official Qwen3.8-27B opens with How can I help you today? and answers with paragraphs."></p> <p align="center"><sub>Same texts, no system prompt. Left: 2.0. Right: official Qwen3.8-27B, one sample, long replies cut.</sub></p>"Base" on this card always means huihui-ai/Huihui-Qwen3.8-27B-abliterated, an abliterated Qwen3.8-27B. It is not the official Qwen release.
Commissions open. I build custom finetunes like this one: characters, product voices, distillation into smaller models, and domain or use-case specific models. DM codebottle on Discord. Details.
If it feels more natural than your current Qwen model, click Like. It helps other people find it.
llama-server --hf-repo LessThanThreeAI/Qwen3.8-27B-Humanlike-Chat-GGUF \
--hf-file Qwen3.8-27B-Humanlike-Chat-IQ4_XS.gguf \
--jinja \
--ctx-size 32768 --parallel 1 --n-gpu-layers 99 \
--temp 1.0 --top-p 0.95 --top-k 20 \
--alias humanlike-2.0 --host 127.0.0.1 --port 8080
Open http://127.0.0.1:8080 and start texting. --jinja uses the model's own chat template, which is what makes tool calls work. For another quant, swap in a file name from Download.
Images: add the vision file and you can send pictures in the same chat:
--mmproj-url https://huggingface.co/LessThanThreeAI/Qwen3.8-27B-Humanlike-Chat-GGUF/resolve/main/mmproj/mmproj-BF16.gguf
Or download mmproj/mmproj-BF16.gguf and pass --mmproj mmproj-BF16.gguf.
The server speaks the OpenAI API:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="none")
MODEL = "humanlike-2.0" # the --alias above
# 1. Plain chat, no system prompt
r = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": "hey, what's up?"}],
)
print(r.choices[0].message.content)
# 2. Tool calling. The departure city is missing, so 2.0 should ask instead of guessing.
tools = [{
"type": "function",
"function": {
"name": "search_flights",
"description": "Search roundtrip flights.",
"parameters": {
"type": "object",
"properties": {
"origin": {"type": "string", "description": "Departure city or airport"},
"destination": {"type": "string", "description": "Arrival city or airport"},
"depart_date": {"type": "string", "description": "YYYY-MM-DD"},
"return_date": {"type": "string", "description": "YYYY-MM-DD"},
},
"required": ["origin", "destination", "depart_date", "return_date"],
},
},
}]
r = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": "find me a roundtrip flight to Atlanta, march 1 to march 6"}],
tools=tools,
)
msg = r.choices[0].message
print(msg.tool_calls or msg.content)
# 3. Thinking, with a reasoning effort
r = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": "is it worth learning to cook if i live alone"}],
extra_body={"chat_template_kwargs": {"enable_thinking": True, "reasoning_effort": "low"}},
)
print(getattr(r.choices[0].message, "reasoning_content", None)) # the thinking
print(r.choices[0].message.content) # the reply
When the model calls a tool, send the result back as a {"role": "tool", ...} message, like with any OpenAI-compatible model.
Thinking works. 2.0 thinks briefly in first person, then texts back in the same voice. With --jinja it is on by default.
Set reasoning_effort per request, as in example 3. It takes low, medium or xhigh (the template's default). The thinking comes back in its own field, separate from the reply. For the fastest replies, send "enable_thinking": false instead. Example:
user: i miss you
2.0 (thinking): I’m glad they miss me, and I miss them back. I want to keep it brief and warm rather than make it feel like an overwrought declaration.
2.0: i miss you too
Both load GGUF files. Thinking works there too.
Start llama-server as above, then connect with:
API: Chat Completion
Chat Completion Source: Custom (OpenAI-compatible)
Custom Endpoint (Base URL): http://127.0.0.1:8080/v1
Context: 32768
Response length: 512
Temperature: 1.0
Top P: 0.95
In Chat Completion mode llama-server applies the model's own chat template, which is how my tests sent messages. If you ask for long answers, raise the response length.
Safetensors builds for vLLM, SGLang and transformers, made from the same merged BF16 weights as the GGUFs. Pick the one that fits your card:
| Repo | Size | Fits | KL vs reference | tok/s (vLLM) | Checks |
|---|---|---|---|---|---|
| GPTQ-Int4 | 20.62 GB | 24 GB card, 8k context | 0.0274 | 86 | all pass |
| FP8 | 30.89 GB | 48 GB card | 0.0079 | 72 | all pass |
| BF16 | 55.59 GB | 80 GB card | 0.0032 | 46 | all pass |
The 24 GB setup, tested with vLLM 0.27.1 capped at 21.9 GiB:
vllm serve LessThanThreeAI/Qwen3.8-27B-Humanlike-Chat-2.0-GPTQ-Int4 --served-model-name humanlike-2.0 \
--max-model-len 8192 --max-num-seqs 4 --max-num-batched-tokens 2048 --gpu-memory-utilization 0.91 \
--language-model-only --enable-auto-tool-choice --tool-call-parser qwen3_coder --reasoning-parser qwen3
On a bigger card, swap in the FP8 or BF16 repo and drop the memory flags. Each repo's card has its exact command. FP8 on a 48 GB card also needs --max-num-seqs 128, and on an H100 add --linear-backend cutlass. Thinking is on by default. Send chat_template_kwargs: {"enable_thinking": false} per request for the fastest replies. For SGLang, point --model-path at the repo. KL and checks use the same 5 test chats as the table below; tok/s is single-request decode on one H100 NVL.
Which file: with 24 GB of VRAM, take IQ4_XS or Q4_K_M. With 32 GB, take Q6_K. With 48 GB or more, take Q8_0. The free endpoint runs IQ4_XS.
| File | Size | KL vs reference | tok/s | Checks |
|---|---|---|---|---|
| IQ4_XS | 15.10 GB | 0.0219 | 43 | all pass |
| Q4_K_M | 16.56 GB | 0.0218 | 50 | all pass but one tool turn |
| Q5_K_M | 19.24 GB | 0.0086 | 56 | all pass but one tool turn |
| Q6_K | 22.09 GB | 0.0047 | 46 | all pass |
| Q8_0 | 28.60 GB | 0.0028 | 55 | all pass |
| BF16, two shards (1, 2) | 53.81 GB | 0.0017 | 36 | all pass |
| Safetensors BF16 (vLLM, SGLang, transformers) | 55.59 GB | 0.0032 | all pass | |
| Safetensors FP8 (vLLM, SGLang) | 30.89 GB | 0.0079 | all pass | |
| Safetensors GPTQ-Int4 (vLLM, SGLang) | 20.62 GB | 0.0274 | all pass | |
| Vision projector (mmproj), BF16 | 0.93 GB | adds image input, see Quick start | ||
| 2.0 LoRA, rank 320, F16 | 4.67 GB | see Standalone LoRA |
SHA256SUMS.2.0 runs on a free, rate-limited, OpenAI-compatible endpoint (the IQ4_XS quant). Tool calls work there too.
| Setting | Value |
|---|---|
| Base URL | https://api.lessthanthreeai.com/v1 |
| Model | qwen3.8-27b-humanlike-chat |
| API key | Not required |
from openai import OpenAI
client = OpenAI(api_key="not-required", base_url="https://api.lessthanthreeai.com/v1", timeout=300.0)
reply = client.chat.completions.create(
model="qwen3.8-27b-humanlike-chat",
messages=[{"role": "user", "content": "hey, what are you up to?"}],
)
print(reply.choices[0].message.content)
Thinking works here too: send extra_body={"chat_template_kwargs": {"enable_thinking": True, "reasoning_effort": "low"}} (or medium, xhigh). The reasoning comes back in a separate field from the reply. Without it, the endpoint answers straight away.
The endpoint scales to zero when idle. The first request after a quiet period waits while a GPU starts, so keep the client timeout at 300 seconds or more. In the browser: chat demo.
| Test (items) | Base | 2.0 |
|---|---|---|
| IFBench strict (300) | 37.3 | 43.7 |
| IFEval strict prompt (541) | 81.9 | 83.5 |
| When2Call (100) | 48 | 58 |
| GSM8K (64) | 89.1 | 89.1 |
| BFCL simple / multiple (100 each) | 97 / 96 | 98 / 96 |
| BFCL irrelevance (100) | 60 | 78 |
| MMLU-Pro (200) | 78.5 | 72.5 |
| LiveCodeBench pass@1 (100) | 56 * | 51 |
Same run, same prompts, thinking off, greedy. Base is the abliterated Huihui Qwen3.8-27B, not official Qwen. BFCL and When2Call use my own scorers: consistent across models, not comparable with the public leaderboards. The sets are small, so 1 to 3 points is noise.
* LiveCodeBench base is from an earlier run (30 Sep). 2.0 ran on 1 Oct.
A blind judge sees a real moment from my own one-to-one chats (moments that never went into training) and two candidate next messages: the one the person really sent and the model's. It picks the real one. Every pair is judged twice, once in each order.
| Model | Judge took the model's reply for the real one |
|---|---|
| Base (Huihui abliterated) | 0.3% |
| Base + "text like a human" prompt | 6.8% |
| Official Qwen3.8-27B | 15.1% |
| 2.0 | 23.5% |
How to read it: the judge always knows one of the two messages is fake, so 50% would mean it can't tell the model from the person. 50% is the ceiling, not 100%.
In 16 live chats with a simulated texter, the judge picked 2.0 over the base every time and over the prompted base in 96.9% of judgments.
Caveats: the judge is one LLM, not people, and most of the 147 moments are in Russian (97). The voice LoRA inside 2.0 learned from other sessions of the same chats, so 2.0 plays at home here while the base and official Qwen don't.
The voice comes from SFT on real and synthetic conversations (139,845 messages from 1,396 conversations).
For 2.0 I used on-policy distillation: the model writes its own replies and a teacher grades every token. There are two teachers. For chat and characters it's the voice model plus a hidden "text like a person" instruction. For instructions, tools and code it's the plain base. The student never sees the hidden instruction, so 2.0 texts that way with no system prompt.
It practised on conversation starts, not answers: 3,208 real conversation openings from the API (starting points only, it wrote its own replies), 156 characters and 4,200 public tasks (1,200 tool, 1,800 instruction, 1,200 code). None of them overlap any test on this card. Four rounds on rented GPUs. The tool data is balanced half call, half ask or decline, so it asks instead of guessing. The final run was 36 steps on one H100, about 6 hours.
The base is abliterated, so it refuses little. I picked it because I wanted something that isn't censored.
Qwen/Qwen3.8-27B
-> huihui-ai/Huihui-Qwen3.8-27B-abliterated (revision d42ca897)
-> humanlike voice LoRA (SFT, rank 256) at strength 0.4
-> 2.0 LoRA (rank 64, on-policy distillation, final step 106)
-> both merged once into BF16 (together one exact rank-320 adapter)
-> BF16 / Q8_0 / Q6_K / Q5_K_M / Q4_K_M / IQ4_XS GGUF
<details>
<summary><strong>Technical details</strong></summary>
| Item | Specification |
|---|---|
| Base model | huihui-ai/Huihui-Qwen3.8-27B-abliterated at revision d42ca8978c5a66e92c3446d46e8adfe03ef692ff, based on Qwen/Qwen3.8-27B |
| Architecture | Dense 27B, 64 language layers (48 linear attention, 16 full attention) |
| Adaptation | Humanlike voice LoRA (rank 256, strength 0.4) plus the 2.0 LoRA (rank 64), merged into BF16 in fp32 with a single cast. Together they equal one exact rank-320 adapter over 496 language modules. |
| 2.0 training | On-policy distillation, exact full-vocabulary reverse KL against the teacher on every token |
| Merge check | Merged BF16 vs base plus the rank-320 adapter at runtime: mean KL 0.0023, top-1 agreement 97%, greedy replies identical on 11 of 15 turns |
| Context | 262,144 tokens native. Start at 32,768. 2.0 training prompts were capped at 12k tokens; long-chat evals went to 30 turns. |
| Quantization | Every quant comes from the same merged BF16 GGUF, built with llama.cpp@95ef7fc16054e63b427a3ef00188e055ef7586d8. Importance matrix: WikiText-2 train (128 x 512-token chunks) plus a chat and tool-call text mix (imatrix/imatrix.gguf, computed on the merged 2.0 BF16; use it for your own quants). Q8_0 uses none. The 96 recurrent gate tensors stay at Q8_0 and 353 control tensors at F32. |
| Modality | Text and images. Training was text only and left the vision tower unchanged: its weights are byte-identical to the base, and mmproj/mmproj-BF16.gguf is the base's vision projector (from huihui-ai/Huihui-Qwen3.8-27B-abliterated-GGUF). The BF16 safetensors keep the vision tower and MTP head. |
| License | Apache-2.0 |
Hugging Face and Transformers may show the architecture as qwen35 or qwen3_5_text. That is Qwen3.8's internal identifier.
lora/Qwen3.8-27B-Humanlike-Chat-2.0-LoRA-r320-F16.gguf (4.67 GB) is all of 2.0 as one rank-320 GGUF LoRA for llama.cpp: the voice LoRA at 0.4 plus the 2.0 LoRA.
llama-server -m YOUR-Huihui-Qwen3.8-27B-abliterated.gguf \
--lora Qwen3.8-27B-Humanlike-Chat-2.0-LoRA-r320-F16.gguf \
--jinja \
--ctx-size 32768 --parallel 1 --n-gpu-layers 99 \
--temp 1.0 --top-p 0.95 --top-k 20
--lora applies it at scale 1.0, which is the right strength.I take commissions. If you want a model that sounds like a specific character, your product, or your own texting style, or a smaller model that knows your domain, I can build it the way I built this one: data, training, evals against the base, and GGUF files you can run or a hosted endpoint.
Good fits:
DM codebottle on Discord. Tell me what you're building and what it should sound like.
Found a chat where it slips? Tell me in the Community tab or on Discord.
Apache-2.0, inherited from the upstream Qwen and Huihui releases.