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.
This commit is contained in:
marco
2026-08-16 20:09:57 -03:00
commit ad4b73b668
7 changed files with 437 additions and 0 deletions
+39
View File
@@ -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
+27
View File
@@ -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
+117
View File
@@ -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.
+51
View File
@@ -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.
Executable
+50
View File
@@ -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
+149
View File
@@ -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.")
+4
View File
@@ -0,0 +1,4 @@
openai>=1.40.0
python-dotenv>=1.0.0
requests>=2.31.0
schedule>=1.2.0