# Devstral 2 - Leitfaden zum Ausführen

Devstral 2 sind Mistrals neue Coding- und agentische LLMs für Software-Engineering, verfügbar in [24B](#devstral-small-2-24b) und [123B](#devstral-2-123b) Größen. Das 123B-Modell erreicht SOTA bei SWE-bench, Coding, Tool-Calling und Agenten-Anwendungsfällen. Das 24B-Modell passt in 25 GB RAM/VRAM und 123B passt in 128 GB.

{% hint style="success" %}
**Update vom 13. Dezember 2025**

**Wir haben Probleme mit der Chat-Vorlage von Devstral behoben, und die Ergebnisse sollten deutlich besser sein. Das 24B- und das 123B-Modell wurden aktualisiert. Installiere außerdem die neueste llama.cpp-Version vom 13. Dez. 2025!**
{% endhint %}

Devstral 2 unterstützt Vision-Funktionen, ein 256k-Kontextfenster und verwendet dieselbe Architektur wie [Ministral 3](/docs/de/modelle/tutorials/ministral-3.md). Du kannst jetzt beide Modelle lokal mit Unsloth ausführen und **feinabstimmen** .

Alle Devstral-2-Uploads verwenden unsere Unsloth- [Dynamic 2.0](/docs/de/grundlagen/unsloth-dynamic-2.0-ggufs.md) Methodik und liefern die beste Leistung bei [Aider Polyglot](/docs/de/grundlagen/unsloth-dynamic-2.0-ggufs/unsloth-dynamic-ggufs-on-aider-polyglot.md) - und 5-Shot-MMLU-Benchmarks.

<a href="#devstral-small-2-24b" class="button primary">Devstral-Small-2-24B</a><a href="#devstral-2-123b" class="button primary">Devstral-2-123B</a>

#### **Devstral 2 - Unsloth Dynamic** GGUFs:

| Devstral-Small-2-24B-Instruct-2512                                                                                    | Devstral-2-123B-Instruct-2512                                                                               |
| --------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| [Devstral-Small-2-**24B**-Instruct-2512-GGUF](https://huggingface.co/unsloth/Devstral-Small-2-24B-Instruct-2512-GGUF) | [Devstral-2-**123B**-Instruct-2512-GGUF](https://huggingface.co/unsloth/Devstral-2-123B-Instruct-2512-GGUF) |

## 🖥️ **Devstral 2 ausführen**

Sieh dir unsere Schritt-für-Schritt-Anleitungen zum Ausführen von [Devstral 24B](#devstral-small-2-24b) und des großen [Devstral 123B](#devstral-2-123b) -Modells an. Beide Modelle unterstützen Vision-Unterstützung, aber derzeit **wird Vision nicht unterstützt** in llama.cpp

### :gear: Verwendungsleitfaden

Hier sind die empfohlenen Einstellungen für die Inferenz:

* <mark style="background-color:blue;">**Temperatur \~0,15**</mark>
* Min\_P von 0,01 (optional, aber 0,01 funktioniert gut; der Standardwert von llama.cpp ist 0,1)
* **Verwende `--jinja` um den System-Prompt zu aktivieren.**
* Maximale Kontextlänge = 262.144
* Empfohlener Mindestkontext: 16.384
* Installiere die neueste llama.cpp-Version, da ein [Pull Request vom 13. Dezember 2025](https://github.com/ggml-org/llama.cpp/pull/17945) Probleme behebt.

### :tophat:Devstral-Small-2-24B

Das GGUF von Devstral-Small-2-24B in voller Präzision (Q8) passt in 25 GB RAM/VRAM. Vorerst nur Text.

#### ✨ Devstral-Small-2-24B-Instruct-2512 in llama.cpp ausführen

1. Hole dir die neueste `llama.cpp` auf [GitHub hier](https://github.com/ggml-org/llama.cpp). Du kannst auch den untenstehenden Build-Anweisungen folgen. Ändere `-DGGML_CUDA=ON` zu `-DGGML_CUDA=OFF` wenn du keine GPU hast oder nur CPU-Inferenz möchtest. **Für Apple Mac / Metal-Geräte**, setze `-DGGML_CUDA=OFF` und fahre dann wie gewohnt fort - Metal-Unterstützung ist standardmäßig aktiviert.

{% code overflow="wrap" %}

```bash
apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone https://github.com/ggml-org/llama.cpp
cmake llama.cpp -B llama.cpp/build \
    -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-mtmd-cli llama-server llama-gguf-split
cp llama.cpp/build/bin/llama-* llama.cpp
```

{% endcode %}

2. Wenn du `llama.cpp` direkt zum Laden von Modellen verwenden möchtest, kannst du Folgendes tun: (:`Q4_K_XL`) ist der Quantisierungstyp. Du kannst auch direkt von Hugging Face herunterladen:

```bash
./llama.cpp/llama-cli \
    -hf unsloth/Devstral-Small-2-24B-Instruct-2512-GGUF:UD-Q4_K_XL \
    --jinja -ngl 99 --ctx-size 16384 \
    --temp 0,15
```

3. Lade das Modell herunter über (nach der Installation von `pip install huggingface_hub hf_transfer` ). Du kannst `UD_Q4_K_XL` oder andere quantisierte Versionen auswählen.

```python
# !pip install huggingface_hub hf_transfer
import os
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
from huggingface_hub import snapshot_download
snapshot_download(
    repo_id = "unsloth/Devstral-Small-2-24B-Instruct-2512-GGUF",
    local_dir = "unsloth/Devstral-Small-2-24B-Instruct-2512-GGUF",
    allow_patterns = ["*UD-Q4_K_XL*", "*mmproj-F16*"], # Für Q4_K_XL
)
```

4. Führe das Modell im Konversationsmodus aus:

{% code overflow="wrap" %}

```bash
./llama.cpp/llama-cli \
    --model unsloth/Devstral-Small-2-24B-Instruct-2512-GGUF/Devstral-Small-2-24B-Instruct-2512-UD-Q4_K_XL.gguf \
    --mmproj unsloth/Devstral-Small-2-24B-Instruct-2512-GGUF/mmproj-F16.gguf \
    --ctx-size 16384 \
    --n-gpu-layers 99 \
    --seed 3407 \
    --prio 2 \
    --temp 0,15 \
    --jinja
```

{% endcode %}

#### :eyes:Devstral und Vision

1. Um mit Devstrals Bildfunktionen zu spielen, laden wir zuerst ein Bild wie dieses herunter [FP8 Reinforcement Learning mit Unsloth](https://unsloth.ai/cgi/image/fp8grpolarge_KharloZxEEaHAY2X97CEX.png?width=3840\&quality=80\&format=auto) unten:\
   ![](/files/3844ed2634483f98656d881076c5e921e55ad159)
2. Wir erhalten das Bild über `wget https://unsloth.ai/cgi/image/fp8grpolarge_KharloZxEEaHAY2X97CEX.png?width=3840%26quality=80%26format=auto -O unsloth_fp8.png` wodurch das Bild als "unsloth\_fp8.png" gespeichert wird
3. Dann lade das Bild über `/image unsloth_fp8.png` nachdem das Modell geladen wurde, wie unten zu sehen ist:\
   ![](/files/316788910637aa2bdeeb2b0db6a16ad673ebaba1)
4. Dann fordern wir es auf `Beschreibe dieses Bild` und erhalten Folgendes:<br>

   <figure><img src="/files/dd8eb44c15ebad68a8f80e7060420fc1053efa03" alt=""><figcaption></figcaption></figure>

### :truck:Devstral-2-123B

Das GGUF von Devstral-Small-2-123B in voller Präzision (Q8) passt in 128 GB RAM/VRAM. Vorerst nur Text.

#### :sparkles: Tutorial zum Ausführen von Devstral-2-123B-Instruct-2512

1. Hole dir die neueste `llama.cpp` auf [GitHub hier](https://github.com/ggml-org/llama.cpp). Du kannst auch den untenstehenden Build-Anweisungen folgen. Ändere `-DGGML_CUDA=ON` zu `-DGGML_CUDA=OFF` wenn du keine GPU hast oder nur CPU-Inferenz möchtest.

{% code overflow="wrap" %}

```bash
apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone https://github.com/ggml-org/llama.cpp
cmake llama.cpp -B llama.cpp/build \
    -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-mtmd-cli llama-server llama-gguf-split
cp llama.cpp/build/bin/llama-* llama.cpp
```

{% endcode %}

2. Du kannst direkt von HuggingFace herunterladen über:

```bash
./llama.cpp/llama-cli \
    -hf unsloth/Devstral-2-123B-Instruct-2512-GGUF:UD-Q2_K_XL \
    --jinja -ngl 99 --ctx-size 16384 \
    --temp 0,15
```

2. Lade das Modell herunter über (nach der Installation von `pip install huggingface_hub hf_transfer` ). Du kannst `UD_Q4_K_XL` oder andere quantisierte Versionen auswählen.

```python
# !pip install huggingface_hub hf_transfer
import os
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
from huggingface_hub import snapshot_download
snapshot_download(
    repo_id = "unsloth/Devstral-2-123B-Instruct-2512-GGUF",
    local_dir = "unsloth/Devstral-2-123B-Instruct-2512-GGUF",
    allow_patterns = ["*UD-Q2_K_XL*", "*mmproj-F16*"],
)
```

3. Führe das Modell im Konversationsmodus aus:

{% code overflow="wrap" %}

```bash
./llama.cpp/llama-cli \
    --model unsloth/Devstral-2-123B-Instruct-2512-GGUF/Devstral-2-123B-Instruct-2512-UD-Q2_K_XL.gguf \
    --mmproj unsloth/Devstral-2-123B-Instruct-2512-GGUF/mmproj-F16.gguf \
    --ctx-size 16384 \
    --n-gpu-layers 99 \
    --seed 3407 \
    --prio 2 \
    --temp 0,15 \
    --jinja
```

{% endcode %}

## 🦥 Feinabstimmung von Devstral 2 mit Unsloth

Genau wie [Ministral 3](/docs/de/modelle/tutorials/ministral-3.md)unterstützt Unsloth das Feinabstimmen von Devstral 2. Das Training ist 2x schneller, verwendet 70 % weniger VRAM und unterstützt 8x längere Kontextlängen. Devstral 2 passt bequem in eine 24-GB-VRAM-L4-GPU.

Leider überschreitet Devstral 2 die Speichergrenzen von 16 GB VRAM leicht, sodass ein kostenloses Feinabstimmen auf Google Colab derzeit nicht möglich ist. Du *kannst* das Modell kostenlos feinabstimmen mit unserem [Kaggle-Notebook](https://www.kaggle.com/notebooks/welcome?src=https://github.com/unslothai/notebooks/blob/main/nb/Kaggle-Magistral_\(24B\)-Reasoning-Conversational.ipynb\&accelerator=nvidiaTeslaT4), das Zugriff auf zwei GPUs bietet. Ändere einfach den Magistral-Modellnamen im Notebook auf das Modell `unsloth/Devstral-Small-2-24B-Instruct-2512` .

{% hint style="success" %}
Wir haben kostenlose Unsloth-Notebooks zum Feinabstimmen von Ministral 3 erstellt, und Devstral 2 wird direkt unterstützt, da sie dieselbe Architektur teilen! Ändere den Namen, um das gewünschte Modell zu verwenden.
{% endhint %}

* Ministral-3B-Instruct [Vision-Notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Ministral_3_VL_\(3B\)_Vision.ipynb) (Vision) (Modellnamen auf Devstral 2 ändern)
* Ministral-3B-Instruct [GRPO-Notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Ministral_3_\(3B\)_Reinforcement_Learning_Sudoku_Game.ipynb) (Modellnamen auf Devstral 2 ändern)

{% columns %}
{% column %}
Devstral Vision-Finetuning-Notebook

{% embed url="<https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Ministral_3_VL_(3B)_Vision.ipynb>" %}
{% endcolumn %}

{% column %}
Devstral Sudoku GRPO RL-Notebook

{% embed url="<https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Ministral_3_(3B)_Reinforcement_Learning_Sudoku_Game.ipynb>" %}
{% endcolumn %}
{% endcolumns %}

### :sunglasses:Llama-Server-Bereitstellung und Deployment

Um Devstral 2 produktiv bereitzustellen, verwenden wir `llama-server` In einem neuen Terminal, z. B. via tmux, stelle das Modell bereit mit:

{% code overflow="wrap" %}

```bash
./llama.cpp/llama-server \
    --model unsloth/Devstral-Small-2-24B-Instruct-2512-GGUF/Devstral-Small-2-24B-Instruct-2512-UD-Q4_K_XL.gguf \
    --mmproj unsloth/Devstral-Small-2-24B-Instruct-2512-GGUF/mmproj-F16.gguf \
    --alias "unsloth/Devstral-Small-2-24B-Instruct-2512" \
    --n-gpu-layers 999 \
    --prio 3 \
    --min-p 0,01 \
    --ctx-size 16384 \
    --port 8001 \
    --jinja
```

{% endcode %}

Wenn du das Obige ausführst, erhältst du:

<figure><img src="/files/c6ed82afe23626e6b8a313adc0c866ae53fc0626" alt=""><figcaption></figcaption></figure>

Dann in einem neuen Terminal, nachdem du `pip install openai`ausgeführt hast, mache:

{% code overflow="wrap" %}

```python
from openai import OpenAI
import json
openai_client = OpenAI(
    base_url = "http://127.0.0.1:8001/v1",
    api_key = "sk-no-key-required",
)
completion = openai_client.chat.completions.create(
    model = "unsloth/Devstral-Small-2-24B-Instruct-2512",
    messages = [{"role": "user", "content": "Was ist 2+2?"},],
)
print(completion.choices[0].message.content)
```

{% endcode %}

Was einfach 4 ausgibt.

### :toolbox:Tutorial zum Tool-Calling mit Devstral 2

Nachdem du [#llama-server-serving-and-deployment](#llama-server-serving-and-deployment "mention") folgendes erledigt hast, können wir dann einige Tools laden und Devstral in Aktion sehen! Lass uns ein paar Tools erstellen - kopiere sie, füge sie ein und führe sie in Python aus.

{% code expandable="true" %}

```python
import json, subprocess, random
from typing import Any
def add_number(a: float | str, b: float | str) -> float:
    return float(a) + float(b)
def multiply_number(a: float | str, b: float | str) -> float:
    return float(a) * float(b)
def subtract_number(a: float | str, b: float | str) -> float:
    return float(a) - float(b)
def write_a_story() -> str:
    return random.choice([
        "Vor langer Zeit in einer weit, weit entfernten Galaxie...",
        "Es gab 2 Freunde, die Faultiere und Code liebten...",
        "Die Welt ging unter, weil sich jedes Faultier zu übermenschlicher Intelligenz entwickelte...",
        "Ohne dass ein Freund es wusste, programmierte der andere versehentlich ein Programm, um Faultiere zu entwickeln...",
    ])
def terminal(command: str) -> str:
    if "rm" in command or "sudo" in command or "dd" in command or "chmod" in command:
        msg = "Kann die Befehle 'rm, sudo, dd, chmod' nicht ausführen, da sie gefährlich sind"
        print(msg); return msg
    print(f"Führe Terminalbefehl `{command}` aus")
    try:
        return str(subprocess.run(command, capture_output = True, text = True, shell = True, check = True).stdout)
    except subprocess.CalledProcessError as e:
        return f"Befehl fehlgeschlagen: {e.stderr}"
def python(code: str) -> str:
    data = {}
    exec(code, data)
    del data["__builtins__"]
    return str(data)
MAP_FN = {
    "add_number": add_number,
    "multiply_number": multiply_number,
    "subtract_number": subtract_number,
    "write_a_story": write_a_story,
    "terminal": terminal,
    "python": python,
}
tools = [
    {
        "type": "function",
        "function": {
            "name": "add_number",
            "description": "Add two numbers.",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "string",
                        "description": "Die erste Zahl.",
                    },
                    "b": {
                        "type": "string",
                        "description": "Die zweite Zahl.",
                    },
                },
                "required": ["a", "b"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "multiply_number",
            "description": "Multipliziere zwei Zahlen.",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "string",
                        "description": "Die erste Zahl.",
                    },
                    "b": {
                        "type": "string",
                        "description": "Die zweite Zahl.",
                    },
                },
                "required": ["a", "b"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "subtract_number",
            "description": "Subtrahiere zwei Zahlen.",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "string",
                        "description": "Die erste Zahl.",
                    },
                    "b": {
                        "type": "string",
                        "description": "Die zweite Zahl.",
                    },
                },
                "required": ["a", "b"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "write_a_story",
            "description": "Schreibt eine zufällige Geschichte.",
            "parameters": {
                "type": "object",
                "properties": {},
                "required": [],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "terminal",
            "description": "Führe Operationen im Terminal aus.",
            "parameters": {
                "type": "object",
                "properties": {
                    "command": {
                        "type": "string",
                        "description": "Der Befehl, den du ausführen möchtest, z. B. `ls`, `rm`, ...",
                    },
                },
                "required": ["command"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "python",
            "description": "Rufe einen Python-Interpreter mit etwas Python-Code auf, der ausgeführt wird.",
            "parameters": {
                "type": "object",
                "properties": {
                    "code": {
                        "type": "string",
                        "description": "Der auszuführende Python-Code",
                    },
                },
                "required": ["code"],
            },
        },
    },
]
```

{% endcode %}

Dann stellen wir aus einer zufälligen Liste möglicher Nachrichten eine einfache Frage, um das Modell zu testen:

{% code overflow="wrap" %}

```python
import random
messages = [{
    "role": "user",
    "content": [random.choice([
        {"type": "text", "text": "Könntest du mir bitte eine Geschichte schreiben?"},
        {"type": "text", "text": "Was ist das heutige Datum plus 3 Tage?"},
        {"type": "text", "text": "Gib die aktuelle Zeit in Nanosekunden an."},
        {"type": "text", "text": "Erstelle eine Fibonacci-Funktion in Python und finde fib(20)."},
    ])],
}]
```

{% endcode %}

Dann verwenden wir die untenstehenden Funktionen (kopieren, einfügen und ausführen), die die Funktionsaufrufe automatisch parsen - Devstral 2 kann möglicherweise mehrere parallel machen!

```python
temperature = 0.15
from openai import OpenAI
openai_client = OpenAI(
    base_url = "http://127.0.0.1:8001/v1",
    api_key = "sk-no-key-required",
)
model_name = next(iter(openai_client.models.list())).id
print(f"Verwende Modell = {model_name}")
has_tool_calls = True
original_messages_len = len(messages)
while has_tool_calls:
    print(f"Aktuelle Nachrichten = {messages}")
    response = openai_client.chat.completions.create(
        model = model_name,
        messages = messages,
        temperature = temperature,
        tools = tools if tools else None,
        tool_choice = "auto" if tools else None,
    )
    tool_calls = response.choices[0].message.tool_calls or []
    content = response.choices[0].message.content or ""
    tool_calls_dict = [tc.to_dict() for tc in tool_calls] if tool_calls else tool_calls
    messages.append({"role": "assistant", "tool_calls": tool_calls_dict, "content": content,})
    for tool_call in tool_calls:
        fx, args, _id = tool_call.function.name, tool_call.function.arguments, tool_call.id
        out = MAP_FN[fx](**json.loads(args))
        messages.append({"role": "tool", "tool_call_id": _id, "name": fx, "content": str(out),})
    else:
        has_tool_calls = False
print(json.dumps(messages[original_messages_len:], indent = 2))
```

Und nach 1 Minute erhalten wir:

<figure><img src="/files/15bf68c4332cd881d19f456640d5377a7ee7d360" alt=""><figcaption></figcaption></figure>

Oder in JSON-Form:

```json
[
  {
    "role": "assistant",
    "tool_calls": [
      {
        "id": "JviLK0wUveWguuKQHgZdFdYI2adu85jy",
        "function": {
          "arguments": "{}",
          "name": "write_a_story"
        },
        "type": "function"
      }
    ],
    "content": null
  },
  {
    "role": "tool",
    "tool_call_id": "JviLK0wUveWguuKQHgZdFdYI2adu85jy",
    "name": "write_a_story",
    "content": "Vor langer Zeit in einer weit, weit entfernten Galaxie..."
  },
  {
    "role": "assistant",
    "tool_calls": null,
    "content": "In einer fernen Galaxie, in der die Sterne mit einem außerweltlichen Leuchten brannten, gab es einen Planeten namens Eldoria. Eldoria war eine Welt scharfer Kontraste\u2014lebendige Städte zwischen hohen Bergen und weiten Wüsten, die sich unter zwei Sonnen endlos erstreckten. Die Menschen von Eldoria waren weithin bekannt für ihre Beherrschung der Energie, insbesondere für ihre legendären Lasersäbel.\n\nDiese Säbel waren nicht bloß Waffen; sie waren Verlängerungen der Seelen ihrer Träger, geschmiedet aus seltenen Kristallen, die mit der Essenz des Kosmos pulsierten. Jeder Säbel war einzigartig, seine Farbe und Kraft spiegelten die Persönlichkeit und den Geist seines Besitzers wider. Die geschicktesten Krieger, bekannt als die Säbelgeborenen, konnten ihre Säbel mit solcher Präzision und Anmut führen, dass es schien, als würden sie mit dem Gewebe der Wirklichkeit tanzen.\n\nUnter den Säbelgeborenen gab es einen Krieger namens Kael. Kael war ein Ausgestoßener, ein ehemaliger Wächter der heiligen Säbeltempel, der verbannt worden war, weil er sich den Befehlen des Rates widersetzt hatte. Der Rat hatte versucht, die Macht der Lasersäbel zu horten, um damit die Menschen von Eldoria zu kontrollieren. Kael glaubte, dass die Säbel von denen geführt werden sollten, die schützen wollten, nicht dominieren.\n\nEines Tages erhielt Kael ein Notsignal von einem kleinen Dorf am Rande der Wüste. Das Dorf wurde von einer abtrünnigen Fraktion der Säbelgeborenen angegriffen, angeführt von einem rücksichtslosen Kriegsherrn namens Vexis. Vexis wollte das uralte Relikt des Dorfes an sich bringen\u2014einen Kristall, der angeblich die Kraft jedes Lasersäbels um das Zehnfache verstärken konnte. Wenn Vexis Erfolg hätte, wäre seine Armee unaufhaltsam, und Eldoria würde der Dunkelheit verfallen.\n\nKael wusste, dass er handeln musste. Er schnallte seinen Säbel an\u2014eine tiefblaue Klinge, die mit der Energie des Kosmos summte\u2014und machte sich durch die Wüste auf den Weg. Die Reise war gefährlich, mit Sandstürmen und versteckten Fallen, die von Vexis' Spähern gelegt worden waren. Doch Kael ging weiter, angetrieben von der Erinnerung an die Menschen, die zu schützen er einst geschworen hatte.\n\nAls er das Dorf erreichte, tobte der Kampf bereits in vollem Gange. Vexis' Krieger führten ihre Säbel mit brutaler Effizienz und machten die Verteidiger mühelos nieder. Kael sprang in das Getümmel, sein blauer Säbel ein Lichtblitz, während er einen Feind nach dem anderen entwaffnete und besiegte. Die Dorfbewohner, als sie ihren Retter kommen sahen, sammelten sich hinter ihm, ihre eigenen Säbel blitzten, als sie kämpften, um ihr Zuhause zurückzuerobern.\n\nKael stellte sich Vexis in der Mitte des Dorfplatzes. Der Säbel des Kriegsherrn war ein kränkliches Grün, pulsierend vor dunkler Energie. \"Du bist zu spät, Kael,\" höhnte Vexis. \"Das Relikt gehört mir, und damit werde ich Eldoria beherrschen.\" Kael hielt stand, den Säbel erhoben. \"Über meine Leiche,\" erwiderte er.\n\nDie beiden Krieger prallten aufeinander, ihre Säbel verhakten sich in einem Funkenregen. Kael spürte die rohe Kraft des Relikts, die durch Vexis' Klinge strömte, aber er wich nicht zurück. Er leitete seine eigene Energie, sein Säbel glühte heller, als er Vexis' Angriff zurückdrängte. Mit einem letzten verzweifelten Schlag entwaffnete Kael Vexis und ließ dessen Säbel klirrend zu Boden fallen.\n\nVexis fauchte besiegt, doch Kael tötete ihn nicht. Stattdessen bot er ihm eine Wahl an: \"Schließ dich mir an, um Eldoria zu schützen, oder geh und kehre niemals zurück.\" Vexis, gedemütigt und die Wahrheit in Kaels Worten erkennend, entschied sich, an seiner Seite zu stehen.\n\nDa Vexis' Fraktion nun Verbündete war, eroberten Kael und die Dorfbewohner das Relikt zurück und nutzten seine Macht, um das Gleichgewicht in Eldoria wiederherzustellen. Die Säbeltempel wurden neu gegründet, und die Lasersäbel wurden wieder von denen geführt, die schützen wollten, nicht kontrollieren.\n\nKaels Legende wuchs, und er wurde zu einem Symbol der Hoffnung für die Menschen von Eldoria. Seine Geschichte erinnerte sie daran, dass selbst in den dunkelsten Zeiten das Licht von Mut und Gerechtigkeit triumphieren konnte. Und so lebten die Säbelgeborenen weiter, ihre Lasersäbel ein Leuchtfeuer von Stärke und Einheit in einer Galaxie voller Schatten."
  }
]
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/de/modelle/tutorials/devstral-2.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
