File size: 8,546 Bytes
1bd9ce8
 
 
 
ca22196
1bd9ce8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ca22196
1bd9ce8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ca22196
1bd9ce8
 
 
 
 
 
 
 
 
 
 
ca22196
1bd9ce8
 
ca22196
1bd9ce8
 
 
 
ca22196
1bd9ce8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ca22196
 
1bd9ce8
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
#!/usr/bin/env python
import gradio as gr

from src.ai_agentic_coder.crewai_wrapper import run_crew_wrapper
from src.ai_agentic_coder.preview_proxy import register_preview_proxy

# Example configuration
EXAMPLE_CONFIG = {
    "requirements": (
        "A simple account management system for a trading simulation platform.\n"
        "The system should allow users to create an account, deposit funds, and withdraw funds.\n"
        "The system should allow users to record that they have bought or sold shares, providing a quantity.\n"
        "The system should calculate the total value of the user's portfolio, and the profit or loss from the initial deposit.\n"
        "The system should be able to report the holdings of the user at any point in time.\n"
        "The system should be able to report the profit or loss of the user at any point in time.\n"
        "The system should be able to list the transactions that the user has made over time.\n"
        "The system should prevent the user from withdrawing funds that would leave them with a negative balance, or\n"
        "from buying more shares than they can afford, or selling shares that they don't have.\n"
        "The system has access to a function get_share_price(symbol) which returns the current price of a share, and includes a test implementation that returns fixed prices for AAPL, TSLA, GOOGL.\n"
        "- Enforce trading rules"
    ),
    "module_name": "accounts",
    "class_name": "Account"
}

def create_interface():
    """Create and return the Gradio interface."""
    with gr.Blocks(title="AI Agentic Coder") as demo:
        gr.HTML("""
        <div class="header">
            <div class="brand">AI Agentic Coder</div>
            <div class="subtitle">Generate high-quality Python code with a coordinated Agentic AIs</div>
        </div>
        """)

        with gr.Row():
            # Left column - Inputs (wider so Module/Class stay on one row)
            with gr.Column(scale=3):
                requirements = gr.Textbox(
                    label="Requirements",
                    placeholder="Describe what you want to build...",
                    lines=15,
                    max_lines=20,
                    elem_classes=["card"]
                )

                # Module and Class in the same row, minimal .py suffix inside module input via CSS
                with gr.Row():
                    with gr.Column(scale=1, min_width=420):
                        module_name = gr.Textbox(
                            label="Module Name",
                            placeholder="Enter your module name",
                            value="",
                            elem_classes=["card-input"],
                            elem_id="module-name"
                        )
                    with gr.Column(scale=1, min_width=420):
                        class_name = gr.Textbox(
                            label="Class Name",
                            placeholder="Enter your class name",
                            value="",
                            elem_classes=["card-input"]
                        )

                run_btn = gr.Button(
                    "Run AI Coder",
                    variant="primary",
                    elem_id="run-btn"
                )

            # Right column - Example
            with gr.Column(scale=1):
                gr.Markdown("### Example", elem_classes=["section-title"])
                gr.Markdown("Click below to load an example:")
                example_btn = gr.Button("Load Trading Account Example", variant="secondary")

                # Example description
                gr.Markdown("""
                **Example will load:**
                - Trading account management system
                - Module: `accounts.py`
                - Class: `Account`
                """)
                gr.HTML("""
                <div class="note nowrap"><strong>Note:</strong> All code will be generated in Python 3.x</div>
                """)

        # Output section (hidden by default)
        with gr.Row():
            output = gr.Textbox(
                label="Output",
                interactive=False,
                lines=20,
                buttons=["copy"],
                elem_classes=["card"],
                visible=False,
                elem_id="output-box"
            )

        # Hidden URL fields (shown after task completion)
        with gr.Row():
            download_url_box = gr.Textbox(
                label="Download URL",
                interactive=False,
                visible=False,
                buttons=["copy"],
                elem_classes=["card"]
            )
        with gr.Row():
            live_url_box = gr.Textbox(
                label="Live App URL",
                interactive=False,
                visible=False,
                buttons=["copy"],
                elem_classes=["card"]
            )

        # Button click handlers
        def load_example():
            return (
                EXAMPLE_CONFIG["requirements"],
                EXAMPLE_CONFIG["module_name"],
                EXAMPLE_CONFIG["class_name"]
            )

        example_btn.click(
            fn=load_example,
            outputs=[requirements, module_name, class_name]
        )

        # Click event: also pass the button as an output so we can disable/enable it
        run_btn.click(
            fn=run_crew_wrapper,
            inputs=[requirements, module_name, class_name],
            outputs=[output, download_url_box, live_url_box, run_btn],
            show_progress="full",
            api_name="run_crew"
        )

        # Modern UI styles
        demo.css = """
        html, body { background: #0b1220; color: #e2e8f0; font-family: Inter, Helvetica, Arial, sans-serif; overflow-x: hidden; }
        .gradio-container { max-width: 100% !important; width: 100% !important; margin: 0 auto !important; padding: 0 16px; }
        .header { max-width: 100%; margin: 24px auto 8px; padding: 12px 16px; text-align: center; }
        .brand { font-weight: 900; font-size: 36px; background: linear-gradient(90deg,#2563eb,#7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-shadow: 0 2px 28px rgba(37,99,235,.45); }
        .subtitle { color: #cbd5e1; margin-top: 8px; font-weight: 600; }
        .section-title { color: #a5b4fc; }
        .card { border: 1px solid rgba(148,163,184,.2); border-radius: 12px; padding: 10px; background: rgba(2,6,23,.5); box-shadow: 0 4px 14px rgba(0,0,0,.25); }
        .card-input input, .card-input textarea { background: rgba(15,23,42,.6) !important; color: #e2e8f0 !important; border: 1px solid rgba(148,163,184,.25) !important; }
        #run-btn { background: linear-gradient(90deg,#2563eb,#7c3aed); color: white; padding: 12px 24px; font-size: 16px; border-radius: 10px; border: none; transition: transform .15s ease, opacity .2s ease; }
        #run-btn:hover:not(:disabled) { transform: translateY(-1px); }
        #run-btn:disabled { cursor: not-allowed !important; opacity: .7 !important; }
        /* Minimal .py suffix inside module textbox */
        #module-name { position: relative; }
        #module-name input, #module-name textarea { padding-right: 84px !important; }
        #module-name::after { content: ".py"; position: absolute; right: 12px; top: 50%; transform: translateY(-50%); background: #2563eb; color: #ffffff; font-weight: 700; padding: 4px 10px; border-radius: 8px; border: 1px solid rgba(255,255,255,.25); box-shadow: 0 2px 6px rgba(0,0,0,.25); pointer-events: none; z-index: 1; }
        /* Error output styling (only when .error class present) */
        #output-box.error textarea { background: #7f1d1d !important; border-color: #ef4444 !important; color: #fee2e2 !important; }
        #output-box.error label, #output-box.error .wrap .label { color: #ef4444 !important; }
        .nowrap { white-space: nowrap; }
        .note { color: #2563eb; margin-top: 6px; font-weight: 400; }
        """

        # Add small JS snippet to maintain a tooltip reflecting disabled state
        gr.HTML("""
        <script>
        setInterval(() => {
          const b = document.getElementById('run-btn');
          if (b) {
            b.title = b.disabled ? 'Processing… This can take ~5-6 minutes' : 'Click to run the AI coder';
          }
        }, 1000);
        </script>
        """)

        # Ensure progress overlay renders reliably
        demo.queue()

    register_preview_proxy(demo.app)

    return demo