|
|
import streamlit as st |
|
|
import google.generativeai as genai |
|
|
import json |
|
|
import re |
|
|
import datetime |
|
|
|
|
|
|
|
|
API_KEY = st.secrets["GOOGLE_API_KEY"] |
|
|
|
|
|
|
|
|
st.set_page_config(page_title="🤖 Gemini2 PowerShell Command Gen", page_icon="🤖", layout="wide") |
|
|
|
|
|
def enviar_mensagem_para_modelo(mensagem, modelo_nome, temperatura, max_tokens): |
|
|
"""Envia uma mensagem para o modelo de IA e retorna a resposta.""" |
|
|
try: |
|
|
|
|
|
CONFIGURACAO_GERACAO = { |
|
|
"temperature": temperatura, |
|
|
"top_p": 0.8, |
|
|
"top_k": 40, |
|
|
"response_mime_type": "text/plain", |
|
|
"max_output_tokens": max_tokens, |
|
|
} |
|
|
MODELO = genai.GenerativeModel( |
|
|
model_name=modelo_nome, |
|
|
generation_config=CONFIGURACAO_GERACAO, |
|
|
) |
|
|
|
|
|
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, modelo_nome, temperatura, max_tokens, prompt_detail, encoding, add_header, add_error_handling, log_level): |
|
|
"""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} |
|
|
**Nível de Detalhamento do Prompt**:{prompt_detail} |
|
|
|
|
|
**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. |
|
|
|
|
|
**Log Level**:{log_level} |
|
|
**Tratamento de Erros**:{add_error_handling} |
|
|
|
|
|
**Importante:** |
|
|
- Gere apenas um comando por vez. |
|
|
""" |
|
|
resposta = enviar_mensagem_para_modelo(prompt, modelo_nome, temperatura, max_tokens) |
|
|
return resposta |
|
|
|
|
|
def parsear_e_salvar_ps1(codigo_ia, titulo_curto, encoding, add_header): |
|
|
"""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" |
|
|
|
|
|
if add_header: |
|
|
data_atual = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
|
|
header = f""" |
|
|
#=============================================================================== |
|
|
# Script Gerado pelo Google Gemini 2 PowerShell Command Gen |
|
|
# Data: {data_atual} |
|
|
# Autor: Elias Andrade |
|
|
#=============================================================================== |
|
|
""" |
|
|
codigo_ps1 = header + codigo_ps1 |
|
|
|
|
|
with open(nome_arquivo, "w", encoding=encoding) as f: |
|
|
f.write(codigo_ps1) |
|
|
return nome_arquivo, codigo_ps1 |
|
|
|
|
|
def main(): |
|
|
st.title("🤖 Gemini2 PowerShell Command Gen by [Elias Andrade](https://github.com/chaos4455)") |
|
|
st.markdown("Crie comandos PowerShell de forma fácil e rápida! 🚀") |
|
|
st.markdown("---") |
|
|
|
|
|
|
|
|
col1, col2 = st.columns([1, 3]) |
|
|
|
|
|
with col1: |
|
|
st.header("⚙️ Configurações") |
|
|
|
|
|
with st.expander("✨ Configurações da IA"): |
|
|
modelo_nome = st.selectbox("🤖 Modelo da IA", ["gemini-2.0-flash-exp", "gemini-1.5-flash-exp"], index=0, help="Escolha o modelo da IA.") |
|
|
temperatura = st.slider("🌡️ Temperatura", min_value=0.1, max_value=1.0, value=0.7, step=0.1, help="Ajuste a criatividade da IA.") |
|
|
max_tokens = st.number_input("📏 Max Tokens", min_value=128, max_value=8192, value=8192, step=128, help="Ajuste o tamanho máximo da resposta.") |
|
|
|
|
|
with st.expander("📝 Configurações do Prompt"): |
|
|
prompt_presets = st.selectbox("🎯 Prompts Predefinidos", ["Nenhum", "Listar arquivos", "Gerenciar processos", "Gerenciar serviços"], index=0, help="Escolha um prompt predefinido.") |
|
|
prompt_detail = st.selectbox("🧐 Detalhe do Prompt", ["Mais descritivo", "Padrão", "Conciso"], index=1, help="Define o nível de detalhe do prompt") |
|
|
|
|
|
with st.expander("🛠️ Configurações do PowerShell"): |
|
|
powershell_version = st.selectbox("🎛️ Versão do PowerShell", ["7", "5.1"], index=0, help="Escolha a versão do PowerShell") |
|
|
sistema_operacional = st.selectbox( |
|
|
"💻 Sistema Operacional", |
|
|
[ |
|
|
"Windows Server 2022", "Windows Server 2019", "Windows Server 2016", |
|
|
"Windows Server 2012 R2", "Windows Server 2012", "Windows Server 2008 R2", |
|
|
"Windows Server 2008", "Windows 11", "Windows 10","Windows 8.1", "Windows 8","Windows 7", "Outro" |
|
|
], |
|
|
index=2, help="Escolha o Sistema Operacional de destino." |
|
|
) |
|
|
encoding = st.selectbox("🔤 Encoding", ["utf-8", "ansi"], index=0, help="Escolha o encoding do arquivo .ps1") |
|
|
add_header = st.checkbox("📜 Adicionar Cabeçalho", value=True, help="Adicionar um cabeçalho com informações no arquivo .ps1") |
|
|
add_error_handling = st.checkbox("🛡️ Tratamento de Erros", value=True, help="Adicionar tratamento de erros padrão no script") |
|
|
log_level = st.selectbox("🗂️ Nível de Logging", ["Detalhado", "Padrão", "Mínimo"], index=1, help="Define o nível de detalhe de logs.") |
|
|
|
|
|
with col2: |
|
|
|
|
|
prompt_base = st.text_input("Descreva o Comando PowerShell:", placeholder="Ex: Liste todos os processos em execução", key="prompt_base") |
|
|
|
|
|
if prompt_presets != "Nenhum": |
|
|
if prompt_base: |
|
|
prompt_base = f"{prompt_presets} , {prompt_base}" |
|
|
else: |
|
|
prompt_base = prompt_presets; |
|
|
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, |
|
|
modelo_nome, |
|
|
temperatura, |
|
|
max_tokens, |
|
|
prompt_detail, |
|
|
encoding, |
|
|
add_header, |
|
|
add_error_handling, |
|
|
log_level |
|
|
) |
|
|
|
|
|
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, encoding, add_header) |
|
|
|
|
|
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() |