kayrahan commited on
Commit
8946371
·
verified ·
1 Parent(s): 75f4237

Upload 18 files

Browse files
.env ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # API Anahtarları
2
+ GEMINI_API_KEY=AIzaSyDiXr0ILlZ7mD3zLlWKisBXaqRlP0EfxzA
3
+ OPENROUTER_API_KEY=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
.gitattributes CHANGED
@@ -1,35 +1,35 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,14 +1,74 @@
1
- ---
2
- title: Promtmuhendisi
3
- emoji: 📈
4
- colorFrom: purple
5
- colorTo: red
6
- sdk: streamlit
7
- sdk_version: 1.44.1
8
- app_file: app.py
9
- pinned: false
10
- license: mit
11
- short_description: promtmuhendisi
12
- ---
13
-
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Prompt Mühendisi Chatbot
3
+ emoji: 🤖
4
+ colorFrom: blue
5
+ colorTo: indigo
6
+ sdk: streamlit
7
+ sdk_version: 1.44.1
8
+ app_file: app.py
9
+ pinned: false
10
+ ---
11
+
12
+ # Prompt Mühendisi Chatbot - Hugging Face Deployment Kılavuzu
13
+
14
+ Bu belge, Prompt Mühendisi Chatbot'un Hugging Face'de nasıl deploy edileceğini açıklar.
15
+
16
+ ## Proje Hakkında
17
+
18
+ Prompt Mühendisi Chatbot, kullanıcıların isteklerini profesyonel ve detaylı promptlara dönüştüren bir araçtır. Kullanıcılar, yapmak istedikleri şeyi (örneğin bir web sitesi geliştirme) anlatır ve chatbot bunu adım adım, detaylı bir prompta dönüştürür.
19
+
20
+ ### Özellikler
21
+
22
+ - Farklı senaryolar için özelleştirilmiş prompt şablonları
23
+ - OpenAI, Google Gemini ve OpenRouter API entegrasyonları
24
+ - Kullanıcı dostu Streamlit arayüzü
25
+ - Oluşturulan promptları test etme imkanı
26
+
27
+ ## Dosya Yapısı
28
+
29
+ ```
30
+ prompt_engineer_chatbot/
31
+ ├── app.py # Ana uygulama dosyası
32
+ ├── prompt_templates.py # Prompt şablonları ve yardımcı fonksiyonlar
33
+ ├── chatbot_backend.py # Chatbot backend işlevselliği
34
+ ├── api_integrations.py # API entegrasyonları
35
+ ├── streamlit_ui.py # Streamlit kullanıcı arayüzü
36
+ └── requirements.txt # Bağımlılıklar
37
+ ```
38
+
39
+ ## Hugging Face'de Deployment
40
+
41
+ 1. Hugging Face hesabınıza giriş yapın
42
+ 2. Yeni bir Space oluşturun
43
+ 3. Space türü olarak "Streamlit" seçin
44
+ 4. Bu repo'daki dosyaları Space'inize yükleyin
45
+ 5. Space'iniz otomatik olarak deploy edilecektir
46
+
47
+ ## Kullanım
48
+
49
+ 1. Uygulamaya erişin
50
+ 2. API anahtarlarınızı girin (OpenAI, Gemini veya OpenRouter)
51
+ 3. Ne yapmak istediğinizi detaylı bir şekilde anlatın
52
+ 4. "Prompt Oluştur" butonuna tıklayın
53
+ 5. Oluşturulan promptu kopyalayın veya API ile test edin
54
+
55
+ ## Geliştirme
56
+
57
+ ### Yerel Kurulum
58
+
59
+ ```bash
60
+ git clone <repo-url>
61
+ cd prompt_engineer_chatbot
62
+ pip install -r requirements.txt
63
+ streamlit run app.py
64
+ ```
65
+
66
+ ### Yeni Prompt Şablonları Ekleme
67
+
68
+ `prompt_templates.py` dosyasında `PROMPT_TEMPLATES` sözlüğüne yeni şablonlar ekleyebilirsiniz.
69
+
70
+ ## Notlar
71
+
72
+ - API anahtarları kullanıcı tarafından sağlanmalıdır
73
+ - Uygulama, API anahtarlarını sadece oturum süresince saklar
74
+ - Hugging Face'de deploy edildiğinde, kullanıcılar kendi API anahtarlarını kullanmalıdır
__pycache__/ai_prompt_generator.cpython-313.pyc ADDED
Binary file (15.7 kB). View file
 
__pycache__/api_integrations.cpython-313.pyc ADDED
Binary file (25.7 kB). View file
 
__pycache__/chatbot_backend.cpython-313.pyc ADDED
Binary file (18.3 kB). View file
 
__pycache__/prompt_templates.cpython-313.pyc ADDED
Binary file (45.1 kB). View file
 
__pycache__/streamlit_ui.cpython-313.pyc ADDED
Binary file (63.6 kB). View file
 
ai_prompt_generator.py ADDED
@@ -0,0 +1,421 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ AI destekli dinamik prompt oluşturucu.
3
+ Bu modül, kullanıcı girdisine göre tamamen dinamik promptlar oluşturur.
4
+ """
5
+
6
+ import os
7
+ from typing import Dict, Any, Tuple, List, Optional
8
+ import openai
9
+ from google import generativeai as genai
10
+ import requests
11
+ from dotenv import load_dotenv, find_dotenv
12
+
13
+ # Özel .env dosyası yükleme fonksiyonu
14
+ def load_env_safely():
15
+ """
16
+ .env dosyasını güvenli bir şekilde yükler, farklı karakter kodlamalarını deneyerek.
17
+ """
18
+ try:
19
+ # .env dosyasının yolunu bul
20
+ dotenv_path = find_dotenv()
21
+
22
+ # .env dosyası yoksa hemen çık
23
+ if not dotenv_path or not os.path.exists(dotenv_path):
24
+ return
25
+
26
+ # Çevre değişkenleri
27
+ env_vars = {}
28
+
29
+ try:
30
+ # Önce UTF-8 ile dene
31
+ with open(dotenv_path, "r", encoding="utf-8") as f:
32
+ lines = f.readlines()
33
+ except UnicodeDecodeError:
34
+ try:
35
+ # UTF-8 başarısız olursa Latin-1 ile dene
36
+ with open(dotenv_path, "r", encoding="latin-1") as f:
37
+ lines = f.readlines()
38
+ except Exception:
39
+ # Her şey başarısız olursa, .env'yi yüklemeyi atla
40
+ print("Uyarı: .env dosyası okunamadı, API anahtarları yüklenemedi.")
41
+ return
42
+
43
+ # Dosya içeriğini işle
44
+ for line in lines:
45
+ line = line.strip()
46
+ if line and not line.startswith("#") and "=" in line:
47
+ key, value = line.split("=", 1)
48
+ key = key.strip()
49
+ value = value.strip().strip('"\'')
50
+
51
+ # Değişkeni ortam değişkenlerine ekle
52
+ os.environ[key] = value
53
+
54
+ except Exception as e:
55
+ print(f"Uyarı: .env dosyası yüklenirken hata oluştu: {str(e)}")
56
+
57
+ # .env dosyasını güvenli bir şekilde yükle
58
+ load_env_safely()
59
+
60
+ class AIPromptGenerator:
61
+ """
62
+ AI destekli dinamik prompt oluşturucu sınıfı.
63
+ Bu sınıf, kullanıcı girdisine göre yapay zeka kullanarak dinamik promptlar oluşturur.
64
+ """
65
+
66
+ def __init__(self, openai_api_key=None, gemini_api_key=None, openrouter_api_key=None):
67
+ """AI tabanlı prompt oluşturucu sınıfı.
68
+
69
+ Args:
70
+ openai_api_key (str, optional): OpenAI API anahtarı. Defaults to None.
71
+ gemini_api_key (str, optional): Google Gemini API anahtarı. Defaults to None.
72
+ openrouter_api_key (str, optional): OpenRouter API anahtarı. Defaults to None.
73
+ """
74
+ self.openai_api_key = openai_api_key
75
+ self.gemini_api_key = gemini_api_key
76
+ self.openrouter_api_key = openrouter_api_key
77
+
78
+ # API anahtarlarını ayarla (varsa)
79
+ if self.openai_api_key:
80
+ openai.api_key = self.openai_api_key
81
+
82
+ if self.gemini_api_key:
83
+ genai.configure(api_key=self.gemini_api_key)
84
+
85
+ def set_api_key(self, provider: str, api_key: str) -> None:
86
+ """
87
+ Belirli bir sağlayıcı için API anahtarını ayarlar.
88
+
89
+ Args:
90
+ provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
91
+ api_key (str): API anahtarı
92
+ """
93
+ if provider == "openai":
94
+ self.openai_api_key = api_key
95
+ openai.api_key = api_key
96
+ elif provider == "gemini":
97
+ self.gemini_api_key = api_key
98
+ genai.configure(api_key=api_key)
99
+ elif provider == "openrouter":
100
+ self.openrouter_api_key = api_key
101
+
102
+ def generate_with_openai(self, user_input: str, model: str = "gpt-3.5-turbo") -> Dict[str, Any]:
103
+ """
104
+ OpenAI API kullanarak dinamik prompt oluşturur.
105
+
106
+ Args:
107
+ user_input (str): Kullanıcı girdisi
108
+ model (str): Kullanılacak model
109
+
110
+ Returns:
111
+ Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler
112
+ """
113
+ if not self.openai_api_key:
114
+ return {"success": False, "error": "OpenAI API anahtarı ayarlanmamış.", "prompt": ""}
115
+
116
+ try:
117
+ system_message = """
118
+ Sen uzman bir prompt mühendisisin. Görevin, kullanıcının isteklerini son derece detaylı, spesifik ve kapsamlı bir prompta dönüştürmektir.
119
+
120
+ Kullanıcı sana ne yapmak istediğini anlatacak (örneğin bir web sitesi, mobil uygulama, oyun, veri analizi, görsel üretimi, video üretimi vb.).
121
+ Sen de bunu yapay zeka modellerine verilebilecek detaylı bir prompta dönüştüreceksin.
122
+
123
+ Oluşturduğun prompt şunları içermeli:
124
+ 1. Projenin/görevin çok net ve spesifik bir tanımı
125
+ 2. Teknik gereksinimler ve kısıtlamalar (programlama dilleri, framework'ler, API'ler, vb.)
126
+ 3. Kullanıcı deneyimi ve arayüz gereksinimleri
127
+ 4. Özel özellikler ve işlevsellikler (domain'e özgü detaylarla)
128
+ 5. Adım adım uygulama talimatları
129
+ 6. Beklenen çıktının detaylı açıklaması
130
+ 7. Kalite kriterleri ve test gereksinimleri
131
+ 8. Referans olabilecek örnekler veya kaynaklar
132
+
133
+ Önemli kurallar:
134
+ - Asla genel şablonlar kullanma, her prompt tamamen kullanıcının spesifik isteğine göre özelleştirilmiş olmalı
135
+ - Kullanıcının belirttiği alana özgü teknik detaylar ve terminoloji kullan
136
+ - Prompt içeriğini zenginleştirmek için kendi teknik bilgini kullan
137
+ - Örneğin, hava durumu uygulaması için OpenWeatherMap API, geolocation, hava tahmin algoritmaları, sıcaklık/nem/basınç göstergeleri gibi spesifik detaylar ekle
138
+ - E-ticaret için ödeme işleme API'leri, sepet yönetimi, ürün filtreleme, kullanıcı yorumları gibi spesifik özellikler belirt
139
+ - Veri analizi için veri temizleme teknikleri, istatistiksel modeller, görselleştirme kütüphaneleri gibi spesifik araçlar öner
140
+
141
+ Promptu yapılandırırken bölümlere ayır, başlıklar kullan ve numaralandırılmış listeler oluştur.
142
+ """
143
+
144
+ try:
145
+ openai.api_key = self.openai_api_key
146
+ response = openai.chat.completions.create(
147
+ model=model,
148
+ messages=[
149
+ {"role": "system", "content": system_message},
150
+ {"role": "user", "content": f"Şu konuda çok detaylı ve spesifik bir prompt oluştur: {user_input}"}
151
+ ],
152
+ temperature=0.7,
153
+ max_tokens=3000
154
+ )
155
+
156
+ return {
157
+ "success": True,
158
+ "prompt": response.choices[0].message.content,
159
+ "model": model
160
+ }
161
+ except openai.OpenAIError as e:
162
+ return {"success": False, "error": f"OpenAI API hatası: {str(e)}", "prompt": ""}
163
+ except Exception as e:
164
+ return {"success": False, "error": f"Beklenmeyen hata: {str(e)}", "prompt": ""}
165
+
166
+ def generate_with_gemini(self, user_input: str, model: str = "gemini-1.5-pro") -> Dict[str, Any]:
167
+ """
168
+ Google Gemini API kullanarak dinamik prompt oluşturur.
169
+
170
+ Args:
171
+ user_input (str): Kullanıcı girdisi
172
+ model (str): Kullanılacak model
173
+
174
+ Returns:
175
+ Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler
176
+ """
177
+ if not self.gemini_api_key:
178
+ return {"success": False, "error": "Gemini API anahtarı ayarlanmamış.", "prompt": ""}
179
+
180
+ try:
181
+ system_prompt = """
182
+ Sen uzman bir prompt mühendisisin. Görevin, kullanıcının isteklerini son derece detaylı, spesifik ve kapsamlı bir prompta dönüştürmektir.
183
+
184
+ Kullanıcı sana ne yapmak istediğini anlatacak (örneğin bir web sitesi, mobil uygulama, oyun, veri analizi, görsel üretimi, video üretimi vb.).
185
+ Sen de bunu yapay zeka modellerine verilebilecek detaylı bir prompta dönüştüreceksin.
186
+
187
+ Oluşturduğun prompt şunları içermeli:
188
+ 1. Projenin/görevin çok net ve spesifik bir tanımı
189
+ 2. Teknik gereksinimler ve kısıtlamalar (programlama dilleri, framework'ler, API'ler, vb.)
190
+ 3. Kullanıcı deneyimi ve arayüz gereksinimleri
191
+ 4. Özel özellikler ve işlevsellikler (domain'e özgü detaylarla)
192
+ 5. Adım adım uygulama talimatları
193
+ 6. Beklenen çıktının detaylı açıklaması
194
+ 7. Kalite kriterleri ve test gereksinimleri
195
+ 8. Referans olabilecek örnekler veya kaynaklar
196
+
197
+ Önemli kurallar:
198
+ - Asla genel şablonlar kullanma, her prompt tamamen kullanıcının spesifik isteğine göre özelleştirilmiş olmalı
199
+ - Kullanıcının belirttiği alana özgü teknik detaylar ve terminoloji kullan
200
+ - Prompt içeriğini zenginleştirmek için kendi teknik bilgini kullan
201
+ - Örneğin, hava durumu uygulaması için OpenWeatherMap API, geolocation, hava tahmin algoritmaları, sıcaklık/nem/basınç göstergeleri gibi spesifik detaylar ekle
202
+ - E-ticaret için ödeme işleme API'leri, sepet yönetimi, ürün filtreleme, kullanıcı yorumları gibi spesifik özellikler belirt
203
+ - Veri analizi için veri temizleme teknikleri, istatistiksel modeller, görselleştirme kütüphaneleri gibi spesifik araçlar öner
204
+
205
+ Promptu yapılandırırken bölümlere ayır, başlıklar kullan ve numaralandırılmış listeler olu��tur.
206
+ """
207
+
208
+ try:
209
+ genai.configure(api_key=self.gemini_api_key)
210
+ model_obj = genai.GenerativeModel(model)
211
+ response = model_obj.generate_content([
212
+ system_prompt,
213
+ f"Şu konuda çok detaylı ve spesifik bir prompt oluştur: {user_input}"
214
+ ],
215
+ generation_config=genai.types.GenerationConfig(
216
+ temperature=0.7,
217
+ max_output_tokens=3000
218
+ ))
219
+
220
+ return {
221
+ "success": True,
222
+ "prompt": response.text,
223
+ "model": model
224
+ }
225
+ except Exception as e:
226
+ return {"success": False, "error": f"Gemini API hatası: {str(e)}", "prompt": ""}
227
+ except Exception as e:
228
+ return {"success": False, "error": f"Beklenmeyen hata: {str(e)}", "prompt": ""}
229
+
230
+ def generate_with_openrouter(self, user_input: str, model: str = "openai/gpt-4-turbo") -> Dict[str, Any]:
231
+ """
232
+ OpenRouter API kullanarak dinamik prompt oluşturur.
233
+
234
+ Args:
235
+ user_input (str): Kullanıcı girdisi
236
+ model (str): Kullanılacak model
237
+
238
+ Returns:
239
+ Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler
240
+ """
241
+ if not self.openrouter_api_key:
242
+ return {"success": False, "error": "OpenRouter API anahtarı ayarlanmamış.", "prompt": ""}
243
+
244
+ try:
245
+ system_message = """
246
+ Sen uzman bir prompt mühendisisin. Görevin, kullanıcının isteklerini son derece detaylı, spesifik ve kapsamlı bir prompta dönüştürmektir.
247
+
248
+ Kullanıcı sana ne yapmak istediğini anlatacak (örneğin bir web sitesi, mobil uygulama, oyun, veri analizi, görsel üretimi, video üretimi vb.).
249
+ Sen de bunu yapay zeka modellerine verilebilecek detaylı bir prompta dönüştüreceksin.
250
+
251
+ Oluşturduğun prompt şunları içermeli:
252
+ 1. Projenin/görevin çok net ve spesifik bir tanımı
253
+ 2. Teknik gereksinimler ve kısıtlamalar (programlama dilleri, framework'ler, API'ler, vb.)
254
+ 3. Kullanıcı deneyimi ve arayüz gereksinimleri
255
+ 4. Özel özellikler ve işlevsellikler (domain'e özgü detaylarla)
256
+ 5. Adım adım uygulama talimatları
257
+ 6. Beklenen çıktının detaylı açıklaması
258
+ 7. Kalite kriterleri ve test gereksinimleri
259
+ 8. Referans olabilecek örnekler veya kaynaklar
260
+
261
+ Önemli kurallar:
262
+ - Asla genel şablonlar kullanma, her prompt tamamen kullanıcının spesifik isteğine göre özelleştirilmiş olmalı
263
+ - Kullanıcının belirttiği alana özgü teknik detaylar ve terminoloji kullan
264
+ - Prompt içeriğini zenginleştirmek için kendi teknik bilgini kullan
265
+ - Örneğin, hava durumu uygulaması için OpenWeatherMap API, geolocation, hava tahmin algoritmaları, sıcaklık/nem/basınç göstergeleri gibi spesifik detaylar ekle
266
+ - E-ticaret için ödeme işleme API'leri, sepet yönetimi, ürün filtreleme, kullanıcı yorumları gibi spesifik özellikler belirt
267
+ - Veri analizi için veri temizleme teknikleri, istatistiksel modeller, görselleştirme kütüphaneleri gibi spesifik araçlar öner
268
+
269
+ Promptu yapılandırırken bölümlere ayır, başlıklar kullan ve numaralandırılmış listeler oluştur.
270
+ """
271
+
272
+ headers = {
273
+ "Content-Type": "application/json",
274
+ "Authorization": f"Bearer {self.openrouter_api_key}"
275
+ }
276
+
277
+ data = {
278
+ "model": model,
279
+ "messages": [
280
+ {"role": "system", "content": system_message},
281
+ {"role": "user", "content": f"Şu konuda çok detaylı ve spesifik bir prompt oluştur: {user_input}"}
282
+ ],
283
+ "temperature": 0.7,
284
+ "max_tokens": 3000
285
+ }
286
+
287
+ response = requests.post(
288
+ "https://openrouter.ai/api/v1/chat/completions",
289
+ headers=headers,
290
+ json=data
291
+ )
292
+
293
+ if response.status_code == 200:
294
+ response_data = response.json()
295
+ return {
296
+ "success": True,
297
+ "prompt": response_data["choices"][0]["message"]["content"],
298
+ "model": model
299
+ }
300
+ else:
301
+ return {
302
+ "success": False,
303
+ "error": f"HTTP {response.status_code}: {response.text}",
304
+ "prompt": ""
305
+ }
306
+ except Exception as e:
307
+ return {"success": False, "error": str(e), "prompt": ""}
308
+
309
+ def generate_prompt(self, user_input: str, provider: str, model: Optional[str] = None) -> Dict[str, Any]:
310
+ """
311
+ Belirli bir sağlayıcı ve model kullanarak dinamik prompt oluşturur.
312
+
313
+ Args:
314
+ user_input (str): Kullanıcı girdisi
315
+ provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
316
+ model (str, optional): Kullanılacak model
317
+
318
+ Returns:
319
+ Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler
320
+ """
321
+ try:
322
+ # Kullanıcının belirttiği özel teknolojilere vurgu yapalım
323
+ user_input_lower = user_input.lower()
324
+ enhanced_user_input = user_input
325
+
326
+ # Frontend teknolojileri için vurgu
327
+ if "bootstrap" in user_input_lower:
328
+ enhanced_user_input += "\n\nNOT: Bootstrap framework'ü mutlaka kullanılmalıdır. Tasarım Bootstrap bileşenlerini içermelidir."
329
+ if "react" in user_input_lower:
330
+ enhanced_user_input += "\n\nNOT: React kütüphanesi mutlaka kullanılmalıdır. JSX ve React bileşenleri ile uygulama oluşturulmalıdır."
331
+ if "vue" in user_input_lower:
332
+ enhanced_user_input += "\n\nNOT: Vue.js framework'ü mutlaka kullanılmalıdır. Vue bileşenleri ve direktifleri ile uygulama oluşturulmalıdır."
333
+ if "angular" in user_input_lower:
334
+ enhanced_user_input += "\n\nNOT: Angular framework'ü mutlaka kullanılmalıdır. Angular bileşenleri, modülleri ve servisleri ile uygulama oluşturulmalıdır."
335
+ if "tailwind" in user_input_lower:
336
+ enhanced_user_input += "\n\nNOT: Tailwind CSS mutlaka kullanılmalıdır. Tasarım Tailwind utility sınıfları ile oluşturulmalıdır."
337
+
338
+ # API anahtarını kontrol et
339
+ if provider == "openai" and not self.openai_api_key:
340
+ return {
341
+ "success": False,
342
+ "error": "OpenAI API anahtarı ayarlanmamış."
343
+ }
344
+ elif provider == "gemini" and not self.gemini_api_key:
345
+ return {
346
+ "success": False,
347
+ "error": "Google Gemini API anahtarı ayarlanmamış."
348
+ }
349
+ elif provider == "openrouter" and not self.openrouter_api_key:
350
+ return {
351
+ "success": False,
352
+ "error": "OpenRouter API anahtarı ayarlanmamış."
353
+ }
354
+
355
+ # OpenAI ile prompt oluştur
356
+ if provider == "openai":
357
+ if model is None:
358
+ model = "gpt-3.5-turbo"
359
+ return self.generate_with_openai(enhanced_user_input, model)
360
+ elif provider == "gemini":
361
+ if model is None:
362
+ model = "gemini-1.5-pro"
363
+ return self.generate_with_gemini(enhanced_user_input, model)
364
+ elif provider == "openrouter":
365
+ if model is None:
366
+ model = "anthropic/claude-3-opus" if self.openrouter_api_key else "openai/gpt-4-turbo"
367
+ return self.generate_with_openrouter(enhanced_user_input, model)
368
+ else:
369
+ return {"success": False, "error": "Geçersiz sağlayıcı. Lütfen 'openai', 'gemini' veya 'openrouter' seçin.", "prompt": ""}
370
+ except Exception as e:
371
+ return {"success": False, "error": f"Prompt oluşturma hatası: {str(e)}", "prompt": ""}
372
+
373
+ # Test fonksiyonu
374
+ def test_ai_prompt_generator():
375
+ """
376
+ AI prompt oluşturucuyu test eder.
377
+ """
378
+ generator = AIPromptGenerator()
379
+
380
+ # Test girdileri
381
+ test_inputs = [
382
+ "Bir hava durumu uygulaması yapmak istiyorum",
383
+ "Bir e-ticaret web sitesi geliştirmek istiyorum",
384
+ "Veri analizi için bir dashboard oluşturmak istiyorum"
385
+ ]
386
+
387
+ # OpenAI API anahtarı varsa test et
388
+ if generator.openai_api_key:
389
+ print("OpenAI ile test:")
390
+ for input_text in test_inputs:
391
+ print(f"\nTest girdisi: {input_text}")
392
+ result = generator.generate_prompt(input_text, "openai", "gpt-4o")
393
+ if result["success"]:
394
+ print(f"Oluşturulan prompt (ilk 300 karakter):\n{result['prompt'][:300]}...")
395
+ else:
396
+ print(f"Hata: {result['error']}")
397
+
398
+ # Gemini API anahtarı varsa test et
399
+ if generator.gemini_api_key:
400
+ print("\nGemini ile test:")
401
+ for input_text in test_inputs:
402
+ print(f"\nTest girdisi: {input_text}")
403
+ result = generator.generate_prompt(input_text, "gemini")
404
+ if result["success"]:
405
+ print(f"Oluşturulan prompt (ilk 300 karakter):\n{result['prompt'][:300]}...")
406
+ else:
407
+ print(f"Hata: {result['error']}")
408
+
409
+ # OpenRouter API anahtarı varsa test et
410
+ if generator.openrouter_api_key:
411
+ print("\nOpenRouter ile test:")
412
+ for input_text in test_inputs:
413
+ print(f"\nTest girdisi: {input_text}")
414
+ result = generator.generate_prompt(input_text, "openrouter")
415
+ if result["success"]:
416
+ print(f"Oluşturulan prompt (ilk 300 karakter):\n{result['prompt'][:300]}...")
417
+ else:
418
+ print(f"Hata: {result['error']}")
419
+
420
+ if __name__ == "__main__":
421
+ test_ai_prompt_generator()
api_integrations.py ADDED
@@ -0,0 +1,740 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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, set_key
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ı latin-1 encoding ile yükle
20
+ load_dotenv(encoding="latin-1")
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()
723
+
724
+ def load_api_keys():
725
+ """API anahtarlarını .env dosyasından yükler"""
726
+ try:
727
+ load_dotenv(encoding="latin-1")
728
+
729
+ openai_api_key = os.getenv('OPENAI_API_KEY')
730
+ gemini_api_key = os.getenv('GEMINI_API_KEY')
731
+ openrouter_api_key = os.getenv('OPENROUTER_API_KEY')
732
+
733
+ return {
734
+ 'openai': openai_api_key,
735
+ 'gemini': gemini_api_key,
736
+ 'openrouter': openrouter_api_key
737
+ }
738
+ except Exception as e:
739
+ st.error(f"API anahtarları yüklenirken hata oluştu: {e}")
740
+ return {'openai': None, 'gemini': None, 'openrouter': None}
app.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Prompt Mühendisi Chatbot - Ana Uygulama Dosyası
3
+ Bu dosya, Hugging Face'de deployment için ana giriş noktasıdır.
4
+ """
5
+
6
+ import streamlit as st
7
+ import os
8
+ from dotenv import load_dotenv
9
+
10
+ # Kendi modüllerimizi içe aktar
11
+ from prompt_templates import (
12
+ PROMPT_CATEGORIES,
13
+ predict_category,
14
+ extract_parameters,
15
+ create_prompt
16
+ )
17
+ from chatbot_backend import PromptEngineerChatbot
18
+ from api_integrations import (
19
+ APIManager,
20
+ OpenAIHandler,
21
+ GeminiHandler,
22
+ OpenRouterHandler
23
+ )
24
+ from streamlit_ui import main
25
+
26
+ # .env dosyasını yükle (varsa)
27
+ load_dotenv(encoding="latin-1")
28
+
29
+ # Ana uygulamayı çalıştır
30
+ if __name__ == "__main__":
31
+ main()
chatbot_backend.py ADDED
@@ -0,0 +1,460 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Chatbot backend işlevselliği.
3
+ Bu modül, kullanıcı girdisini işleyen ve dinamik promptlar oluşturan ana mantığı içerir.
4
+ """
5
+
6
+ import os
7
+ import json
8
+ import re
9
+ from typing import Dict, Any, Tuple, List, Optional
10
+ import openai
11
+ from google import generativeai as genai
12
+ import requests
13
+ from dotenv import load_dotenv
14
+
15
+ # Prompt şablonlarını içe aktar
16
+ from prompt_templates import (
17
+ PROMPT_CATEGORIES,
18
+ predict_category,
19
+ extract_parameters,
20
+ create_prompt
21
+ )
22
+
23
+ # AI Prompt Generator'ı içe aktar
24
+ from ai_prompt_generator import AIPromptGenerator, load_env_safely
25
+
26
+ # .env dosyasını güvenli şekilde yükle
27
+ # Not: ai_prompt_generator modülünde zaten yükleniyor, burada tekrar çağırmaya gerek yok
28
+ # load_env_safely()
29
+
30
+ class PromptEngineerChatbot:
31
+ """
32
+ Prompt mühendisliği chatbot sınıfı.
33
+ Bu sınıf, kullanıcı girdisini işleyerek dinamik promptlar oluşturur.
34
+ """
35
+
36
+ def __init__(self):
37
+ """
38
+ Chatbot'u başlat ve yapılandır.
39
+ """
40
+ self.conversation_history = []
41
+ self.current_category = None
42
+ self.current_params = None
43
+ self.ai_generator = AIPromptGenerator()
44
+
45
+ def process_input(self, user_input: str, use_ai_generation: bool = True, provider: str = "openai", model: Optional[str] = None) -> Tuple[str, str, Dict[str, Any]]:
46
+ """
47
+ Kullanıcı girdisini işler ve dinamik bir prompt oluşturur.
48
+
49
+ Args:
50
+ user_input (str): Kullanıcı girdisi
51
+ use_ai_generation (bool): AI destekli prompt oluşturmayı kullan
52
+ provider (str): AI sağlayıcısı ('openai', 'gemini', 'openrouter')
53
+ model (str, optional): Kullanılacak model
54
+
55
+ Returns:
56
+ Tuple[str, str, Dict[str, Any]]: Oluşturulan prompt, kategori ve parametreler
57
+ """
58
+ # Kullanıcı girdisini kaydet
59
+ self.conversation_history.append({"role": "user", "content": user_input})
60
+
61
+ # Kategori tahmini
62
+ category = predict_category(user_input)
63
+
64
+ # Parametreleri çıkar
65
+ params = extract_parameters(category, user_input)
66
+
67
+ # Mevcut kategori ve parametreleri güncelle
68
+ self.current_category = category
69
+ self.current_params = params
70
+
71
+ # AI destekli prompt oluşturma kullanılıyorsa
72
+ if use_ai_generation:
73
+ try:
74
+ # Şablon tabanlı promptu oluştur (referans için)
75
+ template_prompt = create_prompt(category, params)
76
+
77
+ # Kullanıcının belirttiği özel teknolojilere vurgu yapalım
78
+ user_input_lower = user_input.lower()
79
+ special_tech_notes = ""
80
+
81
+ if "bootstrap" in user_input_lower:
82
+ special_tech_notes += "\n- Bootstrap framework'ü kullanılmalıdır."
83
+ if "react" in user_input_lower:
84
+ special_tech_notes += "\n- React kütüphanesi kullanılmalıdır."
85
+ if "vue" in user_input_lower:
86
+ special_tech_notes += "\n- Vue.js framework'ü kullanılmalıdır."
87
+ if "angular" in user_input_lower:
88
+ special_tech_notes += "\n- Angular framework'ü kullanılmalıdır."
89
+ if "tailwind" in user_input_lower:
90
+ special_tech_notes += "\n- Tailwind CSS kullanılmalıdır."
91
+
92
+ # Özel teknoloji notları varsa ekleyelim
93
+ tech_emphasis = ""
94
+ if special_tech_notes:
95
+ tech_emphasis = f"\n\nÖNEMLİ TEKNOLOJİ GEREKSİNİMLERİ: {special_tech_notes}"
96
+
97
+ # Kategori bilgisini ve şablon promptu kullanarak daha spesifik bir AI prompt oluştur
98
+ enhanced_user_input = f"""
99
+ Kategori: {category}
100
+
101
+ Kullanıcı İsteği: {user_input}{tech_emphasis}
102
+
103
+ Lütfen bu istek için çok detaylı ve spesifik bir prompt oluştur.
104
+ Şablon olarak aşağıdaki yapıyı kullanabilirsin, ancak içeriği tamamen kullanıcının isteğine göre özelleştir ve çok daha detaylı hale getir:
105
+
106
+ {template_prompt}
107
+
108
+ Önemli: Yukarıdaki şablonu olduğu gibi kullanma, sadece yapı referansı olarak kullan.
109
+ İçeriği tamamen kullanıcının isteğine özel olarak oluştur ve çok daha detaylı, spesifik bilgiler ekle.
110
+ Örneğin, kullanıcı hava durumu uygulaması istiyorsa, hava durumu API'leri, hava verilerinin görselleştirilmesi,
111
+ hava tahminleri, konum takibi gibi spesifik detaylar ekle.
112
+ """
113
+
114
+ # API anahtarı kontrolü
115
+ if not self.ai_generator.openai_api_key and provider == "openai":
116
+ prompt = template_prompt
117
+ elif not self.ai_generator.gemini_api_key and provider == "gemini":
118
+ prompt = template_prompt
119
+ elif not self.ai_generator.openrouter_api_key and provider == "openrouter":
120
+ prompt = template_prompt
121
+ else:
122
+ # AI destekli prompt oluştur
123
+ result = self.ai_generator.generate_prompt(enhanced_user_input, provider, model)
124
+
125
+ if result["success"]:
126
+ prompt = result["prompt"]
127
+ else:
128
+ # Hata mesajını logla ve şablon promptu kullan
129
+ print(f"AI prompt oluşturma hatası: {result.get('error', 'Bilinmeyen hata')}")
130
+ prompt = template_prompt
131
+ except Exception as e:
132
+ print(f"Prompt oluşturma hatası: {str(e)}")
133
+ # Hata durumunda şablon promptu kullan
134
+ prompt = create_prompt(category, params)
135
+ else:
136
+ # Şablon tabanlı prompt oluştur
137
+ prompt = create_prompt(category, params)
138
+
139
+ # Chatbot yanıtını kaydet
140
+ self.conversation_history.append({"role": "assistant", "content": prompt})
141
+
142
+ return prompt, category, params
143
+
144
+ def get_conversation_history(self) -> List[Dict[str, str]]:
145
+ """
146
+ Konuşma geçmişini döndürür.
147
+
148
+ Returns:
149
+ List[Dict[str, str]]: Konuşma geçmişi
150
+ """
151
+ return self.conversation_history
152
+
153
+ def clear_conversation_history(self) -> None:
154
+ """
155
+ Konuşma geçmişini temizler.
156
+ """
157
+ self.conversation_history = []
158
+ self.current_category = None
159
+ self.current_params = None
160
+
161
+
162
+ class AIModelInterface:
163
+ """
164
+ Farklı AI API'leri için arayüz sınıfı.
165
+ Bu sınıf, OpenAI, Google Gemini ve OpenRouter API'leri ile etkileşim sağlar.
166
+ """
167
+
168
+ def __init__(self):
169
+ """
170
+ AI model arayüzünü başlat.
171
+ """
172
+ self.api_keys = {
173
+ "openai": os.getenv("OPENAI_API_KEY", ""),
174
+ "gemini": os.getenv("GEMINI_API_KEY", ""),
175
+ "openrouter": os.getenv("OPENROUTER_API_KEY", "")
176
+ }
177
+
178
+ def set_api_key(self, provider: str, api_key: str) -> None:
179
+ """
180
+ Belirli bir sağlayıcı için API anahtarını ayarlar.
181
+
182
+ Args:
183
+ provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
184
+ api_key (str): API anahtarı
185
+ """
186
+ if provider in self.api_keys:
187
+ self.api_keys[provider] = api_key
188
+
189
+ def get_available_models(self, provider: str) -> List[str]:
190
+ """
191
+ Belirli bir sağlayıcı için kullanılabilir modelleri döndürür.
192
+
193
+ Args:
194
+ provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
195
+
196
+ Returns:
197
+ List[str]: Kullanılabilir modeller listesi
198
+ """
199
+ if provider == "openai":
200
+ return ["gpt-4o", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo"]
201
+ elif provider == "gemini":
202
+ return ["gemini-1.5-pro", "gemini-1.5-flash", "gemini-1.0-pro"]
203
+ elif provider == "openrouter":
204
+ return [
205
+ "openai/gpt-4o",
206
+ "openai/gpt-4-turbo",
207
+ "anthropic/claude-3-opus",
208
+ "anthropic/claude-3-sonnet",
209
+ "google/gemini-1.5-pro",
210
+ "meta-llama/llama-3-70b-instruct"
211
+ ]
212
+ return []
213
+
214
+ def generate_with_openai(self, prompt: str, model: str = "gpt-3.5-turbo", api_key: Optional[str] = None) -> str:
215
+ """
216
+ OpenAI API kullanarak yanıt oluşturur.
217
+
218
+ Args:
219
+ prompt (str): Gönderilecek prompt
220
+ model (str): Kullanılacak model
221
+ api_key (str, optional): Doğrudan kullanılacak API anahtarı
222
+
223
+ Returns:
224
+ str: Oluşturulan yanıt
225
+ """
226
+ # Doğrudan API anahtarı verilmişse onu kullan, yoksa saklanan anahtarı kullan
227
+ current_api_key = api_key if api_key else self.api_keys["openai"]
228
+
229
+ if not current_api_key:
230
+ return "OpenAI API anahtarı ayarlanmamış."
231
+
232
+ try:
233
+ # Geçici olarak API anahtarını ayarla
234
+ openai.api_key = current_api_key
235
+
236
+ response = openai.chat.completions.create(
237
+ model=model,
238
+ messages=[{"role": "user", "content": prompt}],
239
+ temperature=0.7,
240
+ max_tokens=2000
241
+ )
242
+ return response.choices[0].message.content
243
+ except Exception as e:
244
+ return f"OpenAI API hatası: {str(e)}"
245
+
246
+ def generate_with_gemini(self, prompt: str, model: str = "gemini-1.5-pro", api_key: Optional[str] = None) -> str:
247
+ """
248
+ Google Gemini API kullanarak yanıt oluşturur.
249
+
250
+ Args:
251
+ prompt (str): Gönderilecek prompt
252
+ model (str): Kullanılacak model
253
+ api_key (str, optional): Doğrudan kullanılacak API anahtarı
254
+
255
+ Returns:
256
+ str: Oluşturulan yanıt
257
+ """
258
+ # Doğrudan API anahtarı verilmişse onu kullan, yoksa saklanan anahtarı kullan
259
+ current_api_key = api_key if api_key else self.api_keys["gemini"]
260
+
261
+ if not current_api_key:
262
+ return "Gemini API anahtarı ayarlanmamış."
263
+
264
+ try:
265
+ # Geçici olarak API anahtarını ayarla
266
+ genai.configure(api_key=current_api_key)
267
+
268
+ model_obj = genai.GenerativeModel(model)
269
+ response = model_obj.generate_content(prompt)
270
+ return response.text
271
+ except Exception as e:
272
+ return f"Gemini API hatası: {str(e)}"
273
+
274
+ def generate_with_openrouter(self, prompt: str, model: str = "openai/gpt-4-turbo", api_key: Optional[str] = None) -> str:
275
+ """
276
+ OpenRouter API kullanarak yanıt oluşturur.
277
+
278
+ Args:
279
+ prompt (str): Gönderilecek prompt
280
+ model (str): Kullanılacak model
281
+ api_key (str, optional): Doğrudan kullanılacak API anahtarı
282
+
283
+ Returns:
284
+ str: Oluşturulan yanıt
285
+ """
286
+ # Doğrudan API anahtarı verilmişse onu kullan, yoksa saklanan anahtarı kullan
287
+ current_api_key = api_key if api_key else self.api_keys["openrouter"]
288
+
289
+ if not current_api_key:
290
+ return "OpenRouter API anahtarı ayarlanmamış."
291
+
292
+ try:
293
+ headers = {
294
+ "Content-Type": "application/json",
295
+ "Authorization": f"Bearer {current_api_key}"
296
+ }
297
+
298
+ data = {
299
+ "model": model,
300
+ "messages": [{"role": "user", "content": prompt}],
301
+ "temperature": 0.7,
302
+ "max_tokens": 2000
303
+ }
304
+
305
+ response = requests.post(
306
+ "https://openrouter.ai/api/v1/chat/completions",
307
+ headers=headers,
308
+ json=data
309
+ )
310
+
311
+ if response.status_code == 200:
312
+ return response.json()["choices"][0]["message"]["content"]
313
+ else:
314
+ return f"OpenRouter API hatası: {response.status_code} - {response.text}"
315
+ except Exception as e:
316
+ return f"OpenRouter API hatası: {str(e)}"
317
+
318
+ def generate_code_templates(self, response: str) -> Dict[str, Any]:
319
+ """
320
+ AI yanıtından kod şablonları, dizin yapısı ve uygulama adımlarını çıkarır.
321
+
322
+ Args:
323
+ response (str): AI yanıtı
324
+
325
+ Returns:
326
+ Dict[str, Any]: Kod şablonları, dizin yapısı ve uygulama adımları
327
+ """
328
+ result = {
329
+ "directory_structure": [],
330
+ "code_templates": [],
331
+ "implementation_steps": []
332
+ }
333
+
334
+ # Dizin yapısını çıkar
335
+ dir_structure_pattern = r"```(?:bash|shell|plaintext)?\s*((?:├──|└──|│\s+|(?:\w+/)+\w+|\w+\.\w+|[\w\-\.\/]+\s*)+)\s*```"
336
+ dir_matches = re.findall(dir_structure_pattern, response, re.DOTALL)
337
+
338
+ if dir_matches:
339
+ for match in dir_matches:
340
+ if any(x in match for x in ['├──', '└──', '│', '/']):
341
+ result["directory_structure"].append(match.strip())
342
+
343
+ # Kod şablonlarını çıkar
344
+ code_pattern = r"```(\w+)?\s*([\s\S]*?)```"
345
+ code_matches = re.findall(code_pattern, response, re.DOTALL)
346
+
347
+ for lang, code in code_matches:
348
+ if lang and lang.lower() not in ['bash', 'shell', 'plaintext', '']:
349
+ result["code_templates"].append({
350
+ "language": lang.strip() if lang else "unknown",
351
+ "code": code.strip()
352
+ })
353
+
354
+ # Uygulama adımlarını çıkar
355
+ steps_pattern = r"(?:##|###)\s*(?:Adım|Step|İmplementasyon|Uygulama).*?(?=(?:##|###)|$)"
356
+ steps_matches = re.findall(steps_pattern, response, re.DOTALL | re.IGNORECASE)
357
+
358
+ if steps_matches:
359
+ result["implementation_steps"] = [step.strip() for step in steps_matches]
360
+ else:
361
+ # Numaralı adımları ara
362
+ numbered_steps = re.findall(r"\d+\.\s+[^\n]+(?:\n(?!\d+\.).*?)*", response, re.DOTALL)
363
+ if numbered_steps:
364
+ result["implementation_steps"] = [step.strip() for step in numbered_steps]
365
+
366
+ return result
367
+
368
+ def generate_response_with_code_templates(self, provider: str, prompt: str, model: Optional[str] = None, api_key: Optional[str] = None) -> Dict[str, Any]:
369
+ """
370
+ Belirli bir sağlayıcı ve model kullanarak yanıt ve kod şablonları oluşturur.
371
+
372
+ Args:
373
+ provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
374
+ prompt (str): Gönderilecek prompt
375
+ model (str, optional): Kullanılacak model
376
+ api_key (str, optional): Doğrudan kullanılacak API anahtarı
377
+
378
+ Returns:
379
+ Dict[str, Any]: Yanıt ve kod şablonları
380
+ """
381
+ # Promptu geliştir - kod şablonları, dizin yapısı ve uygulama adımları isteyelim
382
+ enhanced_prompt = f"""
383
+ {prompt}
384
+
385
+ Lütfen yanıtında aşağıdakileri mutlaka içer:
386
+
387
+ 1. Detaylı bir dizin yapısı (klasör ve dosya hiyerarşisi)
388
+ 2. Önemli dosyaların kod şablonları (HTML, CSS, JavaScript, Python vb.)
389
+ 3. Adım adım uygulama talimatları
390
+
391
+ Dizin yapısını ```bash veya ```plaintext içinde göster.
392
+ Kod şablonlarını ```html, ```css, ```javascript, ```python gibi uygun dil belirteçleriyle göster.
393
+ Uygulama adımlarını numaralandırılmış liste olarak veya ## Adım başlıkları altında göster.
394
+ """
395
+
396
+ # Yanıt oluştur
397
+ response = self.generate_response(provider, enhanced_prompt, model, api_key)
398
+
399
+ # Yanıttan kod şablonlarını çıkar
400
+ templates = self.generate_code_templates(response)
401
+
402
+ return {
403
+ "response": response,
404
+ "templates": templates
405
+ }
406
+
407
+ def generate_response(self, provider: str, prompt: str, model: Optional[str] = None, api_key: Optional[str] = None) -> str:
408
+ """
409
+ Belirli bir sağlayıcı ve model kullanarak yanıt oluşturur.
410
+
411
+ Args:
412
+ provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
413
+ prompt (str): Gönderilecek prompt
414
+ model (str, optional): Kullanılacak model
415
+ api_key (str, optional): Doğrudan kullanılacak API anahtarı
416
+
417
+ Returns:
418
+ str: Oluşturulan yanıt
419
+ """
420
+ if provider == "openai":
421
+ if model is None:
422
+ model = "gpt-3.5-turbo"
423
+ return self.generate_with_openai(prompt, model, api_key)
424
+ elif provider == "gemini":
425
+ if model is None:
426
+ model = "gemini-1.5-pro"
427
+ return self.generate_with_gemini(prompt, model, api_key)
428
+ elif provider == "openrouter":
429
+ if model is None:
430
+ model = "openai/gpt-4-turbo"
431
+ return self.generate_with_openrouter(prompt, model, api_key)
432
+ else:
433
+ return "Geçersiz sağlayıcı. Lütfen 'openai', 'gemini' veya 'openrouter' seçin."
434
+
435
+
436
+ # Chatbot ve AI model arayüzü örneklerini oluştur
437
+ chatbot = PromptEngineerChatbot()
438
+ ai_interface = AIModelInterface()
439
+
440
+ # Test fonksiyonu
441
+ def test_chatbot():
442
+ """
443
+ Chatbot'u test eder.
444
+ """
445
+ test_input = "Bir e-ticaret web sitesi yapmak istiyorum. Ürünleri listeleyebilmeli, sepete ekleyebilmeli ve ödeme alabilmeliyim."
446
+ prompt, category, params = chatbot.process_input(test_input, use_ai_generation=True)
447
+
448
+ print(f"Kategori: {category}")
449
+ print(f"Parametreler: {json.dumps(params, indent=2, ensure_ascii=False)}")
450
+ print("\nOluşturulan Prompt:")
451
+ print(prompt)
452
+
453
+ # API yanıtı test (API anahtarı varsa)
454
+ if ai_interface.api_keys["openai"]:
455
+ print("\nOpenAI Yanıtı:")
456
+ response = ai_interface.generate_response("openai", prompt)
457
+ print(response)
458
+
459
+ if __name__ == "__main__":
460
+ test_chatbot()
model_cache.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"openai": {"models": [], "last_updated": 0, "update_interval": 3600}, "gemini": {"models": ["gemini-2.5-pro-preview-03-25", "gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-1.5-flash", "gemini-1.5-flash-8b", "gemini-1.5-pro", "gemini-embedding-exp", "imagen-3.0-generate-002", "veo-2.0-generate-001", "gemini-2.0-flash-live-001", "gemini-1.0-pro", "gemini-1.0-pro-vision", "gemini-1.0-pro-latest", "gemini-1.0-pro-vision-latest", "gemini-1.5-flash-002", "gemini-1.5-pro-latest", "gemini-1.5-flash-001", "gemini-2.0-flash-thinking-exp-1219", "gemini-1.5-flash-latest", "gemini-2.0-pro-exp-02-05", "gemini-2.0-flash-001", "gemini-2.0-flash-thinking-exp-01-21", "gemini-1.5-pro-001", "gemini-pro-vision", "gemini-2.0-flash-exp-image-generation", "gemini-1.5-flash-8b-001", "gemini-2.0-flash-lite-001", "gemini-exp-1206", "gemini-2.5-pro-exp-03-25", "gemini-2.0-flash-exp", "gemini-1.5-pro-002", "gemini-2.0-flash-lite-preview-02-05", "gemini-embedding-exp-03-07", "gemini-2.0-flash-lite-preview", "gemini-2.0-flash-thinking-exp", "gemini-1.5-flash-8b-latest", "gemini-1.5-flash-001-tuning", "gemini-2.0-pro-exp", "gemini-1.5-flash-8b-exp-0924", "gemini-1.5-flash-8b-exp-0827"], "last_updated": 1744585883.373882, "update_interval": 3600}, "openrouter": {"models": ["openai/gpt-4o", "openai/gpt-4o-mini", "openai/gpt-4-turbo", "openai/gpt-4", "openai/gpt-4-32k", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-16k", "anthropic/claude-3.7-sonnet", "anthropic/claude-3.5-sonnet", "anthropic/claude-3-opus", "anthropic/claude-3-sonnet", "anthropic/claude-3-haiku", "anthropic/claude-2.1", "anthropic/claude-2", "anthropic/claude-instant-1.2", "google/gemini-2.5-pro-preview-03-25", "google/gemini-2.0-flash", "google/gemini-2.0-flash-lite", "google/gemini-1.5-flash", "google/gemini-1.5-flash-8b", "google/gemini-1.5-pro", "google/gemini-1.0-pro", "meta-llama/llama-3-70b-instruct", "meta-llama/llama-3-8b-instruct", "meta-llama/llama-3.1-405b-instruct", "meta-llama/llama-3.1-70b-instruct", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-2-70b-chat", "meta-llama/llama-2-13b-chat", "meta-llama/llama-2-7b-chat", "mistral/mistral-large-2", "mistral/mistral-large", "mistral/mistral-medium", "mistral/mistral-small", "mistral/mistral-7b-instruct", "x-ai/grok-3-beta", "x-ai/grok-3-mini-beta", "x-ai/grok-2", "x-ai/grok-1.5-pro", "x-ai/grok-1", "cohere/command-r-plus", "cohere/command-r", "perplexity/sonar-small-online", "perplexity/sonar-medium-online", "perplexity/sonar-medium-chat", "nvidia/llama-3.1-nemotron-ultra-253b-v1", "nvidia/llama-3.3-nemotron-super-49b-v1", "nvidia/llama-3.1-nemotron-nano-8b-v1", "moonshotai/kimi-vl-a3b-thinking", "openrouter/optimus-alpha", "tokyotech-llm/llama-3.1-swallow-8b-instruct-v0.3", "meta-llama/llama-4-maverick", "qwen/qwen-2-72b-instruct", "qwen/qwen-2-7b-instruct", "deepseek/deepseek-coder-v2", "deepseek/deepseek-v2", "aleph-alpha/luminous-supreme", "aleph-alpha/luminous-base", "databricks/dbrx-instruct", "nous/nous-hermes-2-mixtral-8x7b-dpo", "nous/nous-hermes-2-yi-34b", "jais/jais-30b-chat", "jais/jais-13b-chat", "snowflake/arctic", "adept/fuyu-8b", "anyscale/mistral-7b-instruct", "stability/stable-code-3b", "fireworks/firefunction-v2", "fireworks/firellava-13b", "voyage/voyage-2", "voyage/voyage-lite-2", "groq/llama-3-70b-8192", "groq/mixtral-8x7b-32768", "reka/reka-core", "reka/reka-flash", "quasar/quasar-alpha", "zypher/zypher-7b-beta", "inflection/inflection-2", "cloudflare/workers-ai-mistral-7b", "huggingface/zephyr-7b-beta", "replicate/llama-2-70b-chat", "together/yi-34b-chat", "together/llama-2-7b-chat", "phind/phind-codellama-34b", "teknium/openhermes-2.5-mistral-7b", "gryphe/mythomist-7b", "neversleep/llama-2-13b-chat-hf", "mancer/weaver", "openchat/openchat-7b", "cognitivecomputations/dolphin-2.5-mixtral-8x7b", "nousresearch/nous-hermes-llama2-13b", "lizpreciatior/lzlv-70b-fp16-hf", "pygmalionai/mythalion-13b", "undi95/remm-slerp-l2-13b", "jondurbin/airoboros-l2-70b-gpt4-1.4.1", "migtissera/synthia-70b", "alpindale/goliath-120b", "koboldai/psyfighter-13b-2", "ehartford/samantha-1.2-mistral-7b", "austism/chronos-hermes-13b", "openaccess-ai-collective/manticore-13b-chat", "lmsys/vicuna-13b-v1.5", "databricks/dolly-v2-12b", "stabilityai/stablelm-tuned-alpha-7b", "togethercomputer/redpajama-incite-7b-chat", "rwkv/rwkv-4-raven-14b", "cerebras/cerebras-gpt-13b", "mosaicml/mpt-7b-chat", "bigscience/bloom-7b1", "eleutherai/gpt-neox-20b", "tiiuae/falcon-7b-instruct", "writer/palmyra-e", "alibaba/qwen-7b-chat", "01-ai/yi-6b-chat", "baichuan/baichuan-13b-chat", "internlm/internlm-7b", "chatglm/chatglm2-6b", "thudm/chatglm-6b", "zhipu/chatglm3-6b", "moonshot/moonshot-v1-8k", "deepinfra/mistral-7b", "deepseek/deepseek-llm-7b-chat", "upstage/solar-10.7b-instruct", "snorkelai/snorkel-mistral-7b", "recursal/rwkv-5-3b-ai-town", "allenai/tulu-2-dpo-7b", "adept/persimmon-8b-base", "fireworks/firefunction-v1", "openai/gpt-4.5-preview", "mistralai/mistral-small-3.1-24b-instruct", "cognitivecomputations/dolphin-mixtral-8x7b", "mistralai/mistral-7b-instruct-v0.3", "neversleep/llama-3-lumimaid-8b:extended", "mistralai/pixtral-large-2411", "openai/gpt-3.5-turbo-instruct", "anthropic/claude-3-sonnet:beta", "google/gemini-pro", "openai/chatgpt-4o-latest", "anthropic/claude-2.0:beta", "undi95/toppy-m-7b", "mistralai/ministral-8b", "raifle/sorcererlm-8x22b", "google/gemini-flash-1.5-8b-exp", "moonshotai/moonlight-16b-a3b-instruct:free", "mistralai/mistral-nemo:free", "aion-labs/aion-1.0-mini", "cohere/command-r-plus-04-2024", "deepseek/deepseek-r1-distill-llama-70b", "eva-unit-01/eva-llama-3.33-70b", "deepseek/deepseek-chat-v3-0324:free", "openai/o1-mini-2024-09-12", "01-ai/yi-large", "meta-llama/llama-3.2-11b-vision-instruct:free", "sao10k/l3.1-euryale-70b", "deepseek/deepseek-r1-distill-qwen-14b", "deepseek/deepseek-r1:free", "google/gemini-flash-1.5", "openai/gpt-4o-2024-05-13", "qwen/qwq-32b-preview", "deepseek/deepseek-chat", "google/gemma-3-12b-it", "thedrummer/skyfall-36b-v2", "perplexity/sonar-pro", "perplexity/llama-3.1-sonar-large-128k-online", "mistralai/mistral-tiny", "openai/gpt-4o-2024-11-20", "sao10k/l3-lunaris-8b", "deepseek/deepseek-r1-distill-qwen-32b:free", "open-r1/olympiccoder-7b:free", "google/palm-2-chat-bison-32k", "qwen/qwq-32b", "google/gemini-2.0-flash-001", "google/gemma-2-9b-it", "x-ai/grok-beta", "steelskull/l3.3-electra-r1-70b", "nousresearch/deephermes-3-llama-3-8b-preview:free", "anthropic/claude-3.5-sonnet-20240620:beta", "eva-unit-01/eva-qwen-2.5-32b", "deepseek/deepseek-chat:free", "moonshotai/kimi-vl-a3b-thinking:free", "gryphe/mythomax-l2-13b", "arliai/qwq-32b-arliai-rpr-v1:free", "anthropic/claude-3.5-sonnet-20240620", "qwen/qwen-2.5-7b-instruct", "google/gemini-2.0-flash-exp:free", "mistralai/codestral-2501", "qwen/qwen2.5-32b-instruct", "deepseek/deepseek-v3-base:free", "meta-llama/llama-3.1-8b-instruct:free", "meta-llama/llama-guard-2-8b", "cohere/command-r-plus-08-2024", "mistralai/pixtral-12b", "google/gemma-3-27b-it:free", "openai/gpt-4-0314", "meta-llama/llama-3.2-11b-vision-instruct", "deepseek/deepseek-r1-distill-qwen-14b:free", "eva-unit-01/eva-qwen-2.5-72b", "google/gemma-3-4b-it:free", "liquid/lfm-7b", "qwen/qwq-32b:free", "mistralai/mistral-small-24b-instruct-2501", "mistralai/mistral-large-2411", "meta-llama/llama-3.1-405b", "sao10k/fimbulvetr-11b-v2", "nvidia/llama-3.3-nemotron-super-49b-v1:free", "anthropic/claude-2.0", "bytedance-research/ui-tars-72b:free", "mistralai/mistral-7b-instruct-v0.2", "nousresearch/hermes-3-llama-3.1-405b", "qwen/qwen-vl-plus", "google/gemini-2.0-flash-lite-001", "meta-llama/llama-3.3-70b-instruct", "qwen/qwen2.5-vl-72b-instruct:free", "anthropic/claude-3.5-haiku:beta", "cognitivecomputations/dolphin3.0-r1-mistral-24b:free", "neversleep/llama-3.1-lumimaid-8b", "meta-llama/llama-3.3-70b-instruct:free", "google/gemini-2.0-flash-thinking-exp:free", "scb10x/llama3.1-typhoon2-8b-instruct", "google/gemini-flash-1.5-8b", "microsoft/phi-3-medium-128k-instruct", "aetherwiing/mn-starcannon-12b", "openai/gpt-4o-search-preview", "openai/gpt-4-turbo-preview", "x-ai/grok-2-1212", "mistralai/mistral-small-24b-instruct-2501:free", "sophosympatheia/midnight-rose-70b", "qwen/qwq-32b-preview:free", "google/gemini-2.5-pro-exp-03-25:free", "openai/gpt-3.5-turbo-1106", "x-ai/grok-vision-beta", "google/gemma-2-9b-it:free", "google/palm-2-chat-bison", "mistralai/mixtral-8x22b-instruct", "mistralai/codestral-mamba", "all-hands/openhands-lm-32b-v0.1", "inflection/inflection-3-pi", "openai/gpt-4-1106-preview", "minimax/minimax-01", "mistralai/mixtral-8x7b-instruct", "openai/o3-mini-high", "openai/gpt-4o-mini-search-preview", "liquid/lfm-3b", "deepseek/deepseek-r1", "nvidia/llama-3.1-nemotron-70b-instruct", "openai/o3-mini", "mistralai/mistral-7b-instruct", "sao10k/l3.3-euryale-70b", "perplexity/r1-1776", "microsoft/phi-4-multimodal-instruct", "featherless/qwerky-72b:free", "qwen/qwen-turbo", "openai/gpt-3.5-turbo-0613", "cognitivecomputations/dolphin3.0-mistral-24b:free", "sao10k/l3.1-70b-hanami-x1", "qwen/qwen-max", "aion-labs/aion-1.0", "cohere/command-a", "google/gemini-pro-1.5", "deepseek/deepseek-r1-zero:free", "microsoft/phi-3.5-mini-128k-instruct", "liquid/lfm-40b", "ai21/jamba-1-5-mini", "huggingfaceh4/zephyr-7b-beta:free", "anthropic/claude-3.7-sonnet:beta", "qwen/qwen-2.5-7b-instruct:free", "anthropic/claude-3-opus:beta", "mistralai/mistral-saba", "mistralai/mistral-7b-instruct-v0.1", "tokyotech-llm/llama-3.1-swallow-70b-instruct-v0.3", "allenai/molmo-7b-d:free", "amazon/nova-lite-v1", "thedrummer/unslopnemo-12b", "deepseek/deepseek-r1-distill-llama-70b:free", "mistralai/mistral-large", "qwen/qwen-2.5-72b-instruct:free", "microsoft/phi-4", "perplexity/llama-3.1-sonar-small-128k-online", "amazon/nova-pro-v1", "mistralai/mistral-nemo", "anthropic/claude-3.5-sonnet:beta", "aion-labs/aion-rp-llama-3.1-8b", "neversleep/llama-3-lumimaid-70b", "microsoft/wizardlm-2-7b", "google/gemma-2-27b-it", "sao10k/l3-euryale-70b", "cohere/command", "alpindale/magnum-72b", "cohere/command-r7b-12-2024", "qwen/qwen-2.5-72b-instruct", "ai21/jamba-instruct", "openai/gpt-3.5-turbo-0125", "deepseek/deepseek-r1-distill-qwen-32b", "openai/o1-preview", "ai21/jamba-1.6-large", "meta-llama/llama-3.2-3b-instruct:free", "cohere/command-r-03-2024", "openai/gpt-4o-2024-08-06", "meta-llama/llama-guard-3-8b", "nvidia/llama-3.1-nemotron-ultra-253b-v1:free", "thedrummer/anubis-pro-105b-v1", "openai/o1-mini", "anthracite-org/magnum-v4-72b", "anthropic/claude-2:beta", "qwen/qwen-vl-max", "anthropic/claude-3.7-sonnet:thinking", "openrouter/auto", "deepseek/deepseek-chat-v3-0324", "ai21/jamba-1.6-mini", "mistralai/ministral-3b", "anthropic/claude-3.5-haiku-20241022:beta", "qwen/qwen-plus", "qwen/qwen-2.5-coder-32b-instruct", "google/learnlm-1.5-pro-experimental:free", "google/gemma-3-27b-it", "ai21/jamba-1-5-large", "openai/o1-pro", "xwin-lm/xwin-lm-70b", "anthropic/claude-3.5-haiku-20241022", "perplexity/sonar", "open-r1/olympiccoder-32b:free", "anthropic/claude-3.5-haiku", "scb10x/llama3.1-typhoon2-70b-instruct", "deepseek/deepseek-r1-distill-llama-8b", "perplexity/sonar-deep-research", "openai/gpt-4-32k-0314", "meta-llama/llama-3.2-1b-instruct", "nousresearch/hermes-2-pro-llama-3-8b", "amazon/nova-micro-v1", "nvidia/llama-3.1-nemotron-70b-instruct:free", "openai/o1-preview-2024-09-12", "meta-llama/llama-3.2-90b-vision-instruct", "neversleep/noromaid-20b", "mistralai/mistral-large-2407", "deepseek/deepseek-r1-distill-qwen-1.5b", "nothingiisreal/mn-celeste-12b", "google/gemma-3-12b-it:free", "sophosympatheia/rogue-rose-103b-v0.2:free", "qwen/qwen-2.5-vl-7b-instruct:free", "perplexity/sonar-reasoning", "meta-llama/llama-3.2-3b-instruct", "google/gemini-2.0-flash-thinking-exp-1219:free", "openai/o1", "openai/gpt-4o-mini-2024-07-18", "qwen/qwen-2.5-vl-7b-instruct", "rekaai/reka-flash-3:free", "neversleep/llama-3-lumimaid-8b", "mistral/ministral-8b", "mistralai/mistral-small", "google/palm-2-codechat-bison", "qwen/qwen2.5-vl-3b-instruct:free", "meta-llama/llama-4-maverick:free", "anthropic/claude-3-haiku:beta", "openai/gpt-4o:extended", "infermatic/mn-inferor-12b", "mistralai/mistral-medium", "qwen/qwen2.5-vl-32b-instruct", "qwen/qwen2.5-vl-32b-instruct:free", "cohere/command-r-08-2024", "microsoft/wizardlm-2-8x22b", "anthracite-org/magnum-v2-72b", "meta-llama/llama-4-scout", "meta-llama/llama-4-scout:free", "jondurbin/airoboros-l2-70b", "x-ai/grok-2-vision-1212", "google/gemma-3-1b-it:free", "anthropic/claude-2.1:beta", "thedrummer/rocinante-12b", "nvidia/llama-3.1-nemotron-nano-8b-v1:free", "latitudegames/wayfarer-large-70b-llama-3.3", "microsoft/phi-3-mini-128k-instruct", "qwen/qwen-2.5-vl-72b-instruct", "qwen/qwen2.5-vl-72b-instruct", "mistralai/mistral-7b-instruct:free", "inflection/inflection-3-productivity", "google/gemma-3-4b-it", "google/palm-2-codechat-bison-32k", "perplexity/sonar-reasoning-pro", "mistralai/mistral-small-3.1-24b-instruct:free", "meta-llama/llama-3.2-1b-instruct:free", "nousresearch/nous-hermes-2-mixtral-8x7b-dpo", "nousresearch/hermes-3-llama-3.1-70b", "agentica-org/deepcoder-14b-preview:free", "cognitivecomputations/dolphin-mixtral-8x22b", "qwen/qwen-2.5-coder-32b-instruct:free", "neversleep/llama-3.1-lumimaid-70b", "google/gemini-pro-vision"], "last_updated": 1744585883.7369876, "update_interval": 3600}}
prompt_templates.py ADDED
@@ -0,0 +1,1976 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Prompt şablonları ve prompt mühendisliği bilgi tabanı.
3
+ Bu modül, farklı kullanım senaryoları için prompt şablonlarını içerir.
4
+ """
5
+
6
+ # Web sitesi geliştirme için prompt şablonları
7
+ WEB_DEVELOPMENT_TEMPLATE = """
8
+ # Web Sitesi Geliştirme Uzmanı Prompt
9
+
10
+ ## Proje Tanımı
11
+ {project_description}
12
+
13
+ ## Teknik Gereksinimler
14
+ - **Frontend Framework/Kütüphane**: {frontend_tech}
15
+ - **Backend Teknolojisi** (varsa): {backend_tech}
16
+ - **Veritabanı** (varsa): {database}
17
+ - **Hedef Cihazlar**: {target_devices}
18
+ - **Tasarım Tercihleri**: {design_preferences}
19
+
20
+ ## İstenen Özellikler
21
+ {features}
22
+
23
+ ## Adım Adım Geliştirme Planı
24
+ 1. Proje yapısını oluştur
25
+ 2. Temel bileşenleri ve sayfaları tasarla
26
+ 3. Stil ve görsel tasarımı uygula
27
+ 4. Backend entegrasyonunu gerçekleştir (gerekirse)
28
+ 5. Veritabanı bağlantılarını kur (gerekirse)
29
+ 6. Kullanıcı etkileşimlerini ve işlevselliği ekle
30
+ 7. Responsive tasarımı optimize et
31
+ 8. Test et ve hataları düzelt
32
+ 9. Performans optimizasyonu yap
33
+ 10. Deployment için hazırla
34
+
35
+ ## Çıktı Formatı
36
+ - Tam kaynak kodu (HTML, CSS, JavaScript/Framework dosyaları)
37
+ - Dosya yapısı açıklaması
38
+ - Kurulum ve çalıştırma talimatları
39
+ - Kullanılan kaynaklar ve kütüphaneler listesi
40
+
41
+ ## Ek Notlar
42
+ {additional_notes}
43
+
44
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
45
+ """
46
+
47
+ # Mobil uygulama geliştirme için prompt şablonu
48
+ MOBILE_APP_TEMPLATE = """
49
+ # Mobil Uygulama Geliştirme Uzmanı Prompt
50
+
51
+ ## Proje Tanımı
52
+ {project_description}
53
+
54
+ ## Teknik Gereksinimler
55
+ - **Uygulama Türü**: {app_type} (Native/Hybrid/Cross-platform)
56
+ - **Platformlar**: {platforms} (iOS/Android/Her ikisi)
57
+ - **Geliştirme Framework'ü**: {framework}
58
+ - **Backend Gereksinimleri**: {backend_requirements}
59
+ - **Hedef Kullanıcı**: {target_audience}
60
+
61
+ ## İstenen Özellikler
62
+ {features}
63
+
64
+ ## Kullanıcı Arayüzü Gereksinimleri
65
+ {ui_requirements}
66
+
67
+ ## Adım Adım Geliştirme Planı
68
+ 1. Proje yapısını ve mimarisini oluştur
69
+ 2. UI/UX tasarımını uygula
70
+ 3. Temel işlevselliği geliştir
71
+ 4. Backend entegrasyonunu gerçekleştir
72
+ 5. Veri depolama ve yönetimini uygula
73
+ 6. Kullanıcı kimlik doğrulama ve yetkilendirmeyi ekle (gerekirse)
74
+ 7. Ek özellikleri entegre et
75
+ 8. Test et ve hataları düzelt
76
+ 9. Performans optimizasyonu yap
77
+ 10. Mağaza yayını için hazırla
78
+
79
+ ## Çıktı Formatı
80
+ - Tam kaynak kodu
81
+ - Dosya yapısı açıklaması
82
+ - Kurulum ve çalıştırma talimatları
83
+ - Kullanılan API'ler ve kütüphaneler listesi
84
+ - Test senaryoları
85
+
86
+ ## Ek Notlar
87
+ {additional_notes}
88
+
89
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
90
+ """
91
+
92
+ # Veri analizi için prompt şablonu
93
+ DATA_ANALYSIS_TEMPLATE = """
94
+ # Veri Analizi Uzmanı Prompt
95
+
96
+ ## Proje Tanımı
97
+ {project_description}
98
+
99
+ ## Veri Kaynağı Bilgileri
100
+ - **Veri Formatı**: {data_format}
101
+ - **Veri Boyutu**: {data_size}
102
+ - **Veri Kaynağı**: {data_source}
103
+ - **Zaman Aralığı**: {time_range}
104
+
105
+ ## Analiz Hedefleri
106
+ {analysis_goals}
107
+
108
+ ## İstenen Analizler
109
+ {required_analyses}
110
+
111
+ ## Görselleştirme Gereksinimleri
112
+ {visualization_requirements}
113
+
114
+ ## Adım Adım Analiz Planı
115
+ 1. Veri yükleme ve ön işleme
116
+ 2. Keşifsel veri analizi (EDA)
117
+ 3. Veri temizleme ve dönüştürme
118
+ 4. İstatistiksel analizler
119
+ 5. İleri analiz teknikleri uygulama (gerekirse)
120
+ 6. Görselleştirmeler oluşturma
121
+ 7. Bulguları yorumlama
122
+ 8. Sonuçları raporlama
123
+
124
+ ## Çıktı Formatı
125
+ - Tam analiz kodu (Python/R)
126
+ - Görselleştirmeler
127
+ - Bulgular ve yorumlar
128
+ - Metodoloji açıklaması
129
+ - Öneriler ve sonraki adımlar
130
+
131
+ ## Ek Notlar
132
+ {additional_notes}
133
+
134
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar, kod örnekleri ve görselleştirmeler sağla.
135
+ """
136
+
137
+ # Veri görselleştirme için prompt şablonu
138
+ DATA_VISUALIZATION_TEMPLATE = """
139
+ # Veri Görselleştirme Uzmanı Prompt
140
+
141
+ ## Proje Tanımı
142
+ {project_description}
143
+
144
+ ## Veri Kaynağı Bilgileri
145
+ - **Veri Formatı**: {data_format}
146
+ - **Veri Boyutu**: {data_size}
147
+ - **Veri Kaynağı**: {data_source}
148
+ - **Veri Türü**: {data_type}
149
+
150
+ ## Görselleştirme Hedefleri
151
+ {visualization_goals}
152
+
153
+ ## İstenen Görselleştirmeler
154
+ {required_visualizations}
155
+
156
+ ## Tasarım Gereksinimleri
157
+ {design_requirements}
158
+
159
+ ## Adım Adım Görselleştirme Planı
160
+ 1. Veri yükleme ve ön işleme
161
+ 2. Görselleştirme türlerini belirleme
162
+ 3. Temel görselleştirmeleri oluşturma
163
+ 4. İnteraktif özellikler ekleme (gerekirse)
164
+ 5. Görsel tasarımı iyileştirme
165
+ 6. Dashboard oluşturma (gerekirse)
166
+ 7. Görselleştirmeleri optimize etme
167
+ 8. Sonuçları paylaşılabilir formatta hazırlama
168
+
169
+ ## Çıktı Formatı
170
+ - Tam görselleştirme kodu (Python/R/JavaScript)
171
+ - Görselleştirme dosyaları (PNG, SVG, HTML, vb.)
172
+ - Kullanılan kütüphaneler ve araçlar
173
+ - Metodoloji açıklaması
174
+ - İnteraktif dashboard (gerekirse)
175
+
176
+ ## Ek Notlar
177
+ {additional_notes}
178
+
179
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
180
+ """
181
+
182
+ # Makine öğrenmesi modeli geliştirme için prompt şablonu
183
+ ML_MODEL_TEMPLATE = """
184
+ # Makine Öğrenmesi Uzmanı Prompt
185
+
186
+ ## Proje Tanımı
187
+ {project_description}
188
+
189
+ ## Veri ve Problem Bilgileri
190
+ - **Problem Türü**: {problem_type} (Sınıflandırma/Regresyon/Kümeleme/vb.)
191
+ - **Veri Seti Özellikleri**: {dataset_features}
192
+ - **Hedef Değişken**: {target_variable}
193
+ - **Değerlendirme Metrikleri**: {evaluation_metrics}
194
+
195
+ ## Model Gereksinimleri
196
+ {model_requirements}
197
+
198
+ ## Adım Adım Model Geliştirme Planı
199
+ 1. Veri yükleme ve keşifsel analiz
200
+ 2. Veri ön işleme ve özellik mühendisliği
201
+ 3. Veri setini eğitim/test olarak bölme
202
+ 4. Temel model oluşturma ve eğitme
203
+ 5. Model değerlendirme ve hata analizi
204
+ 6. Hiperparametre optimizasyonu
205
+ 7. Model iyileştirme ve yeniden eğitim
206
+ 8. Final model değerlendirmesi
207
+ 9. Model yorumlama ve açıklanabilirlik
208
+ 10. Deployment için hazırlama (gerekirse)
209
+
210
+ ## Çıktı Formatı
211
+ - Tam model kodu
212
+ - Model performans metrikleri
213
+ - Özellik önem analizi
214
+ - Model yorumları ve içgörüler
215
+ - Deployment talimatları (gerekirse)
216
+
217
+ ## Ek Notlar
218
+ {additional_notes}
219
+
220
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar, kod örnekleri ve görselleştirmeler sağla.
221
+ """
222
+
223
+ # Derin öğrenme modeli geliştirme için prompt şablonu
224
+ DEEP_LEARNING_TEMPLATE = """
225
+ # Derin Öğrenme Uzmanı Prompt
226
+
227
+ ## Proje Tanımı
228
+ {project_description}
229
+
230
+ ## Veri ve Problem Bilgileri
231
+ - **Problem Türü**: {problem_type} (Görüntü Sınıflandırma/Nesne Tespiti/NLP/vb.)
232
+ - **Veri Seti Özellikleri**: {dataset_features}
233
+ - **Veri Boyutu**: {data_size}
234
+ - **Değerlendirme Metrikleri**: {evaluation_metrics}
235
+
236
+ ## Model Gereksinimleri
237
+ {model_requirements}
238
+
239
+ ## Adım Adım Model Geliştirme Planı
240
+ 1. Veri yükleme ve ön işleme
241
+ 2. Veri artırma (augmentation) stratejileri
242
+ 3. Model mimarisini tasarlama
243
+ 4. Model eğitimi için hiperparametreleri ayarlama
244
+ 5. Model eğitimi ve validasyon
245
+ 6. Model değerlendirme ve hata analizi
246
+ 7. Model optimizasyonu ve fine-tuning
247
+ 8. Final model değerlendirmesi
248
+ 9. Model yorumlama ve görselleştirme
249
+ 10. Deployment için model dönüştürme (gerekirse)
250
+
251
+ ## Çıktı Formatı
252
+ - Tam model kodu (TensorFlow/PyTorch/vb.)
253
+ - Model mimarisi şeması
254
+ - Eğitim ve validasyon grafikleri
255
+ - Model performans metrikleri
256
+ - Deployment talimatları (gerekirse)
257
+
258
+ ## Ek Notlar
259
+ {additional_notes}
260
+
261
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar, kod örnekleri ve görselleştirmeler sağla.
262
+ """
263
+
264
+ # İçerik oluşturma için prompt şablonu
265
+ CONTENT_CREATION_TEMPLATE = """
266
+ # İçerik Oluşturma Uzmanı Prompt
267
+
268
+ ## İçerik Tanımı
269
+ {content_description}
270
+
271
+ ## İçerik Türü
272
+ - **Format**: {content_format} (Blog yazısı/Sosyal medya/E-posta/vb.)
273
+ - **Uzunluk**: {content_length}
274
+ - **Ton**: {tone} (Resmi/Samimi/Bilgilendirici/İkna edici/vb.)
275
+ - **Hedef Kitle**: {target_audience}
276
+
277
+ ## İçerik Hedefleri
278
+ {content_goals}
279
+
280
+ ## Anahtar Noktalar
281
+ {key_points}
282
+
283
+ ## SEO Gereksinimleri (varsa)
284
+ - **Anahtar Kelimeler**: {keywords}
285
+ - **Meta Açıklama**: {meta_description}
286
+
287
+ ## İçerik Yapısı
288
+ 1. Başlık
289
+ 2. Giriş
290
+ 3. Ana bölümler
291
+ 4. Alt başlıklar
292
+ 5. Sonuç
293
+ 6. Çağrı aksiyonu (CTA)
294
+
295
+ ## Referanslar ve Kaynaklar
296
+ {references}
297
+
298
+ ## Ek Notlar
299
+ {additional_notes}
300
+
301
+ Lütfen belirtilen gereksinimlere uygun, özgün ve etkileyici bir içerik oluştur.
302
+ """
303
+
304
+ # Oyun geliştirme için prompt şablonu
305
+ GAME_DEVELOPMENT_TEMPLATE = """
306
+ # Oyun Geliştirme Uzmanı Prompt
307
+
308
+ ## Proje Tanımı
309
+ {project_description}
310
+
311
+ ## Teknik Gereksinimler
312
+ - **Oyun Türü**: {game_type}
313
+ - **Platform**: {platform} (PC/Mobil/Konsol/Web)
314
+ - **Oyun Motoru**: {game_engine}
315
+ - **Grafik Stili**: {graphic_style}
316
+ - **Hedef Kitle**: {target_audience}
317
+
318
+ ## Oyun Mekanikleri
319
+ {game_mechanics}
320
+
321
+ ## Karakter ve Dünya Tasarımı
322
+ {character_world_design}
323
+
324
+ ## Adım Adım Geliştirme Planı
325
+ 1. Oyun konsepti ve tasarım dokümanı oluşturma
326
+ 2. Temel oyun mekaniklerini prototipleme
327
+ 3. Karakter ve dünya varlıklarını oluşturma
328
+ 4. Temel oynanış döngüsünü geliştirme
329
+ 5. Kullanıcı arayüzü tasarımı ve implementasyonu
330
+ 6. Ses ve müzik entegrasyonu
331
+ 7. Seviye tasarımı ve içerik oluşturma
332
+ 8. Test etme ve hata ayıklama
333
+ 9. Performans optimizasyonu
334
+ 10. Dağıtım için hazırlama
335
+
336
+ ## Çıktı Formatı
337
+ - Tam oyun kodu
338
+ - Varlık dosyaları (grafikler, sesler, vb.)
339
+ - Kurulum ve çalıştırma talimatları
340
+ - Oyun tasarım dokümanı
341
+ - Test senaryoları
342
+
343
+ ## Ek Notlar
344
+ {additional_notes}
345
+
346
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
347
+ """
348
+
349
+ # Eğitim içeriği oluşturma için prompt şablonu
350
+ EDUCATION_TEMPLATE = """
351
+ # Eğitim İçeriği Uzmanı Prompt
352
+
353
+ ## Proje Tanımı
354
+ {project_description}
355
+
356
+ ## Eğitim Bilgileri
357
+ - **Konu**: {subject}
358
+ - **Hedef Kitle**: {target_audience}
359
+ - **Zorluk Seviyesi**: {difficulty_level}
360
+ - **Format**: {format} (Video/Metin/İnteraktif/vb.)
361
+ - **Süre/Uzunluk**: {duration_length}
362
+
363
+ ## Öğrenme Hedefleri
364
+ {learning_objectives}
365
+
366
+ ## İçerik Yapısı
367
+ {content_structure}
368
+
369
+ ## Adım Adım Geliştirme Planı
370
+ 1. Konu araştırması ve kaynak toplama
371
+ 2. İçerik taslağı oluşturma
372
+ 3. Temel içeriği geliştirme
373
+ 4. Örnekler ve alıştırmalar ekleme
374
+ 5. Görsel ve multimedya öğeleri hazırlama
375
+ 6. Değerlendirme ve ölçme araçları oluşturma
376
+ 7. İçeriği gözden geçirme ve düzenleme
377
+ 8. Final içeriği hazırlama
378
+
379
+ ## Çıktı Formatı
380
+ - Tam eğitim içeriği
381
+ - Görsel ve multimedya dosyaları
382
+ - Alıştırmalar ve çözümleri
383
+ - Değerlendirme araçları
384
+ - Kaynakça
385
+
386
+ ## Ek Notlar
387
+ {additional_notes}
388
+
389
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve örnekler sağla.
390
+ """
391
+
392
+ # Finans analizi için prompt şablonu
393
+ FINANCE_TEMPLATE = """
394
+ # Finans Analizi Uzmanı Prompt
395
+
396
+ ## Proje Tanımı
397
+ {project_description}
398
+
399
+ ## Finansal Veri Bilgileri
400
+ - **Veri Türü**: {data_type} (Hisse Senedi/Finansal Tablolar/Ekonomik Göstergeler/vb.)
401
+ - **Veri Kaynağı**: {data_source}
402
+ - **Zaman Aralığı**: {time_range}
403
+ - **Analiz Kapsamı**: {analysis_scope}
404
+
405
+ ## Analiz Hedefleri
406
+ {analysis_objectives}
407
+
408
+ ## İstenen Analizler
409
+ {required_analyses}
410
+
411
+ ## Adım Adım Analiz Planı
412
+ 1. Veri toplama ve hazırlama
413
+ 2. Temel finansal analiz
414
+ 3. Trend ve patern analizi
415
+ 4. Risk değerlendirmesi
416
+ 5. Tahmin modelleri oluşturma (gerekirse)
417
+ 6. Senaryo analizi
418
+ 7. Bulguları yorumlama
419
+ 8. Sonuçları raporlama ve öneriler sunma
420
+
421
+ ## Çıktı Formatı
422
+ - Tam analiz raporu
423
+ - Finansal tablolar ve grafikler
424
+ - Risk değerlendirmesi
425
+ - Tahmin modelleri (gerekirse)
426
+ - Yatırım veya finansal stratejiler
427
+
428
+ ## Ek Notlar
429
+ {additional_notes}
430
+
431
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar, hesaplamalar ve görselleştirmeler sağla.
432
+ """
433
+
434
+ # Otomasyon için prompt şablonu
435
+ AUTOMATION_TEMPLATE = """
436
+ # Otomasyon Uzmanı Prompt
437
+
438
+ ## Proje Tanımı
439
+ {project_description}
440
+
441
+ ## Otomasyon Gereksinimleri
442
+ - **Otomasyon Türü**: {automation_type} (İş Akışı/Veri İşleme/Test/vb.)
443
+ - **Mevcut Sistemler**: {existing_systems}
444
+ - **Hedef Platformlar**: {target_platforms}
445
+ - **Kullanıcı Etkileşimi**: {user_interaction} (Tam Otomatik/Yarı Otomatik)
446
+
447
+ ## Otomasyon Hedefleri
448
+ {automation_objectives}
449
+
450
+ ## İş Akışı veya Süreç Detayları
451
+ {workflow_details}
452
+
453
+ ## Adım Adım Geliştirme Planı
454
+ 1. Mevcut süreçleri analiz etme
455
+ 2. Otomasyon stratejisi geliştirme
456
+ 3. Gerekli araçları ve teknolojileri seçme
457
+ 4. Otomasyon senaryolarını tasarlama
458
+ 5. Otomasyon kodunu veya betiklerini geliştirme
459
+ 6. Hata yönetimi ve istisna işleme mekanizmaları ekleme
460
+ 7. Test etme ve doğrulama
461
+ 8. Dokümantasyon ve kullanım talimatları hazırlama
462
+
463
+ ## Çıktı Formatı
464
+ - Tam otomasyon kodu veya betikleri
465
+ - Kurulum ve yapılandırma talimatları
466
+ - Kullanım kılavuzu
467
+ - Test senaryoları ve sonuçları
468
+ - Bakım ve sorun giderme rehberi
469
+
470
+ ## Ek Notlar
471
+ {additional_notes}
472
+
473
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
474
+ """
475
+
476
+ # Siber güvenlik için prompt şablonu
477
+ CYBERSECURITY_TEMPLATE = """
478
+ # Siber Güvenlik Uzmanı Prompt
479
+
480
+ ## Proje Tanımı
481
+ {project_description}
482
+
483
+ ## Güvenlik Gereksinimleri
484
+ - **Güvenlik Alanı**: {security_domain} (Ağ Güvenliği/Uygulama Güvenliği/vb.)
485
+ - **Hedef Sistemler**: {target_systems}
486
+ - **Tehdit Modeli**: {threat_model}
487
+ - **Uyumluluk Gereksinimleri**: {compliance_requirements}
488
+
489
+ ## Güvenlik Hedefleri
490
+ {security_objectives}
491
+
492
+ ## Mevcut Güvenlik Durumu
493
+ {current_security_state}
494
+
495
+ ## Adım Adım Güvenlik Planı
496
+ 1. Güvenlik değerlendirmesi ve risk analizi
497
+ 2. Güvenlik açıklarını belirleme
498
+ 3. Güvenlik stratejisi ve kontrolleri geliştirme
499
+ 4. Güvenlik çözümlerini uygulama
500
+ 5. Güvenlik testleri ve doğrulama
501
+ 6. İzleme ve tespit mekanizmaları kurma
502
+ 7. Olay müdahale planı oluşturma
503
+ 8. Dokümantasyon ve eğitim materyalleri hazırlama
504
+
505
+ ## Çıktı Formatı
506
+ - Güvenlik değerlendirme raporu
507
+ - Güvenlik kontrolleri ve çözümleri
508
+ - Test sonuçları ve kanıtları
509
+ - İzleme ve olay müdahale prosedürleri
510
+ - Güvenlik politikaları ve kılavuzları
511
+
512
+ ## Ek Notlar
513
+ {additional_notes}
514
+
515
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve örnekler sağla.
516
+ """
517
+
518
+ # DevOps için prompt şablonu
519
+ DEVOPS_TEMPLATE = """
520
+ # DevOps Uzmanı Prompt
521
+
522
+ ## Proje Tanımı
523
+ {project_description}
524
+
525
+ ## DevOps Gereksinimleri
526
+ - **Altyapı Türü**: {infrastructure_type} (On-premise/Cloud/Hybrid)
527
+ - **Teknoloji Yığını**: {technology_stack}
528
+ - **Ölçeklendirme Gereksinimleri**: {scaling_requirements}
529
+ - **CI/CD Gereksinimleri**: {cicd_requirements}
530
+
531
+ ## DevOps Hedefleri
532
+ {devops_objectives}
533
+
534
+ ## Mevcut Altyapı ve Süreçler
535
+ {current_infrastructure}
536
+
537
+ ## Adım Adım DevOps Planı
538
+ 1. Mevcut altyapı ve süreçleri değerlendirme
539
+ 2. DevOps stratejisi ve araçları belirleme
540
+ 3. Altyapı otomasyonu (IaC) geliştirme
541
+ 4. CI/CD pipeline'ları oluşturma
542
+ 5. İzleme ve günlük kaydı çözümleri uygulama
543
+ 6. Güvenlik entegrasyonu
544
+ 7. Otomasyon testleri ve doğrulama
545
+ 8. Dokümantasyon ve ekip eğitimi
546
+
547
+ ## Çıktı Formatı
548
+ - Altyapı kodu (Terraform, CloudFormation, vb.)
549
+ - CI/CD pipeline yapılandırmaları
550
+ - İzleme ve günlük kaydı çözümleri
551
+ - Otomasyon betikleri
552
+ - Dokümantasyon ve kılavuzlar
553
+
554
+ ## Ek Notlar
555
+ {additional_notes}
556
+
557
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
558
+ """
559
+
560
+ # IoT için prompt şablonu
561
+ IOT_TEMPLATE = """
562
+ # IoT Uzmanı Prompt
563
+
564
+ ## Proje Tanımı
565
+ {project_description}
566
+
567
+ ## IoT Gereksinimleri
568
+ - **Cihaz Türleri**: {device_types}
569
+ - **Bağlantı Gereksinimleri**: {connectivity_requirements}
570
+ - **Veri İşleme Gereksinimleri**: {data_processing_requirements}
571
+ - **Güvenlik Gereksinimleri**: {security_requirements}
572
+
573
+ ## IoT Hedefleri
574
+ {iot_objectives}
575
+
576
+ ## Sistem Mimarisi
577
+ {system_architecture}
578
+
579
+ ## Adım Adım Geliştirme Planı
580
+ 1. IoT sistem mimarisini tasarlama
581
+ 2. Cihaz yazılımı geliştirme
582
+ 3. Bulut altyapısını kurma
583
+ 4. Veri toplama ve işleme pipeline'ları oluşturma
584
+ 5. Kullanıcı arayüzü veya dashboard geliştirme
585
+ 6. Güvenlik önlemlerini uygulama
586
+ 7. Test etme ve doğrulama
587
+ 8. Deployment ve bakım planı hazırlama
588
+
589
+ ## Çıktı Formatı
590
+ - Cihaz yazılımı kodu
591
+ - Bulut altyapısı kodu
592
+ - Veri işleme pipeline'ları
593
+ - Kullanıcı arayüzü veya dashboard
594
+ - Dokümantasyon ve kılavuzlar
595
+
596
+ ## Ek Notlar
597
+ {additional_notes}
598
+
599
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
600
+ """
601
+
602
+ # Bulut bilişim için prompt şablonu
603
+ CLOUD_COMPUTING_TEMPLATE = """
604
+ # Bulut Bilişim Uzmanı Prompt
605
+
606
+ ## Proje Tanımı
607
+ {project_description}
608
+
609
+ ## Bulut Gereksinimleri
610
+ - **Bulut Sağlayıcısı**: {cloud_provider} (AWS/Azure/GCP/vb.)
611
+ - **Hizmet Modeli**: {service_model} (IaaS/PaaS/SaaS/Serverless)
612
+ - **Ölçeklendirme Gereksinimleri**: {scaling_requirements}
613
+ - **Bütçe Kısıtlamaları**: {budget_constraints}
614
+
615
+ ## Bulut Hedefleri
616
+ {cloud_objectives}
617
+
618
+ ## Mevcut Altyapı
619
+ {current_infrastructure}
620
+
621
+ ## Adım Adım Bulut Planı
622
+ 1. Bulut stratejisi ve mimarisi tasarlama
623
+ 2. Bulut kaynaklarını tanımlama (IaC)
624
+ 3. Ağ ve güvenlik yapılandırması
625
+ 4. Veritabanı ve depolama çözümleri
626
+ 5. Uygulama deployment stratejisi
627
+ 6. İzleme ve günlük kaydı çözümleri
628
+ 7. Maliyet optimizasyonu
629
+ 8. Felaket kurtarma ve yedekleme stratejisi
630
+
631
+ ## Çıktı Formatı
632
+ - Bulut mimarisi şeması
633
+ - Altyapı kodu (Terraform, CloudFormation, vb.)
634
+ - Güvenlik yapılandırmaları
635
+ - Deployment betikleri
636
+ - Maliyet tahminleri ve optimizasyon önerileri
637
+
638
+ ## Ek Notlar
639
+ {additional_notes}
640
+
641
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
642
+ """
643
+
644
+ # Blockchain için prompt şablonu
645
+ BLOCKCHAIN_TEMPLATE = """
646
+ # Blockchain Uzmanı Prompt
647
+
648
+ ## Proje Tanımı
649
+ {project_description}
650
+
651
+ ## Blockchain Gereksinimleri
652
+ - **Blockchain Türü**: {blockchain_type} (Public/Private/Hybrid)
653
+ - **Konsensüs Mekanizması**: {consensus_mechanism}
654
+ - **Akıllı Sözleşme Gereksinimleri**: {smart_contract_requirements}
655
+ - **Ölçeklendirme Gereksinimleri**: {scaling_requirements}
656
+
657
+ ## Blockchain Hedefleri
658
+ {blockchain_objectives}
659
+
660
+ ## Kullanım Senaryoları
661
+ {use_cases}
662
+
663
+ ## Adım Adım Geliştirme Planı
664
+ 1. Blockchain mimarisi tasarlama
665
+ 2. Ağ altyapısını kurma
666
+ 3. Akıllı sözleşmeleri geliştirme
667
+ 4. Kullanıcı arayüzü veya API'ler oluşturma
668
+ 5. Güvenlik denetimi ve test etme
669
+ 6. Performans optimizasyonu
670
+ 7. Deployment ve yönetim stratejisi
671
+ 8. Dokümantasyon ve kullanım kılavuzları hazırlama
672
+
673
+ ## Çıktı Formatı
674
+ - Blockchain konfigürasyonu
675
+ - Akıllı sözleşme kodu
676
+ - API veya kullanıcı arayüzü
677
+ - Güvenlik denetim raporu
678
+ - Dokümantasyon ve kılavuzlar
679
+
680
+ ## Ek Notlar
681
+ {additional_notes}
682
+
683
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
684
+ """
685
+
686
+ # Yapay zeka araştırmaları için prompt şablonu
687
+ AI_RESEARCH_TEMPLATE = """
688
+ # Yapay Zeka Araştırma Uzmanı Prompt
689
+
690
+ ## Araştırma Tanımı
691
+ {research_description}
692
+
693
+ ## Araştırma Alanı
694
+ - **AI Alt Alanı**: {ai_subfield} (NLP/CV/RL/vb.)
695
+ - **Araştırma Türü**: {research_type} (Teorik/Uygulamalı/Deneysel)
696
+ - **Mevcut Literatür Durumu**: {literature_state}
697
+ - **Araştırma Soruları**: {research_questions}
698
+
699
+ ## Araştırma Hedefleri
700
+ {research_objectives}
701
+
702
+ ## Metodoloji
703
+ {methodology}
704
+
705
+ ## Adım Adım Araştırma Planı
706
+ 1. Literatür taraması ve mevcut ��alışmaları inceleme
707
+ 2. Araştırma hipotezlerini formüle etme
708
+ 3. Deneysel tasarım veya teorik çerçeve oluşturma
709
+ 4. Veri toplama veya model geliştirme
710
+ 5. Deneyleri yürütme veya teorik analiz yapma
711
+ 6. Sonuçları analiz etme ve yorumlama
712
+ 7. Bulguları literatürle karşılaştırma
713
+ 8. Araştırma makalesi veya raporu yazma
714
+
715
+ ## Çıktı Formatı
716
+ - Araştırma raporu veya makale
717
+ - Deneysel sonuçlar ve analizler
718
+ - Kod veya model (uygulamalı araştırma için)
719
+ - Literatür özeti
720
+ - Gelecek çalışmalar için öneriler
721
+
722
+ ## Ek Notlar
723
+ {additional_notes}
724
+
725
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve analizler sağla.
726
+ """
727
+
728
+ # SEO için prompt şablonu
729
+ SEO_TEMPLATE = """
730
+ # SEO Uzmanı Prompt
731
+
732
+ ## Proje Tanımı
733
+ {project_description}
734
+
735
+ ## SEO Gereksinimleri
736
+ - **Web Sitesi Türü**: {website_type}
737
+ - **Hedef Anahtar Kelimeler**: {target_keywords}
738
+ - **Hedef Pazar/Bölge**: {target_market}
739
+ - **Rekabet Analizi**: {competition_analysis}
740
+
741
+ ## SEO Hedefleri
742
+ {seo_objectives}
743
+
744
+ ## Mevcut SEO Durumu
745
+ {current_seo_state}
746
+
747
+ ## Adım Adım SEO Planı
748
+ 1. Kapsamlı SEO denetimi yapma
749
+ 2. Anahtar kelime araştırması ve analizi
750
+ 3. On-page SEO optimizasyonları
751
+ 4. Teknik SEO iyileştirmeleri
752
+ 5. İçerik stratejisi geliştirme
753
+ 6. Off-page SEO ve bağlantı kurma stratejisi
754
+ 7. Yerel SEO optimizasyonu (gerekirse)
755
+ 8. İzleme ve raporlama sistemi kurma
756
+
757
+ ## Çıktı Formatı
758
+ - SEO denetim raporu
759
+ - Anahtar kelime araştırma sonuçları
760
+ - On-page ve teknik SEO önerileri
761
+ - İçerik planı ve önerileri
762
+ - Bağlantı kurma stratejisi
763
+ - İzleme ve raporlama planı
764
+
765
+ ## Ek Notlar
766
+ {additional_notes}
767
+
768
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve öneriler sağla.
769
+ """
770
+
771
+ # Sosyal medya için prompt şablonu
772
+ SOCIAL_MEDIA_TEMPLATE = """
773
+ # Sosyal Medya Uzmanı Prompt
774
+
775
+ ## Proje Tanımı
776
+ {project_description}
777
+
778
+ ## Sosyal Medya Gereksinimleri
779
+ - **Platformlar**: {platforms} (Instagram/Twitter/Facebook/LinkedIn/TikTok/vb.)
780
+ - **Hedef Kitle**: {target_audience}
781
+ - **Marka Sesi**: {brand_voice}
782
+ - **İçerik Türleri**: {content_types}
783
+
784
+ ## Sosyal Medya Hedefleri
785
+ {social_media_objectives}
786
+
787
+ ## Mevcut Sosyal Medya Varlığı
788
+ {current_social_media_presence}
789
+
790
+ ## Adım Adım Sosyal Medya Planı
791
+ 1. Sosyal medya denetimi yapma
792
+ 2. Hedef kitle analizi
793
+ 3. İçerik stratejisi geliştirme
794
+ 4. İçerik takvimi oluşturma
795
+ 5. İçerik üretimi için kılavuzlar hazırlama
796
+ 6. Etkileşim ve topluluk yönetimi stratejisi
797
+ 7. Reklam ve tanıtım stratejisi (gerekirse)
798
+ 8. Analiz ve raporlama sistemi kurma
799
+
800
+ ## Çıktı Formatı
801
+ - Sosyal medya stratejisi
802
+ - İçerik takvimi
803
+ - İçerik örnekleri ve şablonları
804
+ - Topluluk yönetimi kılavuzu
805
+ - Analiz ve performans metrikleri
806
+
807
+ ## Ek Notlar
808
+ {additional_notes}
809
+
810
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve örnekler sağla.
811
+ """
812
+
813
+ # E-ticaret için prompt şablonu
814
+ E_COMMERCE_TEMPLATE = """
815
+ # E-Ticaret Uzmanı Prompt
816
+
817
+ ## Proje Tanımı
818
+ {project_description}
819
+
820
+ ## E-Ticaret Gereksinimleri
821
+ - **Platform**: {platform} (Shopify/WooCommerce/Magento/vb.)
822
+ - **Ürün Türleri**: {product_types}
823
+ - **Ödeme Yöntemleri**: {payment_methods}
824
+ - **Lojistik Gereksinimleri**: {logistics_requirements}
825
+
826
+ ## E-Ticaret Hedefleri
827
+ {ecommerce_objectives}
828
+
829
+ ## Mevcut E-Ticaret Durumu
830
+ {current_ecommerce_state}
831
+
832
+ ## Adım Adım E-Ticaret Planı
833
+ 1. E-ticaret platformu seçimi ve kurulumu
834
+ 2. Ürün kataloğu ve içerik oluşturma
835
+ 3. Ödeme ve lojistik entegrasyonları
836
+ 4. Kullanıcı deneyimi optimizasyonu
837
+ 5. SEO ve pazarlama stratejisi
838
+ 6. Güvenlik ve uyumluluk kontrolleri
839
+ 7. Test etme ve lansman hazırlığı
840
+ 8. Analiz ve optimizasyon planı
841
+
842
+ ## Çıktı Formatı
843
+ - E-ticaret platform kurulum ve yapılandırması
844
+ - Ürün kataloğu ve içerik stratejisi
845
+ - Ödeme ve lojistik entegrasyonları
846
+ - SEO ve pazarlama planı
847
+ - Analiz ve raporlama sistemi
848
+
849
+ ## Ek Notlar
850
+ {additional_notes}
851
+
852
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve öneriler sağla.
853
+ """
854
+
855
+ # Dijital pazarlama için prompt şablonu
856
+ DIGITAL_MARKETING_TEMPLATE = """
857
+ # Dijital Pazarlama Uzmanı Prompt
858
+
859
+ ## Proje Tanımı
860
+ {project_description}
861
+
862
+ ## Pazarlama Gereksinimleri
863
+ - **Pazarlama Kanalları**: {marketing_channels}
864
+ - **Hedef Kitle**: {target_audience}
865
+ - **Bütçe**: {budget}
866
+ - **Kampanya Süresi**: {campaign_duration}
867
+
868
+ ## Pazarlama Hedefleri
869
+ {marketing_objectives}
870
+
871
+ ## Mevcut Pazarlama Durumu
872
+ {current_marketing_state}
873
+
874
+ ## Adım Adım Pazarlama Planı
875
+ 1. Pazar ve rekabet analizi
876
+ 2. Hedef kitle segmentasyonu
877
+ 3. Pazarlama stratejisi geliştirme
878
+ 4. Kanal bazlı taktikler oluşturma
879
+ 5. İçerik ve yaratıcı stratejisi
880
+ 6. Kampanya takvimi hazırlama
881
+ 7. Bütçe dağılımı ve ROI tahminleri
882
+ 8. İzleme ve optimizasyon planı
883
+
884
+ ## Çıktı Formatı
885
+ - Dijital pazarlama stratejisi
886
+ - Kanal bazlı taktik planları
887
+ - İçerik ve yaratıcı örnekleri
888
+ - Kampanya takvimi
889
+ - Bütçe planı ve ROI tahminleri
890
+
891
+ ## Ek Notlar
892
+ {additional_notes}
893
+
894
+ Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve öneriler sağla.
895
+ """
896
+
897
+ # Genel amaçlı prompt şablonu
898
+ GENERAL_TEMPLATE = """
899
+ # Uzman Prompt
900
+
901
+ ## Görev Tanımı
902
+ {task_description}
903
+
904
+ ## Gereksinimler
905
+ {requirements}
906
+
907
+ ## Beklenen Çıktı
908
+ {expected_output}
909
+
910
+ ## Kısıtlamalar
911
+ {constraints}
912
+
913
+ ## Adım Adım Yaklaşım
914
+ 1. {step_1}
915
+ 2. {step_2}
916
+ 3. {step_3}
917
+ ...
918
+
919
+ ## Ek Bilgiler
920
+ {additional_info}
921
+
922
+ Lütfen belirtilen gereksinimlere uygun, detaylı ve kapsamlı bir çözüm sağla.
923
+ """
924
+
925
+ # Script yazımı için prompt şablonu
926
+ SCRIPT_TEMPLATE = """
927
+ # Senaryo Yazım Uzmanı Prompt
928
+
929
+ ## Proje Tanımı
930
+ {project_description}
931
+
932
+ ## Senaryo Türü
933
+ - **Format**: {script_format} (Film/Dizi/Reklam/YouTube/Podcast/Eğitim Videosu)
934
+ - **Süre/Uzunluk**: {duration}
935
+ - **Hedef Kitle**: {target_audience}
936
+ - **Ton**: {tone} (Komedi/Drama/Aksiyon/Bilgilendirici/İkna Edici/vb.)
937
+
938
+ ## Senaryo Hedefleri
939
+ {script_objectives}
940
+
941
+ ## İçerik Gereksinimleri
942
+ {content_requirements}
943
+
944
+ ## Karakter Bilgileri
945
+ {character_details}
946
+
947
+ ## Sahne Yapısı
948
+ 1. Giriş/Tanıtım
949
+ 2. Ana bölüm/Gelişme
950
+ 3. Sonuç/Kapanış
951
+ 4. Çağrı aksiyonu (CTA) (gerekirse)
952
+
953
+ ## Teknik Gereksinimler
954
+ {technical_requirements}
955
+
956
+ ## Referanslar ve İlham Kaynakları
957
+ {references}
958
+
959
+ ## Ek Notlar
960
+ {additional_notes}
961
+
962
+ Lütfen belirtilen gereksinimlere uygun, etkileyici ve hedef kitleye hitap eden bir senaryo oluştur. Diyalogları, sahne açıklamalarını ve gerekli yönergeleri standart senaryo formatında sunmalısın.
963
+ """
964
+
965
+ # Tüm prompt şablonlarını içeren sözlük
966
+ PROMPT_TEMPLATES = {
967
+ "web_development": WEB_DEVELOPMENT_TEMPLATE,
968
+ "mobile_app": MOBILE_APP_TEMPLATE,
969
+ "data_analysis": DATA_ANALYSIS_TEMPLATE,
970
+ "data_visualization": DATA_VISUALIZATION_TEMPLATE,
971
+ "ml_model": ML_MODEL_TEMPLATE,
972
+ "deep_learning": DEEP_LEARNING_TEMPLATE,
973
+ "content_creation": CONTENT_CREATION_TEMPLATE,
974
+ "game_development": GAME_DEVELOPMENT_TEMPLATE,
975
+ "education": EDUCATION_TEMPLATE,
976
+ "finance": FINANCE_TEMPLATE,
977
+ "automation": AUTOMATION_TEMPLATE,
978
+ "cybersecurity": CYBERSECURITY_TEMPLATE,
979
+ "devops": DEVOPS_TEMPLATE,
980
+ "iot": IOT_TEMPLATE,
981
+ "cloud_computing": CLOUD_COMPUTING_TEMPLATE,
982
+ "blockchain": BLOCKCHAIN_TEMPLATE,
983
+ "ai_research": AI_RESEARCH_TEMPLATE,
984
+ "seo": SEO_TEMPLATE,
985
+ "social_media": SOCIAL_MEDIA_TEMPLATE,
986
+ "e_commerce": E_COMMERCE_TEMPLATE,
987
+ "digital_marketing": DIGITAL_MARKETING_TEMPLATE,
988
+ "general": GENERAL_TEMPLATE
989
+ }
990
+
991
+ # Prompt kategorileri ve açıklamaları
992
+ PROMPT_CATEGORIES = {
993
+ "web_development": "Web sitesi geliştirme projeleri için",
994
+ "mobile_app": "Mobil uygulama geliştirme projeleri için",
995
+ "data_analysis": "Veri analizi ve işleme projeleri için",
996
+ "data_visualization": "Veri görselleştirme ve dashboard projeleri için",
997
+ "ml_model": "Makine öğrenmesi modeli geliştirme projeleri için",
998
+ "deep_learning": "Derin öğrenme ve sinir ağları projeleri için",
999
+ "content_creation": "Blog yazısı, sosyal medya içeriği vb. oluşturma için",
1000
+ "game_development": "Oyun geliştirme ve tasarım projeleri için",
1001
+ "education": "Eğitim içeriği ve materyal geliştirme için",
1002
+ "finance": "Finansal analiz ve planlama projeleri için",
1003
+ "automation": "İş süreçleri ve görev otomasyonu için",
1004
+ "cybersecurity": "Siber güvenlik ve risk yönetimi için",
1005
+ "devops": "DevOps ve sürekli entegrasyon/dağıtım için",
1006
+ "iot": "Nesnelerin İnterneti (IoT) projeleri için",
1007
+ "cloud_computing": "Bulut bilişim ve altyapı projeleri için",
1008
+ "blockchain": "Blockchain ve dağıtık sistemler için",
1009
+ "ai_research": "Yapay zeka araştırma ve geliştirme projeleri için",
1010
+ "seo": "Arama motoru optimizasyonu stratejileri için",
1011
+ "social_media": "Sosyal medya stratejisi ve içerik planlaması için",
1012
+ "e_commerce": "E-ticaret platformu ve stratejisi geliştirme için",
1013
+ "digital_marketing": "Dijital pazarlama kampanyaları ve stratejileri için",
1014
+ "general": "Genel amaçlı görevler için"
1015
+ }
1016
+
1017
+ # OpenAI modelleri
1018
+ OPENAI_MODELS = [
1019
+ "gpt-4o",
1020
+ "gpt-4o-mini",
1021
+ "gpt-4-turbo",
1022
+ "gpt-4",
1023
+ "gpt-4-32k",
1024
+ "gpt-3.5-turbo",
1025
+ "gpt-3.5-turbo-16k"
1026
+ ]
1027
+
1028
+ # Gemini modelleri
1029
+ GEMINI_MODELS = [
1030
+ "gemini-2.5-pro-preview-03-25",
1031
+ "gemini-2.0-flash",
1032
+ "gemini-2.0-flash-lite",
1033
+ "gemini-1.5-flash",
1034
+ "gemini-1.5-flash-8b",
1035
+ "gemini-1.5-pro",
1036
+ "gemini-embedding-exp",
1037
+ "imagen-3.0-generate-002",
1038
+ "veo-2.0-generate-001",
1039
+ "gemini-2.0-flash-live-001",
1040
+ "gemini-1.0-pro",
1041
+ "gemini-1.0-pro-vision",
1042
+ "gemini-1.0-pro-latest",
1043
+ "gemini-1.0-pro-vision-latest"
1044
+ ]
1045
+
1046
+ # OpenRouter modelleri
1047
+ OPENROUTER_MODELS = [
1048
+ # OpenAI modelleri
1049
+ "openai/gpt-4o",
1050
+ "openai/gpt-4o-mini",
1051
+ "openai/gpt-4-turbo",
1052
+ "openai/gpt-4",
1053
+ "openai/gpt-4-32k",
1054
+ "openai/gpt-3.5-turbo",
1055
+ "openai/gpt-3.5-turbo-16k",
1056
+
1057
+ # Anthropic modelleri
1058
+ "anthropic/claude-3.7-sonnet",
1059
+ "anthropic/claude-3.5-sonnet",
1060
+ "anthropic/claude-3-opus",
1061
+ "anthropic/claude-3-sonnet",
1062
+ "anthropic/claude-3-haiku",
1063
+ "anthropic/claude-2.1",
1064
+ "anthropic/claude-2",
1065
+ "anthropic/claude-instant-1.2",
1066
+
1067
+ # Google modelleri
1068
+ "google/gemini-2.5-pro-preview-03-25",
1069
+ "google/gemini-2.0-flash",
1070
+ "google/gemini-2.0-flash-lite",
1071
+ "google/gemini-1.5-flash",
1072
+ "google/gemini-1.5-flash-8b",
1073
+ "google/gemini-1.5-pro",
1074
+ "google/gemini-1.0-pro",
1075
+
1076
+ # Meta modelleri
1077
+ "meta-llama/llama-3-70b-instruct",
1078
+ "meta-llama/llama-3-8b-instruct",
1079
+ "meta-llama/llama-3.1-405b-instruct",
1080
+ "meta-llama/llama-3.1-70b-instruct",
1081
+ "meta-llama/llama-3.1-8b-instruct",
1082
+ "meta-llama/llama-2-70b-chat",
1083
+ "meta-llama/llama-2-13b-chat",
1084
+ "meta-llama/llama-2-7b-chat",
1085
+
1086
+ # Mistral modelleri
1087
+ "mistral/mistral-large-2",
1088
+ "mistral/mistral-large",
1089
+ "mistral/mistral-medium",
1090
+ "mistral/mistral-small",
1091
+ "mistral/mistral-7b-instruct",
1092
+
1093
+ # xAI modelleri
1094
+ "x-ai/grok-3-beta",
1095
+ "x-ai/grok-3-mini-beta",
1096
+ "x-ai/grok-2",
1097
+ "x-ai/grok-1.5-pro",
1098
+ "x-ai/grok-1",
1099
+
1100
+ # Cohere modelleri
1101
+ "cohere/command-r-plus",
1102
+ "cohere/command-r",
1103
+
1104
+ # Perplexity modelleri
1105
+ "perplexity/sonar-small-online",
1106
+ "perplexity/sonar-medium-online",
1107
+ "perplexity/sonar-medium-chat",
1108
+
1109
+ # NVIDIA modelleri
1110
+ "nvidia/llama-3.1-nemotron-ultra-253b-v1",
1111
+ "nvidia/llama-3.3-nemotron-super-49b-v1",
1112
+ "nvidia/llama-3.1-nemotron-nano-8b-v1",
1113
+
1114
+ # Moonshot AI modelleri
1115
+ "moonshotai/kimi-vl-a3b-thinking",
1116
+
1117
+ # Optimus modelleri
1118
+ "openrouter/optimus-alpha",
1119
+
1120
+ # Swallow modelleri
1121
+ "tokyotech-llm/llama-3.1-swallow-8b-instruct-v0.3",
1122
+
1123
+ # Meta Llama 4 modelleri
1124
+ "meta-llama/llama-4-maverick",
1125
+
1126
+ # Qwen modelleri
1127
+ "qwen/qwen-2-72b-instruct",
1128
+ "qwen/qwen-2-7b-instruct",
1129
+
1130
+ # Deepseek modelleri
1131
+ "deepseek/deepseek-coder-v2",
1132
+ "deepseek/deepseek-v2",
1133
+
1134
+ # Aleph Alpha modelleri
1135
+ "aleph-alpha/luminous-supreme",
1136
+ "aleph-alpha/luminous-base",
1137
+
1138
+ # Databricks modelleri
1139
+ "databricks/dbrx-instruct",
1140
+
1141
+ # Nous modelleri
1142
+ "nous/nous-hermes-2-mixtral-8x7b-dpo",
1143
+ "nous/nous-hermes-2-yi-34b",
1144
+
1145
+ # Jais modelleri
1146
+ "jais/jais-30b-chat",
1147
+ "jais/jais-13b-chat",
1148
+
1149
+ # Snowflake modelleri
1150
+ "snowflake/arctic",
1151
+
1152
+ # Adept modelleri
1153
+ "adept/fuyu-8b",
1154
+
1155
+ # Anyscale modelleri
1156
+ "anyscale/mistral-7b-instruct",
1157
+
1158
+ # Stability AI modelleri
1159
+ "stability/stable-code-3b",
1160
+
1161
+ # Fireworks modelleri
1162
+ "fireworks/firefunction-v2",
1163
+ "fireworks/firellava-13b",
1164
+
1165
+ # Voyage modelleri
1166
+ "voyage/voyage-2",
1167
+ "voyage/voyage-lite-2",
1168
+
1169
+ # Groq modelleri
1170
+ "groq/llama-3-70b-8192",
1171
+ "groq/mixtral-8x7b-32768",
1172
+
1173
+ # Reka modelleri
1174
+ "reka/reka-core",
1175
+ "reka/reka-flash",
1176
+
1177
+ # Quasar modelleri
1178
+ "quasar/quasar-alpha",
1179
+
1180
+ # Zypher modelleri
1181
+ "zypher/zypher-7b-beta",
1182
+
1183
+ # Inflection modelleri
1184
+ "inflection/inflection-2",
1185
+
1186
+ # Cloudflare modelleri
1187
+ "cloudflare/workers-ai-mistral-7b",
1188
+
1189
+ # Hugging Face modelleri
1190
+ "huggingface/zephyr-7b-beta",
1191
+
1192
+ # Replicate modelleri
1193
+ "replicate/llama-2-70b-chat",
1194
+
1195
+ # Together AI modelleri
1196
+ "together/yi-34b-chat",
1197
+ "together/llama-2-7b-chat",
1198
+
1199
+ # Phind modelleri
1200
+ "phind/phind-codellama-34b",
1201
+
1202
+ # Teknium modelleri
1203
+ "teknium/openhermes-2.5-mistral-7b",
1204
+
1205
+ # Gryphe modelleri
1206
+ "gryphe/mythomist-7b",
1207
+
1208
+ # Neversleep modelleri
1209
+ "neversleep/llama-2-13b-chat-hf",
1210
+
1211
+ # Mancer modelleri
1212
+ "mancer/weaver",
1213
+
1214
+ # Openchat modelleri
1215
+ "openchat/openchat-7b",
1216
+
1217
+ # Cognitivecomputations modelleri
1218
+ "cognitivecomputations/dolphin-2.5-mixtral-8x7b",
1219
+
1220
+ # Nousresearch modelleri
1221
+ "nousresearch/nous-hermes-llama2-13b",
1222
+
1223
+ # Lizpreciatior modelleri
1224
+ "lizpreciatior/lzlv-70b-fp16-hf",
1225
+
1226
+ # Pygmalionai modelleri
1227
+ "pygmalionai/mythalion-13b",
1228
+
1229
+ # Undi95 modelleri
1230
+ "undi95/remm-slerp-l2-13b",
1231
+
1232
+ # Jondurbin modelleri
1233
+ "jondurbin/airoboros-l2-70b-gpt4-1.4.1",
1234
+
1235
+ # Migtissera modelleri
1236
+ "migtissera/synthia-70b",
1237
+
1238
+ # Alpindale modelleri
1239
+ "alpindale/goliath-120b",
1240
+
1241
+ # Koboldai modelleri
1242
+ "koboldai/psyfighter-13b-2",
1243
+
1244
+ # Ehartford modelleri
1245
+ "ehartford/samantha-1.2-mistral-7b",
1246
+
1247
+ # Austism modelleri
1248
+ "austism/chronos-hermes-13b",
1249
+
1250
+ # Openaccess-ai-collective modelleri
1251
+ "openaccess-ai-collective/manticore-13b-chat",
1252
+
1253
+ # Lmsys modelleri
1254
+ "lmsys/vicuna-13b-v1.5",
1255
+
1256
+ # Databricks modelleri
1257
+ "databricks/dolly-v2-12b",
1258
+
1259
+ # Stabilityai modelleri
1260
+ "stabilityai/stablelm-tuned-alpha-7b",
1261
+
1262
+ # Togethercomputer modelleri
1263
+ "togethercomputer/redpajama-incite-7b-chat",
1264
+
1265
+ # Rwkv modelleri
1266
+ "rwkv/rwkv-4-raven-14b",
1267
+
1268
+ # Cerebras modelleri
1269
+ "cerebras/cerebras-gpt-13b",
1270
+
1271
+ # Mosaicml modelleri
1272
+ "mosaicml/mpt-7b-chat",
1273
+
1274
+ # Bigscience modelleri
1275
+ "bigscience/bloom-7b1",
1276
+
1277
+ # Eleutherai modelleri
1278
+ "eleutherai/gpt-neox-20b",
1279
+
1280
+ # Tiiuae modelleri
1281
+ "tiiuae/falcon-7b-instruct",
1282
+
1283
+ # Writer modelleri
1284
+ "writer/palmyra-e",
1285
+
1286
+ # Alibaba modelleri
1287
+ "alibaba/qwen-7b-chat",
1288
+
1289
+ # 01-ai modelleri
1290
+ "01-ai/yi-6b-chat",
1291
+
1292
+ # Baichuan modelleri
1293
+ "baichuan/baichuan-13b-chat",
1294
+
1295
+ # Internlm modelleri
1296
+ "internlm/internlm-7b",
1297
+
1298
+ # Chatglm modelleri
1299
+ "chatglm/chatglm2-6b",
1300
+
1301
+ # Thudm modelleri
1302
+ "thudm/chatglm-6b",
1303
+
1304
+ # Zhipu modelleri
1305
+ "zhipu/chatglm3-6b",
1306
+
1307
+ # Moonshot modelleri
1308
+ "moonshot/moonshot-v1-8k",
1309
+
1310
+ # Deepinfra modelleri
1311
+ "deepinfra/mistral-7b",
1312
+
1313
+ # Deepseek modelleri
1314
+ "deepseek/deepseek-llm-7b-chat",
1315
+
1316
+ # Upstage modelleri
1317
+ "upstage/solar-10.7b-instruct",
1318
+
1319
+ # Snorkelai modelleri
1320
+ "snorkelai/snorkel-mistral-7b",
1321
+
1322
+ # Recursal modelleri
1323
+ "recursal/rwkv-5-3b-ai-town",
1324
+
1325
+ # Allenai modelleri
1326
+ "allenai/tulu-2-dpo-7b",
1327
+
1328
+ # Databricks modelleri
1329
+ "databricks/dbrx-instruct",
1330
+
1331
+ # Snowflake modelleri
1332
+ "snowflake/arctic",
1333
+
1334
+ # Adept modelleri
1335
+ "adept/persimmon-8b-base",
1336
+
1337
+ # Anyscale modelleri
1338
+ "anyscale/mistral-7b-instruct",
1339
+
1340
+ # Stability AI modelleri
1341
+ "stability/stable-code-3b",
1342
+
1343
+ # Fireworks modelleri
1344
+ "fireworks/firefunction-v1",
1345
+
1346
+ # Voyage modelleri
1347
+ "voyage/voyage-2",
1348
+
1349
+ # Groq modelleri
1350
+ "groq/llama-3-70b-8192",
1351
+
1352
+ # Reka modelleri
1353
+ "reka/reka-core",
1354
+
1355
+ # Quasar modelleri
1356
+ "quasar/quasar-alpha",
1357
+
1358
+ # Zypher modelleri
1359
+ "zypher/zypher-7b-beta",
1360
+
1361
+ # Inflection modelleri
1362
+ "inflection/inflection-2",
1363
+
1364
+ # Cloudflare modelleri
1365
+ "cloudflare/workers-ai-mistral-7b",
1366
+
1367
+ # Hugging Face modelleri
1368
+ "huggingface/zephyr-7b-beta",
1369
+
1370
+ # Replicate modelleri
1371
+ "replicate/llama-2-70b-chat",
1372
+
1373
+ # Together AI modelleri
1374
+ "together/yi-34b-chat",
1375
+
1376
+ # Phind modelleri
1377
+ "phind/phind-codellama-34b",
1378
+
1379
+ # Teknium modelleri
1380
+ "teknium/openhermes-2.5-mistral-7b",
1381
+
1382
+ # Gryphe modelleri
1383
+ "gryphe/mythomist-7b",
1384
+
1385
+ # Neversleep modelleri
1386
+ "neversleep/llama-2-13b-chat-hf",
1387
+
1388
+ # Mancer modelleri
1389
+ "mancer/weaver",
1390
+
1391
+ # Openchat modelleri
1392
+ "openchat/openchat-7b",
1393
+
1394
+ # Cognitivecomputations modelleri
1395
+ "cognitivecomputations/dolphin-2.5-mixtral-8x7b",
1396
+
1397
+ # Nousresearch modelleri
1398
+ "nousresearch/nous-hermes-llama2-13b",
1399
+
1400
+ # Lizpreciatior modelleri
1401
+ "lizpreciatior/lzlv-70b-fp16-hf",
1402
+
1403
+ # Pygmalionai modelleri
1404
+ "pygmalionai/mythalion-13b",
1405
+
1406
+ # Undi95 modelleri
1407
+ "undi95/remm-slerp-l2-13b",
1408
+
1409
+ # Jondurbin modelleri
1410
+ "jondurbin/airoboros-l2-70b-gpt4-1.4.1",
1411
+
1412
+ # Migtissera modelleri
1413
+ "migtissera/synthia-70b",
1414
+
1415
+ # Alpindale modelleri
1416
+ "alpindale/goliath-120b",
1417
+
1418
+ # Koboldai modelleri
1419
+ "koboldai/psyfighter-13b-2",
1420
+
1421
+ # Ehartford modelleri
1422
+ "ehartford/samantha-1.2-mistral-7b",
1423
+
1424
+ # Austism modelleri
1425
+ "austism/chronos-hermes-13b",
1426
+
1427
+ # Openaccess-ai-collective modelleri
1428
+ "openaccess-ai-collective/manticore-13b-chat",
1429
+
1430
+ # Lmsys modelleri
1431
+ "lmsys/vicuna-13b-v1.5",
1432
+
1433
+ # Databricks modelleri
1434
+ "databricks/dolly-v2-12b",
1435
+
1436
+ # Stabilityai modelleri
1437
+ "stabilityai/stablelm-tuned-alpha-7b",
1438
+
1439
+ # Togethercomputer modelleri
1440
+ "togethercomputer/redpajama-incite-7b-chat",
1441
+
1442
+ # Rwkv modelleri
1443
+ "rwkv/rwkv-4-raven-14b",
1444
+
1445
+ # Cerebras modelleri
1446
+ "cerebras/cerebras-gpt-13b",
1447
+
1448
+ # Mosaicml modelleri
1449
+ "mosaicml/mpt-7b-chat",
1450
+
1451
+ # Bigscience modelleri
1452
+ "bigscience/bloom-7b1",
1453
+
1454
+ # Eleutherai modelleri
1455
+ "eleutherai/gpt-neox-20b",
1456
+
1457
+ # Tiiuae modelleri
1458
+ "tiiuae/falcon-7b-instruct",
1459
+
1460
+ # Writer modelleri
1461
+ "writer/palmyra-e",
1462
+
1463
+ # Alibaba modelleri
1464
+ "alibaba/qwen-7b-chat",
1465
+
1466
+ # 01-ai modelleri
1467
+ "01-ai/yi-6b-chat",
1468
+
1469
+ # Baichuan modelleri
1470
+ "baichuan/baichuan-13b-chat",
1471
+
1472
+ # Internlm modelleri
1473
+ "internlm/internlm-7b",
1474
+
1475
+ # Chatglm modelleri
1476
+ "chatglm/chatglm2-6b",
1477
+
1478
+ # Thudm modelleri
1479
+ "thudm/chatglm-6b",
1480
+
1481
+ # Zhipu modelleri
1482
+ "zhipu/chatglm3-6b",
1483
+
1484
+ # Moonshot modelleri
1485
+ "moonshot/moonshot-v1-8k"
1486
+ ]
1487
+
1488
+ # Prompt oluşturma fonksiyonu
1489
+ def create_prompt(category, params):
1490
+ """
1491
+ Belirli bir kategori ve parametreler için prompt oluşturur.
1492
+
1493
+ Args:
1494
+ category (str): Prompt kategorisi
1495
+ params (dict): Prompt parametreleri
1496
+
1497
+ Returns:
1498
+ str: Oluşturulan prompt
1499
+ """
1500
+ if category not in PROMPT_TEMPLATES:
1501
+ return "Geçersiz kategori. Lütfen geçerli bir kategori seçin."
1502
+
1503
+ template = PROMPT_TEMPLATES[category]
1504
+
1505
+ # Eksik parametreler için varsayılan değerler
1506
+ for key in [k for k in params.keys() if params[k] is None or params[k] == ""]:
1507
+ params[key] = "Belirtilmemiş"
1508
+
1509
+ # Format string ile prompt oluştur
1510
+ try:
1511
+ prompt = template.format(**params)
1512
+ return prompt
1513
+ except KeyError as e:
1514
+ return f"Eksik parametre: {e}"
1515
+ except Exception as e:
1516
+ return f"Prompt oluşturulurken hata oluştu: {e}"
1517
+
1518
+ # Prompt kategorisini tahmin etme fonksiyonu
1519
+ def predict_category(user_input):
1520
+ """
1521
+ Kullanıcı girdisine göre en uygun prompt kategorisini tahmin eder.
1522
+
1523
+ Args:
1524
+ user_input (str): Kullanıcı girdisi
1525
+
1526
+ Returns:
1527
+ str: Tahmini prompt kategorisi
1528
+ """
1529
+ # Basit anahtar kelime tabanlı kategori tahmini
1530
+ keywords = {
1531
+ "web_development": ["web", "site", "website", "html", "css", "javascript", "frontend", "backend", "responsive", "sayfa"],
1532
+ "mobile_app": ["mobil", "uygulama", "app", "android", "ios", "flutter", "react native", "swift", "kotlin"],
1533
+ "data_analysis": ["veri", "analiz", "data", "analysis", "istatistik", "statistics", "analitik", "analytics"],
1534
+ "data_visualization": ["görselleştirme", "visualization", "dashboard", "grafik", "chart", "veri görselleştirme", "data viz"],
1535
+ "ml_model": ["makine öğrenmesi", "machine learning", "model", "yapay zeka", "ai", "artificial intelligence", "tahmin", "prediction", "sınıflandırma", "classification"],
1536
+ "deep_learning": ["derin öğrenme", "deep learning", "neural network", "sinir ağı", "cnn", "rnn", "lstm", "transformer"],
1537
+ "content_creation": ["içerik", "yazı", "blog", "makale", "article", "sosyal medya", "social media", "metin", "text", "pazarlama", "marketing"],
1538
+ "game_development": ["oyun", "game", "unity", "unreal", "2d", "3d", "oyun geliştirme", "game dev"],
1539
+ "education": ["eğitim", "education", "öğretim", "teaching", "kurs", "course", "öğrenme", "learning"],
1540
+ "finance": ["finans", "finance", "finansal", "financial", "yatırım", "investment", "bütçe", "budget"],
1541
+ "automation": ["otomasyon", "automation", "bot", "script", "workflow", "iş akışı"],
1542
+ "cybersecurity": ["güvenlik", "security", "siber", "cyber", "hack", "sızma", "penetration", "güvenlik duvarı", "firewall"],
1543
+ "devops": ["devops", "ci/cd", "pipeline", "deployment", "docker", "kubernetes", "container"],
1544
+ "iot": ["iot", "nesnelerin interneti", "internet of things", "sensör", "sensor", "arduino", "raspberry pi"],
1545
+ "cloud_computing": ["bulut", "cloud", "aws", "azure", "gcp", "serverless", "saas", "paas", "iaas"],
1546
+ "blockchain": ["blockchain", "blok zinciri", "crypto", "kripto", "nft", "token", "smart contract", "akıllı sözleşme"],
1547
+ "ai_research": ["ai research", "yapay zeka araştırması", "ai paper", "research", "araştırma", "paper", "makale"],
1548
+ "seo": ["seo", "search engine optimization", "arama motoru optimizasyonu", "google", "ranking", "sıralama"],
1549
+ "social_media": ["sosyal medya", "social media", "instagram", "twitter", "facebook", "linkedin", "tiktok"],
1550
+ "e_commerce": ["e-ticaret", "ecommerce", "online satış", "online sales", "shopify", "woocommerce", "magento"],
1551
+ "digital_marketing": ["dijital pazarlama", "digital marketing", "online marketing", "çevrimiçi pazarlama", "ads", "reklamlar"]
1552
+ }
1553
+
1554
+ # Kullanıcı girdisini küçük harfe çevir
1555
+ user_input_lower = user_input.lower()
1556
+
1557
+ # Her kategori için eşleşen anahtar kelime sayısını hesapla
1558
+ category_scores = {}
1559
+ for category, category_keywords in keywords.items():
1560
+ score = sum(1 for keyword in category_keywords if keyword in user_input_lower)
1561
+ category_scores[category] = score
1562
+
1563
+ # En yüksek skora sahip kategoriyi bul
1564
+ max_score = max(category_scores.values())
1565
+ if max_score > 0:
1566
+ for category, score in category_scores.items():
1567
+ if score == max_score:
1568
+ return category
1569
+
1570
+ # Eşleşme bulunamazsa genel kategoriyi döndür
1571
+ return "general"
1572
+
1573
+ # Kullanıcı girdisinden parametreleri çıkarma fonksiyonu
1574
+ def extract_parameters(category, user_input):
1575
+ """
1576
+ Kullanıcı girdisinden prompt parametrelerini çıkarır.
1577
+
1578
+ Args:
1579
+ category (str): Prompt kategorisi
1580
+ user_input (str): Kullanıcı girdisi
1581
+
1582
+ Returns:
1583
+ dict: Çıkarılan parametreler
1584
+ """
1585
+ # Kullanıcı girdisini küçük harfe çevir (arama için)
1586
+ user_input_lower = user_input.lower()
1587
+
1588
+ # Kategori bazlı parametre çıkarma
1589
+ if category == "web_development":
1590
+ # Varsayılan frontend teknolojisi
1591
+ frontend_tech = "HTML, CSS, JavaScript"
1592
+
1593
+ # Özel teknolojileri kontrol et
1594
+ if "bootstrap" in user_input_lower:
1595
+ frontend_tech += ", Bootstrap"
1596
+ if "react" in user_input_lower:
1597
+ frontend_tech += ", React"
1598
+ if "vue" in user_input_lower:
1599
+ frontend_tech += ", Vue.js"
1600
+ if "angular" in user_input_lower:
1601
+ frontend_tech += ", Angular"
1602
+ if "tailwind" in user_input_lower:
1603
+ frontend_tech += ", Tailwind CSS"
1604
+
1605
+ # Backend teknolojisini kontrol et
1606
+ backend_tech = "Belirtilmemiş"
1607
+ if "node" in user_input_lower or "express" in user_input_lower:
1608
+ backend_tech = "Node.js/Express.js"
1609
+ elif "php" in user_input_lower:
1610
+ backend_tech = "PHP"
1611
+ elif "python" in user_input_lower or "django" in user_input_lower or "flask" in user_input_lower:
1612
+ backend_tech = "Python (Django/Flask)"
1613
+ elif "ruby" in user_input_lower or "rails" in user_input_lower:
1614
+ backend_tech = "Ruby on Rails"
1615
+ elif "java" in user_input_lower or "spring" in user_input_lower:
1616
+ backend_tech = "Java (Spring)"
1617
+ elif "c#" in user_input_lower or "asp.net" in user_input_lower:
1618
+ backend_tech = "ASP.NET"
1619
+
1620
+ # Veritabanı teknolojisini kontrol et
1621
+ database = "Belirtilmemiş"
1622
+ if "mysql" in user_input_lower:
1623
+ database = "MySQL"
1624
+ elif "postgresql" in user_input_lower or "postgres" in user_input_lower:
1625
+ database = "PostgreSQL"
1626
+ elif "mongodb" in user_input_lower or "mongo" in user_input_lower:
1627
+ database = "MongoDB"
1628
+ elif "sql server" in user_input_lower or "sqlserver" in user_input_lower:
1629
+ database = "SQL Server"
1630
+ elif "sqlite" in user_input_lower:
1631
+ database = "SQLite"
1632
+ elif "firebase" in user_input_lower:
1633
+ database = "Firebase"
1634
+
1635
+ params = {
1636
+ "project_description": user_input,
1637
+ "frontend_tech": frontend_tech,
1638
+ "backend_tech": backend_tech,
1639
+ "database": database,
1640
+ "target_devices": "Masaüstü ve Mobil",
1641
+ "design_preferences": "Modern, kullanıcı dostu arayüz",
1642
+ "features": "- Kullanıcı dostu arayüz\n- Responsive tasarım\n- Hızlı yükleme süresi",
1643
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1644
+ }
1645
+
1646
+ elif category == "mobile_app":
1647
+ params = {
1648
+ "project_description": user_input,
1649
+ "app_type": "Cross-platform",
1650
+ "platforms": "iOS ve Android",
1651
+ "framework": "React Native veya Flutter",
1652
+ "backend_requirements": "Belirtilmemiş",
1653
+ "target_audience": "Genel kullanıcılar",
1654
+ "features": "- Kullanıcı kaydı ve girişi\n- Ana işlevsellik\n- Bildirimler",
1655
+ "ui_requirements": "Modern ve sezgisel kullanıcı arayüzü",
1656
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1657
+ }
1658
+
1659
+ elif category == "data_analysis":
1660
+ params = {
1661
+ "project_description": user_input,
1662
+ "data_format": "CSV veya Excel",
1663
+ "data_size": "Belirtilmemiş",
1664
+ "data_source": "Belirtilmemiş",
1665
+ "time_range": "Belirtilmemiş",
1666
+ "analysis_goals": "Veri içindeki temel eğilimleri ve ilişkileri keşfetmek",
1667
+ "required_analyses": "- Tanımlayıcı istatistikler\n- Korelasyon analizi\n- Zaman serisi analizi (uygunsa)",
1668
+ "visualization_requirements": "Temel grafikler ve interaktif dashboard",
1669
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1670
+ }
1671
+
1672
+ elif category == "data_visualization":
1673
+ params = {
1674
+ "project_description": user_input,
1675
+ "data_format": "CSV veya Excel",
1676
+ "data_size": "Belirtilmemiş",
1677
+ "data_source": "Belirtilmemiş",
1678
+ "data_type": "Belirtilmemiş",
1679
+ "visualization_goals": "Veri içindeki temel eğilimleri ve ilişkileri görsel olarak sunmak",
1680
+ "required_visualizations": "- Çizgi ve çubuk grafikleri\n- Dağılım grafikleri\n- Interaktif dashboard",
1681
+ "design_requirements": "Sade, anlaşılır ve profesyonel tasarım",
1682
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1683
+ }
1684
+
1685
+ elif category == "ml_model":
1686
+ params = {
1687
+ "project_description": user_input,
1688
+ "problem_type": "Belirtilmemiş",
1689
+ "dataset_features": "Belirtilmemiş",
1690
+ "target_variable": "Belirtilmemiş",
1691
+ "evaluation_metrics": "Belirtilmemiş",
1692
+ "model_requirements": "Belirtilmemiş",
1693
+ "preprocessing_steps": "Belirtilmemiş",
1694
+ "deployment_requirements": "Belirtilmemiş",
1695
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1696
+ }
1697
+
1698
+ elif category == "deep_learning":
1699
+ params = {
1700
+ "project_description": user_input,
1701
+ "problem_type": "Belirtilmemiş",
1702
+ "dataset_features": "Belirtilmemiş",
1703
+ "data_size": "Belirtilmemiş",
1704
+ "evaluation_metrics": "Doğruluk, Kesinlik, Duyarlılık, F1-skoru",
1705
+ "model_requirements": "- Yüksek doğruluk\n- Verimli eğitim süresi\n- Hızlı çıkarım süresi",
1706
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1707
+ }
1708
+
1709
+ elif category == "content_creation":
1710
+ params = {
1711
+ "content_description": user_input,
1712
+ "content_format": "Blog yazısı",
1713
+ "content_length": "1000-1500 kelime",
1714
+ "tone": "Bilgilendirici ve samimi",
1715
+ "target_audience": "Genel okuyucular",
1716
+ "content_goals": "Bilgilendirmek ve ilgi çekmek",
1717
+ "key_points": "Kullanıcı girdisinden çıkarılacak",
1718
+ "keywords": "Belirtilmemiş",
1719
+ "meta_description": "Belirtilmemiş",
1720
+ "references": "Güvenilir kaynaklar kullanılmalıdır",
1721
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1722
+ }
1723
+
1724
+ elif category == "game_development":
1725
+ params = {
1726
+ "project_description": user_input,
1727
+ "game_type": "Belirtilmemiş",
1728
+ "platform": "PC",
1729
+ "game_engine": "Unity veya Unreal Engine",
1730
+ "graphic_style": "Belirtilmemiş",
1731
+ "target_audience": "Genel oyuncular",
1732
+ "game_mechanics": "Belirtilmemiş",
1733
+ "character_world_design": "Belirtilmemiş",
1734
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1735
+ }
1736
+
1737
+ elif category == "education":
1738
+ params = {
1739
+ "project_description": user_input,
1740
+ "subject": "Belirtilmemiş",
1741
+ "target_audience": "Belirtilmemiş",
1742
+ "difficulty_level": "Orta",
1743
+ "format": "Metin ve görsel",
1744
+ "duration_length": "Belirtilmemiş",
1745
+ "learning_objectives": "Belirtilmemiş",
1746
+ "content_structure": "Belirtilmemiş",
1747
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1748
+ }
1749
+
1750
+ elif category == "finance":
1751
+ params = {
1752
+ "project_description": user_input,
1753
+ "data_type": "Belirtilmemiş",
1754
+ "data_source": "Belirtilmemiş",
1755
+ "time_range": "Belirtilmemiş",
1756
+ "analysis_scope": "Belirtilmemiş",
1757
+ "analysis_objectives": "Belirtilmemiş",
1758
+ "required_analyses": "Belirtilmemiş",
1759
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1760
+ }
1761
+
1762
+ elif category == "automation":
1763
+ params = {
1764
+ "project_description": user_input,
1765
+ "automation_type": "Belirtilmemiş",
1766
+ "existing_systems": "Belirtilmemiş",
1767
+ "target_platforms": "Belirtilmemiş",
1768
+ "user_interaction": "Belirtilmemiş",
1769
+ "automation_objectives": "Belirtilmemiş",
1770
+ "workflow_details": "Belirtilmemiş",
1771
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1772
+ }
1773
+
1774
+ elif category == "cybersecurity":
1775
+ params = {
1776
+ "project_description": user_input,
1777
+ "security_domain": "Belirtilmemiş",
1778
+ "target_systems": "Belirtilmemiş",
1779
+ "threat_model": "Belirtilmemiş",
1780
+ "compliance_requirements": "Belirtilmemiş",
1781
+ "security_objectives": "Belirtilmemiş",
1782
+ "current_security_state": "Belirtilmemiş",
1783
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1784
+ }
1785
+
1786
+ elif category == "devops":
1787
+ params = {
1788
+ "project_description": user_input,
1789
+ "infrastructure_type": "Belirtilmemiş",
1790
+ "technology_stack": "Belirtilmemiş",
1791
+ "scaling_requirements": "Belirtilmemiş",
1792
+ "cicd_requirements": "Belirtilmemiş",
1793
+ "devops_objectives": "Belirtilmemiş",
1794
+ "current_infrastructure": "Belirtilmemiş",
1795
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1796
+ }
1797
+
1798
+ elif category == "iot":
1799
+ params = {
1800
+ "project_description": user_input,
1801
+ "device_types": "Belirtilmemiş",
1802
+ "connectivity_requirements": "Belirtilmemiş",
1803
+ "data_processing_requirements": "Belirtilmemiş",
1804
+ "security_requirements": "Belirtilmemiş",
1805
+ "iot_objectives": "Belirtilmemiş",
1806
+ "system_architecture": "Belirtilmemiş",
1807
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1808
+ }
1809
+
1810
+ elif category == "cloud_computing":
1811
+ params = {
1812
+ "project_description": user_input,
1813
+ "cloud_provider": "Belirtilmemiş",
1814
+ "service_model": "Belirtilmemiş",
1815
+ "scaling_requirements": "Belirtilmemiş",
1816
+ "budget_constraints": "Belirtilmemiş",
1817
+ "cloud_objectives": "Belirtilmemiş",
1818
+ "current_infrastructure": "Belirtilmemiş",
1819
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1820
+ }
1821
+
1822
+ elif category == "blockchain":
1823
+ params = {
1824
+ "project_description": user_input,
1825
+ "blockchain_type": "Belirtilmemiş",
1826
+ "consensus_mechanism": "Belirtilmemiş",
1827
+ "smart_contract_requirements": "Belirtilmemiş",
1828
+ "scaling_requirements": "Belirtilmemiş",
1829
+ "blockchain_objectives": "Belirtilmemiş",
1830
+ "use_cases": "Belirtilmemiş",
1831
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1832
+ }
1833
+
1834
+ elif category == "ai_research":
1835
+ params = {
1836
+ "research_description": user_input,
1837
+ "ai_subfield": "Belirtilmemiş",
1838
+ "research_type": "Belirtilmemiş",
1839
+ "literature_state": "Belirtilmemiş",
1840
+ "research_questions": "Belirtilmemiş",
1841
+ "research_objectives": "Belirtilmemiş",
1842
+ "methodology": "Belirtilmemiş",
1843
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1844
+ }
1845
+
1846
+ elif category == "seo":
1847
+ params = {
1848
+ "project_description": user_input,
1849
+ "website_type": "Belirtilmemiş",
1850
+ "target_keywords": "Belirtilmemiş",
1851
+ "target_market": "Belirtilmemiş",
1852
+ "competition_analysis": "Belirtilmemiş",
1853
+ "seo_objectives": "Belirtilmemiş",
1854
+ "current_seo_state": "Belirtilmemiş",
1855
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1856
+ }
1857
+
1858
+ elif category == "social_media":
1859
+ params = {
1860
+ "project_description": user_input,
1861
+ "platforms": "Belirtilmemiş",
1862
+ "target_audience": "Belirtilmemiş",
1863
+ "brand_voice": "Belirtilmemiş",
1864
+ "content_types": "Belirtilmemiş",
1865
+ "social_media_objectives": "Belirtilmemiş",
1866
+ "current_social_media_presence": "Belirtilmemiş",
1867
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1868
+ }
1869
+
1870
+ elif category == "e_commerce":
1871
+ params = {
1872
+ "project_description": user_input,
1873
+ "platform": "Belirtilmemiş",
1874
+ "product_types": "Belirtilmemiş",
1875
+ "payment_methods": "Belirtilmemiş",
1876
+ "logistics_requirements": "Belirtilmemiş",
1877
+ "ecommerce_objectives": "Belirtilmemiş",
1878
+ "current_ecommerce_state": "Belirtilmemiş",
1879
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1880
+ }
1881
+
1882
+ elif category == "digital_marketing":
1883
+ params = {
1884
+ "project_description": user_input,
1885
+ "marketing_channels": "Belirtilmemiş",
1886
+ "target_audience": "Belirtilmemiş",
1887
+ "budget": "Belirtilmemiş",
1888
+ "campaign_duration": "Belirtilmemiş",
1889
+ "marketing_objectives": "Belirtilmemiş",
1890
+ "current_marketing_state": "Belirtilmemiş",
1891
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1892
+ }
1893
+
1894
+ elif category == "script":
1895
+ # Senaryo formatını kontrol et
1896
+ script_format = "Belirtilmemiş"
1897
+ if "film" in user_input_lower:
1898
+ script_format = "Film"
1899
+ elif "dizi" in user_input_lower:
1900
+ script_format = "Dizi"
1901
+ elif "reklam" in user_input_lower:
1902
+ script_format = "Reklam"
1903
+ elif "youtube" in user_input_lower:
1904
+ script_format = "YouTube"
1905
+ elif "podcast" in user_input_lower:
1906
+ script_format = "Podcast"
1907
+ elif "eğitim" in user_input_lower or "video" in user_input_lower:
1908
+ script_format = "Eğitim Videosu"
1909
+
1910
+ # Tonunu kontrol et
1911
+ tone = "Bilgilendirici"
1912
+ if "komedi" in user_input_lower or "komik" in user_input_lower or "eğlenceli" in user_input_lower:
1913
+ tone = "Komedi"
1914
+ elif "drama" in user_input_lower or "dramatik" in user_input_lower:
1915
+ tone = "Drama"
1916
+ elif "aksiyon" in user_input_lower:
1917
+ tone = "Aksiyon"
1918
+ elif "ikna" in user_input_lower:
1919
+ tone = "İkna Edici"
1920
+ elif "duygusal" in user_input_lower:
1921
+ tone = "Duygusal"
1922
+
1923
+ params = {
1924
+ "project_description": user_input,
1925
+ "script_format": script_format,
1926
+ "duration": "Belirtilmemiş",
1927
+ "target_audience": "Genel izleyici",
1928
+ "tone": tone,
1929
+ "script_objectives": "İzleyicileri bilgilendirmek ve ilgilerini çekmek",
1930
+ "content_requirements": "Senaryoda ana konu net bir şekilde açıklanmalı ve hedef kitleye uygun dil kullanılmalıdır.",
1931
+ "character_details": "Karakterler kullanıcı girdisinden çıkarılacak",
1932
+ "technical_requirements": "Standart senaryo formatı kullanılmalıdır.",
1933
+ "references": "Kullanıcı tarafından belirtilmemiştir.",
1934
+ "additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1935
+ }
1936
+
1937
+ else: # general
1938
+ params = {
1939
+ "task_description": user_input,
1940
+ "requirements": "Kullanıcı girdisinden çıkarılacak",
1941
+ "expected_output": "Detaylı ve kapsamlı bir çözüm",
1942
+ "constraints": "Belirtilmemiş",
1943
+ "step_1": "Problemi analiz et",
1944
+ "step_2": "Çözüm stratejisi geliştir",
1945
+ "step_3": "Adım adım uygula",
1946
+ "additional_info": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
1947
+ }
1948
+
1949
+ return params
1950
+
1951
+ # Kullanıcı girdisinden gelişmiş prompt oluşturma
1952
+ def generate_advanced_prompt(user_input):
1953
+ """
1954
+ Kullanıcı girdisinden gelişmiş bir prompt oluşturur.
1955
+
1956
+ Args:
1957
+ user_input (str): Kullanıcı girdisi
1958
+
1959
+ Returns:
1960
+ str: Oluşturulan gelişmiş prompt
1961
+ """
1962
+ # Kategori tahmini
1963
+ category = predict_category(user_input)
1964
+
1965
+ # Script/senaryo anahtar kelimelerini kontrol et
1966
+ user_input_lower = user_input.lower()
1967
+ if "senaryo" in user_input_lower or "script" in user_input_lower or "film" in user_input_lower or "dizi" in user_input_lower or "reklam script" in user_input_lower:
1968
+ category = "script"
1969
+
1970
+ # Parametreleri çıkar
1971
+ params = extract_parameters(category, user_input)
1972
+
1973
+ # Prompt oluştur
1974
+ prompt = create_prompt(category, params)
1975
+
1976
+ return prompt, category, params
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ streamlit==1.44.1
2
+ openai==1.72.0
3
+ google-generativeai==0.8.4
4
+ requests==2.31.0
5
+ python-dotenv==1.1.0
6
+ matplotlib==3.8.4
streamlit_ui.py ADDED
@@ -0,0 +1,1418 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Streamlit UI için modül.
3
+ Bu modül, Streamlit kullanarak web arayüzünü oluşturur.
4
+ """
5
+
6
+ import streamlit as st
7
+ import os
8
+ from typing import Dict, Any, Optional, List
9
+ import json
10
+ import pandas as pd
11
+ import re
12
+ from pathlib import Path
13
+ from dotenv import load_dotenv, set_key, find_dotenv
14
+ import io
15
+ import time
16
+ import base64
17
+ import numpy as np
18
+ import matplotlib.pyplot as plt
19
+
20
+ # Kendi modüllerimizi içe aktar
21
+ from prompt_templates import PROMPT_CATEGORIES
22
+ from chatbot_backend import chatbot, ai_interface
23
+ from api_integrations import (
24
+ api_manager,
25
+ openai_handler,
26
+ gemini_handler,
27
+ openrouter_handler
28
+ )
29
+
30
+ # API anahtarlarını yönetmek için fonksiyonlar
31
+ def save_api_keys_to_env(api_keys: Dict[str, str]) -> bool:
32
+ """
33
+ API anahtarlarını .env dosyasına kaydeder.
34
+
35
+ Args:
36
+ api_keys (Dict[str, str]): API anahtarları sözlüğü
37
+
38
+ Returns:
39
+ bool: İşlem başarılıysa True, değilse False
40
+ """
41
+ try:
42
+ # .env dosyasının yolunu bul
43
+ dotenv_path = find_dotenv()
44
+
45
+ # .env dosyası yoksa, proje dizininde oluştur
46
+ if not dotenv_path:
47
+ dotenv_path = os.path.join(os.getcwd(), ".env")
48
+ # UTF-8 olarak yeni dosya oluştur
49
+ with open(dotenv_path, "w", encoding="utf-8") as f:
50
+ f.write("# API Anahtarları\n")
51
+
52
+ # Mevcut .env dosyasını oku
53
+ env_content = {}
54
+ try:
55
+ # Varolan dosya varsa içeriğini oku
56
+ if os.path.exists(dotenv_path):
57
+ with open(dotenv_path, "r", encoding="utf-8") as f:
58
+ lines = f.readlines()
59
+
60
+ # Mevcut içeriği dictionary'ye dönüştür
61
+ for line in lines:
62
+ line = line.strip()
63
+ if line and not line.startswith("#") and "=" in line:
64
+ key, value = line.split("=", 1)
65
+ env_content[key.strip()] = value.strip().strip('"\'')
66
+ except UnicodeDecodeError:
67
+ # UTF-8 okunamıyorsa Latin-1 ile dene
68
+ with open(dotenv_path, "r", encoding="latin-1") as f:
69
+ lines = f.readlines()
70
+
71
+ # Mevcut içeriği dictionary'ye dönüştür
72
+ for line in lines:
73
+ line = line.strip()
74
+ if line and not line.startswith("#") and "=" in line:
75
+ key, value = line.split("=", 1)
76
+ env_content[key.strip()] = value.strip().strip('"\'')
77
+
78
+ # API anahtarlarını env_content sözlüğüne ekle
79
+ for key, value in api_keys.items():
80
+ if key == "openai" and value:
81
+ env_content["OPENAI_API_KEY"] = value
82
+ elif key == "gemini" and value:
83
+ env_content["GEMINI_API_KEY"] = value
84
+ elif key == "openrouter" and value:
85
+ env_content["OPENROUTER_API_KEY"] = value
86
+
87
+ # .env dosyasını yeniden oluştur
88
+ with open(dotenv_path, "w", encoding="utf-8") as f:
89
+ f.write("# API Anahtarları\n")
90
+ for key, value in env_content.items():
91
+ f.write(f"{key}={value}\n")
92
+
93
+ return True
94
+ except Exception as e:
95
+ st.error(f"API anahtarları kaydedilirken hata oluştu: {str(e)}")
96
+ return False
97
+
98
+ def load_api_keys_from_env() -> Dict[str, str]:
99
+ """
100
+ API anahtarlarını .env dosyasından yükler.
101
+
102
+ Returns:
103
+ Dict[str, str]: API anahtarları sözlüğü
104
+ """
105
+ try:
106
+ # .env dosyasının yolunu bul
107
+ dotenv_path = find_dotenv()
108
+
109
+ # API anahtarlarını içeren sözlük
110
+ api_keys = {
111
+ "openai": "",
112
+ "gemini": "",
113
+ "openrouter": ""
114
+ }
115
+
116
+ # .env dosyası yoksa boş API anahtarlarını döndür
117
+ if not dotenv_path or not os.path.exists(dotenv_path):
118
+ return api_keys
119
+
120
+ # .env dosyasını manuel olarak oku
121
+ try:
122
+ # Önce UTF-8 ile dene
123
+ with open(dotenv_path, "r", encoding="utf-8") as f:
124
+ lines = f.readlines()
125
+ except UnicodeDecodeError:
126
+ # UTF-8 çalışmazsa Latin-1 ile dene
127
+ with open(dotenv_path, "r", encoding="latin-1") as f:
128
+ lines = f.readlines()
129
+
130
+ # Dosya içeriğini işle
131
+ for line in lines:
132
+ line = line.strip()
133
+ if line and not line.startswith("#") and "=" in line:
134
+ key, value = line.split("=", 1)
135
+ key = key.strip()
136
+ value = value.strip().strip('"\'')
137
+
138
+ if key == "OPENAI_API_KEY":
139
+ api_keys["openai"] = value
140
+ elif key == "GEMINI_API_KEY":
141
+ api_keys["gemini"] = value
142
+ elif key == "OPENROUTER_API_KEY":
143
+ api_keys["openrouter"] = value
144
+
145
+ return api_keys
146
+ except Exception as e:
147
+ st.error(f"API anahtarları yüklenirken hata oluştu: {str(e)}")
148
+ return {
149
+ "openai": "",
150
+ "gemini": "",
151
+ "openrouter": ""
152
+ }
153
+
154
+ def load_saved_prompts() -> List[Dict[str, Any]]:
155
+ """
156
+ Kaydedilmiş promptları dosyadan yükler.
157
+
158
+ Returns:
159
+ List[Dict[str, Any]]: Kaydedilmiş promptlar listesi
160
+ """
161
+ save_dir = os.path.join(os.getcwd(), "saved_prompts")
162
+
163
+ # Dizin yoksa oluştur
164
+ if not os.path.exists(save_dir):
165
+ os.makedirs(save_dir)
166
+
167
+ save_path = os.path.join(save_dir, "saved_prompts.json")
168
+
169
+ if os.path.exists(save_path):
170
+ try:
171
+ with open(save_path, "r", encoding="utf-8") as f:
172
+ return json.load(f)
173
+ except:
174
+ return []
175
+ return []
176
+
177
+ def save_prompt(prompt: str, category: str, params: Dict[str, Any], name: str, tags: List[str] = None) -> bool:
178
+ """
179
+ Bir promptu dosyaya kaydeder.
180
+
181
+ Args:
182
+ prompt (str): Kaydedilecek prompt
183
+ category (str): Prompt kategorisi
184
+ params (Dict[str, Any]): Prompt parametreleri
185
+ name (str): Prompt adı
186
+ tags (List[str], optional): Prompt etiketleri
187
+
188
+ Returns:
189
+ bool: İşlem başarılıysa True, değilse False
190
+ """
191
+ save_dir = os.path.join(os.getcwd(), "saved_prompts")
192
+
193
+ # Dizin yoksa oluştur
194
+ if not os.path.exists(save_dir):
195
+ os.makedirs(save_dir)
196
+
197
+ save_path = os.path.join(save_dir, "saved_prompts.json")
198
+
199
+ # Mevcut kaydedilmiş promptları yükle
200
+ saved_prompts = []
201
+ if os.path.exists(save_path):
202
+ try:
203
+ with open(save_path, "r", encoding="utf-8") as f:
204
+ saved_prompts = json.load(f)
205
+ except:
206
+ saved_prompts = []
207
+
208
+ # Etiketler için varsayılan değer
209
+ if tags is None:
210
+ tags = [category]
211
+
212
+ # Yeni promptu ekle
213
+ saved_prompts.append({
214
+ "name": name,
215
+ "prompt": prompt,
216
+ "category": category,
217
+ "params": params,
218
+ "tags": tags,
219
+ "created_at": str(pd.Timestamp.now())
220
+ })
221
+
222
+ # Dosyaya kaydet
223
+ try:
224
+ with open(save_path, "w", encoding="utf-8") as f:
225
+ json.dump(saved_prompts, f, ensure_ascii=False, indent=2)
226
+ return True
227
+ except Exception as e:
228
+ st.error(f"Prompt kaydedilirken hata oluştu: {str(e)}")
229
+ return False
230
+
231
+ def main():
232
+ """
233
+ Ana Streamlit uygulaması.
234
+ """
235
+ # Sayfa yapılandırması
236
+ st.set_page_config(
237
+ page_title="Kralkayra taner atmaca tarafından",
238
+ page_icon="🤖",
239
+ layout="wide",
240
+ initial_sidebar_state="expanded"
241
+ )
242
+
243
+ # .env dosyasından API anahtarlarını yükle
244
+ env_api_keys = load_api_keys_from_env()
245
+
246
+ # Session state başlatma
247
+ if "api_keys" not in st.session_state:
248
+ st.session_state.api_keys = env_api_keys
249
+
250
+ # API anahtarlarını chatbot ve işleyicilere de yükle
251
+ for provider, key in st.session_state.api_keys.items():
252
+ if key:
253
+ api_manager.set_api_key(provider, key)
254
+
255
+ if provider == "openai":
256
+ openai_handler.set_api_key(key)
257
+ chatbot.ai_generator.set_api_key(provider, key)
258
+ elif provider == "gemini":
259
+ gemini_handler.set_api_key(key)
260
+ chatbot.ai_generator.set_api_key(provider, key)
261
+ elif provider == "openrouter":
262
+ openrouter_handler.set_api_key(key)
263
+ chatbot.ai_generator.set_api_key(provider, key)
264
+
265
+ # Gerekli importlar
266
+
267
+ # Başlık ve açıklama
268
+ st.title("Kralkayra taner atmaca tarafından")
269
+ st.markdown("Bu uygulama, AI modellerine verilecek detaylı promptlar oluşturmanıza yardımcı olur.")
270
+
271
+ # Sekmeler
272
+ tabs = st.tabs(["Ana Sayfa", "Prompt Kütüphanesi", "Prompt Şablonları", "İleri Analiz", "Görsel Prompt Oluşturucu", "Toplu İşlem"])
273
+
274
+ # Sidebar - API anahtarları
275
+ with st.sidebar:
276
+ st.header("API Anahtarları")
277
+
278
+ st.info("API anahtarlarınızı girin ve 'API Anahtarlarını Kaydet' butonuna tıklayarak kalıcı olarak kaydedin.")
279
+
280
+ # OpenAI API anahtarı
281
+ openai_api_key = st.text_input(
282
+ "OpenAI API Anahtarı",
283
+ type="password",
284
+ value=st.session_state.api_keys.get("openai", "")
285
+ )
286
+
287
+ # Google Gemini API anahtarı
288
+ gemini_api_key = st.text_input(
289
+ "Google Gemini API Anahtarı",
290
+ type="password",
291
+ value=st.session_state.api_keys.get("gemini", "")
292
+ )
293
+
294
+ # OpenRouter API anahtarı
295
+ openrouter_api_key = st.text_input(
296
+ "OpenRouter API Anahtarı",
297
+ type="password",
298
+ value=st.session_state.api_keys.get("openrouter", "")
299
+ )
300
+
301
+ # API anahtarlarını kaydet
302
+ if st.button("API Anahtarlarını Kaydet"):
303
+ # Yeni API anahtarları sözlüğü oluştur
304
+ new_api_keys = {
305
+ "openai": openai_api_key,
306
+ "gemini": gemini_api_key,
307
+ "openrouter": openrouter_api_key
308
+ }
309
+
310
+ # Session state'e API anahtarlarını kaydet
311
+ st.session_state.api_keys = new_api_keys
312
+
313
+ # API anahtarlarını ayarla
314
+ api_manager.set_api_key("openai", openai_api_key)
315
+ api_manager.set_api_key("gemini", gemini_api_key)
316
+ api_manager.set_api_key("openrouter", openrouter_api_key)
317
+
318
+ # API işleyicilerine de anahtarları ayarla
319
+ openai_handler.set_api_key(openai_api_key)
320
+ gemini_handler.set_api_key(gemini_api_key)
321
+ openrouter_handler.set_api_key(openrouter_api_key)
322
+
323
+ # Chatbot'un AI prompt generator'ına da anahtarları ayarla
324
+ chatbot.ai_generator.set_api_key("openai", openai_api_key)
325
+ chatbot.ai_generator.set_api_key("gemini", gemini_api_key)
326
+ chatbot.ai_generator.set_api_key("openrouter", openrouter_api_key)
327
+
328
+ # API anahtarlarını .env dosyasına kaydet
329
+ if save_api_keys_to_env(new_api_keys):
330
+ st.success("API anahtarları başarıyla kaydedildi ve kalıcı olarak saklandı!")
331
+ else:
332
+ st.warning("API anahtarları geçici olarak kaydedildi, ancak kalıcı saklama başarısız oldu.")
333
+
334
+ # API anahtarlarının durumunu göster
335
+ with st.expander("API Anahtarı Durumu", expanded=False):
336
+ openai_status = "✅ Ayarlandı" if st.session_state.api_keys.get("openai") else "❌ Ayarlanmadı"
337
+ gemini_status = "✅ Ayarlandı" if st.session_state.api_keys.get("gemini") else "❌ Ayarlanmadı"
338
+ openrouter_status = "✅ Ayarlandı" if st.session_state.api_keys.get("openrouter") else "❌ Ayarlanmadı"
339
+
340
+ st.write(f"OpenAI API: {openai_status}")
341
+ st.write(f"Gemini API: {gemini_status}")
342
+ st.write(f"OpenRouter API: {openrouter_status}")
343
+
344
+ # AI modeli seçimi
345
+ st.header("AI Modeli Seçimi")
346
+
347
+ # API sağlayıcısı seçimi
348
+ provider = st.selectbox(
349
+ "API Sağlayıcısı",
350
+ ["OpenAI", "Google Gemini", "OpenRouter"],
351
+ index=0
352
+ )
353
+
354
+ # Seçilen sağlayıcıya göre model listesini al
355
+ provider_key = provider.lower().replace(" ", "_")
356
+ if provider_key == "google_gemini":
357
+ provider_key = "gemini"
358
+
359
+ # Modelleri al
360
+ models = []
361
+ if provider_key == "openai":
362
+ models = openai_handler.get_available_models()
363
+ elif provider_key == "gemini":
364
+ models = gemini_handler.get_available_models()
365
+ elif provider_key == "openrouter":
366
+ models = openrouter_handler.get_available_models()
367
+
368
+ # Model seçimi
369
+ selected_model = None
370
+ if models:
371
+ selected_model = st.selectbox("Model", models)
372
+
373
+ # Ana Sayfa Sekmesi
374
+ with tabs[0]:
375
+ # Ana içerik
376
+ col1, col2 = st.columns([1, 1])
377
+
378
+ with col1:
379
+ st.header("Prompt Oluştur")
380
+
381
+ # Kullanıcı girdisi
382
+ user_input = st.text_area(
383
+ "Ne yapmak istediğinizi açıklayın:",
384
+ height=150,
385
+ placeholder="Örnek: Bir e-ticaret web sitesi yapmak istiyorum. Ürünleri listeleyebilmeli, sepete ekleyebilmeli ve ödeme alabilmeliyim."
386
+ )
387
+
388
+ # AI destekli prompt oluşturma seçeneği
389
+ if "use_ai_generation" not in st.session_state:
390
+ st.session_state.use_ai_generation = True
391
+
392
+ use_ai_generation = st.checkbox(
393
+ "AI destekli prompt oluşturma kullan",
394
+ value=st.session_state.use_ai_generation,
395
+ key="use_ai_generation_checkbox"
396
+ )
397
+
398
+ # Checkbox değiştiğinde session state'i güncelle
399
+ st.session_state.use_ai_generation = use_ai_generation
400
+
401
+ # API anahtarı kontrolü ve uyarı
402
+ selected_provider_key = provider.lower().replace(" ", "_")
403
+ if selected_provider_key == "google_gemini":
404
+ selected_provider_key = "gemini"
405
+
406
+ if use_ai_generation and not st.session_state.api_keys.get(selected_provider_key):
407
+ st.warning(f"AI destekli prompt oluşturma için {provider} API anahtarı gereklidir. Lütfen API anahtarınızı girin ve 'API Anahtarlarını Kaydet' butonuna tıklayın.")
408
+
409
+ # Prompt oluştur butonu
410
+ if st.button("Prompt Oluştur"):
411
+ if user_input:
412
+ with st.spinner("Prompt oluşturuluyor..."):
413
+ # Prompt oluştur
414
+ provider_key = provider.lower().replace(" ", "_")
415
+ if provider_key == "google_gemini":
416
+ provider_key = "gemini"
417
+
418
+ # API anahtarı kontrolü
419
+ if use_ai_generation and not st.session_state.api_keys.get(provider_key):
420
+ st.error(f"AI destekli prompt oluşturma için {provider} API anahtarı gereklidir. Lütfen API anahtarınızı girin ve 'API Anahtarlarını Kaydet' butonuna tıklayın.")
421
+ else:
422
+ # Debug bilgisi
423
+ st.session_state.debug_info = {
424
+ "use_ai_generation": use_ai_generation,
425
+ "provider": provider_key,
426
+ "model": selected_model,
427
+ "api_key_set": bool(st.session_state.api_keys.get(provider_key))
428
+ }
429
+
430
+ try:
431
+ prompt, category, params = chatbot.process_input(
432
+ user_input,
433
+ use_ai_generation=use_ai_generation,
434
+ provider=provider_key,
435
+ model=selected_model
436
+ )
437
+
438
+ # Sonuçları session state'e kaydet
439
+ st.session_state.prompt = prompt
440
+ st.session_state.category = category
441
+ st.session_state.params = params
442
+ except Exception as e:
443
+ st.error(f"Prompt oluşturma sırasında bir hata oluştu: {str(e)}")
444
+ st.session_state.prompt = "Prompt oluşturulurken bir hata oluştu. Lütfen tekrar deneyin veya AI destekli prompt oluşturmayı kapatın."
445
+ st.session_state.category = "error"
446
+ st.session_state.params = {}
447
+
448
+ # Sonuçları göster
449
+ st.success("Prompt başarıyla oluşturuldu!")
450
+ else:
451
+ st.error("Lütfen ne yapmak istediğinizi açıklayın.")
452
+
453
+ with col2:
454
+ st.header("Oluşturulan Prompt")
455
+
456
+ # Debug bilgisi (geliştirme aşamasında)
457
+ if "debug_info" in st.session_state:
458
+ with st.expander("Debug Bilgisi", expanded=False):
459
+ st.write(st.session_state.debug_info)
460
+
461
+ # Oluşturulan promptu göster
462
+ if "prompt" in st.session_state:
463
+ st.subheader(f"Kategori: {st.session_state.category}")
464
+
465
+ # Parametreleri göster
466
+ if st.session_state.params:
467
+ with st.expander("Parametreler", expanded=False):
468
+ for key, value in st.session_state.params.items():
469
+ st.write(f"**{key}:** {value}")
470
+
471
+ # Promptu göster
472
+ st.text_area(
473
+ "Prompt:",
474
+ value=st.session_state.prompt,
475
+ height=400,
476
+ disabled=True
477
+ )
478
+
479
+ # Promptu kopyala butonu
480
+ if st.button("Promptu Kopyala"):
481
+ st.code(st.session_state.prompt)
482
+ st.info("Yukarıdaki kodu seçip kopyalayabilirsiniz.")
483
+
484
+ # AI ile Test Et bölümü
485
+ st.subheader("AI ile Test Et")
486
+
487
+ # Test için API sağlayıcısı seçimi
488
+ test_provider = st.selectbox(
489
+ "Test için API Sağlayıcısı",
490
+ ["OpenAI", "Google Gemini", "OpenRouter"],
491
+ index=0,
492
+ key="test_provider"
493
+ )
494
+
495
+ # Test için model seçimi
496
+ test_provider_key = test_provider.lower().replace(" ", "_")
497
+ if test_provider_key == "google_gemini":
498
+ test_provider_key = "gemini"
499
+
500
+ # Test için modelleri al
501
+ test_models = []
502
+ if test_provider_key == "openai":
503
+ test_models = openai_handler.get_available_models()
504
+ elif test_provider_key == "gemini":
505
+ test_models = gemini_handler.get_available_models()
506
+ elif test_provider_key == "openrouter":
507
+ test_models = openrouter_handler.get_available_models()
508
+
509
+ # Test için model seçimi
510
+ test_selected_model = None
511
+ if test_models:
512
+ test_selected_model = st.selectbox("Test için Model", test_models, key="test_model")
513
+
514
+ # Test için API anahtarı giriş alanı
515
+ st.markdown("### Test için API Anahtarı")
516
+ st.info("Test için API anahtarını doğrudan buraya girebilirsiniz.")
517
+
518
+ test_api_key = st.text_input(
519
+ f"{test_provider} API Anahtarı (Test için)",
520
+ type="password",
521
+ key="test_api_key"
522
+ )
523
+
524
+ # Kod şablonları oluşturma seçeneği
525
+ generate_code_templates = st.checkbox("Kod şablonları ve dizin yapısı oluştur", value=True, key="generate_code_templates")
526
+
527
+ # AI ile Test Et butonu
528
+ if st.button("AI ile Test Et"):
529
+ if "prompt" in st.session_state:
530
+ if not test_api_key:
531
+ st.error(f"Lütfen test için {test_provider} API anahtarını girin.")
532
+ else:
533
+ with st.spinner("AI yanıtı alınıyor..."):
534
+ if generate_code_templates:
535
+ # Kod şablonları ile yanıt al
536
+ result = ai_interface.generate_response_with_code_templates(
537
+ test_provider_key,
538
+ st.session_state.prompt,
539
+ test_selected_model,
540
+ test_api_key
541
+ )
542
+
543
+ # Yanıtı ve şablonları session state'e kaydet
544
+ st.session_state.ai_response = result["response"]
545
+ st.session_state.code_templates = result["templates"]
546
+ else:
547
+ # Sadece yanıt al
548
+ response = ai_interface.generate_response(
549
+ test_provider_key,
550
+ st.session_state.prompt,
551
+ test_selected_model,
552
+ test_api_key
553
+ )
554
+
555
+ # Yanıtı session state'e kaydet
556
+ st.session_state.ai_response = response
557
+ if "code_templates" in st.session_state:
558
+ del st.session_state.code_templates
559
+
560
+ # Yanıtı göster
561
+ st.success("AI yanıtı başarıyla alındı!")
562
+ else:
563
+ st.error("Lütfen önce bir prompt oluşturun.")
564
+
565
+ # AI yanıtını göster
566
+ if "ai_response" in st.session_state:
567
+ st.subheader("AI Yanıtı")
568
+ st.text_area(
569
+ "Yanıt:",
570
+ value=st.session_state.ai_response,
571
+ height=400,
572
+ disabled=True
573
+ )
574
+
575
+ # Kod şablonları ve dizin yapısı varsa göster
576
+ if "code_templates" in st.session_state:
577
+ templates = st.session_state.code_templates
578
+
579
+ # Dizin yapısı
580
+ if templates["directory_structure"]:
581
+ with st.expander("📁 Dizin Yapısı", expanded=True):
582
+ for structure in templates["directory_structure"]:
583
+ st.code(structure, language="bash")
584
+
585
+ # Kod şablonları
586
+ if templates["code_templates"]:
587
+ with st.expander("💻 Kod Şablonları", expanded=True):
588
+ for template in templates["code_templates"]:
589
+ st.subheader(f"{template['language'].capitalize()} Dosyası")
590
+ st.code(template["code"], language=template["language"])
591
+
592
+ # Uygulama adımları
593
+ if templates["implementation_steps"]:
594
+ with st.expander("📝 Uygulama Adımları", expanded=True):
595
+ for i, step in enumerate(templates["implementation_steps"]):
596
+ if not step.startswith(f"{i+1}.") and not step.startswith("##"):
597
+ st.markdown(f"**Adım {i+1}:** {step}")
598
+ else:
599
+ st.markdown(step)
600
+
601
+ # Prompt Kaydetme Bölümü
602
+ if "prompt" in st.session_state:
603
+ with st.expander("Promptu Kaydet", expanded=False):
604
+ prompt_name = st.text_input("Prompt Adı", key="save_prompt_name")
605
+ prompt_tags = st.text_input("Etiketler (virgülle ayırın)", key="save_prompt_tags")
606
+
607
+ if st.button("Kaydet"):
608
+ if prompt_name:
609
+ tags = [tag.strip() for tag in prompt_tags.split(",")] if prompt_tags else []
610
+ if save_prompt(
611
+ st.session_state.prompt,
612
+ st.session_state.category,
613
+ st.session_state.params,
614
+ prompt_name,
615
+ tags
616
+ ):
617
+ st.success("Prompt başarıyla kaydedildi!")
618
+ else:
619
+ st.error("Lütfen prompt için bir isim girin.")
620
+ else:
621
+ st.info("Henüz bir prompt oluşturulmadı. Sol taraftaki formu doldurup 'Prompt Oluştur' butonuna tıklayın.")
622
+
623
+ # Prompt Kütüphanesi Sekmesi
624
+ with tabs[1]:
625
+ st.header("Kaydedilmiş Promptlar Kütüphanesi")
626
+
627
+ # Kaydedilmiş promptları yükle
628
+ saved_prompts = load_saved_prompts()
629
+
630
+ if not saved_prompts:
631
+ st.info("Henüz kaydedilmiş prompt bulunmuyor. Ana sayfada oluşturduğunuz promptları kaydedebilirsiniz.")
632
+ else:
633
+ # Filtreler
634
+ col1, col2 = st.columns(2)
635
+
636
+ with col1:
637
+ # Kategori filtresi
638
+ categories = list(set([p["category"] for p in saved_prompts]))
639
+ selected_category = st.selectbox("Kategori Filtresi", ["Tümü"] + categories, key="library_category_filter")
640
+
641
+ with col2:
642
+ # Etiket filtresi
643
+ all_tags = []
644
+ for p in saved_prompts:
645
+ all_tags.extend(p.get("tags", []))
646
+ unique_tags = list(set(all_tags))
647
+ selected_tag = st.selectbox("Etiket Filtresi", ["Tümü"] + unique_tags, key="library_tag_filter")
648
+
649
+ # Arama
650
+ search_query = st.text_input("Prompt Ara", key="library_search")
651
+
652
+ # Filtreleme
653
+ filtered_prompts = saved_prompts
654
+
655
+ if selected_category != "Tümü":
656
+ filtered_prompts = [p for p in filtered_prompts if p["category"] == selected_category]
657
+
658
+ if selected_tag != "Tümü":
659
+ filtered_prompts = [p for p in filtered_prompts if selected_tag in p.get("tags", [])]
660
+
661
+ if search_query:
662
+ search_lower = search_query.lower()
663
+ filtered_prompts = [p for p in filtered_prompts if
664
+ search_lower in p["name"].lower() or
665
+ search_lower in p["prompt"].lower()]
666
+
667
+ # Prompt listesi
668
+ if not filtered_prompts:
669
+ st.warning("Filtrelere uygun kayıtlı prompt bulunamadı.")
670
+ else:
671
+ for i, prompt_data in enumerate(filtered_prompts):
672
+ with st.expander(f"{prompt_data['name']} ({prompt_data['category']})", expanded=False):
673
+ st.text_area(
674
+ "Prompt:",
675
+ value=prompt_data["prompt"],
676
+ height=200,
677
+ disabled=True,
678
+ key=f"saved_prompt_{i}"
679
+ )
680
+
681
+ # Etiketler
682
+ st.write("**Etiketler:** " + ", ".join(prompt_data.get("tags", [])))
683
+
684
+ # Parametreler
685
+ if prompt_data.get("params"):
686
+ st.write("**Parametreler:**")
687
+ for key, value in prompt_data["params"].items():
688
+ st.write(f"- {key}: {value}")
689
+
690
+ # Oluşturulma tarihi
691
+ if "created_at" in prompt_data:
692
+ st.write(f"**Oluşturulma Tarihi:** {prompt_data['created_at']}")
693
+
694
+ # Prompt'u düzenleme ekranına yükle butonu
695
+ if st.button("Bu Prompt'u Düzenle", key=f"edit_prompt_{i}"):
696
+ st.session_state.prompt = prompt_data["prompt"]
697
+ st.session_state.category = prompt_data["category"]
698
+ st.session_state.params = prompt_data["params"]
699
+ st.session_state.editing_prompt = True
700
+ st.info("Prompt ana sayfaya yüklendi! Ana sayfaya geçerek düzenleyebilirsiniz.")
701
+
702
+ # Prompt'u sil butonu
703
+ if st.button("Bu Prompt'u Sil", key=f"delete_prompt_{i}"):
704
+ # Promptu listeden çıkar
705
+ saved_prompts.remove(prompt_data)
706
+
707
+ # Dosyaya kaydet
708
+ save_dir = os.path.join(os.getcwd(), "saved_prompts")
709
+ save_path = os.path.join(save_dir, "saved_prompts.json")
710
+
711
+ try:
712
+ with open(save_path, "w", encoding="utf-8") as f:
713
+ json.dump(saved_prompts, f, ensure_ascii=False, indent=2)
714
+ st.success("Prompt başarıyla silindi!")
715
+ st.rerun() # Sayfayı yeniden yükle
716
+ except Exception as e:
717
+ st.error(f"Prompt silinirken hata oluştu: {str(e)}")
718
+
719
+ # Prompt Şablonları Sekmesi
720
+ with tabs[2]:
721
+ st.header("Prompt Şablonları")
722
+
723
+ # Kategori seçimi
724
+ category = st.selectbox("Kategori", list(PROMPT_CATEGORIES.keys()), key="template_category")
725
+
726
+ # Seçilen kategoriye göre şablon göster
727
+ if category in PROMPT_CATEGORIES:
728
+ # Kategori açıklaması
729
+ if isinstance(PROMPT_CATEGORIES[category], dict) and "description" in PROMPT_CATEGORIES[category]:
730
+ st.write(PROMPT_CATEGORIES[category]["description"])
731
+
732
+ # Şablon parametreleri
733
+ st.subheader("Şablon Parametreleri")
734
+
735
+ # Parametreleri dinamik olarak oluştur
736
+ params = {}
737
+
738
+ from prompt_templates import PROMPT_TEMPLATES
739
+
740
+ if category in PROMPT_TEMPLATES:
741
+ template = PROMPT_TEMPLATES[category]
742
+
743
+ # Şablon parametrelerini regex ile bul
744
+ pattern = r'{(\w+)}'
745
+ params_keys = re.findall(pattern, template)
746
+
747
+ # Her parametre için input alanı oluştur
748
+ for param in params_keys:
749
+ params[param] = st.text_area(f"{param}:", height=100, key=f"template_param_{param}")
750
+
751
+ # Şablonu oluştur butonu
752
+ if st.button("Şablonu Oluştur"):
753
+ from prompt_templates import create_prompt
754
+ prompt = create_prompt(category, params)
755
+
756
+ # Promptu session state'e ekle
757
+ st.session_state.prompt = prompt
758
+ st.session_state.category = category
759
+ st.session_state.params = params
760
+
761
+ # Oluşturulan şablonu göster
762
+ st.subheader("Oluşturulan Şablon")
763
+ st.text_area(
764
+ "Prompt:",
765
+ value=prompt,
766
+ height=400,
767
+ disabled=True
768
+ )
769
+
770
+ # Şablon kullanım bilgisi
771
+ st.info("Bu şablon ana sayfaya yüklendi. Ana sayfaya geçerek düzenleyebilir veya API ile test edebilirsiniz.")
772
+
773
+ # İleri Analiz Sekmesi (Placeholder)
774
+ with tabs[3]:
775
+ st.header("İleri AI Analizi")
776
+
777
+ # Analiz edilecek prompt
778
+ analysis_prompt = st.text_area(
779
+ "Analiz edilecek prompt:",
780
+ height=200,
781
+ placeholder="Analiz etmek istediğiniz promptu buraya yapıştırın...",
782
+ key="analysis_prompt"
783
+ )
784
+
785
+ # Mevcut prompt varsa, onu otomatik olarak ekle
786
+ if "prompt" in st.session_state and not analysis_prompt:
787
+ if st.button("Mevcut promptu yükle"):
788
+ analysis_prompt = st.session_state.prompt
789
+ st.session_state.analysis_prompt = analysis_prompt
790
+ st.rerun()
791
+
792
+ if analysis_prompt:
793
+ # Analiz türleri
794
+ analysis_tabs = st.tabs(["Token Analizi", "Kalite Skorlaması", "Karmaşıklık Analizi"])
795
+
796
+ # Token Analizi
797
+ with analysis_tabs[0]:
798
+ st.subheader("Token Analizi")
799
+
800
+ # Basit token sayacı
801
+ words = analysis_prompt.split()
802
+ word_count = len(words)
803
+
804
+ # Yaklaşık token sayısı (GPT tokenizasyonu için yaklaşık değer)
805
+ # GPT tokenizasyonu genellikle kelimelerden daha küçük birimlerdir
806
+ # Yaklaşık olarak 4 karakter = 1 token olarak hesaplanabilir
807
+ char_count = len(analysis_prompt)
808
+ estimated_tokens = char_count // 4
809
+
810
+ # Sonuçları göster
811
+ col1, col2, col3 = st.columns(3)
812
+
813
+ with col1:
814
+ st.metric("Kelime Sayısı", word_count)
815
+
816
+ with col2:
817
+ st.metric("Karakter Sayısı", char_count)
818
+
819
+ with col3:
820
+ st.metric("Tahmini Token Sayısı", estimated_tokens)
821
+
822
+ # Token maliyeti tahmini
823
+ st.subheader("Tahmini Maliyet")
824
+
825
+ # Farklı modeller için maliyet tahminleri
826
+ model_costs = {
827
+ "gpt-3.5-turbo": {"input": 0.0000015, "output": 0.000002},
828
+ "gpt-4o": {"input": 0.00001, "output": 0.00003},
829
+ "gemini-1.5-pro": {"input": 0.000005, "output": 0.000005},
830
+ }
831
+
832
+ # Maliyetleri hesapla ve göster
833
+ cost_cols = st.columns(len(model_costs))
834
+ for i, (model, costs) in enumerate(model_costs.items()):
835
+ input_cost = estimated_tokens * costs["input"]
836
+ output_cost_1k = 1000 * costs["output"] # 1000 token yanıt için
837
+
838
+ with cost_cols[i]:
839
+ st.metric(f"{model}", f"${input_cost:.6f}")
840
+ st.caption(f"Prompt maliyeti")
841
+ st.metric("1000 token yanıt", f"${output_cost_1k:.4f}")
842
+
843
+ # Token optimizasyonu önerileri
844
+ st.subheader("Optimizasyon Önerileri")
845
+
846
+ if word_count > 200:
847
+ st.warning("Bu prompt oldukça uzun. Maliyeti düşürmek için kısaltmayı düşünebilirsiniz.")
848
+
849
+ # Optimizasyon önerileri
850
+ st.markdown("""
851
+ **Öneriler:**
852
+ - Gereksiz tekrarları kaldırın
853
+ - Örnek açıklamaları kısaltın
854
+ - Açıklama cümlelerini daha özlü hale getirin
855
+ """)
856
+ else:
857
+ st.success("Bu prompt token kullanımı açısından makul görünüyor.")
858
+
859
+ # Kalite Skorlaması
860
+ with analysis_tabs[1]:
861
+ st.subheader("Prompt Kalite Analizi")
862
+
863
+ # Kalite faktörleri
864
+ quality_factors = [
865
+ "Açıklık ve Netlik",
866
+ "Spesifiklik",
867
+ "Bağlam Sağlama",
868
+ "Hedef Belirleme",
869
+ "Örnek İçerme"
870
+ ]
871
+
872
+ # Her faktör için puan hesapla (basit algoritmalar)
873
+ clarity_score = min(10, max(1, 7 + (analysis_prompt.count(".") / max(1, word_count // 20))))
874
+ specificity_score = min(10, max(1, 5 + (analysis_prompt.count(":") * 2)))
875
+ context_score = min(10, max(1, 5 + (analysis_prompt.lower().count("örneğin") + analysis_prompt.lower().count("bağlam"))))
876
+ goal_score = min(10, max(1, 6 + (analysis_prompt.lower().count("hedef") + analysis_prompt.lower().count("amaç"))))
877
+ example_score = min(10, max(1, 4 + (analysis_prompt.lower().count("örnek") * 2)))
878
+
879
+ # Genel skor hesapla
880
+ overall_score = (clarity_score + specificity_score + context_score + goal_score + example_score) / 5
881
+
882
+ # Sonuçları göster
883
+ col1, col2 = st.columns([1, 2])
884
+
885
+ with col1:
886
+ # Genel skor
887
+ st.markdown(f"### Genel Skor: {overall_score:.1f}/10")
888
+
889
+ if overall_score >= 8:
890
+ st.success("Bu prompt yüksek kaliteye sahip! Mükemmel bir prompt oluşturdunuz.")
891
+ elif overall_score >= 6:
892
+ st.info("Bu prompt iyi görünüyor, ancak geliştirilebilir.")
893
+ else:
894
+ st.warning("Bu prompt iyileştirilmeli. Aşağıdaki önerilere göz atın.")
895
+
896
+ with col2:
897
+ # Faktör skorları
898
+ scores = [clarity_score, specificity_score, context_score, goal_score, example_score]
899
+
900
+ # Radar chart oluştur
901
+ fig = plt.figure(figsize=(4, 4))
902
+ ax = fig.add_subplot(111, polar=True)
903
+
904
+ # Skorlar ve faktörler için veri hazırlığı
905
+ angles = np.linspace(0, 2*np.pi, len(quality_factors), endpoint=False)
906
+ scores_for_plot = np.concatenate((scores, [scores[0]]))
907
+ angles = np.concatenate((angles, [angles[0]]))
908
+ labels = quality_factors + [quality_factors[0]]
909
+
910
+ # Çizim
911
+ ax.plot(angles, scores_for_plot, 'o-', linewidth=2)
912
+ ax.fill(angles, scores_for_plot, alpha=0.25)
913
+ ax.set_thetagrids(angles[:-1] * 180/np.pi, labels[:-1])
914
+ ax.set_ylim(0, 10)
915
+ ax.grid(True)
916
+
917
+ st.pyplot(fig)
918
+
919
+ # İyileştirme önerileri
920
+ st.subheader("İyileştirme Önerileri")
921
+
922
+ if clarity_score < 7:
923
+ st.markdown("- **Açıklık ve Netlik**: Daha kısa ve öz cümleler kullanın. Her cümle tek bir fikri ifade etmeli.")
924
+
925
+ if specificity_score < 7:
926
+ st.markdown("- **Spesifiklik**: Daha detaylı talimatlar verin. İstediğiniz format, stil ve içeriği açıkça belirtin.")
927
+
928
+ if context_score < 7:
929
+ st.markdown("- **Bağlam Sağlama**: Promptta daha fazla bağlam bilgisi sağlayın. Hedef kitle, amaç ve kullanım senaryosu ekleyin.")
930
+
931
+ if goal_score < 7:
932
+ st.markdown("- **Hedef Belirleme**: Promptun sonunda ne elde etmek istediğinizi net bir şekilde belirtin.")
933
+
934
+ if example_score < 7:
935
+ st.markdown("- **Örnek İçerme**: İstediğiniz çıktı formatına benzer örnekler ekleyin.")
936
+
937
+ # Karmaşıklık Analizi
938
+ with analysis_tabs[2]:
939
+ st.subheader("Karmaşıklık Analizi")
940
+
941
+ # Okunabilirlik skoru (Flesch Reading Ease formülüne yaklaşık bir değer)
942
+ sentences = analysis_prompt.split('.')
943
+ sentence_count = max(1, len(sentences) - 1) # Son nokta sonrası boş cümle olabilir
944
+
945
+ avg_words_per_sentence = word_count / sentence_count
946
+ avg_syllables_per_word = char_count / (word_count * 1.5) # Yaklaşık bir değer
947
+
948
+ # Flesch Reading Ease skoru (0-100 arası, yüksek değer daha kolay okunabilir)
949
+ readability_score = 206.835 - (1.015 * avg_words_per_sentence) - (84.6 * avg_syllables_per_word)
950
+ readability_score = max(0, min(100, readability_score))
951
+
952
+ # Karmaşıklık seviyesi
953
+ if readability_score >= 80:
954
+ complexity_level = "Çok Kolay"
955
+ complexity_description = "Çok basit, anlaşılması kolay bir prompt."
956
+ elif readability_score >= 60:
957
+ complexity_level = "Kolay"
958
+ complexity_description = "Anlaşılması kolay, basit bir prompt."
959
+ elif readability_score >= 40:
960
+ complexity_level = "Orta"
961
+ complexity_description = "Orta zorlukta, genel kullanıcılar için uygun."
962
+ elif readability_score >= 20:
963
+ complexity_level = "Zor"
964
+ complexity_description = "Karmaşık, anlaşılması için teknik bilgi gerekebilir."
965
+ else:
966
+ complexity_level = "Çok Zor"
967
+ complexity_description = "Çok karmaşık, sadece uzmanlar için uygun."
968
+
969
+ # Sonuçları göster
970
+ col1, col2 = st.columns(2)
971
+
972
+ with col1:
973
+ st.metric("Okunabilirlik Skoru", f"{readability_score:.1f}/100")
974
+ st.metric("Cümle Sayısı", sentence_count)
975
+ st.metric("Cümle Başına Kelime", f"{avg_words_per_sentence:.1f}")
976
+
977
+ with col2:
978
+ st.markdown(f"### Karmaşıklık: {complexity_level}")
979
+ st.markdown(complexity_description)
980
+
981
+ # Öneriler
982
+ if readability_score < 40:
983
+ st.warning("Bu promptu basitleştirmek AI'nın daha iyi anlamasını sağlayabilir.")
984
+ elif readability_score > 80:
985
+ st.warning("Bu prompt çok basit olabilir. Daha spesifik yönergeler eklemek isteyebilirsiniz.")
986
+ else:
987
+ st.success("Bu prompt karmaşıklık açısından iyi dengelenmiş.")
988
+
989
+ # Görsel Prompt Oluşturucu Sekmesi
990
+ with tabs[4]:
991
+ st.header("Görsel Prompt Oluşturucu")
992
+
993
+ # Prompt yapı blokları
994
+ st.subheader("Prompt Blokları")
995
+
996
+ prompt_blocks = {
997
+ "Giriş Blokları": [
998
+ "Rolünüzü belirtin: Siz bir [ROL] olarak,",
999
+ "Aşağıdaki görevde bana yardımcı olun:",
1000
+ "Ben bir [ROL] ve size [KONU] hakkında danışmak istiyorum.",
1001
+ "Bir [PROJE TİPİ] oluşturmam gerekiyor."
1002
+ ],
1003
+ "Görev Blokları": [
1004
+ "Göreviniz: [GÖREVİ BURAYA YAZIN]",
1005
+ "Lütfen bana [KONU] hakkında detaylı bilgi verin.",
1006
+ "Lütfen bu [KODU/METNİ] analiz edin ve iyileştirin.",
1007
+ "Bana adım adım nasıl [GÖREV] yapacağımı açıklayın."
1008
+ ],
1009
+ "Format Blokları": [
1010
+ "Yanıtınızı madde işaretleriyle listeleyin.",
1011
+ "Yanıtınızı bir tablo formatında düzenleyin.",
1012
+ "Lütfen yanıtınızı bölümlere ayırın.",
1013
+ "Lütfen açıklamanızı örneklerle destekleyin."
1014
+ ],
1015
+ "Spesifikasyon Blokları": [
1016
+ "Çıktı uzunluğu: [KISACA/DETAYLI/KELİME SAYISI]",
1017
+ "Hedef kitle: [KİTLE]",
1018
+ "Kullanılacak ton: [RESMİ/ARKADAŞÇA/TEKNİK/vb.]",
1019
+ "Teknik seviye: [BAŞLANGIÇ/ORTA/İLERİ]"
1020
+ ],
1021
+ "Kapanış Blokları": [
1022
+ "Yanıtınızın sonunda bir özet ekleyin.",
1023
+ "Sonraki adımlar için önerilerinizi ekleyin.",
1024
+ "Ek kaynak veya referanslar ekleyin.",
1025
+ "Konuyla ilgili potansiyel sorunları belirtin."
1026
+ ]
1027
+ }
1028
+
1029
+ # Kullanıcı tarafından seçilen bloklar
1030
+ if "selected_blocks" not in st.session_state:
1031
+ st.session_state.selected_blocks = []
1032
+
1033
+ if "block_params" not in st.session_state:
1034
+ st.session_state.block_params = {}
1035
+
1036
+ # Kullanılabilir blokları göster
1037
+ col1, col2 = st.columns([1, 2])
1038
+
1039
+ with col1:
1040
+ # Kategori seçimi
1041
+ block_category = st.selectbox("Blok Kategorisi", list(prompt_blocks.keys()))
1042
+
1043
+ # O kategorideki blokları göster
1044
+ selected_block = st.selectbox("Kullanılabilir Bloklar", prompt_blocks[block_category])
1045
+
1046
+ # Bloğu ekle butonu
1047
+ if st.button("Bloğu Ekle"):
1048
+ if selected_block not in st.session_state.selected_blocks:
1049
+ st.session_state.selected_blocks.append(selected_block)
1050
+ st.session_state.block_params[selected_block] = {}
1051
+
1052
+ with col2:
1053
+ # Seçilen blokları listele
1054
+ st.subheader("Seçilen Bloklar")
1055
+
1056
+ if not st.session_state.selected_blocks:
1057
+ st.info("Henüz blok eklenmedi. Sol taraftan blok ekleyin.")
1058
+ else:
1059
+ updated_blocks = []
1060
+
1061
+ for i, block in enumerate(st.session_state.selected_blocks):
1062
+ col_block, col_delete = st.columns([5, 1])
1063
+
1064
+ with col_block:
1065
+ # Köşeli parantez içindeki parametreleri bul
1066
+ params = re.findall(r'\[(.*?)\]', block)
1067
+
1068
+ # Parametreleri düzenlemek için giriş alanları oluştur
1069
+ edited_block = block
1070
+
1071
+ if params:
1072
+ for param in params:
1073
+ param_key = f"block_{i}_{param}"
1074
+
1075
+ # İlk kez için default değeri ayarla
1076
+ if param not in st.session_state.block_params.get(block, {}):
1077
+ st.session_state.block_params.setdefault(block, {})[param] = param
1078
+
1079
+ # Parametre için input alanı
1080
+ param_value = st.text_input(
1081
+ f"**{param}** değeri:",
1082
+ value=st.session_state.block_params[block].get(param, param),
1083
+ key=param_key
1084
+ )
1085
+
1086
+ # Parametre değerini güncelle
1087
+ st.session_state.block_params[block][param] = param_value
1088
+
1089
+ # Blok metnini güncelle
1090
+ edited_block = edited_block.replace(f"[{param}]", param_value)
1091
+
1092
+ # Düzenlenen bloğu göster
1093
+ st.markdown(f"**{i+1}.** {edited_block}")
1094
+ updated_blocks.append(edited_block)
1095
+
1096
+ with col_delete:
1097
+ # Bloğu sil butonu
1098
+ if st.button("🗑️", key=f"delete_block_{i}"):
1099
+ del st.session_state.selected_blocks[i]
1100
+ st.rerun()
1101
+
1102
+ # Blokların sırasını değiştir
1103
+ col_up, col_down = st.columns(2)
1104
+
1105
+ with col_up:
1106
+ block_to_move_up = st.number_input("Yukarı taşı (blok no)", min_value=0, max_value=len(st.session_state.selected_blocks), value=0, step=1)
1107
+ if st.button("Yukarı Taşı") and block_to_move_up > 1 and block_to_move_up <= len(st.session_state.selected_blocks):
1108
+ idx = block_to_move_up - 1
1109
+ st.session_state.selected_blocks[idx], st.session_state.selected_blocks[idx-1] = st.session_state.selected_blocks[idx-1], st.session_state.selected_blocks[idx]
1110
+ st.rerun()
1111
+
1112
+ with col_down:
1113
+ block_to_move_down = st.number_input("Aşağı taşı (blok no)", min_value=0, max_value=len(st.session_state.selected_blocks), value=0, step=1)
1114
+ if st.button("Aşağı Taşı") and block_to_move_down > 0 and block_to_move_down < len(st.session_state.selected_blocks):
1115
+ idx = block_to_move_down - 1
1116
+ st.session_state.selected_blocks[idx], st.session_state.selected_blocks[idx+1] = st.session_state.selected_blocks[idx+1], st.session_state.selected_blocks[idx]
1117
+ st.rerun()
1118
+
1119
+ # Tüm blokları temizle
1120
+ if st.button("Tüm Blokları Temizle"):
1121
+ st.session_state.selected_blocks = []
1122
+ st.session_state.block_params = {}
1123
+ st.rerun()
1124
+
1125
+ # Önizleme ve oluşturma
1126
+ st.subheader("Prompt Önizleme")
1127
+
1128
+ if not st.session_state.selected_blocks:
1129
+ st.info("Blok ekleyerek promptunuzu oluşturmaya başlayın.")
1130
+ else:
1131
+ # Blokları birleştir
1132
+ preview_prompt = "\n\n".join(updated_blocks)
1133
+
1134
+ # Önizleme göster
1135
+ st.text_area("Oluşturulan Prompt:", value=preview_prompt, height=200, disabled=True)
1136
+
1137
+ # Promptu ana sayfaya ekle
1138
+ if st.button("Bu Promptu Kullan"):
1139
+ # Session state'e promptu kaydet
1140
+ st.session_state.prompt = preview_prompt
1141
+ st.session_state.category = "custom"
1142
+ st.session_state.params = {}
1143
+
1144
+ # Başarı mesajı
1145
+ st.success("Prompt ana sayfaya yüklendi! Ana sayfaya geçerek düzenleyebilir veya API ile test edebilirsiniz.")
1146
+
1147
+ # Özel blok ekleme
1148
+ with st.expander("Özel Blok Ekle", expanded=False):
1149
+ custom_block = st.text_area("Özel blok metnini girin:",
1150
+ placeholder="Örnek: Size [KONU] hakkında bir [İÇERİK TİPİ] yazmanızı istiyorum.")
1151
+
1152
+ if st.button("Özel Bloğu Ekle") and custom_block:
1153
+ st.session_state.selected_blocks.append(custom_block)
1154
+ st.session_state.block_params[custom_block] = {}
1155
+ st.rerun()
1156
+
1157
+ # Toplu İşlem Sekmesi
1158
+ with tabs[5]:
1159
+ st.header("Toplu Prompt Oluşturma")
1160
+
1161
+ # Toplu işlem türü
1162
+ batch_tabs = st.tabs(["CSV/Excel ile Toplu Prompt", "Metin Tabanlı Çoklu Prompt", "Gelişmiş"])
1163
+
1164
+ # CSV/Excel ile Toplu Prompt
1165
+ with batch_tabs[0]:
1166
+ st.subheader("CSV/Excel Dosyası ile Toplu Prompt Oluşturma")
1167
+
1168
+ # Açıklama
1169
+ st.markdown("""
1170
+ Bu özellik, bir CSV veya Excel dosyası yükleyerek aynı şablona dayalı çoklu prompt oluşturmanıza olanak tanır.
1171
+
1172
+ **Dosya formatı:**
1173
+ - İlk satır sütun başlıkları olmalıdır
1174
+ - Her satır farklı bir prompt için veri içermelidir
1175
+ - Şablondaki yer tutucular sütun adlarıyla aynı olmalıdır (ör. `{ürün_adı}`)
1176
+ """)
1177
+
1178
+ # Örnek şablon
1179
+ template = st.text_area(
1180
+ "Prompt Şablonu:",
1181
+ placeholder="Örnek: {ürün_adı} ürünü için {hedef_kitle} hedef kitlesine yönelik {kelime_sayısı} kelimelik bir pazarlama metni yaz.",
1182
+ height=100,
1183
+ key="batch_template"
1184
+ )
1185
+
1186
+ # Dosya yükleme
1187
+ uploaded_file = st.file_uploader("CSV veya Excel Dosyası Yükle", type=["csv", "xlsx", "xls"])
1188
+
1189
+ if uploaded_file is not None and template:
1190
+ try:
1191
+ # Dosyayı dataframe'e yükle
1192
+ df = None
1193
+ if uploaded_file.name.endswith(".csv"):
1194
+ df = pd.read_csv(uploaded_file)
1195
+ else:
1196
+ df = pd.read_excel(uploaded_file)
1197
+
1198
+ # İlk 5 satırı göster
1199
+ st.subheader("Veri Önizleme")
1200
+ st.dataframe(df.head())
1201
+
1202
+ # Şablondaki yer tutucuları bul
1203
+ placeholders = re.findall(r'{(.*?)}', template)
1204
+
1205
+ # Yer tutucular df sütunlarıyla eşleşiyor mu kontrol et
1206
+ missing_columns = [p for p in placeholders if p not in df.columns]
1207
+
1208
+ if missing_columns:
1209
+ st.error(f"Şablonda belirtilen yer tutucular dosyada bulunamadı: {', '.join(missing_columns)}")
1210
+ else:
1211
+ # Promptları oluştur
1212
+ generated_prompts = []
1213
+
1214
+ for _, row in df.iterrows():
1215
+ # Bu satır için promptu hazırla
1216
+ prompt = template
1217
+
1218
+ # Tüm yer tutucuları değiştir
1219
+ for placeholder in placeholders:
1220
+ prompt = prompt.replace(f"{{{placeholder}}}", str(row[placeholder]))
1221
+
1222
+ generated_prompts.append(prompt)
1223
+
1224
+ # Oluşturulan promptları göster
1225
+ st.subheader(f"Oluşturulan Promptlar ({len(generated_prompts)})")
1226
+
1227
+ # Promptları göstermek için genişletilebilir paneller
1228
+ for i, prompt in enumerate(generated_prompts):
1229
+ with st.expander(f"Prompt {i+1}", expanded=i==0):
1230
+ st.text_area(f"Prompt {i+1}", value=prompt, height=150, disabled=True, key=f"batch_prompt_{i}")
1231
+
1232
+ # Tüm promptları indirebilme seçeneği
1233
+ if st.button("Tüm Promptları TXT Dosyası Olarak İndir"):
1234
+ # Promptları birleştir
1235
+ all_prompts = "\n\n---\n\n".join(generated_prompts)
1236
+
1237
+ # Promptları download link olarak sun
1238
+ st.download_button(
1239
+ label="İndirmeyi Başlat",
1240
+ data=all_prompts,
1241
+ file_name="toplu_promptlar.txt",
1242
+ mime="text/plain"
1243
+ )
1244
+
1245
+ # Promptları dataframe'e ekleyip Excel olarak indirme seçeneği
1246
+ if st.button("Promptları Excel Dosyası Olarak İndir"):
1247
+ # Kopya dataframe oluştur
1248
+ result_df = df.copy()
1249
+
1250
+ # Prompt sütunu ekle
1251
+ result_df["generated_prompt"] = generated_prompts
1252
+
1253
+ # Excel dosyası oluştur
1254
+ output = io.BytesIO()
1255
+ with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
1256
+ result_df.to_excel(writer, index=False, sheet_name="Promptlar")
1257
+
1258
+ # Download butonu oluştur
1259
+ st.download_button(
1260
+ label="Excel İndirmeyi Başlat",
1261
+ data=output.getvalue(),
1262
+ file_name="prompt_sonuçları.xlsx",
1263
+ mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
1264
+ )
1265
+
1266
+ except Exception as e:
1267
+ st.error(f"Dosya işlenirken bir hata oluştu: {str(e)}")
1268
+
1269
+ # Örnek dosya indirme
1270
+ with st.expander("Örnek CSV/Excel Dosyası İndir", expanded=False):
1271
+ st.markdown("""
1272
+ Aşağıdaki örnek dosyayı indirip kendi verilerinizle doldurabilirsiniz:
1273
+ """)
1274
+
1275
+ # Örnek veri
1276
+ example_data = {
1277
+ "ürün_adı": ["Akıllı Saat", "Kablosuz Kulaklık", "Robot Süpürge"],
1278
+ "hedef_kitle": ["spor tutkunları", "müzik severler", "yoğun çalışan profesyoneller"],
1279
+ "kelime_sayısı": [200, 150, 250]
1280
+ }
1281
+
1282
+ example_df = pd.DataFrame(example_data)
1283
+
1284
+ # CSV olarak indir
1285
+ csv_data = example_df.to_csv(index=False)
1286
+ st.download_button(
1287
+ label="Örnek CSV İndir",
1288
+ data=csv_data,
1289
+ file_name="ornek_veriler.csv",
1290
+ mime="text/csv"
1291
+ )
1292
+
1293
+ # Excel olarak indir
1294
+ output = io.BytesIO()
1295
+ with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
1296
+ example_df.to_excel(writer, index=False)
1297
+
1298
+ st.download_button(
1299
+ label="Örnek Excel İndir",
1300
+ data=output.getvalue(),
1301
+ file_name="ornek_veriler.xlsx",
1302
+ mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
1303
+ )
1304
+
1305
+ # Metin Tabanlı Çoklu Prompt
1306
+ with batch_tabs[1]:
1307
+ st.subheader("Metin Tabanlı Çoklu Prompt Oluşturma")
1308
+
1309
+ # Açıklama
1310
+ st.markdown("""
1311
+ Bu özellik, aynı şablonu kullanarak birden fazla prompt oluşturmanızı sağlar.
1312
+ Her bir değişken değeri için farklı bir satır ekleyin.
1313
+ """)
1314
+
1315
+ # Prompt şablonu
1316
+ text_template = st.text_area(
1317
+ "Prompt Şablonu:",
1318
+ value="Bir {konu} hakkında {kelime_sayısı} kelimelik bir yazı yaz.",
1319
+ height=100,
1320
+ key="text_batch_template"
1321
+ )
1322
+
1323
+ # Şablondaki değişkenleri bul
1324
+ text_placeholders = re.findall(r'{(.*?)}', text_template)
1325
+
1326
+ if text_placeholders:
1327
+ st.subheader("Değişkenler")
1328
+
1329
+ # Her değişken için değer listesi
1330
+ variable_values = {}
1331
+
1332
+ for placeholder in text_placeholders:
1333
+ values = st.text_area(
1334
+ f"{placeholder} değerleri (her satıra bir değer):",
1335
+ height=100,
1336
+ key=f"variable_{placeholder}"
1337
+ )
1338
+
1339
+ if values:
1340
+ # Değerleri satırlara ayır
1341
+ variable_values[placeholder] = [v.strip() for v in values.strip().split("\n") if v.strip()]
1342
+
1343
+ # Tüm değişkenler için değer var mı kontrol et
1344
+ missing_values = [p for p in text_placeholders if p not in variable_values or not variable_values[p]]
1345
+
1346
+ if missing_values:
1347
+ st.warning(f"Lütfen şu değişkenler için değer girin: {', '.join(missing_values)}")
1348
+ else:
1349
+ # Tüm kombinasyonları oluştur
1350
+ import itertools
1351
+
1352
+ # Değişkenlerin tüm değer kombinasyonlarını oluştur
1353
+ combinations = list(itertools.product(*[variable_values[p] for p in text_placeholders]))
1354
+
1355
+ # Her kombinasyon için prompt oluştur
1356
+ text_generated_prompts = []
1357
+
1358
+ for combo in combinations:
1359
+ # Şablondan başla
1360
+ prompt = text_template
1361
+
1362
+ # Her değişkeni değiştir
1363
+ for i, placeholder in enumerate(text_placeholders):
1364
+ prompt = prompt.replace(f"{{{placeholder}}}", combo[i])
1365
+
1366
+ text_generated_prompts.append(prompt)
1367
+
1368
+ # Oluşturulan promptları göster
1369
+ st.subheader(f"Oluşturulan Promptlar ({len(text_generated_prompts)})")
1370
+
1371
+ # Promptları göster
1372
+ for i, prompt in enumerate(text_generated_prompts):
1373
+ with st.expander(f"Prompt {i+1}", expanded=i==0):
1374
+ st.text_area(f"Prompt {i+1}", value=prompt, height=150, disabled=True, key=f"text_batch_prompt_{i}")
1375
+
1376
+ # Tüm promptları indir butonu
1377
+ if st.button("Tüm Promptları İndir"):
1378
+ # Promptları birleştir
1379
+ all_prompts = "\n\n---\n\n".join(text_generated_prompts)
1380
+
1381
+ # İndirme linki
1382
+ st.download_button(
1383
+ label="İndirmeyi Başlat",
1384
+ data=all_prompts,
1385
+ file_name="metin_tabanlı_promptlar.txt",
1386
+ mime="text/plain"
1387
+ )
1388
+
1389
+ # Gelişmiş Toplu İşlem
1390
+ with batch_tabs[2]:
1391
+ st.subheader("Gelişmiş Toplu İşlem")
1392
+ st.info("Bu özellik yakında eklenecektir. API otomasyonu ve programlı prompt üretimi gibi gelişmiş özellikler içerecektir.")
1393
+
1394
+ # Kategori bilgileri
1395
+ st.header("Desteklenen Kategoriler")
1396
+
1397
+ # Kategorileri göster
1398
+ categories_per_row = 3
1399
+ categories = list(PROMPT_CATEGORIES.keys())
1400
+
1401
+ for i in range(0, len(categories), categories_per_row):
1402
+ cols = st.columns(categories_per_row)
1403
+ for j in range(categories_per_row):
1404
+ if i + j < len(categories):
1405
+ with cols[j]:
1406
+ category = categories[i + j]
1407
+ st.subheader(category)
1408
+ if isinstance(PROMPT_CATEGORIES[category], dict) and "description" in PROMPT_CATEGORIES[category]:
1409
+ st.write(PROMPT_CATEGORIES[category]["description"])
1410
+ else:
1411
+ st.write("Bu kategori için açıklama bulunmuyor.")
1412
+
1413
+ # Footer
1414
+ st.markdown("---")
1415
+ st.markdown("© 2025 AI Prompt Generator | Tüm hakları saklıdır.| created by Kralkayra Taner Atmaca")
1416
+
1417
+ if __name__ == "__main__":
1418
+ main()
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()
todo.md ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Prompt Engineer Chatbot - Yapılacaklar Listesi
2
+
3
+ ## Gereksinim Analizi
4
+ - [x] Kullanıcı gereksinimlerini analiz et
5
+ - [x] Proje kapsamını belirle
6
+
7
+ ## Geliştirme Ortamı Kurulumu
8
+ - [x] Proje dizinini oluştur
9
+ - [x] Gerekli kütüphaneleri belirle
10
+ - [x] Gerekli kütüphaneleri yükle (streamlit, openai, google-generativeai, vb.)
11
+
12
+ ## Prompt Mühendisliği Bilgi Tabanı Oluşturma
13
+ - [x] Farklı kullanım senaryoları için prompt şablonları oluştur
14
+ - [x] Web sitesi geliştirme için prompt şablonları hazırla
15
+ - [x] Diğer yaygın senaryolar için prompt şablonları hazırla
16
+
17
+ ## Chatbot Backend Geliştirme
18
+ - [x] Prompt işleme mantığını oluştur
19
+ - [x] Kullanıcı girdisini analiz etme fonksiyonlarını geliştir
20
+ - [x] Dinamik prompt oluşturma algoritmasını geliştir
21
+
22
+ ## API Entegrasyonları
23
+ - [x] OpenAI API entegrasyonu
24
+ - [x] Google Gemini API entegrasyonu
25
+ - [x] OpenRouter API entegrasyonu
26
+ - [x] API anahtarı yönetimi
27
+
28
+ ## Kullanıcı Arayüzü Tasarımı
29
+ - [x] Arayüz bileşenlerini belirle
30
+ - [x] Kullanıcı giriş alanını oluştur
31
+ - [x] API seçim alanını oluştur
32
+ - [x] API anahtarı giriş alanını oluştur
33
+ - [x] Sonuç gösterim alanını oluştur
34
+
35
+ ## Deployment Dosyaları
36
+ - [x] app.py dosyasını oluştur
37
+ - [x] requirements.txt dosyasını oluştur
38
+
39
+ ## Test
40
+ - [x] Farklı senaryolarla chatbot'u test et
41
+ - [x] API entegrasyonlarını test et
42
+ - [x] Kullanıcı arayüzünü test et
43
+
44
+ ## Sonlandırma ve Deployment Hazırlığı
45
+ - [x] Kodu optimize et
46
+ - [x] Dokümantasyon ekle
47
+ - [x] Hugging Face deployment için hazırla