import gradio as gr from src.agent_logic import ( generate_tasks_for_idea, save_api_key, delete_api_key, list_available_gemini_models, list_available_openrouter_models, format_tasks_for_download ) import os # Fetch initial model lists try: initial_or_models = list_available_openrouter_models() except Exception as e: print(f"Error fetching initial OpenRouter models: {e}") initial_or_models = ["google/gemini-pro"] # Fallback initial_gemini_models = list_available_gemini_models() def create_interface(initial_gemini_status="Kaydedilmedi", initial_or_status="Kaydedilmedi"): """Creates the Gradio interface components.""" with gr.Blocks(theme=gr.themes.Soft(), title="AI App Builder Task Master-AI Mevzuları") as iface: # Store API keys and status in Gradio State for session persistence gemini_key_state = gr.State(None) openrouter_key_state = gr.State(None) gemini_status_state = gr.State(initial_gemini_status) openrouter_status_state = gr.State(initial_or_status) tasks_output_state = gr.State("") gr.Markdown("# AI App Builder Task Master-AI Mevzuları") gr.Markdown("AI destekli uygulama geliştirme araçları (Cursor, Windsurf vb.) için görevler oluşturun.") with gr.Tab("Görev Oluşturma"): with gr.Row(): with gr.Column(scale=1): gr.Markdown("### Hedef Araç, Fikir ve Dil") # Updated title target_tool = gr.Dropdown(label="Hedef AI Aracı", choices=["Genel", "Cursor", "Windsurf", "TRAE AI", "CLINE", "ROOCODE"], value="Genel", info="Görevlerin hangi AI aracı için özelleştirileceğini seçin.") # Add Language Selection language_select = gr.Radio(["Türkçe", "English"], label="Görev Dili", value="Türkçe", info="Oluşturulacak görevlerin dilini seçin.") idea_input = gr.Textbox(label="Uygulama Fikri veya Hedefi", lines=10, placeholder="Geliştirmek istediğiniz uygulamanın ana fikrini veya hedefini açıklayın...") generate_button = gr.Button("Görevleri Oluştur", variant="primary") with gr.Column(scale=2): gr.Markdown("### Oluşturulan Görevler") output_tasks = gr.Textbox(label="Görev Listesi", lines=18, interactive=False, placeholder="Oluşturulan görevler burada listelenecek...") with gr.Row(): download_format = gr.Radio(["TXT", "Markdown", "JSON"], label="İndirme Formatı", value="TXT") download_button = gr.Button("Görevleri İndir") download_file_output = gr.File(label="İndirilen Dosya", interactive=False) with gr.Tab("Ayarlar"): gr.Markdown("## API Anahtarları ve Modeller") with gr.Row(): with gr.Column(): gr.Markdown("### Gemini") gemini_api_key_input = gr.Textbox(label="Gemini API Anahtarı", type="password", placeholder="Gemini API anahtarınızı buraya girin") gemini_status_display = gr.Textbox(label="API Durumu", value=initial_gemini_status, interactive=False) with gr.Row(): save_gemini_button = gr.Button("Kaydet") delete_gemini_button = gr.Button("Sil") # Use the fetched list for choices gemini_model_select = gr.Dropdown(label="Gemini Modeli", choices=initial_gemini_models, value=initial_gemini_models[0] if initial_gemini_models else None, interactive=True) with gr.Column(): gr.Markdown("### OpenRouter") openrouter_api_key_input = gr.Textbox(label="OpenRouter API Anahtarı", type="password", placeholder="OpenRouter API anahtarınızı buraya girin") openrouter_status_display = gr.Textbox(label="API Durumu", value=initial_or_status, interactive=False) with gr.Row(): save_or_button = gr.Button("Kaydet") delete_or_button = gr.Button("Sil") # Use the fetched list for choices openrouter_model_select = gr.Dropdown(label="OpenRouter Modeli", choices=initial_or_models, value=initial_or_models[0] if initial_or_models else None, interactive=True) refresh_or_models_button = gr.Button("OpenRouter Modellerini Yenile") # --- Define Interactions --- # # API Key Saving save_gemini_button.click( fn=save_api_key, inputs=[gemini_api_key_input, gr.State("gemini")], outputs=[gemini_key_state, gemini_status_display] ).then( lambda: gr.Info("Gemini API anahtarı kaydedildi (oturum için)."), outputs=None ) save_or_button.click( fn=save_api_key, inputs=[openrouter_api_key_input, gr.State("openrouter")], outputs=[openrouter_key_state, openrouter_status_display] ).then( lambda: gr.Info("OpenRouter API anahtarı kaydedildi (oturum için)."), outputs=None ) # API Key Deletion delete_gemini_button.click( fn=delete_api_key, inputs=[gr.State("gemini")], outputs=[gemini_key_state, gemini_status_display, gemini_api_key_input] ).then( lambda: gr.Info("Gemini API anahtarı silindi (oturum için)."), outputs=None ) delete_or_button.click( fn=delete_api_key, inputs=[gr.State("openrouter")], outputs=[openrouter_key_state, openrouter_status_display, openrouter_api_key_input] ).then( lambda: gr.Info("OpenRouter API anahtarı silindi (oturum için)."), outputs=None ) # Model List Refreshing # Update the dropdown choices when refreshing refresh_or_models_button.click( fn=list_available_openrouter_models, inputs=None, outputs=None # Don't directly output to dropdown, use .then ).then( lambda models: gr.Dropdown(choices=models, value=models[0] if models else None), outputs=openrouter_model_select ).then( lambda: gr.Info("OpenRouter model listesi yenilendi."), outputs=None ) # Task Generation - Added language_select to inputs generate_button.click( fn=generate_tasks_for_idea, inputs=[ idea_input, gemini_key_state, openrouter_key_state, target_tool, gemini_model_select, openrouter_model_select, language_select # Added language input ], outputs=[output_tasks] ) # Update task state whenever output_tasks changes output_tasks.change(lambda x: x, inputs=output_tasks, outputs=tasks_output_state) # Task Downloading download_button.click( fn=format_tasks_for_download, inputs=[tasks_output_state, download_format], outputs=[download_file_output] ) return iface