Files
scripts/kb-processor/src/main.py
T

103 lines
3.3 KiB
Python
Executable File

"""
Main - Script principal para processamento de documentos
Descomplicar - Agência de Aceleração Digital
https://www.descomplicar.pt
"""
import os
import argparse
from urllib.parse import urlparse
from datetime import datetime
from pathlib import Path
from processors.pdf_processor import PDFProcessor
from processors.txt_processor import TXTProcessor
from processors.web_processor import WebProcessor
from enrichment.faq_generator import FAQGenerator
from dotenv import load_dotenv
load_dotenv()
def is_url(string: str) -> bool:
"""
Verifica se uma string é uma URL válida.
Args:
string (str): String a verificar
Returns:
bool: True se for URL, False caso contrário
"""
try:
result = urlparse(string)
return all([result.scheme, result.netloc])
except ValueError:
return False
def process_document(input_path: str, output_file: str = None) -> None:
"""
Processa um documento e gera o output formatado.
Args:
input_path (str): Caminho do ficheiro ou URL de entrada
output_file (str): Caminho do ficheiro de saída (opcional)
"""
# Verificar se é URL ou ficheiro local
if is_url(input_path):
processor = WebProcessor(input_path)
else:
# Determinar tipo de ficheiro
file_ext = os.path.splitext(input_path)[1].lower()
# Selecionar processador apropriado
if file_ext == '.pdf':
processor = PDFProcessor(input_path)
elif file_ext in ['.txt', '.md']:
processor = TXTProcessor(input_path)
else:
raise ValueError(f"Tipo de ficheiro não suportado: {file_ext}")
try:
# Processar conteúdo
processor.process_content()
# Gerar FAQs para cada capítulo
faq_gen = FAQGenerator()
for chapter in processor.chapters:
faqs = faq_gen.generate_faqs(chapter['content'])
chapter['faqs'] = faqs
# Definir ficheiro de saída se não especificado
if not output_file:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
if is_url(input_path):
base_name = urlparse(input_path).netloc.replace('.', '_')
else:
base_name = os.path.splitext(os.path.basename(input_path))[0]
# Usar caminho absoluto
output_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "output")
output_file = os.path.join(output_dir, f"{base_name}_{timestamp}.md")
# Criar diretório de saída se não existir
os.makedirs(os.path.dirname(output_file), exist_ok=True)
# Salvar resultado
processor.save_markdown(output_file)
print(f"Documento processado com sucesso: {output_file}")
except Exception as e:
print(f"Erro ao processar documento: {str(e)}")
raise
def main():
"""Função principal."""
parser = argparse.ArgumentParser(description='Processador de documentos com geração de FAQs')
parser.add_argument('input', help='Ficheiro de entrada ou URL')
parser.add_argument('-o', '--output', help='Ficheiro de saída (opcional)')
args = parser.parse_args()
process_document(args.input, args.output)
if __name__ == "__main__":
main()