arc/docs/AI_CREDIT_CHECK_IMPLEMENTATION.md
2026-04-14 19:34:55 +03:30

401 lines
12 KiB
Markdown
Executable file
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# پیاده‌سازی چک اعتبار و پکیج فعال برای هوش مصنوعی
## 📋 خلاصه
این سند توضیح می‌دهد که چگونه سیستم چک اعتبار پیشگیرانه و نمایش پیام‌های خطای تفصیلی برای استفاده از هوش مصنوعی پیاده‌سازی شده است.
---
## ✅ تغییرات انجام شده
### **۱. بکند (Backend)**
#### **الف) افزودن متد `check_availability` به `AIService`**
**فایل**: `hesabixAPI/app/services/ai/ai_service.py`
متدی که **قبل از ارسال پیام** امکان استفاده از AI را چک می‌کند:
```python
def check_availability(self, estimated_tokens: int = 1000) -> Dict[str, Any]:
"""
بررسی اینکه آیا کاربر می‌تواند از AI استفاده کند
(بدون ارسال واقعی پیام - برای چک پیشگیرانه)
Returns:
{
"can_use": bool,
"reason": str | None, # NO_ACTIVE_SUBSCRIPTION, QUOTA_EXCEEDED, INSUFFICIENT_FUNDS
"details": {
"subscription": {...},
"wallet": {...},
"suggestions": [...]
}
}
"""
```
**ویژگی‌ها**:
- ✅ چک اشتراک فعال
- ✅ چک سهمیه رایگان/اشتراک
- ✅ چک موجودی کیف پول (برای پلن‌های pay_as_go و hybrid)
- ✅ محاسبه درصد استفاده و هشدار در 80%
- ✅ تخمین هزینه بر اساس تعداد توکن
- ✅ پیشنهادات عملی برای حل مشکل
#### **ب) افزودن endpoint جدید**
**فایل**: `hesabixAPI/adapters/api/v1/ai/chat.py`
```
POST /api/v1/ai/chat/check-availability
```
**Request Body**:
```json
{
"business_id": 123,
"estimated_tokens": 1000
}
```
**Response**:
```json
{
"success": true,
"data": {
"can_use": true/false,
"reason": "NO_ACTIVE_SUBSCRIPTION" | "QUOTA_EXCEEDED" | "INSUFFICIENT_FUNDS" | null,
"details": {
"subscription": {
"plan_name": "پلن رایگان",
"plan_type": "free",
"tokens_used": 2500,
"tokens_limit": 5000,
"tokens_remaining": 2500,
"usage_percentage": 50.0
},
"wallet": {
"balance": 50000,
"estimated_cost": 1500,
"sufficient": true
},
"suggestions": [
"⚠️ تنها ۲٬۵۰۰ توکن رایگان باقی مانده است",
"پیشنهاد می‌کنیم به پلن بالاتر ارتقا دهید"
]
}
}
}
```
#### **ج) بهبود پیام‌های خطا در `check_quota_and_charge`**
خطاها حالا شامل اطلاعات تفصیلی هستند:
**قبل**:
```python
raise ApiError("QUOTA_EXCEEDED", "سهمیه تمام شده است", http_status=400)
```
**بعد**:
```python
raise ApiError(
"QUOTA_EXCEEDED",
f"سهمیه رایگان تمام شده است. باقیمانده: {tokens_remaining:,} توکن",
http_status=400,
extra_data={
"tokens_used": 2500,
"tokens_limit": 5000,
"tokens_remaining": 2500,
"tokens_required": 1000,
"suggestion": "برای استفاده بیشتر، به پلن پولی ارتقا دهید"
}
)
```
#### **د) پیاده‌سازی در تلگرام**
**فایل**: `hesabixAPI/app/services/telegram_ai_chat_service.py`
- ✅ چک اعتبار قبل از ارسال پیام
- ✅ نمایش پیام‌های فارسی و زیبا در تلگرام
- ✅ مدیریت خطاها در catch block
**نمونه پیام خطا در تلگرام**:
```
⚠️ سهمیه شما تمام شده است
استفاده شده: 5,000
سقف: 5,000
💡 برای ادامه:
• ارتقا به پلن بالاتر از داخل برنامه
• منتظر تمدید ماهانه بمانید
```
#### **ه) پیاده‌سازی در تیکت‌های پشتیبانی**
**فایل**: `hesabixAPI/adapters/api/v1/support/ai_tickets.py`
- ✅ چک اعتبار قبل از پیشنهاد پاسخ AI
- ✅ پیام‌های خطای مناسب برای اپراتورها
---
### **۲. فرانت (Frontend)**
#### **الف) افزودن متد `checkAvailability` به `AIService`**
**فایل**: `hesabixUI/hesabix_ui/lib/services/ai_service.dart`
```dart
Future<Map<String, dynamic>> checkAvailability({
int? businessId,
int estimatedTokens = 1000,
}) async {
final res = await _api.post<Map<String, dynamic>>(
'/api/v1/ai/chat/check-availability',
data: {
if (businessId != null) 'business_id': businessId,
'estimated_tokens': estimatedTokens,
},
);
final body = res.data as Map<String, dynamic>;
return body['data'] as Map<String, dynamic>;
}
```
#### **ب) پیاده‌سازی چک پیشگیرانه در `AIChatDialog`**
**فایل**: `hesabixUI/hesabix_ui/lib/widgets/ai/ai_chat_dialog.dart`
**ویژگی‌های اضافه شده**:
1. **چک اعتبار قبل از ارسال پیام**:
```dart
Future<void> _sendMessage() async {
// چک اعتبار قبل از ارسال
try {
final availability = await _aiService.checkAvailability(
businessId: widget.businessId,
estimatedTokens: content.length * 2,
);
if (!(availability['can_use'] as bool? ?? false)) {
_showDetailedError(availability);
return;
}
} catch (e) {
// در صورت خطا، اجازه ادامه بده
}
// ادامه ارسال...
}
```
2. **نمایش دیالوگ خطای تفصیلی**:
```dart
void _showDetailedError(Map<String, dynamic> errorData) {
// نمایش دیالوگ با جزئیات خطا و دکمه‌های عملیاتی:
// - دکمه ارتقا پلن
// - دکمه شارژ کیف پول
// - پیام‌های راهنما
}
```
3. **نمایش هشدار کم بودن اعتبار**:
```dart
Widget _buildCreditWarning() {
// نمایش warning banner در بالای چت
// زمانی که usage >= 80%
}
```
**نمونه نمایش**:
```
⚠️ اعتبار شما رو به اتمام است
2,500 توکن باقی مانده
[ارتقا پلن]
```
4. **چک خودکار بعد از انتخاب session**:
```dart
Future<void> _selectSession(AIChatSession session) async {
// ...
_checkAvailability(); // چک خودکار
}
```
---
## 🎯 سناریوهای پوشش داده شده
### **سناریو ۱: کاربر بدون اشتراک**
**قبل**:
- کاربر پیام می‌فرستد
- AI پاسخ تولید می‌کند
- خطای "اشتراک فعالی وجود ندارد" ❌
**بعد**:
- کاربر پیام می‌نویسد
- قبل از ارسال، چک می‌شود
- دیالوگ زیبا با دکمه "مشاهده پلن‌ها" نمایش داده می‌شود ✅
---
### **سناریو ۲: سهمیه تمام شده (پلن رایگان)**
**قبل**:
- کاربر پیام می‌فرستد
- AI پاسخ تولید می‌کند
- خطای "سهمیه تمام شده است" ❌
**بعد**:
- کاربر پیام می‌نویسد
- چک می‌شود: "شما 5,000 از 5,000 توکن خود را استفاده کرده‌اید"
- دکمه "ارتقا پلن" نمایش داده می‌شود ✅
---
### **سناریو ۳: موجودی کیف پول ناکافی**
**قبل**:
- کاربر پیام می‌فرستد
- AI پاسخ تولید می‌کند
- خطای "موجودی کافی نیست" ❌
**بعد**:
- چک می‌شود: موجودی 1,000 ریال، هزینه تخمینی 2,500 ریال
- دکمه "شارژ کیف پول" نمایش داده می‌شود ✅
---
### **سناریو ۴: هشدار کم بودن اعتبار**
**زمانی که 80% سهمیه استفاده شده**:
- Banner هشدار در بالای چت نمایش داده می‌شود
- "⚠️ اعتبار شما رو به اتمام است"
- دکمه "ارتقا پلن" برای راحتی کاربر
---
### **سناریو ۵: تلگرام**
**قبل**:
- کاربر در تلگرام پیام می‌فرستد
- خطای ساده: "خطا در پردازش پیام" ❌
**بعد**:
```
💰 موجودی کیف پول ناکافی
موجودی فعلی: 1,000 ریال
هزینه تخمینی: 2,500 ریال
لطفاً از داخل برنامه، کیف پول خود را شارژ کنید.
[🔙 بازگشت]
```
---
## 📊 کدهای خطا
| کد | معنی | نمایش به کاربر |
|----|------|----------------|
| `NO_ACTIVE_SUBSCRIPTION` | اشتراک فعال ندارد | "نیاز به اشتراک" + دکمه مشاهده پلن‌ها |
| `SUBSCRIPTION_INACTIVE` | اشتراک منقضی شده | "اشتراک منقضی شده" + تاریخ انقضا |
| `QUOTA_EXCEEDED` | سهمیه تمام شده | نمایش استفاده/سقف + دکمه ارتقا |
| `INSUFFICIENT_FUNDS` | موجودی کیف پول کم | نمایش موجودی/هزینه + دکمه شارژ |
| `AI_NOT_CONFIGURED` | تنظیمات AI فعال نیست | پیام تماس با مدیر سیستم |
---
## 🧪 تست
### **چک لیست تست**
#### **بکند**:
- [ ] تست endpoint `/api/v1/ai/chat/check-availability`
- [ ] با business_id
- [ ] بدون business_id (استفاده از current business)
- [ ] با estimated_tokens مختلف
- [ ] تست با اشتراک رایگان (free)
- [ ] تست با اشتراک ماهانه (subscription)
- [ ] تست با پلن pay_as_go
- [ ] تست بدون اشتراک
- [ ] تست با سهمیه تمام شده
- [ ] تست با موجودی کیف پول ناکافی
#### **فرانت**:
- [ ] تست دیالوگ چت
- [ ] چک اعتبار قبل از ارسال
- [ ] نمایش دیالوگ خطای تفصیلی
- [ ] نمایش warning banner
- [ ] تست با سناریوهای مختلف خطا
- [ ] تست دکمه‌های عملیاتی (ارتقا پلن، شارژ کیف پول)
#### **تلگرام**:
- [ ] تست ارسال پیام در تلگرام
- [ ] با اشتراک فعال
- [ ] بدون اشتراک
- [ ] با سهمیه تمام شده
- [ ] با موجودی ناکافی
- [ ] تست نمایش پیام‌های فارسی و زیبا
#### **تیکت‌های پشتیبانی**:
- [ ] تست پیشنهاد پاسخ AI
- [ ] تست پاسخ خودکار AI
- [ ] تست با خطاهای مختلف اعتبار
---
## 📝 نکات مهم
### **۱. چک دو مرحله‌ای**
سیستم دارای دو مرحله چک است:
1. **چک پیشگیرانه** (قبل از ارسال): با متد `check_availability`
2. **چک نهایی** (بعد از دریافت پاسخ): با متد `check_quota_and_charge`
این دو مرحله تضمین می‌کند که:
- کاربر قبل از ارسال متوجه مشکل می‌شود (UX بهتر)
- اگر تخمین اشتباه بود، بعد از دریافت پاسخ هم چک می‌شود (امنیت)
### **۲. تخمین توکن**
برای چک پیشگیرانه، تخمین زده می‌شود:
```
estimated_tokens = message_length * 2
```
این تخمین تقریبی است و ممکن است با مقدار واقعی متفاوت باشد.
### **۳. Graceful Degradation**
اگر چک اعتبار با خطا مواجه شود، سیستم به کاربر اجازه ادامه می‌دهد تا تجربه کاربری مختل نشود.
### **۴. پیام‌های کاربرپسند**
تمام پیام‌ها:
- ✅ به فارسی
- ✅ با اعداد فرمت‌شده (1,000 به جای 1000)
- ✅ با ایموجی برای بهتر دیده شدن
- ✅ با پیشنهادات عملی
---
## 🔮 پیشنهادات آینده
1. **پیش‌بینی دقیق‌تر هزینه**: استفاده از ML برای تخمین دقیق‌تر توکن‌ها
2. **خرید خودکار اعتبار**: دکمه خرید مستقیم در دیالوگ خطا
3. **نمایش تاریخ تمدید**: برای پلن‌های اشتراکی
4. **آمار مصرف**: نمودار استفاده از AI در پروفایل کاربر
5. **پیشنهاد پلن مناسب**: بر اساس الگوی مصرف کاربر
---
## 📚 مستندات مرتبط
- [AI Chat Implementation](./AI_CHAT_IMPLEMENTATION.md)
- [Telegram AI Chat Scenario](./TELEGRAM_AI_CHAT_SCENARIO.md)
- [Wallet Service Documentation](./WALLET_SERVICE.md)
---
**تاریخ**: ۴ دسامبر ۲۰۲۵
**نسخه**: 1.0