Claude Code output style: cách hoạt động và tự viết
Output style sửa system prompt của Claude Code, nên ảnh hưởng mọi reply. Xem 5 style tích hợp, transcript thay đổi ra sao và cách tự viết style riêng.
Output style trong Claude Code là gì
Output style trong Claude Code là một khối instruction mà Claude Code thêm vào system prompt. Nó thay đổi cách Claude trả lời bạn: vai trò Claude đảm nhận và dạng nội dung Claude in ra. Nó không dạy Claude về codebase của bạn và không thể cấp cho Claude quyền chạy bất kỳ thứ gì.
Claude Code có sẵn 5 style tích hợp. Lựa chọn của bạn nằm trong một settings key là outputStyle. Key này chỉ được đọc một lần khi session bắt đầu. Đây là nguyên nhân của phần lớn nhầm lẫn về tính năng này: style bạn chuyển sang giữa session sẽ được lưu, nhưng bị bỏ qua cho đến khi bạn xóa style đó.
Trên VPS, đây không chỉ là tùy chọn về hình thức. Transcript là nội dung bạn đọc qua kết nối SSH (secure shell), thường bên trong một cửa sổ tmux. Vì vậy, mỗi dòng Claude tường thuật là một dòng bạn phải chờ và cũng chiếm một dòng trong scrollback buffer có kích thước cố định.
Vị trí của setting outputStyle
Chọn một style từ menu /config, tại mục Output style. Claude Code ghi lựa chọn của bạn vào .claude/settings.local.json trong project bạn đang làm việc.
Lệnh độc lập /output-style không còn tồn tại. Lệnh này bị deprecated ở v2.1.73 và bị remove ở v2.1.91, nên trên bản build hiện tại nó hoàn toàn không làm gì. Hãy kiểm tra phiên bản đang chạy trước khi làm theo bất kỳ hướng dẫn cũ nào. Các phiên bản trên trang này được kiểm tra vào tháng 8 năm 2026.
claude --versionBạn cũng có thể tự đặt key. Có 4 file settings có thể chứa key này. File cụ thể hơn sẽ ghi đè file tổng quát hơn.
~/.claude/settings.jsonlà user file của bạn. File này áp dụng cho mọi project trên máy đó..claude/settings.jsonlà project file. File này được commit vào git, nên áp dụng cho mọi người clone repository..claude/settings.local.jsonlà local project file. File này không được commit và ghi đè cả 2 file trên. Đây là file được menu/configghi vào.- Managed settings do đội IT triển khai từ một system path như
/etc/claude-code/trên Linux sẽ ghi đè mọi thiết lập khác.
Giá trị của key là tên style:
{
"outputStyle": "Concise"
}Để chỉ áp dụng cho một session, hãy truyền cùng key đó trên command line. Flag --settings nhận một path hoặc một chuỗi JSON inline. Các giá trị của nó ghi đè những key tương ứng trong các file settings trong lần chạy đó:
claude --settings '{"outputStyle": "Concise"}'Nhãn menu và slash command đã thay đổi ít nhất một lần trong quá trình feature này tồn tại. Key outputStyle thì không thay đổi. Khi screenshot trong một hướng dẫn không còn khớp với những gì bạn thấy, hãy đặt key trực tiếp và xác nhận bằng /status. Lệnh này liệt kê các nguồn settings đang có hiệu lực.
Vì sao style đầu ra mới không có tác dụng cho đến khi bạn xóa
Claude Code xây dựng system prompt một lần khi session bắt đầu, và style đầu ra là một phần của system prompt đó. Vì vậy, thay đổi setting khi session đang chạy chỉ lưu lại giá trị mà bạn không thấy thay đổi gì, vì session hiện tại vẫn tiếp tục gửi prompt đã được xây dựng lúc khởi động. Style mới sẽ được tải ở lần /clear tiếp theo hoặc khi khởi chạy lại.
/clear
/context/context hiển thị nội dung hiện đang chiếm context window, được chia theo category, bao gồm cả system prompt. Hãy chạy lệnh này trong một session mới với từng style. Dòng system prompt là dữ liệu đầu vào để bạn so sánh. Đây cũng là cách nhanh nhất để xác nhận custom style đã được tải. Để xem tổng quan về những gì lấp đầy context window, hãy xem cách context được lấp đầy trong một session Claude Code dài.
Có lý do setting này chờ đến session tiếp theo thay vì áp dụng ngay. API phục vụ các request lặp lại từ prompt cache dựa trên phần đầu của mỗi request, còn system prompt nằm ngay ở phần đầu đó. Nếu viết lại system prompt giữa cuộc trò chuyện, mọi nội dung phía sau sẽ mất hiệu lực, khiến turn tiếp theo phải xử lý lại toàn bộ history như input mới. Cố định style ngay khi session bắt đầu sẽ tránh được chi phí này. Chuyển style không tốn nhiều chi phí. Chỉ cần xóa context.
Những thay đổi của từng output style tích hợp đối với transcript
- Default là system prompt mặc định của Claude Code, được viết cho công việc software engineering.
- Concise đưa kết quả lên trước. Style này bỏ phần mở đầu và phần tường thuật từng bước, đồng thời giữ câu trả lời ngắn cho đến khi bạn yêu cầu thêm chi tiết. Phần công việc engineering phía sau không thay đổi. Style này không bao giờ rút gọn error report hoặc cảnh báo bảo mật, và vẫn hỏi đầy đủ trước khi thực hiện hành động có tính hủy dữ liệu. Style này cần Claude Code v2.1.237 trở lên.
- Explanatory thêm các "Insights" mang tính hướng dẫn giữa những bước của task, giải thích lý do chọn một cách triển khai và pattern mà codebase của bạn đang dùng. Transcript được thiết kế để dài hơn.
- Learning đi xa hơn. Claude chia sẻ các insight đó, sau đó yêu cầu bạn tự viết những phần code nhỏ, đồng thời đánh dấu từng vị trí bằng comment
TODO(human)trong file. - Proactive khiến Claude hành động thay vì hỏi. Với các quyết định thường lệ, Claude đưa ra những giả định hợp lý thay vì dừng lại để xin xác nhận.
Hãy đọc kỹ phần cuối, vì đây là điểm mọi người thường hiểu nhầm. Proactive là hướng dẫn trong system prompt. Nó thay đổi những gì Claude sẽ thử thực hiện. Permission mode của bạn vẫn quyết định thao tác nào thực sự chạy mà không cần hỏi. Đây mới là setting quan trọng trên server bạn để chạy unattended. Nội dung này được trình bày trong auto mode và các permission mode của Claude Code.
Sự khác nhau giữa output style, CLAUDE.md, hook và subagent
Tất cả các cơ chế này đều giống như cách bạn hướng dẫn Claude cách hoạt động, nhưng chúng tác động ở các tầng khác nhau.
- output style được thêm vào system prompt. Nó áp dụng cho mọi response trong conversation chính.
- CLAUDE.md được thêm dưới dạng user message sau system prompt. Đây là nơi chứa các quy ước của project và thông tin thực tế về codebase.
--append-system-promptnối thêm text vào system prompt cho một lần invocation, không xóa nội dung nào. Đây là phiên bản dùng một lần của output style.- hook là shell command do Claude Code tự chạy khi một event xảy ra. Harness thực thi hook, nên hook luôn chạy dù Claude có định chạy hay không. Xem hook của Claude Code có thể và không thể làm gì.
- subagent chạy với system prompt riêng và bộ tool riêng.
Một bài kiểm tra ngắn giúp phân biệt hai loại đầu tiên. Thông tin thực tế về project của bạn nằm trong CLAUDE.md, vì Claude cần biết những thông tin đó. Cách diễn đạt nằm trong output style, vì nó quy định câu trả lời được viết như thế nào. Bất kỳ việc gì phải xảy ra trong mọi lần chạy, bất kể model quyết định gì, đều là hook. Lớp mà mỗi bề mặt này thuộc về là thuộc tính của chương trình chạy model, không phải của chính model. Vì vậy, style chỉ có thể tác động, còn hook mới có thể bắt buộc thực thi.
Output style chỉ áp dụng cho conversation chính. Subagent không kế thừa style của bạn, vì nó bắt đầu conversation riêng với system prompt riêng. Fork của conversation hiện tại là ngoại lệ, vì fork kế thừa chính xác system prompt của conversation cha. Nếu subagent viết theo cách bạn không thích, hãy chỉnh sửa file của agent đó thay vì style của bạn. Một session Claude Code thứ hai trên cùng máy cũng tuân theo ranh giới này. Nó tự đọc các file settings khi khởi động. Vì vậy, khi bạn chuyển việc cho session khác đang chạy song song với session của bạn, response trả về sẽ dùng style mà session đó đã load, không phải style của bạn.
Cách viết output style của riêng bạn
Output style tùy chỉnh là một file markdown có frontmatter. Lưu file trong thư mục home để dùng cho mọi project, hoặc lưu trong repository để giữ cùng code. Thư mục user là ~/.claude/output-styles/ và thư mục project là .claude/output-styles/.
mkdir -p ~/.claude/output-styles
cat > ~/.claude/output-styles/terse-ops.md <<'EOF'
---
name: Terse ops
description: Command first, explanation after, for SSH sessions
keep-coding-instructions: true
---
Lead with the command or the file change. Put the explanation after it, in two sentences or fewer.
Do not narrate what you are about to do. Report what you did.
When a command can fail, print the one check that proves it worked and say what a healthy result looks like.
EOFBắt đầu một session và mở /config. Style của bạn sẽ xuất hiện trong danh sách Output style, kèm description bạn đã viết. Nếu không thấy, file chưa được đọc: kiểm tra path và kiểm tra block frontmatter --- có nằm ở dòng đầu tiên của file hay không. Tên file trở thành tên style, trừ khi frontmatter đặt name, vì vậy style này có tên là Terse ops chứ không phải terse-ops.
Chọn style đó, hoặc đặt key thành đúng tên này rồi xóa:
{
"outputStyle": "Terse ops"
}Một field quyết định file của bạn là phần điều chỉnh hay phần thay thế. keep-coding-instructions mặc định là false, nghĩa là custom style sẽ loại bỏ các instruction software engineering tích hợp sẵn của Claude Code và chỉ chạy theo nội dung của bạn. Các instruction tích hợp sẵn này hướng dẫn Claude xác định phạm vi thay đổi và kiểm tra kết quả. Với writing assistant hoặc data analyst, hãy bỏ field này vì các instruction đó không áp dụng. Với mọi trường hợp vẫn có tác động đến code, hãy đặt field thành true. Nếu không, bạn sẽ không hiểu vì sao một engineer cẩn thận đột nhiên ngừng tự kiểm tra công việc của mình. Nếu mục tiêu thực sự của bạn không phải là đổi văn phong mà là định nghĩa chặt chẽ hơn mức độ công việc cần dành cho một task, hãy đặt nội dung đó trong engineering instructions thay vì style file: skill Ponytail là một ví dụ hoàn chỉnh, với một rule duy nhất buộc agent hướng đến thay đổi nhỏ nhất nhưng vẫn hoạt động.
description là dòng mà picker /config hiển thị bên cạnh tên style. Hãy viết dòng này cho thời điểm 6 tháng sau, khi bạn phải chọn giữa 2 style của chính mình.
Vì sao style ngắn gọn lại khác khi dùng SSH
Trên VPS, bạn đọc transcript qua nhiều lớp mà terminal cục bộ không có, và mỗi lớp đều khiến nội dung dài trở nên tốn kém hơn.
Scrollback là yếu tố đầu tiên. Trong tmux, mỗi pane giữ một số dòng cố định, được đặt bằng history-limit và mặc định là 2000. Transcript có nhiều lời dẫn sẽ lấp đầy buffer nhanh hơn. Vì vậy, phần đầu của session sẽ bị loại sớm hơn và output bạn muốn xem lại sẽ biến mất. Nếu cần thêm chỗ, hãy tăng giới hạn:
echo 'set -g history-limit 20000' >> ~/.tmux.conf
tmux source-file ~/.tmux.confCác pane tạo sau đó sẽ giữ mỗi pane 20000 dòng, đổi lại sẽ dùng thêm memory cho từng pane. Các pane đã mở vẫn giữ giới hạn cũ vì kích thước buffer được cố định khi pane được tạo. Nếu bạn vẫn đang xây dựng layout cho session, chạy Claude Code bên trong tmux trên VPS sẽ trình bày cách thực hiện.
Latency là yếu tố thứ hai. Response được stream vào terminal ngay khi được tạo. Trên đường truyền có round-trip time cao, phần mở đầu dài khiến bạn phải chờ text xuất hiện trước khi thấy câu trả lời.
Output token là yếu tố thứ ba. Mỗi dòng lời giải thích đều được tính vào output. Explanatory và Learning dài hơn theo thiết kế. Concise ngắn hơn theo thiết kế vì nó yêu cầu Claude mặc định giữ response ngắn.
Đừng tin phần trăm do bất kỳ ai đưa ra, kể cả trang này. Mức chênh lệch phụ thuộc vào prompt, model và công việc bạn yêu cầu. Vì vậy, hãy tự đo trước và sau. Chạy cùng một task thực tế trong 2 session mới, một session dùng Default và một session dùng Concise, rồi so sánh. Statusline là đồng hồ đo dễ dùng nhất vì Claude Code truyền cho script một JSON object qua stdin, trong đó đã có cả tên style và số token:
cat > ~/.claude/statusline.sh <<'EOF'
#!/bin/bash
input=$(cat)
style=$(echo "$input" | jq -r '.output_style.name // "default"')
out=$(echo "$input" | jq -r '.context_window.total_output_tokens // 0')
cost=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
echo "style=$style out=$out cost=$cost"
EOF
chmod +x ~/.claude/statusline.shTrỏ setting statusLine vào đó:
{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh"
}
}Thanh ở cuối session giờ sẽ hiển thị style đang active cùng số token đã tạo. Đây chính là số liệu before và after bạn cần. Script cần jq, JSON parser dòng lệnh, nên hãy cài nó trước bằng sudo apt install -y jq. Nếu thanh vẫn trống, hãy chạy script thủ công rồi pipe một JSON vào đó. Statusline thoát với mã khác 0 sẽ không in và không báo gì. Statusline tùy chỉnh của Claude Code liệt kê các field còn lại trong object đó. Nếu quan tâm đến phần billing thay vì phần session, hãy đọc token của Claude Code thực sự đi đâu và các tool theo dõi chi phí Claude Code.
Cách kiểm tra style output nào thực sự đang được nạp
Hãy dùng các lệnh kiểm tra này thay vì đoán.
/statusliệt kê các nguồn settings đang có hiệu lực cho session này, bao gồm cả việc settings được quản lý từ một organization có đang được áp dụng hay không./contexthiển thị system prompt đã nạp dưới dạng một category trong phần phân tích context window.claude doctor, chạy từ shell mà không khởi động session, in thông tin chẩn đoán về installation và settings, đồng thời báo các file settings không hợp lệ.
Khi một style không được áp dụng, nguyên nhân gần như luôn thuộc một trong 2 trường hợp. Trường hợp đầu tiên là bạn đã thay đổi style giữa session, nên hãy chạy /clear. Trường hợp thứ hai là precedence: .claude/settings.local.json ghi đè .claude/settings.json, và cả 2 đều ghi đè ~/.claude/settings.json. Vì bộ chọn /config ghi vào file local, style mà team của bạn commit trong .claude/settings.json sẽ âm thầm bị ghi đè trên mọi máy mà trước đó ai đó đã dùng menu. /status cho biết nguồn nào đã thắng.
Lỗi cú pháp JSON có cùng triệu chứng nhưng cách xử lý khác. claude doctor cho biết tên file mà nó không thể parse. Bạn nên chạy lệnh này trước khi tìm nguyên nhân phức tạp hơn.
FAQ
Vì sao lệnh /output-style không còn hoạt động?
Lệnh này đã bị đánh dấu deprecated trong v2.1.73 và bị xóa trong v2.1.91, nên trên bản build từ giữa năm 2026, lệnh này không còn tồn tại. Chạy claude --version để xem phiên bản bạn đang dùng. Chọn style trong /config, tại mục Output style, hoặc đặt key outputStyle trong file settings. Key này vẫn hoạt động dù lệnh đã bị xóa, vì vậy việc đặt trực tiếp key là hướng dẫn đáng ghi lại trong tài liệu riêng của bạn.
Tôi đã đổi output style nhưng không có gì thay đổi. Vì sao?
Output style là một phần của system prompt, và Claude Code tạo system prompt một lần khi session bắt đầu. Thay đổi giữa session được lưu nhưng không được áp dụng, vì session đang chạy vẫn gửi prompt đã tạo lúc khởi động. Chạy /clear hoặc bắt đầu session mới. Nếu vẫn không áp dụng, chạy /status để xem settings source nào được ưu tiên, vì .claude/settings.local.json ghi đè .claude/settings.json và cả hai đều ghi đè ~/.claude/settings.json.
Output style Concise có giúp tiết kiệm chi phí không?
Style này làm số output token giảm theo hướng bạn kỳ vọng, vì nó yêu cầu Claude mặc định trả lời ngắn. Mức giảm phụ thuộc vào prompt và model bạn dùng, vì vậy hãy xem mọi phần trăm được công bố là kết quả đo từ công việc của người khác. Hãy tự đo: chạy /context trong một session mới với từng style để đo phần input, sau đó chạy cùng một tác vụ với từng style và so sánh số output token. Concise không bao giờ rút ngắn error report hoặc cảnh báo bảo mật, nên những phần bạn cần đọc nhất vẫn được giữ nguyên.
Output style có thay đổi cách subagent viết không?
Không. Output style chỉ áp dụng cho cuộc hội thoại chính, vì subagent bắt đầu cuộc hội thoại riêng với system prompt riêng và bộ tool riêng. Fork của cuộc hội thoại hiện tại là ngoại lệ, vì fork kế thừa chính xác system prompt của parent. Để thay đổi cách subagent trả lời, hãy sửa file riêng của agent đó.
Output style có cho phép Claude chạy lệnh mà không hỏi không?
Không. Output style là văn bản trong system prompt, nên chỉ có thể ảnh hưởng đến việc Claude cố gắng thực hiện. Style Proactive khiến Claude tự đưa ra giả định và hành động thay vì dừng lại trước các quyết định thường lệ, nhưng vẫn không thể tự phê duyệt một lệnh. Permission mode quyết định lệnh nào được chạy mà không cần prompt. Đây là setting cần kiểm tra trước khi để session chạy trên server.