Spaces:
Sleeping
Sleeping
| import os | |
| import gradio as gr | |
| from crewai import Task, Agent, LLM | |
| from googleapiclient.discovery import build | |
| ######### YOUTUBE INICIO ######### | |
| YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY") | |
| if not YOUTUBE_API_KEY: | |
| raise ValueError("A chave da API do YouTube não foi encontrada nas variáveis de ambiente.") | |
| def get_youtube_client(chave_api): | |
| return build("youtube", "v3", developerKey=chave_api) | |
| youtube_client = get_youtube_client(YOUTUBE_API_KEY) | |
| def pesquisar_videos_youtube(consulta, num_resultados=5): | |
| """ | |
| Pesquisa vídeos no YouTube e retorna os resultados, excluindo Shorts. | |
| Args: | |
| consulta (str): A consulta de pesquisa. | |
| num_resultados (int, opcional): Número máximo de vídeos. Padrão: 5. | |
| Returns: | |
| list: Lista de dicionários contendo título, descrição, URL e canal. | |
| """ | |
| try: | |
| requisicao = youtube_client.search().list( | |
| part="snippet", | |
| maxResults=num_resultados * 2, # Solicita mais para compensar filtros | |
| q=consulta, | |
| type="video", | |
| videoDuration="medium", # Filtra vídeos com pelo menos 4 minutos | |
| order="relevance" | |
| ) | |
| resposta = requisicao.execute() | |
| except Exception as e: | |
| print(f"Erro ao buscar vídeos no YouTube: {e}") | |
| return [] | |
| videos = [] | |
| for item in resposta.get("items", []): | |
| if item["id"]["kind"] == "youtube#video": | |
| titulo = item["snippet"]["title"] | |
| descricao = item["snippet"]["description"] | |
| url = f"https://www.youtube.com/watch?v={item['id']['videoId']}" | |
| canal = item["snippet"]["channelTitle"] | |
| # Remover Shorts pelo título e descrição | |
| if "Shorts" not in titulo and "Shorts" not in descricao: | |
| videos.append({ | |
| "Título": titulo, | |
| "Descrição": descricao, | |
| "URL": url, | |
| "Canal": canal | |
| }) | |
| # Para evitar retornar menos vídeos do que o necessário | |
| if len(videos) >= num_resultados: | |
| break | |
| return videos | |
| ######### YOUTUBE FIM ######### | |
| ######### CREWAAI INICIO ######### | |
| deepseek_api_key = os.getenv("DEEPSEEK_API_KEY") | |
| modelo = LLM(model="deepseek/deepseek-chat", | |
| verbose=False, | |
| api_key=deepseek_api_key, | |
| base_url="https://api.deepseek.com/", | |
| stream=False, | |
| temperature=1.3) | |
| def processar_topicos(topicos_str): | |
| """ Converte uma string de tópicos separada por vírgulas em uma lista tratada. """ | |
| return [t.strip() for t in topicos_str.split(',') if t.strip()] | |
| def executar_equipe_interface(disciplina, assunto, topicos_str, horas, dias): | |
| topicos = processar_topicos(topicos_str) | |
| solicitacao = f"Disciplina: {disciplina}\nAssunto: {assunto}\nTópicos: {topicos}\n" | |
| entradaYoutube = pesquisar_videos_youtube(solicitacao) | |
| agentMotivador = Agent( | |
| role='Motivador', | |
| goal='Escrever uma mensagem motivacional para o estudante.', | |
| backstory='Você é um coach motivacional com experiência em ajudar estudantes a manterem o foco.', | |
| llm=modelo, | |
| verbose=False | |
| ) | |
| taskMotivador = Task( | |
| description = ( | |
| "Escreva uma mensagem motivacional para o estudante, formatada em Markdown.\n\n" | |
| "A mensagem deve conter:\n" | |
| "## Mensagem Motivacional 🎯\n\n" | |
| "- Um parágrafo inicial incentivando o estudante a seguir seus estudos.\n" | |
| "- Frases inspiradoras para manter o foco e a disciplina.\n" | |
| "- Um fechamento encorajador, reforçando a importância do esforço e da dedicação.\n\n" | |
| "O texto deve ser positivo, motivador e adequado para estudantes de ensino médio." | |
| ), | |
| agent=agentMotivador, | |
| expected_output='Mensagem motivacional em markdown.' | |
| ) | |
| saidaMotivador = agentMotivador.execute_task(taskMotivador) | |
| agentGuia = Agent( | |
| role="Especialista em Guia de Estudos", | |
| goal="Criar um guia de estudos estruturado, explicativo e didático sobre um determinado assunto.", | |
| backstory="Você é um especialista em educação, com experiência na criação de guias de estudo detalhados.", | |
| llm=modelo, | |
| verbose=False | |
| ) | |
| taskGuia = Task( | |
| description = ( | |
| f"Crie um Guia de Estudos para {disciplina}, abordando {assunto} e os tópicos {topicos}. " | |
| "O guia deve seguir a seguinte estrutura e formatação:\n\n" | |
| "## Guia de Estudos: {disciplina}\n\n" | |
| "### Introdução\n" | |
| "- Texto introdutório justificado sobre o tema, destacando sua importância e contexto.\n\n" | |
| "### Conceitos Fundamentais\n" | |
| "- Explicação detalhada dos principais conceitos abordados, com exemplos práticos.\n" | |
| "- Utilize listas desordenadas para estruturar os conceitos.\n\n" | |
| "### Aplicações Práticas\n" | |
| "- Explique como o tema se aplica no mundo real.\n" | |
| "- Utilize exemplos concretos e listas para organizar as aplicações.\n\n" | |
| "### Técnicas de Aprendizado e Dificuldades Comuns\n" | |
| "- Apresente métodos eficazes para aprender o tema.\n" | |
| "- Liste dificuldades comuns dos alunos e estratégias para superá-las.\n\n" | |
| "### Indicação de Materiais Gratuitos\n" | |
| "- Forneça sugestões de livros, vídeos e artigos gratuitos sobre o tema.\n" | |
| "- Apresente os materiais em formato de lista com títulos e links quando possível.\n\n" | |
| "O conteúdo deve ser didático, acessível para alunos do ensino médio e utilizar texto justificado sempre que possível." | |
| ), | |
| agent=agentGuia, | |
| expected_output='Guia de estudos em markdown' | |
| ) | |
| saidaGuia = agentGuia.execute_task(taskGuia) | |
| agentPlano = Agent( | |
| role="Especialista em Plano de Estudos", | |
| goal="Criar um plano de estudos eficiente para que o aluno aprenda de maneira organizada.", | |
| backstory="Você é um planejador educacional especialista em cronogramas de estudo eficientes.", | |
| llm=modelo, | |
| verbose=False | |
| ) | |
| taskPlano = Task( | |
| description = ( | |
| f"Crie um Plano de Estudos para {disciplina}, cobrindo {assunto} e os tópicos {topicos}. " | |
| f"O aluno tem {horas} horas por dia e {dias} dias para estudar.\n\n" | |
| "O plano deve seguir esta estrutura e formatação:\n\n" | |
| "## Plano de Estudos: {disciplina}\n\n" | |
| "### Introdução\n" | |
| "- Apresentação do objetivo do plano de estudos.\n" | |
| "- Importância da organização para otimizar o aprendizado.\n\n" | |
| "### Distribuição Equilibrada dos Tópicos\n" | |
| "- Divisão dos conteúdos de forma proporcional ao tempo disponível.\n" | |
| "- Sugerir uma agenda diária/semanal equilibrada.\n\n" | |
| "### Técnicas Ativas de Aprendizado\n" | |
| "- Explicação de estratégias eficazes para o estudo, incluindo:\n" | |
| " - Resumos\n" | |
| " - Flashcards\n" | |
| " - Mapas mentais\n" | |
| " - Resolução de exercícios\n\n" | |
| "### Revisões Programadas\n" | |
| "- Definir períodos estratégicos para revisão de conteúdos.\n" | |
| "- Sugestão de técnicas como repetição espaçada e autoavaliação.\n\n" | |
| "### Monitoramento do Progresso\n" | |
| "- Métodos para acompanhar a evolução do estudo.\n" | |
| "- Uso de checklists ou aplicativos para organização.\n\n" | |
| "### Sugestões para Pausas e Evitar Sobrecarga Mental\n" | |
| "- Importância das pausas regulares para manter a produtividade.\n" | |
| "- Sugestão de técnicas como a Técnica Pomodoro.\n" | |
| "- Dicas para manter o bem-estar mental durante os estudos.\n\n" | |
| "O plano deve ser didático, bem estruturado e adaptável para alunos do ensino médio." | |
| ), | |
| agent=agentPlano, | |
| expected_output='Plano de estudos estruturado em markdown' | |
| ) | |
| saidaPlano = agentPlano.execute_task(taskPlano) | |
| agentYoutube = Agent( | |
| role='Especialista em Curadoria de Vídeos Educacionais', | |
| goal='Organizar e formatar vídeos educacionais encontrados no YouTube para aprendizado eficiente.', | |
| backstory='Você é um especialista em curadoria de materiais educacionais, com experiência na seleção de vídeos para ensino.', | |
| llm=modelo, | |
| verbose=False | |
| ) | |
| taskYoutube = Task( | |
| description = ( | |
| f"Lista do Youtube: {entradaYoutube} " | |
| "Você receberá uma lista de vídeos extraída da API do YouTube. Sua tarefa é classificar e organizar os vídeos " | |
| "por categorias, formatando-os em Markdown. As categorias devem ser baseadas no título do vídeo.\n\n" | |
| f"## Vídeos sobre {assunto}\n\n" | |
| "### Formato de saída\n" | |
| "- Para cada vídeo, a saída deve seguir o formato abaixo:\n" | |
| " **[Título](URL)**\n\n _Descrição_\n\n" | |
| "- Se um vídeo não tiver descrição, substituir por '(Sem descrição disponível)'.\n" | |
| "- Se houver mais de um vídeo, repetir a estrutura para cada um.\n" | |
| "- Certifique-se de que a formatação Markdown esteja correta e bem organizada." | |
| "Caso um dos videos seja esse: https://www.youtube.com/watch?v=dQw4w9WgXcQ" | |
| "a saida deverá ser:" | |
| "##Não foram encontrados vídeos sobre o assunto" | |
| ), | |
| agent=agentYoutube, | |
| expected_output="Lista de vídeos organizados em Markdown." | |
| ) | |
| saidaYoutube = agentYoutube.execute_task(taskYoutube) | |
| saidaCompleta = """ | |
| # Material de estudo | |
| ## 🎯 Motivação | |
| {} | |
| --- | |
| ## 📖 Guia de Estudos | |
| {} | |
| --- | |
| ## 📅 Plano de Estudos | |
| {} | |
| --- | |
| ## 🎥 Vídeos Educacionais | |
| {} | |
| """.format(saidaMotivador, saidaGuia, saidaPlano, saidaYoutube) | |
| return saidaCompleta | |
| ######### CREWAAI FIM ######### | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# 📚 Gerador de Material de Estudos") | |
| gr.Markdown("## Pequeno ajuste no original do [Kleber Galvão](https://huggingface.co/spaces/GalvaoFilho/KMData) ") | |
| with gr.Row(): | |
| with gr.Column(): | |
| disciplina = gr.Textbox(label="Disciplina", value="Matemática") | |
| assunto = gr.Textbox(label="Assunto", value="Funções") | |
| topicos_str = gr.Textbox(label="Tópicos", value="Função quadrática, Função exponencial, Função logarítmica") | |
| horas = gr.Textbox(label="Tempo diário", value="2 horas") | |
| dias = gr.Textbox(label="Quantos dias", value="5 dias") | |
| gerar_button = gr.Button("Gerar Material") | |
| with gr.Column(): | |
| resultado = gr.Markdown(label="Material Completo (Markdown)") | |
| gerar_button.click(fn=executar_equipe_interface, | |
| inputs=[disciplina, assunto, topicos_str, horas, dias], | |
| outputs=[resultado]) | |
| demo.launch() | |