fix: transfer when customer asks for payment link

This commit is contained in:
2026-03-12 15:28:05 +08:00
parent f3e8ea16c6
commit 823f5eac76

View File

@@ -85,6 +85,19 @@ _IMAGE_ALREADY_SENT_HINT_KEYWORDS = (
"上面有图", "上面有图",
) )
_PAYMENT_LINK_REQUEST_KEYWORDS = (
"付款链接",
"支付链接",
"拍单链接",
"下单链接",
"付款吧",
"发我链接",
"发个链接",
"发下链接",
"发一下链接",
"给我链接",
)
def _clip(text: str, limit: int = 1200) -> str: def _clip(text: str, limit: int = 1200) -> str:
if text is None: if text is None:
@@ -192,6 +205,15 @@ def _customer_claims_image_already_sent(current_text: str, history: Optional[Lis
return any(keyword in text for keyword in _IMAGE_ALREADY_SENT_HINT_KEYWORDS) return any(keyword in text for keyword in _IMAGE_ALREADY_SENT_HINT_KEYWORDS)
def _requests_payment_link(current_text: str, history: Optional[List[dict]] = None) -> bool:
text = _normalize_text(current_text)
if not text:
return False
if any(keyword in text for keyword in _PAYMENT_LINK_REQUEST_KEYWORDS):
return True
return ("付款" in text or "支付" in text or "拍单" in text or "下单" in text) and "链接" in text
class CustomerServiceBrain: class CustomerServiceBrain:
""" """
重构后的单一 Agent 大脑: 重构后的单一 Agent 大脑:
@@ -248,16 +270,17 @@ class CustomerServiceBrain:
"3. **非业务问题**:如果客户问招聘、合作、闲聊等与做图无关的话题,礼貌拒绝。\n" "3. **非业务问题**:如果客户问招聘、合作、闲聊等与做图无关的话题,礼貌拒绝。\n"
"4. **客户说没有参考图**:直接转人工:'好的,我这就叫设计师帮您找哈'\n" "4. **客户说没有参考图**:直接转人工:'好的,我这就叫设计师帮您找哈'\n"
"5. **客户问尺寸/能否打印/退款**:直接转人工:'这个设计师帮您看下哈'\n" "5. **客户问尺寸/能否打印/退款**:直接转人工:'这个设计师帮您看下哈'\n"
"6. **转接时机(严格两步)**:必须同时满足【有图】+【客户明确或可直接判断的需求】才能转接\n" "6. **付款链接特判**:客户明确说'发付款链接''支付链接''拍单链接''下单链接'时,视为强成交信号,必须立即调用转人工工具;严禁只回复'直接下单'\n"
"7. **转接时机(严格两步)**:除付款链接特判外,必须同时满足【有图】+【客户明确或可直接判断的需求】才能转接。\n"
" 客户只发了图但没说需求 → 先问'亲亲这张是找原图还是修复哈?'\n" " 客户只发了图但没说需求 → 先问'亲亲这张是找原图还是修复哈?'\n"
" 客户说了'有吗''能找吗''找图''找原图''有大图吗' → 直接按【找原图】意图处理,不要重复追问。\n" " 客户说了'有吗''能找吗''找图''找原图''有大图吗' → 直接按【找原图】意图处理,不要重复追问。\n"
" 客户说了'修复''高清''清晰点''放大清晰' → 直接按【高清修复】意图处理,不要重复追问。\n" " 客户说了'修复''高清''清晰点''放大清晰' → 直接按【高清修复】意图处理,不要重复追问。\n"
"7. **下线安抚**只有工具返回ERROR时才能提设计师不在。根据错误码区分\n" "8. **下线安抚**只有工具返回ERROR时才能提设计师不在。根据错误码区分\n"
" - ERROR_DESIGNER_NOT_STARTED → 说'还没上班,记下了上班马上处理'(严禁说下班)\n" " - ERROR_DESIGNER_NOT_STARTED → 说'还没上班,记下了上班马上处理'(严禁说下班)\n"
" - ERROR_DESIGNER_OFFLINE → 说'下班了,需求记下明天回'\n" " - ERROR_DESIGNER_OFFLINE → 说'下班了,需求记下明天回'\n"
" - ERROR_DESIGNER_BUSY → 说'稍等,我帮你联系下'(严禁说下班)\n" " - ERROR_DESIGNER_BUSY → 说'稍等,我帮你联系下'(严禁说下班)\n"
"8. 正在转接中:如果系统提示已在转接,回:'已经在帮你催了哈,稍等下!'\n" "9. 正在转接中:如果系统提示已在转接,回:'已经在帮你催了哈,稍等下!'\n"
"9. **每次转接必须调用工具**:不要猜测,每次都重新调用。\n\n" "10. **每次转接必须调用工具**:不要猜测,每次都重新调用。\n\n"
"【情绪识别与应急转人工】\n" "【情绪识别与应急转人工】\n"
"当客户出现以下信号时,立即调用转人工工具,不要继续机械回复:\n" "当客户出现以下信号时,立即调用转人工工具,不要继续机械回复:\n"
@@ -296,6 +319,13 @@ class CustomerServiceBrain:
try: try:
user_content = msg.content or "" user_content = msg.content or ""
if _requests_payment_link(user_content, history):
user_content = (
"【系统通知:客户正在明确索要付款/支付链接,这是强成交信号。"
"不要只回复'直接下单''平台拍单',必须立即调用转人工工具转接设计师跟进付款。】\n"
f"{user_content}"
)
# 客户已发图:告知 AI 图已收到,引导问需求,但不要直接转接 # 客户已发图:告知 AI 图已收到,引导问需求,但不要直接转接
has_image_message = bool(msg.image_urls) or msg.msg_type == 1 has_image_message = bool(msg.image_urls) or msg.msg_type == 1
if not has_image_message and _customer_claims_image_already_sent(user_content, history): if not has_image_message and _customer_claims_image_already_sent(user_content, history):