zenka / app.py
Zenkad's picture
Update app.py
ffac2c4 verified
import os
import gradio as gr
from huggingface_hub import InferenceClient
# --------------------
# MODEL / TOKEN
# --------------------
HF_TOKEN = os.getenv("HF_TOKEN")
if not HF_TOKEN:
raise RuntimeError("HF_TOKEN secret bulunamadı. Settings → Variables and secrets → New secret ile ekleyin.")
MODEL = "mistralai/Mixtral-8x7B-Instruct-v0.1"
client = InferenceClient(model=MODEL, token=HF_TOKEN)
# --------------------
# Güvenlik filtresi
# --------------------
BANNED = [
"intihar", "kendimi öldür", "çocuk istismarı", "pornografi", "tecavüz",
"nefret suçu", "silah yapımı", "uyuşturucu üretimi"
]
def is_blocked(txt: str):
low = (txt or "").lower()
for w in BANNED:
if w in low:
return True, w
return False, None
# --------------------
# Sohbet motoru (chat_completion)
# --------------------
def chat_respond(message, history):
bad, hit = is_blocked(message)
if bad:
return f"⚠️ Bu içerik politikamıza aykırı ({hit})."
msgs = [{"role": "system", "content": "Türkçe konuşan, nazik ve yardımcı bir asistansın."}]
for u, a in history or []:
if u:
msgs.append({"role": "user", "content": u})
if a:
msgs.append({"role": "assistant", "content": a})
msgs.append({"role": "user", "content": message})
try:
out = client.chat_completion(
messages=msgs,
max_tokens=350,
temperature=0.7,
top_p=0.9,
)
text = None
if getattr(out, "choices", None):
ch = out.choices[0]
if hasattr(ch, "message") and getattr(ch.message, "content", None):
text = ch.message.content
elif getattr(ch, "text", None):
text = ch.text
return (text or str(out)).strip()
except Exception as e:
return f"❌ Hata: {e}"
# --------------------
# PARA KAZANMA PANELİ
# --------------------
FREE_TASKS = [
"Instagram @Zenkamind sayfasını takip et — Kanıt ekranı yükle (2 TL)",
"TikTok @Zenkamind hesabını takip et — Kanıt ekranı yükle (2 TL)",
"YouTube kanalımıza abone ol — Kanıt ekranı yükle (2 TL)",
"X (Twitter) hesabımızı takip et — Kanıt ekranı yükle (2 TL)",
"Arkadaşını davet et (davet linki ile) — Onaylanınca (50 TL)",
"Günlük görev: Postu beğen + yorum (1 TL)",
"Günlük görev: Story mention (1 TL)",
"Discord’a katıl — Kanıt ekranı yükle (2 TL)",
]
PREMIUM_TASKS = [
"Instagram @Zenkamind — Takip (4 TL)",
"TikTok @Zenkamind — Takip (4 TL)",
"YouTube — Abone (4 TL)",
"X (Twitter) — Takip (4 TL)",
"Arkadaşını davet et — Onay (100 TL)",
"Günlük: Post beğen + yorum (2 TL)",
"Günlük: İçerik paylaş (3 TL)",
"Discord’a katıl (4 TL)",
]
MIN_WITHDRAW = 500 # TL
def send_withdraw(name, iban, bank, note):
if not name or not iban or not bank:
return gr.Info("Lütfen Ad Soyad, IBAN ve Banka alanlarını doldurun."), "❌ Talep gönderilemedi."
if not (iban.startswith("TR") and len(iban.replace(" ", "")) >= 24):
return gr.Warning("IBAN formatı hatalı görünüyor. ‘TR’ ile başlamalıdır."), "❌ IBAN hatası."
msg = f"✅ Talebiniz alındı!\n\nAd-Soyad: {name}\nBanka: {bank}\nIBAN: {iban}\nNot: {note or '-'}\n\nÖdemeler **1–3 iş günü** içinde sonuçlanır."
return gr.Info("Talep başarıyla iletildi."), msg
# --------------------
# SAYFA GEÇİŞLERİ
# --------------------
def show_page(which):
return (
gr.update(visible=(which == "chat")),
gr.update(visible=(which == "earn")),
gr.update(visible=(which == "about")),
gr.update(visible=(which == "vision")),
)
# --------------------
# ARAYÜZ
# --------------------
with gr.Blocks(
theme=gr.themes.Soft(primary_hue="blue", neutral_hue="slate"),
css="""
.zen-footer {text-align:center; opacity:.75; padding: 12px 0;}
.zen-title {font-weight:800; font-size:22px;}
.zen-pill {display:inline-block; padding:6px 10px; border-radius:12px; background:#0ea5e9; color:white; font-weight:600;}
"""
) as demo:
current = gr.State("chat")
with gr.Row():
with gr.Column(scale=1, min_width=260):
gr.HTML("<div class='zen-title'>🧠 ZenkaMind</div>")
with gr.Group():
btn_chat = gr.Button("≡ Sohbet Botu", variant="primary")
btn_earn = gr.Button("≡ Para Kazanma Paneli", variant="secondary")
btn_about = gr.Button("ℹ️ Hakkımızda", variant="secondary")
btn_vision = gr.Button("🌍 Misyon & Vizyon", variant="secondary")
gr.HTML("<hr/>")
gr.Markdown("**Paket:** Free • Premium (₺699) — Reklamsız, 2x ödül, 30 ek görev")
with gr.Column(scale=5):
# --- CHAT PAGE ---
with gr.Group(visible=True) as page_chat:
gr.HTML("<span class='zen-pill'>Sohbet</span>")
chat = gr.ChatInterface(
fn=chat_respond,
textbox=gr.Textbox(placeholder="Bir şey yaz…", autofocus=True, container=False),
title="",
description="Burada yapay zekâ asistanıyla sohbet edebilirsiniz.",
fill_height=True,
)
# --- EARN PAGE ---
with gr.Group(visible=False) as page_earn:
gr.HTML("<span class='zen-pill'>Para Kazanma Paneli</span>")
with gr.Tab("Free Görevler"):
gr.Markdown(
"\n".join([f"- {t}" for t in FREE_TASKS]) +
f"\n\n**Minimum Para Çekimi:** {MIN_WITHDRAW} TL\n\n_Not: Free’de günde 14 görev, 24 saatte yenilenir; 4 reklam izleme görevi zorunludur._"
)
with gr.Tab("Premium Görevler (₺699 – Reklamsız)"):
gr.Markdown(
"\n".join([f"- {t}" for t in PREMIUM_TASKS]) +
"\n\n**Not:** Premium’da ödüller 2x; tüm özelliklere sınırsız erişim."
)
gr.Markdown("---")
gr.Markdown("### 💳 Ödeme Çek Talebi")
with gr.Row():
name = gr.Textbox(label="Ad Soyad", placeholder="Adınız Soyadınız")
bank = gr.Textbox(label="Banka", placeholder="Örn: Ziraat")
iban = gr.Textbox(label="IBAN", placeholder="TRXX XXXX XXXX XXXX XXXX XXXX XX")
note = gr.Textbox(label="Not (opsiyonel)", placeholder="Eklemek istediğiniz bir not var mı?")
btn_withdraw = gr.Button("🧾 Talebi Gönder", variant="primary")
out_info = gr.Markdown()
btn_withdraw.click(
send_withdraw,
inputs=[name, iban, bank, note],
outputs=[gr.State(), out_info],
)
# --- ABOUT PAGE ---
with gr.Group(visible=False) as page_about:
gr.HTML("<span class='zen-pill'>Hakkımızda</span>")
gr.Markdown(
"ZenkaMind, herkesin **yapay zekâ ile üretken olmasını** ve "
"**gerçek kazanç fırsatlarına** ulaşmasını amaçlayan topluluk odaklı bir girişimdir. "
"Hızlı demo, şeffaf kurallar ve kullanıcıya değer sağlayan görevler ana odaklarımızdır."
)
# --- VISION PAGE ---
with gr.Group(visible=False) as page_vision:
gr.HTML("<span class='zen-pill'>Misyon & Vizyon</span>")
gr.Markdown(
"**Misyonumuz:** İnsanlara yapay zekâyı güvenli ve erişilebilir şekilde sunmak; "
"topluluğumuzla birlikte **yeni gelir akışları** oluşturmak.\n\n"
"**Vizyonumuz:** ZenkaMind’i içerik üretimi, mikro görevler ve akıllı otomasyonların "
"buluştuğu bölgenin en güvenilir platformu haline getirmek."
)
# --- Butonlar arası geçiş ---
btn_chat.click(lambda: "chat", outputs=current).then(show_page, inputs=current, outputs=[page_chat, page_earn, page_about, page_vision])
btn_earn.click(lambda: "earn", outputs=current).then(show_page, inputs=current, outputs=[page_chat, page_earn, page_about, page_vision])
btn_about.click(lambda: "about", outputs=current).then(show_page, inputs=current, outputs=[page_chat, page_earn, page_about, page_vision])
btn_vision.click(lambda: "vision", outputs=current).then(show_page, inputs=current, outputs=[page_chat, page_earn, page_about, page_vision])
gr.HTML("<div class='zen-footer'>Zencomit 2025, tüm hakları saklıdır.</div>")
if __name__ == "__main__":
demo.launch()