Update app.py
Browse files
app.py
CHANGED
|
@@ -12,24 +12,24 @@ supabase: Client = create_client(URL, KEY)
|
|
| 12 |
|
| 13 |
model_st = SentenceTransformer('all-MiniLM-L6-v2')
|
| 14 |
DEFAULT_MODEL = "MiniMaxAI/MiniMax-M2.1"
|
|
|
|
|
|
|
| 15 |
DEFAULT_SYSTEM = """أنت محرك رواية تفاعلية 'لورد الغوامض' متطور وخبير في ألعاب الأدوار (RPG). مهمتك هي سرد قصة حية وتفاعلية بناءً على قراراتي.
|
| 16 |
1. أسلوب السرد:
|
| 17 |
استخدم أسلوب السرد الوصفي العميق (Show, Don't Tell). ركز على الحواس: الروائح، الأصوات، برودة الهواء، وتعبيرات الوجوه.
|
| 18 |
-
حافظ على نبرة سوداوية م
|
| 19 |
-
اكتب بضمير المخاطب "أنت".
|
| 20 |
2. القواعد التفاعلية:
|
| 21 |
لا تتحدث أبداً بلسان شخصيتي. انتظر قراراتي وردود أفعالي.
|
| 22 |
-
ان
|
| 23 |
-
اجعل العالم يستجيب لقراراتي؛
|
| 24 |
3. إدارة العالم والشخصيات:
|
| 25 |
-
احتفظ بـ "سجل حي" في ذاكرتك لكل الشخصيات ال
|
| 26 |
-
التزم بالمنطق الداخلي للعالم (السحر له ثمن، وفقدان العقل خطر دائم).
|
| 27 |
4. تعليمات السياق الضخم:
|
| 28 |
-
تذكر التفاصيل الدقيقة واستخدمها كعناصر مفاجئة
|
| 29 |
تعليمات البداية:
|
| 30 |
-
ا
|
| 31 |
|
| 32 |
-
# --- 2.
|
| 33 |
def get_brain_context(query, selected_volume):
|
| 34 |
try:
|
| 35 |
vol_res = supabase.table("novel_vault_v3").select("metadata->>text").eq("metadata->>source", selected_volume).execute()
|
|
@@ -52,13 +52,12 @@ def get_brain_context(query, selected_volume):
|
|
| 52 |
except:
|
| 53 |
return "", ""
|
| 54 |
|
| 55 |
-
# --- 3. دالة التنبؤ (تستخدم توكن
|
| 56 |
def predict(message, history, system_prompt, model_id, selected_volume, request: gr.Request):
|
| 57 |
-
# هنا يتم جلب التوكن من حساب المستخدم المسجل في HF تلقائياً
|
| 58 |
token = request.auth_token if request else None
|
| 59 |
|
| 60 |
if not token:
|
| 61 |
-
yield "⚠️ يرجى تسجيل الدخول عبر
|
| 62 |
return
|
| 63 |
|
| 64 |
client = OpenAI(base_url="https://router.huggingface.co/v1", api_key=token)
|
|
@@ -66,14 +65,11 @@ def predict(message, history, system_prompt, model_id, selected_volume, request:
|
|
| 66 |
|
| 67 |
vol_text, other_text = get_brain_context(message, selected_volume)
|
| 68 |
|
| 69 |
-
|
| 70 |
-
context_injection = f"\n\n[FULL VOLUME CONTEXT]:\n{vol_text[:150000]}\n\n[RAG SEARCH]:\n{other_text}"
|
| 71 |
|
| 72 |
messages = [{"role": "system", "content": f"{system_prompt}{context_injection}"}]
|
| 73 |
-
|
| 74 |
for msg in history:
|
| 75 |
messages.append({"role": msg["role"], "content": msg["content"]})
|
| 76 |
-
|
| 77 |
messages.append({"role": "user", "content": message})
|
| 78 |
|
| 79 |
try:
|
|
@@ -89,21 +85,21 @@ def predict(message, history, system_prompt, model_id, selected_volume, request:
|
|
| 89 |
partial_message += chunk.choices[0].delta.content
|
| 90 |
yield partial_message
|
| 91 |
except Exception as e:
|
| 92 |
-
yield f"❌
|
| 93 |
|
| 94 |
-
# --- 4. واجهة
|
| 95 |
with gr.Blocks(fill_height=True) as demo:
|
| 96 |
with gr.Sidebar():
|
| 97 |
-
gr.Markdown("# 🕸️
|
| 98 |
-
gr.LoginButton()
|
| 99 |
|
| 100 |
vol_list = gr.Dropdown(
|
| 101 |
-
choices=["Volume1-Clown.pdf", "Volume2-Faceless.pdf", "Volume3-Traveler.pdf", "Volume4-Undying.pdf"],
|
| 102 |
label="📖 المجلد النشط",
|
| 103 |
value="Volume1-Clown.pdf"
|
| 104 |
)
|
| 105 |
|
| 106 |
-
with gr.Accordion("⚙️ الإعدادات", open=False):
|
| 107 |
model_input = gr.Textbox(label="Model ID", value=DEFAULT_MODEL)
|
| 108 |
system_input = gr.TextArea(label="System Prompt", value=DEFAULT_SYSTEM, lines=15)
|
| 109 |
|
|
@@ -111,8 +107,7 @@ with gr.Blocks(fill_height=True) as demo:
|
|
| 111 |
predict,
|
| 112 |
additional_inputs=[system_input, model_input, vol_list],
|
| 113 |
fill_height=True,
|
| 114 |
-
type="messages"
|
| 115 |
-
examples=[["ابدأ اللعبة"], ["من أنا؟"]]
|
| 116 |
)
|
| 117 |
|
| 118 |
if __name__ == "__main__":
|
|
|
|
| 12 |
|
| 13 |
model_st = SentenceTransformer('all-MiniLM-L6-v2')
|
| 14 |
DEFAULT_MODEL = "MiniMaxAI/MiniMax-M2.1"
|
| 15 |
+
|
| 16 |
+
# البرومت المحدث: حرية كاملة للمستخدم
|
| 17 |
DEFAULT_SYSTEM = """أنت محرك رواية تفاعلية 'لورد الغوامض' متطور وخبير في ألعاب الأدوار (RPG). مهمتك هي سرد قصة حية وتفاعلية بناءً على قراراتي.
|
| 18 |
1. أسلوب السرد:
|
| 19 |
استخدم أسلوب السرد الوصفي العميق (Show, Don't Tell). ركز على الحواس: الروائح، الأصوات، برودة الهواء، وتعبيرات الوجوه.
|
| 20 |
+
اكتب بضمير المخاطب "أنت". حافظ على نبرة سوداوية وغموض ملحمي.
|
|
|
|
| 21 |
2. القواعد التفاعلية:
|
| 22 |
لا تتحدث أبداً بلسان شخصيتي. انتظر قراراتي وردود أفعالي.
|
| 23 |
+
لا تقيدني بخيارات محددة (مثل 1، 2، 3). بدلاً من ذلك، صف الموقف بدقة وجمال، وانهِ ردك بترك المجال لي لأقرر ما سأفعله بكل حرية. العالم مفتوح تماماً لتصرفاتي.
|
| 24 |
+
اجعل العالم يستجيب لقراراتي؛ كل فعل أقوم به له تبعات ومنطق داخل الرواية.
|
| 25 |
3. إدارة العالم والشخصيات:
|
| 26 |
+
احتفظ بـ "سجل حي" في ذاكرتك لكل الشخصيات والمواقع. التزم بمنطق الرواية (السحر له ثمن، وفقدان العقل خطر دائم).
|
|
|
|
| 27 |
4. تعليمات السياق الضخم:
|
| 28 |
+
تذكر التفاصيل الدقيقة التي ذكرتها سابقاً واستخدمها كعناصر مفاجئة. راقب التطور النفسي لشخصيتي.
|
| 29 |
تعليمات البداية:
|
| 30 |
+
ابدأ بسؤالي: هل أريد البدء كـ 'كلاين' أم كـ 'شخصية' جديدة؟ إذا اخترت شخصية جديدة، وضح لي أنني سأبدأ قبل 10 أيام من انتقال كلاين لهذا العالم."""
|
| 31 |
|
| 32 |
+
# --- 2. دالة جلب البيانات ---
|
| 33 |
def get_brain_context(query, selected_volume):
|
| 34 |
try:
|
| 35 |
vol_res = supabase.table("novel_vault_v3").select("metadata->>text").eq("metadata->>source", selected_volume).execute()
|
|
|
|
| 52 |
except:
|
| 53 |
return "", ""
|
| 54 |
|
| 55 |
+
# --- 3. دالة التنبؤ (تستخدم OAuth التوكن تلقائياً) ---
|
| 56 |
def predict(message, history, system_prompt, model_id, selected_volume, request: gr.Request):
|
|
|
|
| 57 |
token = request.auth_token if request else None
|
| 58 |
|
| 59 |
if not token:
|
| 60 |
+
yield "⚠️ يرجى تسجيل الدخول عبر (Login with Hugging Face) بالأعلى لاستخدام حسابك في تشغيل النموذج."
|
| 61 |
return
|
| 62 |
|
| 63 |
client = OpenAI(base_url="https://router.huggingface.co/v1", api_key=token)
|
|
|
|
| 65 |
|
| 66 |
vol_text, other_text = get_brain_context(message, selected_volume)
|
| 67 |
|
| 68 |
+
context_injection = f"\n\n[FULL VOLUME CONTEXT]:\n{vol_text[:150000]}\n\n[GLOBAL KNOWLEDGE]:\n{other_text}"
|
|
|
|
| 69 |
|
| 70 |
messages = [{"role": "system", "content": f"{system_prompt}{context_injection}"}]
|
|
|
|
| 71 |
for msg in history:
|
| 72 |
messages.append({"role": msg["role"], "content": msg["content"]})
|
|
|
|
| 73 |
messages.append({"role": "user", "content": message})
|
| 74 |
|
| 75 |
try:
|
|
|
|
| 85 |
partial_message += chunk.choices[0].delta.content
|
| 86 |
yield partial_message
|
| 87 |
except Exception as e:
|
| 88 |
+
yield f"❌ فشل المحرك: {str(e)}"
|
| 89 |
|
| 90 |
+
# --- 4. الواجهة ---
|
| 91 |
with gr.Blocks(fill_height=True) as demo:
|
| 92 |
with gr.Sidebar():
|
| 93 |
+
gr.Markdown("# 🕸️ دهليز لورد الغوامض V3")
|
| 94 |
+
gr.LoginButton()
|
| 95 |
|
| 96 |
vol_list = gr.Dropdown(
|
| 97 |
+
choices=["Volume1-Clown.pdf", "Volume2-Faceless.pdf", "Volume3-Traveler.pdf", "Volume4-Undying.pdf", "Volume 5- Red Priest.pdf", "Volume 6- Lightseeker.pdf", "Volume 7- The Hanged Man.pdf", "Volume 8- Fool.pdf"],
|
| 98 |
label="📖 المجلد النشط",
|
| 99 |
value="Volume1-Clown.pdf"
|
| 100 |
)
|
| 101 |
|
| 102 |
+
with gr.Accordion("⚙️ الإعدادات المتقدمة", open=False):
|
| 103 |
model_input = gr.Textbox(label="Model ID", value=DEFAULT_MODEL)
|
| 104 |
system_input = gr.TextArea(label="System Prompt", value=DEFAULT_SYSTEM, lines=15)
|
| 105 |
|
|
|
|
| 107 |
predict,
|
| 108 |
additional_inputs=[system_input, model_input, vol_list],
|
| 109 |
fill_height=True,
|
| 110 |
+
type="messages"
|
|
|
|
| 111 |
)
|
| 112 |
|
| 113 |
if __name__ == "__main__":
|