File size: 2,303 Bytes
bf088dd
 
 
 
 
 
be990f4
 
bf088dd
 
 
 
 
 
 
 
 
 
 
19ec252
bf088dd
 
3ea3833
 
bf088dd
 
 
3ea3833
bf088dd
3ea3833
14e2188
31c6a1a
08658e2
14e2188
 
 
 
 
bf088dd
 
14e2188
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
08658e2
7dddbf7
 
 
08658e2
7dddbf7
3ea3833
7dddbf7
 
 
be990f4
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
import os
from functools import lru_cache
import gradio as gr
from huggingface_hub import hf_hub_download
from llama_cpp import Llama

REPO_ID = os.getenv("GGUF_REPO_ID", "bartowski/SmolLM2-135M-Instruct-GGUF")
FILENAME = os.getenv("GGUF_FILENAME", "SmolLM2-135M-Instruct-Q4_K_M.gguf")

@lru_cache()
def load_llm():
    model_path = hf_hub_download(
        repo_id=REPO_ID,
        filename=FILENAME,
        local_dir=".",
        local_dir_use_symlinks=False,
    )
    llm = Llama(
        model_path=model_path,
        n_ctx=512,
        n_threads=max(2, os.cpu_count() or 2),
        n_gpu_layers=0,
        n_batch=32,
        verbose=False,
    )
    return llm

SYSTEM_PROMPT = "به فارسی، روشن و کوتاه پاسخ بده (حداکثر ۲ جمله)."

def respond(message, history):
    # پیام فعلی را به متن ساده تبدیل کن (messages یا string)
    user_text = message.get("content", "") if isinstance(message, dict) else str(message or "")

    # تاریخچه را فعلاً نادیده می‌گیریم تا پرامپت خیلی کوتاه بماند
    msgs = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": user_text},
    ]

    llm = load_llm()
    print(">> gen start (stream minimal)")
    partial = ""
    try:
        for chunk in llm.create_chat_completion(
            messages=msgs,
            max_tokens=48,        # کوتاه برای سرعت
            temperature=0.3,
            top_p=0.95,
            stop=["<|im_end|>", "</s>"],  # مطابق تمپلیت مدل
            stream=True,
        ):
            delta = chunk["choices"][0]["delta"].get("content", "")
            if delta:
                partial += delta
                yield partial
        print(">> gen done (stream minimal)")
    except Exception as e:
        print(">> exception:", repr(e))
        yield "یه خطای داخلی رخ داد؛ لطفاً دوباره تلاش کن."



demo = gr.ChatInterface(
    fn=respond,
    type="messages",  # تاریخچه را با role/content می‌فرستد
    title="چت‌بات خیلی ساده (CPU رایگان)",
    description="SmolLM2-135M (GGUF) با llama.cpp روی CPU.",
)

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