Nguyên tắc: trả lỗi về cho model như một tool result bình thường, kèm thông tin đủ để nó tự sửa.
Không ném exception ra ngoài vòng lặp, cũng không nuốt lỗi rồi trả chuỗi rỗng.
try:
result = tools[name](**args)
except ValidationError as e:
result = {
"error": "invalid_arguments",
"detail": str(e),
"hint": "date must be YYYY-MM-DD", # actionable, not a stack trace
}
messages.append({"role": "tool", "tool_call_id": call_id, "content": json.dumps(result)})Những gì nên có trong thông báo lỗi: loại lỗi, trường nào sai, định dạng đúng là gì. Những gì không nên: stack trace, SQL gốc, chuỗi kết nối — vừa tốn token vừa lộ nội bộ.
Giảm lỗi ngay từ đầu bằng schema:
- Dùng enum thay vì chuỗi tự do cho trường có tập giá trị hữu hạn.
- Đánh dấu rõ trường bắt buộc, mô tả định dạng ngay trong description của tham số.
- Validate bằng schema trước khi chạy, thay vì để hàm nghiệp vụ tự vỡ.
Quan trọng nhất: đặt trần số lần thử lại (2-3 lần cho cùng một tool). Nếu vẫn lỗi, dừng vòng lặp và trả lời người dùng rằng thao tác không thực hiện được — để model thử vô hạn là cách tiêu hết ngân sách token mà không tiến triển.