This commit is contained in:
Your Name
2026-08-27 14:04:28 +08:00
parent f7720831be
commit 334890171e
3016 changed files with 263403 additions and 27971 deletions
+26 -1
View File
@@ -66,11 +66,25 @@ AI_TIMEOUT = 120 # 请求超时秒数(本地模型推理较慢,给
# ── MCP 工具增强(自动回复时调用外部 MCP Server)──
# True → 回复前连接 AI_MCP_SERVERS,把它们的 tools 交给模型按需调用,再生成最终回复
# ── 多模型编排 ────────────────────────────────────────────────────────────────
# 裁判模型:对生成出来的回复打一个绝对质量分和风险等级。
# shadow 照常发主模型的回复,评分只记录,不改变任何行为(默认)
# score_only 用评分和风险做路由(低分/高风险转审核),不做二选一
# arbitrate 完整的 best-of-N,按裁判选出的赢家发送
# 默认 shadow:先量出现有回复的真实水平,再决定要不要花第二份钱。
AI_JUDGE_ENABLED = False
AI_JUDGE_MODE = "shadow"
AI_MCP_ENABLED = False
AI_MCP_MAX_ROUNDS = 5 # 单次回复最多工具调用轮数
# 服务器列表示例见 mcp_bridge.py 文件头注释;也可在 GUI「MCP 服务器」里编辑
AI_MCP_SERVERS: list = []
# 选择性审核:命中下面任意一条规则的关键词,这一条回复才会停下来等人工确认,
# 没命中的照常自动发送。由后台「桌面端 → 客户端配置」统一下发,本机不编辑。
# 形状:[{"id": str, "label": str, "keywords": [str, ...], "enabled": bool}, ...]
AI_REVIEW_RULES: list = []
AI_MCP_PROMPT = """
【外部工具|已开启】
- 你可以使用系统提供的工具查询业务信息(如文档、挂号、库存、订单等)。
@@ -241,6 +255,8 @@ CONFIGURABLE_KEYS = [
"AI_COUNTER_INSULT_ENABLED", "AI_AGENT_NAME", "AI_HOSPITAL_NAME",
"AI_MAX_TOKENS", "AI_TEMPERATURE", "AI_TIMEOUT",
"AI_MCP_ENABLED", "AI_MCP_MAX_ROUNDS", "AI_MCP_SERVERS",
"AI_JUDGE_ENABLED", "AI_JUDGE_MODE",
"AI_REVIEW_RULES",
]
@@ -310,6 +326,12 @@ def apply_settings(settings: dict, *, persist: bool = True) -> dict:
applied = {}
for key in CONFIGURABLE_KEYS:
if key in settings:
# null 表示"后台没有这一项",不是"把它设成空"。直接赋值的话,本机
# 一个好好的布尔开关会变成 None,然后一路传下去:接口按 bool 校验
# 时报 422,日志里只有一句"Input should be a valid boolean",看不出
# 是配置文件里躺着个 null。而且它会自我延续——写回文件、下次再读进来。
if settings[key] is None:
continue
if key == "AI_AGENT_NAME":
AI_CLOUD_AGENT_NAME = str(settings[key] or "").strip() or "客服"
else:
@@ -335,7 +357,10 @@ def load_settings():
g = globals()
if isinstance(data, dict):
for k in CONFIGURABLE_KEYS:
if k in data:
# null 是"没设",不是一个值。拿它盖掉本文件里的默认值,一个好好的
# 布尔开关会变成 None——`if not AI_UI_GUARD_ENABLED` 于是永远成立,
# 那条识别升级链被静默关掉,表现成"未读一直读不出昵称"。
if k in data and data[k] is not None:
g[k] = data[k]
AI_CLOUD_AGENT_NAME = str(AI_AGENT_NAME or "").strip() or "客服"
AI_LOCAL_AGENT_NAME = _read_agent_name_override()