KashefTech commited on
Commit
e6bfe84
·
verified ·
1 Parent(s): 5fe94c6

Update llm_sender_unified.py

Browse files
Files changed (1) hide show
  1. llm_sender_unified.py +19 -70
llm_sender_unified.py CHANGED
@@ -1,7 +1,7 @@
1
  """
2
  🤖 LLM Sender Unified Module
3
  ماژول یکپارچه برای ارسال به ChatGPT و Grok
4
- ✨ با پشتیبانی از GPT-5 و O1 models
5
  """
6
 
7
  import requests
@@ -46,8 +46,8 @@ class LLMSender(ABC):
46
  def _uses_max_completion_tokens(self) -> bool:
47
  """بررسی اینکه آیا مدل از max_completion_tokens استفاده می‌کند"""
48
  models_with_completion_tokens = [
49
- 'o1-preview', 'o1-mini', 'o1',
50
- 'gpt-5', 'gpt-5.1', 'gpt-5-mini', 'gpt-5-nano', 'gpt-5-for'
51
  ]
52
  return any(self.model.startswith(prefix) for prefix in models_with_completion_tokens)
53
 
@@ -175,15 +175,12 @@ class LLMSender(ABC):
175
  # خطای دیگر
176
  try:
177
  error_data = response.json() if response.content else {}
178
- # چک کنیم که error_data واقعاً dict باشه
179
  if isinstance(error_data, dict):
180
  error_msg = error_data.get('error', {}).get('message', response.text)
181
  else:
182
- # اگه string یا چیز دیگه‌ای بود
183
  error_msg = str(error_data)
184
  except:
185
- # اگه JSON parse نشد
186
- error_msg = response.text[:200] # فقط 200 کاراکتر اول
187
 
188
  logger.error(f"❌ API Error: {error_msg}")
189
  return f"❌ API Error: {error_msg}"
@@ -225,7 +222,6 @@ class ChatGPTSender(LLMSender):
225
  """کلاس برای ارسال به ChatGPT"""
226
 
227
  def __init__(self, api_key: Optional[str] = None, model: str = "gpt-4o-mini"):
228
- # ✅ پاکسازی API key از فضاهای خالی و newline
229
  raw_key = api_key or os.getenv("OPENAI_API_KEY", "")
230
  cleaned_key = raw_key.strip() if raw_key else ""
231
 
@@ -246,7 +242,6 @@ class GrokSender(LLMSender):
246
  """کلاس برای ارسال به Grok (xAI)"""
247
 
248
  def __init__(self, api_key: Optional[str] = None, model: str = "grok-beta"):
249
- # ✅ پاکسازی API key از فضاهای خالی و newline
250
  raw_key = api_key or os.getenv("XAI_API_KEY", "")
251
  cleaned_key = raw_key.strip() if raw_key else ""
252
 
@@ -263,23 +258,12 @@ class GrokSender(LLMSender):
263
  return "https://api.x.ai/v1/chat/completions"
264
 
265
 
266
- # Factory function برای ایجاد sender مناسب
267
  def create_llm_sender(
268
  provider: str = "chatgpt",
269
  api_key: Optional[str] = None,
270
  model: Optional[str] = None
271
  ) -> LLMSender:
272
- """
273
- ایجاد LLM sender بر اساس provider
274
-
275
- Args:
276
- provider: "chatgpt" یا "grok"
277
- api_key: کلید API (اختیاری)
278
- model: مدل (اختیاری، از پیش‌فرض استفاده می‌شود)
279
-
280
- Returns:
281
- instance از ChatGPTSender یا GrokSender
282
- """
283
  provider = provider.lower()
284
 
285
  if provider == "chatgpt":
@@ -293,73 +277,38 @@ def create_llm_sender(
293
  return GrokSender(api_key=api_key, model=model)
294
 
295
  else:
296
- raise ValueError(f"Provider نامعتبر: {provider}. باید 'chatgpt' یا 'grok' باشد")
297
 
298
 
299
- # مدل‌های موجود برای هر provider
300
  AVAILABLE_MODELS = {
301
  "chatgpt": [
302
- # مدل‌های جدید GPT-5
303
- "gpt-5",
304
- "gpt-5.1",
305
- "gpt-5-mini",
306
- "gpt-5-nano",
307
- # مدل‌های O1
308
- "o1",
309
- "o1-preview",
310
- "o1-mini",
311
- # مدل‌های GPT-4
312
  "gpt-4o-mini",
313
  "gpt-4o",
314
  "gpt-4-turbo",
315
  "gpt-3.5-turbo"
316
  ],
317
  "grok": [
318
- "grok-beta", # رایگان در بتا
319
- "grok-3-mini", # ارزان‌تر
320
- "grok-3", # flagship
321
- "grok-2-1212" # نسخه قدیمی‌تر
322
  ]
323
  }
324
 
325
 
326
  if __name__ == "__main__":
327
  print("=" * 60)
328
- print("🤖 LLM Sender Unified - مثال استفاده")
329
- print("✨ با پشتیبانی از GPT-5 و O1")
330
  print("=" * 60)
331
 
332
- # مثال 1: ChatGPT
333
- print("\n1️⃣ ChatGPT:")
334
- chatgpt = create_llm_sender("chatgpt")
335
- if chatgpt.api_key:
336
- response = chatgpt.send_simple("سلام")
337
- print(f"✅ پاسخ: {response[:100]}...")
338
- else:
339
- print("⚠️ کلید OpenAI API تنظیم نشده است!")
340
-
341
- # مثال 2: Grok
342
- print("\n2️⃣ Grok:")
343
- grok = create_llm_sender("grok", model="grok-beta")
344
- if grok.api_key:
345
- response = grok.send_simple("سلام")
346
- print(f"✅ پاسخ: {response[:100]}...")
347
- else:
348
- print("⚠️ کلید xAI API تنظیم نشده است!")
349
-
350
- # مثال 3: تست مدل‌های جدید
351
- print("\n3️⃣ تست مدل‌های جدید:")
352
- print("\nمدل‌های با max_completion_tokens:")
353
- test_models = ['o1', 'o1-mini', 'gpt-5', 'gpt-5-mini', 'gpt-4o']
354
  for model in test_models:
355
  sender = create_llm_sender("chatgpt", model=model)
356
  uses_completion = sender._uses_max_completion_tokens()
357
- print(f" - {model}: {'✅ max_completion_tokens' if uses_completion else '❌ max_tokens'}")
358
-
359
- # مثال 4: لیست مدل‌ها
360
- print("\n4️⃣ مدل‌های موجود:")
361
- for provider, models in AVAILABLE_MODELS.items():
362
- print(f"\n{provider.upper()}:")
363
- for model in models:
364
- print(f" - {model}")
365
-
 
1
  """
2
  🤖 LLM Sender Unified Module
3
  ماژول یکپارچه برای ارسال به ChatGPT و Grok
4
+ ✨ با پشتیبانی از GPT-5 models
5
  """
6
 
7
  import requests
 
46
  def _uses_max_completion_tokens(self) -> bool:
47
  """بررسی اینکه آیا مدل از max_completion_tokens استفاده می‌کند"""
48
  models_with_completion_tokens = [
49
+ 'gpt-5', # ✅ فقط gpt-5 اصلی
50
+ 'gpt-5.1' # فقط gpt-5.1
51
  ]
52
  return any(self.model.startswith(prefix) for prefix in models_with_completion_tokens)
53
 
 
175
  # خطای دیگر
176
  try:
177
  error_data = response.json() if response.content else {}
 
178
  if isinstance(error_data, dict):
179
  error_msg = error_data.get('error', {}).get('message', response.text)
180
  else:
 
181
  error_msg = str(error_data)
182
  except:
183
+ error_msg = response.text[:200]
 
184
 
185
  logger.error(f"❌ API Error: {error_msg}")
186
  return f"❌ API Error: {error_msg}"
 
222
  """کلاس برای ارسال به ChatGPT"""
223
 
224
  def __init__(self, api_key: Optional[str] = None, model: str = "gpt-4o-mini"):
 
225
  raw_key = api_key or os.getenv("OPENAI_API_KEY", "")
226
  cleaned_key = raw_key.strip() if raw_key else ""
227
 
 
242
  """کلاس برای ارسال به Grok (xAI)"""
243
 
244
  def __init__(self, api_key: Optional[str] = None, model: str = "grok-beta"):
 
245
  raw_key = api_key or os.getenv("XAI_API_KEY", "")
246
  cleaned_key = raw_key.strip() if raw_key else ""
247
 
 
258
  return "https://api.x.ai/v1/chat/completions"
259
 
260
 
 
261
  def create_llm_sender(
262
  provider: str = "chatgpt",
263
  api_key: Optional[str] = None,
264
  model: Optional[str] = None
265
  ) -> LLMSender:
266
+ """ایجاد LLM sender بر اساس provider"""
 
 
 
 
 
 
 
 
 
 
267
  provider = provider.lower()
268
 
269
  if provider == "chatgpt":
 
277
  return GrokSender(api_key=api_key, model=model)
278
 
279
  else:
280
+ raise ValueError(f"Provider نامعتبر: {provider}")
281
 
282
 
283
+ # مدل‌های موجود (بعد از حذف)
284
  AVAILABLE_MODELS = {
285
  "chatgpt": [
286
+ "gpt-5", # فقط gpt-5 اصلی
287
+ "gpt-5.1", # ✅ فقط gpt-5.1
 
 
 
 
 
 
 
 
288
  "gpt-4o-mini",
289
  "gpt-4o",
290
  "gpt-4-turbo",
291
  "gpt-3.5-turbo"
292
  ],
293
  "grok": [
294
+ "grok-3-mini",
295
+ "grok-3",
296
+ "grok-2-1212"
 
297
  ]
298
  }
299
 
300
 
301
  if __name__ == "__main__":
302
  print("=" * 60)
303
+ print("🤖 LLM Sender - نسخه تمیز شده")
304
+ print("✨ مدل‌های پشتیبانی شده: o1, gpt-5, gpt-5.1")
305
  print("=" * 60)
306
 
307
+ # تست
308
+ print("\n🧪 تست مدل‌ها:")
309
+ test_models = ['o1', 'gpt-5', 'gpt-5.1', 'gpt-4o']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
310
  for model in test_models:
311
  sender = create_llm_sender("chatgpt", model=model)
312
  uses_completion = sender._uses_max_completion_tokens()
313
+ param = "max_completion_tokens" if uses_completion else "max_tokens"
314
+ print(f" {model:<15} → {param}")