🚀 Auto-deploy: BotVPS atualizado em 29/04/2026 01:10:16

This commit is contained in:
2026-04-29 01:10:16 +00:00
parent b8a23f6e18
commit fa98956bcc

View File

@@ -2,9 +2,59 @@ import os
import httpx import httpx
import json import json
import asyncio import asyncio
import time
from typing import Optional, Dict, List from typing import Optional, Dict, List
from collections import deque
from config import get_config, save_config from config import get_config, save_config
# Monitor de requisições (Rate Limiting Monitoring)
REQUEST_HISTORY = deque()
ALERT_THRESHOLD = 20
ALERT_WINDOW = 60
LAST_ALERT_TIME = 0
ALERT_COOLDOWN = 300 # Evita flood de alertas (5 min)
async def send_telegram_alert(message: str):
"""Envia um alerta diretamente para o Telegram do administrador."""
token = os.getenv("TELEGRAM_BOT_TOKEN")
chat_id = os.getenv("TELEGRAM_CHAT_ID")
if not token or not chat_id:
return
url = f"https://api.telegram.org/bot{token}/sendMessage"
payload = {"chat_id": chat_id, "text": f"⚠️ **ALERTA DE MONITORAMENTO**\n\n{message}", "parse_mode": "Markdown"}
try:
async with httpx.AsyncClient() as client:
await client.post(url, json=payload, timeout=10)
except Exception as e:
print(f"Erro ao enviar alerta Telegram: {e}")
def track_request():
"""Registra uma requisição e verifica se o limite foi atingido."""
global LAST_ALERT_TIME
now = time.time()
REQUEST_HISTORY.append(now)
# Remove registros mais antigos que a janela de 60s
while REQUEST_HISTORY and REQUEST_HISTORY[0] < now - ALERT_WINDOW:
REQUEST_HISTORY.popleft()
# Verifica threshold
if len(REQUEST_HISTORY) > ALERT_THRESHOLD:
# Verifica cooldown para não floodar o Telegram
if now - LAST_ALERT_TIME > ALERT_COOLDOWN:
LAST_ALERT_TIME = now
msg = (
f"Detectado alto volume de requisições LLM!\n"
f"• Total: {len(REQUEST_HISTORY)} requisições nos últimos {ALERT_WINDOW}s\n"
f"• Limite: {ALERT_THRESHOLD} requisições\n"
f"• Horário: {time.strftime('%H:%M:%S', time.localtime(now))}"
)
# Como track_request é sync e chamada de locais variados,
# vamos disparar o alerta via background task ou garantir que seja async onde importa.
return msg
return None
# ============================================================ # ============================================================
# CONFIGURAÇÃO DE PROVIDERS # CONFIGURAÇÃO DE PROVIDERS
# ============================================================ # ============================================================
@@ -182,7 +232,12 @@ async def get_available_models(provider: str = None) -> List[Dict]:
# ============================================================ # ============================================================
async def call_llm(provider: str, model: str, prompt: str, system_prompt: str = None, **kwargs) -> str: async def call_llm(provider: str, model: str, prompt: str, system_prompt: str = None, **kwargs) -> str:
"""Suporte universal async para chamadas de LLM.""" """Suporte universal async para chamadas de LLM com monitoramento de tráfego."""
# Monitoramento de Rate Limit
alert_msg = track_request()
if alert_msg:
asyncio.create_task(send_telegram_alert(alert_msg))
if provider == "gemini": if provider == "gemini":
return await _call_gemini_async(model, prompt, system_prompt) return await _call_gemini_async(model, prompt, system_prompt)
elif provider == "openai": elif provider == "openai":