Hướng dẫn AgentFlow

Lỗi

Mọi lỗi của API là một tài liệu application/problem+json mang mã ổn định và request_id — cách đọc nó, vì sao thứ bạn không được thấy trả 404, và khi nào nên thử lại.

Hình dạng của một lỗi

Mọi yêu cầu thất bại đều trả về Content-Type: application/problem+json, theo RFC 9457:

HTTP/1.1 409 Conflict
Content-Type: application/problem+json
x-request-id: …

{
  "type": "STALE_VERSION",
  "title": "Conflict",
  "status": 409,
  "detail": "…",
  "request_id": "…",
  "instance": "/api/v1/entities/…/records/…",
  "extensions": { "conflict": { … } }
}
TrườngÝ nghĩa
typeMã ổn định. Hãy rẽ nhánh theo trường này. Toàn bộ danh mục nằm ở Mã lỗi.
title, statusTên ngắn và trạng thái HTTP.
detailCâu giải thích dành cho người đọc. Đừng phân tích nó bằng mã — câu chữ có thể đổi.
request_idBằng đúng header x-request-id của phản hồi. Hãy gửi kèm giá trị này khi báo lỗi cho bộ phận hỗ trợ.
instanceĐường dẫn của yêu cầu.
field_errorsLỗi theo từng trường, dạng [{path, message, rule, detail}]; detail có thể vắng.
field_warningsCảnh báo theo từng trường, cùng dạng.
extensionsMột đối tượng riêng cho từng mã — ví dụ extensions.conflict đi kèm 409 STALE_VERSION.

Trường nào không có giá trị — detail, field_errors, field_warnings, extensions — thì vắng hẳn khỏi thân lỗi, không bao giờ mang null.

Một 500 là lỗi không lường trước ở phía server. detail của nó chỉ là một câu chung — ý nghĩa của mã trong danh mục mã lỗi — và không bao giờ chứa chi tiết bên trong. Khi báo lỗi này, hãy gửi request_id cho bộ phận hỗ trợ: nhờ nó họ tìm lại được đúng yêu cầu của bạn.

Yêu cầu server không đọc được

Khi không đọc được chính yêu cầu — thân không phải JSON, một id sai định dạng, một tham số truy vấn lạ — server từ chối trước khi thực hiện thao tác, với một trong các mã sau:

Trạng tháiMã (type)Khi nàofield_errors
400MALFORMED_JSONThân yêu cầu không phải JSON hợp lệ, hoặc là JSON nhưng sai hình dạng — ví dụ một số ở chỗ cần chuỗi.Với JSON sai hình dạng, khi xác định được thành phần sai: một mục, path là thành phần đó, ví dụ expected_updated_at. Với thân không phải JSON: không có.
415UNSUPPORTED_MEDIA_TYPEThân JSON gửi thiếu Content-Type, hoặc với một kiểu không phải application/json hay một kiểu application/…+json.Không có.
413PAYLOAD_TOO_LARGEThân yêu cầu lớn hơn mức thao tác nhận: 2 MiB với thân JSON; tải tệp lên có giới hạn riêng.Không có.
400INVALID_PATH_PARAMETERMột tham số đường dẫn không đọc được, ví dụ một id không phải UUID.Một mục, path là tên tham số, ví dụ record_id.
400INVALID_QUERY_PARAMETERGiá trị một tham số truy vấn nằm ngoài những gì thao tác khai báo: limit ngoài khoảng 1–200; một giá trị tham số không liệt kê, như một sort hay dir lạ; một id hay mốc thời gian sai định dạng; một tham số boolean nhận giá trị khác true và false; hoặc một tham số chỉ nhận một giá trị mà được gửi nhiều lần.Một mục cho mỗi tham số, path là tên tham số.
400UNKNOWN_QUERY_PARAMETERMột tham số truy vấn mà thao tác không khai báo — một tên gõ sai, hoặc một tên cũ.Một mục cho mỗi tham số lạ, path là tên tham số.
404ROUTE_NOT_FOUNDKhông thao tác nào khớp với đường dẫn.Không có.
405METHOD_NOT_ALLOWEDĐường dẫn có tồn tại nhưng không nhận phương thức này. Header Allow liệt kê các phương thức nó nhận.Không có.
400IDEMPOTENCY_KEY_INVALIDHeader Idempotency-Key rỗng, dài hơn 255 ký tự, có ký tự ngoài ASCII in được, hoặc được gửi hai lần. Xem Thử lại an toàn.Một mục, path là Idempotency-Key.

Ví dụ, gửi GET /api/v1/instances?search=laptop — danh sách lượt chạy tìm kiếm bằng q, không có tham số search:

HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "type": "UNKNOWN_QUERY_PARAMETER",
  "title": "Bad Request",
  "status": 400,
  "detail": "this operation does not accept the query parameter `search`",
  "request_id": "…",
  "instance": "/api/v1/instances",
  "field_errors": [
    { "path": "search", "message": "this operation does not accept the query parameter `search`", "rule": "unknown" }
  ]
}
  • Một yêu cầu vừa có tham số lạ vừa có giá trị sai chỉ nhận UNKNOWN_QUERY_PARAMETER. Lỗi về giá trị hiện ra khi đã bỏ tham số lạ.
  • Một yêu cầu không mang thông tin xác thực nhận 401 trước hết, kể cả với một đường dẫn không tồn tại: server không cho người gọi ẩn danh biết đường dẫn nào có.

Không được thấy thì trả 404

Một tài nguyên mà bạn không được phép thấy trả lời y hệt một tài nguyên không tồn tại: 404. Điều này có chủ ý. Trả 403 sẽ xác nhận rằng tài nguyên đó có tồn tại — mà với một hồ sơ nằm ngoài phạm vi của bạn, sự tồn tại ấy chính là điều phạm vi muốn giữ kín.

Vì vậy, khi nhận 404 cho một id mà bạn chắc là đúng, hãy kiểm tra quyền của khóa bằng GET /caller và các lượt cấp quyền trên thực thể, trước khi kết luận là nó đã bị xóa.

Khi nào nên thử lại

Phản hồiNên làm gì
503Thử lại sau khoảng thời gian ghi trong header Retry-After.
429Tạm dừng một lúc rồi thử lại.
409 STALE_VERSIONTài nguyên đã đổi kể từ lần bạn đọc. Đọc lại nó, áp lại thay đổi, rồi gửi lại.
409 PAUSE_CASCADE_CONTENTIONGửi lại nguyên yêu cầu.
409 IDEMPOTENCY_KEY_IN_PROGRESSYêu cầu gốc với cùng Idempotency-Key vẫn đang chạy. Chờ theo Retry-After, rồi gửi lại với cùng khóa.
422 IDEMPOTENCY_KEY_MISMATCHKhóa đã được dùng cho một yêu cầu khác. Dùng khóa mới cho yêu cầu mới; gửi lại y nguyên không giúp gì.
410 IDEMPOTENT_RESOURCE_GONETài nguyên mà khóa đã tạo bị xóa, hoặc bạn không còn thấy nó. Đừng thử lại.
409 WEBHOOK_SECRET_ROTATION_LIMITĐã có 5 khóa ký cùng hiệu lực. Chờ chồng lấn cũ nhất kết thúc, hoặc xoay kèm revoke_previous. Xem Sự kiện và webhook.
410 WEBHOOK_EVENT_NOT_RETAINEDSự kiện của lần gửi ấy đã quá hạn lưu. Đừng thử lại; hãy đọc lại trạng thái hiện tại qua API.
Hết thời gian chờ, hoặc mất kết nối trước khi có phản hồiVới một thao tác nhận Idempotency-Key, gửi lại với cùng khóa để biết kết quả thật. Xem Thử lại an toàn.
MALFORMED_JSON, UNSUPPORTED_MEDIA_TYPE, PAYLOAD_TOO_LARGE, INVALID_PATH_PARAMETER, INVALID_QUERY_PARAMETER, UNKNOWN_QUERY_PARAMETER, IDEMPOTENCY_KEY_INVALID, ROUTE_NOT_FOUND, METHOD_NOT_ALLOWEDKhông đáng gửi lại y nguyên: server sẽ từ chối đúng như vậy. Sửa yêu cầu theo field_errors và tài liệu tham chiếu, rồi mới gửi.
Các 4xx khácGửi lại y nguyên không đổi được kết quả. Hãy sửa yêu cầu, quyền hoặc dữ liệu trước — trừ khi mô tả của thao tác trong tài liệu tham chiếu nói khác.

Hãy ghi request_id vào log của tích hợp cho mọi lỗi. Đó là thứ đầu tiên bộ phận hỗ trợ cần để tìm lại yêu cầu của bạn.

On this page