DINGDINGBELLS commited on
Commit
2b6f383
·
verified ·
1 Parent(s): 3bff0ab

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -44
app.py CHANGED
@@ -1,30 +1,17 @@
1
- import os
2
- import telebot
3
  import torch
4
  import re
5
  import random
6
  from transformers import AutoModelForCausalLM, AutoTokenizer
7
- from flask import Flask
8
-
9
- # --- ДЛЯ ТОГО ЧТОБЫ SPACE НЕ ПАДАЛ (Веб-заглушка) ---
10
- app = Flask(__name__)
11
-
12
- @app.route('/')
13
- def index():
14
- return "ClicklezGPT Telegram Bot is Running!"
15
 
16
- # --- КОНФИГ ---
17
- TOKEN = '8667018016:AAGj3o5qpVKvAiwx4lbsWxvz98xxMB5rvt0'
18
- # Используем "." так как файлы модели лежат прямо в Space
 
19
  MODEL_PATH = "./"
20
 
21
- # СПИСОК МУСОРА
22
- SHIZA_WASTE = [
23
- "лучшая подруга", "решением знаний", "систему cn", "обновления системы",
24
- "мои знания", "тестового ключа", "python_dict", "максимизировать их ошибки"
25
- ]
26
-
27
- # --- ЗАГРУЗКА ---
28
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
29
  model = AutoModelForCausalLM.from_pretrained(
30
  MODEL_PATH,
@@ -32,21 +19,50 @@ model = AutoModelForCausalLM.from_pretrained(
32
  device_map="auto"
33
  )
34
 
35
- # Лимиты
36
  model.config.max_position_embeddings = 128
37
  model.config.use_cache = False
38
  tokenizer.pad_token = tokenizer.eos_token
 
 
 
39
 
40
- bot = telebot.TeleBot(TOKEN)
 
 
 
 
 
41
 
42
- # --- ЛОГИКА ---
43
- @bot.message_handler(func=lambda message: True)
44
- def handle_dialog(message):
45
- input_text = f"User: {message.text[:60]}\nAI:"
46
- inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
 
 
 
 
 
 
 
 
 
 
47
 
 
 
48
  curr_len = inputs.input_ids.shape[1]
 
 
49
  max_to_gen = 128 - curr_len - 1
 
 
 
 
 
 
 
50
 
51
  try:
52
  with torch.no_grad():
@@ -54,33 +70,72 @@ def handle_dialog(message):
54
  **inputs,
55
  max_new_tokens=max_to_gen,
56
  do_sample=True,
57
- temperature=0.2,
58
- repetition_penalty=1.7,
59
  top_k=20,
 
60
  pad_token_id=tokenizer.pad_token_id
61
  )
62
 
 
63
  answer = tokenizer.decode(output_tokens[0][curr_len:], skip_special_tokens=True).strip()
 
 
64
  answer = re.split(r'User:|AI:|\n', answer)[0].strip()
65
 
66
- # Анти-Бред фильтры
67
- if re.search(r'[A-Z_]{8,}', answer) or "(" in answer:
 
 
 
 
 
 
 
 
 
 
68
  answer = random.choice(["Завязывай с кодами.", "Чё?", "Ясно."])
69
 
70
- for waste in SHIZA_WASTE:
71
- if waste in answer.lower():
72
- answer = "Опять ты за своё..."
73
- break
74
 
75
- bot.reply_to(message, answer if len(answer) > 1 else "...")
76
 
77
- except:
78
- bot.reply_to(message, "Ошибка в матрице.")
 
79
 
80
- # --- ЗАПУСК БОТА В ПОТОКЕ ---
81
- import threading
82
- threading.Thread(target=lambda: bot.infinity_polling(timeout=10, long_polling_timeout=5)).start()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
 
84
- if __name__ == "__main__":
85
- # Space требует биндинг на порт 7860
86
- app.run(host="0.0.0.0", port=7860)
 
1
+ import gradio as gr
 
2
  import torch
3
  import re
4
  import random
5
  from transformers import AutoModelForCausalLM, AutoTokenizer
6
+ import os
 
 
 
 
 
 
 
7
 
8
+ # ==========================================
9
+ # 1. ЗАГРУЗКА МОДЕЛИ И ТОКЕНАЙЗЕРА
10
+ # ==========================================
11
+ # Используем ".", так как файлы модели лежат прямо в Space
12
  MODEL_PATH = "./"
13
 
14
+ print("--- [1/2] Загрузка BananaGPT ---")
 
 
 
 
 
 
15
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
16
  model = AutoModelForCausalLM.from_pretrained(
17
  MODEL_PATH,
 
19
  device_map="auto"
20
  )
21
 
22
+ # Жесткие лимиты под твои 128 токенов
23
  model.config.max_position_embeddings = 128
24
  model.config.use_cache = False
25
  tokenizer.pad_token = tokenizer.eos_token
26
+ model.config.pad_token_id = tokenizer.pad_token_id
27
+
28
+ print("--- [2/2] Модель загружена. Запуск интерфейса ---")
29
 
30
+ # СПИСОК МУСОРА (Шиза)
31
+ SHIZA_WASTE = [
32
+ "лучшая подруга", "решением знаний", "систему cn", "обновления системы",
33
+ "мои знания", "тестового ключа", "python_dict", "максимизировать их ошибки",
34
+ "в густом тумане войны", "сегодня ты меня боишься", "CROME_", "RESMALA"
35
+ ]
36
 
37
+ # ==========================================
38
+ # 2. ЛОГИКА ГЕНЕРАЦИИ С ПАМЯТЬЮ
39
+ # ==========================================
40
+ def predict(message, history):
41
+ # message - текущий вопрос пользователя
42
+ # history - список прошлых сообщений [[user, bot], [user, bot]]
43
+
44
+ # 1. Формируем контекст из истории (последние 2 сообщения, чтобы влезть в 128)
45
+ history_str = ""
46
+ for h in history[-2:]: # Берем только последние 2 пары
47
+ history_str += f"User: {h[0][:40]} AI: {h[1][:40]}\n"
48
+
49
+ # Полный промпт (максимум 70 токенов, чтобы оставить место на ответ)
50
+ current_input = f"User: {message[:60]}"
51
+ full_prompt = f"{history_str}{current_input}\nAI:"
52
 
53
+ # Токенизируем
54
+ inputs = tokenizer(full_prompt, return_tensors="pt").to(model.device)
55
  curr_len = inputs.input_ids.shape[1]
56
+
57
+ # Рассчитываем свободное место до физического лимита в 128
58
  max_to_gen = 128 - curr_len - 1
59
+
60
+ if max_to_gen <= 1:
61
+ # Если контекст забит, обнуляем историю и пробуем снова
62
+ full_prompt = f"User: {message[:60]}\nAI:"
63
+ inputs = tokenizer(full_prompt, return_tensors="pt").to(model.device)
64
+ curr_len = inputs.input_ids.shape[1]
65
+ max_to_gen = 128 - curr_len - 1
66
 
67
  try:
68
  with torch.no_grad():
 
70
  **inputs,
71
  max_new_tokens=max_to_gen,
72
  do_sample=True,
73
+ temperature=0.35, # Твоя температура!
74
+ repetition_penalty=1.8, # Усиливаем защиту от повторов
75
  top_k=20,
76
+ top_p=0.8,
77
  pad_token_id=tokenizer.pad_token_id
78
  )
79
 
80
+ # Декодируем только ответ
81
  answer = tokenizer.decode(output_tokens[0][curr_len:], skip_special_tokens=True).strip()
82
+
83
+ # 2. Срезаем лишние диалоги
84
  answer = re.split(r'User:|AI:|\n', answer)[0].strip()
85
 
86
+ # 3. ЛЮТЫЙ ДЕТЕКТОР ШИЗЫ (новое)
87
+ low_answer = answer.lower()
88
+
89
+ # Если она опять начнет про "токены" или "обновление знаний"
90
+ for waste in SHIZA_WASTE:
91
+ if waste in low_answer:
92
+ # Режем всё сообщение, если там началась эта ересь
93
+ answer = answer.split(waste)[0].strip()
94
+
95
+ # Дополнительная защита: если она пишет капсом или ставит коды
96
+ if re.search(r'[A-Z_]{7,}', answer) or "(" in answer and ")" in answer:
97
+ import random
98
  answer = random.choice(["Завязывай с кодами.", "Чё?", "Ясно."])
99
 
100
+ # Финальная проверка на пустоту
101
+ if not answer or len(answer) < 2:
102
+ answer = random.choice(["Мда...", "Проехали.", сно."])
 
103
 
104
+ return answer
105
 
106
+ except Exception as e:
107
+ print(f"Error: {e}")
108
+ return "У меня мозг в тумане войны потерялся."
109
 
110
+ # ==========================================
111
+ # 3. КРАСИВЫЙ ИНТЕРФЕЙС GRADIO
112
+ # ==========================================
113
+ # Тема "soft" выглядит современно и чисто
114
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
115
+ gr.Markdown("# 🍌 ClicklezGPT: Режим «Адекватный Хам»")
116
+ gr.Markdown("Твоя нейронка с температурой **0.35** и защитой от технического бреда.")
117
+
118
+ chatbot = gr.Chatbot(
119
+ label="Чат с BananaGPT",
120
+ avatar_images=(None, "https://api.iconify.design/emojione:banana.svg")
121
+ )
122
+
123
+ with gr.Row():
124
+ txt = gr.Textbox(
125
+ show_label=False,
126
+ placeholder="Напиши что-нибудь...",
127
+ scale=10
128
+ )
129
+ submit_btn = gr.Button("Оправить", scale=2)
130
+
131
+ clear = gr.Button("Очистить историю")
132
+
133
+ # Связываем элементы
134
+ # predict - функция генерации, inputs - ввод пользователя, outputs - чат
135
+ txt.submit(predict, [txt, chatbot], [chatbot])
136
+ submit_btn.click(predict, [txt, chatbot], [chatbot])
137
+
138
+ # Очистка истории
139
+ clear.click(lambda: None, None, chatbot, queue=False)
140
 
141
+ demo.launch(server_name="0.0.0.0", server_port=7860)