Views
No views yet

transformers1import torch
2from transformers import AutoTokenizer, AutoModelForCausalLM
3
4# load the NorMistral tokenizer and model
5tokenizer = AutoTokenizer.from_pretrained("norallm/normistral-11b-thinking")
6model = AutoModelForCausalLM.from_pretrained(
7 "norallm/normistral-11b-thinking",
8 device_map='auto',
9 torch_dtype=torch.bfloat16
10)
11
12# create a conversation and convert it to token indices using the NorMistral chat template
13messages = [
14 {"role": "user", "content": "Hva er hovedstaden i Norge?"},
15 {"role": "assistant", "content": "Hovedstaden i Norge er Oslo. Denne byen ligger i den sørøstlige delen av landet, ved Oslofjorden. Oslo er en av de raskest voksende byene i Europa, og den er kjent for sin rike historie, kultur og moderne arkitektur. Noen populære turistattraksjoner i Oslo inkluderer Vigelandsparken, som viser mer enn 200 skulpturer laget av den berømte norske skulptøren Gustav Vigeland, og det kongelige slott, som er den offisielle residensen til Norges kongefamilie. Oslo er også hjemsted for mange museer, gallerier og teatre, samt mange restauranter og barer som tilbyr et bredt utvalg av kulinariske og kulturelle opplevelser."},
16 {"role": "user", "content": "Gi meg en liste over de beste stedene å besøke i hovedstaden"}
17]
18input_tokens = tokenizer.apply_chat_template(messages, return_tensors="pt").to(model.device)
19
20# run the generation (customizable via the various parameters)
21output_tokens = model.generate(
22 input_tokens,
23 max_new_tokens=2048, # limit max number of generated tokens
24 top_k=64, # top-k sampling
25 top_p=0.9, # nucleus sampling
26 temperature=0.3, # a low temparature to make the outputs less chaotic
27 repetition_penalty=1.0, # turn the repetition penalty off, having it on can lead to very bad outputs
28 do_sample=True, # randomly sample the outputs
29 use_cache=True # speed-up generation by using kv cache
30)
31
32# decode the generated tokens back to text
33output_str = tokenizer.decode(output_tokens[0, input_tokens.size(1):]).strip()
34
35# separate the reasoning trace that's enclosed in the special <think> ... </think> tokens
36# it should say something like "Brukeren ber: "Gi meg en liste over de beste stedene å besøke i hovedstaden"\n\nDette er en klar forespørsel om informasjon..."
37reasoning_trace = output_str.split("</think>")[0].lstrip("<think>").strip()
38
39# separate the actual response that follows after the </think> token
40# it should say something like "De beste stedene å besøke i hovedstaden Oslo:\n\n**1. Vigelandsparken**\n– En av verdens største skulpturparker med over 200 skulpturer av Gustav Vigeland. Populært..."
41response = output_str.split("</think>")[-1].rstrip("</s>").strip()1from vllm import LLM, SamplingParams
2
3# load the NorMistral model
4llm = LLM(
5 model="norallm/normistral-11b-thinking",
6 dtype="bfloat16"
7)
8
9# create a conversation
10messages = [
11 {"role": "user", "content": "Hva er hovedstaden i Norge?"},
12 {"role": "assistant", "content": "Hovedstaden i Norge er Oslo. Denne byen ligger i den sørøstlige delen av landet, ved Oslofjorden. Oslo er en av de raskest voksende byene i Europa, og den er kjent for sin rike historie, kultur og moderne arkitektur. Noen populære turistattraksjoner i Oslo inkluderer Vigelandsparken, som viser mer enn 200 skulpturer laget av den berømte norske skulptøren Gustav Vigeland, og det kongelige slott, som er den offisielle residensen til Norges kongefamilie. Oslo er også hjemsted for mange museer, gallerier og teatre, samt mange restauranter og barer som tilbyr et bredt utvalg av kulinariske og kulturelle opplevelser."},
13 {"role": "user", "content": "Gi meg en liste over de beste stedene å besøke i hovedstaden"}
14]
15
16# set up sampling parameters (equivalent to the generate() parameters)
17sampling_params = SamplingParams(
18 max_tokens=2048, # limit max number of generated tokens
19 top_k=64, # top-k sampling
20 top_p=0.9, # nucleus sampling
21 temperature=0.3, # a low temperature to make the outputs less chaotic
22 repetition_penalty=1.0, # turn the repetition penalty off
23)
24
25# run the generation using the chat interface (applies chat template automatically)
26outputs = llm.chat(messages, sampling_params=sampling_params)
27
28# get the generated text
29output_str = outputs[0].outputs[0].text.strip()
30
31# separate the reasoning trace that's enclosed in the special <think> ... </think> tokens
32reasoning_trace = output_str.split("</think>")[0].lstrip("<think>").strip()
33
34# separate the actual response that follows after the </think> token
35response = output_str.split("</think>")[-1].rstrip("</s>").strip()ollama / llama.cppollama. The simplest option is to use the model directly uploaded to https://ollama.com/LTG/normistral-11b-thinking:latest.
That's a GGUF checkpoint with F16 weights, same as the one running at our inference endpoint.
More options are available at norallm/normistral-11b-thinking-gguf. Specifically checkpoints converted to these floating-point formats:.modelfile, which contains the official chat template converted to Go (as used by llama.cpp and ollama).Settings -> Account -> API keys -> API Key.1import requests
2
3BASE_URL = "https://chat.llm.sigma2.no:443"
4API_KEY = "your-api-key-here" # <-- Replace with your actual API key
5MODEL = "NorMistral-11b-thinking:latest"
6
7# send a POST request
8response = requests.post(
9 f"{BASE_URL}/api/chat/completions",
10 headers={
11 "Authorization": f"Bearer {API_KEY}",
12 "Content-Type": "application/json",
13 },
14 json={
15 "model": MODEL,
16 "messages": [
17 {"role": "user", "content": "Hva er hovedstaden i Norge?"}
18 ],
19 },
20)
21
22# gather the response
23response.raise_for_status()
24result = response.json()
25output_str = result["choices"][0]["message"]["content"].strip()
26
27# separate the reasoning trace that's enclosed in the special <think> ... </think> tokens
28# it should say something like "Brukeren spør: "Hva er hovedstaden i Norge?"\n\nDette er et faktaspørsmål om"
29reasoning_trace = output_str.split("</think>")[0].lstrip("<think>").strip()
30
31# separate the actual response that follows after the </think> token
32# it should say something like "Oslo er hovedstaden i Norge."
33response = output_str.split("</think>")[-1].rstrip("</s>").strip()Llama-3.1-8B evaluated using LLM-as-a-judge setup with Llama-3.3-70B (see NorEval for more information). * denotes "thinking" models.| Model | NoReC_binary | NoReC_ternary | NorIdiom_NB | NorIdiom_NN | NorCSQA_NB | NorCSQA_NN |
|---|---|---|---|---|---|---|
| NorMistral-11B* | 86.3 | 65.2 | 55.7 | 27.7 | 70.7 | 64.2 |
| Llama-3.1-8B | 79.8 | 52.9 | 12.7 | 6.7 | 64.0 | 57.9 |
| Mistral-Nemo-12B | 67.9 | 49.1 | 12.9 | 8.5 | 61.6 | 49.5 |
| Qwen3-15B* | 83.5 | 69.6 | 22.1 | 13.2 | 83.8 | 71.6 |
| Gemma3-12B | 85.2 | 67.1 | 43.7 | 23.7 | 81.9 | 80.0 |
| OLMo3-7B* | 72.0 | 63.3 | 5.0 | 2.2 | 50.8 | 17.9 |
| OLMo2-13B | 32.8 | 13.2 | 3.5 | 2.2 | 48.0 | 45.3 |
| Apertus-8B | 78.4 | 58.8 | 34.3 | 15.7 | 69.2 | 63.2 |
| Model | NorOBQA_NB | NorOBQA_NN | NRK_NB | NRK_NN | NorRewrite | NorSummarize |
|---|---|---|---|---|---|---|
| NorMistral-11B* | 83.0 | 84.4 | 58.8 | 62.3 | 51.9 | 54.3 |
| Llama-3.1-8B | 78.5 | 71.1 | 49.8 | 46.2 | 50.0 | 50.0 |
| Mistral-Nemo-12B | 75.3 | 67.8 | 47.3 | 45.0 | 42.5 | 39.2 |
| Qwen3-15B* | 94.4 | 88.9 | 63.3 | 55.9 | 77.6 | 83.1 |
| Gemma3-12B | 91.5 | 88.9 | 59.8 | 58.4 | 86.8 | 77.8. |
| OLMo3-7B* | 70.5 | 54.4 | 43.3 | 35.9 | 7.8 | 14.2 |
| OLMo2-13B | 55.3 | 56.7 | 45.3 | 39.4 | 48.3 | 53.7 |
| Apertus-8B | 76.1 | 74.4 | 50.2 | 48.3 | 39.6 | 42.1 |
1@misc{samuel2025fluentalignmentdisfluentjudges,
2 title={Fluent Alignment with Disfluent Judges: Post-training for Lower-resource Languages},
3 author={David Samuel and Lilja Øvrelid and Erik Velldal and Andrey Kutuzov},
4 year={2025},
5 eprint={2512.08777},
6 archivePrefix={arXiv},
7 primaryClass={cs.CL},
8 url={https://arxiv.org/abs/2512.08777},
9}1@inproceedings{samuel-etal-2025-small,
2 title = "Small Languages, Big Models: {A} Study of Continual Training on Languages of {Norway}",
3 author = "Samuel, David and
4 Mikhailov, Vladislav and
5 Velldal, Erik and
6 {\O}vrelid, Lilja and
7 Charpentier, Lucas Georges Gabriel and
8 Kutuzov, Andrey and
9 Oepen, Stephan",
10 editor = "Johansson, Richard and
11 Stymne, Sara",
12 booktitle = "Proceedings of the Joint 25th Nordic Conference on Computational Linguistics and 11th Baltic Conference on Human Language Technologies (NoDaLiDa/Baltic-HLT 2025)",
13 month = mar,
14 year = "2025",
15 address = "Tallinn, Estonia",
16 publisher = "University of Tartu Library",
17 url = "https://aclanthology.org/2025.nodalida-1.61/",
18 pages = "573--608",
19 ISBN = "978-9908-53-109-0",
20}