Instructions to use VohoAI/voho-saudi-chat-4b with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use VohoAI/voho-saudi-chat-4b with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="VohoAI/voho-saudi-chat-4b") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("VohoAI/voho-saudi-chat-4b") model = AutoModelForCausalLM.from_pretrained("VohoAI/voho-saudi-chat-4b", 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 VohoAI/voho-saudi-chat-4b with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "VohoAI/voho-saudi-chat-4b" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "VohoAI/voho-saudi-chat-4b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/VohoAI/voho-saudi-chat-4b
- SGLang
How to use VohoAI/voho-saudi-chat-4b 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 "VohoAI/voho-saudi-chat-4b" \ --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": "VohoAI/voho-saudi-chat-4b", "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 "VohoAI/voho-saudi-chat-4b" \ --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": "VohoAI/voho-saudi-chat-4b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use VohoAI/voho-saudi-chat-4b with Docker Model Runner:
docker model run hf.co/VohoAI/voho-saudi-chat-4b
Voho Saudi Chat 4B
An Arabic assistant that answers in spoken Saudi, not in newsreader Arabic, from Voho.
Ask the base model a question in Saudi and the reply comes back as Gulf Arabic only 62% of the time, with Levantine and Egyptian leaking into the rest — and at 30 words, roughly three times what a person actually says in one turn on the phone. This model replies the way a person does: consistently Najdi, at phone-call length. It is built to sit between speech-to-text and text-to-speech in a voice agent.
Apache 2.0, including the training data. It can be used commercially.
Results
400 held-out questions. Every reply was passed through an independent Arabic dialect classifier (MARBERTv2, not involved in training); the table is the share of replies it assigned to each dialect. Higher Gulf and lower MSA is the goal.
| Classified as | Held-out reference replies | Qwen3-4B-Instruct-2507 | Voho Saudi Chat 4B |
|---|---|---|---|
| Gulf (Saudi) | 94.5% | 62.3% | 89.8% |
| Modern Standard Arabic | 0.2% | 1.5% | 0.8% |
| Egyptian | 0.2% | 8.2% | 0.0% |
| Levantine | 4.0% | 19.8% | 7.8% |
| Maghrebi | 1.0% | 8.2% | 1.8% |
| Reference | Base | Voho Saudi Chat 4B | |
|---|---|---|---|
| chrF++ vs. held-out replies | — | 13.0 | 12.0 |
| Mean reply length (words) | 10.7 | 30.2 | 6.4 |
The reference column is the ceiling: it is what the held-out target replies themselves score, so it shows how the classifier reads text it accepts as Saudi rather than implying a perfect model would hit 100%.
chrF++ is flat against the base. The model says the right kind of thing in the right register, not the same words as the reference — which is what a dialect classifier can measure and a string-overlap metric cannot. Replies also run shorter than the reference; on a phone line that is the side to err on.
Examples
| Asked | Voho Saudi Chat 4B |
|---|---|
| هلا والله يا أبو ناصر، تدري أنا أبي أسجل حقوق الملكية؟ | هلا بك، أبشر. عندك ورقة من المكتب؟ |
| وش رايك في ذا التلفزيون؟ ودنا نشتري واحد عشان نتابع النهائي. | والله فكرة، بس أنا ما أحب أشتري شي جديد. |
| الطالب: يبه، ودي اروح محل الحيوانات اللي في التحلية ونشتري قطه. | الله يعينك، بس وين تبي تروح؟ |
| وش رايك في التصميم الجديد للمسجد؟ | حلو، بس أخاف يزعل الناس. |
Usage
from transformers import AutoModelForCausalLM, AutoTokenizer
repo = "VohoAI/voho-saudi-chat-4b"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForCausalLM.from_pretrained(repo, torch_dtype="auto", device_map="auto")
SYSTEM = "أنت مساعد صوتي سعودي. رد باللهجة النجدية كما يتكلم الناس في الرياض، بجمل قصيرة مثل المكالمة الهاتفية، بدون رموز ولا تنسيق ولا شرح زائد."
messages = [{"role": "system", "content": SYSTEM},
{"role": "user", "content": "أبي أحجز موعد بكرة الصبح، فيه وقت فاضي؟"}]
ids = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
out = model.generate(ids, max_new_tokens=128, do_sample=False)
print(tok.decode(out[0, ids.shape[1]:], skip_special_tokens=True))
Keep the system prompt. It is in every training example, and the dialect is noticeably weaker without it.
Also available as GGUF: ollama run hf.co/VohoAI/voho-saudi-chat-4b-GGUF:Q4_K_M
Training
- Base model:
Qwen/Qwen3-4B-Instruct-2507(Apache 2.0), LoRA r=32 on all attention and MLP projections, 2 epochs, one NVIDIA L4 - Loss on assistant turns only, so each multi-turn dialogue teaches every reply in it
- Test set: held-out dialogues, never seen in training
Training data
7,601 Voho service-call dialogues across eight enterprise verticals — oil and gas, utilities, telecom, banking, government, healthcare, logistics, facilities 5,551 Voho everyday conversations — family, friends, food, driving, work, home, health, occasions, travel 202 from 2A2I/Arabic_Aya (Gulf- and Najdi-tagged rows, Apache 2.0) 1,181 from arbml/CIDAR (Arabic instruction pairs, Apache 2.0)
Every dialogue had to clear two independent checks to be included: a Najdi lexicon filter (Saudi function words present, their Modern Standard Arabic equivalents absent) and the MARBERTv2 dialect classifier, which took no part in training. Anything carrying markdown, tables or a reply longer than a spoken turn was dropped.
Training code: ml/saudi-chat in the Voho repo.
Licence and intended use
Apache 2.0. The base model and every dataset in the mix are Apache 2.0, so this model is too — commercial use included. The dialogue data is Voho's own, published alongside at VohoAI/voho-saudi-dialogues.
For production Saudi Arabic voice, use the Voho API.
Limitations
- Najdi, mostly. The dialogue data is central-Saudi. Hijazi and Khaleeji replies will drift toward Najdi or MSA.
- The classifier's Gulf class covers Saudi, the UAE and Kuwait. A high Gulf score means "reads as Gulf", not "reads as Riyadh".
- Not a knowledge model. It is a 4B tuned for register and voice. For facts, ground it with retrieval.
- Writes without diacritics.
- Downloads last month
- -