Spaces:
Running
Running
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 | |