Qwen Code 주간 업데이트: 모델 과부하 자동 전환, 서브 Agent 중첩 파생, WeCom 채널 연동
Qwen Code는 이번 주에 v0.19.6부터 v0.19.8까지 3개의 정식 버전을 출시하고 PR 150개 이상을 병합했습니다. 방향은 네 가지입니다.
모델이 과부하돼도 대화가 끊기지 않습니다. 이전에는 429/503/529를 만나면 대화가 그대로 중단돼서, 모델을 직접 바꿔 다시 보내야 했습니다. 이제 fallback 체인이 주 모델의 재시도 예산이 다 쓰이면 순서상 다음 모델로 자동 전환해 답변을 이어갑니다. /model --project로 프로젝트마다 다른 모델을 묶어 두면 손으로 바꿀 일이 아예 없습니다.
서브 Agent가 이제 하위를 파생합니다. 이전까지 서브 Agent는 마지막 가지였습니다. 받은 일을 자기 손으로 끝내야 했고, 더 나눌 방법이 없었습니다. 지금은 기본 중첩 깊이가 5단계라 서브 Agent가 서브 태스크를 아래 층으로 넘길 수 있습니다. TUI와 Web Shell 모두 트리 구조로 보여주니 누가 누구를 파생했는지 바로 보입니다.
Web Shell 세션 관리가 체계를 갖췄습니다. 아카이브/삭제/이름 붙인 그룹/색상 라벨/예약 작업 관리 페이지/세션 요약 분할 화면까지, 이전에는 세션 사이드바에서 세션을 바꿔 보는 것만 가능했습니다. 지금은 정리하고, 분류하고, 감시하고, 병렬로 다룰 수 있습니다. PR 7개로 세션을 단순 나열 목록에서 관리 가능한 자원으로 바꿨습니다.
WeCom과 권한 제어가 채워졌습니다. WeCom 스마트 봇 채널을 연동했습니다. Bot ID와 Secret 두 항목이면 끝나고, 기업 관리자 권한으로 콜백을 열 필요도 없습니다. PreToolUse hook의 “ask”는 이제 실제로 확인창을 띄웁니다. 이전에는 이 선택지가 조용히 거부하는 것과 같았습니다. 권한 규칙도 Tool(param:value) 문법을 지원해 파라미터 값 단위로 제어할 수 있습니다.
✨ 새로운 기능
모델 과부하 자동 전환 + 프로젝트별 모델 설정
모델이 429/503/529를 반환하면 대화가 그 자리에서 멈춥니다. 이번 버전에는 직접 켜는 방식의 fallback 체인이 들어갔습니다. 주 모델이 같은 모델에서 재시도 예산을 모두 쓰면 fallback 목록의 다음 모델로 넘어가 답변을 이어갑니다. fallback을 타는 원인은 용량과 속도 제한뿐입니다. 인증, 쿼터, 설정, 클라이언트 오류는 바로 실패로 돌려보냅니다. 모델이 과부하인 경우가 아니라 설정이 잘못된 경우이기 때문입니다.
전환은 사용자에게 내용이 보이기 전에 일어납니다. fallback 모델이 일부를 출력한 뒤 죽으면 남은 목록은 시도하지 않으니, 잘린 답변만 보입니다. 그래도 다음 사용자 turn은 다시 주 모델부터 시작하므로 fallback 모델에 붙박이로 남지 않습니다.
/model --project를 쓰면 프로젝트마다 다른 모델을 묶어 둘 수 있습니다. --project는 프로젝트의 .qwen/settings.json에, --global은 사용자 ~/.qwen/settings.json에 기록됩니다. 플래그를 붙이지 않으면 기존 동작 그대로입니다. 이 범위 지정 플래그는 --fast, --voice, --vision에도 함께 쓸 수 있습니다.
이렇게 쓸 수 있습니다:
- fallback 모델 목록을 정해 두면 모델이 과부하일 때 자동 전환되므로 직접 모델을 갈아탈 필요가 없습니다
- 인증/쿼터 오류는 fallback에 가려지지 않아 문제가 더 일찍 드러납니다
/model --project로 프로젝트마다 다른 모델을 쓰면 설정이 프로젝트를 따라다닙니다/model --global로 전역 기본값을 정해 두면 새 프로젝트가 이어받습니다

서브 Agent 중첩 파생 + 트리 뷰
이제 서브 Agent가 자기 밑의 서브 Agent를 다시 파생할 수 있습니다. 기본 깊이 상한은 5단계이고 model.maxSubagentDepth로 조정합니다. 1로 두면 서브 Agent가 하위를 만들지 못하는 예전 동작으로 돌아갑니다.
방어선은 두 겹입니다. 스키마를 준비할 때 가장 깊은 단계의 서브 Agent는 agent 도구 자체를 보지 못합니다. 쓸 수 있다는 사실도 모릅니다. 여기에 런타임 가드가 있어 깊이 상한을 넘는 파생 요청은 거부됩니다.
TUI와 Web Shell 모두 중첩 트리 구조를 보여줍니다. 서브 Agent는 부모 아래에 ↳ 표시와 들여쓰기로 놓입니다. 부모가 끝나면 서브 Agent는 루트 노드로 올라가고 “from <parent>“라고 표시됩니다. 상세 뷰에는 “Level N · from <parent type>“이 나옵니다. blocking 태그와 중지 확인도 파생 경로를 따르게 바뀌어, 취소를 해도 turn이 끝나는 경우가 아니라면 확인창이 뜨지 않습니다.
이 기능은 기본적으로 켜져 있습니다. 업그레이드하면 기존 모든 환경에 중첩 파생이 적용됩니다. Fork 하위 프로세스, teammates, workflow agents은 여전히 제외됩니다. Arena 세션도 이제 중첩할 수 있습니다. 백그라운드 agent는 복구할 때 원래 깊이와 시작 당시 상한을 함께 되찾습니다.
이렇게 쓸 수 있습니다:
- 서브 Agent가 복잡한 일을 받으면 스스로 하위를 파생해 서브 태스크를 나눕니다
- TUI와 Web Shell에서 전체 Agent 트리 구조를 볼 수 있습니다
model.maxSubagentDepth로 중첩 깊이 상한을 조정합니다

Web Shell 세션 관리: 아카이브, 그룹, 예약 작업, 분할 화면
PR 7개로 Web Shell의 세션 사이드바를 그저 나열만 되던 목록에서 정리·분류·감시·병렬 작업이 가능한 관리 패널로 바꿨습니다.
아카이브와 삭제. 세션 행마다 바로 실행 버튼과 ”…” 메뉴(이름 변경/아카이브/삭제)가 생겼습니다. 아카이브한 세션은 접히는 “Archived” 영역으로 모이고, 여기서 복원하거나 완전히 삭제할 수 있습니다. 지금 사용 중인 세션은 아카이브도 삭제도 되지 않습니다. 아카이브된 세션은 열 수 없고 409 session_archived가 돌아옵니다. 삭제는 되돌릴 수 없는 완전 삭제이며 확인 단계를 한 번 더 거칩니다. 동작은 daemon의 archiveState와 /sessions/archive, /sessions/unarchive 엔드포인트로 처리됩니다.
이름 붙인 그룹과 색상 라벨. 그룹을 만들고 이름을 바꾸거나 지울 수 있고, 세션을 끌어다 넣을 수 있으며, 그룹에 색상 라벨과 상단 고정/아카이브 상태를 붙일 수 있습니다. 그룹 데이터는 daemon 계층에서 UI까지 그대로 이어집니다. daemon 쪽에서는 프로젝트 단위 sidecar 파일에 그룹 메타데이터를 저장하고, REST/ACP 라우트가 CRUD를 제공하며, capability gate 아래에서 클라이언트 지원 여부에 따라 노출 범위를 정합니다.
세션 요약과 분할 화면. 넓은 화면에서는 사이드바에 세션 요약 패널이 나타납니다. 모든 세션이 실시간 카드로 보이고 순서는 승인 대기 → 실행 중 → 유휴입니다. 카드마다 현재 모델과 클라이언트 수가 표시됩니다. 여럿 고르면 분할 화면으로 열 수 있습니다. 같은 탭 안에서 나누거나 새 브라우저 탭에 여는 방식(?split=a,b URL 파라미터)입니다. 독립 채팅 패널 N개가 나란히 열리고 각각 세션 컨텍스트를 따로 가지며, 키보드 포커스는 클릭한 패널에만 걸립니다.
이렇게 쓸 수 있습니다:
- 오래 쌓인 세션을 아카이브로 정리하고 프로젝트별로 그룹 지어 색상 라벨을 붙입니다
- 예약 작업을 화면에서 직접 만들고 관리합니다. cron 표현식을 손으로 적지 않아도 됩니다
- 예약 작업마다 독립 세션이 생기고, 실행 이력과 트랜스크립트를 언제든 볼 수 있습니다
- 넓은 화면에서 여러 세션의 실시간 상태를 분할 화면으로 나란히 확인합니다
관련 PR: #6293 , #6350 , #6305 , #6348 , #6389 , #6453 , #6400
WeCom 채널 연동
@wecom/aibot-node-sdk로 WeCom 스마트 봇을 연결했습니다. 설정은 Bot ID와 Secret 두 개면 됩니다. Corp ID, Agent ID, 콜백 Token, EncodingAESKey가 필요 없고, 공개 네트워크 콜백 주소도 필요 없습니다.
메시지는 WebSocket 상시 연결로 받습니다. 텍스트, 음성 전사, 텍스트+이미지 혼합, 이미지, 파일, 영상, 인용 콘텐츠를 모두 지원합니다. 어시스턴트 답변은 WeCom markdown 형식으로 전송됩니다. 발송 쪽은 로컬 이미지 태그(채널 임시 디렉터리 안)만 지원하고, 파일/영상/음성 태그는 무시됩니다.
설정 방법:
{
"type": "wecom",
"botId": "your-bot-id",
"secret": "your-secret",
"cwd": "/path/to/project"
}실행 명령: qwen channel start my-wecom
이렇게 쓸 수 있습니다:
- Bot ID + Secret 두 항목으로 WeCom을 연결합니다. 기업 관리자 권한이 필요 없습니다
- 텍스트, 음성, 이미지, 파일, 영상, 인용 메시지를 받습니다
- WeCom 그룹 채팅에서 Qwen Code가 markdown 형식으로 답하게 합니다
관련 PR: #6436

PreToolUse hook에 네이티브 확인창
이전에는 PreToolUse hook이 permissionDecision: "ask"를 돌려주면 “deny”와 같았습니다. 확인창은 아예 뜨지 않았습니다. hook 개발자는 사용자가 선택지를 보길 기대했지만, 실제로는 조용히 거부되고 있었습니다.
이제 “ask”는 TUI 네이티브 확인창을 띄웁니다. 선택지는 “Yes, allow once”와 “No, suggest changes” 두 개입니다. hook이 호출마다 다시 판단하기 때문에 “always allow”는 없습니다. 승인하면 도구가 다시 실행되고, 거부하면 취소됩니다.
비대화형 CLI와 백그라운드 agent에서는 “ask”가 deny로 처리되어 응답을 기다리면서 멈추지 않습니다. 기존 awaiting_approval 메커니즘을 그대로 써서 경로를 하나 더 만들지 않았습니다. “denied”와 “stop” 동작은 그대로이고 PermissionRequest hook도 영향받지 않습니다.
이렇게 쓸 수 있습니다:
- PreToolUse hook에서 “ask”를 써서 도구 실행 여부를 사용자가 결정하게 합니다
- 비대화형 환경에서 기다림에 묶일 걱정이 없습니다
- hook이 호출마다 다시 판단해 영구적으로 통과시키지 않습니다
관련 PR: #5629

자동 생성 Skills 미리보기 검토
agent가 skill을 자동 생성하면 예전에는 파일 이름만 보이고, 승인한 뒤에야 내용을 알 수 있었습니다. 이제는 검토 대화창 안에서 frontmatter까지 전문을 미리봅니다.
모델이 만든 내용은 걸러서 보여줍니다. ANSI/VT 제어 순서대는 무해한 이스케이프로 바꾸고, CRLF는 일반 줄바꿈으로 바꿉니다. 읽기 상한은 64 KiB, 표시 상한은 12줄(자동 줄바꿈까지 계산)이며, 넘치는 부분은 “lines hidden” / “truncated”로 표시합니다.
o를 누르면 설정해 둔 편집기에서 skill 파일이 열립니다. 지금 보고 있는 skill 검토는 건너뛰지 않습니다. 파일을 저장하면 미리보기가 자동 갱신되니 GUI 편집기(macOS 기본 동작)와 함께 쓰면 고쳐 본 뒤 결정할 수 있습니다.
“Turn off auto-generated skills” 항목은 목록 마지막에 있습니다. 고르면 재시작 없이 즉시 적용되고, 워크스페이스 단위로 저장됩니다. 지금 배치는 삭제하지 않고 잠시 접어 두며, /memory에서 다시 켜면 배치가 돌아옵니다.
이렇게 쓸 수 있습니다:
- 승인하기 전에 skill 전문을 봅니다. 일단 받아들인 뒤 파일을 뒤져 보는 수고가 없습니다
o를 눌러 편집기에서 skill 내용을 바로 고치고, 저장하면 미리보기가 갱신됩니다- 자동 생성 skills을 한 번에 끌 수 있고, 지금 배치는 삭제되지 않으니
/memory에서 언제든 되돌립니다
관련 PR: #6393
| 이전 (전역 qwen 0.19.6) — 이름과 설명만 | 이후 — 단일 skill 검토에 인라인 미리보기와 끄기 옵션 포함 |
|---|---|
| 이후 — 배치의 마지막 항목, 일괄 옵션 숨김 | 이후 — “Turn off auto-generated skills” 선택 |
|---|---|
📊 그 외 새로운 기능
| 기능 | PR | 사용자에게 미치는 영향 |
|---|---|---|
| Daemon 상태 대시보드: 사이드바에서 실행 상태, 시계열 지표, Token 사용량 확인 | #6272 , #6307 , #6388 | 명령어를 치지 않아도 상태와 추세가 한 화면에 들어옵니다 |
| maxSubAgents: 병렬 서브 Agent 수 제한 | #6354 | 자원 소모를 조절하고 서브 Agent가 필요 이상으로 늘어나는 것을 막습니다 |
| Tool(param:value) 권한: 파라미터 값 단위로 도구 제어 | #6106 | 특정 model/skill의 서브 Agent 파생을 정확히 막을 수 있습니다 |
슬래시 skill 겹쳐 호출: /skill1 /skill2를 연속 실행 | #6361 | 여러 스킬을 단계 없이 이어서 씁니다 |
| tools.visible 설정: 지연 로딩 도구를 골라서 노출 | #6372 | 시작할 때 필요한 도구만 보입니다 |
| 예약 작업 만료 시간 설정: cron/loop 작업의 만료 시점 | #6173 | 오래 돌리는 예약 작업이 이유 없이 꺼지지 않습니다 |
| Hook 상태 주입: Stop/SubagentStop hook이 백그라운드 작업 정보를 받음 | #6531 | hook이 예약 작업과 cron 상태를 알 수 있습니다 |
| 권한 모드 배지: DEFAULT 모드 하단에 현재 권한 표시 | #6498 | 지금 어떤 안전 모드인지 바로 확인합니다 |
| 컴팩트 echarts 데이터 블록: Web Shell에서 차트 지원 | #6232 | 데이터 시각화를 터미널에서 바로 봅니다 |
| MCP mentions + 아이콘이 붙은 @ 참조: Web Shell | #6279 | @ 참조를 한눈에 알아봅니다 |
| Markdown 표 컨트롤: 열 순서 변경/확대/고정 | #6444 | 큰 표를 볼 때 한결 편합니다 |
| LSP 핫 리로드: 언어 서버도 재시작 없이 갱신 | #5953 | 설정을 바꿔도 LSP를 다시 켜지 않습니다 |
| 채널 메모 의도: 자연어로 채널 메모 | #6376 | 채널에서 말하듯 메모할 수 있습니다 |
| /review 품질 게이트: issue 정확도와 원인 귀속 | #6395 | review 결과를 더 믿을 수 있습니다 |
| glob 성능 최적화: 순회 중 제외 디렉터리 가지 치기 | #6123 | 대형 프로젝트에서 파일 검색이 빨라집니다 |
| 슬래시 명령어 탐색: 더 높은 메뉴, 그룹별 개수, 퍼지 검색 | #6267 | 원하는 명령어를 더 빨리 찾습니다 |
| worktree별 auto-memory: worktree마다 독립 기억 | #6462 | 브랜치가 달라도 기억이 섞이지 않습니다 |
| Agent working_dir: 서브 Agent를 worktree에 고정 | #6456 | 서브 Agent가 지정한 디렉터리에서 작업합니다 |
| 확장 기능 핫 리로드: 플러그인 변경 시 자동 reload | #6347 | 플러그인을 고쳐도 재시작이 필요 없습니다 |
| dmPolicy: 개인 채팅 메시지 차단 | #6521 | 채널 봇이 그룹 채팅에만 응답합니다 |
| serve 환경 격리: serve 모드 환경 분리 + 총량 제어 | #6416 | 여러 프로젝트를 serve로 돌려도 서로 간섭하지 않습니다 |
| 다중 워크스페이스 세션 라우팅: serve가 여러 워크스페이스 지원 | #6511 | serve 인스턴스 하나로 여러 프로젝트를 봅니다 |
| 도구 호출별 타임아웃: 단일 도구 호출 타임아웃 | #6136 | 도구 하나가 멈춰도 세션 전체가 끌려가지 않습니다 |
| dataviz 내장 skill: 데이터 시각화 스킬 | #6198 | 설치 직후부터 차트를 만들 수 있습니다 |
🔧 주요 수정 사항
| 수정 사항 | PR | 사용자에게 미치는 영향 |
|---|---|---|
| auth 401 수정: 인증이 풀린 뒤 401로 멈추지 않음 | #6284 | token 만료가 세션을 막지 않습니다 |
| OpenAI 비SSE 응답 감지: 스트리밍이 아닌 응답을 정확히 판별 | #6466 | OpenAI 호환 엔드포인트를 잘못 짚지 않습니다 |
| 스트리밍 스크롤 고정: 출력 중에 스크롤 위치를 뺏지 않음 | #6170 , #6421 | 긴 출력에서도 과거 기록을 자유롭게 올려다볼 수 있습니다 |
| Windows pager 수정: Windows에서 pager가 더 이상 죽지 않음 | #6390 | Windows 사용 경험이 안정적입니다 |
| qqbot 보안 수정: 채널 보안 강화 | #6200 | QQ 채널 봇이 더 안전해졌습니다 |
| 컨텍스트 창 기본값 200k: 기본값 바로잡기 | #6387 | 컨텍스트 창 설정이 더 정확해집니다 |
| ACP settings 경합 수정: 설정 읽기/쓰기 경합 | #6292 | 동시에 설정을 바꿔도 오류가 나지 않습니다 |
| /clear 대기 해제: /clear가 더 이상 멈추지 않음 | #6499 | 화면 정리 명령이 정상 동작합니다 |
👥 기여자
| 기여자 | 기여 내용 | 참고 PR 링크 |
|---|---|---|
| @wenshao | Daemon 상태 대시보드, 시계열 지표, Token 사용량 분석, 세션 아카이브/삭제, 세션 그룹 + 색상 라벨, 예약 작업 관리 페이지, 예약 작업 독립 세션, 통합 작업 세션, 세션 요약 + 분할 화면, 슬래시 명령어 탐색, Agent working_dir, serve 포트 자동 재시도 | #6272 , #6307 , #6388 , #6293 , #6350 , #6348 , #6389 , #6453 , #6400 , #6267 , #6456 , #6513 |
| @ytahdn | 세션 복구, 비활성화한 skill 설정, 커스텀 @mention 패널, 세션 콜백, 가상 스크롤, 도구 상세, 끊긴 스트림 오류 처리, todo 갱신, 도구 호출 요약, 외부 분할 화면 제어 | #6220 , #6223 , #6242 , #6333 , #6342 , #6352 , #6357 , #6362 , #6399 , #6422 , #6424 , #6425 , #6450 , #6523 |
| @yiliang114 | 모델 fallback 체인, maxSubAgents, auth 401 수정 | #6273 , #6354 , #6284 |
| @tanzhenxin | 서브 Agent 중첩 파생, Web Shell 트리 뷰, 자동 생성 Skills 미리보기 검토, 컨텍스트 창 기본값 수정 | #6189 , #6239 , #6393 , #6387 |
| @doudouOUC | Daemon 세션 정리 백엔드, serve 환경 격리, 다중 워크스페이스 세션 라우팅 | #6305 , #6416 , #6511 |
| @qqqys | WeCom 채널 연동, 채널 메모 의도, 채널 반복 작업 도구, dataviz 내장 skill | #6436 , #6376 , #6287 , #6198 |
| @DennisYu07 | Tool(param:value) 권한, 슬래시 skill 겹쳐 호출, 권한 모드 배지, Hook 상태 주입 | #6106 , #6361 , #6498 , #6531 |
| @LaZzyMan | PreToolUse hook 네이티브 확인창 | #5629 |
| @DragonnZhang | /review 품질 게이트 | #6395 |
| @Alex-ai-future | 프로젝트별 모델 설정 /model —project | #6060 |
| @VectorPeak | OpenAI 비SSE 응답 감지 수정 | #6466 |
| @han-dreamer | Windows pager 수정 | #6390 |
| @MikeWang0316tw | 스트리밍 스크롤 고정 수정 | #6170 , #6421 |
| @water-in-stone | LSP 핫 리로드 | #5953 |
| @ZijianZhang989 | 확장 기능 핫 리로드 | #6347 |
| @BZ-D | MCP mentions + 아이콘이 붙은 @ 참조 | #6279 |
| @jifeng | Markdown 표 컨트롤(열 순서 변경/확대/고정) | #6444 |
| @zhangxy-zju | 컴팩트 echarts 데이터 블록 | #6232 |
| @Eric-GoodBoy-Tech | qqbot 보안 수정 | #6200 |
| @TianYuan1024 | 예약 작업 만료 시간 설정 | #6173 |
| 🆕 @callmeYe | 🎉 첫 기여: 세션 기억 망각/꿈 처리, 예약 작업 타임라인 UI, 사용자 관리 메모 | #6227 , #6386 , #6432 |
| 🆕 @kagura-agent | 🎉 첫 기여: prompt-cache에서 tools 접두어 유지, foreground 동시 실행 상한, skill 스캔 캐시 | #6225 , #6300 , #6155 |
| 🆕 @Aleks-0 | 🎉 첫 기여: tools.visible 설정, UTF-8 cmd.exe, KV-cache | #6372 , #6216 , #6420 |
| 🆕 @Nas01010101 | 🎉 첫 기여: 요청 타임아웃, @ 첨부 파일 | #6288 , #6295 , #6324 |
| 🆕 @zjunothing | 🎉 첫 기여: worktree별 auto-memory, /clear 대기 해제, 상태 줄 흔들림 수정 | #6462 , #6499 , #6533 |
| 🆕 @minmax | 🎉 첫 기여: glob 성능 최적화, 도구 호출별 타임아웃 | #6123 , #6136 |
| 🆕 @pomelo-nwu | 🎉 첫 기여: PR 게이트 강화, review 제안 라우팅 | #5723 , #5786 |
| 🆕 @chiga0 | 🎉 첫 기여: 세션 artifact API, daemon side-channel 문서 | #5895 , #4511 |
| 🆕 @gauravyad86 | 🎉 첫 기여: bootstrap 고속 경로, transform_data 격리 | #6188 , #6285 |
| 🆕 @mvanhorn | 🎉 첫 기여: macOS seatbelt 설정 경로, 스트리밍 유휴 타임아웃 기본값 | #6172 , #6107 |
| 🆕 @AmariahAK | 🎉 첫 기여: 비전 모델 선택 | #6209 , #6236 |
| 🆕 @barry166 | 🎉 첫 기여: VSCode 인증, audio prebuild | #6274 , #6275 |
| 🆕 @chenghuichen | 🎉 첫 기여: dmPolicy로 개인 채팅 메시지 차단 | #6521 |
| 🆕 @beantownbytes | 🎉 첫 기여: DashScope가 아닌 환경에서 qwen thinking 비활성화 | #6271 |
| 🆕 @heyparth1 | 🎉 첫 기여: 컨텍스트 창 계산 수정 | #6266 |
| 🆕 @tomsen-ai | 🎉 첫 기여: 파라미터 없는 도구 호출 | #6250 |
업데이트 방법: npm i @qwen-code/qwen-code@latest -g를 실행하면 최신 버전으로 업데이트할 수 있습니다.
문제나 제안이 있다면 GitHub Issues 로 알려 주세요!