Claude

Tích hợp Claude API vào n8n: parse JSON, bắt lỗi & kiểm soát chi phí token

H Hoàng Trọng Thuật 22 phút đọc

Tích hợp Claude API vào n8n về cơ bản là một node HTTP Request gọi tới https://api.anthropic.com/v1/messages với API key trong header, nhưng phần quyết định workflow có chạy ổn định hay không nằm ở ba việc: ép Claude trả JSON đúng cấu trúc bằng output_config, bật Retry On Fail đúng cách cho lỗi 429/529, và đọc trường usage để biết mỗi lần chạy tốn bao nhiêu token. Bài này đi thẳng vào ba việc đó.

TL;DR

  • Claude API gọi qua endpoint POST /v1/messages với 3 header bắt buộc: x-api-key, anthropic-version: 2023-06-01, content-type: application/json (theo docs Anthropic, truy cập 11/09/2026).
  • Muốn JSON chắc chắn parse được, dùng output_config.format kiểu json_schema — tính năng structured outputs đã GA, không cần beta header, hỗ trợ Haiku 4.5, Sonnet 5, Opus 5.
  • Trong n8n, mở Settings của node HTTP Request để bật Retry On Fail, đặt Max Tries và Wait Between Tries (ms); chỉ nên retry với 429, 500, 529 — không retry 400/401.
  • Mỗi response Claude trả về usage.input_tokens, usage.output_tokens, cache_read_input_tokens; nhân với bảng giá là có chi phí thật của từng execution.
  • Giá tham chiếu (Anthropic, 09/2026): Haiku 4.5 = 1 USD input / 5 USD output mỗi 1 triệu token; Sonnet 5 = 2/10; Opus 5 = 5/25. Batch API giảm 50%, cache đọc chỉ 0,1 lần giá input.
  • Endpoint /v1/messages/count_tokens miễn phí — dùng để ước lượng token tiếng Việt trước khi chạy hàng loạt.

Vì sao nên dùng Claude trong n8n thay vì chỉ chat trên web?

Vì n8n biến Claude từ một cửa sổ chat thành một “công nhân” chạy theo lịch, nhận dữ liệu từ Google Sheets, WordPress, Zalo OA, webhook rồi trả kết quả về đúng chỗ mà không cần ai ngồi copy-paste. Nếu bạn mới làm quen với n8n, đọc trước bài n8n là gì và hub tự động hóa quy trình no-code để nắm khái niệm node, trigger, execution.

Có ba lý do Claude hợp với automation hơn nhiều người nghĩ:

  • Structured outputs: Claude API cho phép khai báo JSON Schema và đảm bảo kết quả trả về đúng schema đó (constrained decoding). Với workflow, “đúng cấu trúc 100%” quan trọng hơn “văn hay” — một dấu ngoặc thiếu là cả chuỗi node phía sau đổ.
  • Context 1M token ở giá chuẩn: theo trang pricing của Anthropic, các model từ Claude 4.6 trở đi tính giá như nhau cho toàn bộ cửa sổ 1 triệu token — nạp cả file CSV 200 trang vào một request không bị phụ thu.
  • Trường usage minh bạch: mỗi response ghi rõ số token vào/ra và số token đọc từ cache, nên bạn tính được chi phí từng execution thay vì chờ hóa đơn cuối tháng.

Trên site đã có bài nối OpenAI và Claude vào n8n hướng dẫn phần nối cơ bản. Bài này không lặp lại phần đó mà đào sâu vào ba thứ mà bài cơ bản chưa chạm tới: parse JSON, bắt lỗi và kiểm soát token.

Lấy API key Claude ở đâu và cấu hình credential trong n8n thế nào?

API key tạo trong Claude Console tại platform.claude.com, mục API Keys; tài khoản mới được cấp một khoản credit nhỏ để thử, sau đó nạp tiền trả trước. Chi tiết từng bước tạo tài khoản, đọc bảng giá và gọi API lần đầu mình đã viết trong bài Claude API tiếng Việt, ở đây chỉ tóm tắt phần liên quan tới n8n.

Trong n8n có hai cách đưa key vào:

  1. Credential Anthropic có sẵn — dùng cho node Anthropic chính thức (thao tác “Message a Model”, phân tích ảnh/tài liệu, quản lý file). Theo docs n8n, trên n8n Cloud còn có thể dùng Gateway credits mà không cần tài khoản Anthropic riêng.
  2. Generic Credential → Header Auth — dùng cho node HTTP Request. Name đặt là x-api-key, Value là key của bạn. Cách này cho bạn toàn quyền với body request (structured outputs, cache_control, batch), là cách mình khuyên dùng cho workflow nghiêm túc.

Lưu ý bảo mật: tuyệt đối không dán key thẳng vào tab Headers của node, vì key sẽ nằm trong JSON workflow khi export hoặc chia sẻ. Credential của n8n được mã hóa và không đi theo file export.

Node HTTP Request gọi Claude cần cấu hình những gì?

Cấu hình tối thiểu cho một node HTTP Request gọi Claude gồm 5 phần: Method POST, URL endpoint, Authentication (Header Auth vừa tạo), thêm header anthropic-version, và body JSON. Bảng dưới là bản đối chiếu từng ô trong n8n với tham số của Claude API:

Ô trong node HTTP Request Giá trị Ghi chú
Method POST Messages API chỉ nhận POST
URL https://api.anthropic.com/v1/messages Không có dấu / cuối
Authentication Generic Credential Type → Header Auth Name = x-api-key
Send Headers → anthropic-version 2023-06-01 Bắt buộc, thiếu là lỗi 400
Send Body → Content Type JSON → Using JSON Dán body bên dưới, dùng expression cho phần động
Options → Timeout 120000 (ms) trở lên Bài dài + model lớn có thể mất hơn 60 giây

Body JSON mẫu cho tác vụ tóm tắt bình luận khách hàng thành dữ liệu có cấu trúc:

{
  "model": "claude-sonnet-5",
  "max_tokens": 1024,
  "system": "Bạn là trợ lý phân loại phản hồi khách hàng cho một shop online tại Việt Nam.",
  "messages": [
    { "role": "user", "content": {{ JSON.stringify($json.binh_luan) }} }
  ],
  "output_config": {
    "format": {
      "type": "json_schema",
      "schema": {
        "type": "object",
        "properties": {
          "cam_xuc": { "type": "string", "enum": ["tich_cuc", "trung_tinh", "tieu_cuc"] },
          "van_de_chinh": { "type": "string" },
          "can_phan_hoi_gap": { "type": "boolean" }
        },
        "required": ["cam_xuc", "van_de_chinh", "can_phan_hoi_gap"],
        "additionalProperties": false
      }
    }
  }
}

Ba điểm dễ sai: max_tokens là bắt buộc (không có giá trị mặc định); system là trường riêng ngoài mảng messages; và nếu bạn viết "{{ $json.binh_luan }}" trong chuỗi JSON, nội dung có dấu ngoặc kép hoặc xuống dòng sẽ phá vỡ JSON — vì thế body mẫu ở trên dùng {{ JSON.stringify($json.binh_luan) }} để n8n tự escape.

Parse JSON Claude trả về trong n8n như thế nào cho chắc?

Claude trả text trong content[0].text; khi đã dùng structured outputs, chuỗi đó là JSON hợp lệ, bạn chỉ cần một node Code (hoặc expression trong node Edit Fields) gọi JSON.parse. Không cần regex, không cần “xin” Claude bỏ dấu “`json nữa.

Cấu trúc response quan trọng cần nhớ:

{
  "id": "msg_...",
  "content": [ { "type": "text", "text": "{\"cam_xuc\":\"tieu_cuc\",...}" } ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 412,
    "output_tokens": 58,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 0
  }
}

Node Code (JavaScript) để tách dữ liệu ra thành field phẳng, giữ luôn số token để tính tiền ở bước sau:

return $input.all().map(item => {
  const r = item.json;
  const data = JSON.parse(r.content[0].text);
  return {
    json: {
      ...data,
      stop_reason: r.stop_reason,
      tokens_in: r.usage.input_tokens,
      tokens_out: r.usage.output_tokens,
      tokens_cache_read: r.usage.cache_read_input_tokens || 0
    }
  };
});

Hai bẫy khi parse mà người mới hay dính:

  • stop_reason = “max_tokens”: Claude bị cắt giữa chừng, JSON sẽ thiếu ngoặc đóng. Hãy kiểm tra trường này trước khi parse; nếu gặp thì tăng max_tokens và chạy lại, đừng cố “vá” chuỗi.
  • Schema không hỗ trợ: theo docs Anthropic, structured outputs không nhận schema đệ quy, không nhận minLength/maxLength/minimum/maximum, và additionalProperties phải là false. Vi phạm là lỗi 400 ngay từ request đầu.

Với model cũ hơn (trước 4.5) không có structured outputs, bạn vẫn có thể ép JSON bằng system prompt, nhưng phải bọc JSON.parse trong try/catch và chuyển item lỗi sang nhánh riêng — đó chính là chỗ cần tới phần bắt lỗi bên dưới.

Bắt lỗi và retry Claude API trong n8n: lỗi nào nên thử lại, lỗi nào dừng?

Nguyên tắc: retry lỗi tạm thời (429, 500, 529), dừng ngay với lỗi do mình gây ra (400, 401, 403, 413). n8n có sẵn cơ chế retry ở cấp node, nhưng nó retry mọi mã lỗi như nhau, nên bạn cần kết hợp với nhánh error output để phân loại.

Bảng mã lỗi Claude API và cách xử lý tương ứng trong n8n (mã lỗi theo docs Anthropic):

HTTP Loại lỗi Nguyên nhân thường gặp Xử lý trong n8n
400 invalid_request_error Thiếu max_tokens, JSON body hỏng, schema không hợp lệ, chạm spend limit tự đặt Không retry — sửa body, kiểm tra expression
401 authentication_error Key sai, bị thu hồi hoặc hết hạn Không retry — kiểm tra credential
413 request_too_large Body vượt 32 MB (Messages API) Chia nhỏ dữ liệu đầu vào
429 rate_limit_error Vượt RPM/TPM của usage tier hoặc chạm trần chi tiêu tháng Retry có chờ; nếu là trần chi tiêu thì không có retry-after và sẽ lỗi liên tục
500 api_error Lỗi nội bộ Anthropic Retry với backoff
529 overloaded_error API quá tải toàn cục Retry với chờ dài hơn (30-60 giây)

Quy trình 5 bước dựng lớp chống lỗi

  1. Bật Retry On Fail: mở tab Settings của node HTTP Request, bật Retry On Fail, đặt Max Tries = 3 và Wait Between Tries (ms) = 5000. Docs n8n về xử lý rate limit khuyên chỉnh số chờ này theo giới hạn tần suất của API bạn gọi.
  2. Đổi On Error sang “Continue (using error output)”: node sẽ có thêm một cổng ra màu đỏ, item lỗi đi theo cổng đó thay vì làm cả workflow dừng.
  3. Thêm node IF sau cổng lỗi: điều kiện {{ $json.error.httpCode }} thuộc [429, 500, 529] → đẩy vào nhánh “chờ rồi gọi lại” (node Wait 60 giây rồi quay về HTTP Request); còn lại → nhánh “báo người”.
  4. Bật Include Response Headers and Status trong Options → Response của node HTTP Request để đọc được header retry-after và request-id; request-id là thứ Anthropic yêu cầu khi bạn cần hỗ trợ.
  5. Đặt Error Workflow: trong Workflow Settings chọn một workflow bắt đầu bằng node Error Trigger để gửi cảnh báo (Telegram/Slack/email) kèm tên node lỗi và execution URL — cái này bắt cả những lỗi không đi qua nhánh error output ở trên.

Một mẹo thực dụng cho lỗi 429 do tần suất: thay vì retry, dùng Options → Batching của node HTTP Request với Items per Batch = 5 và Batch Interval (ms) = 2000. Docs n8n mô tả đây là cách kết hợp cả hai kỹ thuật chia nhỏ và tạm dừng giữa các request; với workflow SME, giới hạn token/phút thường bị chạm trước giới hạn request/phút, và batching làm phẳng cả hai.

Các lỗi n8n phổ biến không liên quan tới Claude (expression sai, node Code trả sai định dạng) mình đã gom trong bài lỗi hay gặp khi dùng n8n.

Kiểm soát chi phí token khi chạy Claude hàng loạt như thế nào?

Chi phí một execution = input_tokens × giá input + output_tokens × giá output + cache_read × 0,1 × giá input, chia cho 1.000.000. Vì Claude trả đủ ba con số này trong usage, bạn có thể tính ngay trong node Code và ghi vào Google Sheets làm sổ chi tiêu.

Bảng giá Anthropic công bố (USD mỗi 1 triệu token, truy cập 11/09/2026):

Model Input Output Cache đọc Batch (input/output) Phù hợp việc gì trong n8n
Claude Haiku 4.5 1 5 0,10 0,5 / 2,5 Phân loại, trích xuất field, tag tự động
Claude Sonnet 5 2 10 0,20 1 / 5 Viết mô tả sản phẩm, tóm tắt, trả lời khách
Claude Opus 5 5 25 0,50 2,5 / 12,5 Phân tích phức tạp, quyết định nhiều bước

Anthropic ghi rõ mức 2/10 USD của Sonnet 5 nay là giá chuẩn — đợt tăng lên 3/15 dự kiến ngày 01/09/2026 đã không diễn ra. Đây là tin tốt cho automation vì Sonnet 5 là điểm cân bằng tốt nhất giữa chất lượng tiếng Việt và giá.

Ví dụ tính tiền cho một workflow thực tế

Giả sử bạn chạy workflow phân loại 3.000 bình luận Facebook mỗi ngày bằng Haiku 4.5, mỗi bình luận khoảng 400 token input (gồm system prompt) và 60 token output:

  • Input: 3.000 × 400 = 1.200.000 token × 1 USD = 1,2 USD
  • Output: 3.000 × 60 = 180.000 token × 5 USD = 0,9 USD
  • Tổng ≈ 2,1 USD/ngày, tức khoảng 63 USD/tháng. Nếu dời sang Batch API (kết quả trả trong vòng 24 giờ) thì còn một nửa.

Cùng khối lượng đó chạy bằng Opus 5 sẽ tốn 5 lần input và 5 lần output — khoảng 315 USD/tháng. Chênh lệch này là lý do quy tắc đầu tiên khi tối ưu chi phí là chọn đúng model theo độ khó việc, chứ không phải cắt prompt.

5 đòn bẩy giảm chi phí token trong n8n

  1. Chọn model theo tầng: Haiku cho lọc/phân loại, Sonnet cho viết, Opus chỉ cho item Haiku/Sonnet không tự tin (dùng field can_phan_hoi_gap hoặc điểm tự đánh giá để rẽ nhánh).
  2. Prompt caching: system prompt dài + tài liệu tham chiếu đặt ở đầu request và thêm cache_control; theo Anthropic, ghi cache 5 phút tính 1,25 lần giá input nhưng mỗi lần đọc chỉ 0,1 lần — hòa vốn ngay từ lần đọc thứ nhất. Chú ý: cache 5 phút chỉ có ích khi workflow chạy liên tục (batching, Loop Over Items), không có ích với lịch chạy mỗi giờ.
  3. Batch API cho việc không cần ngay: giảm 50% cả input lẫn output; hợp với báo cáo đêm, làm sạch dữ liệu cũ.
  4. Đo trước bằng count_tokens: endpoint /v1/messages/count_tokens miễn phí, tier Start cho 5.000 request/phút, chấp nhận cả system prompt, tool, ảnh và PDF base64. Chạy 20-30 mẫu nội dung tiếng Việt thật qua endpoint này để có số token trung bình trước khi nhân với 3.000 item.
  5. Đừng đặt max_tokens quá cao “cho chắc”: max_tokens không tính tiền nếu Claude dừng sớm, nhưng Anthropic cảnh báo request không streaming quá 10 phút dễ bị mạng ngắt; đặt quá lớn cũng dễ timeout ở node HTTP Request.

Một điểm riêng cho tiếng Việt: Anthropic lưu ý các model từ Claude Opus 4.7 trở đi (gồm cả dòng Fable 5 và Mythos 5) dùng tokenizer mới, sinh ra nhiều hơn khoảng 30% token cho cùng một đoạn văn so với Sonnet 4.6 trở về trước; endpoint count_tokens đếm theo đúng tokenizer của model bạn truyền vào. Nếu bạn từng đo token trên model cũ, phải đo lại — và với tiếng Việt có dấu, chênh lệch thực tế có thể khác con số 30% đó, nên count_tokens vẫn là cách duy nhất đáng tin.

Workflow mẫu: phân loại phản hồi khách hàng từ Google Sheets bằng Claude

Workflow này gồm 7 node, chạy mỗi 30 phút, đọc bình luận mới từ Google Sheets, nhờ Claude phân loại và ghi kết quả ngược lại, kèm cột chi phí. Đây là mẫu mình thấy hợp nhất với shop online và agency nhỏ ở Việt Nam vì không cần code ngoài một node JavaScript ngắn.

  1. Schedule Trigger — mỗi 30 phút.
  2. Google Sheets (Read) — lọc các dòng có cột trang_thai trống.
  3. Edit Fields — chuẩn hóa: cắt bình luận còn tối đa 1.500 ký tự, gộp tên sản phẩm vào ngữ cảnh.
  4. HTTP Request → Claude — body như mục trên, model claude-haiku-4-5-20251001, Batching 5 item/2 giây, Retry On Fail 3 lần, On Error = Continue (using error output).
  5. Code — parse JSON, tính chi_phi_usd = (tokens_in × 1 + tokens_out × 5) / 1.000.000.
  6. Google Sheets (Update) — ghi cảm xúc, vấn đề chính, cờ cần phản hồi gấp, chi phí, request-id.
  7. Nhánh lỗi → IF → Wait 60s → quay lại node 4 với mã 429/500/529; mã khác → Telegram báo admin.

Muốn thêm bước trả lời tự động, chỉ cần một node HTTP Request thứ hai gọi Sonnet 5 cho những dòng can_phan_hoi_gap = true — đây là kiểu “tầng model” giúp 90% item chạy bằng Haiku rẻ, chỉ 10% lên Sonnet.

Nếu về sau bạn muốn Claude tự thao tác trên nhiều công cụ hơn thay vì chỉ trả JSON, hướng đi tiếp theo là kết nối Claude qua MCP; còn nếu công việc là viết và sửa chính workflow n8n, Claude Code có thể đọc file JSON workflow và chỉnh sửa trực tiếp cho bạn.

FAQ: tích hợp Claude API vào n8n

Nên dùng node Anthropic có sẵn hay node HTTP Request?

Node Anthropic hợp khi bạn chỉ cần “Message a Model” nhanh hoặc phân tích ảnh/PDF. Node HTTP Request hợp khi cần structured outputs, prompt caching, batch hay đọc header response — docs n8n cũng gợi ý dùng HTTP Request cho các thao tác node chưa hỗ trợ, và có thể tái dùng credential Anthropic.

Claude có trả JSON kèm chữ thừa như “Đây là kết quả:” không?

Với structured outputs thì không — response bị ràng buộc theo schema. Không dùng structured outputs thì có thể, nên phải bọc try/catch khi parse.

Tại sao lỗi 400 nói “This model does not support assistant message prefill”?

Vì các model từ Claude 4.6 trở đi không cho “mớm” đầu câu trả lời bằng message assistant cuối. Cách thay thế chính thức là dùng output_config.format hoặc hướng dẫn trong system prompt.

Lỗi 429 cứ lặp dù đã retry?

Nếu 429 không kèm header retry-after, theo docs Anthropic khả năng cao bạn chạm trần chi tiêu tháng của usage tier chứ không phải rate limit tần suất. Retry vô ích; cần nạp thêm hoặc chờ sang tháng.

Có thể tính chính xác tiền VND cho từng execution không?

Có, vì usage trả về số token thật. Nhân với bảng giá USD rồi quy đổi theo tỷ giá thẻ của bạn — chú ý thêm phí chuyển đổi ngoại tệ của ngân hàng phát hành thẻ.

Chạy n8n self-host hay Cloud thì hợp với workflow gọi Claude?

Self-host (Community Edition mã nguồn mở) không giới hạn execution, phù hợp khối lượng lớn; n8n Cloud gói Starter 20 EUR/tháng (trả năm) cho 2.500 execution, đủ cho workflow chạy vài chục lần/ngày. Chi phí Claude không phụ thuộc vào lựa chọn này.

Có nên để Claude tự gọi lại API khi kết quả chưa tốt?

Có, nhưng đặt giới hạn vòng lặp (ví dụ tối đa 2 lần) và ghi lại số token mỗi vòng. Vòng lặp không giới hạn là cách nhanh nhất để nhận hóa đơn bất ngờ.

Kết luận

Nối Claude vào n8n không khó; làm cho nó chạy ổn định 30 ngày liên tục mới khó. Ba thứ quyết định là structured outputs để JSON không bao giờ hỏng, Retry On Fail kết hợp nhánh error output để phân loại lỗi, và cột chi phí tính từ trường usage để bạn biết chính xác mỗi execution tốn bao nhiêu. Làm đủ ba việc đó, workflow của bạn trở thành thứ có thể giao cho người khác vận hành.

Đọc tiếp trong cụm Claude: Claude API tiếng Việt: lấy key, bảng giá token, gọi API cơ bản · Claude MCP: kết nối Claude với công cụ ngoài · Claude Code từ A–Z · và hub tự động hóa quy trình no-code.

Nguồn tham khảo

H

Hoàng Trọng Thuật

Nhà sáng tạo nội dung về AI, YouTube Automation và Affiliate Marketing. Chia sẻ kiến thức thực chiến từ kinh nghiệm vận hành thật.