File size: 7,293 Bytes
a519c99
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4b1425c
a519c99
 
 
 
 
 
 
4b1425c
a519c99
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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