aimevzulari commited on
Commit
84d0efc
·
verified ·
1 Parent(s): 9bc231c

Upload 2 files

Browse files
Files changed (2) hide show
  1. api_integrations.py +722 -0
  2. test_dynamic_models.py +93 -0
api_integrations.py ADDED
@@ -0,0 +1,722 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ API entegrasyonları için yardımcı fonksiyonlar.
3
+ Bu modül, OpenAI, Google Gemini ve OpenRouter API'leri ile etkileşim için gerekli fonksiyonları içerir.
4
+ """
5
+
6
+ import os
7
+ import json
8
+ import time
9
+ import threading
10
+ from typing import Dict, Any, List, Optional
11
+ import openai
12
+ from google import generativeai as genai
13
+ import requests
14
+ from dotenv import load_dotenv
15
+
16
+ # Prompt şablonlarından model listelerini içe aktar
17
+ from prompt_templates import OPENAI_MODELS, GEMINI_MODELS, OPENROUTER_MODELS
18
+
19
+ # .env dosyasını yükle (varsa)
20
+ load_dotenv()
21
+
22
+ # Model önbelleği için global değişkenler
23
+ MODEL_CACHE = {
24
+ "openai": {
25
+ "models": [],
26
+ "last_updated": 0,
27
+ "update_interval": 3600 # 1 saat (saniye cinsinden)
28
+ },
29
+ "gemini": {
30
+ "models": [],
31
+ "last_updated": 0,
32
+ "update_interval": 3600 # 1 saat (saniye cinsinden)
33
+ },
34
+ "openrouter": {
35
+ "models": [],
36
+ "last_updated": 0,
37
+ "update_interval": 3600 # 1 saat (saniye cinsinden)
38
+ }
39
+ }
40
+
41
+ # Model önbelleği dosya yolu
42
+ CACHE_FILE_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "model_cache.json")
43
+
44
+ def load_model_cache():
45
+ """
46
+ Disk üzerindeki model önbelleğini yükler.
47
+ """
48
+ global MODEL_CACHE
49
+ try:
50
+ if os.path.exists(CACHE_FILE_PATH):
51
+ with open(CACHE_FILE_PATH, 'r') as f:
52
+ cache_data = json.load(f)
53
+ MODEL_CACHE = cache_data
54
+ print(f"Model önbelleği yüklendi: {len(MODEL_CACHE['openai']['models'])} OpenAI, {len(MODEL_CACHE['gemini']['models'])} Gemini, {len(MODEL_CACHE['openrouter']['models'])} OpenRouter modeli")
55
+ except Exception as e:
56
+ print(f"Model önbelleği yüklenirken hata oluştu: {str(e)}")
57
+
58
+ def save_model_cache():
59
+ """
60
+ Model önbelleğini diske kaydeder.
61
+ """
62
+ try:
63
+ with open(CACHE_FILE_PATH, 'w') as f:
64
+ json.dump(MODEL_CACHE, f)
65
+ print("Model önbelleği diske kaydedildi")
66
+ except Exception as e:
67
+ print(f"Model önbelleği kaydedilirken hata oluştu: {str(e)}")
68
+
69
+ # Uygulama başlangıcında önbelleği yükle
70
+ load_model_cache()
71
+
72
+ class APIManager:
73
+ """
74
+ API yönetimi için sınıf.
75
+ Bu sınıf, API anahtarlarını yönetir ve API'lerin durumunu kontrol eder.
76
+ """
77
+
78
+ def __init__(self):
79
+ """
80
+ API yöneticisini başlat.
81
+ """
82
+ self.api_keys = {
83
+ "openai": os.getenv("OPENAI_API_KEY", ""),
84
+ "gemini": os.getenv("GEMINI_API_KEY", ""),
85
+ "openrouter": os.getenv("OPENROUTER_API_KEY", "")
86
+ }
87
+
88
+ def set_api_key(self, provider: str, api_key: str) -> None:
89
+ """
90
+ Belirli bir sağlayıcı için API anahtarını ayarlar.
91
+
92
+ Args:
93
+ provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
94
+ api_key (str): API anahtarı
95
+ """
96
+ if provider in self.api_keys:
97
+ self.api_keys[provider] = api_key
98
+
99
+ # API anahtarını ilgili kütüphane için de ayarla
100
+ if provider == "openai":
101
+ openai.api_key = api_key
102
+ elif provider == "gemini":
103
+ genai.configure(api_key=api_key)
104
+
105
+ # API anahtarı değiştiğinde model önbelleğini sıfırla
106
+ global MODEL_CACHE
107
+ MODEL_CACHE[provider]["last_updated"] = 0
108
+
109
+ def get_api_key(self, provider: str) -> str:
110
+ """
111
+ Belirli bir sağlayıcı için API anahtarını döndürür.
112
+
113
+ Args:
114
+ provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
115
+
116
+ Returns:
117
+ str: API anahtarı
118
+ """
119
+ return self.api_keys.get(provider, "")
120
+
121
+ def check_api_key_validity(self, provider: str) -> bool:
122
+ """
123
+ Belirli bir sağlayıcı için API anahtarının geçerliliğini kontrol eder.
124
+
125
+ Args:
126
+ provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
127
+
128
+ Returns:
129
+ bool: API anahtarı geçerli ise True, değilse False
130
+ """
131
+ api_key = self.get_api_key(provider)
132
+
133
+ if not api_key:
134
+ return False
135
+
136
+ try:
137
+ if provider == "openai":
138
+ openai.api_key = api_key
139
+ # Basit bir model listesi isteği ile API anahtarının geçerliliğini kontrol et
140
+ openai.models.list()
141
+ return True
142
+
143
+ elif provider == "gemini":
144
+ genai.configure(api_key=api_key)
145
+ # Kullanılabilir modelleri listeleyerek API anahtarının geçerliliğini kontrol et
146
+ genai.list_models()
147
+ return True
148
+
149
+ elif provider == "openrouter":
150
+ headers = {
151
+ "Authorization": f"Bearer {api_key}"
152
+ }
153
+ response = requests.get(
154
+ "https://openrouter.ai/api/v1/models",
155
+ headers=headers
156
+ )
157
+ return response.status_code == 200
158
+
159
+ return False
160
+
161
+ except Exception:
162
+ return False
163
+
164
+
165
+ class OpenAIHandler:
166
+ """
167
+ OpenAI API ile etkileşim için sınıf.
168
+ """
169
+
170
+ def __init__(self, api_key: str = ""):
171
+ """
172
+ OpenAI işleyicisini başlat.
173
+
174
+ Args:
175
+ api_key (str, optional): OpenAI API anahtarı
176
+ """
177
+ self.api_key = api_key
178
+ if api_key:
179
+ openai.api_key = api_key
180
+
181
+ def set_api_key(self, api_key: str) -> None:
182
+ """
183
+ OpenAI API anahtarını ayarlar.
184
+
185
+ Args:
186
+ api_key (str): OpenAI API anahtarı
187
+ """
188
+ self.api_key = api_key
189
+ openai.api_key = api_key
190
+
191
+ # API anahtarı değiştiğinde model önbelleğini sıfırla
192
+ global MODEL_CACHE
193
+ MODEL_CACHE["openai"]["last_updated"] = 0
194
+
195
+ def fetch_models_from_api(self) -> List[str]:
196
+ """
197
+ OpenAI API'sinden modelleri çeker.
198
+
199
+ Returns:
200
+ List[str]: API'den çekilen modeller listesi
201
+ """
202
+ if not self.api_key:
203
+ return []
204
+
205
+ try:
206
+ models = openai.models.list()
207
+ # Sadece GPT modellerini filtrele
208
+ gpt_models = [model.id for model in models.data if "gpt" in model.id.lower()]
209
+ return gpt_models
210
+ except Exception as e:
211
+ print(f"OpenAI modellerini çekerken hata oluştu: {str(e)}")
212
+ return []
213
+
214
+ def get_available_models(self, force_refresh: bool = False) -> List[str]:
215
+ """
216
+ Kullanılabilir OpenAI modellerini döndürür.
217
+
218
+ Args:
219
+ force_refresh (bool): Önbelleği zorla yenileme
220
+
221
+ Returns:
222
+ List[str]: Kullanılabilir modeller listesi
223
+ """
224
+ global MODEL_CACHE
225
+
226
+ current_time = time.time()
227
+ cache = MODEL_CACHE["openai"]
228
+
229
+ # Önbellek yenileme koşulları:
230
+ # 1. Zorla yenileme istenmiş
231
+ # 2. Önbellek boş
232
+ # 3. Önbellek güncellenme zamanı aşılmış
233
+ if (force_refresh or
234
+ not cache["models"] or
235
+ current_time - cache["last_updated"] > cache["update_interval"]):
236
+
237
+ # API'den modelleri çek
238
+ api_models = self.fetch_models_from_api()
239
+
240
+ if api_models:
241
+ # API'den modeller başarıyla çekildiyse önbelleği güncelle
242
+ all_models = list(set(api_models + OPENAI_MODELS))
243
+
244
+ # Varsayılan modelleri önceliklendir
245
+ sorted_models = sorted(
246
+ all_models,
247
+ key=lambda x: (
248
+ 0 if x in OPENAI_MODELS else 1,
249
+ OPENAI_MODELS.index(x) if x in OPENAI_MODELS else float('inf')
250
+ )
251
+ )
252
+
253
+ # Önbelleği güncelle
254
+ MODEL_CACHE["openai"]["models"] = sorted_models
255
+ MODEL_CACHE["openai"]["last_updated"] = current_time
256
+
257
+ # Önbelleği diske kaydet
258
+ save_model_cache()
259
+
260
+ return sorted_models
261
+ else:
262
+ # API'den model çekilemediyse önbellekteki modelleri kullan
263
+ if cache["models"]:
264
+ return cache["models"]
265
+ else:
266
+ return OPENAI_MODELS
267
+ else:
268
+ # Önbellek güncel, önbellekteki modelleri kullan
269
+ return cache["models"] if cache["models"] else OPENAI_MODELS
270
+
271
+ def generate_response(self, prompt: str, model: str = "gpt-3.5-turbo", temperature: float = 0.7, max_tokens: int = 2000) -> Dict[str, Any]:
272
+ """
273
+ OpenAI API kullanarak yanıt oluşturur.
274
+
275
+ Args:
276
+ prompt (str): Gönderilecek prompt
277
+ model (str): Kullanılacak model
278
+ temperature (float): Sıcaklık değeri (0.0-1.0)
279
+ max_tokens (int): Maksimum token sayısı
280
+
281
+ Returns:
282
+ Dict[str, Any]: Yanıt bilgilerini içeren sözlük
283
+ """
284
+ if not self.api_key:
285
+ return {"success": False, "error": "OpenAI API anahtarı ayarlanmamış.", "content": ""}
286
+
287
+ try:
288
+ response = openai.chat.completions.create(
289
+ model=model,
290
+ messages=[{"role": "user", "content": prompt}],
291
+ temperature=temperature,
292
+ max_tokens=max_tokens
293
+ )
294
+
295
+ return {
296
+ "success": True,
297
+ "content": response.choices[0].message.content,
298
+ "model": model,
299
+ "usage": {
300
+ "prompt_tokens": response.usage.prompt_tokens,
301
+ "completion_tokens": response.usage.completion_tokens,
302
+ "total_tokens": response.usage.total_tokens
303
+ }
304
+ }
305
+ except Exception as e:
306
+ return {"success": False, "error": str(e), "content": ""}
307
+
308
+
309
+ class GeminiHandler:
310
+ """
311
+ Google Gemini API ile etkileşim için sınıf.
312
+ """
313
+
314
+ def __init__(self, api_key: str = ""):
315
+ """
316
+ Gemini işleyicisini başlat.
317
+
318
+ Args:
319
+ api_key (str, optional): Gemini API anahtarı
320
+ """
321
+ self.api_key = api_key
322
+ if api_key:
323
+ genai.configure(api_key=api_key)
324
+
325
+ def set_api_key(self, api_key: str) -> None:
326
+ """
327
+ Gemini API anahtarını ayarlar.
328
+
329
+ Args:
330
+ api_key (str): Gemini API anahtarı
331
+ """
332
+ self.api_key = api_key
333
+ genai.configure(api_key=api_key)
334
+
335
+ # API anahtarı değiştiğinde model önbelleğini sıfırla
336
+ global MODEL_CACHE
337
+ MODEL_CACHE["gemini"]["last_updated"] = 0
338
+
339
+ def fetch_models_from_api(self) -> List[str]:
340
+ """
341
+ Gemini API'sinden modelleri çeker.
342
+
343
+ Returns:
344
+ List[str]: API'den çekilen modeller listesi
345
+ """
346
+ if not self.api_key:
347
+ return []
348
+
349
+ try:
350
+ models = genai.list_models()
351
+ api_models = []
352
+
353
+ # Tüm model türlerini topla (gemini, imagen, veo, vb.)
354
+ for model in models:
355
+ model_name = model.name.split("/")[-1]
356
+ if any(keyword in model_name.lower() for keyword in ["gemini", "imagen", "veo"]):
357
+ api_models.append(model_name)
358
+
359
+ return api_models
360
+ except Exception as e:
361
+ print(f"Gemini modellerini çekerken hata oluştu: {str(e)}")
362
+ return []
363
+
364
+ def get_available_models(self, force_refresh: bool = False) -> List[str]:
365
+ """
366
+ Kullanılabilir Gemini modellerini döndürür.
367
+
368
+ Args:
369
+ force_refresh (bool): Önbelleği zorla yenileme
370
+
371
+ Returns:
372
+ List[str]: Kullanılabilir modeller listesi
373
+ """
374
+ global MODEL_CACHE
375
+
376
+ current_time = time.time()
377
+ cache = MODEL_CACHE["gemini"]
378
+
379
+ # Önbellek yenileme koşulları:
380
+ # 1. Zorla yenileme istenmiş
381
+ # 2. Önbellek boş
382
+ # 3. Önbellek güncellenme zamanı aşılmış
383
+ if (force_refresh or
384
+ not cache["models"] or
385
+ current_time - cache["last_updated"] > cache["update_interval"]):
386
+
387
+ # API'den modelleri çek
388
+ api_models = self.fetch_models_from_api()
389
+
390
+ if api_models:
391
+ # API'den modeller başarıyla çekildiyse önbelleği güncelle
392
+ all_models = list(set(api_models + GEMINI_MODELS))
393
+
394
+ # Varsayılan modelleri önceliklendir
395
+ sorted_models = sorted(
396
+ all_models,
397
+ key=lambda x: (
398
+ 0 if x in GEMINI_MODELS else 1,
399
+ GEMINI_MODELS.index(x) if x in GEMINI_MODELS else float('inf')
400
+ )
401
+ )
402
+
403
+ # Önbelleği güncelle
404
+ MODEL_CACHE["gemini"]["models"] = sorted_models
405
+ MODEL_CACHE["gemini"]["last_updated"] = current_time
406
+
407
+ # Önbelleği diske kaydet
408
+ save_model_cache()
409
+
410
+ return sorted_models
411
+ else:
412
+ # API'den model çekilemediyse önbellekteki modelleri kullan
413
+ if cache["models"]:
414
+ return cache["models"]
415
+ else:
416
+ return GEMINI_MODELS
417
+ else:
418
+ # Önbellek güncel, önbellekteki modelleri kullan
419
+ return cache["models"] if cache["models"] else GEMINI_MODELS
420
+
421
+ def generate_response(self, prompt: str, model: str = "gemini-1.5-pro", temperature: float = 0.7) -> Dict[str, Any]:
422
+ """
423
+ Gemini API kullanarak yanıt oluşturur.
424
+
425
+ Args:
426
+ prompt (str): Gönderilecek prompt
427
+ model (str): Kullanılacak model
428
+ temperature (float): Sıcaklık değeri (0.0-1.0)
429
+
430
+ Returns:
431
+ Dict[str, Any]: Yanıt bilgilerini içeren sözlük
432
+ """
433
+ if not self.api_key:
434
+ return {"success": False, "error": "Gemini API anahtarı ayarlanmamış.", "content": ""}
435
+
436
+ try:
437
+ model_obj = genai.GenerativeModel(model)
438
+ response = model_obj.generate_content(
439
+ prompt,
440
+ generation_config=genai.types.GenerationConfig(
441
+ temperature=temperature
442
+ )
443
+ )
444
+
445
+ return {
446
+ "success": True,
447
+ "content": response.text,
448
+ "model": model
449
+ }
450
+ except Exception as e:
451
+ return {"success": False, "error": str(e), "content": ""}
452
+
453
+
454
+ class OpenRouterHandler:
455
+ """
456
+ OpenRouter API ile etkileşim için sınıf.
457
+ """
458
+
459
+ def __init__(self, api_key: str = ""):
460
+ """
461
+ OpenRouter işleyicisini başlat.
462
+
463
+ Args:
464
+ api_key (str, optional): OpenRouter API anahtarı
465
+ """
466
+ self.api_key = api_key
467
+ self.base_url = "https://openrouter.ai/api/v1"
468
+
469
+ def set_api_key(self, api_key: str) -> None:
470
+ """
471
+ OpenRouter API anahtarını ayarlar.
472
+
473
+ Args:
474
+ api_key (str): OpenRouter API anahtarı
475
+ """
476
+ self.api_key = api_key
477
+
478
+ # API anahtarı değiştiğinde model önbelleğini sıfırla
479
+ global MODEL_CACHE
480
+ MODEL_CACHE["openrouter"]["last_updated"] = 0
481
+
482
+ def fetch_models_from_api(self) -> List[str]:
483
+ """
484
+ OpenRouter API'sinden modelleri çeker.
485
+
486
+ Returns:
487
+ List[str]: API'den çekilen modeller listesi
488
+ """
489
+ if not self.api_key:
490
+ return []
491
+
492
+ try:
493
+ headers = {
494
+ "Authorization": f"Bearer {self.api_key}"
495
+ }
496
+
497
+ response = requests.get(
498
+ f"{self.base_url}/models",
499
+ headers=headers
500
+ )
501
+
502
+ if response.status_code == 200:
503
+ models_data = response.json()
504
+ api_models = [model["id"] for model in models_data["data"]]
505
+ return api_models
506
+ else:
507
+ print(f"OpenRouter modellerini çekerken HTTP hatası: {response.status_code}")
508
+ return []
509
+ except Exception as e:
510
+ print(f"OpenRouter modellerini çekerken hata oluştu: {str(e)}")
511
+ return []
512
+
513
+ def get_available_models(self, force_refresh: bool = False) -> List[str]:
514
+ """
515
+ Kullanılabilir OpenRouter modellerini döndürür.
516
+
517
+ Args:
518
+ force_refresh (bool): Önbelleği zorla yenileme
519
+
520
+ Returns:
521
+ List[str]: Kullanılabilir modeller listesi
522
+ """
523
+ global MODEL_CACHE
524
+
525
+ current_time = time.time()
526
+ cache = MODEL_CACHE["openrouter"]
527
+
528
+ # Önbellek yenileme koşulları:
529
+ # 1. Zorla yenileme istenmiş
530
+ # 2. Önbellek boş
531
+ # 3. Önbellek güncellenme zamanı aşılmış
532
+ if (force_refresh or
533
+ not cache["models"] or
534
+ current_time - cache["last_updated"] > cache["update_interval"]):
535
+
536
+ # API'den modelleri çek
537
+ api_models = self.fetch_models_from_api()
538
+
539
+ if api_models:
540
+ # API'den modeller başarıyla çekildiyse önbelleği güncelle
541
+ all_models = list(set(api_models + OPENROUTER_MODELS))
542
+
543
+ # Varsayılan modelleri önceliklendir
544
+ sorted_models = sorted(
545
+ all_models,
546
+ key=lambda x: (
547
+ 0 if x in OPENROUTER_MODELS else 1,
548
+ OPENROUTER_MODELS.index(x) if x in OPENROUTER_MODELS else float('inf')
549
+ )
550
+ )
551
+
552
+ # Önbelleği güncelle
553
+ MODEL_CACHE["openrouter"]["models"] = sorted_models
554
+ MODEL_CACHE["openrouter"]["last_updated"] = current_time
555
+
556
+ # Önbelleği diske kaydet
557
+ save_model_cache()
558
+
559
+ return sorted_models
560
+ else:
561
+ # API'den model çekilemediyse önbellekteki modelleri kullan
562
+ if cache["models"]:
563
+ return cache["models"]
564
+ else:
565
+ return OPENROUTER_MODELS
566
+ else:
567
+ # Önbellek güncel, önbellekteki modelleri kullan
568
+ return cache["models"] if cache["models"] else OPENROUTER_MODELS
569
+
570
+ def generate_response(self, prompt: str, model: str = "openai/gpt-4-turbo", temperature: float = 0.7, max_tokens: int = 2000) -> Dict[str, Any]:
571
+ """
572
+ OpenRouter API kullanarak yanıt oluşturur.
573
+
574
+ Args:
575
+ prompt (str): Gönderilecek prompt
576
+ model (str): Kullanılacak model
577
+ temperature (float): Sıcaklık değeri (0.0-1.0)
578
+ max_tokens (int): Maksimum token sayısı
579
+
580
+ Returns:
581
+ Dict[str, Any]: Yanıt bilgilerini içeren sözlük
582
+ """
583
+ if not self.api_key:
584
+ return {"success": False, "error": "OpenRouter API anahtarı ayarlanmamış.", "content": ""}
585
+
586
+ try:
587
+ headers = {
588
+ "Content-Type": "application/json",
589
+ "Authorization": f"Bearer {self.api_key}"
590
+ }
591
+
592
+ data = {
593
+ "model": model,
594
+ "messages": [{"role": "user", "content": prompt}],
595
+ "temperature": temperature,
596
+ "max_tokens": max_tokens
597
+ }
598
+
599
+ response = requests.post(
600
+ f"{self.base_url}/chat/completions",
601
+ headers=headers,
602
+ json=data
603
+ )
604
+
605
+ if response.status_code == 200:
606
+ response_data = response.json()
607
+ return {
608
+ "success": True,
609
+ "content": response_data["choices"][0]["message"]["content"],
610
+ "model": model,
611
+ "usage": response_data.get("usage", {})
612
+ }
613
+ else:
614
+ return {
615
+ "success": False,
616
+ "error": f"HTTP {response.status_code}: {response.text}",
617
+ "content": ""
618
+ }
619
+ except Exception as e:
620
+ return {"success": False, "error": str(e), "content": ""}
621
+
622
+
623
+ # Arka planda model listelerini güncelleyen fonksiyon
624
+ def background_model_updater():
625
+ """
626
+ Arka planda çalışarak model listelerini periyodik olarak günceller.
627
+ """
628
+ while True:
629
+ try:
630
+ # Her sağlayıcı için modelleri güncelle
631
+ if openai_handler.api_key:
632
+ openai_handler.get_available_models(force_refresh=True)
633
+
634
+ if gemini_handler.api_key:
635
+ gemini_handler.get_available_models(force_refresh=True)
636
+
637
+ if openrouter_handler.api_key:
638
+ openrouter_handler.get_available_models(force_refresh=True)
639
+
640
+ print("Model listeleri arka planda güncellendi")
641
+
642
+ # 1 saat bekle
643
+ time.sleep(3600)
644
+ except Exception as e:
645
+ print(f"Arka plan model güncelleyicisinde hata: {str(e)}")
646
+ time.sleep(60) # Hata durumunda 1 dakika bekle ve tekrar dene
647
+
648
+
649
+ # API işleyicilerini oluştur
650
+ api_manager = APIManager()
651
+ openai_handler = OpenAIHandler()
652
+ gemini_handler = GeminiHandler()
653
+ openrouter_handler = OpenRouterHandler()
654
+
655
+ # API anahtarlarını ayarla (varsa)
656
+ openai_api_key = os.getenv("OPENAI_API_KEY", "")
657
+ gemini_api_key = os.getenv("GEMINI_API_KEY", "")
658
+ openrouter_api_key = os.getenv("OPENROUTER_API_KEY", "")
659
+
660
+ if openai_api_key:
661
+ openai_handler.set_api_key(openai_api_key)
662
+
663
+ if gemini_api_key:
664
+ gemini_handler.set_api_key(gemini_api_key)
665
+
666
+ if openrouter_api_key:
667
+ openrouter_handler.set_api_key(openrouter_api_key)
668
+
669
+ # Arka plan model güncelleyicisini başlat
670
+ updater_thread = threading.Thread(target=background_model_updater, daemon=True)
671
+ updater_thread.start()
672
+
673
+ # Test fonksiyonu
674
+ def test_api_connections():
675
+ """
676
+ API bağlantılarını test eder.
677
+ """
678
+ print("API Bağlantı Testi:")
679
+
680
+ # OpenAI API testi
681
+ if openai_api_key:
682
+ print("\nOpenAI API Testi:")
683
+ try:
684
+ models = openai_handler.get_available_models(force_refresh=True)
685
+ print(f"Kullanılabilir modeller: {models[:5]}...")
686
+ print("OpenAI API bağlantısı başarılı.")
687
+ except Exception as e:
688
+ print(f"OpenAI API hatası: {str(e)}")
689
+ else:
690
+ print("\nOpenAI API anahtarı ayarlanmamış.")
691
+ print(f"Varsayılan modeller: {OPENAI_MODELS}")
692
+
693
+ # Gemini API testi
694
+ if gemini_api_key:
695
+ print("\nGemini API Testi:")
696
+ try:
697
+ models = gemini_handler.get_available_models(force_refresh=True)
698
+ print(f"Kullanılabilir modeller: {models}")
699
+ print("Gemini API bağlantısı başarılı.")
700
+ except Exception as e:
701
+ print(f"Gemini API hatası: {str(e)}")
702
+ else:
703
+ print("\nGemini API anahtarı ayarlanmamış.")
704
+ print(f"Varsayılan modeller: {GEMINI_MODELS}")
705
+
706
+ # OpenRouter API testi
707
+ if openrouter_api_key:
708
+ print("\nOpenRouter API Testi:")
709
+ try:
710
+ models = openrouter_handler.get_available_models(force_refresh=True)
711
+ print(f"Kullanılabilir modeller: {len(models)} model bulundu")
712
+ print(f"İlk 10 model: {models[:10]}...")
713
+ print("OpenRouter API bağlantısı başarılı.")
714
+ except Exception as e:
715
+ print(f"OpenRouter API hatası: {str(e)}")
716
+ else:
717
+ print("\nOpenRouter API anahtarı ayarlanmamış.")
718
+ print(f"Varsayılan modeller: {len(OPENROUTER_MODELS)} model bulundu")
719
+ print(f"İlk 10 model: {OPENROUTER_MODELS[:10]}...")
720
+
721
+ if __name__ == "__main__":
722
+ test_api_connections()
test_dynamic_models.py ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ API entegrasyonlarını test etmek için script.
3
+ Bu script, dinamik model keşfi özelliğini test eder.
4
+ """
5
+
6
+ import os
7
+ import time
8
+ from api_integrations import (
9
+ api_manager,
10
+ openai_handler,
11
+ gemini_handler,
12
+ openrouter_handler,
13
+ MODEL_CACHE,
14
+ load_model_cache,
15
+ save_model_cache
16
+ )
17
+
18
+ def test_dynamic_model_discovery():
19
+ """
20
+ Dinamik model keşfi özelliğini test eder.
21
+ """
22
+ print("Dinamik Model Keşfi Testi\n" + "="*30)
23
+
24
+ # Mevcut önbellek durumunu göster
25
+ print("\nMevcut Önbellek Durumu:")
26
+ for provider in MODEL_CACHE:
27
+ model_count = len(MODEL_CACHE[provider]["models"])
28
+ last_updated = MODEL_CACHE[provider]["last_updated"]
29
+ last_updated_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_updated)) if last_updated > 0 else "Hiç güncellenmemiş"
30
+
31
+ print(f"{provider.capitalize()}: {model_count} model, Son güncelleme: {last_updated_str}")
32
+
33
+ # OpenAI modellerini test et
34
+ print("\nOpenAI Modelleri Testi:")
35
+ if openai_handler.api_key:
36
+ print("API anahtarı mevcut, API'den modelleri çekme...")
37
+ models = openai_handler.get_available_models(force_refresh=True)
38
+ print(f"Toplam {len(models)} model bulundu.")
39
+ print(f"İlk 10 model: {models[:10]}")
40
+ else:
41
+ print("API anahtarı mevcut değil, varsayılan modeller kullanılacak.")
42
+ models = openai_handler.get_available_models()
43
+ print(f"Toplam {len(models)} model bulundu.")
44
+ print(f"Modeller: {models}")
45
+
46
+ # Gemini modellerini test et
47
+ print("\nGemini Modelleri Testi:")
48
+ if gemini_handler.api_key:
49
+ print("API anahtarı mevcut, API'den modelleri çekme...")
50
+ models = gemini_handler.get_available_models(force_refresh=True)
51
+ print(f"Toplam {len(models)} model bulundu.")
52
+ print(f"Modeller: {models}")
53
+ else:
54
+ print("API anahtarı mevcut değil, varsayılan modeller kullanılacak.")
55
+ models = gemini_handler.get_available_models()
56
+ print(f"Toplam {len(models)} model bulundu.")
57
+ print(f"Modeller: {models}")
58
+
59
+ # OpenRouter modellerini test et
60
+ print("\nOpenRouter Modelleri Testi:")
61
+ if openrouter_handler.api_key:
62
+ print("API anahtarı mevcut, API'den modelleri çekme...")
63
+ models = openrouter_handler.get_available_models(force_refresh=True)
64
+ print(f"Toplam {len(models)} model bulundu.")
65
+ print(f"İlk 10 model: {models[:10]}")
66
+ else:
67
+ print("API anahtarı mevcut değil, varsayılan modeller kullanılacak.")
68
+ models = openrouter_handler.get_available_models()
69
+ print(f"Toplam {len(models)} model bulundu.")
70
+ print(f"İlk 10 model: {models[:10]}")
71
+
72
+ # Önbellek dosyasını kontrol et
73
+ cache_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "model_cache.json")
74
+ if os.path.exists(cache_file_path):
75
+ print(f"\nÖnbellek dosyası mevcut: {cache_file_path}")
76
+ print(f"Dosya boyutu: {os.path.getsize(cache_file_path)} byte")
77
+ else:
78
+ print(f"\nÖnbellek dosyası henüz oluşturulmamış: {cache_file_path}")
79
+
80
+ # Önbellek yeniden yükleme testi
81
+ print("\nÖnbellek Yeniden Yükleme Testi:")
82
+ load_model_cache()
83
+ for provider in MODEL_CACHE:
84
+ model_count = len(MODEL_CACHE[provider]["models"])
85
+ last_updated = MODEL_CACHE[provider]["last_updated"]
86
+ last_updated_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_updated)) if last_updated > 0 else "Hiç güncellenmemiş"
87
+
88
+ print(f"{provider.capitalize()}: {model_count} model, Son güncelleme: {last_updated_str}")
89
+
90
+ print("\nTest tamamlandı!")
91
+
92
+ if __name__ == "__main__":
93
+ test_dynamic_model_discovery()