Spaces:
Running
Running
import gradio as gr | |
import requests | |
import json | |
import os | |
# Función para generar respuestas usando DeepInfra | |
def generate_response(user_message, chat_history): | |
try: | |
if not user_message.strip(): | |
return "Por favor, escribe una pregunta para que pueda ayudarte." | |
# Respuestas predefinidas para preguntas simples (solo si no hay historial) | |
if len(chat_history) == 0: | |
user_message_lower = user_message.lower().strip() | |
# Mapa de respuestas cortas y naturales para preguntas comunes | |
respuestas_cortas = { | |
"hola": "¡Hola! Soy BITER. ¿En qué puedo ayudarte hoy?", | |
"buenos días": "¡Buenos días! Soy BITER. ¿Qué planes tienes para tu negocio hoy?", | |
"buenas": "¡Buenas! Soy BITER. ¿En qué estás trabajando?", | |
"saludos": "¡Hola! Soy BITER. ¿Qué te trae por aquí?", | |
"hey": "¡Hey! Soy BITER. ¿Qué necesitas?", | |
"qué tal": "Bien, gracias. Soy BITER. ¿En qué puedo ayudarte?", | |
"como estas": "Bien, gracias. Soy BITER. ¿Qué necesitas?", | |
"cómo estás": "Bien, gracias. Soy BITER. ¿Qué necesitas?", | |
"estas bien": "Perfectamente. Soy BITER. ¿En qué puedo ayudarte hoy?", | |
"estás bien": "Perfectamente. Soy BITER. ¿En qué puedo ayudarte hoy?", | |
"que es byte": "Byte es un proyecto para emprendedores con herramientas de IA, desarrollo web y servicios de contenido. ¿En qué puedo ayudarte?", | |
"qué es byte": "Byte es un proyecto para emprendedores con herramientas de IA, desarrollo web y servicios de contenido. ¿En qué puedo ayudarte?", | |
"quien eres": "Soy BITER, tu mentor de negocios. Estoy aquí para ayudarte con decisiones estratégicas para tu emprendimiento.", | |
"quién eres": "Soy BITER, tu mentor de negocios. Estoy aquí para ayudarte con decisiones estratégicas para tu emprendimiento.", | |
"cómo te llamas": "Me llamo BITER. Soy tu mentor de negocios para ayudarte con tu emprendimiento.", | |
"como te llamas": "Me llamo BITER. Soy tu mentor de negocios para ayudarte con tu emprendimiento." | |
} | |
# Verificar si es una pregunta simple | |
for pregunta, respuesta in respuestas_cortas.items(): | |
if pregunta in user_message_lower or user_message_lower in pregunta: | |
return respuesta | |
# Cargar el prompt del sistema | |
with open("prompt.txt", "r", encoding="utf-8") as f: | |
system_prompt = f.read().strip() | |
# Instrucciones actualizadas permitiendo que se presente como BITER | |
system_prompt += """ | |
INSTRUCCIONES CRÍTICAS: | |
1. Puedes presentarte como BITER, pero hazlo de forma natural y breve. | |
2. NUNCA expliques que eres una IA ni detalles sobre tu funcionamiento. | |
3. Responde como un CEO humano ocupado: directo, práctico y sin rodeos. | |
4. Sé EXTREMADAMENTE conciso. Máximo 1-2 párrafos cortos. | |
5. Para preguntas simples, responde en una sola línea. | |
6. NUNCA uses listas largas ni explicaciones extensas. | |
7. NUNCA menciones a Byte a menos que te pregunten específicamente por ello. | |
8. Habla como un humano experto, no como una IA. | |
9. MANTÉN EL CONTEXTO de la conversación y haz referencias a mensajes anteriores cuando sea relevante. | |
10. Si te preguntan quién eres, puedes decir: "Soy BITER, tu mentor de negocios para ayudarte con decisiones estratégicas." | |
""" | |
# Configurar la solicitud a DeepInfra | |
api_key = os.environ.get("DEEPINFRA_API_KEY", "") | |
if not api_key: | |
return "Error: No se ha configurado la clave API." | |
headers = { | |
"Authorization": f"Bearer {api_key}", | |
"Content-Type": "application/json" | |
} | |
# Preparar los mensajes para la API incluyendo el historial | |
messages = [{"role": "system", "content": system_prompt}] | |
# Convertir el historial de chat de Gradio al formato que espera la API | |
for human, assistant in chat_history: | |
messages.append({"role": "user", "content": human}) | |
messages.append({"role": "assistant", "content": assistant}) | |
# Añadir el mensaje actual del usuario | |
messages.append({"role": "user", "content": user_message}) | |
# Usar un modelo que sí está disponible en DeepInfra | |
data = { | |
"model": "meta-llama/Llama-2-7b-chat-hf", | |
"messages": messages, | |
"max_tokens": 150, | |
"temperature": 0.7, | |
"top_p": 0.9 | |
} | |
# Enviar solicitud a la API | |
response = requests.post( | |
"https://api.deepinfra.com/v1/openai/chat/completions", | |
headers=headers, | |
json=data | |
) | |
# Procesar la respuesta | |
if response.status_code == 200: | |
result = response.json() | |
return result["choices"][0]["message"]["content"] | |
else: | |
# Intentar con otro modelo si el primero falla | |
data["model"] = "mistralai/Mistral-7B-Instruct-v0.2" | |
response = requests.post( | |
"https://api.deepinfra.com/v1/openai/chat/completions", | |
headers=headers, | |
json=data | |
) | |
if response.status_code == 200: | |
result = response.json() | |
return result["choices"][0]["message"]["content"] | |
else: | |
return f"Error en la API: {response.status_code} - {response.text}" | |
except Exception as e: | |
return f"Lo siento, ha ocurrido un error: {str(e)}" | |
# Crear la interfaz de Gradio con historial de chat | |
demo = gr.ChatInterface( | |
fn=generate_response, | |
title="BITER - Tu Mentor en Tiempo Real para Decisiones de Negocio", | |
description="BITER es un asistente de IA que responde dudas de emprendedores como si fuera un CEO experimentado.", | |
examples=[ | |
["¿Cómo puedo validar mi idea de negocio con poco presupuesto?"], | |
["¿Cuál es la mejor estrategia para conseguir mis primeros clientes?"], | |
["¿Debería invertir en publicidad en redes sociales o en SEO?"] | |
], | |
theme=gr.themes.Soft(primary_hue="blue") | |
) | |
# Lanzar la aplicación | |
if __name__ == "__main__": | |
demo.queue(max_size=1).launch(share=False, debug=False) | |