Nguyên tắc: ước lượng trước khi gọi để chặn, ghi nhận sau khi gọi để tính tiền.
Ghi nhận (sau mỗi lời gọi). Response của provider trả về số token thật (input_tokens, output_tokens, và phần đọc từ cache nếu có). Lưu một dòng cho mỗi lời gọi: user_id, feature, model, số token từng loại, chi phí quy đổi, request_id. Không nhân số token với đơn giá ngay trong code rải rác — để giá trong một bảng cấu hình theo model, vì đơn giá đầu vào, đầu ra và phần cache khác nhau.
Chặn (trước mỗi lời gọi). Cộng dồn theo cửa sổ thời gian (ngày/tháng) trong Redis, so với hạn mức của gói người dùng. Vì chưa biết độ dài đầu ra, ước lượng bằng token đầu vào + max_tokens để chặn theo trường hợp xấu nhất, rồi điều chỉnh lại theo số thật sau khi chạy xong.
Ba mức kiểm soát nên có cùng lúc:
- Theo request: đặt max_tokens hợp lý và chặn độ dài input. Đây là chốt chặn cứng cho chi phí một lời gọi.
- Theo người dùng: hạn mức ngày/tháng theo gói. Khi chạm ngưỡng thì báo rõ và mời nâng gói, không im lặng trả lỗi.
- Theo hệ thống: ngưỡng cảnh báo tổng chi tiêu, có công tắc tắt tính năng khi vượt xa dự toán.
Giảm chi phí hiệu quả nhất là giảm token đầu vào: cắt bớt lịch sử hội thoại gửi lên, giảm số chunk đưa vào prompt, và đặt phần cố định (system prompt, hướng dẫn, tài liệu dùng lại) ở đầu prompt để nhà cung cấp đọc được từ cache — phần cache hit thường rẻ hơn nhiều lần so với token đầu vào thường.