Nhóm API đã đổi tên một trường từ customer_name thành customer_full_name. Họ đã công bố, cập nhật tài liệu, và mọi client do con người quản lý đều nhận được một pull request. Agent của bạn không nhận được gì, vì không ai coi nó là một client. Nó vẫn gửi trường cũ, API vẫn chấp nhận yêu cầu và bỏ qua khóa không xác định, và trong hai tuần, mọi bản ghi nó tạo ra đều có tên trống.
Agent là những người tiêu dùng API ít có khả năng nhận thấy thay đổi nhất và dễ che đậy chúng nhất. Một client của con người sẽ ném ra một ngoại lệ. Một agent đọc mã 200, quyết định cuộc gọi đã hoạt động và tiếp tục. Đôi khi nó ứng biến quanh vấn đề theo cách trông giống như thành công.
Hướng dẫn này giải thích tại sao agent đặc biệt dễ bị tổn thương trước sự trôi dạt của API, những thay đổi nào làm hỏng chúng mà sẽ không làm hỏng các client thông thường, cách ghim và phát hiện phiên bản, và cách bắt lỗi trôi dạt trong CI trước khi một lần chạy thực sự xảy ra. Bài viết của chúng tôi về tại sao các agent AI thất bại trong môi trường sản xuất bao gồm các chế độ lỗi; đây là lỗi đến từ bên ngoài codebase của bạn.
Apidog quan trọng ở đây vì việc phát hiện là một vấn đề về đặc tả. Nếu bạn có phiên bản trước của định nghĩa API và phiên bản hiện tại, sự khác biệt là cơ học.
Tại sao agent ít nhận thấy hơn client
Bốn đặc tính kết hợp một cách tồi tệ.
Dung thứ thầm lặng. Hầu hết các API bỏ qua các trường không xác định trong phần thân yêu cầu. Một trường được đổi tên có nghĩa là trường mới không có và trường cũ bị loại bỏ, với mã 200 trả về. Không có gì được báo lỗi.
Khả năng ứng biến. Khi một phản hồi thiếu một giá trị, một mô hình thường sẽ tiếp tục với một sự thay thế hợp lý thay vì dừng lại. Đó là hành vi hữu ích trong giao tiếp nhưng là hành vi nguy hiểm đối với một API.
Mô tả trong lời nhắc (prompt). Mô tả công cụ của agent mã hóa các giả định về API trong văn bản. Khi API thay đổi, các mô tả trở nên sai lệch một cách tinh tế, và các mô tả sai tạo ra các cuộc gọi sai mà không cần bất kỳ mã nào tham gia. Bài viết của chúng tôi về thiết kế lược đồ công cụ API bao gồm mức độ hành vi phụ thuộc vào văn bản đó.
Không có trình biên dịch. Một client có kiểu dữ liệu (typed client) sẽ bị lỗi trong quá trình xây dựng khi một trường biến mất. Hợp đồng của agent nằm trong các lược đồ JSON và văn xuôi, và không có gì kiểm tra nó cho đến khi một cuộc gọi thất bại, hoặc tệ hơn, cho đến khi một cuộc gọi lặng lẽ không thất bại.
Kết quả là: những thay đổi an toàn cho các client thông thường không phải lúc nào cũng an toàn cho agent, và bạn nên phân loại chúng riêng biệt.
Những thay đổi nào thực sự làm hỏng agent
Sự phân chia thêm vào-so với-phá vỡ thông thường vẫn áp dụng, và agent thêm một danh mục ở giữa.
- Thực sự gây lỗi, đối với tất cả mọi người. Xóa một endpoint, xóa một trường, đổi tên một trường, thay đổi kiểu dữ liệu, biến một tham số tùy chọn thành bắt buộc, thay đổi URL. Agent cũng bị lỗi ở đây, chỉ là một cách lặng lẽ hơn.
An toàn cho các client có kiểu dữ liệu, rủi ro cho agent:
- Một trường bắt buộc mới. Mọi trình gọi hiện có đều bị lỗi, nhưng một agent sẽ bị lỗi với một lỗi xác thực mà nó có thể cố gắng khắc phục bằng cách tự tạo ra một giá trị. Điều đó tệ hơn một lỗi cứng.
- Một giá trị enum mới. Các client thông thường bỏ qua những gì họ không xử lý. Một agent có thể suy luận về giá trị không quen thuộc và đưa ra một kết luận mà sản phẩm của bạn không bao giờ dự định.
- Một quy tắc xác thực được thắt chặt. Một trường từng chấp nhận bất kỳ chuỗi nào giờ đây yêu cầu một mẫu. Agent không có cách nào để học mẫu ngoại trừ bằng cách thất bại, đó là lý do tại sao quy tắc này thuộc về thông báo lỗi, như đã đề cập trong bài viết của chúng tôi về thiết kế thông báo lỗi API cho agent AI.
- Một giá trị mặc định đã thay đổi. Giá trị mặc định của phân trang giảm từ 100 xuống 20 và agent, vốn không bao giờ gửi giới hạn, giờ đây chỉ thấy một phần năm dữ liệu và báo cáo về nó như thể đã hoàn chỉnh.
- Tài liệu được viết lại. Hoàn toàn không thay đổi hành vi, nhưng nếu các công cụ của bạn được tạo từ đặc tả, như trong hướng dẫn của chúng tôi về chuyển đổi đặc tả OpenAPI thành công cụ agent, văn bản mô tả đã thay đổi và việc lựa chọn công cụ có thể thay đổi theo đó.
Cũng an toàn cho agent. Thêm một trường tùy chọn, thêm một endpoint, thêm một tham số tùy chọn với giá trị mặc định được giữ nguyên, nới lỏng xác thực.
Danh sách ở giữa đó là điều cần chú ý, bởi vì không có gì trong một đánh giá thay đổi tiêu chuẩn sẽ gắn cờ nó.
Luôn ghim phiên bản
Biện pháp phòng thủ đầu tiên là từ chối di chuyển một cách ngầm định.
Gửi một phiên bản rõ ràng trong mọi yêu cầu, bất kể cơ chế API cung cấp là gì: một phân đoạn đường dẫn, một tiêu đề, hoặc một ghim cấp tài khoản. Tài liệu quản lý phiên bản API của GitHub sử dụng tiêu đề ngày, và Stripe ghim một phiên bản cho mỗi tài khoản với một bước nâng cấp rõ ràng. Cả hai đều mang lại cho bạn cùng một đặc tính: không có gì thay đổi bên dưới bạn cho đến khi bạn quyết định.
DEFAULT_HEADERS = {
"X-API-Version": "2026-06-01",
"User-Agent": "billing-agent/1.4 (+https://example.com/agents)",
}
User-Agent cũng quan trọng như việc ghim phiên bản. Khi một nhà cung cấp API cần cảnh báo người gọi về việc ngừng sử dụng, họ sẽ xem xét lưu lượng truy cập. Một agent tự nhận dạng sẽ nhận được email; một agent gửi một chuỗi thư viện mặc định thì không.
Nếu bạn sở hữu API, hãy công bố một phiên bản và giữ nó. Hướng dẫn của chúng tôi về chiến lược quản lý phiên bản API tốt nhất bao gồm các tùy chọn, và quản lý phiên bản API trong Apidog bao gồm việc duy trì nhiều phiên bản hoạt động cùng một lúc.
Đối với các API bên thứ ba hoàn toàn không có quản lý phiên bản, hãy ghim những gì bạn có thể: ghi lại hình dạng phản hồi bạn đã xây dựng và kiểm tra nó, đây là phần tiếp theo.
Phát hiện sự trôi dạt trước khi một lần chạy thực hiện
Việc ghim mua thời gian. Nó không ngăn chặn việc nâng cấp cuối cùng, và nó không làm gì cho các API thay đổi mà không có quản lý phiên bản. Vì vậy, hãy phát hiện.
- Đối chiếu đặc tả theo lịch trình. Nếu nhà cung cấp công bố một tài liệu OpenAPI, hãy lấy nó hàng ngày và so sánh với bản sao bạn đã tạo công cụ từ đó. Các trường bị xóa, các kiểu thay đổi, các yêu cầu được thêm vào, các enum được mở rộng, các mô tả được chỉnh sửa. Trong Apidog, bạn có thể giữ định nghĩa đã nhập trong dự án và xem những gì đã thay đổi giữa các phiên bản, điều này biến "có bất kỳ thay đổi nào không" thành một báo cáo chứ không phải là một cuộc điều tra.
- Kiểm tra hợp đồng các endpoint bạn gọi. Đối với mỗi công cụ mà agent có, hãy gửi một yêu cầu được biết là tốt và xác nhận hình dạng phản hồi: các trường bắt buộc có mặt, các kiểu chính xác, các giá trị enum nằm trong tập hợp bạn mong đợi. Điều này bắt được sự trôi dạt trong các API không công bố đặc tả nào cả, đó là phần lớn trong số chúng. Hướng dẫn kiểm tra hợp đồng API của chúng tôi bao gồm mẫu này, và kiểm tra hợp đồng hai chiều bao gồm việc chạy nó từ cả hai phía.
- Xác nhận hình dạng trong thời gian chạy. Xác thực các phản hồi trong trình bao bọc công cụ (tool wrapper) so với lược đồ bạn mong đợi, và ghi lại cảnh báo khi có điều gì đó không mong đợi xuất hiện. Đây là dòng cuối cùng, và nó là dòng bắt được sự thay đổi mà không ai thông báo.
def check_shape(tool_name, payload, expected):
missing = [f for f in expected["required"] if f not in payload]
extra = [f for f in payload if f not in expected["properties"]]
if missing:
log.error("api_lệch_phiên_bản", tool=tool_name, missing=missing)
raise ApiDriftError(f"{tool_name}: thiếu trường {missing}")
if extra:
log.warning("api_trường_mới", tool=tool_name, fields=extra)
return payload
Lỗi nếu thiếu, cảnh báo nếu thừa. Một trường bắt buộc bị thiếu có nghĩa là agent sắp làm việc với dữ liệu không đầy đủ, đó là lỗi đáng dừng lại. Các trường mới thường là bổ sung và đáng được biết mà không làm gián đoạn một lần chạy. Định tuyến cả hai vào bản ghi dấu vết được mô tả trong bài viết của chúng tôi về truy vết các cuộc gọi công cụ của agent AI.
- Quan sát hành vi, không chỉ lược đồ. Một số sự trôi dạt không thể nhìn thấy bằng kiểm tra hình dạng: một giá trị mặc định đã thay đổi, một giới hạn tốc độ đã thắt chặt, một phản hồi trở nên chậm hơn. Theo dõi số cuộc gọi cho mỗi tác vụ hoàn thành, tỷ lệ thử lại cho mỗi endpoint, và kích thước phản hồi trung bình cho mỗi công cụ. Một thay đổi đáng kể trong bất kỳ yếu tố nào trong số đó thường có nghĩa là có điều gì đó đã thay đổi ở upstream.
Nâng cấp mà không làm hỏng agent
Khi bạn chuyển sang một phiên bản mới, hãy coi đó là một thay đổi đối với agent, bởi vì nó là vậy.
Tạo lại các công cụ thay vì chỉnh sửa thủ công chúng, để các mô tả và lược đồ di chuyển cùng nhau. Sau đó đọc sự khác biệt của các định nghĩa công cụ được tạo. Sự khác biệt đó là phạm vi ảnh hưởng thực sự, và nó thường nhỏ hơn hoặc lớn hơn những gì nhật ký thay đổi của API ngụ ý.
Chạy agent với một bản giả lập của phiên bản mới trước khi trỏ nó đến bất kỳ thứ gì trực tiếp. Đây là bước có giá trị cao nhất và là bước thường bị bỏ qua nhất: một bản giả lập được xây dựng từ đặc tả mới cho phép bạn chạy toàn bộ bộ tác vụ của mình với các hình dạng mới mà không có rủi ro, theo bài viết của chúng tôi về chạy agent với bản giả lập thay vì môi trường sản xuất.
Chạy lại bộ chọn lọc. Các thay đổi trong mô tả làm thay đổi công cụ mà mô hình chọn, và sự hồi quy đó không thể nhìn thấy bằng sự khác biệt lược đồ. Xác nhận lựa chọn công cụ cho một tập hợp cố định các lời nhắc, như trong hướng dẫn của chúng tôi về kiểm thử agent AI không xác định.
Triển khai đằng sau một cờ, trên một phần lưu lượng truy cập, với phiên bản cũ vẫn được ghim và sẵn sàng. Theo dõi bốn con số tương tự trong một ngày. Các sự hồi quy của agent xuất hiện dưới dạng nhiều cuộc gọi hơn cho mỗi tác vụ và nhiều lần thử lại hơn rất lâu trước khi bất kỳ ai gửi khiếu nại.
Ba trường hợp trôi dạt đã xảy ra trong môi trường sản xuất
- Trường bị đổi tên. Câu chuyện mở đầu. Mã
200trên mọi cuộc gọi, tên trống trên mọi bản ghi, được phát hiện hai tuần sau đó bởi một người đọc báo cáo. Một kiểm tra hình dạng trong thời gian chạy trên phản hồi lẽ ra đã phát hiện ra nó ở cuộc gọi đầu tiên, vì trường mà agent mong đợi đọc lại đã biến mất. - Mặc định phân trang bị thắt chặt. Một nhà cung cấp đã giảm kích thước trang mặc định từ 100 xuống 20. Agent không bao giờ gửi
limit, vì vậy nó bắt đầu thấy 20 bản ghi và tóm tắt chúng như là tập hợp hoàn chỉnh. Không có lỗi nào xảy ra. Các bản tóm tắt đơn giản là sai, theo một cách đọc rất tự tin. Cách khắc phục chỉ là một dòng, gửi mộtlimitrõ ràng, và bài học rộng hơn là: dựa vào các giá trị mặc định và bạn có một phụ thuộc không được khai báo vào quyết định của người khác. - Giá trị enum mới. Một API thanh toán đã thêm
status: "disputed". Các client có kiểu dữ liệu bỏ qua nó. Agent suy luận về nó, quyết định một khoản phí bị tranh chấp được tính là một khoản hoàn tiền, và báo cáo các sổ sách đã được đối chiếu không chính xác. Xác thực enum rõ ràng lẽ ra đã báo lỗi về giá trị không quen thuộc thay vì để mô hình diễn giải nó.
Mô hình: mỗi thay đổi đều được công bố, mỗi thay đổi đều là bổ sung hoặc nhỏ theo phân loại của nhà cung cấp, và mỗi thay đổi đều gây lỗi cho một agent. Khoảng cách đó là điều cần phải thiết kế để xử lý.
Coi các cảnh báo ngừng sử dụng là một hạng mục công việc
Các nhà cung cấp thường cảnh báo bạn. Cảnh báo đến trong một nhật ký thay đổi, một email, hoặc một tiêu đề Deprecation trên phản hồi, và dễ dàng để không có thông báo nào trong số đó đến được người duy trì agent.
Kết nối chúng vào hàng đợi công việc thông thường của bạn. Tiêu đề Deprecation và Tiêu đề Sunset đều được tiêu chuẩn hóa, vì vậy một kiểm tra chung có thể hoạt động trên các nhà cung cấp. Ghi lại chúng khi chúng xuất hiện, và cảnh báo ngay từ lần nhìn thấy đầu tiên thay vì lần thứ một nghìn. Một tiêu đề xuất hiện trên 3 phần trăm cuộc gọi hôm nay sẽ là một sự cố ngừng hoạt động hoàn toàn vào ngày ngừng hỗ trợ.
Cũng nên giữ một danh mục: agent nào, nhà cung cấp nào, phiên bản nào, endpoint nào và ai sở hữu nó. Mười dòng trong một tệp là đủ. Khi một thông báo ngừng hỗ trợ đến, câu hỏi "điều này có ảnh hưởng đến chúng ta không" nên mất một phút, chứ không phải cả buổi chiều để tìm kiếm.
Sự trôi dạt là công việc, vì vậy hãy giao nó cho một người chủ
Việc phát hiện tạo ra một hàng đợi: sự khác biệt đặc tả, một kiểm tra hợp đồng thất bại, một tiêu đề cảnh báo ngừng sử dụng lần đầu tiên được nhìn thấy. Mỗi thứ là một phần công việc nhỏ với một thời hạn kèm theo, và chế độ lỗi là nó nằm trong một kênh mà không ai sở hữu cho đến khi ngày ngừng hỗ trợ đến.
Đặt chúng ở nơi nhóm của bạn đã theo dõi công việc. Nếu agent của bạn chạy như các môi trường chạy mã (coding runtimes) chứ không phải là một dịch vụ bạn đã triển khai, nền tảng quản lý chúng có thể đóng vòng lặp: Sharkly gán một Tác vụ cho một Agent hoặc một Crew và giữ mục tiêu, dấu vết thực thi và đánh giá ở một nơi, vì vậy "API thanh toán đã ngừng hỗ trợ endpoint này" trở thành một tác vụ được giao với một kết quả chứ không phải là một tin nhắn trong một chủ đề. Bất kể bạn sử dụng gì, quy tắc vẫn giống nhau. Một cảnh báo trôi dạt không có chủ sở hữu là một sự ngừng hỗ trợ bạn sẽ gặp lại vào ngày nó gây lỗi.

Danh sách kiểm tra
- Mọi yêu cầu đều gửi một phiên bản API rõ ràng và một
User-Agentnhận dạng. - Các tài liệu đặc tả của bên thứ ba được lấy và đối chiếu theo lịch trình.
- Mỗi công cụ mà agent có thể gọi đều có một kiểm tra hợp đồng xác nhận hình dạng phản hồi.
- Các trình bao bọc công cụ xác thực phản hồi trong thời gian chạy: lỗi nếu thiếu, cảnh báo nếu mới.
- Các chỉ số hành vi được theo dõi cho mỗi endpoint để sự trôi dạt thầm lặng được bộc lộ.
- Việc nâng cấp phiên bản tạo lại công cụ thay vì chỉnh sửa thủ công chúng.
- Bộ tác vụ và bộ chọn lọc đều chạy thử với bản giả lập của phiên bản mới trước tiên.
- Việc triển khai được gắn cờ và có thể đảo ngược, với phiên bản trước vẫn được ghim.
Nhóm API sẽ tiếp tục phát hành các thay đổi, và điều đó không sao cả. Điều bạn cần là agent của bạn phải là một client nhận biết được, điều này cần một phiên bản được ghim, một kiểm tra hợp đồng và một kiểm tra hình dạng trong thời gian chạy. Tải xuống Apidog để đối chiếu đặc tả và giả lập phiên bản tiếp theo trước khi nó đi vào hoạt động thực tế.
Câu hỏi thường gặp
- Tôi nên kiểm tra các thay đổi của đặc tả bên thứ ba bao lâu một lần? Hàng ngày là đủ cho hầu hết, và rẻ để tự động hóa. Đối với các API không có đặc tả được công bố, hãy dựa vào các kiểm tra hợp đồng chạy trong CI thay vào đó, vì chúng phát hiện cùng một sự trôi dạt từ bên ngoài.
- Tôi có nên luôn ghim vào phiên bản hoạt động cũ nhất không? Không. Ghim để việc nâng cấp được thực hiện có chủ ý, sau đó nâng cấp theo lịch trình. Việc giữ một phiên bản cũ cho đến khi nó bị gỡ bỏ sẽ biến một thay đổi đã lên kế hoạch thành một trường hợp khẩn cấp.
- Điều gì sẽ xảy ra nếu agent hoạt động tốt sau một thay đổi? Hãy xác minh thay vì giả định. Các kết quả nguy hiểm là những cái vẫn trả về
200, chẳng hạn như một trường được đổi tên bị loại bỏ một cách âm thầm. Một xác nhận hình dạng cho bạn biết điều mà một lần chạy xanh (green run) không thể. - Tôi có cần quản lý phiên bản API của mình khác đi cho agent không? Không phải khác đi, mà là chặt chẽ hơn. Coi các trường bắt buộc mới, các giá trị enum mới, và các giá trị mặc định đã thay đổi là những thay đổi gây lỗi cho người tiêu dùng agent ngay cả khi chúng là bổ sung đối với các client có kiểu dữ liệu, và công bố chúng theo cùng một cách.
- Làm sao tôi biết agent nào gọi endpoint nào? Từ các dấu vết của bạn. Tên công cụ cộng với endpoint cho mỗi lần chạy sẽ cung cấp cho bạn bản đồ phụ thuộc, và nó cho bạn biết chính xác ai bị ảnh hưởng bởi một sự ngừng hỗ trợ. Bài viết của chúng tôi về truy vết các cuộc gọi công cụ của agent AI bao gồm hình dạng bản ghi.
- Agent có thể tự thích ứng với một API đã thay đổi không? Đôi khi, và bạn không nên dựa vào điều đó. Một mô hình ứng biến quanh một trường bị thiếu sẽ tạo ra kết quả hợp lý mà không có tín hiệu nào cho thấy có điều gì đó không ổn. Thay vào đó, hãy báo lỗi lớn và sửa công cụ.
