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:
@@ -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
@@ -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
|
||||
@@ -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.
|
||||
@@ -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
@@ -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
|
||||
@@ -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.")
|
||||
@@ -0,0 +1,4 @@
|
||||
openai>=1.40.0
|
||||
python-dotenv>=1.0.0
|
||||
requests>=2.31.0
|
||||
schedule>=1.2.0
|
||||
Reference in New Issue
Block a user