Opera8 commited on
Commit
ba2d382
·
verified ·
1 Parent(s): 993f4b1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -20
app.py CHANGED
@@ -2,6 +2,7 @@ import os
2
  import json
3
  import random
4
  import asyncio
 
5
  from concurrent.futures import ThreadPoolExecutor
6
  from fastapi import FastAPI, HTTPException
7
  from fastapi.responses import HTMLResponse, JSONResponse
@@ -13,17 +14,30 @@ load_dotenv()
13
 
14
  app = FastAPI()
15
 
16
- # 1. بارگذاری تمام کلیدها در حافظه
17
  all_keys_str = os.getenv("ALL_GEMINI_API_KEYS", "")
18
- # تمیز کردن لیست کلیدها
19
- GEMINI_KEYS = [k.strip() for k in all_keys_str.split(",") if k.strip()]
 
 
 
 
 
 
 
 
 
 
 
20
 
21
  if GEMINI_KEYS:
22
- print(f"تعداد {len(GEMINI_KEYS)} کلید جیمینای بارگذاری شد.")
 
 
23
  else:
24
- print("هشدار: هیچ کلید جیمینای یافت نشد.")
25
 
26
- # 2. ایجاد ThreadPool برای اجرای موازی درخواست‌ها (دست‌های زیاد)
27
  executor = ThreadPoolExecutor(max_workers=10)
28
 
29
  class IdeaRequest(BaseModel):
@@ -39,33 +53,33 @@ async def read_root():
39
 
40
  def sync_generate_content(prompt):
41
  """
42
- این تابع همگام است و در یک ترد جداگانه اجرا می‌شود تا سرور اصلی را قفل نکند.
43
- تلاش می‌کند تا 100 بار با کلیدهای مختلف محتوا تولید کند.
44
  """
45
- max_retries = 100 # درخواست شما: 100 بار تلاش تصادفی
46
 
 
 
 
 
 
47
  for _ in range(max_retries):
48
  try:
49
- # انتخاب کاملاً تصادفی یک کلید در هر بار تلاش
50
  current_key = random.choice(GEMINI_KEYS)
51
 
52
  genai.configure(api_key=current_key)
53
- model = genai.GenerativeModel('gemini-2.5-flash')
54
 
55
- # تولید محتوا (این عملیات ممکن است طول بکشد)
56
  response = model.generate_content(prompt)
57
 
58
  clean_json = response.text.replace("```json", "").replace("```", "").strip()
59
  data = json.loads(clean_json)
60
 
61
- return data # موفقیت! خروجی را برگردان
62
 
63
  except Exception as e:
64
- # خطا را نادیده بگیر و دوباره تلاش کن (حلقه بعدی)
65
- # print(f"Key failed: {str(e)[:50]}...")
66
  continue
67
 
68
- # اگر بعد از 100 تلاش نشد
69
  return None
70
 
71
  @app.post("/api/refine")
@@ -109,13 +123,10 @@ async def refine_text(request: IdeaRequest):
109
  User Input: {request.idea}
110
  """
111
 
112
- # 3. اجرای درخواست سنگین در پس‌زمینه (Non-blocking)
113
- # این باعث می‌شود سرور اصلی آزاد باشد و بتواند درخواست‌های جدید بگیرد
114
  loop = asyncio.get_running_loop()
115
  result = await loop.run_in_executor(executor, sync_generate_content, prompt)
116
 
117
  if result:
118
  return JSONResponse(content=result)
119
  else:
120
- # اگر بعد از 100 تلاش هیچ کلیدی کار نکرد
121
- return JSONResponse(content={"error": "Server busy (100 retries failed). Please try again later."}, status_code=503)
 
2
  import json
3
  import random
4
  import asyncio
5
+ import re
6
  from concurrent.futures import ThreadPoolExecutor
7
  from fastapi import FastAPI, HTTPException
8
  from fastapi.responses import HTMLResponse, JSONResponse
 
14
 
15
  app = FastAPI()
16
 
17
+ # --- بخش اصلاح شده برای بارگذاری تمیز کلیدها ---
18
  all_keys_str = os.getenv("ALL_GEMINI_API_KEYS", "")
19
+
20
+ # استفاده از Regex برای جدا کردن کلیدها بر اساس کاما، خط جدید یا فاصله
21
+ # این کار باعث می‌شود اگر کلیدها پشت سر هم با اینتر جدا شده باشند هم درست کار کند
22
+ raw_keys = re.split(r'[,\s\n]+', all_keys_str)
23
+
24
+ GEMINI_KEYS = []
25
+ for k in raw_keys:
26
+ # حذف کوتیشن‌های احتمالی (' یا ") و کاراکترهای کنترلی مثل \r
27
+ clean_key = k.strip().replace('"', '').replace("'", "").replace("\r", "").replace("\n", "")
28
+
29
+ # فیلتر کردن کلیدهای خراب (کلیدهای جمینای معمولاً طولانی هستند)
30
+ if len(clean_key) > 30:
31
+ GEMINI_KEYS.append(clean_key)
32
 
33
  if GEMINI_KEYS:
34
+ print(f"تعداد {len(GEMINI_KEYS)} کلید سالم و تمیز بارگذاری شد.")
35
+ # نمایش ۵ کاراکتر اول یکی از کلیدها جهت اطمینان در لاگ
36
+ print(f"Sample loaded key start: {GEMINI_KEYS[0][:5]}...")
37
  else:
38
+ print("هشدار جدی: هیچ کلید معتبری یافت نشد. لطفاً متغیر ALL_GEMINI_API_KEYS را بررسی کنید.")
39
 
40
+ # تنظیم ThreadPool برای درخواست‌های موازی
41
  executor = ThreadPoolExecutor(max_workers=10)
42
 
43
  class IdeaRequest(BaseModel):
 
53
 
54
  def sync_generate_content(prompt):
55
  """
56
+ این تابع همگام است و تلاش میکند با کلیدهای مختلف محتوا تولید کند.
 
57
  """
58
+ max_retries = 100
59
 
60
+ # اگر کلیدی موجود نیست، فوراً خارج شو
61
+ if not GEMINI_KEYS:
62
+ print("No keys available to use.")
63
+ return None
64
+
65
  for _ in range(max_retries):
66
  try:
 
67
  current_key = random.choice(GEMINI_KEYS)
68
 
69
  genai.configure(api_key=current_key)
70
+ model = genai.GenerativeModel('gemini-2.5-flash') # استفاده از مدل جدیدتر و سریعتر
71
 
 
72
  response = model.generate_content(prompt)
73
 
74
  clean_json = response.text.replace("```json", "").replace("```", "").strip()
75
  data = json.loads(clean_json)
76
 
77
+ return data
78
 
79
  except Exception as e:
80
+ # خطا را لاگ نمی‌کنیم تا لاگ‌ها شلوغ نشود، فقط ریترای می‌کنیم
 
81
  continue
82
 
 
83
  return None
84
 
85
  @app.post("/api/refine")
 
123
  User Input: {request.idea}
124
  """
125
 
 
 
126
  loop = asyncio.get_running_loop()
127
  result = await loop.run_in_executor(executor, sync_generate_content, prompt)
128
 
129
  if result:
130
  return JSONResponse(content=result)
131
  else:
132
+ return JSONResponse(content={"error": "Server busy (All keys limit reached or invalid). Please try again later."}, status_code=503)