Fournisseurs de modèles
Qwen Code vous permet de configurer plusieurs fournisseurs de modèles via le paramètre modelProviders dans votre settings.json. Cela vous permet de basculer entre différents modèles d’IA et fournisseurs à l’aide de la commande /model.
Aperçu
Utilisez modelProviders pour déclarer des modèles par type d’authentification entre lesquels le sélecteur /model peut basculer. Les clés doivent être des types d’authentification valides (openai, anthropic, gemini, etc.). Chaque type d’authentification correspond à un objet ProviderConfig avec un champ protocol et un champ models (le tableau des définitions de modèles). Chaque entrée dans models nécessite un id ; envKey est optionnel et recommandé (lorsqu’il est omis, il revient à la clé d’environnement par défaut du type d’authentification, par exemple OPENAI_API_KEY pour openai), avec des champs optionnels name, description, baseUrl et generationConfig. Les identifiants ne sont jamais persistés dans les paramètres ; l’exécution les lit depuis process.env[envKey]. Les modèles Qwen OAuth restent codés en dur et ne peuvent pas être remplacés.
Seule la commande /model expose les types d’authentification non par défaut. Anthropic, Gemini, etc., doivent être définis via modelProviders. La commande /auth liste trois options de premier niveau : Alibaba ModelStudio (avec Coding Plan, Token Plan et Standard API Key dans son sous-menu), Fournisseurs tiers et Fournisseur personnalisé. (Qwen OAuth n’est plus une entrée de dialogue sélectionnable ; son niveau gratuit a été interrompu le 2026-04-15.)
Unicité des modèles : Les modèles au sein d’un même authType sont identifiés de manière unique par la combinaison de id + baseUrl. Cela signifie que vous pouvez définir le même ID de modèle (par exemple "gpt-4o") plusieurs fois sous un seul authType tant que chaque entrée a un baseUrl différent — par exemple, un pointant directement vers OpenAI et un autre vers un point de terminaison proxy. Si deux entrées partagent à la fois le même id et le même baseUrl (ou toutes deux omettent baseUrl), la première occurrence l’emporte et les doublons suivants sont ignorés avec un avertissement.
Exemples de configuration par type d’authentification
Vous trouverez ci-dessous des exemples de configuration complets pour différents types d’authentification, montrant les paramètres disponibles et leurs combinaisons.
Types d’authentification pris en charge
Les clés de l’objet modelProviders doivent être des valeurs authType valides. Les types d’authentification actuellement pris en charge sont :
| Type d’authentification | Description |
|---|---|
openai | API compatibles OpenAI (OpenAI, Azure OpenAI, serveurs d’inférence locaux comme vLLM/Ollama) |
anthropic | API Anthropic Claude |
gemini | API Google Gemini |
qwen-oauth | Qwen OAuth (codé en dur, ne peut pas être remplacé dans modelProviders) |
vertex-ai | Google Vertex AI (utilise le protocole gemini et le SDK @google/genai en mode Vertex AI ; le sélectionner définit GOOGLE_GENAI_USE_VERTEXAI=true) |
[!warning] Si une clé de type d’authentification inconnue est utilisée (par exemple, une faute de frappe comme
"openai-custom"), une clé non vide est acceptée telle quelle en tant que groupe de type d’authentification propre, mais elle ne correspondra à aucun protocole connu — ses modèles ne fonctionneront donc pas comme prévu et ne se comporteront pas correctement dans le sélecteur/model. Seules les clés vides (uniquement des espaces) sont ignorées. Utilisez toujours l’une des valeurs de type d’authentification prises en charge listées ci-dessus.
SDK utilisés pour les requêtes API
Qwen Code utilise les SDK officiels suivants pour envoyer des requêtes à chaque fournisseur :
| Type d’authentification | Package SDK |
|---|---|
openai | openai - SDK Node.js officiel OpenAI |
anthropic | @anthropic-ai/sdk - SDK officiel Anthropic |
gemini | @google/genai - SDK officiel Google GenAI |
qwen-oauth | openai avec fournisseur personnalisé (compatible DashScope) |
Cela signifie que le baseUrl que vous configurez doit être compatible avec le format d’API attendu par le SDK correspondant. Par exemple, lors de l’utilisation du type d’authentification openai, le point de terminaison doit accepter les requêtes au format de l’API OpenAI.
Fournisseurs compatibles OpenAI (openai)
Ce type d’authentification prend en charge non seulement l’API officielle d’OpenAI, mais aussi tout point de terminaison compatible OpenAI, y compris les fournisseurs de modèles agrégés comme OpenRouter et Requesty.
{
"env": {
"OPENAI_API_KEY": "sk-votre-cle-openai-reelle-ici",
"OPENROUTER_API_KEY": "sk-or-votre-cle-openrouter-reelle-ici",
"REQUESTY_API_KEY": "sk-votre-cle-requesty-reelle-ici"
},
"modelProviders": {
"openai": {
"protocol": "openai",
"models": [
{
"id": "gpt-4o",
"name": "GPT-4o",
"envKey": "OPENAI_API_KEY",
"baseUrl": "https://api.openai.com/v1",
"generationConfig": {
"timeout": 60000,
"maxRetries": 3,
"enableCacheControl": true,
"contextWindowSize": 128000,
"modalities": {
"image": true
},
"customHeaders": {
"X-Client-Request-ID": "req-123"
},
"extra_body": {
"enable_thinking": true,
"service_tier": "priority"
},
"samplingParams": {
"temperature": 0.2,
"top_p": 0.8,
"max_tokens": 4096,
"presence_penalty": 0.1,
"frequency_penalty": 0.1
}
}
},
{
"id": "gpt-4o-mini",
"name": "GPT-4o Mini",
"envKey": "OPENAI_API_KEY",
"baseUrl": "https://api.openai.com/v1",
"generationConfig": {
"timeout": 30000,
"samplingParams": {
"temperature": 0.5,
"max_tokens": 2048
}
}
},
{
"id": "openai/gpt-4o",
"name": "GPT-4o (via OpenRouter)",
"envKey": "OPENROUTER_API_KEY",
"baseUrl": "https://openrouter.ai/api/v1",
"generationConfig": {
"timeout": 120000,
"maxRetries": 3,
"samplingParams": {
"temperature": 0.7
}
}
},
{
"id": "openai/gpt-4o-mini",
"name": "GPT-4o Mini (via Requesty)",
"envKey": "REQUESTY_API_KEY",
"baseUrl": "https://router.requesty.ai/v1",
"generationConfig": {
"timeout": 120000,
"maxRetries": 3,
"samplingParams": {
"temperature": 0.7
}
}
}
]
}
}
}Anthropic (anthropic)
{
"env": {
"ANTHROPIC_API_KEY": "sk-ant-votre-cle-anthropic-reelle-ici"
},
"modelProviders": {
"anthropic": {
"protocol": "anthropic",
"models": [
{
"id": "claude-3-5-sonnet",
"name": "Claude 3.5 Sonnet",
"envKey": "ANTHROPIC_API_KEY",
"baseUrl": "https://api.anthropic.com/v1",
"generationConfig": {
"timeout": 120000,
"maxRetries": 3,
"contextWindowSize": 200000,
"samplingParams": {
"temperature": 0.7,
"max_tokens": 8192,
"top_p": 0.9
}
}
},
{
"id": "claude-3-opus",
"name": "Claude 3 Opus",
"envKey": "ANTHROPIC_API_KEY",
"baseUrl": "https://api.anthropic.com/v1",
"generationConfig": {
"timeout": 180000,
"samplingParams": {
"temperature": 0.3,
"max_tokens": 4096
}
}
}
]
}
}
}Google Gemini (gemini)
{
"env": {
"GEMINI_API_KEY": "AIza-votre-cle-gemini-reelle-ici"
},
"modelProviders": {
"gemini": {
"protocol": "gemini",
"models": [
{
"id": "gemini-2.0-flash",
"name": "Gemini 2.0 Flash",
"envKey": "GEMINI_API_KEY",
"baseUrl": "https://generativelanguage.googleapis.com",
"capabilities": {
"vision": true
},
"generationConfig": {
"timeout": 60000,
"maxRetries": 2,
"contextWindowSize": 1000000,
"schemaCompliance": "auto",
"samplingParams": {
"temperature": 0.4,
"top_p": 0.95,
"max_tokens": 8192,
"top_k": 40
}
}
}
]
}
}
}Modèles auto-hébergés locaux (via API compatible OpenAI)
La plupart des serveurs d’inférence locaux (vLLM, Ollama, LM Studio, etc.) fournissent un point de terminaison d’API compatible OpenAI. Configurez-les en utilisant le type d’authentification openai avec un baseUrl local :
{
"env": {
"OLLAMA_API_KEY": "ollama",
"VLLM_API_KEY": "not-needed",
"LMSTUDIO_API_KEY": "lm-studio"
},
"modelProviders": {
"openai": {
"protocol": "openai",
"models": [
{
"id": "qwen2.5-7b",
"name": "Qwen2.5 7B (Ollama)",
"envKey": "OLLAMA_API_KEY",
"baseUrl": "http://localhost:11434/v1",
"generationConfig": {
"timeout": 300000,
"maxRetries": 1,
"contextWindowSize": 32768,
"samplingParams": {
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 4096
}
}
},
{
"id": "llama-3.1-8b",
"name": "Llama 3.1 8B (vLLM)",
"envKey": "VLLM_API_KEY",
"baseUrl": "http://localhost:8000/v1",
"generationConfig": {
"timeout": 120000,
"maxRetries": 2,
"contextWindowSize": 128000,
"samplingParams": {
"temperature": 0.6,
"max_tokens": 8192
}
}
},
{
"id": "local-model",
"name": "Modèle local (LM Studio)",
"envKey": "LMSTUDIO_API_KEY",
"baseUrl": "http://localhost:1234/v1",
"generationConfig": {
"timeout": 60000,
"samplingParams": {
"temperature": 0.5
}
}
}
]
}
}
}Pour les serveurs locaux qui ne nécessitent pas d’authentification, vous pouvez utiliser n’importe quelle valeur factice pour la clé API :
# Pour Ollama (aucune authentification requise)
export OLLAMA_API_KEY="ollama"
# Pour vLLM (si aucune authentification n'est configurée)
export VLLM_API_KEY="not-needed"Le paramètre extra_body est uniquement pris en charge pour les fournisseurs compatibles OpenAI (openai, qwen-oauth). Il est ignoré pour les fournisseurs Anthropic et Gemini.
À propos de envKey : Le champ envKey spécifie le nom d’une variable d’environnement, pas la valeur réelle de la clé API. Pour que la configuration fonctionne, vous devez vous assurer que la variable d’environnement correspondante est définie avec votre vraie clé API. Il y a deux façons de procéder :
- Option 1 : Utiliser un fichier
.env(recommandé pour la sécurité) :Assurez-vous d’ajouter# ~/.qwen/.env (ou racine du projet) OPENAI_API_KEY=sk-votre-cle-reelle-ici.envà votre.gitignorepour éviter de commettre accidentellement des secrets. - Option 2 : Utiliser le champ
envdanssettings.json(comme montré dans les exemples ci-dessus) :{ "env": { "OPENAI_API_KEY": "sk-votre-cle-reelle-ici" } }
Chaque exemple de fournisseur inclut un champ env pour illustrer comment la clé API doit être configurée.
Alibaba Cloud Coding Plan
Alibaba Cloud Coding Plan fournit un ensemble préconfiguré de modèles Qwen optimisés pour les tâches de codage. Cette fonctionnalité est disponible pour les utilisateurs ayant un accès API à Alibaba Cloud Coding Plan et offre une expérience de configuration simplifiée avec des mises à jour automatiques de la configuration des modèles.
Aperçu
Lorsque vous vous authentifiez avec une clé API Alibaba Cloud Coding Plan à l’aide de la commande /auth, Qwen Code configure automatiquement les modèles suivants :
| ID du modèle | Nom | Description |
|---|---|---|
qwen3.5-plus | qwen3.5-plus | Modèle avancé avec réflexion activée |
qwen3.6-plus | qwen3.6-plus | Dernier modèle avec réflexion activée (abonnés Pro uniquement) |
qwen3.7-plus | qwen3.7-plus | Modèle avancé avec réflexion activée |
qwen3-coder-plus | qwen3-coder-plus | Optimisé pour les tâches de codage |
qwen3-coder-next | qwen3-coder-next | Modèle de codage expérimental |
qwen3-max-2026-01-23 | qwen3-max-2026-01-23 | Dernier modèle max avec réflexion activée |
glm-5 | glm-5 | Modèle GLM avec réflexion activée |
glm-4.7 | glm-4.7 | Modèle GLM avec réflexion activée |
kimi-k2.5 | kimi-k2.5 | Modèle Kimi avec réflexion et prise en charge vision/vidéo |
MiniMax-M2.5 | MiniMax-M2.5 | Modèle MiniMax avec réflexion activée |
Configuration
- Obtenez une clé API Alibaba Cloud Coding Plan :
- Exécutez la commande
/authdans Qwen Code - Sélectionnez Alibaba ModelStudio, puis choisissez Coding Plan dans le sous-menu
- Sélectionnez votre région
- Saisissez votre clé API lorsque vous y êtes invité
Les modèles seront automatiquement configurés et ajoutés à votre sélecteur /model.
Régions
Alibaba Cloud Coding Plan prend en charge deux régions :
| Région | Point de terminaison | Description |
|---|---|---|
| Chine | https://coding.dashscope.aliyuncs.com/v1 | Point de terminaison Chine continentale |
| Global/International | https://coding-intl.dashscope.aliyuncs.com/v1 | Point de terminaison international |
La région est sélectionnée lors de l’authentification et stockée dans settings.json sous la configuration modelProviders. Pour changer de région, réexécutez la commande /auth et sélectionnez une région différente.
Stockage de la clé API
Lorsque vous configurez Coding Plan via la commande /auth, la clé API est stockée en utilisant le nom de variable d’environnement réservé BAILIAN_CODING_PLAN_API_KEY. Par défaut, elle est stockée dans le champ env de votre fichier settings.json.
Recommandation de sécurité : Pour une meilleure sécurité, il est recommandé de déplacer la clé API de settings.json vers un fichier .env séparé et de la charger en tant que variable d’environnement. Par exemple :
# ~/.qwen/.env
BAILIAN_CODING_PLAN_API_KEY=votre-cle-api-iciAssurez-vous ensuite que ce fichier est ajouté à votre .gitignore si vous utilisez des paramètres au niveau du projet.
Mises à jour automatiques
Les configurations de modèle Coding Plan sont versionnées. Lorsque Qwen Code détecte une version plus récente du modèle de modèle, vous serez invité à mettre à jour. Accepter la mise à jour effectuera les opérations suivantes :
- Remplacer les configurations de modèle Coding Plan existantes par les dernières versions
- Préserver toutes les configurations de modèle personnalisées que vous avez ajoutées manuellement
- Basculer automatiquement vers le premier modèle de la configuration mise à jour
Le processus de mise à jour garantit que vous avez toujours accès aux dernières configurations et fonctionnalités de modèle sans intervention manuelle.
Configuration manuelle (Avancé)
Si vous préférez configurer manuellement les modèles Coding Plan, vous pouvez les ajouter à votre settings.json comme n’importe quel fournisseur compatible OpenAI :
{
"modelProviders": {
"openai": {
"protocol": "openai",
"models": [
{
"id": "qwen3-coder-plus",
"name": "qwen3-coder-plus",
"description": "Qwen3-Coder via Alibaba Cloud Coding Plan",
"envKey": "VOTRE_CLE_ENV_PERSONNALISEE",
"baseUrl": "https://coding.dashscope.aliyuncs.com/v1"
}
]
}
}
}Lors de l’utilisation d’une configuration manuelle :
- Vous pouvez utiliser n’importe quel nom de variable d’environnement pour
envKey - Vous n’avez pas besoin de configurer
codingPlan.* - Les mises à jour automatiques ne s’appliqueront pas aux modèles Coding Plan configurés manuellement
Si vous utilisez également la configuration automatique Coding Plan, les mises à jour automatiques peuvent écraser vos configurations manuelles si elles utilisent le même envKey et baseUrl que la configuration automatique. Pour éviter cela, assurez-vous que votre configuration manuelle utilise un envKey différent si possible.
Couches de résolution et atomicité
Les valeurs effectives d’auth/model/credential sont choisies par champ en utilisant la priorité suivante (la première présente l’emporte). Vous pouvez combiner --auth-type avec --model pour pointer directement vers une entrée de fournisseur ; ces indicateurs CLI s’exécutent avant les autres couches.
| Couche (la plus élevée → la plus basse) | authType | model | apiKey | baseUrl | apiKeyEnvKey | proxy |
|---|---|---|---|---|---|---|
| Remplacements programmatiques | /auth | Saisie /auth | Saisie /auth | Saisie /auth | — | — |
| Sélection du fournisseur de modèle | — | modelProvider.id | env[modelProvider.envKey] | modelProvider.baseUrl | modelProvider.envKey | — |
| Arguments CLI | --auth-type | --model | --openai-api-key (ou équivalents spécifiques au fournisseur) | --openai-base-url (ou équivalents spécifiques au fournisseur) | — | — |
| Variables d’environnement | — | Mappage spécifique au fournisseur (ex. OPENAI_MODEL) | Mappage spécifique au fournisseur (ex. OPENAI_API_KEY) | Mappage spécifique au fournisseur (ex. OPENAI_BASE_URL) | — | — |
Paramètres (settings.json) | security.auth.selectedType | model.name | security.auth.apiKey | security.auth.baseUrl | — | — |
| Par défaut / calculé | Tombe sur AuthType.QWEN_OAUTH | Par défaut intégré (OpenAI ⇒ qwen3.5-plus) | — | — | — | Config.getProxy() si configuré |
*Lorsqu’ils sont présents, les indicateurs d’authentification CLI remplacent les paramètres. Sinon, security.auth.selectedType ou la valeur implicite par défaut déterminent le type d’authentification. Qwen OAuth et OpenAI sont les seuls types d’authentification disponibles sans configuration supplémentaire. |
Obsolescence de security.auth.apiKey et security.auth.baseUrl : La configuration directe des identifiants API via security.auth.apiKey et security.auth.baseUrl dans settings.json est obsolète. Ces paramètres étaient utilisés dans les versions historiques pour les identifiants saisis via l’interface utilisateur, mais le flux de saisie des identifiants a été supprimé dans la version 0.10.1. Ces champs seront complètement supprimés dans une version future. Il est fortement recommandé de migrer vers modelProviders pour toutes les configurations de modèle et d’identifiants. Utilisez envKey dans modelProviders pour référencer des variables d’environnement afin de gérer les identifiants de manière sécurisée, au lieu de coder en dur les identifiants dans les fichiers de paramètres.
Hiérarchisation de la configuration de génération : La couche fournisseur imperméable
La résolution de la configuration suit un modèle de hiérarchisation strict avec une règle cruciale : la couche modelProvider est imperméable.
Fonctionnement
-
Lorsqu’un modèle de modelProvider EST sélectionné (par exemple, via la commande
/modelchoisissant un modèle configuré par un fournisseur) :- L’intégralité du
generationConfigdu fournisseur est appliquée atomiquement - La couche fournisseur est complètement imperméable — les couches inférieures (CLI, env, settings) ne participent pas du tout à la résolution de generationConfig
- Tous les champs définis dans
modelProviders[].generationConfigutilisent les valeurs du fournisseur - Tous les champs non définis par le fournisseur sont mis à
undefined(non hérités des paramètres) - Cela garantit que les configurations des fournisseurs agissent comme un « package scellé » complet et autonome
Si un modèle est listé dans
modelProviders, placez tous les paramètres de génération spécifiques à ce modèle dans l’entrée fournisseur correspondante. Les valeurs demodel.generationConfigde niveau supérieur, y compriscontextWindowSize,modalities,customHeadersetextra_body, sont ignorées pour les modèles de fournisseur. Configurez ces champs sousmodelProviders[authType][].generationConfigpour qu’ils s’appliquent. - L’intégralité du
-
Lorsqu’aucun modèle modelProvider n’est sélectionné (par exemple, en utilisant
--modelavec un ID de modèle brut, ou directement via CLI/env/settings) :- La résolution descend à travers les couches inférieures
- Les champs sont renseignés à partir de CLI → env → settings → valeurs par défaut
- Cela crée un Runtime Model (voir la section suivante)
Priorité par champ pour generationConfig
| Priorité | Source | Comportement |
|---|---|---|
| 1 | Surcharges programmatiques | Modifications runtime /model, /auth |
| 2 | modelProviders[authType][].generationConfig | Couche imperméable - remplace complètement tous les champs generationConfig ; les couches inférieures ne participent pas |
| 3 | settings.model.generationConfig | Utilisé uniquement pour les Runtime Models (lorsqu’aucun modèle fournisseur n’est sélectionné) |
| 4 | Valeurs par défaut du générateur de contenu | Valeurs par défaut spécifiques au fournisseur (ex. OpenAI vs Gemini) - uniquement pour les Runtime Models |
Traitement atomique des champs
Les champs suivants sont traités comme des objets atomiques - les valeurs du fournisseur remplacent complètement l’objet entier, aucune fusion n’est effectuée :
samplingParams- Température, top_p, max_tokens, etc.customHeaders- En-têtes HTTP personnalisésextra_body- Paramètres supplémentaires du corps de la requête
Exemple
// Paramètres utilisateur (~/.qwen/settings.json)
{
"model": {
"generationConfig": {
"timeout": 30000,
"samplingParams": { "temperature": 0.5, "max_tokens": 1000 }
}
}
}
// Configuration modelProviders
{
"modelProviders": {
"openai": {
"protocol": "openai",
"models": [{
"id": "gpt-4o",
"envKey": "OPENAI_API_KEY",
"generationConfig": {
"timeout": 60000,
"samplingParams": { "temperature": 0.2 }
}
}]
}
}
}Lorsque gpt-4o est sélectionné depuis modelProviders :
timeout= 60000 (du fournisseur, remplace les paramètres)samplingParams.temperature= 0.2 (du fournisseur, remplace complètement l’objet des paramètres)samplingParams.max_tokens= undefined (non défini dans le fournisseur, et la couche fournisseur n’hérite pas des paramètres — les champs sont explicitement mis à undefined s’ils ne sont pas fournis)
Lors de l’utilisation d’un modèle brut via --model gpt-4 (pas depuis modelProviders, crée un Runtime Model) :
timeout= 30000 (depuis les paramètres)samplingParams.temperature= 0.5 (depuis les paramètres)samplingParams.max_tokens= 1000 (depuis les paramètres)
La stratégie de fusion pour modelProviders elle-même est REPLACE : l’intégralité de modelProviders des paramètres du projet remplacera la section correspondante dans les paramètres utilisateur, plutôt que de fusionner les deux.
Configuration du raisonnement / de la réflexion
Le champ optionnel reasoning sous generationConfig contrôle l’agressivité avec laquelle le modèle raisonne avant de répondre. Les convertisseurs Anthropic et Gemini le respectent toujours. Le pipeline compatible OpenAI le respecte sauf si generationConfig.samplingParams est défini — voir la mise en garde « Interaction avec samplingParams » ci-dessous.
{
"modelProviders": {
"openai": {
"protocol": "openai",
"models": [
{
"id": "deepseek-v4-pro",
"name": "DeepSeek V4 Pro",
"baseUrl": "https://api.deepseek.com/v1",
"envKey": "DEEPSEEK_API_KEY",
"generationConfig": {
// Échelle à quatre niveaux :
// 'low' | 'medium' — mappé côté serveur vers 'high' sur DeepSeek
// 'high' — intensité de raisonnement par défaut
// 'max' — niveau supplémentaire propre à DeepSeek
// Ou définir `false` pour désactiver complètement le raisonnement.
"reasoning": { "effort": "max" },
},
},
],
},
},
}Comportement par fournisseur
| Protocole / fournisseur | Forme sur le fil | Notes |
|---|---|---|
OpenAI / DeepSeek (api.deepseek.com) | Paramètre plat reasoning_effort: <effort> dans le body | Lorsque reasoning.effort est défini dans la forme de configuration imbriquée, il est réécrit en reasoning_effort plat et 'low'/'medium' sont normalisés en 'high', 'xhigh' en 'max' — reflétant la rétrocompatibilité côté serveur de DeepSeek. Les surcharges de niveau supérieur samplingParams.reasoning_effort ou extra_body.reasoning_effort ignorent cette normalisation et sont transmises textuellement. |
| OpenAI (autres serveurs compatibles) | reasoning: { effort, ... } transmis textuellement | Défini via samplingParams (ex. samplingParams.reasoning_effort pour GPT-5/série o) lorsque le fournisseur attend une forme différente. |
Anthropic (vrai api.anthropic.com) | output_config: { effort } plus l’en-tête beta effort-2025-11-24 | Le vrai Anthropic n’accepte que 'low'/'medium'/'high'. 'max' est limité à 'high' avec une ligne debugLogger.warn (une fois par générateur) ; si vous voulez un effort maximal, changez l’URL de base vers un point de terminaison compatible DeepSeek qui le prend en charge. |
Anthropic (api.deepseek.com/anthropic) | Même output_config: { effort } + en-tête beta | 'max' est transmis inchangé. |
Gemini (@google/genai) | thinkingConfig: { includeThoughts: true, thinkingLevel } | 'low' → LOW, 'high'/'max' → HIGH, autres → THINKING_LEVEL_UNSPECIFIED (Gemini n’a pas de niveau MAX). |
reasoning: false
Définir reasoning: false (le booléen littéral) désactive explicitement la réflexion sur chaque fournisseur — utile pour les requêtes secondaires peu coûteuses qui ne bénéficient pas du raisonnement. Ceci est également respecté au niveau de la requête via request.config.thinkingConfig.includeThoughts: false pour les appels ponctuels (par exemple, la génération de suggestions).
Sur une URL de base api.deepseek.com, le pipeline OpenAI émet le champ explicite thinking: { type: 'disabled' } que DeepSeek V4+ exige — la valeur par défaut côté serveur est 'enabled', donc simplement omettre reasoning_effort paierait toujours la latence/le coût de la réflexion. Les backends DeepSeek auto-hébergés (sglang/vllm) et les autres serveurs compatibles OpenAI ne reçoivent pas ce champ ; si vous devez désactiver la réflexion sur ceux-ci, injectez thinking: { type: 'disabled' } (ou tout autre paramètre exposé par votre framework d’inférence) via samplingParams/extra_body.
Interaction avec samplingParams (compatible OpenAI uniquement)
Lorsque generationConfig.samplingParams est défini sur un fournisseur compatible OpenAI, le pipeline envoie ces clés sur le fil textuellement et ignore complètement l’injection séparée de reasoning. Ainsi, une configuration comme { samplingParams: { temperature: 0.5 }, reasoning: { effort: 'max' } } supprimera silencieusement le champ reasoning dans les requêtes OpenAI/DeepSeek.
Si vous définissez samplingParams, incluez le paramètre de raisonnement directement à l’intérieur — pour DeepSeek, cela signifie samplingParams.reasoning_effort, pour GPT-5/série o, c’est samplingParams.reasoning_effort (leur champ plat) ou samplingParams.reasoning (l’objet imbriqué). Pour OpenRouter et d’autres fournisseurs, le nom du champ varie ; consultez la documentation du fournisseur.
Les convertisseurs Anthropic et Gemini ne sont pas affectés — ils lisent toujours directement reasoning.effort indépendamment de samplingParams.
budget_tokens
Vous pouvez fixer un budget exact de jetons de réflexion en incluant budget_tokens avec effort :
"reasoning": { "effort": "high", "budget_tokens": 50000 }Pour Anthropic, cela devient thinking.budget_tokens. Pour OpenAI/DeepSeek, le champ est conservé mais actuellement ignoré par le serveur — reasoning_effort est le paramètre déterminant.
Provider Models vs Runtime Models
Qwen Code distingue deux types de configurations de modèles :
Provider Model
- Défini dans la configuration
modelProviders - Possède un package de configuration complet et atomique
- Lorsqu’il est sélectionné, sa configuration est appliquée comme une couche imperméable
- Apparaît dans la liste de la commande
/modelavec les métadonnées complètes (nom, description, capacités) - Recommandé pour les flux de travail multi-modèles et la cohérence d’équipe
Runtime Model
- Créé dynamiquement lors de l’utilisation d’ID de modèles bruts via CLI (
--model), variables d’environnement ou paramètres - Non défini dans
modelProviders - La configuration est construite en « projetant » à travers les couches de résolution (CLI → env → settings → valeurs par défaut)
- Automatiquement capturé en tant que RuntimeModelSnapshot lorsqu’une configuration complète est détectée
- Permet la réutilisation sans avoir à ressaisir les identifiants
Cycle de vie de RuntimeModelSnapshot
Lorsque vous configurez un modèle sans utiliser modelProviders, Qwen Code crée automatiquement un RuntimeModelSnapshot pour préserver votre configuration :
# Ceci crée un RuntimeModelSnapshot avec l'ID : $runtime|openai|my-custom-model
qwen --auth-type openai --model my-custom-model --openai-api-key $KEY --openai-base-url https://api.example.com/v1Le snapshot :
- Capture l’ID du modèle, la clé API, l’URL de base et la configuration de génération
- Persiste entre les sessions (stocké en mémoire pendant l’exécution)
- Apparaît dans la liste de la commande
/modelcomme une option runtime - Peut être activé en utilisant
/model $runtime|openai|my-custom-model
Différences clés
| Aspect | Provider Model | Runtime Model |
|---|---|---|
| Source de configuration | modelProviders dans les paramètres | Couches CLI, env, settings |
| Atomicité de configuration | Package complet et imperméable | Hiérarchisé, chaque champ résolu indépendamment |
| Réutilisabilité | Toujours disponible dans la liste /model | Capturé comme snapshot, apparaît si complet |
| Partage en équipe | Oui (via les paramètres validés) | Non (local à l’utilisateur) |
| Stockage des identifiants | Référence via envKey uniquement | Peut capturer la clé réelle dans le snapshot |
Quand utiliser l’un ou l’autre
- Utilisez Provider Models lorsque : Vous avez des modèles standard partagés au sein d’une équipe, avez besoin de configurations cohérentes, ou souhaitez éviter les remplacements accidentels
- Utilisez Runtime Models lorsque : Vous testez rapidement un nouveau modèle, utilisez des identifiants temporaires, ou travaillez avec des endpoints ad-hoc
Persistance de la sélection et recommandations
Définissez modelProviders dans le scope utilisateur ~/.qwen/settings.json autant que possible et évitez de persister des remplacements d’identifiants dans n’importe quel scope. Garder le catalogue de fournisseurs dans les paramètres utilisateur empêche les conflits de fusion/remplacement entre les scopes projet et utilisateur et garantit que les mises à jour de /auth et /model écrivent toujours dans un scope cohérent.
- Les commandes
/modelet/authpersistentmodel.name(le cas échéant) etsecurity.auth.selectedTypedans le scope inscriptible le plus proche qui définit déjàmodelProviders; sinon, elles tombent en arrière sur le scope utilisateur. Cela maintient la synchronisation des fichiers de l’espace de travail/utilisateur avec le catalogue de fournisseurs actif. - Sans
modelProviders, le résolveur mélange les couches CLI/env/settings, créant des Runtime Models. C’est acceptable pour les configurations à fournisseur unique, mais fastidieux lors de changements fréquents. Définissez des catalogues de fournisseurs dès que les flux de travail multi-modèles sont courants afin que les changements restent atomiques, attribués à une source et débogables.