Update app.py
Browse files
app.py
CHANGED
|
@@ -82,6 +82,7 @@ def chat():
|
|
| 82 |
|
| 83 |
show_thoughts = data.get("show_thoughts", False)
|
| 84 |
|
|
|
|
| 85 |
gemini_messages = []
|
| 86 |
for msg in data.get("messages", []):
|
| 87 |
role = "model" if msg.get("role") == "assistant" else msg.get("role")
|
|
@@ -94,8 +95,6 @@ def chat():
|
|
| 94 |
if part.get("base64Data") and part.get("mimeType"):
|
| 95 |
mime_type = part["mimeType"]
|
| 96 |
|
| 97 |
-
# *** START: MODIFIED - منطق جدید برای تفکیک فایلها ***
|
| 98 |
-
# 1. فایل Word را به متن تبدیل میکنیم (چون Gemini مستقیماً آن را قبول نمیکند)
|
| 99 |
if mime_type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
|
| 100 |
try:
|
| 101 |
decoded_data = base64.b64decode(part["base64Data"])
|
|
@@ -111,15 +110,8 @@ def chat():
|
|
| 111 |
logging.error(f"خطا در پردازش فایل DOCX: {e}")
|
| 112 |
processed_parts.append({"text": "[خطا: امکان پردازش فایل Word وجود نداشت.]"})
|
| 113 |
|
| 114 |
-
# 2. فایل PDF را مستقیماً ارسال میکنیم (چون Gemini آن را تحلیل میکند)
|
| 115 |
-
elif mime_type == "application/pdf":
|
| 116 |
-
logging.info("فایل PDF برای تحلیل مستقیم به Gemini ارسال میشود.")
|
| 117 |
-
processed_parts.append({"inline_data": {"mime_type": part["mimeType"], "data": part["base64Data"]}})
|
| 118 |
-
|
| 119 |
-
# 3. سایر فایلها (مثل تصاویر) را نیز مستقیماً ارسال میکنیم
|
| 120 |
else:
|
| 121 |
processed_parts.append({"inline_data": {"mime_type": part["mimeType"], "data": part["base64Data"]}})
|
| 122 |
-
# *** END: MODIFIED ***
|
| 123 |
|
| 124 |
if processed_parts:
|
| 125 |
if gemini_messages and gemini_messages[-1]["role"] == role:
|
|
@@ -153,7 +145,10 @@ def chat():
|
|
| 153 |
"include_thoughts": True
|
| 154 |
}
|
| 155 |
|
|
|
|
|
|
|
| 156 |
with requests.post(api_endpoint, json=payload, stream=True, timeout=(STREAM_START_TIMEOUT, STREAM_READ_TIMEOUT)) as response:
|
|
|
|
| 157 |
if response.status_code == 429:
|
| 158 |
logging.warning(f"کلید شماره {key_index + 1} سهمیه آن تمام شده است. در حال تلاش با کلید بعدی...")
|
| 159 |
last_error = "Rate limit exceeded"
|
|
@@ -162,6 +157,7 @@ def chat():
|
|
| 162 |
response.raise_for_status()
|
| 163 |
logging.info(f"اتصال با کلید شماره {key_index + 1} موفقیتآمیز بود. در حال استریم پاسخ...")
|
| 164 |
|
|
|
|
| 165 |
for line in response.iter_lines():
|
| 166 |
if line:
|
| 167 |
decoded_line = line.decode('utf-8')
|
|
@@ -186,6 +182,7 @@ def chat():
|
|
| 186 |
logging.info(f"استریم با کلید شماره {key_index + 1} به پایان رسید.")
|
| 187 |
return
|
| 188 |
|
|
|
|
| 189 |
except (requests.exceptions.Timeout, requests.exceptions.ReadTimeout) as e:
|
| 190 |
if isinstance(e, requests.exceptions.ReadTimeout):
|
| 191 |
logging.warning(f"استریم با کلید شماره {key_index + 1} به دلیل عدم دریافت داده جدید متوقف شد (ReadTimeout). در حال تلاش با کلید بعدی...")
|
|
@@ -194,6 +191,7 @@ def chat():
|
|
| 194 |
logging.warning(f"مهلت زمانی برای اتصال با کلید شماره {key_index + 1} به پایان رسید (ConnectTimeout). در حال تلاش با کلید بعدی...")
|
| 195 |
last_error = f"ConnectTimeout after {STREAM_START_TIMEOUT} seconds"
|
| 196 |
continue
|
|
|
|
| 197 |
|
| 198 |
except requests.exceptions.HTTPError as e:
|
| 199 |
if e.response.status_code == 403:
|
|
@@ -221,3 +219,5 @@ if __name__ == '__main__':
|
|
| 221 |
if GEMINI_API_KEYS:
|
| 222 |
logging.info(f"سیستم در حالت توسعه شروع به کار کرد. تعداد {len(GEMINI_API_KEYS)} کلید شناسایی شد.")
|
| 223 |
app.run(debug=True, host='0.0.0.0', port=os.environ.get("PORT", 7860))
|
|
|
|
|
|
|
|
|
| 82 |
|
| 83 |
show_thoughts = data.get("show_thoughts", False)
|
| 84 |
|
| 85 |
+
# بخش پردازش پیامها و فایل DOCX (بدون تغییر باقی میماند)
|
| 86 |
gemini_messages = []
|
| 87 |
for msg in data.get("messages", []):
|
| 88 |
role = "model" if msg.get("role") == "assistant" else msg.get("role")
|
|
|
|
| 95 |
if part.get("base64Data") and part.get("mimeType"):
|
| 96 |
mime_type = part["mimeType"]
|
| 97 |
|
|
|
|
|
|
|
| 98 |
if mime_type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
|
| 99 |
try:
|
| 100 |
decoded_data = base64.b64decode(part["base64Data"])
|
|
|
|
| 110 |
logging.error(f"خطا در پردازش فایل DOCX: {e}")
|
| 111 |
processed_parts.append({"text": "[خطا: امکان پردازش فایل Word وجود نداشت.]"})
|
| 112 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
else:
|
| 114 |
processed_parts.append({"inline_data": {"mime_type": part["mimeType"], "data": part["base64Data"]}})
|
|
|
|
| 115 |
|
| 116 |
if processed_parts:
|
| 117 |
if gemini_messages and gemini_messages[-1]["role"] == role:
|
|
|
|
| 145 |
"include_thoughts": True
|
| 146 |
}
|
| 147 |
|
| 148 |
+
# *** START: MODIFIED - استفاده از Timeout تفکیک شده ***
|
| 149 |
+
# timeout اول برای اتصال اولیه، timeout دوم برای فاصله بین دریافت دادهها
|
| 150 |
with requests.post(api_endpoint, json=payload, stream=True, timeout=(STREAM_START_TIMEOUT, STREAM_READ_TIMEOUT)) as response:
|
| 151 |
+
# *** END: MODIFIED ***
|
| 152 |
if response.status_code == 429:
|
| 153 |
logging.warning(f"کلید شماره {key_index + 1} سهمیه آن تمام شده است. در حال تلاش با کلید بعدی...")
|
| 154 |
last_error = "Rate limit exceeded"
|
|
|
|
| 157 |
response.raise_for_status()
|
| 158 |
logging.info(f"اتصال با کلید شماره {key_index + 1} موفقیتآمیز بود. در حال استریم پاسخ...")
|
| 159 |
|
| 160 |
+
# بخش استریم پاسخ (بدون تغییر)
|
| 161 |
for line in response.iter_lines():
|
| 162 |
if line:
|
| 163 |
decoded_line = line.decode('utf-8')
|
|
|
|
| 182 |
logging.info(f"استریم با کلید شماره {key_index + 1} به پایان رسید.")
|
| 183 |
return
|
| 184 |
|
| 185 |
+
# *** START: MODIFIED - افزودن ReadTimeout به مدیریت خطا ***
|
| 186 |
except (requests.exceptions.Timeout, requests.exceptions.ReadTimeout) as e:
|
| 187 |
if isinstance(e, requests.exceptions.ReadTimeout):
|
| 188 |
logging.warning(f"استریم با کلید شماره {key_index + 1} به دلیل عدم دریافت داده جدید متوقف شد (ReadTimeout). در حال تلاش با کلید بعدی...")
|
|
|
|
| 191 |
logging.warning(f"مهلت زمانی برای اتصال با کلید شماره {key_index + 1} به پایان رسید (ConnectTimeout). در حال تلاش با کلید بعدی...")
|
| 192 |
last_error = f"ConnectTimeout after {STREAM_START_TIMEOUT} seconds"
|
| 193 |
continue
|
| 194 |
+
# *** END: MODIFIED ***
|
| 195 |
|
| 196 |
except requests.exceptions.HTTPError as e:
|
| 197 |
if e.response.status_code == 403:
|
|
|
|
| 219 |
if GEMINI_API_KEYS:
|
| 220 |
logging.info(f"سیستم در حالت توسعه شروع به کار کرد. تعداد {len(GEMINI_API_KEYS)} کلید شناسایی شد.")
|
| 221 |
app.run(debug=True, host='0.0.0.0', port=os.environ.get("PORT", 7860))
|
| 222 |
+
|
| 223 |
+
# --- END OF FILE app.py ---
|