Spaces:
Running
Running
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":
|
| 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 |
|