File size: 7,350 Bytes
45059c1
 
 
 
 
 
 
 
 
 
 
1211e0a
45059c1
3e6af59
 
 
 
 
 
45059c1
 
 
 
 
10079c0
45059c1
10079c0
45059c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3e6af59
45059c1
 
4c072d6
3e6af59
 
45059c1
3e6af59
45059c1
 
3e6af59
45059c1
 
 
 
 
 
 
 
 
 
3e6af59
45059c1
3e6af59
45059c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import google.generativeai as genai
from openai import OpenAI
import PIL.Image
import time

from plantuml import PlantUML 
# Cria uma instância do PlantUML
plantuml = PlantUML("http://www.plantuml.com/plantuml/img/")

# Configurar a chave da API
genai.configure(api_key="")

def remover_acentos_graves(s):
    # Substitui "```" por uma string vazia
    s = s.replace("```", "")
    s = s.replace("plantuml", "")
    
    return s


def generate_webapp():
    # Título do aplicativo Streamlit
    st.title("Generative AI Web Apps")
    st.subheader("Gera código a partir do Diagrama de Casos de Uso:")
    # Área de upload de imagem
    uploaded_file = st.file_uploader("Escolha um diagrama de casos de uso", type=["jpg", "jpeg", "png"])

    # Caixa de seleção para permitir que o usuário forneça um prompt personalizado
    use_custom_prompt = st.checkbox("Clique aqui se deseja fornecer um prompt personalizado")

    if use_custom_prompt:
        # Caixa de texto para o prompt personalizado (aparece apenas se use_custom_prompt for True)
        user_prompt = st.text_area("Digite seu prompt para gerar o código da app:", key="custom_prompt", value="")

    # Verificar se uma imagem foi carregada
    if uploaded_file is not None:
        # Carregar a imagem usando PIL
        img = PIL.Image.open(uploaded_file)
        # Exibir a imagem no frontend
        st.image(img, caption="Imagem Carregada", use_column_width=True)
        
        with st.spinner("Processando imagem..."):
            vision_description = None
            # Gerar descrição da imagem usando gemini-pro-vision
            model_vision = genai.GenerativeModel('gemini-pro-vision')
            vision_description = model_vision.generate_content(["Descreve com detalhes o que vê neste diagrama de casos de uso, especifique cada caso e ator mostrado no diagrama da imagem ", img])

            # Exibir a descrição no frontend
            st.subheader("Descrição do diagrama:")
            st.write(vision_description.text)
        
        with st.spinner("Gerando o código da app..."):
            # Usar o prompt personalizado fornecido pelo usuário se a opção estiver ativada
            if use_custom_prompt and user_prompt:
                prompt_text = user_prompt + ","+vision_description.text
            else:
                # Caso contrário, use o prompt padrão combinado com a descrição da imagem
                prompt_text = "Você é um desenvolvedor de web apps. Escreva os códigos necessários (não coloque nenhum comentário, somente os códigos) usando programação orientada a objetos, Python, Streamlit e caso seja necessário o banco de dados e suas tabelas usando o SQLite visando desenvolver um web app de acordo com a descrição deste diagrama de casos : " + vision_description.text
                
            # Gerar código usando o modelo gemini-pro
            model_code = genai.GenerativeModel('gemini-pro')
            generated_code = model_code.generate_content(prompt_text)

            # Exibir o código gerado no frontend
            st.subheader("Código Gerado:")
            st.code(generated_code.text, language='python')

            prompt_UML = "Escreva somente o código do script usando plantuml para geração do digrama de classes tendo como base o seguinte código:"+generated_code.text
            # Gerar código usando o modelo gemini-pro
            model_code = genai.GenerativeModel('gemini-pro')
            generated_code = model_code.generate_content(prompt_UML)         
           
            resultado = remover_acentos_graves(generated_code.text)

            print(resultado)
            with st.spinner("Gerando o diagrama de classes da app..."):
                # Gera o diagrama e salva como um arquivo PNG
                image_path = plantuml.processes(resultado)
                with open("class_diagram.png", "wb") as f:
                    f.write(image_path)
                
                time.sleep(5)
                st.subheader("Diagrama de Classes Gerado:")
                st.image("class_diagram.png") 

def reverse_engineering():
    # Título do aplicativo Streamlit
    st.title("Reverse Engineering Web Apps")
    st.subheader("Gera código a partir do Diagrama de Classes:")
    # Área de upload de imagem
    uploaded_file = st.file_uploader("Escolha um diagrama de classes", type=["jpg", "jpeg", "png"])

    # Caixa de seleção para permitir que o usuário forneça um prompt personalizado
    use_custom_prompt = st.checkbox("Clique aqui se deseja fornecer um prompt personalizado")

    if use_custom_prompt:
        # Caixa de texto para o prompt personalizado (aparece apenas se use_custom_prompt for True)
        user_prompt = st.text_area("Digite seu prompt para gerar o código da app:", key="custom_prompt", value="")

    # Verificar se uma imagem foi carregada
    if uploaded_file is not None:
        # Carregar a imagem usando PIL
        img = PIL.Image.open(uploaded_file)
        # Exibir a imagem no frontend
        st.image(img, caption="Imagem Carregada", use_column_width=True)
        
        with st.spinner("Processando imagem..."):
            vision_description = None
            # Gerar descrição da imagem usando gemini-pro-vision
            model_vision = genai.GenerativeModel('gemini-pro-vision')
            vision_description = model_vision.generate_content(["Descreve com detalhes o que vê neste diagrama de casos de classes, especifique cada classs e seus métodos mostrados no diagrama da imagem ", img])

            # Exibir a descrição no frontend
            st.subheader("Descrição do diagrama:")
            st.write(vision_description.text)
        
        with st.spinner("Gerando o código da app..."):
            # Usar o prompt personalizado fornecido pelo usuário se a opção estiver ativada
            if use_custom_prompt and user_prompt:
                prompt_text = user_prompt + ","+vision_description.text
            else:
                # Caso contrário, use o prompt padrão combinado com a descrição da imagem
                prompt_text = "Você é um desenvolvedor de web apps. Escreva os códigos necessários (não coloque nenhum comentário, somente os códigos) usando programação orientada a objetos, Python, Streamlit e caso seja necessário o banco de dados e suas tabelas usando o SQLite visando desenvolver um web app de acordo com a descrição deste diagrama de casos : " + vision_description.text
                
                          
            # Gerar código usando o modelo gemini-pro
            model_code = genai.GenerativeModel('gemini-pro')
            generated_code = model_code.generate_content(prompt_text)

            # Exibir o código gerado no frontend
            st.subheader("Código Gerado:")
            st.code(generated_code.text, language='python')
          
 
def main():
    st.sidebar.title("Menu")
    menu_option = st.sidebar.radio("Escolha uma opção", ["Generate Webapp", "Reverse Engineering"])

    if menu_option == "Generate Webapp":
        generate_webapp()
    elif menu_option == "Reverse Engineering":
        reverse_engineering()


if __name__ == "__main__":
    main()