script agents
Claude Code Ghi chú Kỹ thuật · Vol. 03
Điều phối subagent ở quy mô lớn

Dynamic
Workflows

Điều phối hàng chục đến hàng trăm subagent từ một script Claude tự viết.

trong Claude Code · 21.07.2026
01 / 33
// 01 — vì saothe case

Khi một tác vụ cần nhiều agent hơn một hội thoại điều phối nổi.

Workflow là một script JavaScript điều phối subagent ở quy mô lớn. Claude viết script cho tác vụ bạn mô tả, còn runtime chạy nó ở chế độ nền — đưa kế hoạch vào code để context của Claude chỉ giữ lại câu trả lời cuối cùng.

← → để chuyển slide 02 / 33
// 02 — cơ chếhow it runs

Workflow chạy thế nào

Bạn
Mô tả tác vụ bằng lời hoặc kèm từ khóa ultracode.
Claude
Viết một script điều phối — bạn duyệt trước khi chạy.
Runtime
Chạy nền, tung ra nhiều subagent song song.
Kết quả
Một báo cáo về session; kết quả trung gian ở biến script.

Kết quả trung gian nằm trong biến của script thay vì đổ vào context — và runtime theo dõi từng agent nên có thể tiếp tục trong cùng session.

← → để chuyển slide 03 / 33
// 03 — so sánhwho holds the plan

Ai giữ kế hoạch?

Subagents
Skills
Agent teams
Workflows
Bản chất
Worker Claude tạo ra
Chỉ dẫn Claude làm theo
Lead giám sát các phiên
Script runtime chạy
Ai quyết bước kế
Claude, từng lượt
Claude, theo prompt
Lead, từng lượt
Chính script
Kết quả trung gian
Context của Claude
Context của Claude
Task list chung
Biến của script
Quy mô
Vài tác vụ/lượt
Như subagent
Ít phiên chạy dài
Hàng chục–hàng trăm
Workflow đưa kế hoạch — vòng lặp, rẽ nhánh, kết quả — vào code 04 / 33
// 04 — mẫu fan-outone agent per item

Tung ra một agent cho mỗi phần việc

agent · file_1.ts agent · file_2.ts agent · file_3.ts agent · … agent · file_n.ts pipeline()

Audit từng route · migrate từng component · đọc song song nhiều nguồn — rồi thu về & kiểm chứng.

← → để chuyển slide 05 / 33
// 05 — khái niệm cốt lõithe barrier

pipeline() so với parallel()

pipeline()
Mỗi item chạy hết cả chuỗi độc lập — không có rào chắn.
bước 1bước 2bước 3
item 1
·
item 2
·
item 3
·
·
Item A có thể ở bước 3 khi B mới ở bước 1.
parallel()
Rào chắn — chờ tất cả xong mới sang bước sau.
bước 1bước 2bước 3
item 1
·
item 2
·
item 3
·
BARRIER
Chỉ dùng khi bước sau cần toàn bộ kết quả trước.
Mặc định hãy dùng pipeline() — nhanh hơn về wall-clock 06 / 33
// 06 — nguyên hàmscript primitives

Bộ công cụ trong script

agent(prompt, opts)
Tung một subagent. Kèm schema để nhận về dữ liệu có cấu trúc.
pipeline(items, …stages)
Mỗi item chạy qua tất cả bước độc lập — không rào chắn. Mặc định nên dùng.
parallel(thunks)
Chạy đồng thời rồi chờ tất cả — một rào chắn đồng bộ.
phase(title)
Mở một giai đoạn; các agent sau được gom nhóm trong bảng tiến độ.
log(message)
Gửi dòng tiến độ hiển thị cho người dùng.
budget · workflow()
Theo dõi token đã dùng; hoặc chạy một workflow khác như bước con.
← → để chuyển slide 07 / 33
// 07 — ví dụ.claude/workflows/

Script thực tế trông thế nào

export const meta = { name: 'audit-routes', description: 'Rà auth mọi route' } const found = await agent('Liệt kê mọi file .ts dưới src/routes/.', { schema }) const audits = await pipeline(found.files, file => agent(`Rà ${file} xem thiếu kiểm tra auth.`, { label: file }), ) return audits.filter(Boolean) // JS thuần, top-level await
agent() tung một subagent · pipeline() chạy một agent cho mỗi item 08 / 33
// 08 — mẫu chất lượngtrustworthy results

Không chỉ chạy nhiều hơn — mà đáng tin hơn

Adversarial verify

Nhiều agent độc lập cùng phản biện một phát hiện; loại nếu đa số bác bỏ.
tìm ? ? ?

Judge panel

Nhiều lời giải từ các góc khác nhau, ban giám khảo chấm, tổng hợp từ bản thắng.
A B C win

Loop-until-dry

Tìm theo từng vòng, dừng khi vài vòng liên tiếp không ra gì mới.
round n
← → để chuyển slide 09 / 33
// bộ mẫu6 patterns · youmind.com

6 mẫu điều phối
kinh điển

Từ ba kỹ thuật chất lượng ở trên, mở rộng thành sáu mẫu tái dùng — mỗi mẫu là một cách đưa kế hoạch vào code, kèm ví dụ script.

01 · Classify-and-Act
Phân loại tác vụ rồi định tuyến đúng agent / model.
02 · Fan-out-and-Synthesize
Chia nhỏ, chạy song song, gộp về một câu trả lời.
03 · Adversarial Verification
Một agent khác thẩm định theo rubric, mù danh tính.
04 · Generate-and-Filter
Sinh thật nhiều, lọc theo rubric, chỉ giữ tinh túy.
05 · Tournament
So sánh từng cặp đến khi còn một quán quân.
06 · Loop Until Done
Lặp đến khi đạt điều kiện dừng, không cố định số vòng.
Nguồn: youmind.com · master claude code dynamic workflows 10 / 33
// mẫu 01 — classify & actroute by type

Phân loại rồi định tuyến

Ý tưởng
Một agent phân loại đọc đầu vào, ước lượng độ phức tạp, rồi tự chọn agent / model phù hợp cho phần còn lại.
phân loại sonnet · nhỏ opus · lớn
Khi nào: tác vụ không đồng nhất, muốn dành model đắt cho ca khó, hoặc việc phân rã đã tự nó phức tạp.
// "Giải thích module auth hoạt động thế nào?" const kind = await agent( 'Đọc codebase, ước lượng độ phức tạp module.', { schema: CLASS }, ) const model = kind.files > 40 ? 'opus' : 'sonnet' return await agent( `Giải thích module (${kind.files} file).`, { model }, // định tuyến )
Classifier có thể chạy ở cuối để phân loại kết quả vào các nhóm 11 / 33
// mẫu 02 — fan-out & synthesizemany → one

Tỏa ra rồi gộp lại một

Ý tưởng
Chia tác vụ thành nhiều phần độc lập, chạy một agent cho mỗi phần, rồi một bước tổng hợp — rào chắn chờ tất cả — gộp thành một câu trả lời.
gộp báo
Khi nào: có danh sách việc độc lập đếm được và muốn một câu trả lời hợp nhất, không phải báo cáo rời rạc.
// review bảo mật toàn repo const reviews = await parallel(files.map(f => () => agent(`Review bảo mật ${f}.`, { model: 'haiku', schema: REVIEW }), )) // bước gộp = rào chắn, chờ mọi agent return await agent( 'Gộp các review thành báo cáo xếp hạng ưu tiên.', { model: 'opus', input: reviews }, )
Nhiều Haiku tỏa ra · một Opus tổng hợp — dùng parallel() vì cần đủ kết quả 12 / 33
// mẫu 03 — adversarial verificationblind reviewer

Người thẩm định mù danh tính

Ý tưởng
Mỗi agent làm việc được một agent khác kiểm tra theo rubric. Người thẩm định chưa từng thấy bản gốc — không thể thiên vị, xóa bỏ định kiến tự khen.
tác giả artifact thẩm định (mù) rubric
Khi nào: kiểm chứng nhận định, code review (tác giả ≠ người review), và cổng chất lượng.
const work = await agent( 'Viết lời giải cho ticket #482.', { schema: WORK }, ) // verifier chỉ biết rubric + artifact, không biết ai viết const v = await agent( `Chấm theo rubric:\n${rubric}\n---\n${work.diff}`, { schema: VERDICT }, ) return v.pass ? work : null
Verifier chỉ biết rubric và artifact — không biết ai tạo ra nó 13 / 33
// mẫu 04 — generate & filtercommit late

Sinh nhiều, lọc còn tinh túy

Ý tưởng
Sinh thật nhiều ý tưởng, lọc theo rubric hoặc kiểm chứng, khử trùng lặp, chỉ trả về vài lựa chọn tốt nhất — buộc Claude quyết muộn, sau khi mọi phương án đã bị thử thách.
30 ý tưởng lọc top 3
Khi nào: brainstorm (30 tên → 3), sinh giả thuyết, thiết kế lời giải.
const ideas = await agent( 'Đề xuất 30 tên sản phẩm.', { schema: NAMES }, ) const scored = await parallel(ideas.list.map(n => () => agent(`Chấm "${n}" theo rubric thương hiệu.`, { schema: SCORE }), )) return topK(dedupe(scored), 3) // 30 → 3
Mọi phương án bị thử thách trước khi Claude cam kết lựa chọn 14 / 33
// mẫu 05 — tournamentpairwise judging

Đấu loại tìm quán quân

Ý tưởng
N agent cùng làm một việc theo các hướng khác nhau, rồi chấm bằng so sánh từng cặp đến khi một bản thắng — so sánh tương đối đáng tin hơn cho điểm tuyệt đối.
A B C D A·B C·D win
Khi nào: xếp hạng tập lớn (1000+ item) và việc thiên về gu — thiết kế, tuyển chọn, ưu tiên nội dung.
const takes = await parallel(APPROACHES.map(a => () => agent(`Thiết kế UI theo hướng: ${a}.`, { schema: DESIGN }), )) let bracket = takes while (bracket.length > 1) // so từng cặp bracket = await playRound(bracket) return bracket[0] // nhánh đấu nằm trong code
Nhánh đấu sống trong vòng lặp code, không nằm trong context 15 / 33
// mẫu 06 — loop until donestop on condition

Lặp đến khi thật sự xong

Ý tưởng
Lặp tung agent đến khi đạt điều kiện dừng — không còn phát hiện mới, hoặc giả thuyết đã xác minh — thay vì chạy đúng một số vòng cố định.
vòng n 3 vòng lặng → dừng
Khi nào: gỡ test flaky, săn bug, khai thác pattern. Ghép với /goal & /loop.
const seen = new Set() let quiet = 0 while (quiet < 3) { // 3 vòng không ra gì const hits = await agent('Tìm test flaky còn sót.', { schema: HITS }) const fresh = hits.list.filter(h => !seen.has(h.id)) fresh.forEach(h => seen.add(h.id)) quiet = fresh.length ? 0 : quiet + 1 } return [...seen]
Dừng theo điều kiện, không theo số vòng cố định 16 / 33
// 09 — chạy workflowhave Claude write one

Ba cách khởi động

01 · lời tự nhiên
"use a workflow…"
Nói thẳng trong prompt; Claude viết script cho tác vụ đó.
02 · từ khóa
ultracode:
Thêm ultracode vào prompt để chạy một tác vụ dưới dạng workflow.
03 · dựng sẵn
/deep-research
Workflow tích hợp: fan-out tìm kiếm, đối chiếu nguồn, trả báo cáo có trích dẫn.

/effort ultracode — để Claude tự lên workflow cho mọi tác vụ đáng kể trong cả session. Lưu lại bằng phím s trong /workflows để tái dùng như một lệnh /<name>.

← → để chuyển slide 17 / 33
// demohands-on · audit-routes

DEMO — Tạo
workflow đầu tiên

Tác vụ: rà mọi route handler dưới src/routes/ xem chỗ nào thiếu kiểm tra auth — và phản biện từng phát hiện trước khi báo.
← → để chuyển slide 18 / 33
// demo · bước 1ra lệnh

Mô tả tác vụ cho Claude

~/my-app · claude code
> use a workflow to audit every route handler under src/routes/ for missing auth checks # hoặc dùng từ khóa để chạy một tác vụ dưới dạng workflow: > ultracode: audit src/routes/ for missing auth checks

Nói thẳng bằng lời ("use a workflow…") hoặc thêm từ khóa ultracode. Claude tô sáng từ khóa và viết một script điều phối thay vì làm từng lượt.

← → để chuyển slide 19 / 33
// demo · bước 2approve the plan

Duyệt kế hoạch trước khi chạy

Chạy workflow "audit-routes"?
1
Scan — liệt kê & đọc từng route handler
2
Verify — nhiều agent phản biện từng phát hiện
3
Synthesize — gộp thành một báo cáo xếp hạng
⚠ Workflow có thể tung nhiều agent & dùng nhiều token
Yes, run it View raw script No
Ctrl+G mở script trong editor · Tab để chỉnh prompt trước khi chạy 20 / 33
// demo · xem scriptView raw script

Script Claude đã viết

.claude/workflows/audit-routes.mjs
export const meta = { name: 'audit-routes', phases: [{ title: 'Scan' }, { title: 'Verify' }], } phase('Scan') const { files } = await agent('Liệt kê route handler dưới src/routes/.', { schema: FILES }) const found = await pipeline(files, f => agent(`Đọc ${f} — tìm endpoint thiếu kiểm tra auth.`, { schema: FINDING }), ) phase('Verify') // phản biện đối kháng const checked = await parallel(found.flat().map(x => () => agent(`Phản biện: "${x.claim}". Mặc định SAI nếu không chắc.`, { schema: VERDICT }) .then(v => ({ ...x, real: v.real })), )) return checked.filter(v => v.real) // chỉ giữ phát hiện đã xác minh

Fan-out một agent mỗi file bằng pipeline(), rồi phản biện đối kháng từng phát hiện bằng parallel() — chỉ giữ cái đã xác minh.

Ctrl+G mở trong editor · sửa rồi nhờ Claude chạy lại từ bản đã sửa 21 / 33
// demo · bước 3/workflows

Theo dõi & tiếp tục

Scan
8 agents · 240k tok
✓ xong
Verify
12 agents · 410k tok
▶ đang chạy
Synthesize
1 agent · 30k tok
· chờ

Mỗi giai đoạn hiện số agent, tổng token và thời gian. Khi dừng, agent đã xong trả kết quả từ cache, phần còn lại chạy tiếp — nên chia nhỏ nhiều agent giữ được nhiều tiến độ hơn.

Tiếp tục hoạt động trong cùng một session Claude Code 22 / 33
// demo · bước 4report & save

Đọc báo cáo & lưu thành lệnh

audit-routes · kết quả
✓ Hoàn tất · 21 agents · 3 phát hiện đã xác minh src/routes/admin.ts:42 thiếu requireAuth() src/routes/billing.ts:88 endpoint để public src/routes/users.ts:15 bỏ qua middleware auth
Nhấn s trong /workflows
──▶
/audit-routes
lệnh tái dùng ở mọi session
Báo cáo đã lọc bỏ các phát hiện không qua kiểm chứng chéo 23 / 33
// 10 — giới hạn & chi phíbounds

Ranh giới cần nhớ

16
agent chạy đồng thời tối đa (ít hơn nếu CPU yếu).
1000
tổng agent mỗi run — chặn vòng lặp mất kiểm soát.
>25
agent → cảnh báo "Large workflow" trong bảng tác vụ.
1.5M
token dự phóng → cũng bật cảnh báo (chỉ mang tính nhắc).

Chạy thử trên một lát nhỏ trước để ước lượng chi phí. Đặt Dynamic workflow size trong /config để giữ quy mô nhỏ theo mặc định.

← → để chuyển slide 24 / 33
// 11 — leo thangescalation ladder

Chỉ leo thang khi buộc phải

$
Cứ hỏi thẳng
$$
Skill
$$$
Subagent
$$$$
Agent Team
$$$$$
Workflow
Mặc định luôn là "không phải workflow" — chỉ leo lên khi bậc dưới hết chỗ xoay xở 25 / 33
// 12 — cộng tác?team vs workflow

Các agent có nói chuyện với nhau không?

Agent Team
Một phòng chat chung — các thành viên bàn giao và phản ứng lẫn nhau.
Cần cộng tác? → Agent Team
Workflow
Những làn chạy riêng — các agent không thấy nhau, chỉ gộp ở cuối.
một kết quả
Cần vét cạn song song? → Workflow
Agent Team = trò chuyện nhóm · Workflow = làn riêng, gộp ở phút chót 26 / 33
// 13 — lồng nhauskill in workflow

Skill có nằm trong Workflow được không? Có.

Workflow
agent
+ Skill của bạn
agent
+ Skill của bạn
agent
+ MCP
agent khác

Skill = cách làm. Workflow = làm bao nhiêu. Các worker bên trong vẫn dùng chính Skill và app (MCP) của bạn.

Workflow điều phối · các agent bên trong vẫn dùng Skill & MCP của bạn 27 / 33
// 14 — sâu vs rộng/goal vs workflow

/goal và Workflow là hai thái cực

/goal = CHIỀU SÂU
Một agent. Cứ chạy tiếp cho đến khi xong.
1 agent lượt 1 lượt 2 Xong = TRUE
Chạy đến khi đúng? → /goal
Workflow = CHIỀU RỘNG
Nhiều agent. Tất cả cùng một lúc.
Plan agent agent agent 1 kết quả
Quá lớn cho một lượt? → Workflow
/goal đào sâu một agent · Workflow trải rộng nhiều agent 28 / 33
// 15 — có sẵnyou already have one

Deep Research chính là một workflow

CÂU HỎI của bạn tìm kiếm tìm kiếm tìm kiếm tìm kiếm tìm kiếm BÁO CÁO có trích dẫn

Có sẵn rồi: gõ /deep-research. Các agent tìm kiếm song song, bỏ phiếu cho từng luận điểm, rồi trả về báo cáo có trích dẫn.

← → để chuyển slide 29 / 33
// 16 — khi cầngreen light · overkill

Khi nào bạn thật sự cần

Đèn xanh
  • Rà soát mọi file trong một codebase
  • Migrate 400 file cùng lúc
  • Nghiên cứu sâu trên nhiều nguồn
  • Thử thách một quyết định lớn
Thừa thãi
  • Một chỉnh sửa đơn lẻ
  • Một câu hỏi nhanh
  • Trao đổi qua lại thông thường
  • Việc bạn cần tự tay lái
Chỉ một câu hỏi: "Việc này có tách thành nhiều mảnh chạy song song được không?"  Có → thử một workflow.
Nếu một agent ôm trọn được cả việc, workflow chỉ tốn thêm cho cùng một câu trả lời 30 / 33
// 17 — khi nào dùnggood fits

Hợp nhất khi việc lớn hơn một agent hoặc lặp trên nhiều item

Rà nhiều file cùng một lỗi
Một agent mỗi file, rồi phản biện từng phát hiện trước khi báo.
Sửa đến khi check pass
Chạy checker, sửa cái lỗi, lặp đến khi đạt hoặc ngừng tiến triển.
Migrate hàng loạt song song
Mỗi file trong một bản sao cô lập để không xung đột chỉnh sửa.
Nghiên cứu đối chiếu chéo
Fan-out nhiều nguồn rồi tổng hợp; hoặc phác kế hoạch từ nhiều góc.
← → để chuyển slide 31 / 33
// 18 — tóm tắtthe whole thing on one slide

Tất cả gói gọn trong một slide

Một việc nhanh
──▶
Cứ hỏi thẳng
Việc bạn làm đi làm lại
──▶
Skill
Một tác vụ phụ lộn xộn
──▶
Subagent
Một nhóm nhỏ cần trao đổi
──▶
Agent Team
Chạy đến khi đúng thì thôi
──▶
/goal
Việc song song khổng lồ
──▶
Workflowđể mắt tới hóa đơn
Cắm vào app của bạn
──▶
MCPđi kèm bất kỳ cái nào
← → để chuyển slide 32 / 33
Điều đọng lại

Đưa kế hoạch vào code.
Để runtime lo phần còn lại.

Nó là gìScript điều phối
hàng chục–hàng trăm
subagent, chạy nền.
Cách chạy"use a workflow"
ultracode: …
/deep-research
Nguồncode.claude.com
/docs/en/workflows
Claude Code · Ghi chú Kỹ thuật 33 / 33