# Qwen3-Coder-Next : comment l'exécuter localement

Qwen lance Qwen3-Coder-Next, un modèle MoE de 80B (3B de paramètres actifs) avec **contexte de 256K** pour un codage agentique rapide et une utilisation locale. Ses performances sont comparables à celles de modèles ayant 10 à 20 fois plus de paramètres actifs.

Il fonctionne avec **46 Go de RAM**/VRAM/mémoire unifiée (85 Go en 8 bits), est sans raisonnement pour des réponses de code ultra-rapides. Le modèle excelle dans le raisonnement à long horizon, l’utilisation complexe d’outils et la récupération après des échecs d’exécution.

{% hint style="success" %}
**Mise à jour du 19 fév.**: l’appel d’outils devrait maintenant être encore meilleur après les correctifs de parsing de llama.cpp.

**NOUVEAU !** Voir [benchmarks de quantification](#gguf-quantization-benchmarks) pour nos GGUF dynamiques !

**4 fév. :** `llama.cpp` corrigé un bogue rectifiant le calcul pour `key_gdiff vectorisé.` Cela corrige les problèmes précédents de boucle et de sortie. Nous avons mis à jour les GGUF - veuillez **retélécharger** et **MISE À JOUR** `llama.cpp` pour de meilleures sorties.
{% endhint %}

Vous apprendrez aussi à exécuter le modèle sur Codex et Claude Code. Pour le **fine-tuning**, Qwen3-Next-Coder tient sur un seul GPU B200 pour du LoRA bf16 dans Unsloth.

Qwen3-Coder-Next Unsloth [GGUF dynamiques](/docs/fr/bases/unsloth-dynamic-2.0-ggufs.md) pour l’exécuter : [unsloth/Qwen3-Coder-Next-GGUF](https://huggingface.co/unsloth/Qwen3-Coder-Next-GGUF)

<a href="/pages/012ba9db623e0eefda3058b67f1349147eafda22#run-qwen3-coder-next" class="button primary">Tutoriel d’exécution GGUF</a><a href="/pages/012ba9db623e0eefda3058b67f1349147eafda22#improving-generation-speed" class="button secondary">Codex et Claude Code</a><a href="/pages/012ba9db623e0eefda3058b67f1349147eafda22#fp8-qwen3-coder-next-in-vllm" class="button secondary">Tutoriel FP8 vLLM</a>

### ⚙️ Guide d’utilisation

Vous n’avez pas 46 Go de RAM ou de mémoire unifiée ? Pas d’inquiétude, vous pouvez exécuter nos quantifications plus petites comme le 3 bits. Il est préférable que la taille du modèle soit égale à la somme de vos ressources de calcul ( **`espace disque + RAM + VRAM ≥ taille de la quantification).`** Si votre quantification tient entièrement sur votre appareil, attendez-vous à plus de 20 jetons/s. Si elle ne tient pas, elle fonctionnera quand même via le déchargement, mais ce sera plus lent.

Pour obtenir des performances optimales, Qwen recommande ces paramètres :

* <mark style="background-color:blue;">`Température = 1.0`</mark>
* `Top_P = 0.95`
* `Top_K = 40`
* `Min_P = 0.01` (la valeur par défaut de llama.cpp est 0.05)
* `pénalité de répétition` = désactivée ou 1.0

Prend en charge jusqu’à `262,144` de contexte nativement, mais vous pouvez le définir à `32,768` jetons pour une moindre utilisation de mémoire.

### 🖥️ Exécuter Qwen3-Coder-Next

Selon votre cas d’utilisation, vous devrez utiliser différents paramètres. Comme ce guide utilise du 4 bits, vous aurez besoin d’environ 46 Go de RAM/mémoire unifiée. Nous recommandons d’utiliser au moins une précision 3 bits pour de meilleures performances.

#### 🦥 Guide Unsloth Studio

Qwen3-Coder-Next peut être exécuté et affiné dans [Unsloth Studio](/docs/fr/nouveau/studio.md), notre nouvelle interface web open source pour l’IA locale. Avec Unsloth Studio, vous pouvez exécuter des modèles localement sur **MacOS, Windows**, Linux et :

{% columns %}
{% column %}

* Rechercher, télécharger, [exécuter des GGUF](/docs/fr/nouveau/studio.md#run-models-locally) et des modèles safetensor
* [**Auto-réparation** appel d’outils](/docs/fr/nouveau/studio.md#execute-code--heal-tool-calling) + **recherche web**
* [**Exécution de code**](/docs/fr/nouveau/studio.md#run-models-locally) (Python, Bash)
* [Inférence automatique](/docs/fr/nouveau/studio.md#model-arena) réglage des paramètres (temp, top-p, etc.)
* Inférence rapide CPU + GPU via llama.cpp
* [Entraîner des LLM](/docs/fr/nouveau/studio.md#no-code-training) 2x plus vite avec 70 % de VRAM en moins
  {% endcolumn %}

{% column %}

<div data-with-frame="true"><figure><img src="/files/9d149ac4b773a56a635d40ab8347ea2896781ae6" alt=""><figcaption></figcaption></figure></div>
{% endcolumn %}
{% endcolumns %}

{% stepper %}
{% step %}
**Installer Unsloth**

Exécutez dans votre terminal :

MacOS, Linux, WSL :

```bash
curl -fsSL https://unsloth.ai/install.sh | sh
```

Windows PowerShell :

```bash
irm https://unsloth.ai/install.ps1 | iex
```

{% hint style="success" %}
**L’installation sera rapide et prendra environ 1 à 2 min.**
{% endhint %}
{% endstep %}

{% step %}
**Lancer Unsloth**

MacOS, Linux, WSL et Windows :

```bash
unsloth studio -H 0.0.0.0 -p 8888
```

Puis ouvrez `http://localhost:8888` dans votre navigateur.
{% endstep %}

{% step %}
**Rechercher et télécharger Qwen3-Coder-Next**

Au premier lancement, vous devrez créer un mot de passe pour sécuriser votre compte et vous reconnecter plus tard. Vous verrez ensuite un bref assistant d’intégration pour choisir un modèle, un jeu de données et les paramètres de base. Vous pouvez le passer à tout moment et aller directement au chat.

Ensuite, allez dans l’onglet [Studio Chat](/docs/fr/nouveau/studio/chat.md) onglet et recherchez **Qwen3-Coder-Next** dans la barre de recherche et téléchargez le modèle et la quantification souhaités.

<div data-with-frame="true"><figure><img src="/files/ba9cd7a59a38b4d899e5da953933dd98e195258f" alt="" width="563"><figcaption></figcaption></figure></div>
{% endstep %}

{% step %}
**Exécuter Qwen3-Coder-Next**

Les paramètres d’inférence devraient être définis automatiquement lors de l’utilisation d’Unsloth Studio ; toutefois, vous pouvez toujours les modifier manuellement. Vous pouvez également modifier la longueur du contexte, le modèle de conversation et d’autres réglages.

Pour plus d’informations, vous pouvez consulter notre [guide d’inférence Unsloth Studio](/docs/fr/nouveau/studio/chat.md).

<div data-with-frame="true"><figure><img src="/files/b03f506381fed38c517bc09e2e726bc0013f23f4" alt="" width="563"><figcaption></figcaption></figure></div>
{% endstep %}
{% endstepper %}

#### Tutoriel Llama.cpp (GGUF) :

Instructions pour l’exécution dans llama.cpp (notez que nous utiliserons du 4 bits pour convenir à la plupart des appareils) :

{% stepper %}
{% step %}
Obtenez la dernière version `llama.cpp` sur [GitHub ici](https://github.com/ggml-org/llama.cpp). Vous pouvez également suivre les instructions de compilation ci-dessous. Changez `-DGGML_CUDA=ON` en `-DGGML_CUDA=OFF` si vous n’avez pas de GPU ou si vous souhaitez simplement une inférence CPU. **Pour les appareils Apple Mac / Metal**, définissez `-DGGML_CUDA=OFF` puis continuez comme d'habitude - la prise en charge de Metal est activée par défaut.

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

{% step %}
Vous pouvez le récupérer directement depuis Hugging Face. Vous pouvez augmenter le contexte à 256K si votre RAM/VRAM peut le contenir. L’utilisation de `--fit on` déterminera aussi automatiquement la longueur du contexte.

Vous pouvez utiliser les paramètres recommandés : `temperature=1.0`, `top_p=0.95`, `top_k=40`

```bash
./llama.cpp/llama-cli \
    -hf unsloth/Qwen3-Coder-Next-GGUF:UD-Q4_K_XL \\
    --ctx-size 16384 \
    --temp 1.0 --top-p 0.95 --min-p 0.01 --top-k 40
```

{% endstep %}

{% step %}
Téléchargez le modèle via (après avoir installé `pip install huggingface_hub`). Vous pouvez choisir `UD-Q4_K_XL` ou d’autres versions quantifiées. Si les téléchargements restent bloqués, voir [Hugging Face Hub, débogage XET](/docs/fr/bases/troubleshooting-and-faqs/hugging-face-hub-xet-debugging.md)

{% code overflow="wrap" %}

```bash
pip install -U huggingface_hub
hf download unsloth/Qwen3-Coder-Next-GGUF \\
    --local-dir unsloth/Qwen3-Coder-Next-GGUF \\
    --include "*UD-Q4_K_XL*"
```

{% endcode %}
{% endstep %}

{% step %}
Puis exécutez le modèle en mode conversation :

{% code overflow="wrap" %}

```bash
./llama.cpp/llama-cli \
    --model unsloth/Qwen3-Coder-Next-GGUF/Qwen3-Coder-Next-UD-Q4_K_XL.gguf \\
    --seed 3407 \
    --temp 1.0 \
    --top-p 0.95 \
    --min-p 0.01 \
    --top-k 40
```

{% endcode %}

Aussi, ajustez **la fenêtre de contexte** si nécessaire, jusqu’à `262,144`

{% hint style="info" %}
REMARQUE : ce modèle prend uniquement en charge le mode sans réflexion et ne génère pas `<think></think>` blocs dans sa sortie. Donc en spécifiant `enable_thinking=False` n’est plus requis.
{% endhint %}
{% endstep %}
{% endstepper %}

### 🦙 Hébergement et déploiement de Llama-server

Pour déployer Qwen3-Coder-Next en production, nous utilisons `llama-server` Dans un nouveau terminal, par exemple via tmux. Puis, déployez le modèle via :

{% code overflow="wrap" %}

```bash
./llama.cpp/llama-server \
    --model unsloth/Qwen3-Coder-Next-GGUF/Qwen3-Coder-Next-UD-Q4_K_XL.gguf \\
    --alias "unsloth/Qwen3-Coder-Next" \\
    --seed 3407 \
    --temp 1.0 \
    --top-p 0.95 \
    --min-p 0.01 \
    --top-k 40 \
    --port 8001 \
```

{% endcode %}

Puis dans un nouveau terminal, après avoir fait `pip install openai`, nous pouvons exécuter le modèle :

{% 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/Qwen3-Coder-Next",
    messages = [{"role": "user", "content": "Create a Flappy Bird game in HTML"},],
)
print(completion.choices[0].message.content)
```

{% endcode %}

Ce qui produira :

{% columns %}
{% column width="66.66666666666666%" %}
{% code overflow="wrap" expandable="true" %}

````markdown
Voici un jeu Flappy Bird complet et fonctionnel, contenu dans un seul fichier.

J’ai utilisé **HTML5 Canvas** pour les graphismes et **JavaScript** pour la physique (gravité, détection des collisions et score). Aucune image externe ni téléchargement n’est requis ; le jeu dessine l’oiseau et les tuyaux à l’aide de code.

### Comment l’exécuter :
1.  Copiez le bloc de code ci-dessous.
2.  Créez un nouveau fichier sur votre ordinateur nommé `game.html`.
3.  Collez le code dans ce fichier et enregistrez-le.
4.  Double-cliquez sur `game.html` pour l’ouvrir dans votre navigateur web.

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flappy Bird Simple</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #333;
            font-family: 'Courier New', Courier, monospace;
            color: white;
        }

        h1 {
            margin-bottom: 10px;
        }

        #game-container {
            position: relative;
            box-shadow: 0 0 20px rgba(0,0,0,0.5);
        }

        canvas {
            display: block;
            background-color: #70c5ce; /* Bleu ciel */
            border: 4px solid #000;
        }

        #ui-layer {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            pointer-events: none; /* Laisser les clics passer au canvas */
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            text-align: center;
        }

        .message {
            background: rgba(255, 255, 255, 0.8);
            padding: 20px;
            border-radius: 10px;
            color: #333;
        }

        #score-board {
            position: absolute;
            top: 20px;
            width: 100%;
            text-align: center;
            font-size: 40px;
            font-weight: bold;
            color: white;
            text-shadow: 2px 2px 0 #000;
            z-index: 10;
        }
    </style>
</head>
<body>

    <h1>Clone de Flappy Bird</h1>
    
    <div id="game-container">
        <div id="score-board">0</div>
        <canvas id="birdCanvas" width="320" height="480"></canvas>
        
        <div id="ui-layer">
            <div id="start-screen" class="message">
                <h2>Prêt à voler ?</h2>
                <p>Appuyez sur <strong>Espace</strong> ou <strong>Cliquez</strong> pour sauter</p>
                <p>Appuyez sur Espace pour commencer</p>
            </div>
            <div id="game-over-screen" class="message" style="display: none;">
                <h2>Partie terminée</h2>
                <p>Score : <span id="final-score">0</span></p>
                <p>Meilleur : <span id="best-score">0</span></p>
                <p>Appuyez sur <strong>Espace</strong> pour recommencer</p>
            </div>
        </div>
    </div>

    <script>
        // --- Configuration ---
        const canvas = document.getElementById('birdCanvas');
        const ctx = canvas.getContext('2d');
        const scoreElement = document.getElementById('score-board');
        const startScreen = document.getElementById('start-screen');
        const gameOverScreen = document.getElementById('game-over-screen');
        const finalScoreSpan = document.getElementById('final-score');
        const bestScoreSpan = document.getElementById('best-score');

        // Variables du jeu
        let frames = 0;
        let score = 0;
        let highScore = localStorage.getItem('flappyHighScore') || 0;
        let gameState = 'START'; // START, PLAYING, GAMEOVER
        const gravity = 0.25;
        const speed = 2; // Vitesse des tuyaux allant vers la gauche

        // --- L’objet Oiseau ---
        const bird = {
            x: 50,
            y: 150,
            width: 30,
            height: 30,
            velocity: 0,
            jumpStrength: 4.5,
            radius: 15,
            draw: function() {
                ctx.fillStyle = "#FFD700"; // Couleur or
                ctx.beginPath();
                ctx.arc(this.x + this.radius, this.y + this.radius, this.radius, 0, Math.PI * 2);
                ctx.fill();
                ctx.lineWidth = 2;
                ctx.stroke();

                // Œil
                ctx.fillStyle = "white";
                ctx.beginPath();
                ctx.arc(this.x + this.radius + 5, this.y + this.radius - 5, 5, 0, Math.PI * 2);
                ctx.fill();
                ctx.fillStyle = "black";
                ctx.beginPath();
                ctx.arc(this.x + this.radius + 7, this.y + this.radius - 5, 2, 0, Math.PI * 2);
                ctx.fill();
                
                // Bec
                ctx.fillStyle = "orange";
                ctx.beginPath();
                ctx.moveTo(this.x + this.radius + 10, this.y + this.radius);
                ctx.lineTo(this.x + this.radius + 20, this.y + this.radius + 5);
                ctx.lineTo(this.x + this.radius + 10, this.y + this.radius + 10);
                ctx.fill();
                ctx.stroke();
            },
            update: function() {
                this.velocity += gravity;
                this.y += this.velocity;

                // Collision avec le sol
                if (this.y + this.height >= canvas.height) {
                    this.y = canvas.height - this.height;
                    gameOver();
                }
                
                // Collision avec le plafond (facultatif : empêche de voler au-dessus des tuyaux)
                if (this.y < 0) {
                    this.y = 0;
                    this.velocity = 0;
                }
            },
            jump: function() {
                this.velocity = -this.jumpStrength;
            },
            reset: function() {
                this.y = 150;
                this.velocity = 0;
            }
        };

        // --- Le tableau des tuyaux ---
        const pipes = {
            position: [],
            width: 50,
            gap: 120, // Espace entre le tuyau du haut et celui du bas
            dx: 2, // Vitesse de déplacement

            draw: function() {
                for (let i = 0; i < this.position.length; i++) {
                    let p = this.position[i];
                    let topY = p.y;
                    let bottomY = p.y + this.gap;

                    ctx.fillStyle = "#228B22"; // Vert forêt

                    // Tuyau du haut
                    ctx.fillRect(p.x, 0, this.width, topY);
                    ctx.strokeRect(p.x, 0, this.width, topY);

                    // Tuyau du bas
                    ctx.fillRect(p.x, bottomY, this.width, canvas.height - bottomY);
                    ctx.strokeRect(p.x, bottomY, this.width, canvas.height - bottomY);
                }
            },

            update: function() {
                // Ajouter un nouveau tuyau toutes les 120 images (environ 2 secondes)
                if (frames % 120 === 0) {
                    // Hauteur aléatoire pour le tuyau du haut
                    // Hauteur min 50, hauteur max canvas - gap - 50
                    let maxY = canvas.height - this.gap - 50;
                    let randomY = Math.floor(Math.random() * (maxY - 50 + 1) + 50);
                    
                    this.position.push({
                        x: canvas.width,
                        y: randomY
                    });
                }

                for (let i = 0; i < this.position.length; i++) {
                    let p = this.position[i];
                    p.x -= this.dx;

                    // Détection des collisions
                    // Logique : vérifier si l’X de l’oiseau se trouve dans la plage X du tuyau
                    if (bird.x + bird.width > p.x && bird.x < p.x + this.width) {
                        // Logique : vérifier si l’Y de l’oiseau touche le tuyau du haut OU celui du bas
                        if (bird.y < p.y || bird.y + bird.height > p.y + this.gap) {
                            gameOver();
                        }
                    }

                    // Mise à jour du score (quand l’oiseau dépasse le tuyau)
                    if (p.x + this.width < bird.x && !p.passed) {
                        score++;
                        scoreElement.innerText = score;
                        p.passed = true;
                    }

                    // Supprimer les tuyaux qui sont sortis de l’écran
                    if (p.x + this.width <= 0) {
                        this.position.shift();
                        // Décrémenter i car la longueur du tableau a changé
                        i--; 
                    }
                }
            },
            
            reset: function() {
                this.position = [];
            }
        };

        // --- Arrière-plan (nuages/herbe) ---
        const background = {
            draw: function() {
                // Dessiner l’herbe
                ctx.fillStyle = "#7cfc00"; // Vert pelouse
                ctx.fillRect(0, canvas.height - 20, canvas.width, 20);
                ctx.beginPath();
                ctx.moveTo(0, canvas.height - 20);
                ctx.lineTo(canvas.width, canvas.height - 20);
                ctx.stroke();
            }
        };

        // --- Fonctions de contrôle du jeu ---

        function loop() {
            // Effacer le canvas
            ctx.clearRect(0, 0, canvas.width, canvas.height);

            // Dessiner l’arrière-plan
            background.draw();

            if (gameState === 'START') {
                bird.draw();
                // Dessiner une ligne de sol
                ctx.fillStyle = "#ded895";
                ctx.fillRect(0, canvas.height - 10, canvas.width, 10);
            } 
            else if (gameState === 'PLAYING') {
                bird.update();
                bird.draw();
                pipes.update();
                pipes.draw();
                frames++;
            } 
            else if (gameState === 'GAMEOVER') {
                pipes.draw();
                bird.draw();
                // Ne pas mettre à jour les images ni la position, juste figer
            }

            requestAnimationFrame(loop);
        }

        function startGame() {
            gameState = 'PLAYING';
            startScreen.style.display = 'none';
            gameOverScreen.style.display = 'none';
            score = 0;
            frames = 0;
            scoreElement.innerText = score;
            bird.reset();
            pipes.reset();
        }

        function gameOver() {
            gameState = 'GAMEOVER';
            
            // Mettre à jour le meilleur score
            if (score > highScore) {
                highScore = score;
                localStorage.setItem('flappyHighScore', highScore);
            }

            finalScoreSpan.innerText = score;
            bestScoreSpan.innerText = highScore;
            gameOverScreen.style.display = 'block';
        }

        // --- Gestion des entrées ---

        function handleInput(e) {
            // Empêcher le défilement par défaut pour la barre d’espace
            if (e.type === 'keydown' && e.code === 'Space') {
                e.preventDefault();
            }

            if (e.code === 'Space' || e.type === 'mousedown' || e.type === 'touchstart') {
                switch (gameState) {
                    case 'START':
                        startGame();
                        bird.jump();
                        break;
                    case 'PLAYING':
                        bird.jump();
                        break;
                    case 'GAMEOVER':
                        startGame();
                        bird.jump();
                        break;
                }
            }
        }

        window.addEventListener('keydown', handleInput);
        canvas.addEventListener('mousedown', handleInput);
        canvas.addEventListener('touchstart', handleInput);

        // Initialiser
        loop();

    </script>
</body>
</html>
```

### Fonctionnalités de cette version :
1.  **Physique :** Gravité et mécanismes de saut réalistes.
2.  **Détection des collisions :** La partie se termine si vous touchez les tuyaux, le sol ou le plafond.
3.  **Système de score :** Vous gagnez 1 point pour chaque tuyau dépassé.
4.  **Meilleur score :** Utilise le LocalStorage de votre navigateur pour mémoriser votre meilleur score même si vous actualisez la page.
5.  **Commandes réactives :** Fonctionne avec la **barre d’espace**, le **clic de souris** ou le **tactile** (pour appareils mobiles).
6.  **Graphismes :** L’oiseau est dessiné par le code (y compris un œil et un bec) et les tuyaux ont des bordures, donc aucun lien d’image cassé ne se produira.
````

{% endcode %}

Nous avons extrait le HTML et l’avons exécuté, et l’exemple de jeu Flappy Bird généré a très bien fonctionné !
{% endcolumn %}

{% column width="33.33333333333334%" %}

<figure><img src="/files/6b5962d2d76cf1b2c6f416560775d0f3f85c858d" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

### 👾 OpenAI Codex et Claude Code <a href="#claude-codex" id="claude-codex"></a>

Pour exécuter le modèle via des charges de travail locales de codage agentique, vous pouvez [suivre notre guide](/docs/fr/bases/claude-code.md). Il suffit de changer le nom du modèle '[GLM-4.7-Flash](/docs/fr/modeles/glm-4.7-flash.md)' en 'Qwen3-Coder-Next' et de vous assurer de suivre les paramètres et instructions d’utilisation corrects de Qwen3-Coder-Next. Utilisez le `llama-server` que nous venons juste de configurer.

{% columns %}
{% column %}
{% content-ref url="/pages/6c4a155ae35df476974e25b66af4db620dffaf2c" %}
[Claude Code](/docs/fr/bases/claude-code.md)
{% endcontent-ref %}
{% endcolumn %}

{% column %}
{% content-ref url="/pages/0bb2f0a13e244fd2f0ea640c96c4e297bf83db93" %}
[OpenAI Codex](/docs/fr/bases/codex.md)
{% endcontent-ref %}
{% endcolumn %}
{% endcolumns %}

Après avoir suivi les instructions pour Claude Code par exemple, vous verrez :

<figure><img src="/files/19582d26040ff1c90cf6e4aaf692124d0f6da048" alt="" width="563"><figcaption></figcaption></figure>

Nous pouvons alors demander par exemple `Créer un jeu d’échecs en Python` :

<div><figure><img src="/files/0081141c94f3b9d9f5364616b143f6a10c9a55de" alt="" width="563"><figcaption></figcaption></figure> <figure><img src="/files/085cfe6556c6fc7a1af80d39c5ce906c38393522" alt="" width="563"><figcaption></figcaption></figure> <figure><img src="/files/f6c269d096a141438a03edc4b4f672800846049e" alt="" width="563"><figcaption></figcaption></figure></div>

Si vous voyez `Erreur API : 400 {"error":{"code":400,"message":"request (16582 tokens) exceeds the available context size (16384 tokens), try increasing it","type":"exceed_context_size_error","n_prompt_tokens":16582,"n_ctx":16384}}` cela signifie que vous devez augmenter la longueur du contexte ou voir [#how-to-fit-long-context-256k-to-1m](#how-to-fit-long-context-256k-to-1m "mention")

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

### 🎱 FP8 Qwen3-Coder-Next dans vLLM

Vous pouvez maintenant utiliser notre nouvelle [quantification dynamique FP8](https://huggingface.co/unsloth/Qwen3-Coder-Next-FP8-Dynamic) du modèle pour une inférence premium et rapide. Installez d’abord vLLM depuis la version nightly. Changez `--extra-index-url https://wheels.vllm.ai/nightly/cu130` pour votre version CUDA trouvée via `nvidia-smi` - seulement `cu129` et `cu130` sont actuellement pris en charge.

{% hint style="success" %}
Si vous utilisez vLLM / SGLang, essayez nos quantifications FP8-Dynamic, qui peuvent augmenter le débit de 25 % ou plus ! Voir [#fp8-qwen3-coder-next-in-vllm](#fp8-qwen3-coder-next-in-vllm "mention")
{% endhint %}

{% code overflow="wrap" %}

```bash
# Installez uv si vous ne l’avez pas pour accélérer les installations d’environnement
curl -LsSf https://astral.sh/uv/install.sh | sh

# Créez un nouvel environnement Python - inutile si vous voulez modifier tout votre système
uv venv unsloth_fp8 --python 3.12 --seed
source unsloth_fp8/bin/activate

uv pip install --upgrade --force-reinstall vllm --torch-backend=auto --extra-index-url https://wheels.vllm.ai/nightly/cu130
uv pip install --upgrade --force-reinstall git+https://github.com/huggingface/transformers.git
uv pip install --force-reinstall numba
```

{% endcode %}

Puis servez [la version FP8 dynamique d’Unsloth](https://huggingface.co/unsloth/Qwen3-Coder-Next-FP8-Dynamic) du modèle. Vous pouvez aussi activer FP8 pour réduire l’utilisation de mémoire du cache KV de 50 % en ajoutant `--kv-cache-dtype fp8` Nous l’avons servi sur 4 GPU, mais si vous avez 1 GPU, utilisez `CUDA_VISIBLE_DEVICES='0'` et définissez `--tensor-parallel-size 1` ou supprimez cet argument. Utilisez `tmux` pour lancer ce qui suit dans un nouveau terminal puis CTRL+B+D - utilisez `tmux attach-session -t0` pour y revenir.

```bash
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:False
CUDA_VISIBLE_DEVICES='0,1,2,3' vllm serve unsloth/Qwen3-Coder-Next-FP8-Dynamic \\
    --served-model-name unsloth/Qwen3-Coder-Next \\
    --tensor-parallel-size 4 \\
    --tool-call-parser qwen3_coder \\
    --enable-auto-tool-choice \
    --dtype bfloat16 \
    --seed 3407 \
    --max-model-len 200000 \
    --gpu-memory-utilization 0.93 \
    --port 8001
```

Vous devriez voir quelque chose comme ci-dessous. Voir [#tool-calling-with-qwen3-coder-next](#tool-calling-with-qwen3-coder-next "mention") pour savoir comment utiliser réellement Qwen3-Coder-Next via l’API OpenAI et l’appel d’outils - cela fonctionne avec vLLM et llama-server.

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

### :wrench:Appel d’outils avec Qwen3-Coder-Next

Dans un nouveau terminal, nous créons quelques outils comme l’ajout de 2 nombres, l’exécution de code Python, l’exécution de fonctions Linux et bien plus encore :

{% 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([
        "Il était une fois dans une galaxie très très lointaine...",
        "Il y avait 2 amis qui aimaient les paresseux et le code...",
        "Le monde touchait à sa fin parce que chaque paresseux avait évolué pour avoir une intelligence surhumaine...",
        "À l'insu d'un ami, l'autre a accidentellement codé un programme pour faire évoluer les paresseux...",
    ])
def terminal(command: str) -> str:
    if "rm" in command or "sudo" in command or "dd" in command or "chmod" in command:
        msg = "Impossible d'exécuter les commandes 'rm, sudo, dd, chmod' car elles sont dangereuses"
        print(msg); return msg
    print(f"Exécution de la commande terminal `{command}`")
    try:
        return str(subprocess.run(command, capture_output = True, text = True, shell = True, check = True).stdout)
    except subprocess.CalledProcessError as e:
        return f"La commande a échoué : {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": "Additionner deux nombres.",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "string",
                        "description": "Le premier nombre.",
                    },
                    "b": {
                        "type": "string",
                        "description": "Le deuxième nombre.",
                    },
                },
                "required": ["a", "b"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "multiply_number",
            "description": "Multiplier deux nombres.",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "string",
                        "description": "Le premier nombre.",
                    },
                    "b": {
                        "type": "string",
                        "description": "Le deuxième nombre.",
                    },
                },
                "required": ["a", "b"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "subtract_number",
            "description": "Soustraire deux nombres.",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "string",
                        "description": "Le premier nombre.",
                    },
                    "b": {
                        "type": "string",
                        "description": "Le deuxième nombre.",
                    },
                },
                "required": ["a", "b"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "write_a_story",
            "description": "Écrit une histoire aléatoire.",
            "parameters": {
                "type": "object",
                "properties": {},
                "required": [],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "terminal",
            "description": "Effectuer des opérations depuis le terminal.",
            "parameters": {
                "type": "object",
                "properties": {
                    "command": {
                        "type": "string",
                        "description": "La commande que vous souhaitez lancer, par ex. `ls`, `rm`, ...",
                    },
                },
                "required": ["command"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "python",
            "description": "Appeler un interpréteur Python avec du code Python qui sera exécuté.",
            "parameters": {
                "type": "object",
                "properties": {
                    "code": {
                        "type": "string",
                        "description": "Le code Python à exécuter",
                    },
                },
                "required": ["code"],
            },
        },
    },
]
```

{% endcode %}

Nous utilisons ensuite les fonctions ci-dessous (copiez-collez puis exécutez) qui analyseront automatiquement les appels de fonction et appelleront l'endpoint OpenAI pour n'importe quel modèle :

{% code overflow="wrap" expandable="true" %}

```python
from openai import OpenAI
def unsloth_inference(
    messages,
    temperature = 1.0,
    top_p = 0.95,
    top_k = 40,
    min_p = 0.01,
    repetition_penalty = 1.0,
):
    messages = messages.copy()
    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,
            top_p = top_p,
            tools = tools if tools else None,
            tool_choice = "auto" if tools else None,
            extra_body = {"top_k": top_k, "min_p": min_p, "repetition_penalty" :repetition_penalty,}
        )
        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
    return messages
```

{% endcode %}

Nous allons maintenant présenter ci-dessous plusieurs méthodes d’exécution de l’appel d’outils pour de nombreux cas d’utilisation différents :

#### Exécuter le code Python généré

{% code overflow="wrap" %}

```python
messages = [{
    "role": "user",
    "content": [{"type": "text", "text": "Create a Fibonacci function in Python and find fib(20)."}],
}]
unsloth_inference(messages, temperature = 1.0, top_p = 0.95, top_k = 40, min_p = 0.00)
```

{% endcode %}

<figure><img src="/files/9d6f1895d0f1a4979a55cb39627ee5911fb53ba8" alt=""><figcaption></figcaption></figure>

#### Exécuter des fonctions de terminal arbitraires

{% code overflow="wrap" %}

```python
messages = [{
    "role": "user",
    "content": [{"type": "text", "text": "Écris 'Je suis un happy Sloth' dans un fichier, puis renvoie-le-moi."}],
}]
messages = unsloth_inference(messages, temperature = 1.0, top_p = 1.0, top_k = 40, min_p = 0.00)
```

{% endcode %}

Nous confirmons que le fichier a été créé, et c’est bien le cas !

<figure><img src="/files/1326fbfb8154cd3d95c81f5de1d30d0ab1c79a0e" alt=""><figcaption></figcaption></figure>

Voir [Tool Calling Guide](/docs/fr/bases/tool-calling-guide-for-local-llms.md) pour plus d’exemples d’appel d’outils.

## :triangular\_ruler:Benchmarks

### Benchmarks de quantification GGUF

Voici des benchmarks de quantification réalisés par des évaluateurs tiers.

<div><figure><img src="/files/bfc8fd9b0cd3631f709817433affa8d3c554a027" alt="" width="563"><figcaption><p>Benchmarks Aider Polyglot</p></figcaption></figure> <figure><img src="/files/2394d4676318d3a483203b406c78b42df0847f96" alt="" width="450"><figcaption><p>Benchmarks de Benjamine Marie (<a href="https://x.com/bnjmn_marie/status/2019809651387514947/photo/1">Source</a>)</p></figcaption></figure></div>

{% columns %}
{% column %}
Les benchmarks ont été réalisés par des contributeurs tiers sur le serveur Aider Polyglot, en comparant les quantifications GGUF d’Unsloth sur le benchmark Aider Polyglot (score vs. VRAM). Notamment, la quantification 3 bits **`UD-IQ3_XXS`** se rapproche des **BF16** performances, faisant de **le 3 bits un minimum raisonnable** pour la plupart des cas d’utilisation.

**NVFP4** surpasse légèrement la référence BF16, ce qui peut être du bruit d’échantillonnage en raison du nombre limité d’exécutions ; cependant, la tendance générale pour : **1 bit → 2 bits → 3 bits → 6 bits** amélioration régulière, suggère que le benchmark capture des différences de qualité significatives entre les GGUF d’Unsloth. Le **non-Unsloth** FP8 semble moins bien performer que **`UD-IQ3_XXS`** et **`UD-Q6_K_XL`**, ce qui pourrait refléter des différences dans la chaîne de quantification ou, là encore, un échantillonnage insuffisant.
{% endcolumn %}

{% column %}
[Benjamin Marie (tiers) a benchmarké](https://x.com/bnjmn_marie/status/2019809651387514947/photo/1) **Qwen3-Coder-Next** en utilisant Unsloth et les GGUF de Qwen sur un **suite mixte de 750 prompts** (LiveCodeBench v6, MMLU Pro, GPQA, Math500), en rapportant à la fois **la précision globale** et **l’augmentation relative de l’erreur** (à quelle fréquence le modèle quantifié fait plus d’erreurs que l’original).

Les graphiques montrent clairement que les quantifications Q4\_K\_M d’Unsloth donnent de meilleurs résultats que les Q4\_K\_M standard. Q3\_K\_M fait logiquement moins bien sur Live Code Bench v6, mais étonnamment bien mieux sur HumanEval que le Q4\_K\_M standard.\
\
Il semble fonctionner avec la meilleure efficacité ; il est donc conseillé d’utiliser au moins Q4\_K\_M.
{% endcolumn %}
{% endcolumns %}

### Benchmarks de Qwen3-Coder-Next

Qwen3-Coder-Next est le modèle le plus performant pour sa taille, et ses performances sont comparables à celles de modèles ayant 10 à 20 fois plus de paramètres actifs.

<table data-full-width="true"><thead><tr><th>Benchmark</th><th align="right">Qwen3-Coder-Next (80B)</th><th align="right">DeepSeek-V3.2 (671B)</th><th align="right">GLM-4.7 (358B)</th><th align="right">MiniMax M2.1 (229B)</th></tr></thead><tbody><tr><td>SWE-Bench Verified (avec SWE-Agent)</td><td align="right">70.6</td><td align="right">70.2</td><td align="right">74.2</td><td align="right">74.8</td></tr><tr><td>SWE-Bench Multilingual (avec SWE-Agent)</td><td align="right">62.8</td><td align="right">62.3</td><td align="right">63.7</td><td align="right">66.2</td></tr><tr><td>SWE-Bench Pro (avec SWE-Agent)</td><td align="right">44.3</td><td align="right">40.9</td><td align="right">40.6</td><td align="right">34.6</td></tr><tr><td>Terminal-Bench 2.0 (avec json Terminus-2)</td><td align="right">36.2</td><td align="right">39.3</td><td align="right">37.1</td><td align="right">32.6</td></tr><tr><td>Aider</td><td align="right">66.2</td><td align="right">69.9</td><td align="right">52.1</td><td align="right">61.0</td></tr></tbody></table>

<figure><img src="/files/84d70b65882d7e4f6904d6ba3132485493f1f389" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/72a74aad1543e6cc989091c65c31a636ae04601c" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/2b11b4e80e6136c714b152f3434cf0376e19bade" alt=""><figcaption></figcaption></figure>


---

# 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/fr/modeles/qwen3-coder-next.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.
