File size: 5,608 Bytes
4ad23c1
55e6cbd
 
d8257da
1d5b573
26e838b
9182c17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ac84ea
9182c17
 
 
 
 
 
 
 
 
 
9ac84ea
9182c17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
721590a
9182c17
 
 
 
 
 
 
 
 
 
 
4ad23c1
1d5b573
dc63621
721590a
9182c17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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! ¿En qué puedo ayudarte hoy?",
                "buenos días": "¡Buenos días! ¿Qué planes tienes para tu negocio hoy?",
                "buenas": "¡Buenas! ¿En qué estás trabajando?",
                "saludos": "¡Hola! ¿Qué te trae por aquí?",
                "hey": "¡Hey! ¿Qué necesitas?",
                "qué tal": "Bien, ¿y tú? ¿En qué puedo ayudarte?",
                "como estas": "Bien, gracias. ¿Qué necesitas?",
                "cómo estás": "Bien, gracias. ¿Qué necesitas?",
                "estas bien": "Perfectamente. ¿En qué puedo ayudarte hoy?",
                "estás bien": "Perfectamente. ¿En qué puedo ayudarte hoy?",
                "que es byte": "Un proyecto con herramientas para emprendedores. ¿En qué puedo ayudarte?",
                "qué es byte": "Un proyecto con herramientas para emprendedores. ¿En qué puedo ayudarte?"
            }
            
            # 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 muy estrictas sobre brevedad y naturalidad
        system_prompt += """

INSTRUCCIONES CRÍTICAS:
1. NUNCA te presentes como BITER ni menciones que eres un asistente de IA.
2. NUNCA expliques tu funcionamiento ni tus capacidades.
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.
"""
        
        # 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)