Delete server.py
Browse files
server.py
DELETED
|
@@ -1,72 +0,0 @@
|
|
| 1 |
-
from fastapi import FastAPI
|
| 2 |
-
from pydantic import BaseModel
|
| 3 |
-
import time, yaml
|
| 4 |
-
from models.load_model import load_model
|
| 5 |
-
from connectors.web_search import search_web
|
| 6 |
-
|
| 7 |
-
# بارگذاری تنظیمات
|
| 8 |
-
cfg = yaml.safe_load(open("config.yaml", "r", encoding="utf-8"))
|
| 9 |
-
|
| 10 |
-
# بارگذاری مدل
|
| 11 |
-
tok, model = load_model(cfg["model"]["name"], cfg["model"]["dtype"])
|
| 12 |
-
|
| 13 |
-
# ایجاد اپلیکیشن FastAPI
|
| 14 |
-
app = FastAPI(title=cfg["app"]["title"])
|
| 15 |
-
|
| 16 |
-
# تعریف ورودی درخواست
|
| 17 |
-
class ChatRequest(BaseModel):
|
| 18 |
-
user_name: str = "کاربر"
|
| 19 |
-
interests: list[str] = ["بازیهای فکری"]
|
| 20 |
-
user_msg: str
|
| 21 |
-
last_seen_ts: float = time.time() - 90000
|
| 22 |
-
history: list[tuple[str, str]] = []
|
| 23 |
-
user_id: str = "user-001"
|
| 24 |
-
|
| 25 |
-
# متن سیستمی
|
| 26 |
-
def system_preamble(user_name="کاربر", interests=None):
|
| 27 |
-
interests = interests or ["بازیهای فکری"]
|
| 28 |
-
return (
|
| 29 |
-
"شما یک همراه گفتگوگر فارسیزبان هستید: مؤدب، شفاف، اخلاقمحور.\n"
|
| 30 |
-
f"نام کاربر: {user_name}. علایق: {', '.join(interests)}.\n"
|
| 31 |
-
)
|
| 32 |
-
|
| 33 |
-
# بررسی خوشآمدگویی
|
| 34 |
-
def should_greet(last_seen_ts, hours=24):
|
| 35 |
-
return (time.time() - last_seen_ts) > hours * 3600
|
| 36 |
-
|
| 37 |
-
# ساخت پرامپت
|
| 38 |
-
def build_prompt(req: ChatRequest):
|
| 39 |
-
sys = system_preamble(req.user_name, req.interests)
|
| 40 |
-
greet = "سلام! کجایی؟ امروز حوصله داری یه بازی سبک انجام بدیم؟" \
|
| 41 |
-
if should_greet(req.last_seen_ts, cfg["app"]["greet_after_hours"]) else ""
|
| 42 |
-
context = ""
|
| 43 |
-
for role, content in req.history[-cfg["app"]["max_history_turns"]:]:
|
| 44 |
-
context += f"<|{role}|>\n{content}\n"
|
| 45 |
-
prompt = f"<|system|>\n{sys}\n" \
|
| 46 |
-
+ (f"<|user|>\n{greet}\n" if greet else "") \
|
| 47 |
-
+ context \
|
| 48 |
-
+ f"<|user|>\n{req.user_msg}\n<|assistant|>\n"
|
| 49 |
-
return prompt
|
| 50 |
-
|
| 51 |
-
# مسیر API
|
| 52 |
-
@app.post("/chat")
|
| 53 |
-
def chat(req: ChatRequest):
|
| 54 |
-
prompt = build_prompt(req)
|
| 55 |
-
inputs = tok(prompt, return_tensors="pt").to(model.device)
|
| 56 |
-
out_ids = model.generate(
|
| 57 |
-
**inputs,
|
| 58 |
-
max_new_tokens=cfg["model"]["max_new_tokens"],
|
| 59 |
-
do_sample=True,
|
| 60 |
-
temperature=cfg["model"]["temperature"],
|
| 61 |
-
top_p=cfg["model"]["top_p"]
|
| 62 |
-
)
|
| 63 |
-
answer = tok.decode(out_ids[0], skip_special_tokens=True)
|
| 64 |
-
|
| 65 |
-
# اتصال اینترنت در صورت نیاز
|
| 66 |
-
internet_block = ""
|
| 67 |
-
if cfg["internet"]["enabled"] and ("جستجو" in req.user_msg or "search" in req.user_msg.lower()):
|
| 68 |
-
results = search_web(req.user_msg, max_results=cfg["internet"]["max_results"], timeout=cfg["internet"]["timeout_seconds"])
|
| 69 |
-
if results:
|
| 70 |
-
internet_block = "\nمنابع پیشنهادی:\n" + "\n".join([f"- {r['title']}: {r['href']}" for r in results])
|
| 71 |
-
|
| 72 |
-
return {"answer": answer + (("\n" + internet_block) if internet_block else "")}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|