File size: 3,670 Bytes
37079c9
b629103
954a46c
 
 
37079c9
8cd9e82
37079c9
 
 
b629103
 
8cd9e82
37079c9
b629103
954a46c
37079c9
954a46c
37079c9
 
 
b629103
 
8cd9e82
b629103
954a46c
b629103
37079c9
 
b629103
 
37079c9
b629103
37079c9
 
954a46c
8cd9e82
b629103
37079c9
954a46c
 
 
 
 
37079c9
8cd9e82
 
954a46c
37079c9
 
 
954a46c
 
 
8cd9e82
 
37079c9
 
 
b629103
 
8cd9e82
954a46c
 
 
 
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
# app.py  •  LegalEasyAI  •  v0.2  (без examples, с рабочим InferenceClient)
import os
import gradio as gr
from huggingface_hub import InferenceClient

# ──────────────────────────────────────────────────────────────
# 1. Подключение к модели через Inference API
# ──────────────────────────────────────────────────────────────
MODEL_NAME = "HuggingFaceH4/zephyr-7b-beta"   # можно заменить, напр. на IlyaGusev/saiga_mistral_7b_lora
HF_TOKEN   = os.getenv("HF_TOKEN")            # токен хранится в Settings → Secrets

if HF_TOKEN is None:
    raise RuntimeError(
        "Секрет HF_TOKEN не найден. Добавь его в Settings → Secrets, иначе API ограничит запросы."
    )

client = InferenceClient(MODEL_NAME, token=HF_TOKEN)   # ✔️ актуальная сигнатура

# ──────────────────────────────────────────────────────────────
# 2. Функция генерации ответа
# ──────────────────────────────────────────────────────────────
SYSTEM_PROMPT = (
    "Ты — LegalEasy AI, ассистент‑юрист по законодательству Республики Беларусь. "
    "Отвечай кратко и точно, ссылаясь на статьи и пункты НПА."
)

def respond(message, history, system_message, max_tokens, temperature, top_p):
    # собираем историю в формате OpenAI‑Chat
    msgs = [{"role": "system", "content": system_message or SYSTEM_PROMPT}]
    for user_msg, bot_msg in history:
        if user_msg:
            msgs.append({"role": "user", "content": user_msg})
        if bot_msg:
            msgs.append({"role": "assistant", "content": bot_msg})
    msgs.append({"role": "user", "content": message})

    partial = ""
    for chunk in client.chat_completion(
        messages=msgs,
        max_tokens=max_tokens,
        stream=True,
        temperature=temperature,
        top_p=top_p,
    ):
        token = chunk.choices[0].delta.content or ""
        partial += token
        yield partial

# ──────────────────────────────────────────────────────────────
# 3. Интерфейс Gradio (без параметра examples)
# ──────────────────────────────────────────────────────────────
demo = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Textbox(value=SYSTEM_PROMPT,
                   label="System‑prompt (можно изменить)"),
        gr.Slider(1,   2048, value=512, step=1,     label="Max new tokens"),
        gr.Slider(0.1, 4.0,  value=0.7, step=0.1,   label="Temperature"),
        gr.Slider(0.1, 1.0,  value=0.95,step=0.05,  label="Top‑p"),
    ],
    title="⚖️ LegalEasy AI — демо",
    description="Спроси о праве РБ. Модель: Zephyr‑7B (Inference API).",
)

if __name__ == "__main__":
    demo.launch()