aoh3time / stream_videos.py
SorovotPelo's picture
Update stream_videos.py
fda1459 verified
import os
import re
import aiohttp
import discord
import uvicorn
import threading
import google.generativeai as genai
from fastapi import FastAPI
from discord.ext import commands
app = FastAPI()
message_history = {}
# Configuración de claves (coloca tus propias claves aquí)
GOOGLE_AI_KEY = "AIzaSyAbarn6onc769Jv3CBqoC6VF9zb5slAtpc"
DISCORD_BOT_TOKEN = "MTI2NDM3NDYzNTA0NzQyNDE1Mw.GcGTmk.Htew_dUNsInFHLVh9Y2T1bdyRPnoZiuE2S_Fxw"
MAX_HISTORY = 12 # Historial máximo de mensajes
#---------------------------------------------System Prompts-------------------------------------------------
system_prompt = "You are a helpful bot!"
image_prompt = "You are a helpful bot!"
#---------------------------------------------AI Configuration-------------------------------------------------
genai.configure(api_key=GOOGLE_AI_KEY)
text_generation_config = {
"temperature": 0.9,
"top_p": 1,
"top_k": 1,
"max_output_tokens": 512,
}
image_generation_config = {
"temperature": 0.4,
"top_p": 1,
"top_k": 32,
"max_output_tokens": 512,
}
safety_settings = [
{"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
{"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
{"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
{"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_MEDIUM_AND_ABOVE"}
]
text_model = genai.GenerativeModel(
model_name="gemini-2.0-flash-thinking-exp-01-21",
generation_config=text_generation_config,
safety_settings=safety_settings,
system_instruction=system_prompt
)
image_model = genai.GenerativeModel(
model_name="gemini-2.0-flash-thinking-exp-01-21",
generation_config=image_generation_config,
safety_settings=safety_settings,
system_instruction=image_prompt
)
#---------------------------------------------Discord Bot Setup-------------------------------------------------
intents = discord.Intents.default()
intents.members = True
intents.message_content = True
bot = commands.Bot(command_prefix='!', description="Assistant bot", intents=intents)
@bot.event
async def on_ready():
print("----------------------------------------")
print(f'Bot de Discord conectado como {bot.user}')
print("----------------------------------------")
@bot.event
async def on_message(message):
if message.author == bot.user or message.mention_everyone:
return
if bot.user.mentioned_in(message) or isinstance(message.channel, discord.DMChannel):
cleaned_text = clean_discord_message(message.content)
async with message.channel.typing():
if message.attachments:
print(f"Mensaje con imagen de {message.author}: {cleaned_text}")
for attachment in message.attachments:
if any(attachment.filename.lower().endswith(ext) for ext in ['.png', '.jpg', '.jpeg', '.gif', '.webp']):
await message.add_reaction('🎨')
async with aiohttp.ClientSession() as session:
async with session.get(attachment.url) as resp:
if resp.status == 200:
image_data = await resp.read()
response_text = await generate_response_with_image_and_text(image_data, cleaned_text)
await split_and_send_messages(message, response_text, 1700)
return
else:
print(f"Mensaje de {message.author}: {cleaned_text}")
if "RESET" in cleaned_text:
if message.author.id in message_history:
del message_history[message.author.id]
await message.channel.send(f"🤖 Historial reiniciado para {message.author.name}")
return
await message.add_reaction('💬')
update_message_history(message.author.id, cleaned_text)
response_text = await generate_response_with_text(get_formatted_message_history(message.author.id))
update_message_history(message.author.id, response_text)
await split_and_send_messages(message, response_text, 1700)
#---------------------------------------------Funciones de IA-------------------------------------------------
async def generate_response_with_text(message_text):
response = text_model.generate_content([message_text])
return response.text if not response._error else f"❌ Error: {response._error}"
async def generate_response_with_image_and_text(image_data, text):
prompt_parts = [{"mime_type": "image/jpeg", "data": image_data}, f"\n{text or 'What is this a picture of?'}"]
response = image_model.generate_content(prompt_parts)
return response.text if not response._error else f"❌ Error: {response._error}"
#---------------------------------------------Manejo de Historial-------------------------------------------------
def update_message_history(user_id, text):
if user_id in message_history:
message_history[user_id].append(text)
if len(message_history[user_id]) > MAX_HISTORY:
message_history[user_id].pop(0)
else:
message_history[user_id] = [text]
def get_formatted_message_history(user_id):
return '\n\n'.join(message_history.get(user_id, ["No hay historial de mensajes"]))
#---------------------------------------------Funciones Utilitarias-------------------------------------------------
async def split_and_send_messages(message_system, text, max_length):
for i in range(0, len(text), max_length):
await message_system.channel.send(text[i:i+max_length])
def clean_discord_message(input_string):
return re.sub(r'<[^>]+>', '', input_string)
#---------------------------------------------Endpoints FastAPI-------------------------------------------------
@app.get("/")
async def read_root():
return {"status": "API en funcionamiento"}
#---------------------------------------------Ejecución del Servicio-------------------------------------------------
def run_discord_bot():
bot.run(DISCORD_BOT_TOKEN)
if __name__ == "__main__":
# Iniciar bot de Discord en segundo plano
discord_thread = threading.Thread(target=run_discord_bot)
discord_thread.start()
# Iniciar servidor FastAPI
uvicorn.run(app, host="0.0.0.0", port=7860)