leilaghomashchi commited on
Commit
6278de5
·
verified ·
1 Parent(s): 5bd3969

Upload chatgpt_sender__1_.py

Browse files
Files changed (1) hide show
  1. chatgpt_sender__1_.py +301 -0
chatgpt_sender__1_.py ADDED
@@ -0,0 +1,301 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ 🤖 ChatGPT Sender Module
3
+ ماژول مستقل برای ارسال متن ناشناس‌شده به ChatGPT
4
+ استفاده برای: برنامه‌های مختلف، API‌ها، و سیستم‌های تحلیل
5
+ """
6
+
7
+ import requests
8
+ import os
9
+ import logging
10
+ from typing import Dict, Optional, Tuple
11
+ import time
12
+
13
+ # تنظیم logging
14
+ logging.basicConfig(level=logging.INFO)
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class ChatGPTSender:
19
+ """
20
+ کلاس برای ارسال متن به ChatGPT با قابلیت‌های پیشرفته
21
+ """
22
+
23
+ def __init__(self, api_key: Optional[str] = None, model: str = "gpt-4o-mini"):
24
+ """
25
+ اولیه‌سازی
26
+
27
+ Args:
28
+ api_key: کلید OpenAI API (اگر None، از متغیر محیطی خوانده می‌شود)
29
+ model: مدل مورد استفاده (پیش‌فرض: gpt-4o-mini)
30
+ """
31
+ self.api_key = api_key or os.getenv("OPENAI_API_KEY", "")
32
+ self.model = model
33
+ self.base_url = "https://api.openai.com/v1/chat/completions"
34
+
35
+ if not self.api_key:
36
+ logger.warning("⚠️ کلید API تنظیم نشده است!")
37
+
38
+ def set_api_key(self, api_key: str):
39
+ """تنظیم کلید API"""
40
+ self.api_key = api_key
41
+ logger.info("✅ کلید API تنظیم شد")
42
+
43
+ def set_model(self, model: str):
44
+ """تغییر مدل ChatGPT"""
45
+ self.model = model
46
+ logger.info(f"✅ مدل تغییر یافت به: {model}")
47
+
48
+ def send_simple(self, text: str, lang: str = 'fa') -> str:
49
+ """
50
+ ارسال ساده (بدون system message سفارشی)
51
+
52
+ Args:
53
+ text: متن ارسالی
54
+ lang: زبان ('fa' یا 'en')
55
+
56
+ Returns:
57
+ پاسخ از ChatGPT
58
+ """
59
+ system_msg = (
60
+ "شما یک تحلیلگر متخصص هستید. متن حاوی کدهای ناشناس است. "
61
+ "به درخواست‌ها با دقت و حرفه‌ای‌ی پاسخ دهید."
62
+ if lang == 'fa'
63
+ else "You are a professional analyst. The text contains anonymous codes. "
64
+ "Answer requests accurately and professionally."
65
+ )
66
+
67
+ return self.send(text, system_msg=system_msg, lang=lang)
68
+
69
+ def send(
70
+ self,
71
+ text: str,
72
+ system_msg: Optional[str] = None,
73
+ max_tokens: int = 2000,
74
+ temperature: float = 0.7,
75
+ timeout: int = 60,
76
+ lang: str = 'fa',
77
+ retry_count: int = 3
78
+ ) -> str:
79
+ """
80
+ ارسال متن به ChatGPT با کنترل کامل
81
+
82
+ Args:
83
+ text: متن ارسالی
84
+ system_msg: پیام سیستم سفارشی
85
+ max_tokens: حداکثر توکن پاسخ
86
+ temperature: میزان خلاقیت (0-2)
87
+ timeout: زمان انتظار (ثانیه)
88
+ lang: زبان ('fa' یا 'en')
89
+ retry_count: تعداد تلاش مجدد
90
+
91
+ Returns:
92
+ پاسخ از ChatGPT
93
+ """
94
+ try:
95
+ # بررسی اولیه
96
+ if not text or not text.strip():
97
+ error_msg = "متن خالی است!" if lang == 'fa' else "Text is empty!"
98
+ logger.error(f"❌ {error_msg}")
99
+ return f"❌ {error_msg}"
100
+
101
+ if not self.api_key:
102
+ error_msg = "کلید API تنظیم نشده است!" if lang == 'fa' else "API Key not configured!"
103
+ logger.error(f"❌ {error_msg}")
104
+ return f"❌ {error_msg}"
105
+
106
+ # تنظیم system message پیش‌فرض
107
+ if system_msg is None:
108
+ system_msg = (
109
+ "شما یک تحلیلگر مالی حرفه‌ای هستید. متن حاوی کدهای ناشناس است. "
110
+ "به سوالات با دقت پاسخ دهید."
111
+ if lang == 'fa'
112
+ else "You are a professional financial analyst. The text contains anonymous codes. "
113
+ "Answer questions accurately."
114
+ )
115
+
116
+ # تهیه headers
117
+ headers = {
118
+ "Authorization": f"Bearer {self.api_key}",
119
+ "Content-Type": "application/json"
120
+ }
121
+
122
+ # ساخت request body
123
+ data = {
124
+ "model": self.model,
125
+ "messages": [
126
+ {"role": "system", "content": system_msg},
127
+ {"role": "user", "content": text}
128
+ ],
129
+ "max_tokens": max_tokens,
130
+ "temperature": temperature
131
+ }
132
+
133
+ # ارسال با retry mechanism
134
+ for attempt in range(retry_count):
135
+ try:
136
+ logger.info(f"📤 ��رسال درخواست (تلاش {attempt + 1}/{retry_count})...")
137
+
138
+ response = requests.post(
139
+ self.base_url,
140
+ headers=headers,
141
+ json=data,
142
+ timeout=timeout
143
+ )
144
+
145
+ # پردازش پاسخ موفق
146
+ if response.status_code == 200:
147
+ result = response.json()
148
+ gpt_response = result['choices'][0]['message']['content']
149
+ logger.info("✅ پاسخ دریافت شد")
150
+ return gpt_response
151
+
152
+ # پردازش خطاهای مختلف
153
+ elif response.status_code == 429: # Rate limiting
154
+ wait_time = 5 * (attempt + 1)
155
+ logger.warning(
156
+ f"⚠️ Rate limit | جانب: {wait_time} ثانیه صبر کن"
157
+ )
158
+ if attempt < retry_count - 1:
159
+ time.sleep(wait_time)
160
+ continue
161
+ else:
162
+ return (
163
+ "❌ سهمیه API تمام شده است. لطفاً بعداً تلاش کنید."
164
+ if lang == 'fa'
165
+ else "❌ API quota exceeded. Please try later."
166
+ )
167
+
168
+ elif response.status_code == 401:
169
+ return (
170
+ "❌ کلید API نامعتبر است!"
171
+ if lang == 'fa'
172
+ else "❌ Invalid API key!"
173
+ )
174
+
175
+ elif response.status_code in [502, 503, 504]: # Server errors
176
+ wait_time = 2 * (attempt + 1)
177
+ logger.warning(
178
+ f"⚠️ Server error {response.status_code} | "
179
+ f"صبر: {wait_time} ثانیه"
180
+ )
181
+ if attempt < retry_count - 1:
182
+ time.sleep(wait_time)
183
+ continue
184
+ else:
185
+ return (
186
+ f"❌ خطای سرور: {response.status_code}"
187
+ if lang == 'fa'
188
+ else f"❌ Server error: {response.status_code}"
189
+ )
190
+
191
+ else:
192
+ # خطای دیگر
193
+ error_data = response.json() if response.content else {}
194
+ error_msg = error_data.get('error', {}).get('message', response.text)
195
+ logger.error(f"❌ API Error: {error_msg}")
196
+ return f"❌ API Error: {error_msg}"
197
+
198
+ except requests.exceptions.Timeout:
199
+ logger.warning(
200
+ f"⚠️ Timeout | صبر: 3 ثانیه و تلاش مجدد"
201
+ )
202
+ if attempt < retry_count - 1:
203
+ time.sleep(3)
204
+ continue
205
+ else:
206
+ return (
207
+ "❌ خطای اتصال: timeout"
208
+ if lang == 'fa'
209
+ else "❌ Connection error: timeout"
210
+ )
211
+
212
+ except requests.exceptions.ConnectionError as e:
213
+ logger.warning(
214
+ f"⚠️ Connection error | صبر: 2 ثانیه و تلاش مجدد"
215
+ )
216
+ if attempt < retry_count - 1:
217
+ time.sleep(2)
218
+ continue
219
+ else:
220
+ return (
221
+ f"❌ خطای اتصال: {str(e)}"
222
+ if lang == 'fa'
223
+ else f"❌ Connection error: {str(e)}"
224
+ )
225
+
226
+ except Exception as e:
227
+ logger.error(f"❌ خطای غیرمنتظره: {str(e)}")
228
+ return (
229
+ f"❌ خطا در ارتباط با ChatGPT: {str(e)}"
230
+ if lang == 'fa'
231
+ else f"❌ Error connecting to ChatGPT: {str(e)}"
232
+ )
233
+
234
+ def batch_send(
235
+ self,
236
+ texts: list,
237
+ delay: float = 1.0,
238
+ **kwargs
239
+ ) -> Dict[str, str]:
240
+ """
241
+ ارسال چندین متن با تاخیر بین‌شان
242
+
243
+ Args:
244
+ texts: لیست متن‌های ارسالی
245
+ delay: تاخیر بین درخواست‌ها (ثانیه)
246
+ **kwargs: سایر پارامترهای send()
247
+
248
+ Returns:
249
+ دیکشنری {متن: پاسخ}
250
+ """
251
+ results = {}
252
+
253
+ for i, text in enumerate(texts, 1):
254
+ logger.info(f"📤 درخواست {i}/{len(texts)}")
255
+ response = self.send(text, **kwargs)
256
+ results[text[:50] + "..."] = response
257
+
258
+ if i < len(texts):
259
+ logger.info(f"⏳ صبر {delay} ثانیه...")
260
+ time.sleep(delay)
261
+
262
+ return results
263
+
264
+
265
+ # تابع standalone برای استفاده سریع
266
+ def send_to_chatgpt_simple(
267
+ text: str,
268
+ api_key: Optional[str] = None,
269
+ model: str = "gpt-4o-mini",
270
+ lang: str = 'fa'
271
+ ) -> str:
272
+ """
273
+ تابع سریع برای ارسال متن به ChatGPT
274
+
275
+ مثال:
276
+ response = send_to_chatgpt_simple("سلام، چطور می‌تونم خبر خوب داشته باشم؟")
277
+ """
278
+ sender = ChatGPTSender(api_key=api_key, model=model)
279
+ return sender.send_simple(text, lang=lang)
280
+
281
+
282
+ if __name__ == "__main__":
283
+ # مثال استفاده
284
+ print("=" * 60)
285
+ print("🤖 ChatGPT Sender Module - مثال استفاده")
286
+ print("=" * 60)
287
+
288
+ # روش 1: استفاده سریع
289
+ print("\n1️⃣ استفاده سریع:")
290
+ # result = send_to_chatgpt_simple("سلام")
291
+
292
+ # روش 2: استفاده از کلاس
293
+ print("\n2️⃣ استفاده از کلاس:")
294
+ sender = ChatGPTSender()
295
+
296
+ if sender.api_key:
297
+ response = sender.send_simple("تست سیستم")
298
+ print(f"✅ پاسخ: {response[:100]}...")
299
+ else:
300
+ print("⚠️ کلید API تنظیم نشده است!")
301
+ print(" راهنمایی: export OPENAI_API_KEY='your-key-here'")