Bỏ qua để vào nội dung chính
Aider Exit Code 0 Khi API Fail: CI Của Bạn Đang Báo Xanh Sai

Aider Exit Code 0 Khi API Fail: CI Của Bạn Đang Báo Xanh Sai

Bởi Charlotte Adams
20 thg 8, 20264 phút đọc

Aider headless trả exit code 0 dù mọi API call đều fail, khiến CI báo pass. Issue #5552: cơ chế lỗi, lý do CI không thấy và ba lớp chặn dựng ngay hôm nay.

Pipeline nightly gọi Aider ở chế độ headless, job xanh, không có diff nào được commit. Bạn tưởng agent chạy xong và không có gì để sửa — thực tế mọi API call đều fail và không lần nào chạm tới model. Dưới đây là cách nhận ra nó và ba lớp chặn dựng được ngay hôm nay.

Bug: exit code 0 sau khi mọi retry đã cạn

Theo bug report được phân tích trên Dev.to, một lần chạy Aider headless "never reaches the model — every API call fails, every retry is exhausted — still exits with status code 0. The same code a successful run reports". Issue được gán số #5552 trong repo Aider-AI/aider, do chính người gặp lỗi (noelsaw1) mở ngày 11/08/2026, kèm bước tái hiện chính xác: trỏ AIDER_OPENAI_API_BASE tới một host không hợp lệ hoặc không tới được, rồi gọi aider --message "test".

Cơ chế rất đơn giản: Aider bắt exception connection của litellm ở dưới, retry tới hạn cấu hình, ghi log lỗi ra output của chính nó — rồi exit sạch với code 0. Không có edit nào được tạo, không API call nào thành công, process vẫn báo success cho thứ đã gọi nó.

Vì sao CI không thể tự phát hiện

Exit code là contract giữa CLI tool và mọi thứ orchestrate nó: CI job, cron wrapper, agent pipeline. Bug này phá contract đó âm thầm — từ phía caller, một connection failure toàn diện không phân biệt được với một no-op run sạch sẽ. Grep log cũng vô ích nếu bước kế tiếp chỉ gate trên $?.

Đáng lo hơn: bản phân tích ghi nhận đây là báo cáo thứ ba trong cùng một tuần về việc một code path của Aider ăn mất failure signal — trước đó là một diff hợp lệ bị bỏ im lặng dưới nhãn "no tracked changes" (#5486) và một warning về partial-hunk application không bao giờ fire (#5573). Ba function khác nhau, cùng một hình dạng lỗi. Nguồn xếp incident này ở mức severity 4.8 / medium (mã STUPID-2026-0081).

Ba lớp chặn dựng được trong hôm nay

Đây là phân tích kỹ thuật, không phải fix chính thức: nguồn nói rõ chưa có maintainer response, nên chưa có timeline fix và chưa xác nhận đây là retry behavior có chủ đích hay một oversight.

  1. Đừng tin exit code — verify side effect. Sau mỗi lần chạy agent, kiểm tra bằng chứng công việc thay vì status code: repo có dirty không, có commit mới không. Ví dụ minh hoạ: git diff --quiet && echo "NO_CHANGE" rồi tự quyết định NO_CHANGE là pass hay fail theo ngữ cảnh job.
  2. Preflight fail-fast. Ping model endpoint bằng request rẻ nhất trước khi gọi agent; endpoint chết thì kill job ngay.
  3. Assert trên log agent. Redirect output ra file và fail job khi khớp pattern connection/retry-exhausted — thô, nhưng là lớp duy nhất thấy được thứ exit code đã che.

Nếu bạn đang chạy qua gateway

Vì Aider gọi provider qua litellm, nhiều nhóm đặt gateway ở giữa để tập trung retry và fallback. Bài giới thiệu LiteLLM mô tả Proxy là "a standalone server (usually Docker) that sits between your apps and the providers", xử lý routing, virtual keys, spend tracking, budgets, rate limits và fallbacks ở một chỗ; bảng so sánh trong bài ghi load balancing, fallbacks và retries đều có ở bản open source (MIT). Tác giả cũng nêu mức Enterprise "from around $250/month" cho SSO, audit trails và compliance — số do tác giả đưa ra, nên tự kiểm tra trước khi lên slide budget.

Lưu ý fallback ở tầng gateway giảm xác suất mọi provider cùng chết, nhưng không sửa bug exit code: khi mọi đường đều fail, Aider vẫn trả về 0.

Theo dõi gì tiếp

Issue #5552 còn open, chưa được maintainer xác nhận. Bất kỳ invocation Aider headless nào gate bước kế tiếp bằng exit code đều đang chịu rủi ro này — dựng lớp verify side-effect trước, rồi theo dõi #5552, #5486 và #5573 xem có được xử lý cùng lúc không.

Không spam, hủy đăng ký bất kỳ lúc nào.

Bài viết liên quan