GalvaoFilho commited on
Commit
47cb94a
·
verified ·
1 Parent(s): 163f1df

Upload 3 files

Browse files
Files changed (3) hide show
  1. app.py +204 -64
  2. requirements.txt +9 -1
  3. youtube.py +61 -0
app.py CHANGED
@@ -1,64 +1,204 @@
1
- import gradio as gr
2
- from huggingface_hub import InferenceClient
3
-
4
- """
5
- For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference
6
- """
7
- client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
8
-
9
-
10
- def respond(
11
- message,
12
- history: list[tuple[str, str]],
13
- system_message,
14
- max_tokens,
15
- temperature,
16
- top_p,
17
- ):
18
- messages = [{"role": "system", "content": system_message}]
19
-
20
- for val in history:
21
- if val[0]:
22
- messages.append({"role": "user", "content": val[0]})
23
- if val[1]:
24
- messages.append({"role": "assistant", "content": val[1]})
25
-
26
- messages.append({"role": "user", "content": message})
27
-
28
- response = ""
29
-
30
- for message in client.chat_completion(
31
- messages,
32
- max_tokens=max_tokens,
33
- stream=True,
34
- temperature=temperature,
35
- top_p=top_p,
36
- ):
37
- token = message.choices[0].delta.content
38
-
39
- response += token
40
- yield response
41
-
42
-
43
- """
44
- For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
45
- """
46
- demo = gr.ChatInterface(
47
- respond,
48
- additional_inputs=[
49
- gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
50
- gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
51
- gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
52
- gr.Slider(
53
- minimum=0.1,
54
- maximum=1.0,
55
- value=0.95,
56
- step=0.05,
57
- label="Top-p (nucleus sampling)",
58
- ),
59
- ],
60
- )
61
-
62
-
63
- if __name__ == "__main__":
64
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ from crewai import Task, Agent, LLM
4
+ from youtube import pesquisar_videos_youtube
5
+ import time # Para simular a progressão
6
+
7
+ GROQ_API_KEY_01 = os.getenv("GROQ_API_KEY_01")
8
+ groqllm = LLM(
9
+ model="groq/llama-3.3-70b-versatile",
10
+ api_key=GROQ_API_KEY_01
11
+ )
12
+ GROQ_API_KEY_02 = os.getenv("GROQ_API_KEY_02")
13
+ groqllm2 = LLM(
14
+ model="groq/llama-3.3-70b-versatile",
15
+ api_key=GROQ_API_KEY_02
16
+ )
17
+
18
+ def processar_topicos(topicos_str):
19
+ """ Converte uma string de tópicos separada por vírgulas em uma lista tratada. """
20
+ return [t.strip() for t in topicos_str.split(',') if t.strip()]
21
+
22
+ def executar_equipe_interface(disciplina, assunto, topicos_str, horas, dias):
23
+
24
+ topicos = processar_topicos(topicos_str)
25
+
26
+ solicitacao = f"Disciplina: {disciplina}\nAssunto: {assunto}\nTópicos: {topicos}\n"
27
+
28
+ yield "Buscando vídeos no YouTube...", gr.update(value=10)
29
+ entradaYoutube = pesquisar_videos_youtube(solicitacao)
30
+
31
+ # Motivação
32
+ yield "Criando mensagem motivacional...", gr.update(value=30)
33
+ agentMotivador = Agent(
34
+ role='Motivador',
35
+ goal='Escrever uma mensagem motivacional para o estudante.',
36
+ backstory='Você é um coach motivacional com experiência em ajudar estudantes a manterem o foco.',
37
+ llm=groqllm,
38
+ verbose=True
39
+ )
40
+ taskMotivador = Task(
41
+ description = (
42
+ "Escreva uma mensagem motivacional para o estudante, formatada em Markdown.\n\n"
43
+ "A mensagem deve conter:\n"
44
+ "## Mensagem Motivacional 🎯\n\n"
45
+ "- Um parágrafo inicial incentivando o estudante a seguir seus estudos.\n"
46
+ "- Frases inspiradoras para manter o foco e a disciplina.\n"
47
+ "- Um fechamento encorajador, reforçando a importância do esforço e da dedicação.\n\n"
48
+ "O texto deve ser positivo, motivador e adequado para estudantes de ensino médio."
49
+ ),
50
+ agent=agentMotivador,
51
+ expected_output='Mensagem motivacional em markdown.'
52
+ )
53
+ saidaMotivador = agentMotivador.execute_task(taskMotivador)
54
+
55
+ # Guia de Estudos
56
+ yield "Gerando guia de estudos...", gr.update(value=50)
57
+ agentGuia = Agent(
58
+ role="Especialista em Guia de Estudos",
59
+ goal="Criar um guia de estudos estruturado, explicativo e didático sobre um determinado assunto.",
60
+ backstory="Você é um especialista em educação, com experiência na criação de guias de estudo detalhados.",
61
+ llm=groqllm,
62
+ verbose=True
63
+ )
64
+ taskGuia = Task(
65
+ description = (
66
+ f"Crie um Guia de Estudos para {disciplina}, abordando {assunto} e os tópicos {topicos}. "
67
+ "O guia deve seguir a seguinte estrutura e formatação:\n\n"
68
+ "## Guia de Estudos: {disciplina}\n\n"
69
+ "### Introdução\n"
70
+ "- Texto introdutório justificado sobre o tema, destacando sua importância e contexto.\n\n"
71
+ "### Conceitos Fundamentais\n"
72
+ "- Explicação detalhada dos principais conceitos abordados, com exemplos práticos.\n"
73
+ "- Utilize listas desordenadas para estruturar os conceitos.\n\n"
74
+ "### Aplicações Práticas\n"
75
+ "- Explique como o tema se aplica no mundo real.\n"
76
+ "- Utilize exemplos concretos e listas para organizar as aplicações.\n\n"
77
+ "### Técnicas de Aprendizado e Dificuldades Comuns\n"
78
+ "- Apresente métodos eficazes para aprender o tema.\n"
79
+ "- Liste dificuldades comuns dos alunos e estratégias para superá-las.\n\n"
80
+ "### Indicação de Materiais Gratuitos\n"
81
+ "- Forneça sugestões de livros, vídeos e artigos gratuitos sobre o tema.\n"
82
+ "- Apresente os materiais em formato de lista com títulos e links quando possível.\n\n"
83
+ "O conteúdo deve ser didático, acessível para alunos do ensino médio e utilizar texto justificado sempre que possível."
84
+ ),
85
+ agent=agentGuia,
86
+ expected_output='Guia de estudos em markdown'
87
+ )
88
+ saidaGuia = agentGuia.execute_task(taskGuia)
89
+
90
+ # Plano de Estudos
91
+ yield "Criando plano de estudos...", gr.update(value=70)
92
+ agentPlano = Agent(
93
+ role="Especialista em Plano de Estudos",
94
+ goal="Criar um plano de estudos eficiente para que o aluno aprenda de maneira organizada.",
95
+ backstory="Você é um planejador educacional especialista em cronogramas de estudo eficientes.",
96
+ llm=groqllm2,
97
+ verbose=True
98
+ )
99
+ taskPlano = Task(
100
+ description = (
101
+ f"Crie um Plano de Estudos para {disciplina}, cobrindo {assunto} e os tópicos {topicos}. "
102
+ f"O aluno tem {horas} horas por dia e {dias} dias para estudar.\n\n"
103
+ "O plano deve seguir esta estrutura e formatação:\n\n"
104
+ "## Plano de Estudos: {disciplina}\n\n"
105
+ "### Introdução\n"
106
+ "- Apresentação do objetivo do plano de estudos.\n"
107
+ "- Importância da organização para otimizar o aprendizado.\n\n"
108
+ "### Distribuição Equilibrada dos Tópicos\n"
109
+ "- Divisão dos conteúdos de forma proporcional ao tempo disponível.\n"
110
+ "- Sugerir uma agenda diária/semanal equilibrada.\n\n"
111
+ "### Técnicas Ativas de Aprendizado\n"
112
+ "- Explicação de estratégias eficazes para o estudo, incluindo:\n"
113
+ " - Resumos\n"
114
+ " - Flashcards\n"
115
+ " - Mapas mentais\n"
116
+ " - Resolução de exercícios\n\n"
117
+ "### Revisões Programadas\n"
118
+ "- Definir períodos estratégicos para revisão de conteúdos.\n"
119
+ "- Sugestão de técnicas como repetição espaçada e autoavaliação.\n\n"
120
+ "### Monitoramento do Progresso\n"
121
+ "- Métodos para acompanhar a evolução do estudo.\n"
122
+ "- Uso de checklists ou aplicativos para organização.\n\n"
123
+ "### Sugestões para Pausas e Evitar Sobrecarga Mental\n"
124
+ "- Importância das pausas regulares para manter a produtividade.\n"
125
+ "- Sugestão de técnicas como a Técnica Pomodoro.\n"
126
+ "- Dicas para manter o bem-estar mental durante os estudos.\n\n"
127
+ "O plano deve ser didático, bem estruturado e adaptável para alunos do ensino médio."
128
+ ),
129
+ agent=agentPlano,
130
+ expected_output='Plano de estudos estruturado em markdown'
131
+ )
132
+ saidaPlano = agentPlano.execute_task(taskPlano)
133
+
134
+ # Curadoria de Vídeos
135
+ yield "Organizando vídeos do YouTube...", gr.update(value=90)
136
+ agentYoutube = Agent(
137
+ role='Especialista em Curadoria de Vídeos Educacionais',
138
+ goal='Organizar e formatar vídeos educacionais encontrados no YouTube para aprendizado eficiente.',
139
+ backstory='Você é um especialista em curadoria de materiais educacionais, com experiência na seleção de vídeos para ensino.',
140
+ llm=groqllm2,
141
+ verbose=True
142
+ )
143
+ taskYoutube = Task(
144
+ description = (
145
+ f"Lista do Youtube: {entradaYoutube} "
146
+ "Você receberá uma lista de vídeos extraída da API do YouTube. Sua tarefa é classificar e organizar os vídeos "
147
+ "por categorias, formatando-os em Markdown. As categorias devem ser baseadas no título do vídeo.\n\n"
148
+ f"## Vídeos sobre {assunto}\n\n"
149
+ "### Formato de saída\n"
150
+ "- Para cada vídeo, a saída deve seguir o formato abaixo:\n"
151
+ " **[Título](URL)**\n\n _Descrição_\n\n"
152
+ "- Se um vídeo não tiver descrição, substituir por '(Sem descrição disponível)'.\n"
153
+ "- Se houver mais de um vídeo, repetir a estrutura para cada um.\n"
154
+ "- Certifique-se de que a formatação Markdown esteja correta e bem organizada."
155
+ ),
156
+ agent=agentYoutube,
157
+ expected_output="Lista de vídeos organizados em Markdown."
158
+ )
159
+ saidaYoutube = agentYoutube.execute_task(taskYoutube)
160
+
161
+ yield "Processo concluído!", gr.update(value=100)
162
+
163
+ saidaCompleta = f"""
164
+ # 🎯 Motivação
165
+ {saidaMotivador}
166
+
167
+ ---
168
+
169
+ # 📖 Guia de Estudos
170
+ {saidaGuia}
171
+
172
+ ---
173
+
174
+ # 📅 Plano de Estudos
175
+ {saidaPlano}
176
+
177
+ ---
178
+
179
+ # 🎥 Vídeos Educacionais
180
+ {saidaYoutube}
181
+ """
182
+
183
+ yield saidaCompleta, gr.update(value=100)
184
+
185
+ # Interface Gradio
186
+ with gr.Blocks() as demo:
187
+ gr.Markdown("# 📚 Gerador de Material de Estudos")
188
+ with gr.Row():
189
+ with gr.Column():
190
+ disciplina = gr.Textbox(label="Disciplina", value="Matemática")
191
+ assunto = gr.Textbox(label="Assunto", value="Funções")
192
+ topicos_str = gr.Textbox(label="Tópicos", value="Função quadrática, Função exponencial, Função logarítmica")
193
+ horas = gr.Textbox(label="Tempo diário", value="2 horas")
194
+ dias = gr.Textbox(label="Quantos dias", value="5 dias")
195
+ gerar_button = gr.Button("Gerar Material")
196
+ progress = gr.Slider(minimum=0, maximum=100, step=1, value=0, label="Progresso", interactive=False)
197
+ with gr.Column():
198
+ resultado = gr.Markdown(label="Material Completo (Markdown)")
199
+
200
+ gerar_button.click(fn=executar_equipe_interface,
201
+ inputs=[disciplina, assunto, topicos_str, horas, dias],
202
+ outputs=[resultado, progress])
203
+
204
+ demo.launch()
requirements.txt CHANGED
@@ -1 +1,9 @@
1
- huggingface_hub==0.25.2
 
 
 
 
 
 
 
 
 
1
+ crewai
2
+ crewai-tools
3
+ openai
4
+ groq
5
+ python-dotenv
6
+ markdown
7
+ groq
8
+ google-api-python-client
9
+ fpdf
youtube.py ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from googleapiclient.discovery import build
3
+
4
+ # Obter a chave da API
5
+ YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY")
6
+ if not YOUTUBE_API_KEY:
7
+ raise ValueError("A chave da API do YouTube não foi encontrada nas variáveis de ambiente.")
8
+
9
+ # Inicializar o cliente YouTube
10
+ def get_youtube_client(chave_api):
11
+ return build("youtube", "v3", developerKey=chave_api)
12
+
13
+ youtube_client = get_youtube_client(YOUTUBE_API_KEY)
14
+
15
+ def pesquisar_videos_youtube(consulta, num_resultados=5):
16
+ """
17
+ Pesquisa vídeos no YouTube e retorna os resultados, excluindo Shorts.
18
+
19
+ Args:
20
+ consulta (str): A consulta de pesquisa.
21
+ num_resultados (int, opcional): Número máximo de vídeos. Padrão: 5.
22
+
23
+ Returns:
24
+ list: Lista de dicionários contendo título, descrição, URL e canal.
25
+ """
26
+ try:
27
+ requisicao = youtube_client.search().list(
28
+ part="snippet",
29
+ maxResults=num_resultados * 2, # Solicita mais para compensar filtros
30
+ q=consulta,
31
+ type="video",
32
+ videoDuration="medium", # Filtra vídeos com pelo menos 4 minutos
33
+ order="relevance"
34
+ )
35
+ resposta = requisicao.execute()
36
+ except Exception as e:
37
+ print(f"Erro ao buscar vídeos no YouTube: {e}")
38
+ return []
39
+
40
+ videos = []
41
+ for item in resposta.get("items", []):
42
+ if item["id"]["kind"] == "youtube#video":
43
+ titulo = item["snippet"]["title"]
44
+ descricao = item["snippet"]["description"]
45
+ url = f"https://www.youtube.com/watch?v={item['id']['videoId']}"
46
+ canal = item["snippet"]["channelTitle"]
47
+
48
+ # Remover Shorts pelo título e descrição
49
+ if "Shorts" not in titulo and "Shorts" not in descricao:
50
+ videos.append({
51
+ "Título": titulo,
52
+ "Descrição": descricao,
53
+ "URL": url,
54
+ "Canal": canal
55
+ })
56
+
57
+ # Para evitar retornar menos vídeos do que o necessário
58
+ if len(videos) >= num_resultados:
59
+ break
60
+
61
+ return videos