fix duplicate message
Browse files- app/facebook.py +2 -1
- app/main.py +10 -6
app/facebook.py
CHANGED
|
@@ -54,6 +54,8 @@ class FacebookClient:
|
|
| 54 |
Input: page_access_token (str), recipient_id (str), message (str)
|
| 55 |
Output: dict (response từ Facebook API)
|
| 56 |
"""
|
|
|
|
|
|
|
| 57 |
url = f"https://graph.facebook.com/v18.0/me/messages?access_token={page_access_token}"
|
| 58 |
|
| 59 |
payload = {
|
|
@@ -62,7 +64,6 @@ class FacebookClient:
|
|
| 62 |
}
|
| 63 |
|
| 64 |
try:
|
| 65 |
-
logger.debug(f"Đang gửi tin nhắn đến Facebook Messenger....\n\t{message}")
|
| 66 |
response = await self._client.post(url, json=payload)
|
| 67 |
response.raise_for_status()
|
| 68 |
return response.json()
|
|
|
|
| 54 |
Input: page_access_token (str), recipient_id (str), message (str)
|
| 55 |
Output: dict (response từ Facebook API)
|
| 56 |
"""
|
| 57 |
+
|
| 58 |
+
logger.debug(f"Đang gửi tin nhắn đến Facebook Messenger....\n\t{message}")
|
| 59 |
url = f"https://graph.facebook.com/v18.0/me/messages?access_token={page_access_token}"
|
| 60 |
|
| 61 |
payload = {
|
|
|
|
| 64 |
}
|
| 65 |
|
| 66 |
try:
|
|
|
|
| 67 |
response = await self._client.post(url, json=payload)
|
| 68 |
response.raise_for_status()
|
| 69 |
return response.json()
|
app/main.py
CHANGED
|
@@ -286,7 +286,9 @@ async def process_message(message_data: Dict[str, Any]):
|
|
| 286 |
hanh_vi_vi_pham = hanh_vi_vi_pham.strip()
|
| 287 |
|
| 288 |
logger.info(f"[DEBUG] Phương tiện: {keywords} - Hành vi: {hanh_vi_vi_pham} - Mục đích: {muc_dich}")
|
| 289 |
-
|
|
|
|
|
|
|
| 290 |
# 4. Update lại conversation với thông tin đầy đủ
|
| 291 |
update_kwargs = {
|
| 292 |
'conversation_id': conv['conversation_id'],
|
|
@@ -310,10 +312,10 @@ async def process_message(message_data: Dict[str, Any]):
|
|
| 310 |
# 5. Xử lý logic nghiệp vụ
|
| 311 |
response = await process_business_logic(conv, page_token)
|
| 312 |
logger.info(f"[DEBUG] Message history sau khi process: {conv}")
|
| 313 |
-
|
| 314 |
# 6. Gửi response và cập nhật final state
|
| 315 |
await facebook_client.send_message(page_token, sender_id, response)
|
| 316 |
-
await loop.run_in_executor(executor, lambda: sheets_client.log_conversation(**
|
| 317 |
return
|
| 318 |
|
| 319 |
async def process_business_logic(log_kwargs: Dict[str, Any], page_token: str) -> str:
|
|
@@ -423,9 +425,9 @@ async def format_search_results(question: str, matches: List[Dict[str, Any]]) ->
|
|
| 423 |
prompt = (
|
| 424 |
"Bạn là một trợ lý AI có kiến thức pháp luật, hãy trả lời câu hỏi dựa trên các đoạn luật sau. "
|
| 425 |
"Chỉ sử dụng thông tin có trong các đoạn, không tự đoán.\n"
|
| 426 |
-
f"
|
| 427 |
-
"\nHãy trả lời ngắn gọn, dễ hiểu, trích dẫn rõ ràng thông tin từ các đoạn luật nếu cần."
|
| 428 |
-
f"\nCâu hỏi của người dùng: {question}\n"
|
| 429 |
)
|
| 430 |
|
| 431 |
logger.info(f"[DEBUG] prompt:\n {prompt}")
|
|
@@ -435,6 +437,8 @@ async def format_search_results(question: str, matches: List[Dict[str, Any]]) ->
|
|
| 435 |
answer = await llm_client.generate_text(prompt)
|
| 436 |
if answer and answer.strip():
|
| 437 |
return answer.strip()
|
|
|
|
|
|
|
| 438 |
except Exception as e:
|
| 439 |
logger.error(f"LLM không sẵn sàng: {e}\n{traceback.format_exc()}")
|
| 440 |
# Fallback: trả về tổng hợp các đoạn luật như cũ
|
|
|
|
| 286 |
hanh_vi_vi_pham = hanh_vi_vi_pham.strip()
|
| 287 |
|
| 288 |
logger.info(f"[DEBUG] Phương tiện: {keywords} - Hành vi: {hanh_vi_vi_pham} - Mục đích: {muc_dich}")
|
| 289 |
+
|
| 290 |
+
await facebook_client.send_message(page_token, sender_id, "Mình đang phân tích câu hỏi của bạn. Sắp xong rồi\nCảm ơn sự kiên nhẫn của bạn!")
|
| 291 |
+
|
| 292 |
# 4. Update lại conversation với thông tin đầy đủ
|
| 293 |
update_kwargs = {
|
| 294 |
'conversation_id': conv['conversation_id'],
|
|
|
|
| 312 |
# 5. Xử lý logic nghiệp vụ
|
| 313 |
response = await process_business_logic(conv, page_token)
|
| 314 |
logger.info(f"[DEBUG] Message history sau khi process: {conv}")
|
| 315 |
+
|
| 316 |
# 6. Gửi response và cập nhật final state
|
| 317 |
await facebook_client.send_message(page_token, sender_id, response)
|
| 318 |
+
await loop.run_in_executor(executor, lambda: sheets_client.log_conversation(**conv))
|
| 319 |
return
|
| 320 |
|
| 321 |
async def process_business_logic(log_kwargs: Dict[str, Any], page_token: str) -> str:
|
|
|
|
| 425 |
prompt = (
|
| 426 |
"Bạn là một trợ lý AI có kiến thức pháp luật, hãy trả lời câu hỏi dựa trên các đoạn luật sau. "
|
| 427 |
"Chỉ sử dụng thông tin có trong các đoạn, không tự đoán.\n"
|
| 428 |
+
f"\nCác đoạn luật liên quan:\n{full_result_text}"
|
| 429 |
+
"\n\nHãy trả lời ngắn gọn, dễ hiểu, trích dẫn rõ ràng thông tin từ các đoạn luật nếu cần."
|
| 430 |
+
f"\n\nCâu hỏi của người dùng: {question}\n"
|
| 431 |
)
|
| 432 |
|
| 433 |
logger.info(f"[DEBUG] prompt:\n {prompt}")
|
|
|
|
| 437 |
answer = await llm_client.generate_text(prompt)
|
| 438 |
if answer and answer.strip():
|
| 439 |
return answer.strip()
|
| 440 |
+
else:
|
| 441 |
+
logger.error(f"LLM không trả về câu trả lời phù hợp: \n\tanswer: {answer}")
|
| 442 |
except Exception as e:
|
| 443 |
logger.error(f"LLM không sẵn sàng: {e}\n{traceback.format_exc()}")
|
| 444 |
# Fallback: trả về tổng hợp các đoạn luật như cũ
|