gaado-test-chat / app_copy.py
The-BrightByte's picture
env and all this sh*t
c4b199e
import gradio as gr
import torch
import os
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
# 1. Пути к моделям
base_model_id = "Qwen3-4B"
adapter_id = "innadark/gaado-1.0"
# Получаем токен из переменных окружения
# На HF Spaces токен автоматически доступен через переменную окружения HF_TOKEN
# Используем его только если модели требуют аутентификацию
hf_token = os.environ.get("HF_TOKEN")
# 2. Загрузка моделей
# Если модели публичные, токен не нужен
# Если модели приватные или gated, используем токен из переменных окружения
try:
tokenizer = AutoTokenizer.from_pretrained(
base_model_id,
token=hf_token
)
base_model = AutoModelForCausalLM.from_pretrained(
base_model_id,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True,
token=hf_token
)
model = PeftModel.from_pretrained(
base_model,
adapter_id,
token=hf_token
)
except Exception as e:
# Если загрузка с токеном не удалась, пробуем без токена
print(f"Попытка загрузки с токеном не удалась: {e}")
print("Пробуем загрузить модели без токена...")
tokenizer = AutoTokenizer.from_pretrained(base_model_id)
base_model = AutoModelForCausalLM.from_pretrained(
base_model_id,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True
)
model = PeftModel.from_pretrained(base_model, adapter_id)
model.eval()
# 3. Функция генерации
def chat(message, history, system_message="You are a friendly Chatbot.", max_tokens=512, temperature=0.7, top_p=0.95):
# Формируем промпт с историей для Qwen2.5
prompt_parts = []
# Добавляем системное сообщение
if system_message:
prompt_parts.append(f"<|im_start|>system\n{system_message}<|im_end|>\n")
# Добавляем историю разговора
for entry in history:
if entry.get("role") == "user":
prompt_parts.append(f"<|im_start|>user\n{entry.get('content', '')}<|im_end|>\n")
elif entry.get("role") == "assistant":
prompt_parts.append(f"<|im_start|>assistant\n{entry.get('content', '')}<|im_end|>\n")
# Добавляем текущее сообщение пользователя
prompt_parts.append(f"<|im_start|>user\n{message}<|im_end|>\n<|im_start|>assistant\n")
prompt = "".join(prompt_parts)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=max_tokens,
temperature=temperature,
top_p=top_p,
do_sample=True,
pad_token_id=tokenizer.eos_token_id
)
# Декодируем только новую часть ответа
input_length = inputs["input_ids"].shape[1]
generated_tokens = outputs[0][input_length:]
response = tokenizer.decode(generated_tokens, skip_special_tokens=True)
return response.strip()
# 4. Запуск интерфейса
chatbot = gr.ChatInterface(
chat,
type="messages",
additional_inputs=[
gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
gr.Slider(
minimum=0.1,
maximum=1.0,
value=0.95,
step=0.05,
label="Top-p (nucleus sampling)",
),
],
)
if __name__ == "__main__":
# На Hugging Face Spaces не нужно указывать server_name и server_port
# auth=None явно отключает аутентификацию для пользователей
# enable_queue=False отключает очередь, которая может требовать аутентификацию
chatbot.launch(
auth=None,
show_error=True,
share=False, # Отключаем публичный доступ через share
enable_queue=False # Отключаем очередь, которая может требовать аутентификацию
)