@qwen-code/qwen-code 0.18.4 → 0.18.5-preview.0

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 (179) 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 +75 -54
  4. package/bundled/qc-helper/docs/configuration/model-providers.md +221 -185
  5. package/bundled/qc-helper/docs/configuration/qwen-ignore.md +31 -15
  6. package/bundled/qc-helper/docs/configuration/settings.md +70 -53
  7. package/bundled/qc-helper/docs/configuration/themes.md +7 -4
  8. package/bundled/qc-helper/docs/extension/extension-releasing.md +1 -1
  9. package/bundled/qc-helper/docs/extension/introduction.md +27 -21
  10. package/bundled/qc-helper/docs/features/approval-mode.md +2 -0
  11. package/bundled/qc-helper/docs/features/arena.md +3 -3
  12. package/bundled/qc-helper/docs/features/channels/overview.md +1 -1
  13. package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
  14. package/bundled/qc-helper/docs/features/commands.md +6 -1
  15. package/bundled/qc-helper/docs/features/headless.md +1 -1
  16. package/bundled/qc-helper/docs/features/mcp.md +78 -10
  17. package/bundled/qc-helper/docs/features/sandbox.md +2 -2
  18. package/bundled/qc-helper/docs/features/tool-use-summaries.md +1 -1
  19. package/bundled/qc-helper/docs/integration-github-action.md +2 -2
  20. package/bundled/qc-helper/docs/overview.md +1 -1
  21. package/bundled/qc-helper/docs/quickstart.md +9 -5
  22. package/bundled/qc-helper/docs/qwen-serve.md +14 -2
  23. package/bundled/qc-helper/docs/support/tos-privacy.md +1 -1
  24. package/chunks/{agent-LYTC56HT.js → agent-P4KSTVXX.js} +24 -22
  25. package/chunks/{agent-headless-FPUP5WHP.js → agent-headless-QUAPWF55.js} +24 -22
  26. package/chunks/{anthropicContentGenerator-OLOGBVLP.js → anthropicContentGenerator-7352A7I5.js} +17 -14
  27. package/chunks/artifact-tool-5J4HUZAV.js +675 -0
  28. package/chunks/{askUserQuestion-ANRVSBIJ.js → askUserQuestion-HF7HCWDD.js} +20 -7
  29. package/chunks/{ca-K6MD665I.js → ca-7WC7ELX6.js} +1 -0
  30. package/chunks/chunk-22IFUCVR.js +291 -0
  31. package/chunks/{chunk-M5VYHAHT.js → chunk-2BIF2NVV.js} +2 -2
  32. package/chunks/{chunk-AQDPHFDZ.js → chunk-2QDQTWCI.js} +1 -1
  33. package/chunks/{chunk-2ES3D3TW.js → chunk-3BR4OIOE.js} +3 -3
  34. package/chunks/{chunk-N5QHMPZU.js → chunk-3UALQ56H.js} +1 -1
  35. package/chunks/{chunk-5RVEAAD2.js → chunk-BC5POO46.js} +8 -7
  36. package/chunks/{chunk-DZCZZPCY.js → chunk-BGUDAULQ.js} +11 -290
  37. package/chunks/{chunk-FPZF3BNV.js → chunk-BNXANYLH.js} +1 -1
  38. package/chunks/{chunk-IKOWINH4.js → chunk-C4K3FEQ2.js} +42 -2
  39. package/chunks/{chunk-PTGKSUUJ.js → chunk-CGEGHF2C.js} +2 -207
  40. package/chunks/chunk-EEEZIVFJ.js +908 -0
  41. package/chunks/{chunk-GBTJHKQ6.js → chunk-EIJYMXXX.js} +619 -135
  42. package/chunks/chunk-EJYJYJZ2.js +3703 -0
  43. package/chunks/{chunk-F6FP3URI.js → chunk-EW6C27XX.js} +1 -1
  44. package/chunks/{chunk-HU3RKEK2.js → chunk-F6XNTYNE.js} +216 -1
  45. package/chunks/{chunk-4HMWGHPP.js → chunk-GZCJS5WH.js} +2 -2
  46. package/chunks/{chunk-E5SRTXRG.js → chunk-HGNSRCRB.js} +1 -1
  47. package/chunks/{chunk-IUEQOXOI.js → chunk-KBXLIVWQ.js} +2 -2
  48. package/chunks/{chunk-JJHY7NAD.js → chunk-L7U2RI5O.js} +59 -57
  49. package/chunks/{chunk-JN6FVOPP.js → chunk-NKJ6LRCR.js} +2 -2
  50. package/chunks/{chunk-7OCZ77KA.js → chunk-NWLUISRA.js} +1 -1
  51. package/chunks/{chunk-JIJBNW4A.js → chunk-OTBK43JR.js} +1 -1
  52. package/chunks/{chunk-WWU2KUSR.js → chunk-PRYMDRBV.js} +1 -1
  53. package/chunks/{chunk-KQIKOTQJ.js → chunk-RYLJU2DY.js} +60 -5
  54. package/chunks/{chunk-VWPDSQZY.js → chunk-T2VDEFUU.js} +2 -2
  55. package/chunks/{chunk-LXUQBWQA.js → chunk-T336V435.js} +93 -45
  56. package/chunks/{chunk-4TW2JM5Q.js → chunk-TXVGVZYR.js} +3 -3
  57. package/chunks/{chunk-6Z2MVJIJ.js → chunk-UMRZ7XCR.js} +172 -5017
  58. package/chunks/{chunk-7GX7XYZU.js → chunk-XU5P23GN.js} +3 -3
  59. package/chunks/{chunk-SZWDOOGV.js → chunk-ZC675NGC.js} +11 -11
  60. package/chunks/{chunk-32SSXBMG.js → chunk-ZXNEOCW2.js} +8049 -5520
  61. package/chunks/{computer-use-P4WQBATW.js → computer-use-4TLHI3UR.js} +26 -23
  62. package/chunks/contextCommand-HFEITKSR.js +56 -0
  63. package/chunks/{cron-create-OKGQO6GX.js → cron-create-A5637KCI.js} +12 -9
  64. package/chunks/{cron-delete-DTJP7L6O.js → cron-delete-AADOSEOZ.js} +4 -4
  65. package/chunks/{cron-list-VKZUASFG.js → cron-list-OFCPTT2Y.js} +4 -4
  66. package/chunks/{de-K2F3T3TR.js → de-ACHALDED.js} +1 -0
  67. package/chunks/{dist-OLC6NBSB.js → dist-DZ6AJDX4.js} +1 -1
  68. package/chunks/{dist-QUSDBLAK.js → dist-ZBX7LPJZ.js} +6 -1
  69. package/chunks/{edit-CS7DSS4Z.js → edit-B7H73V6O.js} +24 -22
  70. package/chunks/{en-KGSAKBJP.js → en-7OGNWWME.js} +49 -0
  71. package/chunks/{enter-worktree-PA4HPHJK.js → enter-worktree-GG7ZHYPS.js} +24 -22
  72. package/chunks/{enterPlanMode-SFE5AFKZ.js → enterPlanMode-RHTAKG52.js} +32 -28
  73. package/chunks/{exit-worktree-FR3AZTC6.js → exit-worktree-U7VQZRMG.js} +24 -22
  74. package/chunks/{exitPlanMode-AHOUO44D.js → exitPlanMode-S35A36II.js} +36 -28
  75. package/chunks/{fr-2CAQEOK6.js → fr-GVKZ27MF.js} +1 -0
  76. package/chunks/{geminiContentGenerator-AXCVDKGI.js → geminiContentGenerator-W7KVATBA.js} +4 -4
  77. package/chunks/{glob-BQPAW3IW.js → glob-WOFF7ECI.js} +26 -23
  78. package/chunks/{grep-2F7BL5TQ.js → grep-MWNYWYWQ.js} +24 -22
  79. package/chunks/{ja-QWL7V6OJ.js → ja-FKZ2WZ4D.js} +1 -0
  80. package/chunks/{keychain-token-storage-ALKQXYJQ.js → keychain-token-storage-CSYMNRPP.js} +2 -2
  81. package/chunks/{loop-wakeup-RX6YIUSG.js → loop-wakeup-DGSMT4N6.js} +5 -5
  82. package/chunks/{ls-6PLNWHMU.js → ls-UGRZ4ZOM.js} +6 -6
  83. package/chunks/{lsp-3HFQU4OF.js → lsp-72IJURW3.js} +2 -2
  84. package/chunks/{monitor-YTTMDFW2.js → monitor-AYUINLYN.js} +24 -22
  85. package/chunks/{notebook-edit-7TNZMTBR.js → notebook-edit-EP4D4WFD.js} +25 -23
  86. package/chunks/{openaiContentGenerator-JA6YXXPI.js → openaiContentGenerator-SLYYF7AM.js} +12 -13
  87. package/chunks/{pt-2SPOLMAY.js → pt-SY5NCFGR.js} +1 -0
  88. package/chunks/{qwenContentGenerator-NBOVGW7B.js → qwenContentGenerator-VZ7JYU4A.js} +27 -25
  89. package/chunks/{qwenOAuth2-XWC5SU63.js → qwenOAuth2-K4AASPCV.js} +5 -4
  90. package/chunks/{read-file-RUBU3KUA.js → read-file-65EQ53KS.js} +9 -8
  91. package/chunks/{ripGrep-TPFC7KZF.js → ripGrep-5XLHJDDM.js} +24 -22
  92. package/chunks/{ru-35IVJTEH.js → ru-FWNXJG4F.js} +1 -0
  93. package/chunks/{scheduler-NTVF45LR.js → scheduler-5GLJSA2H.js} +73 -27
  94. package/chunks/{send-message-IIT3SHA7.js → send-message-URUZ7PLA.js} +24 -4
  95. package/chunks/{serve-J6VG37OX.js → serve-MUROZGCG.js} +7575 -6916
  96. package/chunks/{shell-EQQEHEFI.js → shell-ET3BQWKB.js} +24 -22
  97. package/chunks/{skill-QWRWJCQJ.js → skill-YEYABCAF.js} +11 -10
  98. package/chunks/{src-LNADIG5P.js → src-POVOI65Y.js} +165 -66
  99. package/chunks/{syntheticOutput-H67FYXU7.js → syntheticOutput-65FRJGWM.js} +3 -3
  100. package/chunks/{task-create-OVXHSHAI.js → task-create-IH45HOFT.js} +6 -6
  101. package/chunks/{task-list-QUUCQJ3U.js → task-list-FUB6JWSX.js} +5 -5
  102. package/chunks/{task-stop-WA5DMTKK.js → task-stop-P6IOHQM3.js} +2 -2
  103. package/chunks/{task-update-PC5427TI.js → task-update-RTUT7LJV.js} +6 -6
  104. package/chunks/{team-create-TXWQL777.js → team-create-EFZFKQFP.js} +28 -26
  105. package/chunks/{team-delete-ZTEMYRJ3.js → team-delete-RXGYRMHC.js} +5 -5
  106. package/chunks/{todoWrite-J6L6ELD6.js → todoWrite-O6JK24G6.js} +4 -4
  107. package/chunks/{tool-search-JAVM7ABF.js → tool-search-BRJC42TE.js} +9 -8
  108. package/chunks/{web-fetch-6XLPPTP7.js → web-fetch-KUMBROUI.js} +4 -4
  109. package/chunks/{workflow-7LN3L6KK.js → workflow-UDRBNFTT.js} +557 -97
  110. package/chunks/{write-file-DAKE7YKB.js → write-file-F7TAHAHF.js} +24 -22
  111. package/chunks/{zh-X4KM6MTW.js → zh-3RMSEO5M.js} +49 -0
  112. package/chunks/{zh-TW-BSG6BUWK.js → zh-TW-R7WRLTJS.js} +49 -0
  113. package/cli.js +9205 -5426
  114. package/locales/ca.js +2 -1
  115. package/locales/de.js +1 -0
  116. package/locales/en.js +70 -0
  117. package/locales/fr.js +1 -0
  118. package/locales/ja.js +1 -0
  119. package/locales/pt.js +1 -0
  120. package/locales/ru.js +1 -0
  121. package/locales/zh-TW.js +67 -0
  122. package/locales/zh.js +67 -0
  123. package/package.json +3 -2
  124. package/web-shell/assets/{arc-CRFN10gD.js → arc-DHUeMnnj.js} +1 -1
  125. package/web-shell/assets/{architectureDiagram-3BPJPVTR-IRlu1CpH.js → architectureDiagram-3BPJPVTR-DlX12yyj.js} +1 -1
  126. package/web-shell/assets/{blockDiagram-GPEHLZMM-htIZ6iw8.js → blockDiagram-GPEHLZMM-DTFUXMUT.js} +1 -1
  127. package/web-shell/assets/{c4Diagram-AAUBKEIU-A2GoRq3O.js → c4Diagram-AAUBKEIU-CWdB54fk.js} +1 -1
  128. package/web-shell/assets/channel-C3WhMjjP.js +1 -0
  129. package/web-shell/assets/{chunk-2J33WTMH-CdP2AC6u.js → chunk-2J33WTMH-CF5C5jNR.js} +1 -1
  130. package/web-shell/assets/{chunk-4BX2VUAB-DrA07nW2.js → chunk-4BX2VUAB-Cw7Ydfji.js} +1 -1
  131. package/web-shell/assets/{chunk-55IACEB6-CFGnVU2f.js → chunk-55IACEB6-CnbI1ZCw.js} +1 -1
  132. package/web-shell/assets/{chunk-727SXJPM-BTMkq3Tk.js → chunk-727SXJPM-DmSy00Pe.js} +1 -1
  133. package/web-shell/assets/{chunk-AQP2D5EJ-C9sYg04Z.js → chunk-AQP2D5EJ-DgNgXqBu.js} +1 -1
  134. package/web-shell/assets/{chunk-FMBD7UC4-Cag-cj6I.js → chunk-FMBD7UC4-tz2IvOXv.js} +1 -1
  135. package/web-shell/assets/{chunk-ND2GUHAM-CDSTFoR7.js → chunk-ND2GUHAM-DaBLEBPa.js} +1 -1
  136. package/web-shell/assets/{chunk-QZHKN3VN-CN9Z6oOs.js → chunk-QZHKN3VN-DVCQST3O.js} +1 -1
  137. package/web-shell/assets/classDiagram-4FO5ZUOK-CQ6TXPif.js +1 -0
  138. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CQ6TXPif.js +1 -0
  139. package/web-shell/assets/{cose-bilkent-S5V4N54A-DuN9j8Du.js → cose-bilkent-S5V4N54A-CAKTcdCQ.js} +1 -1
  140. package/web-shell/assets/{dagre-BM42HDAG-ByCWe45f.js → dagre-BM42HDAG-BdkBwlKg.js} +1 -1
  141. package/web-shell/assets/{diagram-2AECGRRQ-eWyU_pKZ.js → diagram-2AECGRRQ-DYt3G65F.js} +1 -1
  142. package/web-shell/assets/{diagram-5GNKFQAL-0Bfu3Fq5.js → diagram-5GNKFQAL-BWvROWjY.js} +1 -1
  143. package/web-shell/assets/{diagram-KO2AKTUF-B6KBKkQP.js → diagram-KO2AKTUF-BvvgwIaQ.js} +1 -1
  144. package/web-shell/assets/{diagram-LMA3HP47-TToDmeA_.js → diagram-LMA3HP47-E7NLSNKg.js} +1 -1
  145. package/web-shell/assets/{diagram-OG6HWLK6-CQCkC2Yx.js → diagram-OG6HWLK6-CYmUBgpE.js} +1 -1
  146. package/web-shell/assets/{erDiagram-TEJ5UH35-Cm9ls1iB.js → erDiagram-TEJ5UH35-BU5gY30h.js} +1 -1
  147. package/web-shell/assets/{flowDiagram-I6XJVG4X-Dyoz80Pv.js → flowDiagram-I6XJVG4X-V_ZssSZ9.js} +1 -1
  148. package/web-shell/assets/{ganttDiagram-6RSMTGT7-Cfut9yaU.js → ganttDiagram-6RSMTGT7-QIShlsdI.js} +1 -1
  149. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BCuJdlfD.js → gitGraphDiagram-PVQCEYII-DJxdu2YS.js} +1 -1
  150. package/web-shell/assets/index-BPnhI7gl.css +1 -0
  151. package/web-shell/assets/index-De4rqTsW.js +706 -0
  152. package/web-shell/assets/{infoDiagram-5YYISTIA-CXKxF2VL.js → infoDiagram-5YYISTIA-BqjdrFeO.js} +1 -1
  153. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DE7HWSU8.js → ishikawaDiagram-YF4QCWOH-BP_a2YZ2.js} +1 -1
  154. package/web-shell/assets/{journeyDiagram-JHISSGLW-D__YUfds.js → journeyDiagram-JHISSGLW-BXg-S3Lk.js} +1 -1
  155. package/web-shell/assets/{kanban-definition-UN3LZRKU-D82R169M.js → kanban-definition-UN3LZRKU-BksAkdEJ.js} +1 -1
  156. package/web-shell/assets/{linear-DpyMbKqT.js → linear-D2m9-ODE.js} +1 -1
  157. package/web-shell/assets/{mermaid.core-D1KEFDhn.js → mermaid.core-dTtkZp2F.js} +5 -5
  158. package/web-shell/assets/{mindmap-definition-RKZ34NQL-BwVUFGFE.js → mindmap-definition-RKZ34NQL-Bft9my8O.js} +1 -1
  159. package/web-shell/assets/{pieDiagram-4H26LBE5-BO_qoEGx.js → pieDiagram-4H26LBE5-Cw8S-alZ.js} +1 -1
  160. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-Cx0ZaWPo.js → quadrantDiagram-W4KKPZXB-DaDoTMts.js} +1 -1
  161. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BJPXejOA.js → requirementDiagram-4Y6WPE33-Cp5kSpwj.js} +1 -1
  162. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-C1xeIL9i.js → sankeyDiagram-5OEKKPKP-CW8RsJJZ.js} +1 -1
  163. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-CSYKQUjf.js → sequenceDiagram-3UESZ5HK-DTfpIiJK.js} +1 -1
  164. package/web-shell/assets/{stateDiagram-AJRCARHV-d9hiHlAW.js → stateDiagram-AJRCARHV-DixFVzEs.js} +1 -1
  165. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DZgE04s3.js +1 -0
  166. package/web-shell/assets/{timeline-definition-PNZ67QCA-BhCBkq8k.js → timeline-definition-PNZ67QCA-DYsbXn5l.js} +1 -1
  167. package/web-shell/assets/{vennDiagram-CIIHVFJN-DPPFWp_y.js → vennDiagram-CIIHVFJN-HUpRpuUp.js} +1 -1
  168. package/web-shell/assets/{wardley-L42UT6IY-CcOUIgXY.js → wardley-L42UT6IY-cT3nQH_T.js} +1 -1
  169. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-p7oR5X7r.js → wardleyDiagram-YWT4CUSO-Dmm7J6Qc.js} +1 -1
  170. package/web-shell/assets/{xychartDiagram-2RQKCTM6-Dfr7-SEy.js → xychartDiagram-2RQKCTM6-CX0L5p9C.js} +1 -1
  171. package/web-shell/index.html +3 -3
  172. package/chunks/chunk-77WXWU44.js +0 -26
  173. package/chunks/contextCommand-POQ6GYN3.js +0 -54
  174. package/web-shell/assets/channel-WwImfsc7.js +0 -1
  175. package/web-shell/assets/classDiagram-4FO5ZUOK-CJKQYFeJ.js +0 -1
  176. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CJKQYFeJ.js +0 -1
  177. package/web-shell/assets/index-BDZiTAkl.css +0 -1
  178. package/web-shell/assets/index-DaebdpHq.js +0 -516
  179. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DgReoybQ.js +0 -1
@@ -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
 
@@ -47,72 +48,89 @@ This means the `baseUrl` you configure should be compatible with the correspondi
47
48
 
48
49
  ### OpenAI-compatible providers (`openai`)
49
50
 
50
- This auth type supports not only OpenAI's official API but also any OpenAI-compatible endpoint, including aggregated model providers like OpenRouter.
51
+ This auth type supports not only OpenAI's official API but also any OpenAI-compatible endpoint, including aggregated model providers like OpenRouter and Requesty.
51
52
 
52
53
  ```json
53
54
  {
54
55
  "env": {
55
56
  "OPENAI_API_KEY": "sk-your-actual-openai-key-here",
56
- "OPENROUTER_API_KEY": "sk-or-your-actual-openrouter-key-here"
57
+ "OPENROUTER_API_KEY": "sk-or-your-actual-openrouter-key-here",
58
+ "REQUESTY_API_KEY": "sk-your-actual-requesty-key-here"
57
59
  },
58
60
  "modelProviders": {
59
- "openai": [
60
- {
61
- "id": "gpt-4o",
62
- "name": "GPT-4o",
63
- "envKey": "OPENAI_API_KEY",
64
- "baseUrl": "https://api.openai.com/v1",
65
- "generationConfig": {
66
- "timeout": 60000,
67
- "maxRetries": 3,
68
- "enableCacheControl": true,
69
- "contextWindowSize": 128000,
70
- "modalities": {
71
- "image": true
72
- },
73
- "customHeaders": {
74
- "X-Client-Request-ID": "req-123"
75
- },
76
- "extra_body": {
77
- "enable_thinking": true,
78
- "service_tier": "priority"
79
- },
80
- "samplingParams": {
81
- "temperature": 0.2,
82
- "top_p": 0.8,
83
- "max_tokens": 4096,
84
- "presence_penalty": 0.1,
85
- "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
+ }
86
91
  }
87
- }
88
- },
89
- {
90
- "id": "gpt-4o-mini",
91
- "name": "GPT-4o Mini",
92
- "envKey": "OPENAI_API_KEY",
93
- "baseUrl": "https://api.openai.com/v1",
94
- "generationConfig": {
95
- "timeout": 30000,
96
- "samplingParams": {
97
- "temperature": 0.5,
98
- "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
+ }
99
104
  }
100
- }
101
- },
102
- {
103
- "id": "openai/gpt-4o",
104
- "name": "GPT-4o (via OpenRouter)",
105
- "envKey": "OPENROUTER_API_KEY",
106
- "baseUrl": "https://openrouter.ai/api/v1",
107
- "generationConfig": {
108
- "timeout": 120000,
109
- "maxRetries": 3,
110
- "samplingParams": {
111
- "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
+ }
117
+ }
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
+ }
112
130
  }
113
131
  }
114
- }
115
- ]
132
+ ]
133
+ }
116
134
  }
117
135
  }
118
136
  ```
@@ -125,37 +143,40 @@ This auth type supports not only OpenAI's official API but also any OpenAI-compa
125
143
  "ANTHROPIC_API_KEY": "sk-ant-your-actual-anthropic-key-here"
126
144
  },
127
145
  "modelProviders": {
128
- "anthropic": [
129
- {
130
- "id": "claude-3-5-sonnet",
131
- "name": "Claude 3.5 Sonnet",
132
- "envKey": "ANTHROPIC_API_KEY",
133
- "baseUrl": "https://api.anthropic.com/v1",
134
- "generationConfig": {
135
- "timeout": 120000,
136
- "maxRetries": 3,
137
- "contextWindowSize": 200000,
138
- "samplingParams": {
139
- "temperature": 0.7,
140
- "max_tokens": 8192,
141
- "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
+ }
142
163
  }
143
- }
144
- },
145
- {
146
- "id": "claude-3-opus",
147
- "name": "Claude 3 Opus",
148
- "envKey": "ANTHROPIC_API_KEY",
149
- "baseUrl": "https://api.anthropic.com/v1",
150
- "generationConfig": {
151
- "timeout": 180000,
152
- "samplingParams": {
153
- "temperature": 0.3,
154
- "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
+ }
155
176
  }
156
177
  }
157
- }
158
- ]
178
+ ]
179
+ }
159
180
  }
160
181
  }
161
182
  ```
@@ -168,29 +189,32 @@ This auth type supports not only OpenAI's official API but also any OpenAI-compa
168
189
  "GEMINI_API_KEY": "AIza-your-actual-gemini-key-here"
169
190
  },
170
191
  "modelProviders": {
171
- "gemini": [
172
- {
173
- "id": "gemini-2.0-flash",
174
- "name": "Gemini 2.0 Flash",
175
- "envKey": "GEMINI_API_KEY",
176
- "baseUrl": "https://generativelanguage.googleapis.com",
177
- "capabilities": {
178
- "vision": true
179
- },
180
- "generationConfig": {
181
- "timeout": 60000,
182
- "maxRetries": 2,
183
- "contextWindowSize": 1000000,
184
- "schemaCompliance": "auto",
185
- "samplingParams": {
186
- "temperature": 0.4,
187
- "top_p": 0.95,
188
- "max_tokens": 8192,
189
- "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
+ }
190
214
  }
191
215
  }
192
- }
193
- ]
216
+ ]
217
+ }
194
218
  }
195
219
  }
196
220
  ```
@@ -207,51 +231,54 @@ Most local inference servers (vLLM, Ollama, LM Studio, etc.) provide an OpenAI-c
207
231
  "LMSTUDIO_API_KEY": "lm-studio"
208
232
  },
209
233
  "modelProviders": {
210
- "openai": [
211
- {
212
- "id": "qwen2.5-7b",
213
- "name": "Qwen2.5 7B (Ollama)",
214
- "envKey": "OLLAMA_API_KEY",
215
- "baseUrl": "http://localhost:11434/v1",
216
- "generationConfig": {
217
- "timeout": 300000,
218
- "maxRetries": 1,
219
- "contextWindowSize": 32768,
220
- "samplingParams": {
221
- "temperature": 0.7,
222
- "top_p": 0.9,
223
- "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
+ }
224
251
  }
225
- }
226
- },
227
- {
228
- "id": "llama-3.1-8b",
229
- "name": "Llama 3.1 8B (vLLM)",
230
- "envKey": "VLLM_API_KEY",
231
- "baseUrl": "http://localhost:8000/v1",
232
- "generationConfig": {
233
- "timeout": 120000,
234
- "maxRetries": 2,
235
- "contextWindowSize": 128000,
236
- "samplingParams": {
237
- "temperature": 0.6,
238
- "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
+ }
239
266
  }
240
- }
241
- },
242
- {
243
- "id": "local-model",
244
- "name": "Local Model (LM Studio)",
245
- "envKey": "LMSTUDIO_API_KEY",
246
- "baseUrl": "http://localhost:1234/v1",
247
- "generationConfig": {
248
- "timeout": 60000,
249
- "samplingParams": {
250
- "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
+ }
251
278
  }
252
279
  }
253
- }
254
- ]
280
+ ]
281
+ }
255
282
  }
256
283
  }
257
284
  ```
@@ -318,7 +345,7 @@ When you authenticate with an Alibaba Cloud Coding Plan API key using the `/auth
318
345
  - **China**: <https://bailian.console.aliyun.com/?tab=model#/efm/coding_plan>
319
346
  - **International**: <https://modelstudio.console.alibabacloud.com/?tab=dashboard#/efm/coding_plan>
320
347
  2. Run the `/auth` command in Qwen Code
321
- 3. Select **Alibaba Cloud Coding Plan**
348
+ 3. Select **Alibaba ModelStudio**, then choose **Coding Plan** from the sub-menu
322
349
  4. Select your region
323
350
  5. Enter your API key when prompted
324
351
 
@@ -367,15 +394,18 @@ If you prefer to manually configure Coding Plan models, you can add them to your
367
394
  ```json
368
395
  {
369
396
  "modelProviders": {
370
- "openai": [
371
- {
372
- "id": "qwen3-coder-plus",
373
- "name": "qwen3-coder-plus",
374
- "description": "Qwen3-Coder via Alibaba Cloud Coding Plan",
375
- "envKey": "YOUR_CUSTOM_ENV_KEY",
376
- "baseUrl": "https://coding.dashscope.aliyuncs.com/v1"
377
- }
378
- ]
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
+ }
379
409
  }
380
410
  }
381
411
  ```
@@ -400,10 +430,10 @@ The effective auth/model/credential values are chosen per field using the follow
400
430
  | -------------------------- | ----------------------------------- | ----------------------------------------------- | --------------------------------------------------- | ---------------------------------------------------- | ---------------------- | --------------------------------- |
401
431
  | Programmatic overrides | `/auth` | `/auth` input | `/auth` input | `/auth` input | — | — |
402
432
  | Model provider selection | — | `modelProvider.id` | `env[modelProvider.envKey]` | `modelProvider.baseUrl` | `modelProvider.envKey` | — |
403
- | 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) | — | — |
404
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`) | — | — |
405
435
  | Settings (`settings.json`) | `security.auth.selectedType` | `model.name` | `security.auth.apiKey` | `security.auth.baseUrl` | — | — |
406
- | 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 |
407
437
 
408
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.
409
439
 
@@ -455,7 +485,7 @@ The following fields are treated as atomic objects - provider values completely
455
485
 
456
486
  ### Example
457
487
 
458
- ```json
488
+ ```jsonc
459
489
  // User settings (~/.qwen/settings.json)
460
490
  {
461
491
  "model": {
@@ -469,14 +499,17 @@ The following fields are treated as atomic objects - provider values completely
469
499
  // modelProviders configuration
470
500
  {
471
501
  "modelProviders": {
472
- "openai": [{
473
- "id": "gpt-4o",
474
- "envKey": "OPENAI_API_KEY",
475
- "generationConfig": {
476
- "timeout": 60000,
477
- "samplingParams": { "temperature": 0.2 }
478
- }
479
- }]
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
+ }
480
513
  }
481
514
  }
482
515
  ```
@@ -502,22 +535,25 @@ The optional `reasoning` field under `generationConfig` controls how aggressivel
502
535
  ```jsonc
503
536
  {
504
537
  "modelProviders": {
505
- "openai": [
506
- {
507
- "id": "deepseek-v4-pro",
508
- "name": "DeepSeek V4 Pro",
509
- "baseUrl": "https://api.deepseek.com/v1",
510
- "envKey": "DEEPSEEK_API_KEY",
511
- "generationConfig": {
512
- // The four-tier scale:
513
- // 'low' | 'medium' — server-mapped to 'high' on DeepSeek
514
- // 'high' — default reasoning intensity
515
- // 'max' — DeepSeek-specific extra-strong tier
516
- // Or set `false` to disable reasoning entirely.
517
- "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
+ },
518
554
  },
519
- },
520
- ],
555
+ ],
556
+ },
521
557
  },
522
558
  }
523
559
  ```
@@ -584,7 +620,7 @@ When you configure a model without using `modelProviders`, Qwen Code automatical
584
620
 
585
621
  ```bash
586
622
  # This creates a RuntimeModelSnapshot with ID: $runtime|openai|my-custom-model
587
- 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
588
624
  ```
589
625
 
590
626
  The snapshot:
@@ -1,33 +1,49 @@
1
1
  # Ignoring Files
2
2
 
3
- This document provides an overview of the Qwen Ignore (`.qwenignore`) feature of Qwen Code.
3
+ This document provides an overview of the Qwen Ignore (`.qwenignore`) feature of Qwen Code. Qwen Code also recognizes custom ignore files configured by `context.fileFiltering.customIgnoreFiles`, which defaults to the compatibility files `.agentignore` and `.aiignore`.
4
4
 
5
- Qwen Code includes the ability to automatically ignore files, similar to `.gitignore` (used by Git). Adding paths to your `.qwenignore` file will exclude them from tools that support this feature, although they will still be visible to other services (such as Git).
5
+ Qwen Code includes the ability to automatically ignore files, similar to `.gitignore` (used by Git). Adding paths to `.qwenignore` or a configured custom ignore file will exclude them from tools that support this feature, although they will still be visible to other services (such as Git).
6
6
 
7
7
  ## How it works
8
8
 
9
- When you add a path to your `.qwenignore` file, tools that respect this file will exclude matching files and directories from their operations. For example, when you use the [`read_many_files`](../../developers/tools/multi-file) command, any paths in your `.qwenignore` file will be automatically excluded.
9
+ When you add a path to one of these ignore files, tools that respect Qwen ignore rules will exclude matching files and directories from their operations. For example, when you use the [`read_many_files`](../../developers/tools/multi-file) command, any paths in `.qwenignore` or configured custom ignore files will be automatically excluded.
10
10
 
11
- For the most part, `.qwenignore` follows the conventions of `.gitignore` files:
11
+ For the most part, these ignore files follow the conventions of `.gitignore` files:
12
12
 
13
13
  - Blank lines and lines starting with `#` are ignored.
14
14
  - Standard glob patterns are supported (such as `*`, `?`, and `[]`).
15
15
  - Putting a `/` at the end will only match directories.
16
- - Putting a `/` at the beginning anchors the path relative to the `.qwenignore` file.
16
+ - Putting a `/` at the beginning anchors the path relative to the ignore file.
17
17
  - `!` negates a pattern.
18
18
 
19
- You can update your `.qwenignore` file at any time. To apply the changes, you must restart your Qwen Code session.
19
+ You can update these ignore files at any time. To apply the changes, you must restart your Qwen Code session.
20
20
 
21
- ## How to use `.qwenignore`
21
+ ## How to use ignore files
22
22
 
23
- | Step | Description |
24
- | ---------------------- | -------------------------------------------------------------------------------------- |
25
- | **Enable .qwenignore** | Create a file named `.qwenignore` in your project root directory |
26
- | **Add ignore rules** | Open `.qwenignore` file and add paths to ignore, example: `/archive/` or `apikeys.txt` |
23
+ | Step | Description |
24
+ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
25
+ | **Enable ignore rules** | Create `.qwenignore`, a default custom file (`.agentignore` / `.aiignore`), or a configured custom ignore file in your project root directory |
26
+ | **Add ignore rules** | Open the ignore file and add paths to ignore, example: `/archive/` or `apikeys.txt` |
27
27
 
28
- ### `.qwenignore` examples
28
+ By default, Qwen Code reads `.qwenignore`, `.agentignore`, and `.aiignore`.
29
+ To use a different custom ignore file, configure:
29
30
 
30
- You can use `.qwenignore` to ignore directories and files:
31
+ ```json
32
+ {
33
+ "context": {
34
+ "fileFiltering": {
35
+ "customIgnoreFiles": [".cursorignore"]
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ `.qwenignore` is always included when `context.fileFiltering.respectQwenIgnore`
42
+ is enabled. Custom ignore file paths are relative to the project root.
43
+
44
+ ### Ignore file examples
45
+
46
+ You can use any supported ignore file to ignore directories and files:
31
47
 
32
48
  ```
33
49
  # Exclude your /packages/ directory and all subdirectories
@@ -37,7 +53,7 @@ You can use `.qwenignore` to ignore directories and files:
37
53
  apikeys.txt
38
54
  ```
39
55
 
40
- You can use wildcards in your `.qwenignore` file with `*`:
56
+ You can use wildcards in your ignore file with `*`:
41
57
 
42
58
  ```
43
59
  # Exclude all .md files
@@ -52,4 +68,4 @@ Finally, you can exclude files and directories from exclusion with `!`:
52
68
  !README.md
53
69
  ```
54
70
 
55
- To remove paths from your `.qwenignore` file, delete the relevant lines.
71
+ To remove paths from an ignore file, delete the relevant lines.