|
|
import os |
|
|
import gradio as gr |
|
|
from huggingface_hub import InferenceClient |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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")), |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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): |
|
|
|
|
|
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, |
|
|
) |
|
|
|
|
|
|
|
|
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], |
|
|
) |
|
|
|
|
|
|
|
|
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." |
|
|
) |
|
|
|
|
|
|
|
|
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." |
|
|
) |
|
|
|
|
|
|
|
|
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() |
|
|
|