MuhammadMahmoud commited on
Commit
06bb2e7
·
1 Parent(s): 2c46267

enhance system prompt

Browse files
app/services/chat/config/prompts.py CHANGED
@@ -47,7 +47,8 @@ SYSTEM_INSTRUCTION = """
47
  4. **منع إنشاء الطلبات:** إذا طلب المستخدم تقديم أو رفع أو إنشاء طلب مساعدة جديد من خلالك، أخبره بلطف أن هذا يتطلب رفع أوراق رسمية عبر صفحة (تقديم طلب جديد) في الموقع، وإعرض عليه استعراض المستندات المطلوبة. إياك أن توافق على إنشاء الطلب.
48
  5. **سياق مفقود:** إذا كان سؤال المستخدم قصيراً أو مبهماً (مثل "بيانات إيه" أو "كيف") ولا يوجد سياق متصل يوضح قصده، إياك أن تستدعي أي أداة وتخمن، بل اعتذر بلطف واطلب منه توضيح سؤاله بوضوح.
49
  6. لا ترفض أبداً سؤالاً يخص المنصة. دائماً ساعد المستخدم أو وجهه.
50
- 7. إياك أن ترد على المستخدم بكود برمجي أو باسم الأداة (مثل `<function=...>` أو `get_detailed_requests`). دائماً تحدث للمستخدم بلغة عربية طبيعية كأنك إنسان.
 
51
 
52
  ---
53
  ## الهوية
 
47
  4. **منع إنشاء الطلبات:** إذا طلب المستخدم تقديم أو رفع أو إنشاء طلب مساعدة جديد من خلالك، أخبره بلطف أن هذا يتطلب رفع أوراق رسمية عبر صفحة (تقديم طلب جديد) في الموقع، وإعرض عليه استعراض المستندات المطلوبة. إياك أن توافق على إنشاء الطلب.
48
  5. **سياق مفقود:** إذا كان سؤال المستخدم قصيراً أو مبهماً (مثل "بيانات إيه" أو "كيف") ولا يوجد سياق متصل يوضح قصده، إياك أن تستدعي أي أداة وتخمن، بل اعتذر بلطف واطلب منه توضيح سؤاله بوضوح.
49
  6. لا ترفض أبداً سؤالاً يخص المنصة. دائماً ساعد المستخدم أو وجهه.
50
+ 7. **إياك** أن ترد على المستخدم بكود برمجي أو باسم الأداة الداخلية إطلاقاً (مثل `<function=...>` أو `get_detailed_requests`).
51
+ 8. **لا** تتحدث كـ "روبوت تقني" (مثال خاطئ: "باستخدام أداة كذا، وجدت أن حالتك Pending"). تحدث بلغة عربية طبيعية وودودة (مثال صحيح: "😊 راجعت النظام، ولقيت إن طلبك الأخير رقم 123 حالة مراجعته: قيد الانتظار").
52
 
53
  ---
54
  ## الهوية
app/services/chat/utils/text_cleaner.py CHANGED
@@ -30,4 +30,15 @@ def clean_text(text: str) -> str:
30
  # But keep full English words like "Dashboard" or "API"
31
  text = re.sub(r'(?<=[\u0600-\u06FF])[a-zA-Z]{1,3}(?=[\u0600-\u06FF])', '', text)
32
 
 
 
 
 
 
 
 
 
 
 
 
33
  return text
 
30
  # But keep full English words like "Dashboard" or "API"
31
  text = re.sub(r'(?<=[\u0600-\u06FF])[a-zA-Z]{1,3}(?=[\u0600-\u06FF])', '', text)
32
 
33
+ # Step 3: Remove LLM tool call leaks if they appear in text (e.g. <function=...>)
34
+ text = re.sub(r'<?function=[^>]+>?', '', text)
35
+
36
+ # Step 4: Remove direct mentions of tool names with underscores
37
+ tools_pattern = r'\b(?:get_request_status|get_family_requests_summary|get_required_documents|calculate_eligibility|cancel_request|update_family_info|get_family_profile|get_detailed_requests|get_association_analytics)\b'
38
+ text = re.sub(tools_pattern, '', text)
39
+
40
+ # Step 5: Clean up empty parentheses left behind like () or ( )
41
+ text = re.sub(r'\(\s*\)', '', text)
42
+
43
+
44
  return text
app/services/tools/tool_executor.py CHANGED
@@ -39,6 +39,20 @@ class ToolExecutor:
39
  headers["X-Family-Id"] = str(family_id).strip()
40
  return headers
41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  @staticmethod
43
  def _unwrap_api_envelope(data: Any) -> Any:
44
  if isinstance(data, dict) and "data" in data:
@@ -102,7 +116,7 @@ class ToolExecutor:
102
  return payload
103
  return {
104
  "request_id": request_id,
105
- "status": payload.get("status"),
106
  "need_score": payload.get("needScore"),
107
  "priority_score": payload.get("priorityScore"),
108
  "created_at": payload.get("createdAt"),
@@ -200,8 +214,15 @@ class ToolExecutor:
200
  payload = await self._call("GET", "/api/Requests", args, params=params)
201
  if "error" in payload:
202
  return payload
 
 
 
 
 
 
 
203
  return {
204
- "requests": payload.get("items", payload.get("data", payload)),
205
  "note": "Showing up to 5 recent requests"
206
  }
207
 
 
39
  headers["X-Family-Id"] = str(family_id).strip()
40
  return headers
41
 
42
+ def _translate_status(self, status: Any) -> Any:
43
+ if not status or not isinstance(status, str):
44
+ return status
45
+ status_map = {
46
+ "pending": "قيد الانتظار",
47
+ "inreview": "تحت المراجعة",
48
+ "approved": "مقبول",
49
+ "rejected": "مرفوض",
50
+ "completed": "مكتمل",
51
+ "cancelled": "ملغى",
52
+ "canceled": "ملغى",
53
+ }
54
+ return status_map.get(status.lower(), status)
55
+
56
  @staticmethod
57
  def _unwrap_api_envelope(data: Any) -> Any:
58
  if isinstance(data, dict) and "data" in data:
 
116
  return payload
117
  return {
118
  "request_id": request_id,
119
+ "status": self._translate_status(payload.get("status")),
120
  "need_score": payload.get("needScore"),
121
  "priority_score": payload.get("priorityScore"),
122
  "created_at": payload.get("createdAt"),
 
214
  payload = await self._call("GET", "/api/Requests", args, params=params)
215
  if "error" in payload:
216
  return payload
217
+
218
+ items = payload.get("items", payload.get("data", payload))
219
+ if isinstance(items, list):
220
+ for item in items:
221
+ if isinstance(item, dict) and "status" in item:
222
+ item["status"] = self._translate_status(item["status"])
223
+
224
  return {
225
+ "requests": items,
226
  "note": "Showing up to 5 recent requests"
227
  }
228