@qwen-code/qwen-code 0.19.0 → 0.19.1-nightly.20260624.a234860a4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/bundled/qc-helper/SKILL.md +13 -5
  2. package/bundled/qc-helper/docs/configuration/_meta.ts +1 -0
  3. package/bundled/qc-helper/docs/configuration/auth.md +68 -48
  4. package/bundled/qc-helper/docs/configuration/model-providers.md +217 -195
  5. package/bundled/qc-helper/docs/configuration/settings.md +30 -14
  6. package/bundled/qc-helper/docs/configuration/themes.md +7 -4
  7. package/bundled/qc-helper/docs/extension/extension-releasing.md +1 -1
  8. package/bundled/qc-helper/docs/extension/introduction.md +3 -15
  9. package/bundled/qc-helper/docs/features/arena.md +3 -3
  10. package/bundled/qc-helper/docs/features/channels/overview.md +1 -1
  11. package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
  12. package/bundled/qc-helper/docs/features/commands.md +6 -1
  13. package/bundled/qc-helper/docs/features/headless.md +1 -1
  14. package/bundled/qc-helper/docs/features/mcp.md +24 -8
  15. package/bundled/qc-helper/docs/features/sandbox.md +2 -2
  16. package/bundled/qc-helper/docs/features/tool-use-summaries.md +1 -1
  17. package/bundled/qc-helper/docs/integration-github-action.md +2 -2
  18. package/bundled/qc-helper/docs/overview.md +1 -1
  19. package/bundled/qc-helper/docs/quickstart.md +9 -5
  20. package/bundled/qc-helper/docs/qwen-serve.md +15 -3
  21. package/bundled/qc-helper/docs/support/tos-privacy.md +1 -1
  22. package/chunks/{agent-IPSDEZNB.js → agent-6KV474S5.js} +7 -7
  23. package/chunks/{agent-headless-ZMTUWMZJ.js → agent-headless-XO7MM6JT.js} +7 -7
  24. package/chunks/{anthropicContentGenerator-6MCH4X6S.js → anthropicContentGenerator-7352A7I5.js} +2 -2
  25. package/chunks/{artifact-tool-PBX64YTT.js → artifact-tool-5J4HUZAV.js} +1 -1
  26. package/chunks/{askUserQuestion-5ZQOWSRT.js → askUserQuestion-HF7HCWDD.js} +1 -1
  27. package/chunks/{chunk-PO5LVPK3.js → chunk-2QDQTWCI.js} +1 -1
  28. package/chunks/{chunk-255L5QYW.js → chunk-3BR4OIOE.js} +1 -1
  29. package/chunks/{chunk-KFR4QTV3.js → chunk-54J4JDWT.js} +123 -174
  30. package/chunks/{chunk-S7ILEIB4.js → chunk-76BDT2HH.js} +4 -5
  31. package/chunks/{chunk-YF3ORUIU.js → chunk-7QBKO4A6.js} +2348 -1817
  32. package/chunks/{chunk-GAAALA2X.js → chunk-C4JC2FL3.js} +7 -6
  33. package/chunks/{chunk-CICUTYTF.js → chunk-HNYTRFAM.js} +52 -45
  34. package/chunks/{chunk-JRVB4QUY.js → chunk-KBXLIVWQ.js} +1 -1
  35. package/chunks/{chunk-QKUAGMGE.js → chunk-NKJ6LRCR.js} +1 -1
  36. package/chunks/{chunk-57XRIZVC.js → chunk-NWLUISRA.js} +1 -1
  37. package/chunks/{chunk-VRIVIYRL.js → chunk-TKXRLRTF.js} +4 -4
  38. package/chunks/{computer-use-YYK42DD5.js → computer-use-WOKHYISX.js} +7 -7
  39. package/chunks/{contextCommand-BO45MUAA.js → contextCommand-JSYQAO3O.js} +9 -9
  40. package/chunks/{cron-create-DXKAP5KN.js → cron-create-A5637KCI.js} +9 -6
  41. package/chunks/{cron-delete-WGO4PZTF.js → cron-delete-AADOSEOZ.js} +1 -1
  42. package/chunks/{cron-list-EY7D3ZUC.js → cron-list-OFCPTT2Y.js} +1 -1
  43. package/chunks/{edit-QERNJN7K.js → edit-6EN6NO6G.js} +7 -7
  44. package/chunks/{en-UTXMGXIR.js → en-7OGNWWME.js} +1 -0
  45. package/chunks/{enter-worktree-6ZKH5IL3.js → enter-worktree-XJ4S74CL.js} +7 -7
  46. package/chunks/{enterPlanMode-B2PBF4MA.js → enterPlanMode-GQNQIH2V.js} +7 -7
  47. package/chunks/{exit-worktree-EOCMQO4I.js → exit-worktree-6MKLATVB.js} +7 -7
  48. package/chunks/{exitPlanMode-WSRXCBRZ.js → exitPlanMode-YACWA5GO.js} +7 -7
  49. package/chunks/{geminiContentGenerator-NTR4LTKS.js → geminiContentGenerator-OLJGOIWO.js} +1 -1
  50. package/chunks/{glob-IWDJQI2V.js → glob-YHSIN2LG.js} +7 -7
  51. package/chunks/{grep-2DV5BXMH.js → grep-5EMEAJBO.js} +7 -7
  52. package/chunks/{loop-wakeup-XVSDE7QR.js → loop-wakeup-DGSMT4N6.js} +2 -2
  53. package/chunks/{ls-LPY3ATQQ.js → ls-UGRZ4ZOM.js} +1 -1
  54. package/chunks/{lsp-ZT3AAXIF.js → lsp-72IJURW3.js} +1 -1
  55. package/chunks/{monitor-6HBDS2RS.js → monitor-ZGXTGINM.js} +7 -7
  56. package/chunks/{notebook-edit-J5AY5BRY.js → notebook-edit-O7WO3APR.js} +7 -7
  57. package/chunks/{openaiContentGenerator-ENABCJDM.js → openaiContentGenerator-N4FCEGU2.js} +6 -6
  58. package/chunks/{qwenContentGenerator-ISW42U7C.js → qwenContentGenerator-BOAZ7MMG.js} +9 -9
  59. package/chunks/{read-file-NRX2FSSQ.js → read-file-RB35MI5I.js} +3 -3
  60. package/chunks/{ripGrep-WF5CKHR5.js → ripGrep-CWJOA6JG.js} +7 -7
  61. package/chunks/{scheduler-PNPG5WJ3.js → scheduler-XUBHNI2Z.js} +7 -7
  62. package/chunks/{send-message-447W6NH6.js → send-message-URUZ7PLA.js} +1 -1
  63. package/chunks/{serve-ZBRCIIHW.js → serve-P356SCA2.js} +197 -31
  64. package/chunks/{shell-DLIL6MLU.js → shell-5TRHTPML.js} +7 -7
  65. package/chunks/{skill-32TXHY4A.js → skill-RW6N7GHL.js} +3 -3
  66. package/chunks/{src-PDDLF5BB.js → src-SPEHQKTK.js} +35 -9
  67. package/chunks/{syntheticOutput-GQRDRLGR.js → syntheticOutput-65FRJGWM.js} +2 -2
  68. package/chunks/{task-create-66DDSTVI.js → task-create-IH45HOFT.js} +2 -2
  69. package/chunks/{task-list-GOPXRSHG.js → task-list-FUB6JWSX.js} +1 -1
  70. package/chunks/{task-stop-M7NKGFX2.js → task-stop-P6IOHQM3.js} +1 -1
  71. package/chunks/{task-update-M5TBHLZV.js → task-update-RTUT7LJV.js} +2 -2
  72. package/chunks/{team-create-EHLDSJGI.js → team-create-D6GSPXCO.js} +7 -7
  73. package/chunks/{team-delete-DKKDS65W.js → team-delete-RXGYRMHC.js} +1 -1
  74. package/chunks/{todoWrite-4VX7X44D.js → todoWrite-O6JK24G6.js} +1 -1
  75. package/chunks/{tool-search-FU7IZAOO.js → tool-search-6YIMUUVD.js} +3 -3
  76. package/chunks/{web-fetch-YPP3V4FJ.js → web-fetch-KUMBROUI.js} +2 -2
  77. package/chunks/{workflow-WUDNBCGX.js → workflow-ML3XFTCN.js} +23 -15
  78. package/chunks/{write-file-NVFPX6CH.js → write-file-VLT6ODLK.js} +7 -7
  79. package/chunks/{zh-YOXVTJU5.js → zh-3RMSEO5M.js} +1 -0
  80. package/chunks/{zh-TW-J2TTW67R.js → zh-TW-R7WRLTJS.js} +1 -0
  81. package/cli.js +778 -382
  82. package/locales/en.js +1 -0
  83. package/locales/zh-TW.js +1 -0
  84. package/locales/zh.js +1 -0
  85. package/package.json +3 -3
  86. package/web-shell/assets/{arc-pxOt9B72.js → arc-DHUeMnnj.js} +1 -1
  87. package/web-shell/assets/{architectureDiagram-3BPJPVTR-B9XuYYOT.js → architectureDiagram-3BPJPVTR-DlX12yyj.js} +1 -1
  88. package/web-shell/assets/{blockDiagram-GPEHLZMM-5yK68iu4.js → blockDiagram-GPEHLZMM-DTFUXMUT.js} +1 -1
  89. package/web-shell/assets/{c4Diagram-AAUBKEIU-B1LY-qNI.js → c4Diagram-AAUBKEIU-CWdB54fk.js} +1 -1
  90. package/web-shell/assets/channel-C3WhMjjP.js +1 -0
  91. package/web-shell/assets/{chunk-2J33WTMH-DkgXg7cM.js → chunk-2J33WTMH-CF5C5jNR.js} +1 -1
  92. package/web-shell/assets/{chunk-4BX2VUAB-DdM45KFM.js → chunk-4BX2VUAB-Cw7Ydfji.js} +1 -1
  93. package/web-shell/assets/{chunk-55IACEB6-CmdsDjD4.js → chunk-55IACEB6-CnbI1ZCw.js} +1 -1
  94. package/web-shell/assets/{chunk-727SXJPM-CQ4pJ5GH.js → chunk-727SXJPM-DmSy00Pe.js} +1 -1
  95. package/web-shell/assets/{chunk-AQP2D5EJ-Dy6UWz37.js → chunk-AQP2D5EJ-DgNgXqBu.js} +1 -1
  96. package/web-shell/assets/{chunk-FMBD7UC4-CC8nFqap.js → chunk-FMBD7UC4-tz2IvOXv.js} +1 -1
  97. package/web-shell/assets/{chunk-ND2GUHAM-CkmS7lx7.js → chunk-ND2GUHAM-DaBLEBPa.js} +1 -1
  98. package/web-shell/assets/{chunk-QZHKN3VN-DynyqleZ.js → chunk-QZHKN3VN-DVCQST3O.js} +1 -1
  99. package/web-shell/assets/classDiagram-4FO5ZUOK-CQ6TXPif.js +1 -0
  100. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CQ6TXPif.js +1 -0
  101. package/web-shell/assets/{cose-bilkent-S5V4N54A-DA0fzCsY.js → cose-bilkent-S5V4N54A-CAKTcdCQ.js} +1 -1
  102. package/web-shell/assets/{dagre-BM42HDAG-DHYXRqCo.js → dagre-BM42HDAG-BdkBwlKg.js} +1 -1
  103. package/web-shell/assets/{diagram-2AECGRRQ-DWD6BcPs.js → diagram-2AECGRRQ-DYt3G65F.js} +1 -1
  104. package/web-shell/assets/{diagram-5GNKFQAL-CX9wnqVc.js → diagram-5GNKFQAL-BWvROWjY.js} +1 -1
  105. package/web-shell/assets/{diagram-KO2AKTUF-BpE8Kbt8.js → diagram-KO2AKTUF-BvvgwIaQ.js} +1 -1
  106. package/web-shell/assets/{diagram-LMA3HP47-DLPcrP0C.js → diagram-LMA3HP47-E7NLSNKg.js} +1 -1
  107. package/web-shell/assets/{diagram-OG6HWLK6-CSUCBsCe.js → diagram-OG6HWLK6-CYmUBgpE.js} +1 -1
  108. package/web-shell/assets/{erDiagram-TEJ5UH35-d3Z0uMXS.js → erDiagram-TEJ5UH35-BU5gY30h.js} +1 -1
  109. package/web-shell/assets/{flowDiagram-I6XJVG4X-C7vj5FX3.js → flowDiagram-I6XJVG4X-V_ZssSZ9.js} +1 -1
  110. package/web-shell/assets/{ganttDiagram-6RSMTGT7-BV9UvDV_.js → ganttDiagram-6RSMTGT7-QIShlsdI.js} +1 -1
  111. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-CoWp0mW4.js → gitGraphDiagram-PVQCEYII-DJxdu2YS.js} +1 -1
  112. package/web-shell/assets/index-BPnhI7gl.css +1 -0
  113. package/web-shell/assets/index-De4rqTsW.js +706 -0
  114. package/web-shell/assets/{infoDiagram-5YYISTIA-DUswfJHA.js → infoDiagram-5YYISTIA-BqjdrFeO.js} +1 -1
  115. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-WidEKukx.js → ishikawaDiagram-YF4QCWOH-BP_a2YZ2.js} +1 -1
  116. package/web-shell/assets/{journeyDiagram-JHISSGLW-D7IRK3VN.js → journeyDiagram-JHISSGLW-BXg-S3Lk.js} +1 -1
  117. package/web-shell/assets/{kanban-definition-UN3LZRKU-CwFJ6Cja.js → kanban-definition-UN3LZRKU-BksAkdEJ.js} +1 -1
  118. package/web-shell/assets/{linear-BQ8GvDRY.js → linear-D2m9-ODE.js} +1 -1
  119. package/web-shell/assets/{mermaid.core-CwF8A_xO.js → mermaid.core-dTtkZp2F.js} +5 -5
  120. package/web-shell/assets/{mindmap-definition-RKZ34NQL-TR1s0iZi.js → mindmap-definition-RKZ34NQL-Bft9my8O.js} +1 -1
  121. package/web-shell/assets/{pieDiagram-4H26LBE5-Cd91pMl9.js → pieDiagram-4H26LBE5-Cw8S-alZ.js} +1 -1
  122. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-BGxGDNMl.js → quadrantDiagram-W4KKPZXB-DaDoTMts.js} +1 -1
  123. package/web-shell/assets/{requirementDiagram-4Y6WPE33-Cq3fWmYz.js → requirementDiagram-4Y6WPE33-Cp5kSpwj.js} +1 -1
  124. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-ChLyGdq0.js → sankeyDiagram-5OEKKPKP-CW8RsJJZ.js} +1 -1
  125. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-tazy79aB.js → sequenceDiagram-3UESZ5HK-DTfpIiJK.js} +1 -1
  126. package/web-shell/assets/{stateDiagram-AJRCARHV-dIYLUNSf.js → stateDiagram-AJRCARHV-DixFVzEs.js} +1 -1
  127. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DZgE04s3.js +1 -0
  128. package/web-shell/assets/{timeline-definition-PNZ67QCA-BuENhrC2.js → timeline-definition-PNZ67QCA-DYsbXn5l.js} +1 -1
  129. package/web-shell/assets/{vennDiagram-CIIHVFJN-DLtum9dF.js → vennDiagram-CIIHVFJN-HUpRpuUp.js} +1 -1
  130. package/web-shell/assets/{wardley-L42UT6IY-Bf7OSF3y.js → wardley-L42UT6IY-cT3nQH_T.js} +1 -1
  131. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-slMw3OB3.js → wardleyDiagram-YWT4CUSO-Dmm7J6Qc.js} +1 -1
  132. package/web-shell/assets/{xychartDiagram-2RQKCTM6-CdxOm8oC.js → xychartDiagram-2RQKCTM6-CX0L5p9C.js} +1 -1
  133. package/web-shell/index.html +3 -3
  134. package/web-shell/assets/channel-Cx7egbSX.js +0 -1
  135. package/web-shell/assets/classDiagram-4FO5ZUOK-CwH_F8cH.js +0 -1
  136. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CwH_F8cH.js +0 -1
  137. package/web-shell/assets/index-BDZiTAkl.css +0 -1
  138. package/web-shell/assets/index-CjTH6cLP.js +0 -516
  139. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-luL7KTiX.js +0 -1
  140. package/chunks/{chunk-JDV3VBPY.js → chunk-F6XNTYNE.js} +202 -202
  141. package/chunks/{chunk-PLY4F7QW.js → chunk-L7U2RI5O.js} +54 -54
@@ -4,11 +4,11 @@ Qwen Code allows you to configure multiple model providers through the `modelPro
4
4
 
5
5
  ## Overview
6
6
 
7
- Use `modelProviders` to declare curated model lists per auth type that the `/model` picker can switch between. Keys must be valid auth types (`openai`, `anthropic`, `gemini`, etc.). Each entry requires an `id` and **must include `envKey`**, with optional `name`, `description`, `baseUrl`, and `generationConfig`. Credentials are never persisted in settings; the runtime reads them from `process.env[envKey]`. Qwen OAuth models remain hard-coded and cannot be overridden.
7
+ Use `modelProviders` to declare models per auth type that the `/model` picker can switch between. Keys must be valid auth types (`openai`, `anthropic`, `gemini`, etc.). Each auth type maps to a `ProviderConfig` object with a `protocol` field and a `models` field (the array of model definitions). Each entry in `models` requires an `id`; `envKey` is **optional and recommended** (when omitted, it falls back to the auth type's default env key, e.g. `OPENAI_API_KEY` for `openai`), with optional `name`, `description`, `baseUrl`, and `generationConfig`. Credentials are never persisted in settings; the runtime reads them from `process.env[envKey]`. Qwen OAuth models remain hard-coded and cannot be overridden.
8
8
 
9
9
  > [!note]
10
10
  >
11
- > Only the `/model` command exposes non-default auth types. Anthropic, Gemini, etc., must be defined via `modelProviders`. The `/auth` command lists Qwen OAuth, Alibaba Cloud Coding Plan, and API Key as the built-in authentication options.
11
+ > Only the `/model` command exposes non-default auth types. Anthropic, Gemini, etc., must be defined via `modelProviders`. The `/auth` command lists three top-level options: **Alibaba ModelStudio** (with Coding Plan, Token Plan, and Standard API Key in its sub-menu), **Third-party Providers**, and **Custom Provider**. (Qwen OAuth is no longer a selectable dialog entry; its free tier was discontinued on 2026-04-15.)
12
12
 
13
13
  > [!note]
14
14
  >
@@ -28,9 +28,10 @@ The `modelProviders` object keys must be valid `authType` values. Currently supp
28
28
  | `anthropic` | Anthropic Claude API |
29
29
  | `gemini` | Google Gemini API |
30
30
  | `qwen-oauth` | Qwen OAuth (hard-coded, cannot be overridden in `modelProviders`) |
31
+ | `vertex-ai` | Google Vertex AI (uses the `gemini` protocol and the `@google/genai` SDK in Vertex AI mode; selecting it sets `GOOGLE_GENAI_USE_VERTEXAI=true`) |
31
32
 
32
33
  > [!warning]
33
- > If an invalid auth type key is used (e.g., a typo like `"openai-custom"`), the configuration will be **silently skipped** and the models will not appear in the `/model` picker. Always use one of the supported auth type values listed above.
34
+ > If an unknown auth type key is used (e.g., a typo like `"openai-custom"`), a non-empty key is accepted as-is as its own auth-type group, but it will not map to a known protocol — so its models won't work as intended and won't behave correctly in the `/model` picker. Only blank (empty or whitespace-only) keys are skipped. Always use one of the supported auth type values listed above.
34
35
 
35
36
  ### SDKs Used for API Requests
36
37
 
@@ -57,76 +58,79 @@ This auth type supports not only OpenAI's official API but also any OpenAI-compa
57
58
  "REQUESTY_API_KEY": "sk-your-actual-requesty-key-here"
58
59
  },
59
60
  "modelProviders": {
60
- "openai": [
61
- {
62
- "id": "gpt-4o",
63
- "name": "GPT-4o",
64
- "envKey": "OPENAI_API_KEY",
65
- "baseUrl": "https://api.openai.com/v1",
66
- "generationConfig": {
67
- "timeout": 60000,
68
- "maxRetries": 3,
69
- "enableCacheControl": true,
70
- "contextWindowSize": 128000,
71
- "modalities": {
72
- "image": true
73
- },
74
- "customHeaders": {
75
- "X-Client-Request-ID": "req-123"
76
- },
77
- "extra_body": {
78
- "enable_thinking": true,
79
- "service_tier": "priority"
80
- },
81
- "samplingParams": {
82
- "temperature": 0.2,
83
- "top_p": 0.8,
84
- "max_tokens": 4096,
85
- "presence_penalty": 0.1,
86
- "frequency_penalty": 0.1
61
+ "openai": {
62
+ "protocol": "openai",
63
+ "models": [
64
+ {
65
+ "id": "gpt-4o",
66
+ "name": "GPT-4o",
67
+ "envKey": "OPENAI_API_KEY",
68
+ "baseUrl": "https://api.openai.com/v1",
69
+ "generationConfig": {
70
+ "timeout": 60000,
71
+ "maxRetries": 3,
72
+ "enableCacheControl": true,
73
+ "contextWindowSize": 128000,
74
+ "modalities": {
75
+ "image": true
76
+ },
77
+ "customHeaders": {
78
+ "X-Client-Request-ID": "req-123"
79
+ },
80
+ "extra_body": {
81
+ "enable_thinking": true,
82
+ "service_tier": "priority"
83
+ },
84
+ "samplingParams": {
85
+ "temperature": 0.2,
86
+ "top_p": 0.8,
87
+ "max_tokens": 4096,
88
+ "presence_penalty": 0.1,
89
+ "frequency_penalty": 0.1
90
+ }
87
91
  }
88
- }
89
- },
90
- {
91
- "id": "gpt-4o-mini",
92
- "name": "GPT-4o Mini",
93
- "envKey": "OPENAI_API_KEY",
94
- "baseUrl": "https://api.openai.com/v1",
95
- "generationConfig": {
96
- "timeout": 30000,
97
- "samplingParams": {
98
- "temperature": 0.5,
99
- "max_tokens": 2048
92
+ },
93
+ {
94
+ "id": "gpt-4o-mini",
95
+ "name": "GPT-4o Mini",
96
+ "envKey": "OPENAI_API_KEY",
97
+ "baseUrl": "https://api.openai.com/v1",
98
+ "generationConfig": {
99
+ "timeout": 30000,
100
+ "samplingParams": {
101
+ "temperature": 0.5,
102
+ "max_tokens": 2048
103
+ }
100
104
  }
101
- }
102
- },
103
- {
104
- "id": "openai/gpt-4o",
105
- "name": "GPT-4o (via OpenRouter)",
106
- "envKey": "OPENROUTER_API_KEY",
107
- "baseUrl": "https://openrouter.ai/api/v1",
108
- "generationConfig": {
109
- "timeout": 120000,
110
- "maxRetries": 3,
111
- "samplingParams": {
112
- "temperature": 0.7
105
+ },
106
+ {
107
+ "id": "openai/gpt-4o",
108
+ "name": "GPT-4o (via OpenRouter)",
109
+ "envKey": "OPENROUTER_API_KEY",
110
+ "baseUrl": "https://openrouter.ai/api/v1",
111
+ "generationConfig": {
112
+ "timeout": 120000,
113
+ "maxRetries": 3,
114
+ "samplingParams": {
115
+ "temperature": 0.7
116
+ }
113
117
  }
114
- }
115
- },
116
- {
117
- "id": "openai/gpt-4o-mini",
118
- "name": "GPT-4o Mini (via Requesty)",
119
- "envKey": "REQUESTY_API_KEY",
120
- "baseUrl": "https://router.requesty.ai/v1",
121
- "generationConfig": {
122
- "timeout": 120000,
123
- "maxRetries": 3,
124
- "samplingParams": {
125
- "temperature": 0.7
118
+ },
119
+ {
120
+ "id": "openai/gpt-4o-mini",
121
+ "name": "GPT-4o Mini (via Requesty)",
122
+ "envKey": "REQUESTY_API_KEY",
123
+ "baseUrl": "https://router.requesty.ai/v1",
124
+ "generationConfig": {
125
+ "timeout": 120000,
126
+ "maxRetries": 3,
127
+ "samplingParams": {
128
+ "temperature": 0.7
129
+ }
126
130
  }
127
131
  }
128
- }
129
- ]
132
+ ]
133
+ }
130
134
  }
131
135
  }
132
136
  ```
@@ -139,37 +143,40 @@ This auth type supports not only OpenAI's official API but also any OpenAI-compa
139
143
  "ANTHROPIC_API_KEY": "sk-ant-your-actual-anthropic-key-here"
140
144
  },
141
145
  "modelProviders": {
142
- "anthropic": [
143
- {
144
- "id": "claude-3-5-sonnet",
145
- "name": "Claude 3.5 Sonnet",
146
- "envKey": "ANTHROPIC_API_KEY",
147
- "baseUrl": "https://api.anthropic.com/v1",
148
- "generationConfig": {
149
- "timeout": 120000,
150
- "maxRetries": 3,
151
- "contextWindowSize": 200000,
152
- "samplingParams": {
153
- "temperature": 0.7,
154
- "max_tokens": 8192,
155
- "top_p": 0.9
146
+ "anthropic": {
147
+ "protocol": "anthropic",
148
+ "models": [
149
+ {
150
+ "id": "claude-3-5-sonnet",
151
+ "name": "Claude 3.5 Sonnet",
152
+ "envKey": "ANTHROPIC_API_KEY",
153
+ "baseUrl": "https://api.anthropic.com/v1",
154
+ "generationConfig": {
155
+ "timeout": 120000,
156
+ "maxRetries": 3,
157
+ "contextWindowSize": 200000,
158
+ "samplingParams": {
159
+ "temperature": 0.7,
160
+ "max_tokens": 8192,
161
+ "top_p": 0.9
162
+ }
156
163
  }
157
- }
158
- },
159
- {
160
- "id": "claude-3-opus",
161
- "name": "Claude 3 Opus",
162
- "envKey": "ANTHROPIC_API_KEY",
163
- "baseUrl": "https://api.anthropic.com/v1",
164
- "generationConfig": {
165
- "timeout": 180000,
166
- "samplingParams": {
167
- "temperature": 0.3,
168
- "max_tokens": 4096
164
+ },
165
+ {
166
+ "id": "claude-3-opus",
167
+ "name": "Claude 3 Opus",
168
+ "envKey": "ANTHROPIC_API_KEY",
169
+ "baseUrl": "https://api.anthropic.com/v1",
170
+ "generationConfig": {
171
+ "timeout": 180000,
172
+ "samplingParams": {
173
+ "temperature": 0.3,
174
+ "max_tokens": 4096
175
+ }
169
176
  }
170
177
  }
171
- }
172
- ]
178
+ ]
179
+ }
173
180
  }
174
181
  }
175
182
  ```
@@ -182,29 +189,32 @@ This auth type supports not only OpenAI's official API but also any OpenAI-compa
182
189
  "GEMINI_API_KEY": "AIza-your-actual-gemini-key-here"
183
190
  },
184
191
  "modelProviders": {
185
- "gemini": [
186
- {
187
- "id": "gemini-2.0-flash",
188
- "name": "Gemini 2.0 Flash",
189
- "envKey": "GEMINI_API_KEY",
190
- "baseUrl": "https://generativelanguage.googleapis.com",
191
- "capabilities": {
192
- "vision": true
193
- },
194
- "generationConfig": {
195
- "timeout": 60000,
196
- "maxRetries": 2,
197
- "contextWindowSize": 1000000,
198
- "schemaCompliance": "auto",
199
- "samplingParams": {
200
- "temperature": 0.4,
201
- "top_p": 0.95,
202
- "max_tokens": 8192,
203
- "top_k": 40
192
+ "gemini": {
193
+ "protocol": "gemini",
194
+ "models": [
195
+ {
196
+ "id": "gemini-2.0-flash",
197
+ "name": "Gemini 2.0 Flash",
198
+ "envKey": "GEMINI_API_KEY",
199
+ "baseUrl": "https://generativelanguage.googleapis.com",
200
+ "capabilities": {
201
+ "vision": true
202
+ },
203
+ "generationConfig": {
204
+ "timeout": 60000,
205
+ "maxRetries": 2,
206
+ "contextWindowSize": 1000000,
207
+ "schemaCompliance": "auto",
208
+ "samplingParams": {
209
+ "temperature": 0.4,
210
+ "top_p": 0.95,
211
+ "max_tokens": 8192,
212
+ "top_k": 40
213
+ }
204
214
  }
205
215
  }
206
- }
207
- ]
216
+ ]
217
+ }
208
218
  }
209
219
  }
210
220
  ```
@@ -221,51 +231,54 @@ Most local inference servers (vLLM, Ollama, LM Studio, etc.) provide an OpenAI-c
221
231
  "LMSTUDIO_API_KEY": "lm-studio"
222
232
  },
223
233
  "modelProviders": {
224
- "openai": [
225
- {
226
- "id": "qwen2.5-7b",
227
- "name": "Qwen2.5 7B (Ollama)",
228
- "envKey": "OLLAMA_API_KEY",
229
- "baseUrl": "http://localhost:11434/v1",
230
- "generationConfig": {
231
- "timeout": 300000,
232
- "maxRetries": 1,
233
- "contextWindowSize": 32768,
234
- "samplingParams": {
235
- "temperature": 0.7,
236
- "top_p": 0.9,
237
- "max_tokens": 4096
234
+ "openai": {
235
+ "protocol": "openai",
236
+ "models": [
237
+ {
238
+ "id": "qwen2.5-7b",
239
+ "name": "Qwen2.5 7B (Ollama)",
240
+ "envKey": "OLLAMA_API_KEY",
241
+ "baseUrl": "http://localhost:11434/v1",
242
+ "generationConfig": {
243
+ "timeout": 300000,
244
+ "maxRetries": 1,
245
+ "contextWindowSize": 32768,
246
+ "samplingParams": {
247
+ "temperature": 0.7,
248
+ "top_p": 0.9,
249
+ "max_tokens": 4096
250
+ }
238
251
  }
239
- }
240
- },
241
- {
242
- "id": "llama-3.1-8b",
243
- "name": "Llama 3.1 8B (vLLM)",
244
- "envKey": "VLLM_API_KEY",
245
- "baseUrl": "http://localhost:8000/v1",
246
- "generationConfig": {
247
- "timeout": 120000,
248
- "maxRetries": 2,
249
- "contextWindowSize": 128000,
250
- "samplingParams": {
251
- "temperature": 0.6,
252
- "max_tokens": 8192
252
+ },
253
+ {
254
+ "id": "llama-3.1-8b",
255
+ "name": "Llama 3.1 8B (vLLM)",
256
+ "envKey": "VLLM_API_KEY",
257
+ "baseUrl": "http://localhost:8000/v1",
258
+ "generationConfig": {
259
+ "timeout": 120000,
260
+ "maxRetries": 2,
261
+ "contextWindowSize": 128000,
262
+ "samplingParams": {
263
+ "temperature": 0.6,
264
+ "max_tokens": 8192
265
+ }
253
266
  }
254
- }
255
- },
256
- {
257
- "id": "local-model",
258
- "name": "Local Model (LM Studio)",
259
- "envKey": "LMSTUDIO_API_KEY",
260
- "baseUrl": "http://localhost:1234/v1",
261
- "generationConfig": {
262
- "timeout": 60000,
263
- "samplingParams": {
264
- "temperature": 0.5
267
+ },
268
+ {
269
+ "id": "local-model",
270
+ "name": "Local Model (LM Studio)",
271
+ "envKey": "LMSTUDIO_API_KEY",
272
+ "baseUrl": "http://localhost:1234/v1",
273
+ "generationConfig": {
274
+ "timeout": 60000,
275
+ "samplingParams": {
276
+ "temperature": 0.5
277
+ }
265
278
  }
266
279
  }
267
- }
268
- ]
280
+ ]
281
+ }
269
282
  }
270
283
  }
271
284
  ```
@@ -332,7 +345,7 @@ When you authenticate with an Alibaba Cloud Coding Plan API key using the `/auth
332
345
  - **China**: <https://bailian.console.aliyun.com/?tab=model#/efm/coding_plan>
333
346
  - **International**: <https://modelstudio.console.alibabacloud.com/?tab=dashboard#/efm/coding_plan>
334
347
  2. Run the `/auth` command in Qwen Code
335
- 3. Select **Alibaba Cloud Coding Plan**
348
+ 3. Select **Alibaba ModelStudio**, then choose **Coding Plan** from the sub-menu
336
349
  4. Select your region
337
350
  5. Enter your API key when prompted
338
351
 
@@ -381,15 +394,18 @@ If you prefer to manually configure Coding Plan models, you can add them to your
381
394
  ```json
382
395
  {
383
396
  "modelProviders": {
384
- "openai": [
385
- {
386
- "id": "qwen3-coder-plus",
387
- "name": "qwen3-coder-plus",
388
- "description": "Qwen3-Coder via Alibaba Cloud Coding Plan",
389
- "envKey": "YOUR_CUSTOM_ENV_KEY",
390
- "baseUrl": "https://coding.dashscope.aliyuncs.com/v1"
391
- }
392
- ]
397
+ "openai": {
398
+ "protocol": "openai",
399
+ "models": [
400
+ {
401
+ "id": "qwen3-coder-plus",
402
+ "name": "qwen3-coder-plus",
403
+ "description": "Qwen3-Coder via Alibaba Cloud Coding Plan",
404
+ "envKey": "YOUR_CUSTOM_ENV_KEY",
405
+ "baseUrl": "https://coding.dashscope.aliyuncs.com/v1"
406
+ }
407
+ ]
408
+ }
393
409
  }
394
410
  }
395
411
  ```
@@ -414,10 +430,10 @@ The effective auth/model/credential values are chosen per field using the follow
414
430
  | -------------------------- | ----------------------------------- | ----------------------------------------------- | --------------------------------------------------- | ---------------------------------------------------- | ---------------------- | --------------------------------- |
415
431
  | Programmatic overrides | `/auth` | `/auth` input | `/auth` input | `/auth` input | — | — |
416
432
  | Model provider selection | — | `modelProvider.id` | `env[modelProvider.envKey]` | `modelProvider.baseUrl` | `modelProvider.envKey` | — |
417
- | CLI arguments | `--auth-type` | `--model` | `--openaiApiKey` (or provider-specific equivalents) | `--openaiBaseUrl` (or provider-specific equivalents) | — | — |
433
+ | CLI arguments | `--auth-type` | `--model` | `--openai-api-key` (or provider-specific equivalents) | `--openai-base-url` (or provider-specific equivalents) | — | — |
418
434
  | Environment variables | — | Provider-specific mapping (e.g. `OPENAI_MODEL`) | Provider-specific mapping (e.g. `OPENAI_API_KEY`) | Provider-specific mapping (e.g. `OPENAI_BASE_URL`) | — | — |
419
435
  | Settings (`settings.json`) | `security.auth.selectedType` | `model.name` | `security.auth.apiKey` | `security.auth.baseUrl` | — | — |
420
- | Default / computed | Falls back to `AuthType.QWEN_OAUTH` | Built-in default (OpenAI ⇒ `qwen3-coder-plus`) | — | — | — | `Config.getProxy()` if configured |
436
+ | Default / computed | Falls back to `AuthType.QWEN_OAUTH` | Built-in default (OpenAI ⇒ `qwen3.5-plus`) | — | — | — | `Config.getProxy()` if configured |
421
437
 
422
438
  \*When present, CLI auth flags override settings. Otherwise, `security.auth.selectedType` or the implicit default determine the auth type. Qwen OAuth and OpenAI are the only auth types surfaced without extra configuration.
423
439
 
@@ -469,7 +485,7 @@ The following fields are treated as atomic objects - provider values completely
469
485
 
470
486
  ### Example
471
487
 
472
- ```json
488
+ ```jsonc
473
489
  // User settings (~/.qwen/settings.json)
474
490
  {
475
491
  "model": {
@@ -483,14 +499,17 @@ The following fields are treated as atomic objects - provider values completely
483
499
  // modelProviders configuration
484
500
  {
485
501
  "modelProviders": {
486
- "openai": [{
487
- "id": "gpt-4o",
488
- "envKey": "OPENAI_API_KEY",
489
- "generationConfig": {
490
- "timeout": 60000,
491
- "samplingParams": { "temperature": 0.2 }
492
- }
493
- }]
502
+ "openai": {
503
+ "protocol": "openai",
504
+ "models": [{
505
+ "id": "gpt-4o",
506
+ "envKey": "OPENAI_API_KEY",
507
+ "generationConfig": {
508
+ "timeout": 60000,
509
+ "samplingParams": { "temperature": 0.2 }
510
+ }
511
+ }]
512
+ }
494
513
  }
495
514
  }
496
515
  ```
@@ -516,22 +535,25 @@ The optional `reasoning` field under `generationConfig` controls how aggressivel
516
535
  ```jsonc
517
536
  {
518
537
  "modelProviders": {
519
- "openai": [
520
- {
521
- "id": "deepseek-v4-pro",
522
- "name": "DeepSeek V4 Pro",
523
- "baseUrl": "https://api.deepseek.com/v1",
524
- "envKey": "DEEPSEEK_API_KEY",
525
- "generationConfig": {
526
- // The four-tier scale:
527
- // 'low' | 'medium' — server-mapped to 'high' on DeepSeek
528
- // 'high' — default reasoning intensity
529
- // 'max' — DeepSeek-specific extra-strong tier
530
- // Or set `false` to disable reasoning entirely.
531
- "reasoning": { "effort": "max" },
538
+ "openai": {
539
+ "protocol": "openai",
540
+ "models": [
541
+ {
542
+ "id": "deepseek-v4-pro",
543
+ "name": "DeepSeek V4 Pro",
544
+ "baseUrl": "https://api.deepseek.com/v1",
545
+ "envKey": "DEEPSEEK_API_KEY",
546
+ "generationConfig": {
547
+ // The four-tier scale:
548
+ // 'low' | 'medium' server-mapped to 'high' on DeepSeek
549
+ // 'high' — default reasoning intensity
550
+ // 'max' — DeepSeek-specific extra-strong tier
551
+ // Or set `false` to disable reasoning entirely.
552
+ "reasoning": { "effort": "max" },
553
+ },
532
554
  },
533
- },
534
- ],
555
+ ],
556
+ },
535
557
  },
536
558
  }
537
559
  ```
@@ -598,7 +620,7 @@ When you configure a model without using `modelProviders`, Qwen Code automatical
598
620
 
599
621
  ```bash
600
622
  # This creates a RuntimeModelSnapshot with ID: $runtime|openai|my-custom-model
601
- qwen --auth-type openai --model my-custom-model --openaiApiKey $KEY --openaiBaseUrl https://api.example.com/v1
623
+ qwen --auth-type openai --model my-custom-model --openai-api-key $KEY --openai-base-url https://api.example.com/v1
602
624
  ```
603
625
 
604
626
  The snapshot: