chaos4455's picture
Update app.py
b03fec6 verified
raw
history blame
8.76 kB
import streamlit as st
import google.generativeai as genai
import json
import re
# Configurações de chave secreta e API do Google Gemini
API_KEY = st.secrets["GOOGLE_API_KEY"]
# Estilos CSS para o Streamlit
st.markdown(
"""
<style>
body {
background-color: #f0f2f6;
color: #262730;
font-family: 'Arial', sans-serif;
}
.stApp {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
display: flex;
flex-wrap: wrap;
}
.stSidebar {
background-color: #e9ecef;
padding: 20px;
border-radius: 10px;
margin-bottom: 20px;
width: 250px;
min-width:250px;
}
@media (max-width: 768px) {
.stSidebar {
width: 100%;
margin-bottom: 10px;
min-width:auto;
}
}
.main{
flex: 1;
padding: 20px;
display: flex;
flex-direction:column;
}
.stTextInput>div>div>input {
width: 100%;
border-radius: 8px;
padding: 12px;
border: 1px solid #ced4da;
font-size: 1rem;
}
.stSelectbox>div>div>div {
border-radius: 8px;
padding: 10px;
border: 1px solid #ced4da;
font-size: 1rem;
margin-bottom: 10px;
}
.stRadio>div{
display:flex;
flex-direction: row;
margin-bottom: 10px;
}
.stRadio>div>div{
margin-right:15px
}
.stButton>button {
background-color: #007bff;
color: white;
border: none;
border-radius: 8px;
padding: 12px 24px;
cursor: pointer;
transition: background-color 0.3s ease;
font-size: 1rem;
}
.stButton>button:hover {
background-color: #0056b3;
}
.stDownloadButton>button{
background-color: #28a745;
color: white;
border: none;
border-radius: 8px;
padding: 12px 24px;
cursor: pointer;
transition: background-color 0.3s ease;
font-size: 1rem;
}
.stDownloadButton>button:hover {
background-color: #1e7e34;
}
.stAlert {
padding: 15px;
margin-bottom: 20px;
border: 1px solid transparent;
border-radius: 4px;
font-size: 1rem;
}
.stAlert.stAlert-danger {
color: #721c24;
background-color: #f8d7da;
border-color: #f5c6cb;
}
.stSpinner {
display: flex;
justify-content: center;
align-items: center;
margin-top: 20px;
}
.stSpinner div {
border: 8px solid #f3f3f3;
border-top: 8px solid #3498db;
border-radius: 50%;
width: 60px;
height: 60px;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
code.language-powershell {
display: block;
overflow-x: auto;
background-color: #f5f5f5;
color: #333;
padding: 15px;
border-radius: 8px;
font-size: 0.9rem;
}
""",
unsafe_allow_html=True,
)
def enviar_mensagem_para_modelo(mensagem):
"""Envia uma mensagem para o modelo de IA e retorna a resposta."""
try:
resposta = MODELO.start_chat(history=[]).send_message(mensagem)
return resposta.text
except Exception as e:
st.error(f"❌ Erro ao comunicar com a IA: {e}")
return None
def gerar_comando_powershell(prompt_base, nivel_detalhe, tipo_script, nivel_seguranca):
"""Gera um comando Powershell com base nas configurações do usuário."""
prompt = f"""
Você é um especialista em Powershell. Sua tarefa é gerar um único comando Powershell com base na seguinte descrição:
**Descrição do Comando:** {prompt_base}
**Nível de Detalhe:** {nivel_detalhe}
**Tipo de Script:** {tipo_script}
**Nível de Segurança:** {nivel_seguranca}
**Formato da resposta:**
- Responda em formato Markdown, incluindo um bloco de código Powershell com a formatação original, sem quebrar linhas.
- O bloco de código Powershell deve estar delimitado por ```powershell e ``` .
- Não inclua comentários, explicações ou qualquer outro texto fora do bloco de código.
- O código Powershell deve manter a formatação vertical completa, respeitando indentação e quebras de linha.
- Se for gerar um comando com uma cadeia de comandos, não use ponto e virgula no final ou inicio.
- Se precisar use pipe "|" para encadear.
- Não use nenhum tipo de formatação especial no resultado, apenas o código.
- 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.
- 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.
- 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.
- Certifique-se de que o comando gerado seja seguro e siga as melhores práticas do Powershell.
**Importante:**
- Gere apenas um comando por vez.
"""
resposta = enviar_mensagem_para_modelo(prompt)
return resposta
def parsear_e_salvar_ps1(codigo_ia, titulo_curto):
"""Parseia o markdown e salva o código Powershell como .ps1."""
match = re.search(r'```powershell\s*(.*?)\s*```', codigo_ia, re.DOTALL | re.IGNORECASE)
if match:
codigo_ps1 = match.group(1).strip()
else:
codigo_ps1 = codigo_ia.strip()
nome_arquivo = f"comando_{titulo_curto}.ps1"
with open(nome_arquivo, "w", encoding="utf-8") as f:
f.write(codigo_ps1)
return nome_arquivo, codigo_ps1
def main():
# Configuração do modelo de IA
CONFIGURACAO_GERACAO = {
"temperature": 0.2,
"top_p": 0.8,
"top_k": 40,
"response_mime_type": "text/plain",
}
NOME_MODELO = "gemini-2.0-flash-exp"
# Move st.set_page_config para o começo da função
st.set_page_config(page_title="Google Gemini 2 PowerShell Command Gen", page_icon="🤖", layout="wide")
# Configuração do modelo de IA
global MODELO
MODELO = genai.GenerativeModel(
model_name=NOME_MODELO,
generation_config=CONFIGURACAO_GERACAO,
)
st.title("🤖 Google Gemini 2 PowerShell Command Gen by [Elias Andrade](https://github.com/chaos4455)")
st.markdown("Crie comandos PowerShell de forma fácil e rápida!")
st.markdown("---")
# Layout em colunas (barra lateral e principal)
col1, col2 = st.columns([1, 3])
with col1:
st.sidebar.header("⚙️ Configurações")
powershell_version = st.sidebar.selectbox("Versão do PowerShell", ["7", "5.1"], index=0)
sistema_operacional = st.sidebar.selectbox("Sistema Operacional", ["Windows Server 2016", "Windows 10", "Windows 11", "Outro"], index=0)
nivel_detalhe = st.sidebar.selectbox("Nível de Detalhe", ["Mais detalhado", "Padrão", "Mais conciso"], index=1)
tipo_script = st.sidebar.selectbox("Tipo de Script", ["Mais automático", "Mais interativo"], index=0)
nivel_seguranca = st.sidebar.radio("Nível de Segurança", ["Alto", "Médio", "Baixo"], index=1)
with col2:
# Prompt base do usuário
prompt_base = st.text_input("Descreva o Comando PowerShell:", placeholder="Ex: Liste todos os processos em execução", key="prompt_base")
if st.button("✨ Gerar Comando PowerShell"):
if not prompt_base:
st.error("⚠️ Por favor, insira uma descrição do comando.")
return
with st.spinner("⏳ Gerando comando..."):
codigo_ia = gerar_comando_powershell(prompt_base, nivel_detalhe, tipo_script, nivel_seguranca)
if codigo_ia:
st.markdown("### ✅ Comando Gerado:")
st.code(codigo_ia, language="powershell")
titulo_curto = prompt_base[:30].strip().replace(" ", "_").lower()
nome_arquivo_ps1, codigo_ps1 = parsear_e_salvar_ps1(codigo_ia, titulo_curto)
st.download_button(
label="⬇️ Baixar Comando (.ps1)",
data=codigo_ps1,
file_name=nome_arquivo_ps1,
mime="application/powershell",
)
else:
st.error("❌ Erro ao gerar o comando. Verifique a conexão com a IA e tente novamente.")
if __name__ == "__main__":
main()