feat: complete customer service safety and handover flow
This commit is contained in:
@@ -13,6 +13,10 @@ class AgentRequestMetadata(BaseModel):
|
||||
ui_entry: str | None = None
|
||||
# 仅由受理服务写入 Outbox,客户端 API 不接收该字段。
|
||||
chitchat_streak: int = Field(default=0, ge=0, le=5)
|
||||
# 客服澄清轮次只来自服务端会话行,客户端不得提交或覆盖。
|
||||
clarification_round: int = Field(default=0, ge=0, le=2)
|
||||
# 仅供客服在当前短期会话内消解指代的已脱敏上下文,不是长期记忆或客户画像。
|
||||
session_context: tuple[str, ...] = Field(default_factory=tuple, max_length=6)
|
||||
|
||||
|
||||
class AgentRequest(BaseModel):
|
||||
@@ -63,6 +67,8 @@ class AgentDefinition(BaseModel):
|
||||
allowed_portals: tuple[str, ...] = ()
|
||||
supported_intents: tuple[str, ...] = ("general",)
|
||||
requires_model_intent_classification: bool = True
|
||||
# 长期/画像记忆属于客户数据能力;默认保留既有 Agent 行为,客服需显式关闭。
|
||||
recalls_customer_memory: bool = True
|
||||
|
||||
|
||||
class ResolvedAgentConfig(BaseModel):
|
||||
@@ -118,6 +124,8 @@ class CoreResult(BaseModel):
|
||||
intent: IntentResult | None = None
|
||||
source_references: tuple[SourceReference, ...] = ()
|
||||
tool_calls: tuple[ToolCallRecord, ...] = ()
|
||||
# 请求澄清时由持久化层安全递增会话轮次;达到上限后必须改为人工转接。
|
||||
clarification_required: bool = False
|
||||
transfer_required: bool = False
|
||||
transfer_reason: str | None = None
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
"""客服会话落库前的敏感凭据最小化处理。"""
|
||||
|
||||
import re
|
||||
|
||||
# 替换顺序从带业务语义的凭据开始,避免通用数字规则先破坏上下文。
|
||||
_SENSITIVE_PATTERNS: tuple[tuple[re.Pattern[str], str], ...] = (
|
||||
(re.compile(r"(?i)((?:登录|交易)?密码)\s*(?:[::=]|是)\s*[^\s,。;,;]{1,64}"), r"\1[已隐藏]"),
|
||||
(re.compile(r"(?i)((?:登录|交易)?密码)\s*\d{4,32}"), r"\1[已隐藏]"),
|
||||
(re.compile(r"(?i)(验证码|短信码|校验码)\s*(?:[::=]|是)?\s*\d{4,8}"), r"\1[已隐藏]"),
|
||||
(re.compile(r"(?<!\d)\d{17}[\dXx](?!\d)"), "[证件号已隐藏]"),
|
||||
(re.compile(r"(?<!\d)(?:\d[ -]?){15,18}\d(?!\d)"), "[银行卡号已隐藏]"),
|
||||
(re.compile(r"(?<!\d)1[3-9]\d{9}(?!\d)"), "[手机号已隐藏]"),
|
||||
)
|
||||
|
||||
def sanitize_customer_service_message(message: str) -> str:
|
||||
"""保留风险关键词,移除不应进入会话、Outbox 或后续 Redis 的凭据值。"""
|
||||
sanitized = message
|
||||
for pattern, replacement in _SENSITIVE_PATTERNS:
|
||||
sanitized = pattern.sub(replacement, sanitized)
|
||||
return sanitized
|
||||
Reference in New Issue
Block a user