Bỏ qua để đến nội dung

Routine và headless mode

Bài viết được dịch tự động từ bài viết gốc, chưa được kiểm tra lại bởi con người. Chỉ những bài viết có dấu tick xanh cạnh tiêu đề là đã được kiểm tra.

Một khi bạn đã tin tưởng Claude làm tốt một việc, bước tiếp theo là ngừng tự tay làm việc đó. Nếu đó là cùng một prompt trên một trigger lặp lại, bạn không nên phải ngồi đó tự khởi động nó mỗi lần. Bài này nói về hai cách giao việc đó cho tự động: routine, nơi bạn không cần xây dựng gì cả, và headless mode, nơi bạn có toàn quyền kiểm soát từ chính script của mình.

Hãy hình dung đây là một dải quang phổ. Một đầu là routine chạy trên hạ tầng do Anthropic quản lý. Đầu kia là headless mode và Agent SDK, chạy Claude Code từ chính code của bạn. Hãy bắt đầu từ đầu ít phải xây dựng nhất.

Routine: một prompt đã lưu, chạy trên cloud

Phần tiêu đề “Routine: một prompt đã lưu, chạy trên cloud”

Routine là cách trực tiếp nhất để tự động hoá một tác vụ. Không có script, không có server. Nó gói gọn ba thứ: một prompt, repository nó tác động vào, và bất kỳ connector nào nó cần. Sau đó nó chạy gói này trên cloud mỗi khi được kích hoạt.

Điểm mấu chốt là hạ tầng thuộc về Anthropic. Không có máy nào của bạn phải chạy suốt đêm, không có file workflow nào bạn phải bảo trì. Bạn mô tả công việc một lần, và nó cứ thế chạy.

Một routine có thể kích hoạt bởi vài loại trigger:

  • Lịch cron, ví dụ mỗi sáng 9 giờ.
  • Một HTTP POST tới API endpoint của nó, để code của bạn tự kích hoạt.
  • Một sự kiện GitHub, như khi có pull request mới.

Bất cứ việc gì lặp lại cùng một prompt trên một trigger đều là ứng viên tốt. Một buổi audit dependency mỗi sáng. Một bộ triage PR kích hoạt khi có pull request mới. Một lượt quét hằng ngày các ticket Sentry để tìm ra việc gì cấp bách nhất.

Mô hình tư duy cho routine: nó gắn kết một prompt, repo, các connector, và một lịch trình.

Bạn có thể tạo một routine từ web tại claude.ai/code/routines. Bạn đặt tên, viết chỉ dẫn mô tả Claude nên làm gì trong mỗi phiên, chọn một repository, và chọn một trigger.

Bạn cũng có thể tạo một routine ngay trong Claude Code mà không cần rời terminal. Chỉ cần chạy lệnh /schedule và mô tả điều bạn muốn bằng ngôn ngữ tự nhiên, ví dụ:

/schedule daily dependency audit at 9am

Cùng một ý tưởng, chỉ khác điểm vào. Chọn cách nào phù hợp với quy trình của bạn.

Ba điều cần biết trước khi dựa vào routine

Phần tiêu đề “Ba điều cần biết trước khi dựa vào routine”

Trước khi phó thác một việc quan trọng cho routine, hãy nhớ ba giới hạn sau.

  • Routine đang ở giai đoạn research preview. Hành vi và giới hạn sẽ tiếp tục thay đổi, nên đừng ngạc nhiên nếu có gì đó khác đi.
  • Một lịch lặp lại chạy tối đa mỗi giờ một lần. Nếu bạn cần thứ gì đó thường xuyên hơn, routine không phải công cụ phù hợp.
  • Mỗi lần chạy bắt đầu từ một bản clone mới của nhánh mặc định, và chỉ có thể push lên các nhánh có tiền tố claude/, trừ khi bạn nới lỏng điều đó cho từng repo. Đây là rào chắn giữ cho một lần chạy tự động không viết đè lên main.

Headless mode: khi bạn cần môi trường của riêng mình

Phần tiêu đề “Headless mode: khi bạn cần môi trường của riêng mình”

Routine rất tốt khi công việc vừa vặn trên cloud. Nhưng đôi khi việc cần môi trường của bạn, hoặc logic bọc quanh lần chạy. Đó là lúc bạn chuyển xuống headless mode.

Cốt lõi của headless mode là cờ -p (viết tắt của --print). Nó chạy Claude Code như một lệnh one-shot, không có giao diện tương tác. Nó đọc standard in và ghi standard out, nên nó pipe được như bất kỳ công cụ shell nào khác:

claude -p "summarize the changes in this diff"

Một điều đáng biết: -p bỏ qua việc tự động khám phá (auto-discovery) hooks, skills, plugins, MCP server, và file CLAUDE.md. Bạn chỉ nhận được Claude cộng với các tool bạn cho phép tường minh, không có gì mà môi trường cục bộ tình cờ nạp vào. Điểm lợi là khởi động nhanh hơn nhiều theo cách này.

Vì headless mode pipe được như bất kỳ công cụ shell nào, bạn thường sẽ muốn lấy về dữ liệu có cấu trúc thay vì văn xuôi. Bạn có thể kết hợp một JSON schema với định dạng output JSON, và Claude sẽ ràng buộc output của nó khớp với schema đó.

Object khớp với schema của bạn nằm trong field structured_output của response JSON. Vậy nên bạn có thể lấy nó ra bằng lệnh jq và pipe vào một database hoặc script khác:

Terminal window
claude -p "Extract the exported function names from src/core/style.js" \
--output-format json \
--json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}' \
| jq '.structured_output.functions'

Điều đó cho bạn một mảng gọn gàng để chuyển tiếp cho bất cứ thứ gì tiếp theo.

Với công việc diễn ra qua nhiều bước, bạn không cần nhồi nhét mọi thứ vào một lệnh. Lưu lại session ID từ output JSON và resume nó sau:

claude --resume "$(jq -r .session_id /tmp/plan.json)"

Một script khởi động công việc. Một script khác resume nó sau, với đầy đủ ngữ cảnh. Điều này hữu ích khi lượt đầu tiên tạo ra một kế hoạch, và lượt thứ hai thực thi nó.

Khi CI cần đúng kết quả giống nhau ở mỗi lần chạy, có một chế độ được xây riêng cho việc đó.

Cờ --bare cho bạn chế độ tất định (deterministic mode). Đây là lựa chọn đúng khi bạn chạy Claude Code bên trong một pipeline và muốn output lặp lại được, dự đoán được, thay vì thay đổi qua từng lần chạy.

Agent SDK: Claude Code bên trong ứng dụng của bạn

Phần tiêu đề “Agent SDK: Claude Code bên trong ứng dụng của bạn”

Bước cuối cùng trên dải quang phổ này là Agent SDK. Nó cho bạn một thư viện nhúng Claude Code vào bên trong ứng dụng TypeScript hoặc Python của riêng bạn.

Cả hai ngôn ngữ đều phơi bày một hàm query và cùng những nguyên thủy (primitive) như CLI. Bạn truyền vào một prompt cộng với các option, như:

  • allowedTools để kiểm soát Claude được phép làm gì,
  • một system prompt,
  • và một permission mode.

Sau đó bạn duyệt qua các message Claude stream về và xử lý chúng theo cách ứng dụng của bạn cần. Đó là cùng một engine như CLI, chỉ khác là gọi được từ bên trong sản phẩm của bạn.

Đây là hướng dẫn quyết định nhanh:

  • Routine là mặc định cho công việc lặp lại. Chúng chạy trên hạ tầng của Anthropic, không có gì cho bạn phải host.
  • Headless mode với -p dành cho khi công việc cần pipeline của bạn và bạn muốn pipe dữ liệu qua một script.
  • --bare dành cho khi CI cần đúng kết quả giống nhau ở mỗi lần chạy.
  • Agent SDK dành cho khi công việc thuộc về bên trong sản phẩm của chính bạn.

Bắt đầu với routine. Chỉ xuống sâu hơn trên dải quang phổ khi công việc thực sự cần thêm quyền kiểm soát.

Xem thêm: Chế độ không tương tác