# Sahabat AI: Indonesian LLM Developer Guide and Token Costs

> A locally trained model does not make Indonesian cheaper to send, because it keeps the base model's tokeniser. I measured four tokenisers to find what does change.

URL: https://www.matthewswong.com/en/blog/sahabat-ai-indonesian-llm-developer-guide/

- Author: Matthews Wong (https://www.matthewswong.com/en/about/)
- Published: 2026-09-17
- Updated: 2026-09-17
- Category: AI

> **Key takeaway:** Sahabat AI is an Indonesian large language model co-initiated by GoTo and Indosat, published on Hugging Face at 8, 9 and 70 billion parameters. Its model cards state it keeps the base model's tokeniser, so it does not make Indonesian cheaper to send. Choose it for data residency and regional languages, decided by an eval from your own traffic.

The chatbot on this site answers in English and in Indonesian, and the Indonesian answers cost more tokens. Not because they are longer, but because an Indonesian word is worth more tokens than an English one on whichever tokeniser the model happens to use. I had assumed a model trained in Indonesia would fix that. Reading the model cards, it does not.

This post is what I found when I actually looked: what Sahabat AI is, what its model cards say and pointedly do not say, what four tokenisers charge per Indonesian word when you run them over the same text, and how I would choose between a locally trained model and a frontier API for an Indonesian product. Every number below is either quoted from a model card or measured on my own machine, and the measuring script is included so you can disagree with it.

## What Sahabat AI actually is

Sahabat AI is a collection of large language models pretrained and instruct-tuned for Indonesia, co-initiated by PT GoTo Gojek Tokopedia and Indosat Ooredoo Hutchison and developed together with AI Singapore. It is not one model. Five repositories are published on Hugging Face covering three sizes: a 70 billion parameter v2 built on Llama 3.1 70B Instruct, and two v1 models at 8 and 9 billion parameters built on Llama 3 8B and Gemma 2 9B, each in a base and an instruct variant. There is also a public chat service at sahabat-ai.com and inside the GoPay app.

The three sizes differ in ways that matter more than the parameter count. The 70B lists six supported languages, adding Batak Toba and Balinese to English, Indonesian, Javanese and Sundanese; the smaller pair lists four. Context length is 8,192 tokens on both v1 models and 128k on the 70B. And each ships under the community licence of the model it was built on, which is not the same thing as an open source licence, whatever the surrounding ecosystem is called.

| Model | Base model | Context length | Licence |
| --- | --- | --- | --- |
| Llama-Sahabat-AI-v2-70B-IT | Llama 3.1 70B Instruct | 128k tokens | Llama 3.1 Community License |
| gemma2-9b-cpt-sahabatai-v1-instruct | Gemma 2 9B | 8,192 tokens | Gemma Community License |
| llama3-8b-cpt-sahabatai-v1-instruct | Llama 3 8B | 8,192 tokens | Llama 3 Community License |

## Continued pre-training does not replace the tokeniser

One sentence on the model cards changed how I thought about this, and it appears on all three in nearly the same words: the model employs the default tokeniser used in its base model. The 70B keeps the Llama 3.1 tokeniser. The 9B keeps the Gemma 2 one. The 8B keeps Llama 3's. Nobody trained a new Indonesian vocabulary.

That is a defensible engineering decision. Swapping a tokeniser means rebuilding the embedding layer and discarding most of what the base model already knows, which is a far larger project than continued pre-training. But it has a consequence people assume away. Continued pre-training changes what a model knows about Indonesia; it does not change how many tokens your Indonesian sentence costs. If you are hoping a local model will cut the token half of your bill, the model card has already told you it will not.

## What four tokenisers charge for one Indonesian word

So I measured it. The script below pulls the plain-text Wikipedia article on Indonesia in English, Indonesian, Javanese and Sundanese from the MediaWiki API, truncates each to the first 15,000 characters, and counts tokens with four tokenisers: OpenAI's o200k_base and cl100k_base through tiktoken, plus the tokenizer.json files of Llama 3.1 and Gemma 2 loaded with the Hugging Face tokenizers library. Because Sahabat AI keeps the base tokeniser unchanged, measuring Llama 3.1 is measuring the 70B.

The result was not the one I expected. The Llama 3.1 tokeniser, the one the flagship 70B inherits, was the most expensive of the four on Indonesian: 2.34 tokens per word against 1.41 for English, a 66 per cent penalty. OpenAI's current o200k_base did the same job at 1.90, a 37 per cent penalty. And Gemma 2 was cheapest at 1.79, which means the 9 billion parameter Sahabat AI tokenises Indonesian more cheaply than the 70 billion one does.

| Tokeniser | English | Indonesian | Javanese | Sundanese |
| --- | --- | --- | --- | --- |
| o200k_base (GPT-4o family) | 1.38 | 1.90 | 2.24 | 2.23 |
| cl100k_base (GPT-4) | 1.41 | 2.36 | 2.72 | 2.82 |
| Llama 3.1 (Sahabat AI 70B) | 1.41 | 2.34 | 2.68 | 2.80 |
| Gemma 2 (Sahabat AI 9B) | 1.43 | 1.79 | 2.37 | 2.41 |

Vocabulary size explains most of the ordering. Gemma 2 carries 256,000 entries, o200k_base 200,019, Llama 3.1 128,256 and cl100k_base 100,277, and the ranking on Indonesian follows that almost exactly. Two caveats I would want if I were reading this. Wikipedia articles in four languages are not translations of one another, so tokens per word compares each language's own encyclopaedic prose rather than a strict parallel corpus; characters per token, which does not depend on word counts at all, ranks the four tokenisers the same way. And encyclopaedic prose is not chat traffic. Run the script on your own logs before you budget from it.

## The failures a token count does not show

None of the above is a reason to pick a locally trained model. If the token bill is your only concern, the table says use a frontier API and stop reading. The reason to consider Sahabat AI is everything a token count cannot see, and there are four of those worth naming.

- Register. Formal written Indonesian and everyday chat Indonesian behave like two different languages. A model that has read mostly news and encyclopaedia text answers a WhatsApp question in the voice of a bank letter, and Indonesian customers hear it immediately.
- Regional languages. Javanese was 3 per cent of the 8B model's 50 billion token continued pre-training mix and Sundanese 1.5 per cent, drawn from 0.40 and 0.20 billion unique tokens repeated 3.8 times. Those counts are in Llama 3 tokens, and Javanese costs about 1.9 tokens per word on that tokeniser, so it is fewer words than the figure first suggests. It is still far more than a frontier model has any commercial reason to hold.
- Code-switching. Indonesian users and developers attach Indonesian affixes to English stems constantly, as in di-deploy, staging-nya, top up-nya. No public benchmark scores this, and both kinds of model fumble it in different ways.
- Local conventions. Rupiah uses full stops as thousand separators, so Rp1.250.000 is one and a quarter million rather than one and a quarter. Addresses nest through kelurahan and kecamatan. NPWP, NIK, QRIS and e-Faktur are entities a model has either seen or has not.

Sahabat AI is not automatically better at all four either. The 9B card describes its instruction tuning as a wide range of synthetic instructions alongside publicly available ones hand-curated with native speakers, at roughly 448,000 Indonesian pairs, 96,000 Javanese and 98,000 Sundanese. Synthetic Indonesian instructions inherit whatever register their generator wrote in, which is exactly the failure mode in the first bullet. The only way to know is to test the register you actually receive.

*Only the third band is genuinely fixed by choosing a locally trained model. The first is set by the tokeniser that model inherited, and the last two are settled by your own eval rather than by any vendor.*

## Build the eval from your own traffic, not a leaderboard

The model cards publish benchmark results, and the benchmarks are real work. IndoMMLU is Indonesian school examination material across humanities, Indonesian language, local languages and cultures, social science and STEM at primary, middle and high school level. SEA-HELM covers question answering, sentiment, toxicity, translation in both directions, summarisation, causal reasoning and natural language inference. Neither of them is your product. One of the instruction-following benchmarks on the 70B card, SEA-MTBench, is judged by gpt-4-1106-preview against a gpt-3.5-turbo-0125 baseline, which is a useful reminder that a leaderboard position is a statement about one judge on one task set at one point in time.

Two hundred cases is enough to see a real difference and small enough that two people can grade them in an afternoon. Grade blind, with the model name stripped before the sheet reaches the grader, and record tokens and latency in the same row as the quality score. A model that wins on quality and loses on cost is a decision you have to make, not a result you can read off.

> Log prompt tokens, not just request counts. Indonesian costs roughly 1.7 times English per word on the Llama 3.1 tokeniser in my measurement, so a per-request cost average looks healthy right up until the invoice arrives. Bucketing spend by detected input language is an afternoon of work and it is the first instrumentation I would add to any bilingual product.

## Self-hosting is a different cost shape, not a cheaper one

The 70B model card is refreshingly direct about what running it takes: approximately 140 GB of VRAM in FP16 or BF16, with recommended setups of two NVIDIA H100s or four L40s. That is a floor you pay whether or not anyone is chatting. The 9B is the one most Indonesian products should try first, at roughly 18 GB by the same two-bytes-per-parameter arithmetic, but its 8,192 token context rules out anything that stuffs long documents into the prompt.

That is the honest shape of the trade. An API charges per token and nothing at idle; a self-hosted model charges for the GPU and nothing per token. Which is cheaper depends entirely on how busy you keep it, which is a question about your traffic rather than about the model. What self-hosting buys unconditionally is location. GoTo and Indosat state that the Sahabat AI chat service runs on Indosat's GPU Merdeka sovereign AI cloud, and that the data and GPU infrastructure serving the model stay within Indonesian territory or on the user's own servers. For a regulated Indonesian workload, that sentence can outrank every number in this post.

> Read the licence before you plan a product around the weights. All three models ship under the community licence of their base model, Llama 3.1, Llama 3 and Gemma respectively, and a community licence is not an OSI-approved open source licence however the ecosystem around it is described. Check the acceptable-use and naming terms yourself rather than assuming Apache-style freedom.

*The two outer panels are arguments and the last one is evidence. If you only have time to build one of the three, build the eval.*

## Which one I would ship, and when

For the Indonesian products I work on today I default to a frontier API and keep an open-weights path warm, rather than the other way round. The reasons are specific and none of them is that the frontier model is smarter. My traffic is spiky enough that a dedicated GPU would idle through most of the day, o200k_base tokenises Indonesian more cheaply than the Llama 3.1 tokeniser the 70B inherits, and nobody on a small team wants to be paged at two in the morning for an inference node.

I would flip that on four conditions, any one of which is sufficient on its own. Data residency is a requirement rather than a preference. The input is Javanese, Sundanese, Batak Toba or Balinese, where a frontier model has no commercial reason to be good and Sahabat AI has at least been trained on some. Volume is steady enough to keep a GPU meaningfully busy. Or the eval says so, which is the only one of the four that actually settles the question, because the other three are inputs to it.

The useful question was never whether a local model beats a frontier one. It is which of them is better at the exact task you ship, in the register your users actually write, at a cost you have measured rather than assumed. Sahabat AI's model cards are unusually honest about what it is and what it needs: the tokeniser is inherited, the regional-language data is thin, the 70B wants 140 GB of VRAM. Read them, then go and build the two-hundred-case eval. It is a day of work, and it ends an argument that otherwise runs forever.

## Sources

- Sahabat-AI, Llama-Sahabat-AI-v2-70B-IT model card, Hugging Face
- GoToCompany, llama3-8b-cpt-sahabatai-v1-base model card and training data mix, Hugging Face
- GoToCompany, gemma2-9b-cpt-sahabatai-v1-instruct model card, Hugging Face
- GoTo, Sahabat-AI Gets Smarter, Indosat and GoTo Launch New 70 Billion Parameter Model
- Koto et al., IndoMMLU, Large Language Models Only Pass Primary School Exams in Indonesia, arXiv

## Source links

- https://huggingface.co/Sahabat-AI/Llama-Sahabat-AI-v2-70B-IT
- https://huggingface.co/GoToCompany/llama3-8b-cpt-sahabatai-v1-base
- https://huggingface.co/GoToCompany/gemma2-9b-cpt-sahabatai-v1-instruct
- https://www.gotocompany.com/en/news/press/sahabat-ai-gets-smarter-indosat-and-goto-launch-new-70-billion-parameter-model-with-multilingual-chat-service
- https://arxiv.org/abs/2310.04928

## FAQ

### What is Sahabat AI and who built it?

Sahabat AI is a collection of large language models pretrained and instruct-tuned for Indonesia, co-initiated by PT GoTo Gojek Tokopedia and Indosat Ooredoo Hutchison and developed together with AI Singapore. Five repositories are published on Hugging Face covering three sizes: 8 billion and 9 billion parameter v1 models, and a 70 billion parameter v2. There is also a public chat service at sahabat-ai.com and inside the GoPay app.

### Does Sahabat AI make Indonesian cheaper to process than GPT or Claude?

No, and the model cards say so directly: each model keeps the default tokeniser of its base model rather than a new Indonesian vocabulary. Measuring the same 15,000 character sample, the Llama 3.1 tokeniser that the 70B inherits spent 2.34 tokens per Indonesian word against 1.41 for English, while OpenAI's o200k_base spent 1.90. Continued pre-training changes what the model knows about Indonesia, not what your sentence costs.

### Does Sahabat AI really support Javanese and Sundanese?

It has been trained on both, but the coverage is thinner than the language list suggests. The 8B model card reports Javanese at 3 per cent of its 50 billion token continued pre-training mix and Sundanese at 1.5 per cent, from 0.40 and 0.20 billion unique tokens repeated 3.8 times. The 70B additionally lists Batak Toba and Balinese. Test on your own regional-language traffic before promising anything.

### What hardware do I need to self-host Sahabat AI?

The 70B model card states approximately 140 GB of VRAM for FP16 or BF16 inference, with recommended setups of two NVIDIA H100s or four L40s. The 9B model is far more approachable at roughly 18 GB by the same two-bytes-per-parameter arithmetic, but it has an 8,192 token context length. A self-hosted GPU costs the same whether it serves one request or a million.

### How do I decide between Sahabat AI and a frontier model API?

Build a task-specific eval instead of trusting a leaderboard. Take around 200 real prompts from your own logs, run both candidates, grade the answers blind with native speakers, and record tokens and latency in the same row as the quality score. A local model wins when data residency is a requirement, when the input is a regional language, or when steady volume keeps a GPU busy.

---

- HTML version: https://www.matthewswong.com/en/blog/sahabat-ai-indonesian-llm-developer-guide/
- Bahasa Indonesia: https://www.matthewswong.com/id/blog/sahabat-ai-indonesian-llm-developer-guide/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
