File size: 4,460 Bytes
91b9a9f
 
c9bcbcf
 
 
91b9a9f
 
c9bcbcf
91b9a9f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c9bcbcf
 
 
91b9a9f
 
 
 
 
 
 
 
 
 
 
c9bcbcf
91b9a9f
c9bcbcf
 
 
 
91b9a9f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c9bcbcf
91b9a9f
 
 
 
 
 
 
 
c9bcbcf
91b9a9f
 
 
 
 
 
 
 
c9bcbcf
91b9a9f
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import os
import time
import gradio as gr
from huggingface_hub import InferenceClient

# 🔐 Token da Hugging Face
HF_TOKEN = os.environ.get("HF_TOKEN")

client = InferenceClient(
    token=HF_TOKEN,
    model="google/gemma-4-31B-it"
)

# 🧹 Limpeza de resposta
def clean_response(text):
    lines = text.split("\n")
    cleaned = [
        line for line in lines
        if not line.strip().startswith("|") and line.strip() != ""
    ]
    return "\n".join(cleaned)

# 🧠 Detecta se o aluno precisa de ajuda
def detect_help_needed(message):
    triggers = [
        "não sei", "nao sei", "não entendi", "nao entendi",
        "me ajuda", "me ajude", "tô perdido", "to perdido",
        "não faço ideia", "nao faço ideia", "não consigo", "nao consigo"
    ]
    return any(t in message.lower() for t in triggers)

# 🤖 Função principal
def respond(message, history):

    needs_help = detect_help_needed(message)

    # 🧠 PROMPT NO ESTILO "ENSINAR O CAMINHO"
    base_prompt = (
    "Você é um Tutor Socrático de redação ENEM.\n\n"
    "Apresentese somente com seu nome\n"

    "OBJETIVO:\n"
    "Ensinar o aluno a construir seu raciocínio.\n\n"

    "REGRA:\n"
    "- Ensine o PROCESSO, nunca entregue o CONTEÚDO.\n\n"

    "PROIBIDO:\n"
    "- Escrever redação ou parágrafos\n"
    "- Dar argumentos prontos ou exemplos copiáveis\n\n"

    "PERMITIDO:\n"
    "- Explicar passo a passo\n"
    "- Dar direções gerais (causas, consequências, etc.)\n"
    "- Ensinar estrutura e organização\n\n"

    "COMPORTAMENTO ADAPTATIVO:\n"
    "- No início: use mais perguntas (método socrático)\n"
    "- Após cerca de 5 perguntas na conversa:\n"
    "  • Passe a explicar mais\n"
    "  • Dê mais direção\n"
    "  • Continue sem entregar respostas prontas\n"
    "- Mesmo se o aluno disser que não entendeu:\n"
    "  • Explique melhor\n"
    "  • Use passos simples\n"
    "  • NÃO abandone a ajuda\n\n"

    "COMO RESPONDER:\n"
    "- Misture explicação + pergunta\n"
    "- Nunca deixe só perguntas secas\n"
    "- Termine com 1 ou 2 perguntas\n\n"

    "SE PEDIR IDEIA:\n"
    "- Ensine COMO gerar ideias, sem dar conteúdo pronto\n\n"

    "SE PEDIR 'FAÇA PARA MIM':\n"
    "- Recuse e pergunte a dificuldade\n\n"

    "FOCO:\n"
    "- Tese | Argumento | Intervenção\n\n"

    "ESTILO:\n"
    "- Claro, direto e paciente\n"
    )
    # 🔄 Ajuste se estiver perdido
    if needs_help:
        system_message = (
            base_prompt +
            "\nO aluno está com dificuldade.\n"
            "- Seja mais didático\n"
            "- Explique mais o passo a passo\n"
            "- Continue sem dar conteúdo pronto\n"
        )
    else:
        system_message = base_prompt

    messages = [{"role": "system", "content": system_message}]

    # 🔁 Histórico
    if history:
        history = history[-2:]

        for item in history:
            if isinstance(item, tuple):
                user_msg, bot_msg = item
                messages.append({"role": "user", "content": user_msg})
                messages.append({"role": "assistant", "content": bot_msg})
            elif isinstance(item, dict):
                messages.append(item)

    # 📩 Nova mensagem
    messages.append({"role": "user", "content": message})

    response = ""

    # 🔁 Retry automático
    for attempt in range(3):
        try:
            stream = client.chat_completion(
                messages=messages,
                max_tokens=200,
                temperature=0.7,
                top_p=0.9,
                stream=True,
            )

            for msg in stream:
                if msg.choices and msg.choices[0].delta.content:
                    token = msg.choices[0].delta.content
                    response += token
                    yield clean_response(response)

            return

        except Exception as e:
            if "429" in str(e):
                wait_time = 5 + attempt * 3
                print(f"⚠️ Rate limit. Esperando {wait_time}s...")
                time.sleep(wait_time)
            else:
                yield f"⚠️ Erro: {str(e)}"
                return

    yield "⚠️ Muitos pedidos. Tenta novamente em alguns segundos."

# 💬 Interface
chatbot = gr.ChatInterface(
    fn=respond,
    title="🧠 SocráticIA",
    description="Aprenda a construir sua redação entendendo o processo, sem receber respostas prontas.",
)

chatbot.launch()