chaos4455 commited on
Commit
0776f89
·
verified ·
1 Parent(s): 092d502

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +206 -0
app.py ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import google.generativeai as genai
3
+ import json
4
+ import re
5
+
6
+ # Configurações de chave secreta e API do Google Gemini
7
+ API_KEY = st.secrets["GOOGLE_API_KEY"] # Carrega a chave do arquivo secrets.toml
8
+ genai.configure(api_key=API_KEY)
9
+
10
+ # Configuração do modelo de IA
11
+ CONFIGURACAO_GERACAO = {
12
+ "temperature": 0.2,
13
+ "top_p": 0.8,
14
+ "top_k": 40,
15
+ "response_mime_type": "text/plain",
16
+ }
17
+ NOME_MODELO = "gemini-2.0-flash-exp"
18
+ MODELO = genai.GenerativeModel(
19
+ model_name=NOME_MODELO,
20
+ generation_config=CONFIGURACAO_GERACAO,
21
+ )
22
+
23
+ # Estilos CSS para o Streamlit
24
+ st.markdown(
25
+ """
26
+ <style>
27
+ body {
28
+ background-color: #f0f2f6;
29
+ color: #262730;
30
+ }
31
+ .stApp {
32
+ max-width: 900px;
33
+ margin: 0 auto;
34
+ padding: 20px;
35
+ }
36
+ .stTextInput>div>div>input {
37
+ border-radius: 8px;
38
+ padding: 10px;
39
+ border: 1px solid #ced4da;
40
+ }
41
+ .stButton>button {
42
+ background-color: #007bff;
43
+ color: white;
44
+ border: none;
45
+ border-radius: 8px;
46
+ padding: 10px 20px;
47
+ cursor: pointer;
48
+ }
49
+ .stButton>button:hover {
50
+ background-color: #0056b3;
51
+ }
52
+ .stSelectbox>div>div>div {
53
+ border-radius: 8px;
54
+ padding: 5px;
55
+ border: 1px solid #ced4da;
56
+
57
+ }
58
+ .stRadio>div{
59
+ display:flex;
60
+ flex-direction: row;
61
+ }
62
+ .stRadio>div>div{
63
+ margin-right:15px
64
+ }
65
+ .stDownloadButton>button{
66
+ background-color: #28a745;
67
+ color: white;
68
+ border: none;
69
+ border-radius: 8px;
70
+ padding: 10px 20px;
71
+ cursor: pointer;
72
+ }
73
+ .stDownloadButton>button:hover {
74
+ background-color: #1e7e34;
75
+ }
76
+
77
+ .stAlert {
78
+ padding: 15px;
79
+ margin-bottom: 20px;
80
+ border: 1px solid transparent;
81
+ border-radius: 4px;
82
+ }
83
+ .stAlert.stAlert-danger {
84
+ color: #721c24;
85
+ background-color: #f8d7da;
86
+ border-color: #f5c6cb;
87
+ }
88
+ .stSpinner {
89
+ display: flex;
90
+ justify-content: center;
91
+ align-items: center;
92
+ margin-top: 20px;
93
+ }
94
+ .stSpinner div {
95
+ border: 8px solid #f3f3f3;
96
+ border-top: 8px solid #3498db;
97
+ border-radius: 50%;
98
+ width: 60px;
99
+ height: 60px;
100
+ animation: spin 2s linear infinite;
101
+ }
102
+
103
+ @keyframes spin {
104
+ 0% { transform: rotate(0deg); }
105
+ 100% { transform: rotate(360deg); }
106
+ }
107
+ </style>
108
+ """,
109
+ unsafe_allow_html=True,
110
+ )
111
+
112
+ def enviar_mensagem_para_modelo(mensagem):
113
+ """Envia uma mensagem para o modelo de IA e retorna a resposta."""
114
+ try:
115
+ resposta = MODELO.start_chat(history=[]).send_message(mensagem)
116
+ return resposta.text
117
+ except Exception as e:
118
+ st.error(f"❌ Erro ao comunicar com a IA: {e}")
119
+ return None
120
+
121
+ def gerar_comando_powershell(prompt_base, nivel_detalhe, tipo_script, nivel_seguranca):
122
+ """Gera um comando Powershell com base nas configurações do usuário."""
123
+ prompt = f"""
124
+ Você é um especialista em Powershell. Sua tarefa é gerar um único comando Powershell com base na seguinte descrição:
125
+
126
+ **Descrição do Comando:** {prompt_base}
127
+
128
+ **Nível de Detalhe:** {nivel_detalhe}
129
+ **Tipo de Script:** {tipo_script}
130
+ **Nível de Segurança:** {nivel_seguranca}
131
+
132
+ **Formato da resposta:**
133
+ - Responda apenas o código do comando Powershell, sem texto adicional.
134
+ - Não inclua comentários, explicações ou markdown.
135
+ - Se for gerar um comando com uma cadeia de comandos, não use ponto e virgula no final ou inicio.
136
+ - Se precisar use pipe "|" para encadear.
137
+ - Não use nenhum tipo de formatação especial no resultado, apenas o código.
138
+ - Se a descrição pedir para criar um arquivo, o comando deverá criar o arquivo diretamente no sistema de arquivos e não usar um output em tela para isso.
139
+ - Se a descrição pedir para ler um arquivo, o comando deverá ler o arquivo diretamente do sistema de arquivos e não usar um input em tela para isso.
140
+ - O sistema operacional padrão é Windows Server 2016 e a versão do Powershell padrão é a 7, a não ser que o usuário especifique o contrário.
141
+ - Certifique-se de que o comando gerado seja seguro e siga as melhores práticas do Powershell.
142
+
143
+ **Importante:**
144
+ - Gere apenas um comando por vez.
145
+ """
146
+ resposta = enviar_mensagem_para_modelo(prompt)
147
+ return resposta
148
+
149
+ def parsear_e_salvar_ps1(codigo_ia, titulo_curto):
150
+ """Parseia o código retornado pela IA para extrair o bloco de comando ps1 e salva como .ps1."""
151
+ # Regex para encontrar blocos de código Powershell (ignorando case)
152
+ match = re.search(r'```powershell\s*(.*?)\s*```', codigo_ia, re.DOTALL | re.IGNORECASE)
153
+ if match:
154
+ codigo_ps1 = match.group(1).strip()
155
+ else:
156
+ codigo_ps1 = codigo_ia.strip() # Se não houver bloco, usa o código inteiro
157
+
158
+ nome_arquivo = f"comando_{titulo_curto}.ps1"
159
+ with open(nome_arquivo, "w", encoding="utf-8") as f:
160
+ f.write(codigo_ps1)
161
+ return nome_arquivo, codigo_ps1
162
+
163
+ def main():
164
+ st.set_page_config(page_title="Google Gemini 2 PowerShell Command Gen", page_icon="🤖")
165
+ st.title("🤖 Google Gemini 2 PowerShell Command Gen by [Elias Andrade](https://github.com/chaos4455)")
166
+ st.markdown("Crie comandos PowerShell de forma fácil e rápida!")
167
+ st.markdown("---")
168
+
169
+ # Configurações do Usuário
170
+ st.sidebar.header("⚙️ Configurações")
171
+ powershell_version = st.sidebar.selectbox("Versão do PowerShell", ["7", "5.1"], index=0)
172
+ sistema_operacional = st.sidebar.selectbox("Sistema Operacional", ["Windows Server 2016", "Windows 10", "Windows 11", "Outro"], index=0)
173
+
174
+ nivel_detalhe = st.sidebar.selectbox("Nível de Detalhe", ["Mais detalhado", "Padrão", "Mais conciso"], index=1)
175
+ tipo_script = st.sidebar.selectbox("Tipo de Script", ["Mais automático", "Mais interativo"], index=0)
176
+ nivel_seguranca = st.sidebar.radio("Nível de Segurança", ["Alto", "Médio", "Baixo"], index=1)
177
+
178
+ # Prompt base do usuário
179
+ prompt_base = st.text_input("Descreva o Comando PowerShell:", placeholder="Ex: Liste todos os processos em execução", key="prompt_base")
180
+
181
+ if st.button("✨ Gerar Comando PowerShell"):
182
+ if not prompt_base:
183
+ st.error("⚠️ Por favor, insira uma descrição do comando.")
184
+ return
185
+
186
+ with st.spinner("⏳ Gerando comando..."):
187
+ codigo_ia = gerar_comando_powershell(prompt_base, nivel_detalhe, tipo_script, nivel_seguranca)
188
+ if codigo_ia:
189
+
190
+ st.markdown("### ✅ Comando Gerado:")
191
+ st.code(codigo_ia, language="powershell")
192
+
193
+ titulo_curto = prompt_base[:30].strip().replace(" ", "_").lower()
194
+ nome_arquivo_ps1, codigo_ps1 = parsear_e_salvar_ps1(codigo_ia, titulo_curto)
195
+
196
+ st.download_button(
197
+ label="⬇️ Baixar Comando (.ps1)",
198
+ data=codigo_ps1,
199
+ file_name=nome_arquivo_ps1,
200
+ mime="application/powershell",
201
+ )
202
+ else:
203
+ st.error("❌ Erro ao gerar o comando. Verifique a conexão com a IA e tente novamente.")
204
+
205
+ if __name__ == "__main__":
206
+ main()