Claude Code ngốn 15–20% token chỉ để hiển thị dòng trạng thái 3 chữ

Công nghệ29 tháng 10, 2026·6 phút đọc

Một phân tích từ Flamerix AI phát hiện Claude Code âm thầm gửi toàn bộ bản ghi hội thoại của các tác tử nền tới model Opus mỗi 30 giây, chỉ để tạo dòng trạng thái 3–5 chữ, tiêu tốn khoảng 15–20% tổng chi phí token. Nhóm này phát hành một script preload mã nguồn mở để vô hiệu hóa cơ chế đó mà không cần sửa binary của Anthropic.

Claude Code ngốn 15–20% token chỉ để hiển thị dòng trạng thái 3 chữ

Claude Code âm thầm đốt 15–20% token cho một dòng trạng thái 3 chữ

Claude Code đang tiêu tốn một phần đáng kể ngân sách token của người dùng cho một tác vụ mà hầu như không ai để ý: cập nhật dòng trạng thái chỉ dài 3–5 chữ trong bảng điều khiển tác tử.

Theo phân tích mới công bố bởi Flamerix AI, khoản chi này chiếm tới 16,4% tổng chi phí và gần 20% số lượng yêu cầu API trên một tài khoản thử nghiệm — thậm chí còn cao hơn cả cuộc hội thoại chính. Nhóm nghiên cứu đã phát hành một script mã nguồn mở để tắt hẳn cơ chế này.

Chuyện gì đang diễn ra bên trong Claude Code?

Cứ khoảng 30 giây một lần, với mỗi tác tử chạy nền, Claude Code lại gửi toàn bộ bản ghi hội thoại (transcript) của tác tử đó tới chính model của nó — thường là Opus — kèm yêu cầu: "Mô tả hành động gần nhất của bạn trong 3–5 từ".

Kết quả trả về chỉ dùng để cập nhật dòng trạng thái trong bảng tác tử. Nó không bao giờ đi vào hội thoại của người dùng hay ảnh hưởng đến quá trình suy luận của model.

Điều đáng chú ý: không có bất kỳ cài đặt nào trong Claude Code để tắt tính năng này, và từ phiên bản 2.1.232, nó được bật mặc định.

Các con số đo được từ dữ liệu OpenTelemetry của Claude Code:

  • 16,4% tổng chi phí (so với 15,7% của cuộc hội thoại chính)
  • 19,7% tổng số yêu cầu API — tức khoảng 1/5 lưu lượng
  • 96% trong số đó chạy trên Opus
  • Tỉ lệ khoảng 9.000 token đầu vào cho mỗi token đầu ra

Flamerix AI cho biết họ không phải nhóm duy nhất ghi nhận hiện tượng này. Một issue trên GitHub (#86879) đã tập hợp bốn phép đo độc lập, cho kết quả từ 18% đến 26%.

Vì sao con số này quan trọng với người dùng Việt Nam?

Nếu bạn trả tiền theo lượt dùng API, chi phí này hiện ra trực tiếp trên hóa đơn. Còn nếu bạn dùng gói thuê bao, cái mất đi chính là hạn mức rate-limit — nghĩa là bạn hết hạn mức nhanh hơn mà không hiểu lý do.

Riêng phần prompt cache giúp giảm chi phí nhưng không triệt tiêu: khoảng 98% các lần gọi đọc lại transcript từ cache, nhưng 2% còn lại rơi vào cache lạnh và chiếm tới hơn một phần ba tổng chi phí của loại yêu cầu này.

Các công cụ theo dõi chi phí dựa trên transcript trên đĩa cũng không thấy khoản này, vì các yêu cầu không được ghi vào session log (issue #104358). Chỉ bản xuất OpenTelemetry mới phơi ra được.

Cách khắc phục: vá tạm ở tầng runtime

Script no-agent-summary.js của Flamerix AI (giấy phép MIT, khoảng 80 dòng) hoạt động như một preload của Bun. Nó bọc setTimeout/setInterval, và khi phát hiện callback chứa dấu hiệu nhận diện của bộ tóm tắt (ví dụ chuỗi log [AgentSummary] Timer fired), nó trả về một handle trơ thay vì kích hoạt timer. Mọi timer khác đi qua bình thường.

Lý do phải dùng mẹo bắt timer thay vì cách đơn giản hơn:

  • Module được phát hành dưới dạng bytecode Bun biên dịch sẵn, nên sửa chuỗi JS bên trong binary không có tác dụng
  • API client không đi qua globalThis.fetch bị bọc
  • Nhưng Function.prototype.toString vẫn trả về mã nguồn callback ngay cả khi chạy từ bytecode

Cài đặt cơ bản:

curl -fsSL https://gist.githubusercontent.com/flamerix-ai/c3905705cc4205e5de3011fa2e74efce/raw/no-agent-summary.js -o ~/.local/share/no-agent-summary.js
claude daemon stop --any
BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS }--preload $HOME/.local/share/no-agent-summary.js" claude

Để áp dụng vĩnh viễn cho mọi tiến trình Claude Code, cần đặt biến BUN_OPTIONS trong file cấu hình shell (~/.bashrc, ~/.zshrc, ~/.profile hoặc config.fish).

Những điểm cần lưu ý

Phải khởi động lại daemon. Daemon, pty host và các phiên bg-spare kế thừa môi trường của tiến trình khởi tạo chúng. Nếu daemon được bật trước khi đặt BUN_OPTIONS, nó sẽ tiếp tục sinh ra các phiên không có hook.

Các chế độ chạy headless cũng cần áp dụng, bao gồm claude -p, cron, CI và tích hợp editor.

Nền tảng: đã kiểm thử trên Linux. macOS và Windows chưa được thử; trên Windows, cơ chế kiểm tra đường dẫn /$bunfs/ nhiều khả năng sẽ không cài được hook.

Rủi ro fail-open: việc nhận diện dựa trên văn bản mã nguồn. Nếu bản cập nhật đổi tên dòng log, chuyển callback qua fn.bind(...) hay chuyển sang API timer chưa được bọc, hook sẽ không khớp gì và tính năng tự bật lại — âm thầm.

Vì vậy, cần chạy lại bước xác minh sau mỗi lần cập nhật. Cách kiểm tra đáng tin nhất là truy vấn OpenTelemetry và xác nhận query_source = agent_summary luôn bằng 0.

Vì sao không có tùy chọn tắt?

Nhóm phân tích chỉ ra một số lý do khiến người dùng không thể tắt bằng cấu hình thông thường:

  • Tùy chọn SDK agentProgressSummaries mặc định là false, nhưng trong bundle nó là một toán hạng của phép OR, và mọi nhánh code ghi giá trị đều đặt thành true
  • Biến CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES cũng chỉ có thể bật, không tắt được
  • Chu kỳ 30 giây do cờ phía server quyết định, giới hạn trong khoảng 30–240 giây, và giá trị mặc định đã là mức tối thiểu
  • DISABLE_NON_ESSENTIAL_MODEL_CALLS — biến mà một số packager đặt — thậm chí không tồn tại trong binary

Bản 2.1.310 có kèm một chế độ "ngắn" rẻ hơn, chỉ gửi khoảng 2.000 token ghi chú thay vì toàn bộ transcript, nhưng mặc định vẫn tắt và chỉ cờ server mới bật được.

Tác động sau khi vá

Theo Flamerix AI, sau khi áp dụng cho mọi tiến trình trên máy (phiên bản 2.1.301):

  • Không còn yêu cầu agent_summary nào, và không có truy vấn phụ nào khác tăng lên thay thế
  • Tác tử con, tác tử nền, skill phân nhánh và phiên nền vẫn chạy bình thường
  • Thay đổi duy nhất nhìn thấy được: dòng trạng thái trong bảng tác tử ngừng cập nhật
  • Chi phí: khoảng 7 ms khởi động thêm cho mỗi lần gọi claude --version

Dữ liệu đo theo tuần của nhóm cho thấy tỉ lệ chi phí này tăng dần theo các bản phát hành: từ 3,5–7% trong tháng 7 lên 7,3%, 11,8% khi cập nhật lên 2.1.233, và khoảng 16% vào giữa tháng 10.

Góc nhìn: khi chi tiết nhỏ đội chi phí lớn

Câu chuyện này là lời nhắc nhở quen thuộc trong thế giới AI tác tử: những yêu cầu phụ tưởng như vô hại, lặp lại mỗi 30 giây, lại có thể cộng dồn thành khoản chi lớn hơn cả công việc chính. Với các nhóm đang triển khai tác tử AI ở quy mô lớn, việc bật OpenTelemetry và rà soát theo query_source nên trở thành bước kiểm tra định kỳ.

Flamerix AI cũng lưu ý rằng việc thay đổi hành vi runtime của một client có thể xung đột với điều khoản dịch vụ, và người dùng tự chịu trách nhiệm kiểm tra điều này. Dự án là độc lập, không liên kết hay được Anthropic bảo trợ.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗