Instructions to use ZelligeAI/Tessera-27B-B-CJK-RL with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ZelligeAI/Tessera-27B-B-CJK-RL with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="ZelligeAI/Tessera-27B-B-CJK-RL") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("ZelligeAI/Tessera-27B-B-CJK-RL") model = AutoModelForMultimodalLM.from_pretrained("ZelligeAI/Tessera-27B-B-CJK-RL", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.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=256) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use ZelligeAI/Tessera-27B-B-CJK-RL with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "ZelligeAI/Tessera-27B-B-CJK-RL" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ZelligeAI/Tessera-27B-B-CJK-RL", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/ZelligeAI/Tessera-27B-B-CJK-RL
- SGLang
How to use ZelligeAI/Tessera-27B-B-CJK-RL 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 "ZelligeAI/Tessera-27B-B-CJK-RL" \ --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": "ZelligeAI/Tessera-27B-B-CJK-RL", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'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 "ZelligeAI/Tessera-27B-B-CJK-RL" \ --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": "ZelligeAI/Tessera-27B-B-CJK-RL", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use ZelligeAI/Tessera-27B-B-CJK-RL with Docker Model Runner:
docker model run hf.co/ZelligeAI/Tessera-27B-B-CJK-RL
Tessera-27B-B-CJK-RL
Tessera-27B-B-CJK-RL is a coding-agent model built on Qwen3.8-27B. It thinks in compressed CJK, a shorthand that mixes English, Chinese words and symbols, and it thinks less per agent turn than the base model. Answers and tool calls are normally in plain English and code.
It is Tessera-27B-B-CJK trained further with eight updates of reinforcement learning on math and code. Compared with Tessera-27B-B-CJK, it solves more new competition math and keeps most of the per-turn saving in agent work.
This is a beta release, a rank-32 LoRA merged into the base model's bf16 weights.
This repo holds the merged bf16 weights, 55.6 GB.
Repos
| Repo | Contents |
|---|---|
| Tessera-27B-B-CJK-RL | Merged bf16 weights, 55.6 GB |
| Tessera-27B-B-CJK-RL-LoRA | The PEFT adapter, 1.09 GB |
| Tessera-27B-B-CJK-RL-GGUF | BF16 GGUF and five Unsloth-layout replica quants, not evaluated |
| Tessera-27B-B-CJK-RL-NVFP4 | NVFP4 and FP8 checkpoint, 23.4 GB, not evaluated |
What changed from Tessera-27B-B-CJK
Both models were sampled on the same day with the same seeds, in bf16 at reasoning_effort="xhigh", temperature 1.0, top-p 0.95 and top-k 20. Intervals are 90%.
| Tessera-27B-B-CJK-RL | Tessera-27B-B-CJK | |
|---|---|---|
| AIME and HMMT February 2026, 63 problems, 2 attempts each | 108 of 126 correct | 97 |
| Same problems, attempts cut off at the 64K-token window | 11 | 23 |
| Thinking per agent turn against the base model, typical turn, 64 new states from 16 coding-agent tasks held out from training | 0.67x (CI 0.53-0.85) | 0.60x (CI 0.50-0.73) |
| Valid tool calls on those turns | 256 of 256 | 256 of 256 |
On the competition problems the paired gain is +5.5 problems (CI +1.5 to +9.5), and part of it comes from finishing inside the window more often. On agent turns it thinks 1.11x as much as Tessera-27B-B-CJK on a typical turn (CI 0.98-1.26), so it keeps most of Tessera-27B-B-CJK's saving against the base model. A typical turn is the geometric mean over tasks of the per-state ratio of thinking tokens. The base-model rows use each model's first two samples, and we computed Tessera-27B-B-CJK's ratio after the run. On 118 hard math and code problems that we had used many times before, it got 100 right against 89, as a mean of two attempts.
The release post has the full results and how we chose this checkpoint. The notation, the agent setup and the earlier training carry over from Tessera-27B-B-CJK, and its card and paper describe them.
What a think looks like
Here is one agent turn from a held-out task, verbatim. It is 45 tokens and is followed by a lint command. The base model wrote 158 tokens at the same state.
ๆต่ฏๅฅไปถ๏ผๅบ็บฟๅ(ๆขๆ5ๅคฑ่ดฅไธๅ+11ๆฐ้่ฟ). ๆ ๅๅฝ. Typecheck: ไป
ๆขๆversion.ts้(ๅ predev็ๆ). ็ฐ่ทlintไบๆนๆไปถ.
It says the test suite matches the baseline, with the same 5 existing failures and 11 new passing tests, the type check shows only the existing version.ts errors, and next it runs lint on the changed files.
Intended use
Use it in coding-agent loops with reasoning_effort="xhigh", past thinks dropped from the history, temperature 1.0, top-p 0.95 and top-k 20. The fine-tune adds no safety tuning beyond the base model's.
How to use
We ran the merged weights from a local copy with vLLM 0.31, on pre-tokenized prompts, and loaded them with transformers 5.17. We did not test loading from the Hub or any line marked untested. The chat template takes reasoning_effort as low, medium or xhigh.
# Tested on a local copy with vLLM 0.31 and pre-tokenized prompts. Our check set max_model_len to 65,552.
from vllm import LLM, SamplingParams
llm = LLM(model="ZelligeAI/Tessera-27B-B-CJK-RL", dtype="bfloat16", max_model_len=65536,
limit_mm_per_prompt={"image": 0, "video": 0})
# Untested: chat-template rendering through vLLM. Our math evaluation used a 64K-token window.
params = SamplingParams(temperature=1.0, top_p=0.95, top_k=20, max_tokens=32768)
out = llm.chat([{"role": "user", "content": "..."}], params,
chat_template_kwargs={"reasoning_effort": "xhigh"})
# Loaded on a local copy with transformers 5.17. Generation was not tested.
import torch
from transformers import AutoModelForImageTextToText, AutoTokenizer
tok = AutoTokenizer.from_pretrained("ZelligeAI/Tessera-27B-B-CJK-RL")
model = AutoModelForImageTextToText.from_pretrained("ZelligeAI/Tessera-27B-B-CJK-RL",
dtype=torch.bfloat16, device_map="cuda")
Training and merge
Training starts from the Tessera-27B-B-CJK LoRA (rank 32, alpha 32, on attention, the MLP and lm_head) and adds eight RL updates on Tinker. Each update samples 6 rollouts for each of 11 or 12 math and code problems and takes one Adam step at learning rate 2e-5. A rollout scores 0 unless it is correct and clean, and otherwise 1, moved by up to 0.3 for its length against the base model's. Each rollout's advantage is spread over its thinking tokens, so a long rollout does not weigh more than a short one. The RL post gives the method and the first five updates, and updates 6-8 continued the same run. The base is Qwen/Qwen3.8-27B at revision 1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0, with the stock tokenizer and chat template.
We merged all 401 LoRA pairs into the bf16 weights. On two held-out sequences of 58,624 and 15,370 tokens, the merged weights on vLLM 0.31 differ from the LoRA on Tinker by a mean absolute logprob of 0.025 and 0.012. That is close to the base model's own difference across the two engines, 0.022 and 0.009, and far below the fine-tune's effect, 0.33 and 0.21.
Limitations
- The agent-turn result is one run on 16 tasks. Its interval reaches 1.26x Tessera-27B-B-CJK, so turns up to a quarter longer are not ruled out.
- The 16 tasks are new to this RL run, not to the Tessera line. We measured other states from 15 of them while building Tessera-27B-B-CJK.
- Our agent evidence is per turn: thinking length and tool-call validity on frozen states. We did not measure whether the model finishes coding tasks more or less often.
- AIME and HMMT 2026 may appear in Qwen3.8's pretraining data, and we did not run the base model on them.
- We evaluated the LoRA on Tinker, and the merged weights match it by the check above. We did not evaluate the GGUF or NVFP4 files, image input or the MTP head. The BF16 GGUF, the five GGUF quants and the NVFP4 checkpoint each passed a one-sample check on three text prompts that only looks for broken files.
License and citation
The license is Apache-2.0, the same as the base model's, and each of the four repos includes the LICENSE file.
@misc{zellige2026tessera27bbcjkrl,
title = {Tessera-27B-B-CJK-RL},
author = {Zellige},
year = {2026},
note = {https://huggingface.co/ZelligeAI/Tessera-27B-B-CJK-RL}
}
- Downloads last month
- 9
