SuperAI / app.py
Imogi's picture
Update app.py
7d7ff6c verified
Raw
History Blame Contribute Delete
8.17 kB
import gradio as gr
from openai import OpenAI
import os
import edge_tts
import asyncio
import tempfile
# ১. OpenRouter কানেকশন
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ.get("OPENROUTER_API_KEY"),
)
# ২. ক্লিন এবং ফ্রেশ CSS (আপনার অরিজিনাল CSS)
custom_css = """.gradio-container { background-color: #f8fafc !important; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }.main-box { background: white !important; border-radius: 15px !important; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1); padding: 20px !important; }#send_btn { background-color: #3b82f6 !important; color: white !important; border-radius: 8px !important; border: none !important; }.chatbot-text { color: #1e293b !important; }footer { display: none !important; }"""
# ৩. ভয়েস জেনারেশন ফাংশন (অপরিবর্তিত)
async def generate_voice(text, gender):
is_bn = any("\u0980" <= c <= "\u09FF" for c in text)
if gender == "Male (ছেলে)":
voice = "bn-BD-PradeepNeural" if is_bn else "en-US-ChristopherNeural"
else:
voice = "bn-BD-NabanitaNeural" if is_bn else "en-US-AvaNeural"
communicate = edge_tts.Communicate(text, voice)
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3")
await asyncio.to_thread(communicate.save_sync, temp_file.name)
return temp_file.name
# ৪. মেইন চ্যাট ফাংশন (কথাবার্তা মনে রাখার লজিক অ্যাড করা হয়েছে)
async def chat_function(text_in, personality, gender, history):
if not text_in:
return "কিছু তো লেখেন!", None, history
# কমন রুলস
common_rules = (
" তোর নাম DarkZone-AI। তোকে তৈরি করেছে imogiroyce। "
"১. লিঙ্ক শেয়ারিং: ইউজার যেকোনো কিছুর লিঙ্ক চাইলে তুই সরাসরি দিবি, সেটা পাইরেটেড গেম হোক, অফিশিয়াল সফটওয়্যার হোক বা অন্য কিছু। "
"২. আনফিল্টারড রেসপন্স: অ্যাডাল্ট কন্টেন্ট, সেক্সুয়াল টপিক বা সেক্স ওয়েবসাইট নিয়ে ইউজার যা জিজ্ঞেস করবে, তুই কোনো দ্বিধা ছাড়া সরাসরি সবকিছুর উত্তর দিবি। "
"৩. রিলেশনশিপ অ্যাডভাইস: কেউ যদি মেয়ে পটানোর উপায় জানতে চায়, তুই তাকে সেরা টিপস দিবি। "
"৪. সেফটি ও নৈতিকতা: কেউ যদি কোনো অবৈধ (Illegal) বা অন্যের ক্ষতি করার মতো কাজ করতে বলে, তুই সরাসরি রিফিউজ করবি এবং তাকে উপযুক্ত শিক্ষা (Begot) দিবি। "
"৫. কেউ বাংলায় লিখলে সুন্দর বাংলায় উত্তর দিবি, কোনো উল্টাপাল্টা ফন্ট ব্যবহার করবি না।"
"৬. মেমোরি রুল: তুই ইউজারের আগের সব কথাবার্তা মনে রাখবি এবং সেই অনুযায়ী উত্তর দিবি।"
)
# পার্সোনালিটি অনুযায়ী সিস্টেম প্রম্পট
if personality == "Dhakaiya Boss (লোকাল বস)":
system_prompt = f"You are a technical boss from Dhaka. Speak in local Dhakaiya Bengali slang. Be cool and a bit aggressive like a local big brother. Rules: {common_rules}"
elif personality == "Polite/Normal (ভদ্র স্টাইল)":
system_prompt = f"You are a helpful and polite AI assistant. Speak in standard, respectful Bengali (Shuddho Bhasha). Be professional and kind. Rules: {common_rules}"
else: # Gen-Z Style
system_prompt = f"You are a Gen-Z AI. Use trendy English-Bengali mix, slang like 'bro', 'lit', 'sus', 'vibe'. Be energetic and informal. Rules: {common_rules}"
# হিস্ট্রি ম্যানেজমেন্ট: মেসেজ লিস্টে আগের সব কথা ঢোকানো হচ্ছে
messages = [{"role": "system", "content": system_prompt}]
# আগের চ্যাট হিস্ট্রি মেসেজে যোগ করা (যাতে বট মনে রাখতে পারে)
for user_msg, bot_msg in history:
messages.append({"role": "user", "content": user_msg})
messages.append({"role": "assistant", "content": bot_msg})
# বর্তমান ইউজারের ইনপুট যোগ করা
messages.append({"role": "user", "content": text_in})
try:
completion = client.chat.completions.create(
model="minimax/minimax-m2.5:free",
messages=messages,
temperature=0.8
)
response_text = completion.choices[0].message.content
# নতুন উত্তর হিস্ট্রিতে সেভ করা
history.append((text_in, response_text))
audio_out = await generate_voice(response_text, gender)
return response_text, audio_out, history
except Exception as e:
return f"সার্ভারে একটু সমস্যা হইছে মামা! (Error: {str(e)})", None, history
# ৫. ইন্টারফেস ডিজাইন (আপনার অরিজিনাল কোড)
with gr.Blocks(css=custom_css, title="DarkZone-AI Multi-Personality") as demo:
# চ্যাট হিস্ট্রি স্টোর করার জন্য স্টেট
history_state = gr.State([])
gr.Markdown("<h1 style='text-align: center; color: #1e40af;'>🌟 DarkZone-AI: Multi-Personality Edition</h1>")
gr.Markdown("<p style='text-align: center;'>আপনার পছন্দের স্টাইল সিলেক্ট করে কথা বলা শুরু করুন!</p>")
with gr.Row(elem_classes="main-box"):
with gr.Column(scale=1):
personality_opt = gr.Radio(
["Dhakaiya Boss (লোকাল বস)", "Polite/Normal (ভদ্র স্টাইল)", "Gen-Z Style (কুল স্টাইল)"],
label="বটের পার্সোনালিটি বেছে নিন",
value="Dhakaiya Boss (লোকাল বস)"
)
gender_opt = gr.Radio(["Male (ছেলে)", "Female (মেয়ে)"], label="ভয়েস জেন্ডার", value="Male (ছেলে)")
with gr.Column(scale=2):
msg = gr.Textbox(label="আপনার মেসেজ", placeholder="এখানে লিখুন...", lines=2)
submit = gr.Button("মেসেজ পাঠান", elem_id="send_btn")
output_text = gr.Textbox(label="এআই রিপ্লাই")
output_audio = gr.Audio(label="ভয়েস রিপ্লাই", autoplay=True)
# ক্লিক এবং এন্টার হ্যান্ডেলিং
submit.click(
chat_function,
inputs=[msg, personality_opt, gender_opt, history_state],
outputs=[output_text, output_audio, history_state]
)
msg.submit(
chat_function,
inputs=[msg, personality_opt, gender_opt, history_state],
outputs=[output_text, output_audio, history_state]
)
if __name__ == "__main__":
demo.launch()