|
|
from fastapi import FastAPI, Request |
|
|
from fastapi.middleware.cors import CORSMiddleware |
|
|
from fastapi.responses import JSONResponse |
|
|
import requests, os |
|
|
from datetime import datetime, date |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HF_MODEL = "google/mt5-small" |
|
|
HF_API_URL = f"https://api-inference.huggingface.co/models/{HF_MODEL}" |
|
|
HF_TOKEN = os.getenv("HF_TOKEN", "") |
|
|
|
|
|
SHOPIER_LINK = "https://shopier.com/42153760" |
|
|
FREE_DAILY_LIMIT = 30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app = FastAPI(title="ZenkaMind API") |
|
|
|
|
|
app.add_middleware( |
|
|
CORSMiddleware, |
|
|
allow_origins=["*"], |
|
|
allow_methods=["*"], |
|
|
allow_headers=["*"], |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
USERS = {} |
|
|
|
|
|
def get_user(email): |
|
|
today = date.today().isoformat() |
|
|
if email not in USERS: |
|
|
USERS[email] = { |
|
|
"count": 0, |
|
|
"date": today, |
|
|
"premium": False |
|
|
} |
|
|
if USERS[email]["date"] != today: |
|
|
USERS[email]["count"] = 0 |
|
|
USERS[email]["date"] = today |
|
|
return USERS[email] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ask_ai(prompt: str): |
|
|
headers = {} |
|
|
if HF_TOKEN: |
|
|
headers["Authorization"] = f"Bearer {HF_TOKEN}" |
|
|
|
|
|
payload = { |
|
|
"inputs": prompt, |
|
|
"parameters": { |
|
|
"max_length": 300, |
|
|
"temperature": 0.6 |
|
|
} |
|
|
} |
|
|
|
|
|
r = requests.post( |
|
|
HF_API_URL, |
|
|
headers=headers, |
|
|
json=payload, |
|
|
timeout=20 |
|
|
) |
|
|
|
|
|
if r.status_code != 200: |
|
|
return None |
|
|
|
|
|
data = r.json() |
|
|
if isinstance(data, list) and len(data) > 0: |
|
|
return data[0].get("generated_text", "").strip() |
|
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def build_prompt(user_message: str): |
|
|
return f""" |
|
|
Sen ZenkaMind’sin. |
|
|
|
|
|
- Sadece Türkçe konuş. |
|
|
- Net, açık ve kararlı cevaplar ver. |
|
|
- Eğlence botu gibi davranma. |
|
|
- Kullanıcıyı geliştirmeyi hedefle. |
|
|
- Gereksiz uzatma yapma. |
|
|
- Yanlış bir şey sorulursa açıkça yanlış olduğunu söyle. |
|
|
|
|
|
Kullanıcı: {user_message} |
|
|
|
|
|
ZenkaMind: |
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.get("/") |
|
|
async def root(): |
|
|
return {"status": "ZenkaMind API çalışıyor"} |
|
|
|
|
|
@app.get("/health") |
|
|
async def health(): |
|
|
return { |
|
|
"status": "ok", |
|
|
"model": HF_MODEL, |
|
|
"time": datetime.now().isoformat() |
|
|
} |
|
|
|
|
|
@app.post("/api/chat") |
|
|
async def chat(req: Request): |
|
|
data = await req.json() |
|
|
email = data.get("email", "").lower() |
|
|
message = data.get("message", "").strip() |
|
|
|
|
|
if not email or "@" not in email: |
|
|
return JSONResponse(400, {"error": "Email gerekli"}) |
|
|
|
|
|
if not message: |
|
|
return JSONResponse(400, {"error": "Mesaj boş"}) |
|
|
|
|
|
user = get_user(email) |
|
|
|
|
|
if not user["premium"] and user["count"] >= FREE_DAILY_LIMIT: |
|
|
return { |
|
|
"response": f"Günlük limit doldu.\n💎 Premium: {SHOPIER_LINK}", |
|
|
"status": "limit" |
|
|
} |
|
|
|
|
|
prompt = build_prompt(message) |
|
|
answer = ask_ai(prompt) |
|
|
|
|
|
if not answer: |
|
|
return { |
|
|
"response": "Sunucu yoğun. Lütfen biraz sonra tekrar deneyin.", |
|
|
"status": "error" |
|
|
} |
|
|
|
|
|
user["count"] += 1 |
|
|
|
|
|
if not user["premium"]: |
|
|
answer += f"\n\n💎 Premium ile limitsiz kullanım: {SHOPIER_LINK}" |
|
|
|
|
|
return { |
|
|
"response": answer, |
|
|
"remaining": "unlimited" if user["premium"] else max(0, FREE_DAILY_LIMIT - user["count"]) |
|
|
} |
|
|
|