Skip to content

Commit

Permalink
feat: update .gitignore and enhance form.py with detailed docstrings …
Browse files Browse the repository at this point in the history
…and improved error handling
  • Loading branch information
92username committed Feb 2, 2025
1 parent 95dcac9 commit 4e657c7
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 79 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.env
venv/
.streamlit/
.venv
171 changes: 145 additions & 26 deletions form.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,37 @@
"""
Este aplicativo Streamlit gera exercícios de programação usando a API OpenAI GPT-3.5-turbo.
Os usuários podem selecionar uma linguagem de programação, definir um tema e especificar
a quantidade de exercícios para diferentes níveis de dificuldade.
O aplicativo possui as seguintes funcionalidades:
- Carrega a chave da API OpenAI de um arquivo .env.
- Verifica se a chave da API está presente.
- Define uma lista de linguagens de programação suportadas.
- Gera exercícios de programação com base na linguagem, níveis, tema e quantidades
fornecidos.
- Exibe um formulário para o usuário selecionar a linguagem, tema e quantidades de
exercícios.
- Mostra uma barra de progresso e um spinner enquanto os exercícios são gerados.
- Exibe os exercícios gerados na interface do Streamlit.
Funções:
- gerar_exercicios(linguagem, niveis, tema, quantidades): Gera exercícios de programação
com base nos parâmetros fornecidos.
- main(): Função principal que define a interface do usuário e gerencia a lógica do
aplicativo.
Dependências:
- os
- time
- openai
- streamlit
- dotenv
Como usar:
1. Configure a chave da API OpenAI no arquivo .env.
2. Execute o aplicativo usando `streamlit run form.py`.
3. Preencha o formulário na interface do Streamlit para gerar exercícios de programação.
"""
import os
import time
import openai
Expand All @@ -9,13 +43,16 @@
api_key = os.getenv("OPENAI_API_KEY")

if not api_key:
raise ValueError("API key não encontrada. Verifique se o arquivo .env está configurado corretamente.")
raise ValueError(
"API key não encontrada. Verifique se o arquivo .env está configurado corretamente."
)
print("API key encontrada. Inicializando o aplicativo...")

openai.api_key = api_key

lista_linguagens = ["Python", "JavaScript", "Java", "C++", "C#", "Dart"]


def gerar_exercicios(linguagem, niveis, tema, quantidades):
"""
Gera exercícios de programação com base na linguagem, níveis, tema e quantidades fornecidos.
Expand Down Expand Up @@ -48,25 +85,27 @@ def gerar_exercicios(linguagem, niveis, tema, quantidades):
- Nível 3: Construção de lógica com conceitos aprendidos.
- Nível 4: Integração com conteúdos anteriores.
- Nível 5: Uso avançado de todos os conceitos estudados."""
)
),
},
{
"role": "user",
"content": f"Crie exercícios de {linguagem} sobre o tema {tema}."
}
"content": f"Crie exercícios de {linguagem} sobre o tema {tema}.",
},
]
for i, nivel in enumerate(niveis):
if quantidades[i] > 0:
messages.append({
"role": "user",
"content": f"Elabore {quantidades[i]} exercícios no nível {nivel}."
})
messages.append(
{
"role": "user",
"content": f"Elabore {quantidades[i]} exercícios no nível {nivel}.",
}
)

# Chamada à API OpenAI
client = openai.OpenAI()

response = client.chat.completions.create(
model="gpt-3.5-turbo",
model="gpt-3.5-turbo",
messages=messages,
max_tokens=1000, # Limitar a quantidade de tokens
temperature=0.7,
Expand All @@ -75,45 +114,125 @@ def gerar_exercicios(linguagem, niveis, tema, quantidades):
# Retornar o texto gerado pela API
return response.choices[0].message.content.strip()


# Função principal
def main():
st.markdown("<h1 style='color:#00FF00;'>Gerador de Exercícios com GPT</h1>", unsafe_allow_html=True)
"""
Função principal que renderiza a interface do gerador de exercícios com GPT usando
Streamlit. Permite ao usuário selecionar a linguagem de programação, tema dos
exercícios, limite máximo de exercícios por nível e a quantidade de exercícios para
cada nível de dificuldade. Após a submissão do formulário, gera os exercícios
conforme as especificações fornecidas.
A interface inclui:
- Seleção de linguagem de programação
- Campo de texto para o tema dos exercícios
- Slider para definir o limite máximo de exercícios por nível
- Campos numéricos para a quantidade de exercícios em cada nível de dificuldade
- Botão para submeter o formulário e gerar os exercícios
Exibe uma barra de progresso e uma mensagem de carregamento enquanto os exercícios
são gerados. Se nenhum nível tiver quantidade de exercícios maior que zero, exibe
um aviso solicitando ao usuário que insira a quantidade de exercícios para pelo
menos um nível.
"""

st.markdown(
"<h1 style='color:#00FF00;'>Gerador de Exercícios com GPT</h1>",
unsafe_allow_html=True,
)

with st.form("formulario_exercicios"):
# Seleção de linguagem e tema
linguagem = st.selectbox("Linguagem de Programação", ["Python", "JavaScript", "Java", "C++", "C#", "Dart"], format_func=lambda x: "Escolha a linguagem" if x == "" else x)
tema = st.text_input("Escolha o tema dos exercícios (Ex.: Listas, Funções, etc)", value="", placeholder="Digite o tema do exercício...")

linguagem = st.selectbox(
"Linguagem de Programação",
["Python", "JavaScript", "Java", "C++", "C#", "Dart"],
format_func=lambda x: "Escolha a linguagem" if x == "" else x,
)
tema = st.text_input(
"Escolha o tema dos exercícios (Ex.: Listas, Funções, etc)",
value="",
placeholder="Digite o tema do exercício...",
)

# Slider para definir o limite máximo de exercícios
limite_exercicios = st.slider("Limite máximo de exercícios por nível", min_value=1, max_value=10, value=10)

limite_exercicios = st.slider(
"Limite máximo de exercícios por nível", min_value=1, max_value=10, value=10
)

# Campos para inserir a quantidade de exercícios para cada nível
quantidade_nivel1 = st.number_input("Quantidade de exercícios para Nível 1: Muito Fácil", min_value=0, max_value=limite_exercicios, value=0, step=1, placeholder="0")
quantidade_nivel2 = st.number_input("Quantidade de exercícios para Nível 2: Fácil", min_value=0, max_value=limite_exercicios, value=0, step=1, placeholder="0")
quantidade_nivel3 = st.number_input("Quantidade de exercícios para Nível 3: Médio", min_value=0, max_value=limite_exercicios, value=0, step=1, placeholder="0")
quantidade_nivel4 = st.number_input("Quantidade de exercícios para Nível 4: Difícil", min_value=0, max_value=limite_exercicios, value=0, step=1, placeholder="0")
quantidade_nivel5 = st.number_input("Quantidade de exercícios para Nível 5: Muito Difícil", min_value=0, max_value=limite_exercicios, value=0, step=1, placeholder="0")

quantidade_nivel1 = st.number_input(
"Quantidade de exercícios para Nível 1: Muito Fácil",
min_value=0,
max_value=limite_exercicios,
value=0,
step=1,
placeholder="0",
)
quantidade_nivel2 = st.number_input(
"Quantidade de exercícios para Nível 2: Fácil",
min_value=0,
max_value=limite_exercicios,
value=0,
step=1,
placeholder="0",
)
quantidade_nivel3 = st.number_input(
"Quantidade de exercícios para Nível 3: Médio",
min_value=0,
max_value=limite_exercicios,
value=0,
step=1,
placeholder="0",
)
quantidade_nivel4 = st.number_input(
"Quantidade de exercícios para Nível 4: Difícil",
min_value=0,
max_value=limite_exercicios,
value=0,
step=1,
placeholder="0",
)
quantidade_nivel5 = st.number_input(
"Quantidade de exercícios para Nível 5: Muito Difícil",
min_value=0,
max_value=limite_exercicios,
value=0,
step=1,
placeholder="0",
)

submit_button = st.form_submit_button("Gerar Exercícios")

if submit_button:
# Coletar as quantidades e níveis selecionados
niveis = [1, 2, 3, 4, 5]
quantidades = [quantidade_nivel1, quantidade_nivel2, quantidade_nivel3, quantidade_nivel4, quantidade_nivel5]

quantidades = [
quantidade_nivel1,
quantidade_nivel2,
quantidade_nivel3,
quantidade_nivel4,
quantidade_nivel5,
]

if sum(quantidades) > 0: # Verifica se pelo menos um nível tem quantidade > 0
# Barra de progresso inicial (em verde)
progress_bar = st.progress(0)
for percent_complete in range(100):
time.sleep(0.05) # Simula o tempo de processamento
progress_bar.progress(percent_complete + 1)

with st.spinner("Gerando exercícios..."):
exercicios = gerar_exercicios(linguagem, niveis, tema, quantidades)
st.markdown("<h3 style='color:#00FF00;'>Exercícios Gerados:</h3>", unsafe_allow_html=True)
st.markdown(
"<h3 style='color:#00FF00;'>Exercícios Gerados:</h3>",
unsafe_allow_html=True,
)
st.write(exercicios)
else:
st.warning("Por favor, insira a quantidade de exercícios para pelo menos um nível de dificuldade.")
st.warning(
"Por favor, insira a quantidade de exercícios para pelo menos um "
"nível de dificuldade."
)


if __name__ == "__main__":
main()
54 changes: 1 addition & 53 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,55 +1,3 @@
altair==5.4.1
annotated-types==0.7.0
anyio==4.6.0
attrs==24.2.0
blinker==1.8.2
cachetools==5.5.0
certifi==2024.8.30
charset-normalizer==3.3.2
click==8.1.7
distro==1.9.0
exceptiongroup==1.2.2
gitdb==4.0.11
GitPython==3.1.43
h11==0.14.0
httpcore==1.0.5
httpx==0.27.2
idna==3.10
Jinja2==3.1.4
jiter==0.5.0
jsonschema==4.23.0
jsonschema-specifications==2023.12.1
markdown-it-py==3.0.0
MarkupSafe==2.1.5
mdurl==0.1.2
narwhals==1.8.3
numpy==1.26.4
openai==1.48.0
packaging==24.1
pandas==2.2.3
pillow==10.4.0
protobuf==5.28.2
pyarrow==17.0.0
pydantic==2.9.2
pydantic_core==2.23.4
pydeck==0.9.1
Pygments==2.18.0
python-dateutil==2.9.0.post0
python-dotenv==1.0.1
pytz==2024.2
referencing==0.35.1
requests==2.32.3
rich==13.8.1
rpds-py==0.20.0
six==1.16.0
smmap==5.0.1
sniffio==1.3.1
streamlit==1.38.0
tenacity==8.5.0
toml==0.10.2
tornado==6.4.1
tqdm==4.66.5
typing_extensions==4.12.2
tzdata==2024.2
urllib3==2.2.3
watchdog==4.0.2
python-dotenv==1.0.0

0 comments on commit 4e657c7

Please sign in to comment.