File size: 16,639 Bytes
2603305
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
"""
Streamlit UI için modül.
Bu modül, Streamlit kullanarak web arayüzünü oluşturur.
"""

import streamlit as st
import os
from typing import Dict, Any, Optional

# Kendi modüllerimizi içe aktar
from prompt_templates import PROMPT_CATEGORIES
from chatbot_backend import chatbot, ai_interface
from api_integrations import (
    api_manager,
    openai_handler,
    gemini_handler,
    openrouter_handler
)

def main():
    """
    Ana Streamlit uygulaması.
    """
    # Sayfa yapılandırması
    st.set_page_config(
        page_title="AI MEVZULARI - Prompt Mühendisi (Eray Coşkun Tarafından Aboneleri için geliştirilmiştir)",
        page_icon="🤖",
        layout="wide",
        initial_sidebar_state="expanded"
    )
    
    # Session state başlatma
    if "api_keys" not in st.session_state:
        st.session_state.api_keys = {
            "openai": os.getenv("OPENAI_API_KEY", ""),
            "gemini": os.getenv("GEMINI_API_KEY", ""),
            "openrouter": os.getenv("OPENROUTER_API_KEY", "")
        }
    
    # Başlık ve açıklama
    st.title("AI MEVZULARI - Prompt Mühendisi (Eray Coşkun Tarafından Aboneleri için geliştirilmiştir)")
    st.markdown("Bu uygulama, AI modellerine verilecek detaylı promptlar oluşturmanıza yardımcı olur.")
    
    # Sidebar - API anahtarları
    with st.sidebar:
        st.header("API Anahtarları")
        
        st.info("API anahtarlarınızı girin. Bu anahtarlar oturum süresince saklanır ve sayfayı yenilediğinizde silinir.")
        
        # OpenAI API anahtarı
        openai_api_key = st.text_input(
            "OpenAI API Anahtarı",
            type="password",
            value=st.session_state.api_keys.get("openai", "")
        )
        
        # Google Gemini API anahtarı
        gemini_api_key = st.text_input(
            "Google Gemini API Anahtarı",
            type="password",
            value=st.session_state.api_keys.get("gemini", "")
        )
        
        # OpenRouter API anahtarı
        openrouter_api_key = st.text_input(
            "OpenRouter API Anahtarı",
            type="password",
            value=st.session_state.api_keys.get("openrouter", "")
        )
        
        # API anahtarlarını kaydet
        if st.button("API Anahtarlarını Kaydet"):
            # Session state'e API anahtarlarını kaydet
            st.session_state.api_keys = {
                "openai": openai_api_key,
                "gemini": gemini_api_key,
                "openrouter": openrouter_api_key
            }
            
            # API anahtarlarını ayarla
            api_manager.set_api_key("openai", openai_api_key)
            api_manager.set_api_key("gemini", gemini_api_key)
            api_manager.set_api_key("openrouter", openrouter_api_key)
            
            # API işleyicilerine de anahtarları ayarla
            openai_handler.set_api_key(openai_api_key)
            gemini_handler.set_api_key(gemini_api_key)
            openrouter_handler.set_api_key(openrouter_api_key)
            
            # Chatbot'un AI prompt generator'ına da anahtarları ayarla
            chatbot.ai_generator.set_api_key("openai", openai_api_key)
            chatbot.ai_generator.set_api_key("gemini", gemini_api_key)
            chatbot.ai_generator.set_api_key("openrouter", openrouter_api_key)
            
            st.success("API anahtarları başarıyla kaydedildi!")
        
        # API anahtarlarının durumunu göster
        with st.expander("API Anahtarı Durumu", expanded=False):
            openai_status = "✅ Ayarlandı" if st.session_state.api_keys.get("openai") else "❌ Ayarlanmadı"
            gemini_status = "✅ Ayarlandı" if st.session_state.api_keys.get("gemini") else "❌ Ayarlanmadı"
            openrouter_status = "✅ Ayarlandı" if st.session_state.api_keys.get("openrouter") else "❌ Ayarlanmadı"
            
            st.write(f"OpenAI API: {openai_status}")
            st.write(f"Gemini API: {gemini_status}")
            st.write(f"OpenRouter API: {openrouter_status}")
        
        # AI modeli seçimi
        st.header("AI Modeli Seçimi")
        
        # API sağlayıcısı seçimi
        provider = st.selectbox(
            "API Sağlayıcısı",
            ["OpenAI", "Google Gemini", "OpenRouter"],
            index=0
        )
        
        # Seçilen sağlayıcıya göre model listesini al
        provider_key = provider.lower().replace(" ", "_")
        if provider_key == "google_gemini":
            provider_key = "gemini"
        
        # Modelleri al
        models = []
        if provider_key == "openai":
            models = openai_handler.get_available_models()
        elif provider_key == "gemini":
            models = gemini_handler.get_available_models()
        elif provider_key == "openrouter":
            models = openrouter_handler.get_available_models()
        
        # Model seçimi
        selected_model = None
        if models:
            selected_model = st.selectbox("Model", models)
    
    # Ana içerik
    col1, col2 = st.columns([1, 1])
    
    with col1:
        st.header("Prompt Oluştur")
        
        # Kullanıcı girdisi
        user_input = st.text_area(
            "Ne yapmak istediğinizi açıklayın:",
            height=150,
            placeholder="Örnek: Bir e-ticaret web sitesi yapmak istiyorum. Ürünleri listeleyebilmeli, sepete ekleyebilmeli ve ödeme alabilmeliyim."
        )
        
        # AI destekli prompt oluşturma seçeneği
        if "use_ai_generation" not in st.session_state:
            st.session_state.use_ai_generation = True
            
        use_ai_generation = st.checkbox(
            "AI destekli prompt oluşturma kullan", 
            value=st.session_state.use_ai_generation,
            key="use_ai_generation_checkbox"
        )
        
        # Checkbox değiştiğinde session state'i güncelle
        st.session_state.use_ai_generation = use_ai_generation
        
        # API anahtarı kontrolü ve uyarı
        selected_provider_key = provider.lower().replace(" ", "_")
        if selected_provider_key == "google_gemini":
            selected_provider_key = "gemini"
            
        if use_ai_generation and not st.session_state.api_keys.get(selected_provider_key):
            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.")
        
        # Prompt oluştur butonu
        if st.button("Prompt Oluştur"):
            if user_input:
                with st.spinner("Prompt oluşturuluyor..."):
                    # Prompt oluştur
                    provider_key = provider.lower().replace(" ", "_")
                    if provider_key == "google_gemini":
                        provider_key = "gemini"
                    
                    # API anahtarı kontrolü
                    if use_ai_generation and not st.session_state.api_keys.get(provider_key):
                        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.")
                    else:
                        # Debug bilgisi
                        st.session_state.debug_info = {
                            "use_ai_generation": use_ai_generation,
                            "provider": provider_key,
                            "model": selected_model,
                            "api_key_set": bool(st.session_state.api_keys.get(provider_key))
                        }
                        
                        prompt, category, params = chatbot.process_input(
                            user_input,
                            use_ai_generation=use_ai_generation,
                            provider=provider_key,
                            model=selected_model
                        )
                        
                        # Sonuçları session state'e kaydet
                        st.session_state.prompt = prompt
                        st.session_state.category = category
                        st.session_state.params = params
                        
                        # Sonuçları göster
                        st.success("Prompt başarıyla oluşturuldu!")
            else:
                st.error("Lütfen ne yapmak istediğinizi açıklayın.")
    
    with col2:
        st.header("Oluşturulan Prompt")
        
        # Debug bilgisi (geliştirme aşamasında)
        if "debug_info" in st.session_state:
            with st.expander("Debug Bilgisi", expanded=False):
                st.write(st.session_state.debug_info)
        
        # Oluşturulan promptu göster
        if "prompt" in st.session_state:
            st.subheader(f"Kategori: {st.session_state.category}")
            
            # Parametreleri göster
            if st.session_state.params:
                with st.expander("Parametreler", expanded=False):
                    for key, value in st.session_state.params.items():
                        st.write(f"**{key}:** {value}")
            
            # Promptu göster
            st.text_area(
                "Prompt:",
                value=st.session_state.prompt,
                height=400,
                disabled=True
            )
            
            # Promptu kopyala butonu
            if st.button("Promptu Kopyala"):
                st.code(st.session_state.prompt)
                st.info("Yukarıdaki kodu seçip kopyalayabilirsiniz.")
            
            # AI ile Test Et bölümü
            st.subheader("AI ile Test Et")
            
            # Test için API sağlayıcısı seçimi
            test_provider = st.selectbox(
                "Test için API Sağlayıcısı",
                ["OpenAI", "Google Gemini", "OpenRouter"],
                index=0,
                key="test_provider"
            )
            
            # Test için model seçimi
            test_provider_key = test_provider.lower().replace(" ", "_")
            if test_provider_key == "google_gemini":
                test_provider_key = "gemini"
            
            # Test için modelleri al
            test_models = []
            if test_provider_key == "openai":
                test_models = openai_handler.get_available_models()
            elif test_provider_key == "gemini":
                test_models = gemini_handler.get_available_models()
            elif test_provider_key == "openrouter":
                test_models = openrouter_handler.get_available_models()
            
            # Test için model seçimi
            test_selected_model = None
            if test_models:
                test_selected_model = st.selectbox("Test için Model", test_models, key="test_model")
            
            # Test için API anahtarı giriş alanı
            st.markdown("### Test için API Anahtarı")
            st.info("Test için API anahtarını doğrudan buraya girebilirsiniz.")
            
            test_api_key = st.text_input(
                f"{test_provider} API Anahtarı (Test için)",
                type="password",
                key="test_api_key"
            )
            
            # Kod şablonları oluşturma seçeneği
            generate_code_templates = st.checkbox("Kod şablonları ve dizin yapısı oluştur", value=True, key="generate_code_templates")
            
            # AI ile Test Et butonu
            if st.button("AI ile Test Et"):
                if "prompt" in st.session_state:
                    if not test_api_key:
                        st.error(f"Lütfen test için {test_provider} API anahtarını girin.")
                    else:
                        with st.spinner("AI yanıtı alınıyor..."):
                            if generate_code_templates:
                                # Kod şablonları ile yanıt al
                                result = ai_interface.generate_response_with_code_templates(
                                    test_provider_key,
                                    st.session_state.prompt,
                                    test_selected_model,
                                    test_api_key
                                )
                                
                                # Yanıtı ve şablonları session state'e kaydet
                                st.session_state.ai_response = result["response"]
                                st.session_state.code_templates = result["templates"]
                            else:
                                # Sadece yanıt al
                                response = ai_interface.generate_response(
                                    test_provider_key,
                                    st.session_state.prompt,
                                    test_selected_model,
                                    test_api_key
                                )
                                
                                # Yanıtı session state'e kaydet
                                st.session_state.ai_response = response
                                if "code_templates" in st.session_state:
                                    del st.session_state.code_templates
                            
                            # Yanıtı göster
                            st.success("AI yanıtı başarıyla alındı!")
                else:
                    st.error("Lütfen önce bir prompt oluşturun.")
            
            # AI yanıtını göster
            if "ai_response" in st.session_state:
                st.subheader("AI Yanıtı")
                st.text_area(
                    "Yanıt:",
                    value=st.session_state.ai_response,
                    height=400,
                    disabled=True
                )
                
                # Kod şablonları ve dizin yapısı varsa göster
                if "code_templates" in st.session_state:
                    templates = st.session_state.code_templates
                    
                    # Dizin yapısı
                    if templates["directory_structure"]:
                        with st.expander("📁 Dizin Yapısı", expanded=True):
                            for structure in templates["directory_structure"]:
                                st.code(structure, language="bash")
                    
                    # Kod şablonları
                    if templates["code_templates"]:
                        with st.expander("💻 Kod Şablonları", expanded=True):
                            for template in templates["code_templates"]:
                                st.subheader(f"{template['language'].capitalize()} Dosyası")
                                st.code(template["code"], language=template["language"])
                    
                    # Uygulama adımları
                    if templates["implementation_steps"]:
                        with st.expander("📝 Uygulama Adımları", expanded=True):
                            for i, step in enumerate(templates["implementation_steps"]):
                                if not step.startswith(f"{i+1}.") and not step.startswith("##"):
                                    st.markdown(f"**Adım {i+1}:** {step}")
                                else:
                                    st.markdown(step)
        else:
            st.info("Henüz bir prompt oluşturulmadı. Sol taraftaki formu doldurup 'Prompt Oluştur' butonuna tıklayın.")
    
    # Kategori bilgileri
    st.header("Desteklenen Kategoriler")
    
    # Kategorileri göster
    categories_per_row = 3
    categories = list(PROMPT_CATEGORIES.keys())
    
    for i in range(0, len(categories), categories_per_row):
        cols = st.columns(categories_per_row)
        for j in range(categories_per_row):
            if i + j < len(categories):
                with cols[j]:
                    category = categories[i + j]
                    st.subheader(category)
                    if isinstance(PROMPT_CATEGORIES[category], dict) and "description" in PROMPT_CATEGORIES[category]:
                        st.write(PROMPT_CATEGORIES[category]["description"])
                    else:
                        st.write("Bu kategori için açıklama bulunmuyor.")
    
    # Footer
    st.markdown("---")
    st.markdown("© 2025 AI Prompt Generator | Tüm hakları saklıdır.| created by Eray Coşkun")

if __name__ == "__main__":
    main()