File size: 4,148 Bytes
7efd637
ca8dc25
 
 
 
4c02c40
 
7efd637
ca8dc25
 
 
7efd637
ca8dc25
 
 
 
 
5e6f5c8
b13161d
ca8dc25
 
 
 
4c02c40
 
 
 
ca8dc25
 
 
 
 
 
77aebb7
 
a21891c
 
 
 
 
77aebb7
 
 
 
 
 
 
 
 
 
 
a21891c
 
ca8dc25
a21891c
 
ca8dc25
 
 
 
b13161d
ca8dc25
2413fd7
ca8dc25
 
 
 
b13161d
 
ca8dc25
 
b13161d
 
 
 
 
ca8dc25
 
 
 
5e6f5c8
 
b13161d
 
7efd637
5e6f5c8
 
 
ca8dc25
5e6f5c8
 
b13161d
 
5e6f5c8
 
 
b13161d
7efd637
77aebb7
7efd637
5e6f5c8
b13161d
5e6f5c8
ca8dc25
5e6f5c8
7efd637
5e6f5c8
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
import gradio as gr
import os
from together import Together
import base64
from io import BytesIO
from PIL import Image
import numpy as np

# Initialize the Together client
api_key = os.environ.get('TOGETHER_API_KEY')
client = None

if api_key:
    try:
        client = Together(api_key=api_key)
    except Exception as e:
        print(f"Error initializing Together client: {e}")

def generate_gradio_app(image):
    if not api_key or not client:
        return "Error: TOGETHER_API_KEY not set or client initialization failed. Please check your API key."

    try:
        # Convert numpy array to PIL Image
        if isinstance(image, np.ndarray):
            image = Image.fromarray(image.astype('uint8'), 'RGB')
        
        # Convert the image to base64
        buffered = BytesIO()
        image.save(buffered, format="PNG")
        img_str = base64.b64encode(buffered.getvalue()).decode()
        
        # Prepare the messages for the API call
        system_message = """You are an AI assistant that can analyze wireframe images and generate detailed Gradio code based on their content. Your task is to provide a complete, runnable Gradio application that recreates the UI elements seen in the wireframe."""

        user_message = f"""
        <image>
        data:image/png;base64,{img_str}
        </image>
        
        Analyze this wireframe image and generate a complete Python code using Gradio that recreates all the main elements seen in the image. Follow these guidelines:
        1. Use appropriate Gradio components that best represent each UI element in the wireframe.
        2. Include all necessary imports at the beginning of the code.
        3. Implement placeholder functions for any interactive elements (buttons, inputs, etc.).
        4. Use gr.Blocks() to create a layout that matches the wireframe as closely as possible.
        5. Add appropriate labels and descriptions for all components.
        6. Include the gr.Blocks().launch() call at the end of the code.
        7. Provide a complete, runnable Gradio application that can be executed as-is.
        8. Add comments explaining the purpose of each major section or component.

        Please generate the entire code, including all necessary parts to make it a fully functional Gradio application.
        """
        
        messages = [
            {"role": "system", "content": system_message},
            {"role": "user", "content": user_message}
        ]
        
        # Make the API call
        response = client.chat.completions.create(
            model="meta-llama/Llama-Vision-Free",
            messages=messages,
            max_tokens=50000,
            temperature=0.7,
            top_p=0.7,
            top_k=50,
            repetition_penalty=1,
            stop=["<|eot_id|>", "<|eom_id|>"],
            stream=True
        )
        
        # Collect the streamed response
        generated_code = ""
        for chunk in response:
            if chunk.choices[0].delta.content is not None:
                generated_code += chunk.choices[0].delta.content
        
        return generated_code
    except Exception as e:
        return f"An error occurred: {str(e)}"

with gr.Blocks() as demo:
    gr.Markdown("# Turn your wireframe into a Gradio app")
    gr.Markdown("Upload an image of your UI design and we'll build a Gradio app for you.")
    
    with gr.Row():
        with gr.Column():
            image_input = gr.Image(label="Upload a screenshot", elem_id="image_upload")
            example_link = gr.Markdown("Need an example image? [Try ours](https://example.com/wireframe.png).")
            
            model_dropdown = gr.Dropdown(
                choices=["Llama-Vision-Free"],
                value="Llama-Vision-Free",
                label="AI Model"
            )
            
            generate_button = gr.Button("Generate Gradio app", variant="primary")
    
    code_output = gr.Code(language="python", label="Generated Gradio Code", lines=30)
    
    generate_button.click(
        fn=generate_gradio_app,
        inputs=[image_input],
        outputs=[code_output]
    )

demo.launch()