空运「货交」只记提货地址,不再当成起运地。舱位旧说法「释放」先问航线是否取消,陆运通关口岸示例改为友谊关。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -35,12 +35,15 @@ logger = logging.getLogger(__name__)
|
||||
INTENT_ACTIVATE = "air_activate"
|
||||
INTENT_LOCK = "air_lock"
|
||||
INTENT_RELEASE = "air_release"
|
||||
# 说出和舱位有关的「释放」:先问是否取消,不直接执行。
|
||||
INTENT_RELEASE_ASK = "air_release_ask"
|
||||
INTENT_PICK_OPTION = "air_pick_option"
|
||||
|
||||
_VALID = {
|
||||
INTENT_ACTIVATE,
|
||||
INTENT_LOCK,
|
||||
INTENT_RELEASE,
|
||||
INTENT_RELEASE_ASK,
|
||||
INTENT_PICK_OPTION,
|
||||
INTENT_FIELDS,
|
||||
INTENT_QUOTE,
|
||||
@@ -56,7 +59,10 @@ _VALID = {
|
||||
|
||||
# 相近说法回退,不是唯一口令。
|
||||
_LOCK_HINTS = ("锁舱", "锁仓", "锁定舱位", "锁住舱位", "帮我锁舱")
|
||||
_RELEASE_HINTS = ("释放舱位", "放舱", "解锁舱", "取消锁舱", "释放舱")
|
||||
# 这四句马上取消舱位。「释放舱位」不在这里。
|
||||
_RELEASE_DIRECT = ("取消舱位", "放舱", "解锁舱", "取消锁舱")
|
||||
_CONFIRM_YES = ("是", "需要", "确认")
|
||||
_CONFIRM_NO = ("不需要", "不用", "否")
|
||||
|
||||
|
||||
def is_missed_air_bot_at(text: str, *, room_already_air: bool = False) -> bool:
|
||||
@@ -154,10 +160,53 @@ def classify_air_group_text(
|
||||
return INTENT_OTHER
|
||||
|
||||
|
||||
def _compact_cabin_text(text: str) -> str:
|
||||
"""去掉空白,方便认「取消舱位」「释放舱位」。"""
|
||||
return (text or "").replace(" ", "").replace(" ", "")
|
||||
|
||||
|
||||
def cabin_release_kind(text: str) -> str:
|
||||
"""
|
||||
舱位取消怎么认。
|
||||
|
||||
direct:马上执行。ask:先问「是否需要取消舱位」。
|
||||
跟舱位有关的「释放」只问不办。没说舱位的「释放」不当取消。
|
||||
"""
|
||||
blob = _compact_cabin_text(text)
|
||||
# 「释放舱位」里含着「放舱」,必须先认释放,避免被放舱直接取消。
|
||||
if "释放" in blob and "舱" in blob:
|
||||
return "ask"
|
||||
if any(hint in blob for hint in _RELEASE_DIRECT):
|
||||
return "direct"
|
||||
return ""
|
||||
|
||||
|
||||
def cabin_confirm_answer(text: str) -> str:
|
||||
"""
|
||||
问过之后这一句是确认、否认,还是别的业务。
|
||||
|
||||
只认整句(可带工单号和 @)。「不需要」不能被看成「需要」。
|
||||
返回 yes / no / 空串。空串表示询问作废,调用方按原句继续办。
|
||||
"""
|
||||
raw = text or ""
|
||||
no = copy.extract_work_order_no(raw)
|
||||
rest = raw.replace(no, "").replace(no.lower(), "")
|
||||
rest = rest.replace("@询价小助手", "").replace("询价小助手", "")
|
||||
rest = "".join(ch for ch in rest if ch.isalnum() or "\u4e00" <= ch <= "\u9fff")
|
||||
if rest in _CONFIRM_NO:
|
||||
return "no"
|
||||
if rest in _CONFIRM_YES or rest == "取消舱位":
|
||||
return "yes"
|
||||
return ""
|
||||
|
||||
|
||||
def _hint_lock_or_release(text: str) -> str:
|
||||
blob = (text or "").replace(" ", "").replace(" ", "")
|
||||
if any(x in blob for x in _RELEASE_HINTS):
|
||||
kind = cabin_release_kind(text)
|
||||
if kind == "direct":
|
||||
return INTENT_RELEASE
|
||||
if kind == "ask":
|
||||
return INTENT_RELEASE_ASK
|
||||
blob = _compact_cabin_text(text)
|
||||
if any(x in blob for x in _LOCK_HINTS):
|
||||
return INTENT_LOCK
|
||||
return ""
|
||||
@@ -191,7 +240,8 @@ def _classify_with_model(text: str, settings) -> str:
|
||||
client = LlmHttpClient.from_settings(settings)
|
||||
system = (
|
||||
"你是空运协同群意图分类。只回复一个英文词,不要解释。"
|
||||
"air_lock=航线要锁舱;air_release=航线要释放舱位;"
|
||||
"air_lock=航线要锁舱;air_release=航线要取消舱位(取消舱位、放舱、解锁舱、取消锁舱);"
|
||||
"说出释放舱位、释放舱、把舱位释放了时不要回 air_release;"
|
||||
"air_activate=只是指定/切换工单号;"
|
||||
"air_pick_option=在补充或选择舱位编号、航司、航班号,写法不限;"
|
||||
"collab_fields=在补是否含电/是否含磁;"
|
||||
|
||||
Reference in New Issue
Block a user