1yahoo commited on
Commit
ee1ea3a
·
verified ·
1 Parent(s): 8a3b8db

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -24
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
- اطرح سؤالاً على المستخدم هل يريد البدء كـ 'كلاين' أم كـ 'شخصية' جديدة، وإن اختار شخصية جديدة وضح له أنه سيبدأ قبل 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,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 "⚠️ يرجى تسجيل الدخول عبر زر 'Login with Hugging Face' بالأعلى لاستخدام رصيدك."
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"❌ خطأ في الاتصال: {str(e)}"
93
 
94
- # --- 4. واجهة Gradio ---
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__":