Поставщики моделей
Qwen Code позволяет настроить несколько поставщиков моделей через параметр modelProviders в вашем файле settings.json. Это дает возможность переключаться между различными моделями ИИ и поставщиками с помощью команды /model.
Обзор
Используйте modelProviders, чтобы объявить подобранные списки моделей для каждого типа аутентификации, между которыми можно переключаться в /model. Ключи должны быть действительными типами аутентификации (openai, anthropic, gemini, vertex-ai и т.д.). Каждая запись требует id и должна включать envKey, с необязательными полями name, description, baseUrl и generationConfig. Учетные данные никогда не сохраняются в настройках; среда выполнения считывает их из process.env[envKey]. Модели Qwen OAuth остаются жестко закодированными и не могут быть переопределены.
Только команда /model предоставляет доступ к типам аутентификации, отличным от используемых по умолчанию. Anthropic, Gemini, Vertex AI и т.д. должны быть определены через modelProviders. Команда /auth намеренно перечисляет только встроенные потоки Qwen OAuth и OpenAI.
Дублирующиеся ID моделей в пределах одного authType: Определение нескольких моделей с одинаковым id в рамках одного authType (например, две записи с "id": "gpt-4o" в openai) в настоящее время не поддерживается. Если дубликаты существуют, побеждает первое появление, а последующие дубликаты пропускаются с предупреждением. Обратите внимание, что поле id используется как идентификатор конфигурации, так и фактическое имя модели, отправляемое в API, поэтому использование уникальных ID (например, gpt-4o-creative, gpt-4o-balanced) не является работоспособной альтернативой. Это известное ограничение, которое мы планируем устранить в будущем релизе.
Примеры конфигурации по типам аутентификации
Ниже приведены исчерпывающие примеры конфигурации для различных типов аутентификации с указанием доступных параметров и их комбинаций.
Поддерживаемые типы аутентификации
Ключи объекта modelProviders должны быть допустимыми значениями authType. В настоящее время поддерживаются следующие типы аутентификации:
| Тип аутентификации | Описание |
|---|---|
openai | Совместимые с OpenAI API (OpenAI, Azure OpenAI, локальные серверы вывода, такие как vLLM/Ollama) |
anthropic | API Anthropic Claude |
gemini | API Google Gemini |
vertex-ai | Google Vertex AI |
qwen-oauth | Qwen OAuth (жестко закодированный, не может быть переопределен в modelProviders) |
[!warning] Если используется недопустимый ключ типа аутентификации (например, опечатка вроде
"openai-custom"), конфигурация будет тихо пропущена, и модели не появятся в списке выбора/model. Всегда используйте один из поддерживаемых типов аутентификации, перечисленных выше.
SDK, используемые для API-запросов
Qwen Code использует следующие официальные SDK для отправки запросов каждому провайдеру:
| Тип аутентификации | Пакет SDK |
|---|---|
openai | openai - Официальный SDK OpenAI для Node.js |
anthropic | @anthropic-ai/sdk - Официальный SDK Anthropic |
gemini / vertex-ai | @google/genai - Официальный SDK Google GenAI |
qwen-oauth | openai с пользовательским провайдером (совместимо с DashScope) |
Это означает, что настраиваемый вами baseUrl должен быть совместим с ожидаемым форматом API соответствующего SDK. Например, при использовании типа аутентификации openai, конечная точка должна принимать запросы в формате OpenAI API.
Провайдеры, совместимые с OpenAI (openai)
Этот тип аутентификации поддерживает не только официальное API OpenAI, но и любой конечный пункт, совместимый с OpenAI, включая агрегированных поставщиков моделей, таких как OpenRouter.
{
"modelProviders": {
"openai": [
{
"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,
"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 (через OpenRouter)",
"envKey": "OPENROUTER_API_KEY",
"baseUrl": "https://openrouter.ai/api/v1",
"generationConfig": {
"timeout": 120000,
"maxRetries": 3,
"samplingParams": {
"temperature": 0.7
}
}
}
]
}
}Anthropic (anthropic)
{
"modelProviders": {
"anthropic": [
{
"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)
{
"modelProviders": {
"gemini": [
{
"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
}
}
}
]
}
}Google Vertex AI (vertex-ai)
{
"modelProviders": {
"vertex-ai": [
{
"id": "gemini-1.5-pro-vertex",
"name": "Gemini 1.5 Pro (Vertex AI)",
"envKey": "GOOGLE_API_KEY",
"baseUrl": "https://generativelanguage.googleapis.com",
"generationConfig": {
"timeout": 90000,
"contextWindowSize": 2000000,
"samplingParams": {
"temperature": 0.2,
"max_tokens": 8192
}
}
}
]
}
}Локальные модели с самостоятельным хостингом (через совместимое с OpenAI API)
Большинство локальных серверов вывода (vLLM, Ollama, LM Studio и т.д.) предоставляют конечную точку API, совместимую с OpenAI. Настройте их с помощью типа аутентификации openai с локальным baseUrl:
{
"modelProviders": {
"openai": [
{
"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
}
}
}
]
}
}Для локальных серверов, которые не требуют аутентификации, можно использовать любое значение-заполнитель для ключа API:
```bash
# Для Ollama (аутентификация не требуется)
export OLLAMA_API_KEY="ollama"
# Для vLLM (если аутентификация не настроена)
export VLLM_API_KEY="not-needed"Параметр extra_body поддерживается только для поставщиков, совместимых с OpenAI (openai, qwen-oauth). Он игнорируется для поставщиков Anthropic, Gemini и Vertex AI.
План кодирования Bailian
План кодирования Bailian предоставляет предварительно настроенный набор моделей Qwen, оптимизированных для задач программирования. Эта функция доступна пользователям с доступом к API Bailian и предлагает упрощенный процесс настройки с автоматическим обновлением конфигурации модели.
Обзор
При аутентификации с помощью ключа API Bailian Coding Plan с использованием команды /auth, Qwen Code автоматически настраивает следующие модели:
| Идентификатор модели | Название | Описание |
|---|---|---|
qwen3.5-plus | qwen3.5-plus | Усовершенствованная модель с включенным мышлением |
qwen3-coder-plus | qwen3-coder-plus | Оптимизирована для задач программирования |
qwen3-max-2026-01-23 | qwen3-max-2026-01-23 | Последняя максимальная модель с включенным мышлением |
Настройка
- Получите API-ключ Bailian Coding Plan:
- Выполните команду
/authв Qwen Code - Выберите метод аутентификации по API-ключу
- Выберите свой регион (Китай или Глобальный/Международный)
- Введите свой API-ключ, когда будет предложено
Модели будут автоматически настроены и добавлены в ваш выбор /model.
Регионы
План Bailian Coding поддерживает два региона:
| Регион | Конечная точка | Описание |
|---|---|---|
| Китай | https://coding.dashscope.aliyuncs.com/v1 | Конечная точка для материкового Китая |
| Глобальный/Международный | https://coding-intl.dashscope.aliyuncs.com/v1 | Международная конечная точка |
Регион выбирается во время аутентификации и сохраняется в файле settings.json в поле codingPlan.region. Чтобы переключить регион, повторно выполните команду /auth и выберите другой регион.
Хранение API-ключа
Когда вы настраиваете Coding Plan с помощью команды /auth, API-ключ сохраняется с использованием зарезервированного имени переменной окружения BAILIAN_CODING_PLAN_API_KEY. По умолчанию он сохраняется в поле settings.env вашего файла settings.json.
Рекомендация по безопасности: Для лучшей безопасности рекомендуется переместить API-ключ из settings.json в отдельный файл .env и загружать его как переменную окружения. Например:
# ~/.qwen/.env
BAILIAN_CODING_PLAN_API_KEY=your-api-key-hereЗатем убедитесь, что этот файл добавлен в ваш .gitignore, если вы используете настройки на уровне проекта.
Автоматические обновления
Конфигурации модели Coding Plan имеют версионность. Когда Qwen Code обнаруживает более новую версию шаблона модели, вам будет предложено выполнить обновление. При принятии обновления:
- Существующие конфигурации модели Coding Plan будут заменены последними версиями
- Любые пользовательские конфигурации моделей, добавленные вами вручную, будут сохранены
- Автоматически произойдет переключение на первую модель в обновленной конфигурации
Процесс обновления гарантирует, что у вас всегда будет доступ к последним конфигурациям и возможностям модели без необходимости ручного вмешательства.
Ручная настройка (расширенная)
Если вы предпочитаете вручную настраивать модели Coding Plan, вы можете добавить их в свой settings.json, как и любого другого провайдера, совместимого с OpenAI:
{
"modelProviders": {
"openai": [
{
"id": "qwen3-coder-plus",
"name": "qwen3-coder-plus",
"description": "Qwen3-Coder через Bailian Coding Plan",
"envKey": "YOUR_CUSTOM_ENV_KEY",
"baseUrl": "https://coding.dashscope.aliyuncs.com/v1"
}
]
}
}При использовании ручной настройки:
- Вы можете использовать любое имя переменной окружения для
envKey - Вам не нужно настраивать
codingPlan.* - Автоматические обновления не будут применяться к вручную настроенным моделям Coding Plan
Если вы также используете автоматическую настройку Coding Plan, автоматические обновления могут перезаписать ваши ручные настройки, если они используют одинаковые envKey и baseUrl, что и автоматическая настройка. Чтобы избежать этого, по возможности убедитесь, что ваша ручная настройка использует другой envKey.
Слои разрешения и атомарность
Эффективные значения auth/model/credential выбираются для каждого поля с использованием следующего приоритета (первый присутствующий побеждает). Вы можете комбинировать --auth-type с --model, чтобы напрямую указать на запись провайдера; эти флаги CLI выполняются перед другими слоями.
| Слой (самый высокий → самый низкий) | authType | model | apiKey | baseUrl | apiKeyEnvKey | proxy |
|---|---|---|---|---|---|---|
| Программные переопределения | /auth | входные данные /auth | входные данные /auth | входные данные /auth | — | — |
| Выбор поставщика модели | — | modelProvider.id | env[modelProvider.envKey] | modelProvider.baseUrl | modelProvider.envKey | — |
| Аргументы CLI | --auth-type | --model | --openaiApiKey (или эквиваленты для конкретного провайдера) | --openaiBaseUrl (или эквиваленты для конкретного провайдера) | — | — |
| Переменные окружения | — | Сопоставление для конкретного провайдера (например, OPENAI_MODEL) | Сопоставление для конкретного провайдера (например, OPENAI_API_KEY) | Сопоставление для конкретного провайдера (например, OPENAI_BASE_URL) | — | — |
Настройки (settings.json) | security.auth.selectedType | model.name | security.auth.apiKey | security.auth.baseUrl | — | — |
| По умолчанию / вычисленные | Возврат к AuthType.QWEN_OAUTH | Встроенное значение по умолчанию (OpenAI ⇒ qwen3-coder-plus) | — | — | — | Config.getProxy(), если настроено |
*Когда присутствуют флаги CLI для аутентификации, они переопределяют настройки. В противном случае, security.auth.selectedType или неявное значение по умолчанию определяет тип аутентификации. Qwen OAuth и OpenAI — единственные типы аутентификации, которые отображаются без дополнительной настройки.
Устаревание security.auth.apiKey и security.auth.baseUrl: Прямая настройка учетных данных API через security.auth.apiKey и security.auth.baseUrl в settings.json устарела. Эти настройки использовались в предыдущих версиях для учетных данных, введенных через пользовательский интерфейс, но поток ввода учетных данных был удален в версии 0.10.1. Эти поля будут полностью удалены в будущем релизе. Настоятельно рекомендуется перейти на modelProviders для всех настроек моделей и учетных данных. Используйте envKey в modelProviders, чтобы ссылаться на переменные окружения для безопасного управления учетными данными вместо жесткого кодирования учетных данных в файлах настроек.
Слой конфигурации генерации: Непроницаемый слой поставщика
Разрешение конфигурации следует строгой многослойной модели с одним важным правилом: слой modelProvider непроницаем.
Как это работает
-
Когда выбрана модель modelProvider (например, с помощью команды
/model, выбирающей модель, настроенную в провайдере):- Весь
generationConfigиз провайдера применяется атомарно - Слой провайдера полностью непроницаем — нижние уровни (CLI, env, настройки) вообще не участвуют в разрешении generationConfig
- Все поля, определенные в
modelProviders[].generationConfig, используют значения провайдера - Все поля, не определенные провайдером, устанавливаются в
undefined(не наследуются из настроек) - Это гарантирует, что конфигурации провайдера действуют как полный, автономный “запечатанный пакет”
- Весь
-
Когда НЕ выбрана модель modelProvider (например, при использовании
--modelс простым идентификатором модели или прямом использовании CLI/env/настроек):- Разрешение переходит к нижним уровням
- Поля заполняются из CLI → env → настройки → по умолчанию
- Это создает Runtime Model (см. следующий раздел)
Приоритетность на уровне полей для generationConfig
| Приоритет | Источник | Поведение |
|---|---|---|
| 1 | Программные переопределения | Изменения во время выполнения через /model, /auth |
| 2 | modelProviders[authType][].generationConfig | Импермеабельный слой — полностью заменяет все поля generationConfig; нижние слои не участвуют |
| 3 | settings.model.generationConfig | Используется только для Моделей времени выполнения (когда модель провайдера не выбрана) |
| 4 | Значения по умолчанию генератора контента | Значения по умолчанию, специфичные для провайдера (например, OpenAI и Gemini) — только для Runtime Models |
Атомарная обработка полей
Следующие поля рассматриваются как атомарные объекты — значения провайдера полностью заменяют весь объект, объединение не происходит:
samplingParams— Температура, top_p, max_tokens и т. д.customHeaders— Пользовательские заголовки HTTPextra_body— Дополнительные параметры тела запроса
Пример
// Пользовательские настройки (~/.qwen/settings.json)
{
"model": {
"generationConfig": {
"timeout": 30000,
"samplingParams": { "temperature": 0.5, "max_tokens": 1000 }
}
}
}
// Конфигурация modelProviders
{
"modelProviders": {
"openai": [{
"id": "gpt-4o",
"envKey": "OPENAI_API_KEY",
"generationConfig": {
"timeout": 60000,
"samplingParams": { "temperature": 0.2 }
}
}]
}
}Когда gpt-4o выбирается из modelProviders:
timeout= 60000 (из провайдера, переопределяет настройки)samplingParams.temperature= 0.2 (из провайдера, полностью заменяет объект настроек)samplingParams.max_tokens= undefined (не определено в провайдере, и слой провайдера не наследует от настроек — поля явно устанавливаются в undefined, если не предоставлены)
При использовании сырой модели через --model gpt-4 (не из modelProviders, создает Runtime Model):
timeout= 30000 (из настроек)samplingParams.temperature= 0.5 (из настроек)samplingParams.max_tokens= 1000 (из настроек)
Стратегия объединения для самого modelProviders — ЗАМЕНА: весь modelProviders из настроек проекта переопределит соответствующий раздел в пользовательских настройках, а не будет объединять два объекта.
Модели поставщиков и модели выполнения
Qwen Code различает два типа конфигураций моделей:
Модель поставщика
- Определяется в конфигурации
modelProviders - Имеет полный, атомарный пакет конфигурации
- При выборе применяется как непроницаемый слой
- Отображается в списке команды
/modelс полными метаданными (имя, описание, возможности) - Рекомендуется для многомодельных рабочих процессов и согласованности в команде
Модель выполнения
- Создается динамически при использовании идентификаторов моделей через CLI (
--model), переменные окружения или настройки - Не определена в
modelProviders - Конфигурация создается путем “проекции” через слои разрешения (CLI → env → настройки → значения по умолчанию)
- Автоматически захватывается как RuntimeModelSnapshot, когда обнаруживается полная конфигурация
- Позволяет повторное использование без повторного ввода учетных данных
Жизненный цикл RuntimeModelSnapshot
Когда вы настраиваете модель без использования modelProviders, Qwen Code автоматически создает RuntimeModelSnapshot для сохранения вашей конфигурации:
# Это создает RuntimeModelSnapshot с ID: $runtime|openai|my-custom-model
qwen --auth-type openai --model my-custom-model --openaiApiKey $KEY --openaiBaseUrl https://api.example.com/v1Снимок:
- Сохраняет ID модели, API-ключ, базовый URL и конфигурацию генерации
- Сохраняется между сессиями (хранится в памяти во время выполнения)
- Отображается в списке команды
/modelкак опция времени выполнения - Может быть выбран с помощью
/model $runtime|openai|my-custom-model
Ключевые различия
| Аспект | Модель поставщика | Модель выполнения |
|---|---|---|
| Источник конфигурации | modelProviders в настройках | CLI, env, слои настроек |
| Атомарность конфигурации | Полный, непроницаемый пакет | Слоистая, каждое поле разрешается отдельно |
| Повторное использование | Всегда доступен в списке /model | Сохраняется как снимок, появляется при завершении |
| Совместное использование | Да (через фиксированные настройки) | Нет (локально для пользователя) |
| Хранение учетных данных | Ссылка только через envKey | Может содержать фактический ключ в снимке |
Когда использовать каждый из них
- Используйте Provider Models, когда: у вас есть стандартные модели, общие для всей команды, необходима согласованная конфигурация или вы хотите предотвратить случайные переопределения
- Используйте Runtime Models, когда: быстро тестируете новую модель, используете временные учетные данные или работаете с произвольными конечными точками
Сохранение выделения и рекомендации
Определяйте modelProviders в пользовательской области ~/.qwen/settings.json, когда это возможно, и избегайте сохранения переопределений учетных данных в любой области. Хранение каталога поставщиков в пользовательских настройках предотвращает конфликты объединения/переопределения между проектной и пользовательской областями и гарантирует, что обновления /auth и /model всегда записываются обратно в согласованную область.
/modelи/authсохраняютmodel.name(где применимо) иsecurity.auth.selectedTypeв ближайшую доступную для записи область, которая уже определяетmodelProviders; в противном случае они возвращаются к пользовательской области. Это позволяет синхронизировать файлы рабочей области/пользователя с активным каталогом поставщиков.- Без
modelProvidersрезолвер смешивает слои CLI/env/settings, создавая Runtime-модели. Это нормально для установок с одним поставщиком, но неудобно при частом переключении. Определяйте каталоги поставщиков всякий раз, когда многомодульные рабочие процессы являются обычными, чтобы переключения оставались атомарными, с указанием источника и отладкой.