Task_Master / src /ui_components.py
aimevzulari's picture
Update src/ui_components.py
4b1425c verified
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