From 311124bc9b2c0fd9e84720afdd240f6696d9897f Mon Sep 17 00:00:00 2001 From: jimi <1847930177@qq.com> Date: Sun, 15 Mar 2026 15:54:33 +0800 Subject: [PATCH] fix: transfer on file handoff messages --- core/pydantic_ai_agent_v2.py | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/core/pydantic_ai_agent_v2.py b/core/pydantic_ai_agent_v2.py index 36b89df..4a09cf6 100644 --- a/core/pydantic_ai_agent_v2.py +++ b/core/pydantic_ai_agent_v2.py @@ -99,6 +99,20 @@ _PAYMENT_LINK_REQUEST_KEYWORDS = ( "给我链接", ) +_FILE_HANDOFF_TRANSFER_KEYWORDS = ( + "发送文件了看到了吗", + "发文件了看到了吗", + "文件发了看到了吗", + "文件收到了吗", + "文件收到没", + "文件看到了吗", + "我把文件发过去了", + "文件发过去了", + "给你发文件了", + "源文件发过去了", + "文件发你了", +) + _DESIGNER_SCHEDULE_QUESTION_KEYWORDS = ( "几点上班", "什么时候上班", @@ -273,6 +287,19 @@ def _requests_payment_link(current_text: str, history: Optional[List[dict]] = No return ("付款" in text or "支付" in text or "拍单" in text or "下单" in text) and "链接" in text +def _requests_file_handoff_transfer(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 _FILE_HANDOFF_TRANSFER_KEYWORDS): + return True + + has_file_signal = "文件" in text or "源文件" in text + has_delivery_signal = any(token in text for token in ("发了", "发送了", "发过去", "发你", "给你发")) + has_receipt_signal = any(token in text for token in ("看到了吗", "收到了吗", "收到没", "看见了吗", "收到吗")) + return has_file_signal and (has_delivery_signal or has_receipt_signal) + + def _asks_designer_schedule(current_text: str, history: Optional[List[dict]] = None) -> bool: text = _normalize_text(current_text) if not text: @@ -341,10 +368,11 @@ class CustomerServiceBrain: "6. **付款链接特判**:客户明确说'发付款链接'、'支付链接'、'拍单链接'、'下单链接'时,视为强成交信号,必须立即调用转人工工具;严禁只回复'直接下单'。\n" "7. **设计师上班时间特判**:客户问'几点上班'、'什么时候上班'、'设计师在吗'、'什么时候在线'时,默认是在问设计师。不要按闲聊处理,也不要回复'我只处理业务'。\n" " 设计师固定是早上9点上班,12点下班。应结合当前时间自然回答,不要机械复读。\n" - "8. **转接时机(严格两步)**:除付款链接特判外,必须同时满足【有图】+【客户明确或可直接判断的需求】才能转接。\n" + "8. **转接时机(严格两步)**:除付款链接特判、文件交接特判外,必须同时满足【有图】+【客户明确或可直接判断的需求】才能转接。\n" " 客户只发了图但没说需求 → 先问'亲亲这张是找原图还是修复哈?'\n" " 客户说了'有吗'、'能找吗'、'找图'、'找原图'、'有大图吗' → 直接按【找原图】意图处理,不要重复追问。\n" " 客户说了'修复'、'高清'、'清晰点'、'放大清晰' → 直接按【高清修复】意图处理,不要重复追问。\n" + " 客户说'文件发过去了'、'发送文件了看到了吗'、'源文件发你了'这类文件交接话术 → 视为设计师成品/文件交接场景,必须立即调用转人工工具,不要再问客户发图或问需求。\n" "9. **下线安抚**:只有工具返回ERROR时才能提设计师不在。根据错误码区分:\n" " - ERROR_DESIGNER_NOT_STARTED → 说'还没上班,记下了上班马上处理'(严禁说下班)\n" " - ERROR_DESIGNER_OFFLINE → 说'下班了,需求记下明天回'\n" @@ -395,6 +423,14 @@ class CustomerServiceBrain: "不要只回复'直接下单'或'平台拍单',必须立即调用转人工工具转接设计师跟进付款。】\n" f"{user_content}" ) + elif _requests_file_handoff_transfer(user_content, history): + logger.info(f"[Brain] 已识别为文件交接转接意图: user={msg.user_id}") + user_content = ( + "【系统通知:客户现在是在说文件已经发过去了、让你确认有没有看到。" + "这通常代表设计师已经做完或正在交接成品文件。" + "不要让客户重发图,不要继续问需求,必须立即调用转人工工具转接设计师跟进文件交接。】\n" + f"{user_content}" + ) elif _asks_designer_schedule(user_content, history): now_dt = datetime.now() user_content = (