DINGDINGBELLS commited on
Commit
73501d2
·
verified ·
1 Parent(s): ed00580

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +64 -56
app.py CHANGED
@@ -1,99 +1,107 @@
1
  import os
2
  import torch
3
  import telebot
4
- from transformers import AutoModelForCausalLM, AutoTokenizer, StoppingCriteria, StoppingCriteriaList
5
- from threading import Thread
6
- import gradio as gr
7
  import gc
 
 
 
8
 
9
- # --- НАСТРОЙКИ ---
10
  MODEL_PATH = "."
11
- # Берем токены из секретов Space
12
  TG_TOKEN = os.environ.get("TG_BOT")
13
- HF_TOKEN = os.environ.get("HF_TOKEN")
 
14
 
15
  # --- ЗАГРУЗКА МОДЕЛИ ---
 
16
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
17
- if tokenizer.pad_token is None:
18
- tokenizer.pad_token = tokenizer.eos_token
19
-
20
  model = AutoModelForCausalLM.from_pretrained(
21
  MODEL_PATH,
22
- torch_dtype=torch.float32, # Для CPU float32 стабильнее
23
  low_cpu_mem_usage=True,
24
- use_cache=True
25
  )
26
- model.eval()
27
-
28
- bot = telebot.TeleBot(TG_TOKEN)
29
 
30
  # --- ФИЛЬТРЫ ---
31
  class StopOnUser(StoppingCriteria):
32
- def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
33
- stop_words = ["Юзер", "User", "Пользователь", "Персонаж"]
34
- text = tokenizer.decode(input_ids[0][-6:])
35
  return any(sw in text for sw in stop_words)
36
 
37
- def generate_answer(message_text):
38
- gc.collect() # Чистим мусор перед генерацией
39
-
40
- # Формат Saiga (минималистичный)
41
- prompt = f"<s>system\nТы — дерзкий ИИ с характером.</s>\n<s>user\n{message_text}</s>\n<s>bot\n"
42
-
43
  inputs = tokenizer(prompt, return_tensors="pt")
44
 
45
- with torch.inference_mode():
46
  output_ids = model.generate(
47
  **inputs,
48
- max_new_tokens=256,
49
  do_sample=True,
50
- temperature=0.5, # Чуть выше для "жизни"
51
- top_p=0.9,
52
- top_k=70,
53
  repetition_penalty=1.2,
54
- no_repeat_ngram_size=3,
55
- stopping_criteria=StoppingCriteriaList([StopOnUser()]),
56
- pad_token_id=tokenizer.pad_token_id,
57
- eos_token_id=tokenizer.eos_token_id
58
  )
59
 
60
- # Декодируем только ответ бота
61
  full_text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
62
  answer = full_text.split("<s>bot\n")[-1].strip()
63
 
64
- # Финальная чистка хвостов
65
- for stop in ["Юзер", "User", "Пользователь", "Персонаж"]:
66
- answer = answer.split(stop)[0]
67
-
68
  return answer.strip()
69
 
70
- # --- ЛОГИКА ТЕЛЕГРАМ ---
71
- @bot.message_handler(commands=['start'])
72
- def send_welcome(message):
73
- bot.reply_to(message, живая. Че хотел?")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
 
75
- @bot.message_handler(func=lambda message: True)
76
- def echo_all(message):
77
  try:
78
- # Отправляем статус "печать", чтобы юзер не скучал
79
- bot.send_chat_action(message.chat.id, 'typing')
80
- response = generate_answer(message.text)
81
- if not response:
82
- response = "Мне нечего сказать на это..."
83
- bot.reply_to(message, response)
 
84
  except Exception as e:
85
- bot.reply_to(message, "У меня мозги заклинило, попробуй еще раз.")
 
 
 
86
 
87
- # --- ЗАПУСК ---
88
  def run_bot():
89
- bot.infinity_polling()
 
 
 
 
 
 
90
 
91
- # Запускаем бота в отдельном потоке
92
  Thread(target=run_bot, daemon=True).start()
93
 
94
- # Оставляем Gradio, чтобы Space жил
95
  with gr.Blocks() as demo:
96
- gr.Markdown("## 🍌 BananaBot в Telegram запущен!")
97
- gr.Markdown("Можешь писать в ТГ, а здесь просто висит панель управления.")
98
 
99
  demo.launch(server_name="0.0.0.0", server_port=7860)
 
1
  import os
2
  import torch
3
  import telebot
4
+ import time
 
 
5
  import gc
6
+ import gradio as gr
7
+ from threading import Thread
8
+ from transformers import AutoModelForCausalLM, AutoTokenizer, StoppingCriteria, StoppingCriteriaList
9
 
10
+ # --- КОНФИГ ---
11
  MODEL_PATH = "."
 
12
  TG_TOKEN = os.environ.get("TG_BOT")
13
+
14
+ user_status = {}
15
 
16
  # --- ЗАГРУЗКА МОДЕЛИ ---
17
+ print("Загружаю модель...")
18
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
 
 
 
19
  model = AutoModelForCausalLM.from_pretrained(
20
  MODEL_PATH,
21
+ torch_dtype=torch.float32,
22
  low_cpu_mem_usage=True,
23
+ device_map="cpu"
24
  )
 
 
 
25
 
26
  # --- ФИЛЬТРЫ ---
27
  class StopOnUser(StoppingCriteria):
28
+ def __call__(self, input_ids, scores, **kwargs):
29
+ stop_words = ["User", "Юзер", "Пользователь", "Персонаж"]
30
+ text = tokenizer.decode(input_ids[0][-10:])
31
  return any(sw in text for sw in stop_words)
32
 
33
+ def generate_answer(text):
34
+ gc.collect()
35
+ # Убрали системный промпт, оставили только структуру диалога
36
+ prompt = f"<s>user\n{text}</s>\n<s>bot\n"
 
 
37
  inputs = tokenizer(prompt, return_tensors="pt")
38
 
39
+ with torch.no_grad():
40
  output_ids = model.generate(
41
  **inputs,
42
+ max_new_tokens=150,
43
  do_sample=True,
44
+ temperature=0.4, # Установили 0.4 для большей точности
 
 
45
  repetition_penalty=1.2,
46
+ stopping_criteria=StoppingCriteriaList([StopOnUser()])
 
 
 
47
  )
48
 
 
49
  full_text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
50
  answer = full_text.split("<s>bot\n")[-1].strip()
51
 
52
+ for s in ["User", "Юзер", "Пользователь", "<s>"]:
53
+ answer = answer.split(s)[0]
 
 
54
  return answer.strip()
55
 
56
+ # --- ТЕЛЕГРАМ ---
57
+ bot = telebot.TeleBot(TG_TOKEN, threaded=False)
58
+
59
+ @bot.message_handler(func=lambda m: True)
60
+ def chat(m):
61
+ user_id = m.from_user.id
62
+ current_time = time.time()
63
+
64
+ if user_id not in user_status:
65
+ user_status[user_id] = {"last_time": 0, "is_thinking": False}
66
+
67
+ if user_status[user_id]["is_thinking"]:
68
+ bot.reply_to(m, "Модель думает. Не нагружайте сервер.")
69
+ return
70
+
71
+ time_passed = current_time - user_status[user_id]["last_time"]
72
+ if time_passed < 15:
73
+ wait_time = int(15 - time_passed)
74
+ bot.reply_to(m, f"Слишком быстро! Подожди еще {wait_time} сек.")
75
+ return
76
 
 
 
77
  try:
78
+ user_status[user_id]["is_thinking"] = True
79
+ bot.send_chat_action(m.chat.id, 'typing')
80
+
81
+ ans = generate_answer(m.text)
82
+
83
+ bot.reply_to(m, ans if ans else "...")
84
+ user_status[user_id]["last_time"] = time.time()
85
  except Exception as e:
86
+ print(f"Ошибка: {e}")
87
+ bot.reply_to(m, "Ошибка при обработке запроса.")
88
+ finally:
89
+ user_status[user_id]["is_thinking"] = False
90
 
 
91
  def run_bot():
92
+ print("Цикл опроса запущен...")
93
+ while True:
94
+ try:
95
+ bot.polling(none_stop=True, interval=2, timeout=25)
96
+ except Exception as e:
97
+ print(f"Сеть спит (ошибка: {e})")
98
+ time.sleep(10)
99
 
 
100
  Thread(target=run_bot, daemon=True).start()
101
 
102
+ # --- ИНТЕРФЕЙС ---
103
  with gr.Blocks() as demo:
104
+ gr.Markdown("# 🍌 Banana Bot (Temp 0.4)")
105
+ gr.Markdown("Бот работает без системного промпта.")
106
 
107
  demo.launch(server_name="0.0.0.0", server_port=7860)