# Devstral 2 - 実行ガイド

Devstral 2 は、ソフトウェアエンジニアリング向けの Mistral の新しいコーディングおよびエージェント型 LLM で、 [24B](#devstral-small-2-24b) および [123B](#devstral-2-123b) サイズで利用できます。123B モデルは SWE-bench、コーディング、ツール呼び出し、エージェント用途で SOTA を達成します。24B モデルは 25GB の RAM/VRAM に収まり、123B は 128GB に収まります。

{% hint style="success" %}
**2025年12月13日 更新**

**Devstral のチャットテンプレートの問題を解決し、結果が大幅に改善されるはずです。24B と 123B は更新済みです。また、2025年12月13日時点の最新の llama.cpp をインストールしてください！**
{% endhint %}

Devstral 2 は、視覚機能、256k のコンテキストウィンドウをサポートし、 [Ministral 3](/docs/jp/moderu/tutorials/ministral-3.md)と同じアーキテクチャを使用しています。これで、 **ファインチューニング** を Unsloth でローカルに実行できるようになりました。

Devstral 2 のすべてのアップロードは、Unsloth の [Dynamic 2.0](/docs/jp/ji-ben/unsloth-dynamic-2.0-ggufs.md) 手法を使用しており、 [Aider Polyglot](/docs/jp/ji-ben/unsloth-dynamic-2.0-ggufs/unsloth-dynamic-ggufs-on-aider-polyglot.md) および 5-shot MMLU ベンチマークで最高の性能を発揮します。

<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** GGUF:

| 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 の実行**

実行手順のステップごとのガイドはこちらです。 [Devstral 24B](#devstral-small-2-24b) および大型の [Devstral 123B](#devstral-2-123b) モデルの実行方法。どちらのモデルも視覚をサポートしていますが、現在は **vision はサポートされていません** llama.cpp では

### :gear: 使用ガイド

推論に推奨される設定は次のとおりです。

* <mark style="background-color:blue;">**Temperature \~0.15**</mark>
* Min\_P を 0.01 に設定（任意ですが、0.01 がよく機能します。llama.cpp のデフォルトは 0.1）
* **使用 `--jinja` を有効にしてシステムプロンプトを使います。**
* 最大コンテキスト長 = 262,144
* 推奨最小コンテキスト: 16,384
* 最新の llama.cpp をインストールしてください。 [2025年12月13日のプルリクエスト](https://github.com/ggml-org/llama.cpp/pull/17945) が問題を修正します。

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

完全精度（Q8）の Devstral-Small-2-24B GGUF は 25GB の RAM/VRAM に収まります。現在はテキストのみです。

#### ✨ llama.cpp で Devstral-Small-2-24B-Instruct-2512 を実行

1. 最新の `llama.cpp` を [GitHub こちら](https://github.com/ggml-org/llama.cpp)から取得してください。以下のビルド手順に従うこともできます。 `-DGGML_CUDA=ON` を `-DGGML_CUDA=OFF` に変更してください。GPU がない場合、または CPU 推論だけを使いたい場合です。 **Apple Mac / Metal デバイスの場合は**、 `-DGGML_CUDA=OFF` そのまま続行してください。Metal サポートはデフォルトで有効です。

{% 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. もし `llama.cpp` を使ってモデルを直接読み込みたい場合は、以下のようにできます: (:`Q4_K_XL`）は量子化タイプです。Hugging Face から直接取得することもできます:

```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. モデルのダウンロード（ `pip install huggingface_hub hf_transfer` のインストール後）。 `UD_Q4_K_XL` または他の量子化版を選べます。

```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*"], # Q4_K_XL 用
)
```

4. 会話モードでモデルを実行:

{% 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 と vision

1. Devstral の画像機能を試すために、まずこのような画像をダウンロードしましょう [Unsloth による FP8 強化学習](https://unsloth.ai/cgi/image/fp8grpolarge_KharloZxEEaHAY2X97CEX.png?width=3840\&quality=80\&format=auto) 以下のものを:\
   ![](/files/b0a5a62cc75b89d9afc8c3fa176cd288e783c59f)
2. 画像は次の方法で取得します `wget https://unsloth.ai/cgi/image/fp8grpolarge_KharloZxEEaHAY2X97CEX.png?width=3840%26quality=80%26format=auto -O unsloth_fp8.png` これにより画像は "unsloth\_fp8.png" として保存されます
3. その後、次の方法で画像を読み込みます `/image unsloth_fp8.png` 以下のようにモデルを読み込んだ後に:\
   ![](/files/8afe9c1851ba1473b5e2a8d148ec7c1982370d81)
4. 次にこれをプロンプトします `この画像を説明してください` すると以下が得られます:<br>

   <figure><img src="/files/772172d1520038d834b28eefb1789ba13f28c6ab" alt=""><figcaption></figcaption></figure>

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

完全精度（Q8）の Devstral-Small-2-123B GGUF は 128GB の RAM/VRAM に収まります。現在はテキストのみです。

#### :sparkles: Devstral-2-123B-Instruct-2512 実行チュートリアル

1. 最新の `llama.cpp` を [GitHub こちら](https://github.com/ggml-org/llama.cpp)から取得してください。以下のビルド手順に従うこともできます。 `-DGGML_CUDA=ON` を `-DGGML_CUDA=OFF` に変更してください。GPU がない場合、または CPU 推論だけを使いたい場合です。

{% 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. HuggingFace から次の方法で直接取得できます:

```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. モデルのダウンロード（ `pip install huggingface_hub hf_transfer` のインストール後）。 `UD_Q4_K_XL` または他の量子化版を選べます。

```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. 会話モードでモデルを実行:

{% 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 %}

## 🦥 Unsloth で Devstral 2 をファインチューニング

ちょうど [Ministral 3](/docs/jp/moderu/tutorials/ministral-3.md)のように、Unsloth は Devstral 2 のファインチューニングをサポートしています。学習は 2 倍高速で、VRAM は 70% 少なく、8 倍長いコンテキスト長をサポートします。Devstral 2 は 24GB VRAM の L4 GPU に無理なく収まります。

残念ながら、Devstral 2 は 16GB VRAM のメモリ制限をわずかに超えるため、現時点では Google Colab で無料でファインチューニングすることはできません。ただし、 *できます* 私たちの [Kaggle ノートブック](https://www.kaggle.com/notebooks/welcome?src=https://github.com/unslothai/notebooks/blob/main/nb/Kaggle-Magistral_\(24B\)-Reasoning-Conversational.ipynb\&accelerator=nvidiaTeslaT4)を使えば無料でモデルをファインチューニングでき、デュアル GPU にアクセスできます。ノートブックの Magistral のモデル名を、 `unsloth/Devstral-Small-2-24B-Instruct-2512` モデル名に変更するだけです。

{% hint style="success" %}
Ministral 3 をファインチューニングするための無料の Unsloth ノートブックを作成しました。Devstral 2 は同じアーキテクチャを共有しているため、直接サポートしています！目的のモデルを使うように名前を変更してください。
{% endhint %}

* Ministral-3B-Instruct [Vision ノートブック](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Ministral_3_VL_\(3B\)_Vision.ipynb) (vision)（モデル名を Devstral 2 に変更）
* Ministral-3B-Instruct [GRPO ノートブック](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Ministral_3_\(3B\)_Reinforcement_Learning_Sudoku_Game.ipynb) （モデル名を Devstral 2 に変更）

{% columns %}
{% column %}
Devstral Vision ファインチューニング ノートブック

{% 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 ノートブック

{% 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 サービング & デプロイ

本番環境で Devstral 2 をデプロイするには、 `llama-server` を使用します。新しいターミナルで、たとえば tmux 経由で、次のようにモデルをデプロイします:

{% 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 %}

上記を実行すると、次のようになります:

<figure><img src="/files/6a1a068c15d3bf101a38942c8ac628404ba41d78" alt=""><figcaption></figcaption></figure>

次に新しいターミナルで、 `pip install openai`を実行した後、次を行います:

{% 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": "What is 2+2?"},],
)
print(completion.choices[0].message.content)
```

{% endcode %}

これにより単純に 4 が出力されます。

### :toolbox:Devstral 2 のツール呼び出しチュートリアル

に従った後、 [#llama-server-serving-and-deployment](#llama-server-serving-and-deployment "mention") ツールをいくつか読み込んで、Devstral の動作を見てみましょう！ツールをいくつか作成しましょう - Python にコピーして貼り付け、実行してください。

{% 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([
        "はるか昔、はるか遠くの銀河で...",
        "スロースとコードを愛する2人の友人がいました...",
        "すべてのスロースが超人的な知能を持つよう進化したため、世界は終わろうとしていた...",
        "ある友人が気づかないうちに、もう一人が誤ってスロースを進化させるプログラムをコードしていた...",
    ])
def terminal(command: str) -> str:
    if "rm" in command or "sudo" in command or "dd" in command or "chmod" in command:
        msg = "'rm, sudo, dd, chmod' コマンドは危険なので実行できません"
        print(msg); return msg
    print(f"Executing terminal command `{command}`")
    try:
        return str(subprocess.run(command, capture_output = True, text = True, shell = True, check = True).stdout)
    except subprocess.CalledProcessError as e:
        return f"Command failed: {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": "2つの数を足します。",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "string",
                        "description": "最初の数。",
                    },
                    "b": {
                        "type": "string",
                        "description": "2番目の数。",
                    },
                },
                "required": ["a", "b"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "multiply_number",
            "description": "2つの数を掛けます。",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "string",
                        "description": "最初の数。",
                    },
                    "b": {
                        "type": "string",
                        "description": "2番目の数。",
                    },
                },
                "required": ["a", "b"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "subtract_number",
            "description": "2つの数を引きます。",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "string",
                        "description": "最初の数。",
                    },
                    "b": {
                        "type": "string",
                        "description": "2番目の数。",
                    },
                },
                "required": ["a", "b"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "write_a_story",
            "description": "ランダムな物語を書きます。",
            "parameters": {
                "type": "object",
                "properties": {},
                "required": [],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "terminal",
            "description": "ターミナルから操作を実行します。",
            "parameters": {
                "type": "object",
                "properties": {
                    "command": {
                        "type": "string",
                        "description": "起動したいコマンド。例: `ls`, `rm`, ...",
                    },
                },
                "required": ["command"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "python",
            "description": "実行される Python コードを使って Python インタープリタを呼び出します。",
            "parameters": {
                "type": "object",
                "properties": {
                    "code": {
                        "type": "string",
                        "description": "実行する Python コード",
                    },
                },
                "required": ["code"],
            },
        },
    },
]
```

{% endcode %}

次に、モデルをテストするために、可能なメッセージのランダムなリストから簡単な質問をします:

{% code overflow="wrap" %}

```python
import random
messages = [{
    "role": "user",
    "content": [random.choice([
        {"type": "text", "text": "物語を書いてくれますか？"},
        {"type": "text", "text": "今日の日付に3日足すと何日ですか？"},
        {"type": "text", "text": "現在の時刻をナノ秒で取得してください。"},
        {"type": "text", "text": "Python でフィボナッチ関数を作成して fib(20) を求めてください。"},
    ])],
}]
```

{% endcode %}

次に、関数呼び出しを自動で解析する以下の関数（コピー＆ペーストして実行）を使います。Devstral 2 は複数を同時に行うかもしれません！

```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"Using model = {model_name}")
has_tool_calls = True
original_messages_len = len(messages)
while has_tool_calls:
    print(f"Current messages = {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))
```

そして1分後、次を得ます:

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

または JSON 形式では:

```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": "はるか昔、はるか遠くの銀河で..."
  },
  {
    "role": "assistant",
    "tool_calls": null,
    "content": "遠い銀河では、星々がこの世ならぬ輝きで燃えており、エルドリアという名の惑星がありました。エルドリアは鮮やかな都市とそびえ立つ山々、そして双子の太陽の下で果てしなく広がる広大な砂漠が共存する、強烈な対比の世界でした。エルドリアの人々はエネルギーの扱いに広く知られ、とりわけ伝説的なレーザーセイバーで有名でした。\n\nこれらのセイバーは単なる武器ではなく、使い手の魂の延長でした。宇宙の本質を脈打たせる希少な結晶から鍛え上げられていたのです。各セイバーは固有で、その色と力は持ち主の性格や精神を映し出していました。セイバー生まれとして知られる最も熟練した戦士たちは、そのセイバーを非常に精密かつ優雅に操り、まるで現実そのものの織物と踊っているかのようでした。\n\nセイバー生まれの中に、ケールという名の戦士がいました。ケールは追放者であり、聖なるセイバー神殿の元守護者でしたが、評議会の命令に背いたために追放されていたのです。評議会はレーザーセイバーの力を独占し、それを用いてエルドリアの人々を支配しようとしていました。ケールは、セイバーは支配するためではなく、守るために使われるべきだと信じていました。\n\nある日、ケールは砂漠の外れにある小さな村から緊急信号を受け取りました。その村は、冷酷な軍閥指導者ベクシスに率いられた反逆のセイバー生まれの一団に攻撃されていました。ベクシスは村の古代遺物を手に入れようとしていました。それは、あらゆるレーザーセイバーの力を十倍に増幅すると言われる結晶でした。もしベクシスが成功すれば、彼の軍勢は止められなくなり、エルドリアは闇に落ちるでしょう。\n\nケールは行動しなければならないと分かっていました。彼は宇宙のエネルギーで低く唸る深い青色の刃、つまり自らのセイバーを腰に装着し、砂漠を越えて出発しました。旅路は過酷で、砂嵐やベクシスの斥候が仕掛けた隠された罠が待ち受けていました。しかしケールは、かつて守ると誓った人々の記憶に突き動かされ、前進し続けました。\n\n村に到着したとき、戦いはすでに激しく繰り広げられていました。ベクシスの戦士たちは残忍な効率でセイバーを振るい、守備側をたやすく斬り倒していました。ケールは戦いに飛び込み、青いセイバーを光の残像に変えながら、次々と敵を武装解除し打ち破っていきました。救い主の到着を見た村人たちは彼の背後に結集し、自分たちのセイバーを閃かせながら、故郷を取り戻すために戦いました。\n\nケールは村の広場の中央でベクシスと対峙しました。軍閥指導者のセイバーは病的な緑色で、暗いエネルギーを脈打たせていました。\"遅かったな、ケール、\"とベクシスは嘲りました。\"遺物は俺のものだ。これがあれば、私はエルドリアを支配する。\"ケールはひるまず、セイバーを掲げたまま立ち続けました。\"私の死体を越えて行け、\"と彼は答えました。\n\n二人の戦士は激突し、セイバー同士が火花を散らして絡み合いました。ケールはベクシスの刃を流れる遺物の生の力を感じましたが、一歩も退きませんでした。彼は自らのエネルギーを集中させ、ベクシスの猛攻を押し返すにつれてセイバーの輝きを強めました。最後の、必死の一撃でケールはベクシスを武装解除し、彼のセイバーを地面に叩き落としました。\n\n敗北したベクシスは唸りましたが、ケールは彼を殺しませんでした。代わりに選択肢を与えたのです。\"私と共にエルドリアを守るか、去って二度と戻るな。\"ベクシスは打ちのめされ、ケールの言葉に真実を見て、彼と共に戦うことを選びました。\n\nベクシスの一派が同盟者となったことで、ケールと村人たちは遺物を取り戻し、その力を使ってエルドリアの均衡を回復しました。セイバー神殿は再建され、レーザーセイバーは再び、支配するためではなく守るために力を振るう者たちによって使われるようになりました。\n\nケールの伝説は広まり、彼はエルドリアの人々にとって希望の象徴となりました。彼の物語は、最も暗い時代でさえ、勇気と正義の光が勝利しうることを人々に思い起こさせました。そしてセイバー生まれたちは生き続け、レーザーセイバーは影に満ちた銀河における力と団結の灯台であり続けたのです。"
  }
]
```


---

# 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/jp/moderu/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.
