Docs
Everything needed to run ufakzeka-1 on your own machine. The architecture is plain Qwen3, so transformers needs no custom code. The GGUF files need a small patch applied to llama.cpp.
Quick start
Python. apply_chat_template renders the chat format; do not pass a system message.
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("ufakai/ufakzeka-1")
model = AutoModelForCausalLM.from_pretrained("ufakai/ufakzeka-1")
msgs = [{"role": "user", "content": "Merhaba, sen kimsin?"}]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt")
out = model.generate(ids, max_new_tokens=520, do_sample=True, temperature=0.3, top_p=0.9, top_k=40)
print(tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True))Download the q8_0 file first, then run it with a patched llama.cpp (see the patch below). The flags are the recommended sampling settings.
hf download ufakai/ufakzeka-1-GGUF ufakzeka-1-q8_0.gguf --local-dir .
llama-cli -m ufakzeka-1-q8_0.gguf \
--temp 0.3 --top-k 40 --top-p 0.9 --min-p 0 \
--repeat-penalty 1.0 --dry-multiplier 0 -n 520llama-server exposes a chat-completions HTTP endpoint. The demo site runs this way: with q8_0 on a 2 vCPU server, 137 tokens per second for one request and 70 each for two concurrent requests.
llama-server -m ufakzeka-1-q8_0.gguf --port 8080 \
--temp 0.3 --top-k 40 --top-p 0.9 --repeat-penalty 1.0 --dry-multiplier 0
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "Merhaba, sen kimsin?"}], "max_tokens": 520}'Files
| File | Use | Size | Note |
|---|---|---|---|
ufakai/ufakzeka-1 | Chat model, transformers | The model the examples on this page use. The model card lives here. | |
ufakai/ufakzeka-1-base | Base model, transformers | Weights after pretraining, for fine-tuning and research. | |
ufakzeka-1-f16.gguf | llama.cpp, reference | 367 MB | Identical tokenization to transformers; 0.002 nats mean logit difference; the same answers word for word on an eight-prompt greedy check. |
ufakzeka-1-q8_0.gguf | llama.cpp, recommended | 196 MB | Identical tokenization; 0.03 nats; the same answers on the same check. |
- SHA-256 · ufakzeka-1-f16.gguf
d1e711e473c88bd5eecc06030e3a8832596a234e898df912d06960426c2e38b8- SHA-256 · ufakzeka-1-q8_0.gguf
6a06fbffe77b8c70ee084ce8901edaaaeec4c23fd7360296259a78111facdf5e
No 4-bit file is published: on an earlier checkpoint of this model, 4-bit quantisation made perplexity 5 percent worse and changed the answers.
Sampling settings
| Setting | Value | Why |
|---|---|---|
temperature | 0.3 | The demo runs at this value; 0.45 gave worse results. |
top_p / top_k | 0.9 / 40 | Same as the demo. |
repeat_penalty | 1.0 (off) | It suppresses repeated digit tokens and breaks the column arithmetic. |
DRY | 0 (off) | Same reason. |
max_new_tokens | at least 420 | Arithmetic is written out step by step; the working is long by design. The examples use 520. |
system prompt | none | The model was trained on user and assistant turns only and never saw a system message. |
Chat format
The chat format is ChatML: each turn opens with <|im_start|>, the role name and a newline, and closes with <|im_end|>. An <|im_start|>assistant line is appended for the model’s reply. apply_chat_template in transformers and llama.cpp do this for you; if you write your own server, the prompt must look exactly like this:
<|im_start|>user
Merhaba, sen kimsin?<|im_end|>
<|im_start|>assistant
The llama.cpp patch
The tokenizer is a byte-level BPE trained on Turkish. Its pre-tokenizer is the Qwen2 pattern without the English contraction rule, which would split apostrophe suffixes such as “Ankara’da” differently from training. The GGUF therefore declares tokenizer.ggml.pre = "ufakzeka", and llama.cpp builds that do not know the name refuse the file with:
unknown pre-tokenizer type: 'ufakzeka'The patch changes 15 lines in 4 files and fixes llama.cpp, not the files. To apply it:
hf download ufakai/ufakzeka-1-GGUF llama.cpp-ufakzeka-pretok.patch --local-dir .
git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
git apply ../llama.cpp-ufakzeka-pretok.patch
cmake -B build && cmake --build build --config Release -j
./build/bin/llama-cli -m ../ufakzeka-1-q8_0.gguf --temp 0.3 --top-k 40 --top-p 0.9 --repeat-penalty 1.0 --dry-multiplier 0 -n 520The patch was written against the llama.cpp source of September 2026; if it does not apply cleanly, the changes are small enough to make by hand. Ollama and LM Studio will work once the patch is upstream. Patch file.
Naming the file with the qwen2 rule would load everywhere, but that rule splits every apostrophe suffix starting with d, t, s, m or v (Ankara’da becomes ’d + a). On a short apostrophe-heavy sample (about 3,500 characters) perplexity rose from 15.4 to 19.0 and two of six answers changed, so no such file is published.
What it cannot do
This is a research model, not an assistant. It invents facts it does not have, cannot write code, can lose a correct calculation on the second turn, can confuse who is who after a long story, and knows nothing after summer 2026. The measured limits are on the home page and in the model card, with numbers.
License and data
The weights are Apache-2.0. All training data comes from commercially licensed sources; the source list, their licences and the exclusions are in the model card. Model card.