From ad4b73b668ace8fd3f2173cd8def788566b92ec8 Mon Sep 17 00:00:00 2001 From: marco Date: Sun, 16 Aug 2026 20:09:57 -0300 Subject: [PATCH] feat(telegram): add automated AI insight delivery system Implements ThorAgentIA bot that generates and sends scheduled insights via Telegram using configurable AI providers. Includes environment configuration, scheduling, and setup automation. --- .env | 39 +++++++++++++ .gitignore | 27 +++++++++ README.md | 117 +++++++++++++++++++++++++++++++++++++ RULES.md | 51 ++++++++++++++++ iniciar.sh | 50 ++++++++++++++++ main.py | 149 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 4 ++ 7 files changed, 437 insertions(+) create mode 100644 .env create mode 100644 .gitignore create mode 100644 README.md create mode 100644 RULES.md create mode 100755 iniciar.sh create mode 100644 main.py create mode 100644 requirements.txt diff --git a/.env b/.env new file mode 100644 index 0000000..a7cda8b --- /dev/null +++ b/.env @@ -0,0 +1,39 @@ +# Configurações do ThorAgentIA + +# Configuração de horário de funcionamento (hora local) +START_HOUR=7 +END_HOUR=22 +DAYS_OF_WEEK=1,2,3,4,5,6,7 + +# Intervalo em minutos para gerar e enviar insights +INTERVAL_MINUTES=3 + +# Assuntos (20 assuntos separados por vírgula) +TOPICS=Marketing,Negócios,Pensamentos de Empresários Famosos,Lei da Atração,Lei do Triunfo,Administração de Pequenos Negócios,CRM,Vendas,Compras para Empresas,Planejamento Estratégico Empresarial,Recursos Humanos,A Arte de Fazer Amigos,Inteligência Emocional,Produtividade,Liderança,Inovação,Experiência do Cliente,Networking,Marca Pessoal,Storytelling + +# Modelo de IA padrão (opcional, se não usar provedores abaixo) +# DEFAULT_AI_MODEL=gpt-4o-mini +# OPENAI_API_KEY=sua_api_key_openai_aqui + +# Provedor OpenRouter +OPENROUTER_API_KEY=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 +OPENROUTER_MODEL=poolside/laguna-xs-2.1:free + +# Provedor StepFun +STEPFUN_BASE_URL=https://api.stepfun.ai/step_plan/v1/ +STEPFUN_API_KEY=4RJZ4kHTbMNqWNn7IgahHF1kzcTi8zzUMv7YLQqjChCH5DftV2bSbGif1HllC44nv +STEPFUN_MODEL=step-3.7-flash + +# Provedor LlamaCPP local +LLAMACPP_BASE_URL=http://localhost:8080/v1/ +LLAMACPP_API_KEY=not-needed +LLAMACPP_MODEL=qwen2.5-coder-3b-instruct-q4_k_m.gguf + +# Configuração do Telegram +TELEGRAM_BOT_TOKEN=8638829617:AAEXTF0a7g66XRPcUb9gvw8t2StUPstX6VI +TELEGRAM_CHAT_ID=7889499475 + +# Idioma +LANGUAGE=pt-BR +MIN_LINES=20 + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a14da19 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Ignore Python artifacts +venv/ +__pycache__/ +*.pyc +*.pyo +*.pyd +.Python +*.so +*.egg +*.egg-info/ +dist/ +build/ + +# IDE / Editor +.vscode/ +.idea/ +*.swp +*.swo + +# Environment +.env.local +.env.*.local + +# OS +.DS_Store +Thumbs.db +*.log diff --git a/README.md b/README.md new file mode 100644 index 0000000..d8bcbf9 --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +# ThorAgentIA + +Sistema automatizado de envio de insights via Telegram, utilizando inteligência artificial para gerar conteúdo sobre diversos temas relevantes para negócios, marketing, desenvolvimento pessoal e gestão empresarial. + +## Funcionalidades + +- Gera insights profundos em português brasileiro sobre temas pré-definidos. +- Envia automaticamente os insights para um chat do Telegram. +- Opera em horários configuráveis (padrão: 07:00 às 22:00). +- Funciona de segunda a domingo (dias configuráveis). +- Intervalo entre envios configurável. +- Seleção aleatória de tópicos cadastrados. +- Suporte a múltiplos provedores de IA: OpenAI, OpenRouter, StepFun ou LlamaCPP local. + +## Pré-requisitos + +- Python 3.10 ou superior +- Chave de API de IA: OpenAI, OpenRouter, StepFun ou LlamaCPP local +- Bot criado no Telegram via BotFather +- Sistema Linux (Debian 12 recomendado) + +## Configuração + +1. **Configure o arquivo `.env`** com seus dados: + +```env +TELEGRAM_BOT_TOKEN=seu_token_bot_telegram +TELEGRAM_CHAT_ID=seu_chat_id +INTERVAL_MINUTES=60 +START_HOUR=7 +END_HOUR=22 +TOPICS=Marketing,Negócios,Lei da Atração,... + +# Provedor preferencial: OpenRouter +OPENROUTER_API_KEY=sua_chave_openrouter +OPENROUTER_MODEL=inclusionai/ling-3.0-tiny:free + +# Alternativa: StepFun +STEPFUN_BASE_URL=https://api.stepfun.ai/step_plan/v1/ +STEPFUN_API_KEY=sua_chave_stepfun +STEPFUN_MODEL=step-3.7-flash + +# Alternativa: LlamaCPP local +LLAMACPP_BASE_URL=http://localhost:8080/v1/ +LLAMACPP_API_KEY=not-needed +LLAMACPP_MODEL=qwen2.5-coder-3b-instruct-q4_k_m.gguf +``` + +2. **Crie um bot no Telegram** via @BotFather e obtenha o token. + +3. **Obtenha seu chat ID** enviando uma mensagem para o bot e consultando a API do Telegram ou usando um bot como @myidbot. + +## Instalação + +```bash +chmod +x iniciar.sh +./iniciar.sh +``` + +O script irá: +- Criar o ambiente virtual Python +- Instalar todas as dependências +- Preparar o sistema para execução + +## Execução + +```bash +source venv/bin/activate +python3 main.py +``` + +Para rodar como serviço em background no Linux, utilize `systemd` ou `screen`/`tmux`. + +## Variáveis de Ambiente + +| Variável | Descrição | Padrão | +|---|---|---| +| `OPENAI_API_KEY` | Chave da API da OpenAI | opcional | +| `OPENROUTER_API_KEY` | Chave da API OpenRouter | opcional | +| `OPENROUTER_MODEL` | Modelo no OpenRouter | inclusionai/ling-3.0-tiny:free | +| `STEPFUN_BASE_URL` | URL base StepFun | https://api.stepfun.ai/step_plan/v1/ | +| `STEPFUN_API_KEY` | Chave StepFun | opcional | +| `STEPFUN_MODEL` | Modelo StepFun | step-3.7-flash | +| `LLAMACPP_BASE_URL` | URL base LlamaCPP | http://localhost:8080/v1/ | +| `LLAMACPP_API_KEY` | Chave LlamaCPP | not-needed | +| `LLAMACPP_MODEL` | Modelo LlamaCPP | qwen2.5-coder-3b-instruct-q4_k_m.gguf | +| `DEFAULT_AI_MODEL` | Modelo usado quando houver apenas OpenAI | gpt-4o-mini | +| `TELEGRAM_BOT_TOKEN` | Token do bot Telegram | obrigatório | +| `TELEGRAM_CHAT_ID` | ID do chat Telegram | obrigatório | +| `INTERVAL_MINUTES` | Intervalo entre envios (minutos) | 60 | +| `START_HOUR` | Hora inicial de funcionamento | 7 | +| `END_HOUR` | Hora final de funcionamento | 22 | +| `DAYS_OF_WEEK` | Dias permitidos (1=Seg, 7=Dom) | 1,2,3,4,5,6,7 | +| `TOPICS` | Lista de tópicos separados por vírgula | ver `.env` | +| `LANGUAGE` | Idioma dos insights | pt-BR | +| `MIN_LINES` | Mínimo de linhas por insight | 20 | + +> Prioridade de provedor: OpenRouter > StepFun > LlamaCPP > OpenAI + +## Estrutura do Projeto + +``` +ThorAgenteIA/ +├── .env # Configurações sensíveis (não versionar) +├── .gitignore +├── iniciar.sh # Script de setup automático +├── main.py # Código principal +├── requirements.txt # Dependências Python +├── RULES.md # Regras para IA coder +└── README.md # Documentação +``` + +## Solução de Problemas + +- **Erro de API Key**: Verifique se pelo menos um provedor está configurado no `.env`. +- **Mensagem não enviada**: Confira o token do bot e o chat ID. +- **Horário incorreto**: Verifique o fuso horário do servidor Linux. diff --git a/RULES.md b/RULES.md new file mode 100644 index 0000000..bc12453 --- /dev/null +++ b/RULES.md @@ -0,0 +1,51 @@ +# ThorAgentIA - Regras para IA Coder + +Estas regras devem ser seguidas por qualquer agente de IA trabalhando no projeto ThorAgentIA. + +## 1. Escopo e Propósito + +- O ThorAgentIA é um sistema automatizado de envio de insights via Telegram. +- Não adicionar interface gráfica ou web. O sistema roda apenas no terminal Linux. +- Não modificar a lógica de horário (07:00 às 22:00 por padrão) a menos que explicitamente solicitado. + +## 2. Linguagem e Conteúdo + +- Todo insight gerado deve estar em **português brasileiro**. +- O insight deve ter pelo menos **20 linhas**. +- O tom deve ser motivador, prático e direto ao ponto. +- Não usar markdown excessivo (evitar títulos, negrito, etc. dentro do insight). + +## 3. Estrutura de Arquivos + +- Não mover arquivos de lugar sem instrução explícita. +- Não remover arquivos sem instrução explícita. +- O arquivo `.env` é sensível. Nunca incluir valores reais de API keys em commits. + +## 4. Dependências + +- Adicionar dependências apenas no `requirements.txt`. +- Não usar bibliotecas externas sem necessidade. Preferir `requests` para HTTP. +- Usar `openai` oficial para interação com OpenAI. + +## 5. Código Python + +- Seguir PEP 8. +- Usar type hints quando possível. +- Tratar exceções de forma clara. +- Não deixar código de debug ou prints excessivos no `main.py`. +- Manter a lógica de agendamento simples e confiável. + +## 6. Telegram + +- Respeitar limites da API do Telegram (mensagens até 4096 caracteres). +- Tratar erros de rede com retries ou mensagens de erro claras. + +## 7. Segurança + +- Nunca commitar `.env` com dados reais. +- Validar entradas do `.env` no startup. + +## 8. Alterações + +- Qualquer alteração significativa deve ser documentada no README.md. +- Alterações em variáveis de ambiente devem ser refletidas no README. diff --git a/iniciar.sh b/iniciar.sh new file mode 100755 index 0000000..6963e2a --- /dev/null +++ b/iniciar.sh @@ -0,0 +1,50 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +echo "=== ThorAgentIA - Inicializador ===" +echo "" + +# Verifica se o Python 3 está instalado +if ! command -v python3 &> /dev/null; then + echo "ERRO: Python 3 não encontrado. Instale o Python 3 antes de continuar." + exit 1 +fi + +echo "Python 3 encontrado: $(python3 --version)" + +# Cria o ambiente virtual se não existir +if [ ! -d "venv" ]; then + echo "" + echo "Criando ambiente virtual Python..." + python3 -m venv venv + echo "Ambiente virtual criado com sucesso." +else + echo "" + echo "Ambiente virtual já existe." +fi + +# Ativa o ambiente virtual +echo "" +echo "Ativando ambiente virtual..." +source venv/bin/activate + +# Atualiza o pip +echo "" +echo "Atualizando pip..." +pip install --upgrade pip -q + +# Instala as dependências +echo "" +echo "Instalando dependências..." +pip install -r requirements.txt -q + +echo "" +echo "=== Instalação concluída com sucesso! ===" +echo "" +echo "Iniciando ThorAgentIA..." +echo "" + +python3 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..1abc9e5 --- /dev/null +++ b/main.py @@ -0,0 +1,149 @@ +from dotenv import load_dotenv +import os +import random +import requests +import openai +import schedule +import time +from datetime import datetime + +load_dotenv() + +TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") +TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID") +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") +OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY") +OPENROUTER_MODEL = os.getenv("OPENROUTER_MODEL") +STEPFUN_BASE_URL = os.getenv("STEPFUN_BASE_URL") +STEPFUN_API_KEY = os.getenv("STEPFUN_API_KEY") +STEPFUN_MODEL = os.getenv("STEPFUN_MODEL") +LLAMACPP_BASE_URL = os.getenv("LLAMACPP_BASE_URL") +LLAMACPP_API_KEY = os.getenv("LLAMACPP_API_KEY") +LLAMACPP_MODEL = os.getenv("LLAMACPP_MODEL") +DEFAULT_AI_MODEL = os.getenv("DEFAULT_AI_MODEL", OPENROUTER_MODEL or STEPFUN_MODEL or LLAMACPP_MODEL or "gpt-4o-mini") +LANGUAGE = os.getenv("LANGUAGE", "pt-BR") +MIN_LINES = int(os.getenv("MIN_LINES", "20")) +INTERVAL_MINUTES = int(os.getenv("INTERVAL_MINUTES", "60")) +START_HOUR = int(os.getenv("START_HOUR", "7")) +END_HOUR = int(os.getenv("END_HOUR", "22")) +TOPICS_RAW = os.getenv("TOPICS", "") +DAYS_OF_WEEK_RAW = os.getenv("DAYS_OF_WEEK", "1,2,3,4,5,6,7") + +if not TELEGRAM_BOT_TOKEN or TELEGRAM_BOT_TOKEN == "seu_bot_token_aqui": + raise ValueError("TELEGRAM_BOT_TOKEN não configurado no .env") +if not TELEGRAM_CHAT_ID or TELEGRAM_CHAT_ID == "seu_chat_id_aqui": + raise ValueError("TELEGRAM_CHAT_ID não configurado no .env") + +if OPENROUTER_API_KEY and OPENROUTER_API_KEY != "sk-or-v1-...": + client = openai.OpenAI(base_url="https://openrouter.ai/api/v1", api_key=OPENROUTER_API_KEY) +elif STEPFUN_API_KEY: + client = openai.OpenAI(base_url=STEPFUN_BASE_URL, api_key=STEPFUN_API_KEY) +elif LLAMACPP_API_KEY: + client = openai.OpenAI(base_url=LLAMACPP_BASE_URL, api_key=LLAMACPP_API_KEY) +elif OPENAI_API_KEY: + client = openai.OpenAI(api_key=OPENAI_API_KEY) +else: + raise ValueError("Nenhuma chave de IA configurada no .env") + +TOPICS = [t.strip() for t in TOPICS_RAW.split(",") if t.strip()] +if not TOPICS: + raise ValueError("Nenhum tópico informado no .env (variável TOPICS)") + +DAYS_OF_WEEK = [int(d.strip()) for d in DAYS_OF_WEEK_RAW.split(",") if d.strip()] +if not DAYS_OF_WEEK: + DAYS_OF_WEEK = [1, 2, 3, 4, 5, 6, 7] + + +def is_within_schedule(): + now = datetime.now() + return now.weekday() in DAYS_OF_WEEK and START_HOUR <= now.hour < END_HOUR + + +def generate_insight(topic): + prompt = ( + f"Você é um assistente especializado em {topic}. " + f"Escreva um insight profundo, prático e motivador sobre {topic} " + f"em português brasileiro ({LANGUAGE}). " + f"O texto deve ter pelo menos {MIN_LINES} linhas, ser original, direto ao ponto e útil para o leitor. " + f"Não utilize marcações markdown como títulos ou negrito excessivo. " + f"Escreva de forma fluida, como se fosse uma orientação prática. " + f"Separe os parágrafos com linhas em branco (duas quebras de linha)." + ) + + try: + response = client.chat.completions.create( + model=DEFAULT_AI_MODEL, + messages=[ + {"role": "system", "content": "Responda sempre em português brasileiro."}, + {"role": "user", "content": prompt}, + ], + temperature=0.7, + max_tokens=1500, + ) + return response.choices[0].message.content.strip() + except Exception as e: + return f"[Erro ao gerar insight: {e}]" + + +def send_telegram_message(text, topic): + now = datetime.now() + header = ( + f"🤖 *ThorAgentIA*\n" + f"🕒 {now.strftime('%d/%m/%Y %H:%M:%S')}\n" + f"🧠 Modelo: `{DEFAULT_AI_MODEL}`\n" + f"📌 Assunto: {topic}\n\n" + ) + message = header + text + + url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage" + payload = { + "chat_id": TELEGRAM_CHAT_ID, + "text": message, + "parse_mode": "Markdown", + } + try: + response = requests.post(url, json=payload, timeout=30) + response.raise_for_status() + print(f"[{now.strftime('%Y-%m-%d %H:%M:%S')}] Mensagem enviada com sucesso.") + except Exception as e: + print(f"[{now.strftime('%Y-%m-%d %H:%M:%S')}] Erro ao enviar mensagem: {e}") + + +def job(): + now = datetime.now() + print(f"\n[{now.strftime('%Y-%m-%d %H:%M:%S')}] Verificando horário...") + if not is_within_schedule(): + print(f"[{now.strftime('%Y-%m-%d %H:%M:%S')}] Fora do horário permitido. Pulando envio.") + return + + topic = random.choice(TOPICS) + print(f"[{now.strftime('%Y-%m-%d %H:%M:%S')}] Tópico escolhido: {topic}") + print(f"[{now.strftime('%Y-%m-%d %H:%M:%S')}] Gerando insight...") + insight = generate_insight(topic) + send_telegram_message(insight, topic) + + +def main(): + print("=== ThorAgentIA iniciado ===") + print(f"Horário permitido: {START_HOUR}h às {END_HOUR}h") + print(f"Dias permitidos: {DAYS_OF_WEEK}") + print(f"Intervalo: {INTERVAL_MINUTES} minutos") + print(f"Tópicos disponíveis: {len(TOPICS)}") + for i, t in enumerate(TOPICS, 1): + print(f" {i}. {t}") + print() + + schedule.every(INTERVAL_MINUTES).minutes.do(job) + + job() + + while True: + schedule.run_pending() + time.sleep(1) + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print("\nThorAgentIA encerrado.") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3af09aa --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +openai>=1.40.0 +python-dotenv>=1.0.0 +requests>=2.31.0 +schedule>=1.2.0