~/satyajit

Jais 3: adapting K2 Horizon to Arabic without touching the tokenizer

mdjsonmcp

2026-10-16 · 19 min · pretraining · tokenization · benchmarks · asr · speech

A 1:47 narrated explainer, drawn in code. Every number and picture in it is this article's own; the sources are below.

› transcript

Hi, I'm Gantry! IFM turned its K2 Horizon models into an Arabic family, without starting from scratch. Here is how. The new models add no Arabic tokens. The base vocabulary already held them, so adapting is just more training. The older adapted models had to add thirty-two thousand Arabic tokens to Llama two, and train their new embeddings alone first. This time the tokenizer is byte for byte the base's, every tensor keeps its shape, and only the values move. Start from the K2 Horizon weights near the end of their mid-training. Keep pre-training on Arabic, with a quarter of each batch replayed from the base's own data, so old skills stay. Then a short cool-down, fine-tuning, and an anti-repetition pass. The smallest model moved furthest, and its Arabic output rows moved about twice as far as the English ones. Why no new tokens: an English-first tokenizer spends six tokens per Arabic word. The base spends under one and a half. The speech model borrows Qwen's audio encoder, fine-tuned: about thirteen audio tokens per second of sound. A small new projector feeds them to a decoder shaped exactly like the three point seven billion model. It writes the transcript, names the dialect, and adds vowel marks on request. The most accurate open Arabic speech model? On six test sets, by about a third of a point, in IFM's own run. If the base's vocabulary already covers the language, adapting it is just training. Same tokenizer, same shapes, new weights. Every source is in the full article. I'm Gantry. Bye!

Why read this

Notabletop 60%

Measures Jais 3 against its base from the files: identical tokenizer and shapes, weight drift by size, real Arabic fertility, and what the ASR is made of.

  • Original analysis
  • Runs on a consumer GPU
  • A lasting reference

Training & RLApache-2.0Practitioner model

How this was scored
Is it new?
1 of 3: An incremental tweak
Can I trust it?
2 of 3: Measures key facts from files, code or configs
Can I run it?
2 of 3: Open code or weights with real limits
Will I understand it?
2 of 3: Mechanism from first principles with figures
Can I act on it?
2 of 3: A concrete recipe, numbers or comparison
Will it last?
2 of 3: A reference for a year or more
Does it affect many?
1 of 3: A specialist community
Only here?
2 of 3: A teardown or measurement few others did

Score 63 of 100, ranked 248 of 577 rated articles. Each question is answered 0–3 by hand, and a 3 is rare. How articles are scored

Six weeks ago IFM shipped K2 Horizon: six open models from 0.9B to 375B, with the data, the training code and every intermediate checkpoint public. On 16 October it announced the first thing built on top of them. The announcement is three sentences:

Jais 3 is built on K2 Horizon, our six-fleet fully open model family. Stronger in Arabic at every size, without starting from scratch. Plus Jais Speech, the most accurate open Arabic ASR.

"Without starting from scratch" is the engineering claim, and it has a known hard part. A base model's tokenizer decides how many tokens a sentence costs. If that tokenizer was built mostly from English, Arabic text comes out in fragments, and every fragment is context you cannot use and compute you pay for. The usual fix is to extend the vocabulary with new Arabic tokens, which means new embedding rows nobody trained. A reply under IFM's post asked exactly this, and nobody answered it.

So I answered it from the files. Everything below is labelled: measured (I computed it from a file or a local run), reported (IFM's figure, not re-run) or reasoned (my arithmetic on the other two). No language model was run; I had a shared 4-core CPU VM and no GPU. The tokenizers were run.

The release, mapped

Jais 3 lives under the inception42 organisation; the quantised builds and Jais Speech are under IFM. Each Jais 3 model is the same-named K2 Horizon model, continued: K2-Horizon-7B became Jais-3-7B, and so on down the list.

inception42/Jais-3-7B@11dcac6 · snapshot 2026-10-16
parameters
9.00B
repo size
157.94 GB
architecture
K2HorizonForCausalLM
task
text-generation
library
transformers
license
apache-2.0
safetensors
4 shards
largest file
5.34 GB
files
15
downloads
446
likes
4
languages
ar, en
parameters by dtype
BF169.00B
jais-37Bdensereasoning

repo last modified 2026-10-16

The first thing I checked is what a "7B" is. The safetensors headers of Jais-3-7B sum to 8,999,178,240 parameters (measured). The gap is the vocabulary: two matrices of 250,624 rows by 4,096 columns, the input embedding and the output head, hold 2,053,111,808 of them, and the rest is 6,946,066,432 (reasoned). The same subtraction gives 3.78B for the 3.7B and 881M for the 0.9B, so the names count the transformer, not the vocabulary (reasoned). That matters later, because the vocabulary is where language adaptation usually happens.

Why adapting a language usually starts with the tokenizer

A byte-level BPE tokenizer learns merges from a corpus. Frequent byte sequences become single tokens; rare ones stay split. Train it on English and " destination" is one token, while an Arabic word is a pile of byte pairs. The number of tokens a tokenizer spends per word is its fertility, and it sets three things at once: how much text fits in the context window, how many forward passes it takes to generate a sentence, and what an API bills per sentence.

The previous generation of Jais faced this head-on. The 2024 jais-adapted models were Llama 2 continued into Arabic, and their card describes the surgery (reported): 32,000 Arabic tokens from the Jais-30b vocabulary were added to the Llama 2 tokenizer; the new embedding rows were initialised by learning a linear map from Jais-30b's embedding space to Llama's on the tokens the two vocabularies shared; and because the new rows came in with "higher norms", the first training stage froze the whole backbone and trained only the embeddings on about 15 billion bilingual tokens. The card credits the new tokens with improving "fertility and compute efficiency by over 3x". That is what adaptation costs when the base was not built for the language.

Jais 3 did not extend the tokenizer

At every one of the six sizes, tokenizer.json in the Jais 3 repository has the same SHA-256 as the K2 Horizon base it came from (measured, from the Hub's LFS hashes). vocab_size is unchanged in every config.json: 64,256 for the 0.9B and 250,624 for the other five. The 32B, 36B and 375B ship a 29 MB tokenizer.json and the 3.7B and 7B a 20 MB one, but loaded, the two have identical vocabularies, merges, added tokens and pre-tokenizer (measured); the difference is whitespace in the JSON.

It did not need to. Of the 250,624 entries in the K2 Horizon vocabulary, 49,568 decode to Arabic script (measured), about one in five. GPT-2 has 22. The pre-tokenizer regex also keeps Unicode combining marks attached to the letters they modify, so a written vowel does not break a word in two at the split stage. Somebody at IFM built the base with Arabic already in mind.

To see what that buys, I ran four tokenizers over Belebele, which is the FLORES passages professionally translated into many languages: 488 unique passages, the same text in English, Modern Standard Arabic, Egyptian Arabic and Moroccan Arabic. Pick a sentence and a tokenizer below.

Over the whole corpus (measured):

tokenizervocabEnglish tok/wordMSA tok/wordEgyptianMoroccanMSA tokens ÷ English tokens
GPT-250,2571.236.025.835.904.39×
Qwen3151,6691.262.292.312.441.63×
K2 Horizon / Jais 3, 0.9B64,2561.311.691.711.891.16×
K2 Horizon / Jais 3, 3.7B and up250,6241.211.411.421.571.05×

The last column is the one to read: the same 488 passages cost 48,675 tokens in Arabic and 46,409 in English with the Jais 3 tokenizer, and 207,591 against 47,265 with GPT-2's (measured). At 512K context, 1.41 tokens per word is room for about 371,000 words of Arabic; at GPT-2's fertility it would be about 87,000 (reasoned). The 0.9B pays for its smaller vocabulary, 1.69 tokens per word, and Moroccan, the dialect furthest from MSA in this set, costs about 11% more per word than MSA under the large vocabulary (reasoned).

Two places it is still expensive. Fully voweled text: my five-word test sentence with every haraka written costs 21 tokens even in the large vocabulary, because vowel marks rarely appear in the web text BPE merges are learned from (measured). That matters for Jais Speech, which can emit vowel marks on request. And the comparison is between tokenizers, not models; a low fertility says the context and the bill are fair, not that the model understands what it reads.

What did change: the weights, and only the weights

If the tokenizer is untouched, "adaptation" is continued training of the existing network. The repositories say exactly that.

K2 Horizon → Jais 3 · read from the repositories, size by size
sizeparamstensorsvocabtokenizerconfig changeweight drift
0.9B1.08B255
same names, shapes
64,256
128K context
identical sha256dtype field only
0.405 median
3.7B5.06B327
same names, shapes
250,624
512K context
identical sha256serialisation defaults
0.185 median
7B9.00B327
same names, shapes
250,624
512K context
identical sha256serialisation defaults
0.158 median
32B34.78B579
same names, shapes
250,624
512K context
identical sha256initializer_range
0.077 median
MoVA-36B-A4B37.44B16,998
same names, shapes
250,624
512K context
identical sha256router_aux_loss_coefnot sampled
375B-A23B379.17B34,076
same names, shapes
250,624
512K context
identical sha256both of the abovenot sampled
Weight drift is the median relative change of the attention and MLP projections, sampled. Unrelated matrices of equal norm would read about 1.41; a light fine-tune, well under 0.01. The architecture file, the tokenizer and every tensor shape are unchanged; only the values moved, and the smaller the model, the further.

Every Jais 3 checkpoint has the same tensor names and the same shapes as its base: 255 tensors in the 0.9B, 327 in the 3.7B and 7B, 579 in the 32B, 16,998 in the 36B and 34,076 in the 375B (measured, from the safetensors headers). The config.json diffs are cosmetic: a dtype field on the 0.9B, serialisation defaults on the 3.7B and 7B, an initializer_range of 0.01 becoming 0.02 on the 32B and 375B, and router_aux_loss_coef going from 0.0001 to 0.001 on the two MoE models, which is a training-time setting that does nothing at inference (measured). Same architecture, same 512K context (the 0.9B stays at 128K), same modeling_k2_horizon.py byte for byte.

The values are another story. I pulled the first 16,384 values of every attention and MLP projection from both repositories by HTTP range request and compared them (measured, so a sample of each matrix, not the whole matrix). The median relative change, the norm of the difference over the norm of the base, is about 0.40 at 0.9B, 0.19 at 3.7B, 0.16 at 7B and 0.08 at 32B (its first 28 of 64 layers). The smaller the model, the further it moved. Unrelated matrices of equal norm would sit near 1.41 on this measure (reasoned), and a light fine-tune well under 0.01, as two of the stages below show, so this is a heavy continued pre-training that stays clearly descended from its base.

For the 0.9B I could afford to download the full embedding and output-head matrices from both sides, 197 MB each, and split the rows by what the token decodes to (measured):

So the training spent most of its effort where you would hope: on the rows that predict Arabic. Those rows existed in K2 Horizon, but a base that saw mostly English and code had little reason to make them good.

Where the continued training started

Jais 3 publishes its stage checkpoints as branches on each repository: CPT, Cooldown, SFT, FTPO and main. K2 Horizon publishes its own as tags. Comparing them on the 0.9B (measured, same sampling):

fromtomedian relative change
K2 pretrain_600000Jais CPT0.571
K2 mid_1_75000Jais CPT0.405
K2 mid_2_47684Jais CPT0.398
K2 mid_2_47684K2 main (its RL stages)0.0017
Jais CPTJais Cooldown0.032
Jais CooldownJais SFT0.199
Jais SFTJais FTPO0.0006

The Jais run is nearest the end of K2 Horizon's mid-training, not its pre-training (measured). Whether it started from mid_2_47684 or from the released main I cannot tell, because K2's own RL stages moved the 0.9B by less than 0.2%. The rest of the shape is the recipe: one large continued pre-training step, a small cool-down, a supervised fine-tune that moves a fifth of the norm again, and an anti-repetition preference stage (FTPO, the same one the K2 Horizon cards describe) that barely registers.

IFM's blog gives the budget, but it was behind a bot wall from my sandbox, so these come from AlphaSignal's summary of it (reported, second-hand): 201.45B tokens of continued pre-training, 151.09B of them Arabic and 50.36B replayed from K2 Horizon's own mid-training data; mixes of 90/10, 75/25 and 50/50 tested, 75/25 chosen; a 3.47B-token cool-down; and 41.1B tokens of supervised fine-tuning. A quarter of every batch being the base's old data is the standard defence against forgetting. If that budget applies at 0.9B, it is about 3.6% of the 5.59T tokens K2 Horizon-0.9B was trained on before it (reasoned, from the 0.9B card's 5T + 393B + 200B).

"Stronger in Arabic at every size"

The claim compares Jais 3 with K2 Horizon. The only base-against-Jais number I could find in public is the launch release's: at 7B, IFM's Arabic average "rises from 56.4 for the K2 Horizon base model to 79.6 for Jais 3" (reported). Per-size tables reportedly sit in the blog's appendix, which I could not load, so the "every size" half is unverified here. It is not a bold claim, though. A base trained mostly on English and code, given 151B Arabic tokens, would be surprising if it did not improve at every size.

The stronger reading, which the coverage mostly runs with, is that Jais 3 is the best open Arabic model at every size. The model cards answer that one, because each compares its Jais 3 model with open peers of a similar size. I counted the leaf Arabic rows (dropping the AraGen sub-scores and the rows that are means of other rows) and averaged them, unweighted, over the rows every model has (reasoned, from reported scores):

sizeJais 3 leads (rows)Jais 3 meanbest peer mean
0.9B24 of 2667.050.1, Qwen3.5-2B
3.7B25 of 2677.964.9, Qwen3.5-4B
7B14 of 2880.178.2, Gemma-4-12B-it
32B7 of 2884.084.2, Gemma-4-31B-it
MoVA-36B-A4B5 of 2883.684.2, Gemma-4-31B-it
375B-A23B12 of 2884.683.0, Qwen3.5-397B-A17B

The small models win outright. At 7B it is a fair fight that Jais 3 wins against a 12B. At 32B and 36B, by IFM's own numbers, Gemma 4 31B is level or slightly ahead, and leads 21 of 28 rows against the 32B. Jais 3 leads at every size on only two rows, IFM's own unreleased Arabic IFBench and the QIAS-1 Islamic-knowledge set; it usually, not always, leads on dialect identification and on the non-hallucination half of Arabic SimpleQA, where it abstains instead of guessing. Starred benchmarks were run on sets IFM audited and cleaned itself, and it publishes the excluded items, which is more than most labs do.

Eight bar-chart panels for Jais-3-7B. Arabic panels: General Knowledge 89.1 against Gemma-4-12B-it 88.8; STEM and Math 93.9 against Gemma-4-12B-it 94.8; Islamic Knowledge and Arab Culture 83.8 against 82.7; Dialects 77.8 against 76.0. Agentic panels: Terminal Bench 2.1 46.4, GDPVal 60.5, SWE-Bench Verified 70.2 and BrowseComp-Plus 67.7, each well ahead of Gemma 4 and Qwen3.5-9B.
Jais-3-7B against its peers. The four Arabic panels are means of the card's rows; the 12B Gemma beats it on STEM, and the agentic margins are large, presumably because the 7B inherits K2 Horizon's agent training (Jais-3-7B model card, benchmark figure).

Is English held?

The Jais 3 cards report no English knowledge or reasoning benchmark at all: no MMLU, no GPQA, no AIME. The only rows I can line up against the K2 Horizon cards are agentic ones, partly English (reported, across two cards that may not share a harness):

sizebenchmarkK2 HorizonJais 3
7BTerminal-Bench 2.139.146.4
7BSWE-bench Verified70.670.2
32BTerminal-Bench 2.162.663.7
36BTerminal-Bench 2.158.667.3
375BTerminal-Bench 2.170.273.8
375BMCPMark67.768.5
375BWildClawBench50.950.4
375BApex-Agents24.818.6

The K2 Horizon 7B card is not consistent with itself: its main table gives 39.1 and 70.6, and its FTPO table gives 44.6 and 72.4 for the released checkpoint. Either way, agentic skill survived the Arabic training, with one real drop on Apex-Agents at 375B. Whether English knowledge survived is not something these cards let anyone check.

Eight bar-chart panels for Jais-3-375B-A23B against MiniMax M3, Nemotron 3 Ultra, Qwen3.5-397B-A17B and Qwen3.8-Flash-Next. It ties Qwen3.8-Flash-Next on General Knowledge at 92.4 and leads Islamic Knowledge at 89.4, Dialects 82.8 and MCPMark 68.5; it is last on STEM and Math at 93.6 and behind Qwen3.8-Flash-Next on Terminal Bench 2.1 (86.1), GDPVal (76.8) and WildClawBench (59.0).
The flagship. IFM's own chart shows it last on STEM and Math and second or lower on three agentic panels, which is to its credit (Jais-3-375B-A23B model card, benchmark figure).

What "fully open" covers here

K2 Horizon earned the phrase: its cards link the pre-training data (IFM/TxT360-v2), the training code (ifm-ai/xllm) and dozens of intermediate checkpoints. Jais 3 is open in a narrower sense (measured, from the cards and the repositories on 16 October):

One packaging oddity: Jais-3-MoVA-36B-A4B on main is stored in FP32, 150 GB in three shards, while its config says bfloat16 and its base is 75 GB (measured). It loads the same; it downloads twice the bytes.

Jais Speech: an audio encoder bolted onto Jais 3.7B

The ASR model is IFM/Jais-ASR, and its modeling file names its parts in its own docstring: "explicitly attributed Qwen3-Omni and K2-Horizon components".

IFM/Jais-ASR@1323995 · snapshot 2026-10-16
parameters
5.72B
repo size
11.46 GB
architecture
JaisASRForConditionalGeneration
task
automatic-speech-recognition
library
transformers
license
apache-2.0
safetensors
3 shards
largest file
4.99 GB
files
29
downloads
323
likes
7
languages
ar, arb, arz, apd, ary, arq
parameters by dtype
BF165.72B
jaisifmarabicarabic-dialectsspeech-to-textcode-switchingdiacritizationlanguage-identification

repo last modified 2026-10-13

From the config and headers (measured):

Sampled the same way as above, the ASR decoder sits closer to Jais-3-3.7B (median relative change 0.22) than to K2-Horizon-3.7B (0.26), which fits it being trained from the Arabic model rather than the base (measured). The audio tower sits at a median 0.09 from the one inside Qwen3-Omni-30B-A3B-Instruct, so it is Qwen's encoder, fine-tuned, not one trained from scratch (measured). The whole model is 5.72B parameters and 11.4 GB in bf16, so I did not run it: it is over the 2 GB this sandbox allows.

The claim is "the most accurate open Arabic ASR". The card's evidence is the Open Universal Arabic ASR Leaderboard's six test sets (reported):

Horizontal bar chart of macro-average word and character error rates over six test sets. Jais-ASR 22.85 WER and 8.37 CER; Audar-ASR-V1-Turbo 23.17 and 9.23; Speechmatics Melia 1 23.51 and 10.62; ElevenLabs Scribe v2 24.54 and 9.96; cohere-transcribe-arabic-07-2026 25.87 and 11.80; omniASR-LLM-7B 28.32 and 12.52; Qwen3-Omni-30B-A3B 30.71 and 13.67; Qwen3-ASR-1.7B 33.36 and 12.33; Voxtral-Small-24B 34.47 and 15.29.
Macro-average WER and CER over SADA, Common Voice 18, MASC clean, MASC noisy, MGB-2 and Casablanca. Jais-ASR was scored by IFM with the leaderboard's script; the two commercial APIs were also measured by IFM (Jais-ASR model card, benchmark figure).

I checked the open baselines against the leaderboard Space's own results table, last updated 20 August 2026: Audar-ASR-V1-Turbo 23.17, cohere 25.87, omniASR-LLM-7B 28.32, Qwen3-Omni 30.71, Qwen3-ASR-1.7B 33.36 and Voxtral-Small 34.47 all match (measured). Audar-ASR-V1-Turbo has public weights on the Hub, so it is a fair open comparator, and it is the one that matters: the margin over it is 0.32 WER points on the average (reasoned). Per test set, Jais-ASR is best of the nine on three (MASC clean 16.12, MASC noisy 25.44, MGB-2 9.59), and loses Saudi broadcast SADA to Audar (28.92 against 30.85), Common Voice to Speechmatics (5.19), cohere (5.82) and Audar (8.09) against its 8.56, and the Casablanca dialect set to Speechmatics by 0.15 points (reported). On character error rate its lead is wider, 8.37 against Audar's 9.23.

Three things the card does not settle. Jais-ASR is not on the leaderboard; the number is IFM's run of the leaderboard's script. The leaderboard asks entrants not to train on the training splits of its test sets, and Jais-ASR's training data is not described, so I cannot say whether it did; MGB-2 at 9.59 against the next-best 10.30 is where I would look first. And "19 Arab countries" is the dialect coverage claim, while the six test sets cover Saudi broadcast, eight dialects in Casablanca, and mostly MSA elsewhere.

The take

Jais 3 is a clean demonstration of the cheapest kind of language adaptation: if the base's vocabulary already covers the language, adapting it is just training. No new tokens, no embedding surgery, no frozen-backbone warm-up, no change to a single tensor shape; 151B Arabic tokens mixed three to one with the base's own data, and every downstream tool that ran K2 Horizon runs Jais 3 unmodified. The 2024 jais-adapted models needed 32,000 new tokens to get Llama 2 to the same place. The reason Jais 3 did not is a decision IFM made months earlier, when it gave K2 Horizon a vocabulary that is one-fifth Arabic.

The claims are mostly fine and slightly loose. "Stronger in Arabic at every size" than the base is surely true and only shown at 7B. "Best at every size" is what readers hear, and IFM's own tables show Gemma 4 31B level with the 32B and 36B. "Most accurate open Arabic ASR" holds by a third of a point on IFM's own run. And "fully open" describes the family Jais 3 is built on more than Jais 3 itself, until the data and the code arrive.

Related: K2 Horizon MoVA for the base and its value-expert attention, Uno for the lossless speed-up adapters shipped alongside every Jais 3 size, Tokenizers v1 and Combinatorial BPE for how BPE merges are learned, and Qwen-Audio-3.1 for the Qwen audio family whose encoder Jais Speech borrows.

What would change my mind

4 claims above, and what would falsify each

  1. Jais 3 did not extend or change K2 Horizon's tokenizer at any size.

    Compared by the SHA-256 of tokenizer.json on the Hub for all six pairs, and by loading the 250K and 64K files. If IFM ships a revised tokenizer on a later commit, or a model loads a different tokenizer through tokenizer_config.json, this is wrong for that revision.

  2. The 250K K2 Horizon vocabulary spends 1.41 tokens per word on Modern Standard Arabic and 1.21 on English, on the same Belebele passages.

    Load tokenizer.json from any Jais 3 or K2 Horizon repository above 0.9B with tokenizers, encode Belebele's 488 unique flores_passage values for arb_Arab and eng_Latn without special tokens, and divide by whitespace-split words. A different corpus will give different numbers; the ratio between tokenizers is the robust part.

  3. Jais 3's continued pre-training started near the end of K2 Horizon's mid-training, not from its pre-training checkpoint.

    Measured only at 0.9B, and only on the first 16,384 values of each projection. A full-matrix comparison, or the same comparison at 7B with the .bin CPT branch converted, could move the numbers; if the technical report names a different starting checkpoint, the report wins.

  4. By the cards' own tables, Gemma-4-31B-it is level with or ahead of Jais-3-32B and Jais-3-MoVA-36B-A4B on Arabic.

    An unweighted mean of leaf rows. IFM's blog uses its own average and category weights, which may reverse a 0.2-point gap; if its per-size appendix shows Jais 3 ahead under a stated weighting, that is a fair reading too, just a different one.


Measured: tokenizer hashes, configs and safetensors headers for all twelve base and Jais 3 repositories and for IFM/Jais-ASR, read on 2026-10-16; weight deltas from HTTP range requests (the first 16,384 values of each projection, plus the full embedding and output head of the 0.9B); fertility from tokenizers 0.23.3 on a shared 4-core CPU VM over Belebele (CC-BY-SA 4.0), with GPT-2 and Qwen3-8B as references; the ASR baselines against the leaderboard Space's table. Reported: every benchmark score, from the Jais 3, K2 Horizon and Jais-ASR model cards; the 7B base-against-Jais average from the launch press release; the training-token budget from AlphaSignal's summary of IFM's blog, which returned HTTP 403 to every client I had, as did the Jais Speech post. No language or speech model was run. The figures are IFM's; the fertility comparator and the adaptation ledger are mine.

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "Jais 3: adapting K2 Horizon to Arabic without touching the tokenizer", ai.thesatyajit.com, October 2026.

bibtex
@misc{ghana2026jais3,
  author = {Satyajit Ghana},
  title  = {Jais 3: adapting K2 Horizon to Arabic without touching the tokenizer},
  url    = {https://ai.thesatyajit.com/articles/jais-3},
  year   = {2026}
}
share