0

Thiết kế failover cho LLM gateway: giới hạn 3 lần retry và chấm điểm "sức khỏe" upstream theo mã lỗi

Minh bạch trước: mình làm trong team APIGOTO, nên bài này nói về hệ thống của chính bọn mình. APIGOTO là dịch vụ độc lập, không liên kết với OpenAI, Anthropic hay Google. Mục tiêu của bài là chia sẻ các quyết định thiết kế, bạn có thể áp dụng cho proxy của riêng mình.

1. Bối cảnh

Một model có thể được phục vụ bởi nhiều upstream (nhà cung cấp, credential khác nhau). Client chỉ thấy một endpoint tương thích OpenAI:

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.apigoto.com/v1",
    api_key=os.environ["APIGOTO_API_KEY"],
)
resp = client.chat.completions.create(
    model="claude-sonnet-5-5",  # kiểm tra ID model chính xác ở trang bảng giá
    messages=[{"role": "user", "content": "ping"}],
    timeout=60,
)
print(resp.choices[0].message.content, resp.usage)

Gateway cũng nhận định dạng Anthropic Messages và OpenAI Responses.

2. Thứ tự định tuyến

Ứng viên được sắp xếp theo: đúng model → đúng protocol → priority đã liên kết → priority của nhà cung cấp → health score. Protocol đứng thứ hai vì khi chuyển đổi định dạng, tool calling là phần dễ "lệch" nhất.

3. Tối đa 3 lần retry

Khi upstream lỗi, gateway thử credential khác, nhưng tối đa 3 lần cho mỗi request. Lý do:

  • mỗi lần retry cộng thêm độ trễ;
  • 3 lần lỗi liên tiếp thường là sự cố diện rộng của model đó;
  • trả lỗi sớm giúp ứng dụng tự chuyển sang model khác.

Phía client vẫn nên đặt timeout riêng.

4. Health score có trọng số

Mỗi giờ, mỗi upstream được tính điểm theo lỗi:

Mã Trọng số
502 1.0
403 0.8
lỗi khác 0.6
429 0.5

429 là quá tải tạm thời chứ không phải hỏng. Phiên bản đầu tính 429 ngang 502 và loại nhầm các upstream vẫn khỏe. Điểm được công khai trên trang trạng thái.

5. Kiểm tra tính nhất quán của model

So sánh model được yêu cầu với trường model trả về. Đây là bằng chứng yếu vì upstream có thể ghi bất cứ gì vào trường này.

6. BYOK và log từng request

Có thể dùng key riêng của nhà cung cấp mà không mất phí nền tảng. Mỗi request ghi lại model, số token, cache hit, độ trễ và chi tiết lỗi.

7. Hạn chế

Thêm một hop mạng; không phải tính năng riêng nào của nhà cung cấp cũng ánh xạ 1:1 sang định dạng OpenAI; prompt đi qua một lớp trung gian, nên hãy đọc điều khoản và chính sách quyền riêng tư.

Câu hỏi cho mọi người: nếu không tin được trường model, các bạn sẽ "fingerprint" model thực sự trả lời bằng cách nào mà chi phí vẫn chấp nhận được?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí