diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ea15b62 --- /dev/null +++ b/.env.example @@ -0,0 +1,9 @@ +# Chave da API do Google Gemini +GEMINI_API_KEY=sua_chave_aqui + +# URL do vídeo do YouTube +YOUTUBE_URL=https://www.youtube.com/watch?v=exemplo + +# Modelo do Gemini (opcional, padrão: gemini-1.5-pro-latest) +# Outras opções: gemini-1.5-pro-001, gemini-1.5-flash-latest, etc. +# GEMINI_MODEL=gemini-1.5-pro-latest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..daf1dd0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.env +*.log +.DS_Store diff --git a/README.md b/README.md index 32c453d..7b74c57 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,95 @@ -# ata -Gera atas do Comitê Executivo +# ATA - Análise de Vídeos com Gemini AI + +Sistema de perguntas e respostas sobre vídeos do YouTube usando a API do Google Gemini. + +## Descrição + +Este é um proof of concept (POC) que utiliza a API do Gemini 1.5 Pro Preview para fazer perguntas sobre vídeos do YouTube através de uma interface de linha de comando. + +## Requisitos + +- Node.js (versão 18 ou superior) +- Chave da API do Google Gemini +- Conexão com a internet + +## Instalação + +1. Clone o repositório: +```bash +git clone https://github.com/RBBNet/ata.git +cd ata +``` + +2. Instale as dependências: +```bash +npm install +``` + +3. Configure o arquivo `.env`: +```bash +cp .env.example .env +``` + +4. Edite o arquivo `.env` e adicione: + - Sua chave da API do Gemini em `GEMINI_API_KEY` + - A URL do vídeo do YouTube em `YOUTUBE_URL` + - (Opcional) O modelo do Gemini em `GEMINI_MODEL` (padrão: gemini-1.5-pro-latest) + +## Uso + +Execute o programa: +```bash +npm start +``` + +O sistema irá: +1. Carregar as configurações do arquivo `.env` +2. Exibir a URL do vídeo configurado +3. Solicitar que você digite uma pergunta sobre o vídeo +4. Enviar a pergunta para a API do Gemini +5. Exibir a resposta + +Para sair do programa, digite `sair` ou `exit`. + +## Exemplo + +``` +Sistema de Perguntas sobre Vídeos do YouTube com Gemini AI +============================================================ + +Vídeo configurado: https://www.youtube.com/watch?v=exemplo + +Digite sua pergunta sobre o vídeo (ou "sair" para encerrar) + +Sua pergunta: Qual é o tema principal do vídeo? + +Processando sua pergunta... + +------------------------------------------------------------ +Resposta: +------------------------------------------------------------ +[A resposta do Gemini será exibida aqui] +------------------------------------------------------------ +``` + +## Estrutura do Projeto + +``` +ata/ +├── index.js # Arquivo principal da aplicação +├── package.json # Configuração do projeto e dependências +├── .env.example # Exemplo de arquivo de configuração +├── .env # Arquivo de configuração (não versionado) +├── .gitignore # Arquivos ignorados pelo Git +└── README.md # Este arquivo +``` + +## Tecnologias Utilizadas + +- Node.js +- Google Generative AI SDK (@google/generative-ai) +- dotenv (para gerenciamento de variáveis de ambiente) + +## Licença + +ISC diff --git a/index.js b/index.js new file mode 100644 index 0000000..d85312e --- /dev/null +++ b/index.js @@ -0,0 +1,103 @@ +import { GoogleGenerativeAI } from '@google/generative-ai'; +import * as dotenv from 'dotenv'; +import * as readline from 'readline'; + +// Carrega variáveis de ambiente do arquivo .env +dotenv.config(); + +// Configuração +const GEMINI_API_KEY = process.env.GEMINI_API_KEY; +const YOUTUBE_URL = process.env.YOUTUBE_URL; +const GEMINI_MODEL = process.env.GEMINI_MODEL || 'gemini-1.5-pro-latest'; + +if (!GEMINI_API_KEY) { + console.error('Erro: GEMINI_API_KEY não está configurada no arquivo .env'); + console.error('Por favor, copie .env.example para .env e adicione sua chave da API'); + process.exit(1); +} + +if (!YOUTUBE_URL) { + console.error('Erro: YOUTUBE_URL não está configurada no arquivo .env'); + console.error('Por favor, copie .env.example para .env e adicione a URL do vídeo do YouTube'); + process.exit(1); +} + +// Inicializa o Gemini AI +const genAI = new GoogleGenerativeAI(GEMINI_API_KEY); + +// Interface para ler entrada do usuário +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +/** + * Faz uma pergunta sobre o vídeo do YouTube usando Gemini + */ +async function askAboutVideo(question) { + try { + // Usa o modelo Gemini 1.5 Pro que suporta vídeos do YouTube + // Por padrão usa 'latest' para obter recursos mais recentes (configurável via GEMINI_MODEL) + const model = genAI.getGenerativeModel({ model: GEMINI_MODEL }); + + // Cria o prompt com o vídeo do YouTube e a pergunta + const prompt = `Analise este vídeo do YouTube: ${YOUTUBE_URL}\n\nPergunta: ${question}`; + + console.log('\nProcessando sua pergunta...\n'); + + // Gera a resposta + const result = await model.generateContent(prompt); + const response = await result.response; + const text = response.text(); + + return text; + } catch (error) { + console.error('Erro ao processar a pergunta:', error.message); + throw error; + } +} + +/** + * Loop principal do programa + */ +async function main() { + console.log('='.repeat(60)); + console.log('Sistema de Perguntas sobre Vídeos do YouTube com Gemini AI'); + console.log('='.repeat(60)); + console.log(`\nVídeo configurado: ${YOUTUBE_URL}`); + console.log('\nDigite sua pergunta sobre o vídeo (ou "sair" para encerrar)\n'); + + const askQuestion = () => { + rl.question('Sua pergunta: ', async (question) => { + if (question.toLowerCase() === 'sair' || question.toLowerCase() === 'exit') { + console.log('\nEncerrando o programa. Até logo!\n'); + rl.close(); + return; + } + + if (!question.trim()) { + console.log('Por favor, digite uma pergunta válida.\n'); + askQuestion(); + return; + } + + try { + const answer = await askAboutVideo(question); + console.log('\n' + '-'.repeat(60)); + console.log('Resposta:'); + console.log('-'.repeat(60)); + console.log(answer); + console.log('-'.repeat(60) + '\n'); + } catch (error) { + console.error('\nNão foi possível obter uma resposta. Tente novamente.\n'); + } + + askQuestion(); + }); + }; + + askQuestion(); +} + +// Executa o programa principal +main().catch(console.error); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..56d77c7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,38 @@ +{ + "name": "ata", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ata", + "version": "0.1.0", + "license": "ISC", + "dependencies": { + "@google/generative-ai": "^0.1.3", + "dotenv": "^16.3.1" + } + }, + "node_modules/@google/generative-ai": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.1.3.tgz", + "integrity": "sha512-Cm4uJX1sKarpm1mje/MiOIinM7zdUUrQp/5/qGPAgznbdd/B9zup5ehT6c1qGqycFcSopTA1J1HpqHS5kJR8hQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..102b0ab --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "ata", + "version": "0.1.0", + "description": "Gera atas do Comitê Executivo usando Gemini API", + "main": "index.js", + "type": "module", + "scripts": { + "start": "node index.js" + }, + "keywords": ["gemini", "youtube", "ai", "ata"], + "author": "", + "license": "ISC", + "dependencies": { + "@google/generative-ai": "^0.1.3", + "dotenv": "^16.3.1" + } +}