Skip to Content
BlogQwen Code Weekly: Auto Model Fallback, Nested Sub-agents, WeCom Channel Integration
Back to Blog

Qwen Code Weekly: Auto Model Fallback, Nested Sub-agents, WeCom Channel Integration

Qwen Team
2026-07-09

Qwen Code shipped v0.19.6 through v0.19.8 this week — 3 stable releases with 150+ PRs merged, covering four major areas:

Model overload no longer kills your session. Previously, a 429/503/529 would break the conversation entirely — you had to manually switch models and resend. Now the fallback chain automatically switches to the next model in line once the primary model’s retry budget is exhausted. Combined with /model --project to bind different models to different projects, no manual switching needed.

Sub-agents can now spawn sub-agents. Previously, sub-agents were leaf nodes — they received a task and had to finish it themselves with no way to delegate further. Now with a default nesting depth of 5 levels, sub-agents can break subtasks down to the next layer. Both TUI and Web Shell show a tree structure so you can see exactly who spawned whom.

Web Shell session management is now a real system. Archive/delete/named groups/color labels/scheduled task management page/split-screen session overview — the session sidebar used to only let you switch between sessions, now you can organize, categorize, monitor, and operate in parallel. 7 PRs turned sessions from a flat list into a manageable resource.

WeCom and permission controls filled in. WeCom smart bot channel integration — just Bot ID + Secret, no need for enterprise admin privileges or callback setup. PreToolUse hook’s “ask” now actually shows a confirmation dialog; previously this option silently denied. Permission rules also support Tool(param:value) syntax for parameter-level granularity.

New Features

Auto Model Fallback + Project-level Model Config

When a model hits 429/503/529, your conversation gets stuck. This release adds an opt-in fallback chain — once the primary model exhausts its retry budget on the same model, it automatically switches to the next model in the fallback list. Only capacity and rate-limiting issues trigger the fallback path. Authentication, quota, configuration, and client errors fail immediately because those aren’t “model overload” — they’re “your config is broken.”

The fallback advances before any visible output reaches the user. If a fallback model has already streamed partial content and then dies, remaining fallbacks won’t be tried — you see a truncated response. But the next user turn starts fresh from the primary model, so you won’t get stuck on a fallback.

With /model --project, you can bind different models to different projects. --project writes to the project’s .qwen/settings.json, --global writes to the user’s ~/.qwen/settings.json. Without a flag, current behavior is preserved. Scope flags also apply to --fast, --voice, and --vision.

What you can do with this:

  • Configure a fallback model list so overloaded models switch automatically — no manual model changes
  • Auth/quota errors won’t be masked by fallback — problems surface sooner
  • /model --project lets different projects use different models, config travels with the project
  • /model --global sets a global default that new projects inherit

See PRs #6273  and #6060 

Nested Sub-agent Spawning + Tree View

Sub-agents can now spawn their own sub-agents. Default depth limit is 5 levels, configurable via model.maxSubagentDepth. Set it to 1 to restore the old behavior where sub-agents cannot spawn children.

Two layers of protection: during schema preparation, the deepest sub-agents don’t see the agent tool (they have no idea it exists); at runtime, spawn requests beyond the depth limit are rejected.

Both TUI and Web Shell display the nested tree structure. Sub-agents appear below their parent with a ↳ marker and indentation. When a parent exits, its children are promoted to root nodes with a “from <parent>” annotation. The detail view shows “Level N · from <parent type>”. Blocking labels and stop confirmations are now chain-aware — the confirmation prompt only appears if a cancellation would cause the turn to end.

This capability is on by default — after upgrading, all existing environments gain nesting. Fork subprocesses, teammates, and workflow agents remain excluded. Arena sessions can now nest. Background agents restore their original depth and startup cap on resume.

What you can do with this:

  • Let sub-agents handle complex tasks by spawning their own children for subtasks
  • See the full agent tree in both TUI and Web Shell
  • Adjust nesting depth via model.maxSubagentDepth

See PRs #6189  and #6239 

Web Shell Session Management: Archive, Groups, Scheduled Tasks, Split Screen

7 PRs transformed the Web Shell session sidebar from a flat list into a panel you can organize, categorize, monitor, and operate in parallel.

Archive and delete. Each session row now has quick actions and a ”…” overflow menu (rename/archive/delete). Archived sessions collapse into a foldable “Archived” section and can be restored or permanently deleted. Active sessions cannot be archived or deleted; archived sessions can’t be opened (409 session_archived); deletion is hard delete with a confirmation prompt. Under the hood this uses the daemon’s archiveState and /sessions/archive, /sessions/unarchive endpoints.

Named groups and color labels. Create, rename, and delete groups; drag sessions into them; apply color labels and pin/archive states. Group data flows from the daemon layer through to the UI — daemon-side project-level sidecar files store group metadata, REST/ACP routes provide CRUD operations, exposed based on client capability gates.

Session overview and split screen. On larger screens, a session overview panel appears in the sidebar showing all sessions as live cards sorted by priority: approvals needed first, then running, then idle. Each card shows the current model and client count. Multi-select enables split-screen viewing — either within the current tab or in a new browser tab (?split=a,b URL parameter). N independent chat panels side by side, each with its own session context; keyboard focus only affects the clicked panel.

What you can do with this:

  • Archive and organize long-running sessions by project, with color labels
  • Visually create and manage scheduled tasks without writing cron expressions
  • Each scheduled task has its own session with accessible run history and transcripts
  • Split-screen on large displays to monitor multiple sessions in real time

See PRs #6293 , #6350 , #6305 , #6348 , #6389 , #6453 , #6400 

WeCom Channel Integration

Integrated WeCom smart bot via @wecom/aibot-node-sdk. Configuration only requires Bot ID and Secret — no Corp ID, Agent ID, callback Token, EncodingAESKey, or public callback URL needed.

Receives messages over a WebSocket long connection, supporting text, voice transcription, mixed text+image, images, files, videos, and quoted content. Assistant replies are sent in WeCom markdown format. Outbound only supports local image markers (within the channel’s temp directory); file/video/voice markers are ignored.

Configuration:

{ "type": "wecom", "botId": "your-bot-id", "secret": "your-secret", "cwd": "/path/to/project" }

Start command: qwen channel start my-wecom

What you can do with this:

  • Connect WeCom with just Bot ID + Secret — no enterprise admin privileges needed
  • Receive text, voice, images, files, videos, and quoted messages
  • Have Qwen Code reply in markdown format in WeCom group chats

See PR #6436 

Native Confirmation Dialog for PreToolUse Hook

Previously, PreToolUse hook returning permissionDecision: "ask" was equivalent to “deny” — no confirmation dialog ever appeared. Hook developers assumed users would see a choice, but the request was silently denied.

Now “ask” triggers a native TUI confirmation dialog. Options are “Yes, allow once” and “No, suggest changes” — there’s no “always allow” because the hook re-evaluates on every invocation. Approval re-executes the tool; denial cancels it.

In non-interactive CLI and background agent contexts, “ask” falls back to deny — it won’t hang waiting for input. Reuses the existing awaiting_approval mechanism without introducing a separate path. “denied” and “stop” behavior is unchanged; PermissionRequest hooks are unaffected.

What you can do with this:

  • Use “ask” in PreToolUse hooks to let users decide whether to execute a tool
  • No risk of hanging in non-interactive contexts
  • Hook re-evaluates every invocation — no permanent pass-through

See PR #5629 

Auto-generated Skills Preview Review

When agents auto-generate skills, previously you could only see the filename and had to accept before reading the contents. Now the review dialog shows an inline preview of the full content — including frontmatter.

Model-generated content is sanitized: ANSI/VT control sequences become harmless escapes, CRLF becomes regular newlines. Read limit is 64 KiB, display limit is 12 lines (with word-wrap calculation), overflow is marked with “lines hidden” / “truncated”.

Press o to open the skill file in your configured editor without skipping the current skill review. Preview auto-refreshes after saving — works well with GUI editors (default behavior on macOS) so you can edit and review side by side.

The “Turn off auto-generated skills” option appears last in the list, takes effect immediately (no restart needed), and persists at the workspace level. The current batch is shelved (not deleted) and returns when you re-enable via /memory.

What you can do with this:

  • See full skill contents before confirming — no need to accept first and then dig through files
  • Press o to edit skill content directly in your editor; preview refreshes on save
  • One-click to disable auto-generated skills; current batch is preserved and recoverable via /memory

See PR #6393 

Before (global qwen 0.19.6) — name + description onlyAfter — single-skill review with inline preview and turn-off option
Before — global qwen 0.19.6: name and description only, no previewAfter — single-skill review with inline SKILL.md preview and turn-off option
After — last batch item, bulk options hiddenAfter — “Turn off auto-generated skills” selected
After — last batch item: bulk options hiddenAfter — turn-off selected: batch closed with re-enable hint

More New Features

FeaturePRWhat it means for you
Daemon status dashboard: view runtime status, time-series metrics, and Token usage in the sidebar#6272 , #6307 , #6388 Health and trends at a glance — no CLI needed
maxSubAgents: limit parallel sub-agent count#6354 Control resource consumption, prevent runaway sub-agents
Tool(param:value) permissions: parameter-level tool access control#6106 Precisely block specific model/skill sub-agent spawning
Stacked slash-skill invocations: /skill1 /skill2 execute in sequence#6361 Chain multiple skills without manual steps
tools.visible config: selectively expose deferred tools#6372 Only see the tools you need at startup
Configurable scheduled task expiry: cron/loop task expiration time#6173 Long-running scheduled tasks won’t expire unexpectedly
Hook state injection: Stop/SubagentStop hooks receive background task info#6531 Hooks can be aware of scheduled tasks and cron state
Permission mode badge: current permission shown at bottom in DEFAULT mode#6498 Confirm your security mode at a glance
Compact echarts data blocks: chart support in Web Shell#6232 Data visualization right in the terminal
MCP mentions + iconified @ references: Web Shell#6279 More intuitive @ references
Markdown table controls: column reorder/resize/freeze#6444 Better experience browsing large tables
LSP hot reload: language server hot reload support#5953 Config changes without restarting LSP
Channel memory intents: natural language channel memory#6376 More natural memory in channel contexts
/review quality gates: issue precision and root cause attribution#6395 More reliable review results
glob performance optimization: prune ignored directories during traversal#6123 Faster file search in large projects
Slash command discovery: taller menu, grouped counts, fuzzy search#6267 Find commands faster
Per-worktree auto-memory: independent memory per worktree#6462 Memories don’t bleed across branches
Agent working_dir: pin sub-agents to a worktree#6456 Sub-agents work in a specified directory
Extension hot reload: auto-reload on plugin changes#6347 No restart needed when editing plugins
dmPolicy: disable direct messages#6521 Channel bots only respond in group chats
Serve environment isolation: env isolation + total count control in serve mode#6416 Multi-project serve without interference
Multi-workspace session routing: serve supports multiple workspaces#6511 One serve instance, multiple projects
Per-tool-call timeout: individual tool call timeout#6136 A hung tool won’t drag down the entire session
Built-in dataviz skill: data visualization skill#6198 Out-of-the-box chart generation

Important Fixes

FixPRWhat it means for you
Auth 401 fix: 401 no longer hangs after auth expiry#6284 Expired tokens no longer block sessions
OpenAI non-SSE detection: correctly identify non-streaming responses#6466 OpenAI-compatible endpoints no longer misdetected
Streaming scroll lock: no more scroll hijacking during streaming output#6170 , #6421 Scroll freely through history during long output
Windows pager fix: pager no longer crashes on Windows#6390 Stable Windows experience
qqbot security fix: channel security hardening#6200 QQ channel bot is more secure
Context window default 200k: corrected default value#6387 More accurate context window config
ACP settings race fix: settings read/write race condition#6292 Concurrent settings no longer error out
/clear unblock: /clear no longer gets stuck#6499 Clear command back to normal

Contributors

ContributorContributionsPR Links
@wenshao Daemon status dashboard, time-series metrics, Token usage analysis, session archive/delete, session groups + color labels, scheduled task management page, scheduled task independent sessions, unified task sessions, session overview + split screen, slash command discovery, Agent working_dir, serve port auto-retry#6272 , #6307 , #6388 , #6293 , #6350 , #6348 , #6389 , #6453 , #6400 , #6267 , #6456 , #6513 
@ytahdn Session recovery, disable skill settings, custom @mention panel, session callbacks, virtual scrolling, tool details, stream interruption error handling, todo refresh, tool call summaries, external split-screen control#6220 , #6223 , #6242 , #6333 , #6342 , #6352 , #6357 , #6362 , #6399 , #6422 , #6424 , #6425 , #6450 , #6523 
@yiliang114 Model fallback chain, maxSubAgents, auth 401 fix#6273 , #6354 , #6284 
@tanzhenxin Nested sub-agent spawning, Web Shell tree view, auto-generated skills preview review, context window default fix#6189 , #6239 , #6393 , #6387 
@doudouOUC Daemon session organization backend, serve environment isolation, multi-workspace session routing#6305 , #6416 , #6511 
@qqqys WeCom channel integration, channel memory intents, channel loop tools, built-in dataviz skill#6436 , #6376 , #6287 , #6198 
@DennisYu07 Tool(param:value) permissions, stacked slash-skill invocations, permission mode badge, hook state injection#6106 , #6361 , #6498 , #6531 
@LaZzyMan Native confirmation dialog for PreToolUse hook#5629 
@DragonnZhang /review quality gates#6395 
@Alex-ai-future Project-level model config /model —project#6060 
@VectorPeak OpenAI non-SSE detection fix#6466 
@han-dreamer Windows pager fix#6390 
@MikeWang0316tw Streaming scroll lock fix#6170 , #6421 
@water-in-stone LSP hot reload#5953 
@ZijianZhang989 Extension hot reload#6347 
@BZ-D MCP mentions + iconified @ references#6279 
@jifeng Markdown table controls (column reorder/resize/freeze)#6444 
@zhangxy-zju Compact echarts data blocks#6232 
@Eric-GoodBoy-Tech qqbot security fix#6200 
@TianYuan1024 Configurable scheduled task expiry#6173 
@callmeYe 🎉 First contribution: session memory forgetting/dreaming, scheduled task timeline UI, user-managed memory#6227 , #6386 , #6432 
@kagura-agent 🎉 First contribution: prompt-cache tools prefix retention, foreground concurrency cap, skill scan caching#6225 , #6300 , #6155 
@Aleks-0 🎉 First contribution: tools.visible config, UTF-8 cmd.exe, KV-cache#6372 , #6216 , #6420 
@Nas01010101 🎉 First contribution: request timeout, @-attached files#6288 , #6295 , #6324 
@zjunothing 🎉 First contribution: per-worktree auto-memory, /clear unblock, status line jitter fix#6462 , #6499 , #6533 
@minmax 🎉 First contribution: glob performance optimization, per-tool-call timeout#6123 , #6136 
@pomelo-nwu 🎉 First contribution: PR gate hardening, review suggestion routing#5723 , #5786 
@chiga0 🎉 First contribution: session artifact API, daemon side-channel docs#5895 , #4511 
@gauravyad86 🎉 First contribution: bootstrap fast path, transform_data isolation#6188 , #6285 
@mvanhorn 🎉 First contribution: macOS seatbelt config path, streaming idle timeout defaults#6172 , #6107 
@AmariahAK 🎉 First contribution: vision model selection#6209 , #6236 
@barry166 🎉 First contribution: VSCode authentication, audio prebuild#6274 , #6275 
@chenghuichen 🎉 First contribution: dmPolicy to disable direct messages#6521 
@beantownbytes 🎉 First contribution: disable qwen thinking for non-DashScope environments#6271 
@heyparth1 🎉 First contribution: context window calculation fix#6266 
@tomsen-ai 🎉 First contribution: parameterless tool invocation#6250 

Upgrade: Run npm i @qwen-code/qwen-code@latest -g to upgrade to the latest version.

If you have questions or feedback, feel free to open an issue on GitHub Issues !

Last updated on