Provedores de Modelos
O Qwen Code permite configurar vários provedores de modelos por meio da configuração modelProviders no seu settings.json. Isso permite alternar entre diferentes modelos e provedores de IA usando o comando /model.
Visão Geral
Use modelProviders para declarar modelos por tipo de autenticação que podem ser alternados no seletor /model. As chaves devem ser tipos de autenticação válidos (openai, anthropic, gemini, etc.). Cada tipo de autenticação mapeia para um objeto ProviderConfig com um campo protocol e um campo models (o array de definições de modelos). Cada entrada em models requer um id; envKey é opcional e recomendado (quando omitido, usa a chave de ambiente padrão do tipo de autenticação, por exemplo, OPENAI_API_KEY para openai), com name, description, baseUrl e generationConfig opcionais. As credenciais nunca são persistidas nas configurações; o runtime as lê de process.env[envKey]. Os modelos Qwen OAuth permanecem hard-coded e não podem ser sobrescritos.
Apenas o comando /model expõe tipos de autenticação não padrão. Anthropic, Gemini, etc., devem ser definidos via modelProviders. O comando /auth lista três opções de nível superior: Alibaba ModelStudio (com Coding Plan, Token Plan e Standard API Key em seu submenu), Provedores de Terceiros e Provedor Personalizado. (O Qwen OAuth não é mais uma entrada selecionável no diálogo; seu plano gratuito foi descontinuado em 15/04/2026.)
Unicidade do modelo: Modelos dentro do mesmo authType são identificados exclusivamente pela combinação de id + baseUrl. Isso significa que você pode definir o mesmo ID de modelo (por exemplo, "gpt-4o") várias vezes sob um único authType, desde que cada entrada tenha um baseUrl diferente — por exemplo, um apontando diretamente para a OpenAI e outro para um endpoint de proxy. Se duas entradas compartilharem o mesmo id e o mesmo baseUrl (ou ambas omitirem o baseUrl), a primeira ocorrência prevalece e as duplicatas subsequentes são ignoradas com um aviso.
Exemplos de Configuração por Tipo de Autenticação
Abaixo estão exemplos abrangentes de configuração para diferentes tipos de autenticação, mostrando os parâmetros disponíveis e suas combinações.
Tipos de Autenticação Suportados
As chaves do objeto modelProviders devem ser valores válidos de authType. Os tipos de autenticação suportados atualmente são:
| Auth Type | Description |
|---|---|
openai | APIs compatíveis com OpenAI (OpenAI, Azure OpenAI, servidores de inferência locais como vLLM/Ollama) |
anthropic | API Anthropic Claude |
gemini | API Google Gemini |
qwen-oauth | Qwen OAuth (hard-coded, não pode ser sobrescrito em modelProviders) |
vertex-ai | Google Vertex AI (usa o protocolo gemini e o SDK @google/genai no modo Vertex AI; selecioná-lo define GOOGLE_GENAI_USE_VERTEXAI=true) |
[!warning] Se uma chave de tipo de autenticação desconhecida for usada (por exemplo, um erro de digitação como
"openai-custom"), uma chave não vazia é aceita como está em seu próprio grupo de tipo de autenticação, mas não mapeará para um protocolo conhecido — portanto, seus modelos não funcionarão como pretendido e não se comportarão corretamente no seletor/model. Apenas chaves em branco (vazias ou apenas com espaços em branco) são ignoradas. Sempre use um dos valores de tipo de autenticação suportados listados acima.
SDKs Usados para Requisições de API
O Qwen Code usa os seguintes SDKs oficiais para enviar requisições para cada provedor:
| Auth Type | SDK Package |
|---|---|
openai | openai - SDK oficial OpenAI para Node.js |
anthropic | @anthropic-ai/sdk - SDK oficial Anthropic |
gemini | @google/genai - SDK oficial Google GenAI |
qwen-oauth | openai com provedor personalizado (compatível com DashScope) |
Isso significa que o baseUrl configurado deve ser compatível com o formato de API esperado pelo SDK correspondente. Por exemplo, ao usar o tipo de autenticação openai, o endpoint deve aceitar requisições no formato da API OpenAI.
Provedores compatíveis com OpenAI (openai)
Este tipo de autenticação suporta não apenas a API oficial da OpenAI, mas também qualquer endpoint compatível com OpenAI, incluindo provedores de modelos agregados como OpenRouter e Requesty.
{
"env": {
"OPENAI_API_KEY": "sk-your-actual-openai-key-here",
"OPENROUTER_API_KEY": "sk-or-your-actual-openrouter-key-here",
"REQUESTY_API_KEY": "sk-your-actual-requesty-key-here"
},
"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-your-actual-anthropic-key-here"
},
"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-your-actual-gemini-key-here"
},
"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
}
}
}
]
}
}
}Modelos Auto-hospedados Locais (via API compatível com OpenAI)
A maioria dos servidores de inferência locais (vLLM, Ollama, LM Studio, etc.) fornece um endpoint de API compatível com OpenAI. Configure-os usando o tipo de autenticação openai com um 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": "Local Model (LM Studio)",
"envKey": "LMSTUDIO_API_KEY",
"baseUrl": "http://localhost:1234/v1",
"generationConfig": {
"timeout": 60000,
"samplingParams": {
"temperature": 0.5
}
}
}
]
}
}
}Para servidores locais que não requerem autenticação, você pode usar qualquer valor de espaço reservado (placeholder) para a chave de API:
# For Ollama (no auth required)
export OLLAMA_API_KEY="ollama"
# For vLLM (if no auth is configured)
export VLLM_API_KEY="not-needed"O parâmetro extra_body é suportado apenas para provedores compatíveis com OpenAI (openai, qwen-oauth). Ele é ignorado para os provedores Anthropic e Gemini.
Sobre envKey: O campo envKey especifica o nome de uma variável de ambiente, não o valor real da chave de API. Para que a configuração funcione, você precisa garantir que a variável de ambiente correspondente esteja definida com sua chave de API real. Há duas maneiras de fazer isso:
- Opção 1: Usando um arquivo
.env(recomendado por segurança):Certifique-se de adicionar# ~/.qwen/.env (ou raiz do projeto) OPENAI_API_KEY=sk-your-actual-key-here.envao seu.gitignorepara evitar o commit acidental de secrets. - Opção 2: Usando o campo
envnosettings.json(como mostrado nos exemplos acima):{ "env": { "OPENAI_API_KEY": "sk-your-actual-key-here" } }
Cada exemplo de provedor inclui um campo env para ilustrar como a chave de API deve ser configurada.
Alibaba Cloud Coding Plan
O Alibaba Cloud Coding Plan oferece um conjunto pré-configurado de modelos Qwen otimizados para tarefas de codificação. Este recurso está disponível para usuários com acesso à API do Alibaba Cloud Coding Plan e oferece uma experiência de configuração simplificada com atualizações automáticas da configuração dos modelos.
Visão geral
Ao autenticar com uma chave de API do Alibaba Cloud Coding Plan usando o comando /auth, o Qwen Code configura automaticamente os seguintes modelos:
| ID do modelo | Nome | Descrição |
|---|---|---|
qwen3.5-plus | qwen3.5-plus | Modelo avançado com raciocínio ativado |
qwen3.6-plus | qwen3.6-plus | Modelo mais recente com raciocínio ativado (apenas para assinantes Pro) |
qwen3.7-plus | qwen3.7-plus | Modelo avançado com raciocínio ativado |
qwen3-coder-plus | qwen3-coder-plus | Otimizado para tarefas de codificação |
qwen3-coder-next | qwen3-coder-next | Modelo experimental de codificação |
qwen3-max-2026-01-23 | qwen3-max-2026-01-23 | Modelo max mais recente com raciocínio ativado |
glm-5 | glm-5 | Modelo GLM com raciocínio ativado |
glm-4.7 | glm-4.7 | Modelo GLM com raciocínio ativado |
kimi-k2.5 | kimi-k2.5 | Modelo Kimi com raciocínio e suporte a visão/vídeo |
MiniMax-M2.5 | MiniMax-M2.5 | Modelo MiniMax com raciocínio ativado |
Configuração
- Obtenha uma chave de API do Alibaba Cloud Coding Plan:
- Execute o comando
/authno Qwen Code - Selecione Alibaba ModelStudio e, em seguida, escolha Coding Plan no submenu
- Selecione sua região
- Insira sua chave de API quando solicitado
Os modelos serão configurados automaticamente e adicionados ao seu seletor /model.
Regiões
O Alibaba Cloud Coding Plan oferece suporte a duas regiões:
| Região | Endpoint | Descrição |
|---|---|---|
| China | https://coding.dashscope.aliyuncs.com/v1 | Endpoint da China continental |
| Global/Internacional | https://coding-intl.dashscope.aliyuncs.com/v1 | Endpoint internacional |
A região é selecionada durante a autenticação e armazenada em settings.json na configuração modelProviders. Para alternar regiões, execute o comando /auth novamente e selecione uma região diferente.
Armazenamento da chave de API
Ao configurar o Coding Plan por meio do comando /auth, a chave de API é armazenada usando o nome de variável de ambiente reservado BAILIAN_CODING_PLAN_API_KEY. Por padrão, ela é armazenada no campo env do seu arquivo settings.json.
Recomendação de segurança: Para uma segurança melhor, recomenda-se mover a chave de API do settings.json para um arquivo .env separado e carregá-la como uma variável de ambiente. Por exemplo:
# ~/.qwen/.env
BAILIAN_CODING_PLAN_API_KEY=sua-chave-de-api-aquiEm seguida, certifique-se de que este arquivo foi adicionado ao seu .gitignore se você estiver usando configurações no nível do projeto.
Atualizações automáticas
As configurações dos modelos do Coding Plan são versionadas. Quando o Qwen Code detecta uma versão mais recente do template do modelo, você será solicitado a atualizar. Aceitar a atualização irá:
- Substituir as configurações existentes dos modelos do Coding Plan pelas versões mais recentes
- Preservar quaisquer configurações de modelos personalizados que você adicionou manualmente
- Alternar automaticamente para o primeiro modelo na configuração atualizada
O processo de atualização garante que você sempre tenha acesso às configurações e aos recursos de modelos mais recentes sem intervenção manual.
Configuração manual (Avançado)
Se preferir configurar manualmente os modelos do Coding Plan, você pode adicioná-los ao seu settings.json como qualquer provedor compatível com OpenAI:
{
"modelProviders": {
"openai": {
"protocol": "openai",
"models": [
{
"id": "qwen3-coder-plus",
"name": "qwen3-coder-plus",
"description": "Qwen3-Coder via Alibaba Cloud Coding Plan",
"envKey": "YOUR_CUSTOM_ENV_KEY",
"baseUrl": "https://coding.dashscope.aliyuncs.com/v1"
}
]
}
}
}Ao usar a configuração manual:
- Você pode usar qualquer nome de variável de ambiente para
envKey - Você não precisa configurar
codingPlan.* - As atualizações automáticas não se aplicarão aos modelos do Coding Plan configurados manualmente
Se você também usar a configuração automática do Coding Plan, as atualizações automáticas poderão substituir suas configurações manuais se elas usarem o mesmo envKey e baseUrl que a configuração automática. Para evitar isso, certifique-se de que sua configuração manual use um envKey diferente, se possível.
Camadas de Resolução e Atomicidade
Os valores efetivos de auth/model/credential são escolhidos por campo usando a seguinte precedência (o primeiro presente vence). Você pode combinar --auth-type com --model para apontar diretamente para uma entrada de provedor; essas flags de CLI são executadas antes de outras camadas.
| Camada (maior → menor prioridade) | authType | model | apiKey | baseUrl | apiKeyEnvKey | proxy |
|---|---|---|---|---|---|---|
| Substituições programáticas | /auth | Entrada do /auth | Entrada do /auth | Entrada do /auth | — | — |
| Seleção de provedor de modelo | — | modelProvider.id | env[modelProvider.envKey] | modelProvider.baseUrl | modelProvider.envKey | — |
| Argumentos de CLI | --auth-type | --model | --openai-api-key | --openai-base-url | — | — |
| Variáveis de ambiente | — | Mapeamento específico do provedor (ex.: OPENAI_MODEL) | Mapeamento específico do provedor (ex.: OPENAI_API_KEY) | Mapeamento específico do provedor (ex.: OPENAI_BASE_URL) | — | — |
Configurações (settings.json) | security.auth.selectedType | model.name | security.auth.apiKey | security.auth.baseUrl | — | — |
| Padrão / computado | Fallback para AuthType.QWEN_OAUTH | Padrão integrado (OpenAI ⇒ qwen3.5-plus) | — | — | — | Config.getProxy() se configurado |
*Quando presentes, as flags de auth de CLI substituem as configurações. Caso contrário, security.auth.selectedType ou o padrão implícito determinam o tipo de auth. Qwen OAuth e OpenAI são os únicos tipos de auth exibidos sem configuração extra.
--openai-api-key e --openai-base-url são as únicas flags de CLI de credenciais. Elas se aplicam ao provedor compatível com OpenAI ativo, independentemente do seu nome — não existem flags de credenciais --anthropic-* / --gemini-*. Credenciais específicas do provedor que não são passadas na CLI são resolvidas a partir de variáveis de ambiente (veja a linha abaixo).
Descontinuação de security.auth.apiKey e security.auth.baseUrl: Configurar diretamente as credenciais da API via security.auth.apiKey e security.auth.baseUrl no settings.json foi descontinuado. Essas configurações eram usadas em versões históricas para credenciais inseridas por meio da UI, mas o fluxo de entrada de credenciais foi removido na versão 0.10.1. Esses campos serão totalmente removidos em uma versão futura. É altamente recomendável migrar para modelProviders para todas as configurações de modelo e credenciais. Use envKey em modelProviders para referenciar variáveis de ambiente para um gerenciamento seguro de credenciais, em vez de codificá-las diretamente nos arquivos de configurações.
Camadas de Configuração de Geração: A Camada Impermeável do Provedor
A resolução de configuração segue um modelo de camadas estrito com uma regra crucial: a camada modelProvider é impermeável.
Como funciona
-
Quando um modelo modelProvider ESTÁ selecionado (por exemplo, via comando
/modelescolhendo um modelo configurado pelo provedor):- Todo o
generationConfigdo provedor é aplicado atomicamente - A camada do provedor é completamente impermeável — camadas inferiores (CLI, env, configurações) não participam da resolução do generationConfig
- Todos os campos definidos em
modelProviders[].generationConfigusam os valores do provedor - Todos os campos não definidos pelo provedor são definidos como
undefined(não herdados das configurações) - Isso garante que as configurações do provedor atuem como um “pacote selado” completo e autossuficiente
Se um modelo estiver listado em
modelProviders, coloque todas as configurações de geração específicas do modelo na entrada do provedor correspondente. Os valores demodel.generationConfigde nível superior, incluindocontextWindowSize,modalities,customHeaderseextra_body, são ignorados para modelos do provedor. Configure esses campos emmodelProviders[authType][].generationConfigpara que sejam aplicados. - Todo o
-
Quando NENHUM modelo modelProvider está selecionado (por exemplo, usando
--modelcom um ID de modelo bruto, ou usando CLI/env/configurações diretamente):- A resolução passa para as camadas inferiores
- Os campos são preenchidos de CLI → env → configurações → padrões
- Isso cria um Modelo de Runtime (veja a próxima seção)
Precedência por campo para generationConfig
| Prioridade | Origem | Comportamento |
|---|---|---|
| 1 | Substituições programáticas | Alterações de runtime /model, /auth |
| 2 | modelProviders[authType][].generationConfig | Camada impermeável - substitui completamente todos os campos de generationConfig; camadas inferiores não participam |
| 3 | settings.model.generationConfig | Usado apenas para Modelos de Runtime (quando nenhum modelo de provedor está selecionado) |
| 4 | Padrões do gerador de conteúdo | Padrões específicos do provedor (ex.: OpenAI vs Gemini) - apenas para Modelos de Runtime |
Tratamento de campos atômicos
Os seguintes campos são tratados como objetos atômicos - os valores do provedor substituem completamente o objeto inteiro, não ocorrendo mesclagem:
samplingParams- Temperature, top_p, max_tokens, etc.customHeaders- Cabeçalhos HTTP personalizadosextra_body- Parâmetros extras do corpo da requisição
Exemplo
// Configurações do usuário (~/.qwen/settings.json)
{
"model": {
"generationConfig": {
"timeout": 30000,
"samplingParams": { "temperature": 0.5, "max_tokens": 1000 }
}
}
}
// Configuração de modelProviders
{
"modelProviders": {
"openai": {
"protocol": "openai",
"models": [{
"id": "gpt-4o",
"envKey": "OPENAI_API_KEY",
"generationConfig": {
"timeout": 60000,
"samplingParams": { "temperature": 0.2 }
}
}]
}
}
}Quando gpt-4o é selecionado em modelProviders:
timeout= 60000 (do provedor, sobrescreve as configurações)samplingParams.temperature= 0.2 (do provedor, substitui completamente o objeto de configurações)samplingParams.max_tokens= undefined (não definido no provedor, e a camada do provedor não herda das configurações — os campos são explicitamente definidos como undefined se não forem fornecidos)
Ao usar um modelo bruto via --model gpt-4 (não proveniente de modelProviders, cria um Runtime Model):
timeout= 30000 (das configurações)samplingParams.temperature= 0.5 (das configurações)samplingParams.max_tokens= 1000 (das configurações)
A estratégia de mesclagem para o próprio modelProviders é REPLACE (substituir): todo o modelProviders das configurações do projeto substituirá a seção correspondente nas configurações do usuário, em vez de mesclar os dois.
Configuração de reasoning / thinking
O campo opcional reasoning em generationConfig controla o quão agressivamente o modelo raciocina antes de responder. Os conversores da Anthropic e do Gemini sempre o respeitam. O pipeline compatível com OpenAI o respeita a menos que generationConfig.samplingParams esteja definido — veja a ressalva “Interação com samplingParams” abaixo.
{
"modelProviders": {
"openai": {
"protocol": "openai",
"models": [
{
"id": "deepseek-v4-pro",
"name": "DeepSeek V4 Pro",
"baseUrl": "https://api.deepseek.com/v1",
"envKey": "DEEPSEEK_API_KEY",
"generationConfig": {
// A escala de quatro níveis:
// 'low' | 'medium' — mapeado pelo servidor para 'high' no DeepSeek
// 'high' — intensidade de raciocínio padrão
// 'max' — nível extra-forte específico do DeepSeek
// Ou defina como `false` para desativar o raciocínio completamente.
"reasoning": { "effort": "max" },
},
},
],
},
},
}Comportamento por provedor
| Protocolo / provedor | Formato na rede | Notas |
|---|---|---|
OpenAI / DeepSeek (api.deepseek.com) | Parâmetro de corpo plano reasoning_effort: <effort> | Quando reasoning.effort é definido na estrutura de configuração aninhada, ele é reescrito para o reasoning_effort plano e 'low'/'medium' são normalizados para 'high', 'xhigh' para 'max' — espelhando a compatibilidade retroativa do lado do servidor do DeepSeek. Substituições de samplingParams.reasoning_effort ou extra_body.reasoning_effort de nível superior ignoram essa normalização e são enviadas literalmente. |
| OpenAI (outros servidores compatíveis) | reasoning: { effort, ... } passado literalmente | Definido via samplingParams (por exemplo, samplingParams.reasoning_effort para GPT-5/série o) quando o provedor espera uma estrutura diferente. |
Anthropic (api.anthropic.com real) | output_config: { effort } mais o header beta effort-2025-11-24 | A Anthropic real aceita apenas 'low'/'medium'/'high'. 'max' é limitado a 'high' com uma linha de debugLogger.warn (uma vez por gerador); se você quiser o esforço máximo, mude o baseURL para um endpoint compatível com DeepSeek que o suporte. |
Anthropic (api.deepseek.com/anthropic) | Mesmo output_config: { effort } + header beta | 'max' é passado sem alterações. |
Gemini (@google/genai) | thinkingConfig: { includeThoughts: true, thinkingLevel } | 'low' → LOW, 'high'/'max' → HIGH, outros → THINKING_LEVEL_UNSPECIFIED (o Gemini não tem nível MAX). |
reasoning: false
Definir reasoning: false (o booleano literal) desativa explicitamente o thinking em todos os provedores — útil para consultas secundárias baratas que não se beneficiam do raciocínio. Isso também é respeitado no nível da requisição via request.config.thinkingConfig.includeThoughts: false para chamadas pontuais (por exemplo, geração de sugestões).
Em um baseURL api.deepseek.com, o pipeline OpenAI emite o campo explícito thinking: { type: 'disabled' } que o DeepSeek V4+ exige — o padrão do lado do servidor é 'enabled', então simplesmente omitir reasoning_effort ainda incorreria em latência/custo de thinking. Backends DeepSeek auto-hospedados (sglang/vllm) e outros servidores compatíveis com OpenAI não recebem este campo; se você precisar desativar o thinking neles, injete thinking: { type: 'disabled' } (ou qualquer outro controle que seu framework de inferência exponha) via samplingParams/extra_body.
Interação com samplingParams (apenas compatível com OpenAI)
Quando generationConfig.samplingParams é definido em um provedor compatível com OpenAI, o pipeline envia essas chaves para a rede literalmente e ignora completamente a injeção separada de reasoning. Portanto, uma configuração como { samplingParams: { temperature: 0.5 }, reasoning: { effort: 'max' } } descartará silenciosamente o campo de raciocínio nas requisições OpenAI/DeepSeek.
Se você definir samplingParams, inclua o controle de raciocínio diretamente dentro dele — para o DeepSeek é samplingParams.reasoning_effort, para GPT-5/série o é samplingParams.reasoning_effort (seu campo plano) ou samplingParams.reasoning (o objeto aninhado). Para OpenRouter e outros provedores, o nome do campo varia; consulte a documentação do provedor.
Os conversores da Anthropic e do Gemini não são afetados — eles sempre leem reasoning.effort diretamente, independentemente de samplingParams.
budget_tokens
Você pode fixar um orçamento exato de tokens de thinking incluindo budget_tokens junto com effort:
"reasoning": { "effort": "high", "budget_tokens": 50000 }Para a Anthropic, isso se torna thinking.budget_tokens. Para OpenAI/DeepSeek, o campo é preservado, mas atualmente ignorado pelo servidor — reasoning_effort é o controle principal.
Provider Models vs Runtime Models
O Qwen Code distingue dois tipos de configurações de modelo:
Provider Model
- Definido na configuração
modelProviders - Possui um pacote de configuração completo e atômico
- Quando selecionado, sua configuração é aplicada como uma camada impermeável
- Aparece na lista de comandos
/modelcom metadados completos (nome, descrição, capacidades) - Recomendado para fluxos de trabalho multimodelo e consistência da equipe
Runtime Model
- Criado dinamicamente ao usar IDs de modelo brutos via CLI (
--model), variáveis de ambiente ou configurações - Não definido em
modelProviders - A configuração é construída “projetando” através das camadas de resolução (CLI → env → settings → defaults)
- Capturado automaticamente como um RuntimeModelSnapshot quando uma configuração completa é detectada
- Permite reutilização sem a necessidade de inserir as credenciais novamente
Ciclo de vida do RuntimeModelSnapshot
Quando você configura um modelo sem usar modelProviders, o Qwen Code cria automaticamente um RuntimeModelSnapshot para preservar sua configuração:
# Isso cria um RuntimeModelSnapshot com o 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/v1O snapshot:
- Captura o ID do modelo, API key, base URL e configuração de geração
- Persiste entre sessões (armazenado em memória durante a execução)
- Aparece na lista de comandos
/modelcomo uma opção de runtime - Pode ser alternado usando
/model $runtime|openai|my-custom-model
Principais diferenças
| Aspecto | Provider Model | Runtime Model |
|---|---|---|
| Fonte da configuração | modelProviders nas configurações | Camadas CLI, env, settings |
| Atomicidade da configuração | Pacote completo e impermeável | Em camadas, cada campo resolvido independentemente |
| Reutilização | Sempre disponível na lista /model | Capturado como snapshot, aparece se completo |
| Compartilhamento em equipe | Sim (via configurações commitadas) | Não (local do usuário) |
| Armazenamento de credenciais | Referência apenas via envKey | Pode capturar a chave real no snapshot |
Quando usar cada um
- Use Provider Models quando: Você tem modelos padrão compartilhados em uma equipe, precisa de configurações consistentes ou deseja evitar substituições acidentais
- Use Runtime Models quando: Testando rapidamente um novo modelo, usando credenciais temporárias ou trabalhando com endpoints ad-hoc
Persistência de Seleção e Recomendações
Defina modelProviders no escopo do usuário ~/.qwen/settings.json sempre que possível e evite persistir substituições de credenciais em qualquer escopo. Manter o catálogo de provedores nas configurações do usuário evita conflitos de mesclagem/substituição entre os escopos do projeto e do usuário, e garante que as atualizações de /auth e /model sempre gravem de volta em um escopo consistente.
/modele/authpersistemmodel.name(quando aplicável) esecurity.auth.selectedTypeno escopo gravável mais próximo que já definemodelProviders; caso contrário, eles recorrem ao escopo do usuário. Isso mantém os arquivos de workspace/usuário sincronizados com o catálogo de provedores ativo.- Sem
modelProviders, o resolvedor mistura as camadas CLI/env/settings, criando Runtime Models. Isso é adequado para configurações de provedor único, mas trabalhoso ao alternar com frequência. Defina catálogos de provedores sempre que fluxos de trabalho multimodelo forem comuns, para que as alternâncias permaneçam atômicas, com origem atribuída e depuráveis.