refactor: update AIAgent handoff and fallback modes terminology for clarity

This commit is contained in:
mlogclub
2026-06-26 18:27:54 +08:00
parent b46e0d9b7c
commit 015b57bfe7
7 changed files with 56 additions and 35 deletions
+3 -3
View File
@@ -518,9 +518,9 @@ type AIAgent struct {
WelcomeMessage string `gorm:"type:text"` // WelcomeMessage 为该 Agent 的欢迎语或首响模板。
ReplyTimeoutSeconds int `gorm:"type:int;not null;default:180"` // ReplyTimeoutSeconds 为异步自动回复超时秒数。
TeamIDs string `gorm:"type:varchar(500);not null;default:''"` // TeamIDs 为转人工时可路由的客服组ID列表,多个之间使用逗号分隔。
HandoffMode enums.AIAgentHandoffMode `gorm:"type:int;not null;default:1"` // HandoffMode 为转人工式,如进入待接入池、进入默认客服组待接入池。
FallbackMode enums.AIAgentFallbackMode `gorm:"type:int;not null;default:1"` // FallbackMode 为知识库未命中时的兜底策略。
FallbackMessage string `gorm:"type:text"` // FallbackMessage 为兜底回复文案。
HandoffMode enums.AIAgentHandoffMode `gorm:"type:int;not null;default:1"` // HandoffMode 为转人工执行方式,如进入待接入池、进入默认客服组待接入池。
FallbackMode enums.AIAgentFallbackMode `gorm:"type:int;not null;default:1"` // FallbackMode 为知识不足时的回复策略。
FallbackMessage string `gorm:"type:text"` // FallbackMessage 为知识不足回复文案。
KnowledgeIDs string `gorm:"type:varchar(500);not null;default:''"` // KnowledgeIDs 为绑定的知识库ID列表,按顺序表示优先级。
SkillIDs string `gorm:"type:varchar(500);not null;default:''"` // SkillIDs 为绑定的技能ID列表,按顺序表示允许路由的范围。
AllowedMCPTools string `gorm:"type:text"` // AllowedMCPTools 为允许 direct tool 路由的 MCP 工具白名单配置JSON。
+3 -3
View File
@@ -208,7 +208,7 @@ var AIAgentHandoffModeValues = []AIAgentHandoffMode{
var aiAgentHandoffModeLabelMap = map[AIAgentHandoffMode]string{
AIAgentHandoffModeWaitPool: "进入待接入池",
AIAgentHandoffModeDefaultTeamPool: "进入默认客服组待接入池",
AIAgentHandoffModeAIHoldAndNotify: "AI托底并提醒人工",
AIAgentHandoffModeAIHoldAndNotify: "AI继续接待并提醒人工",
}
func GetAIAgentHandoffModeLabel(mode AIAgentHandoffMode) string {
@@ -228,8 +228,8 @@ var AIAgentFallbackModeValues = []AIAgentFallbackMode{
}
var aiAgentFallbackModeLabelMap = map[AIAgentFallbackMode]string{
AIAgentFallbackModeNoAnswer: "直接声明无答案",
AIAgentFallbackModeSuggestRetry: "建议补充信息",
AIAgentFallbackModeNoAnswer: "直接说明知识不足",
AIAgentFallbackModeSuggestRetry: "引导用户补充信息",
}
func GetAIAgentFallbackModeLabel(mode AIAgentFallbackMode) string {
+2 -2
View File
@@ -119,7 +119,7 @@ error.e0119: "会话已关闭"
error.e0120: "会话未分配客服,暂不允许发送消息"
error.e0121: "会话筛选项不合法"
error.e0122: "供应商不能为空"
error.e0123: "兜底策略不合法"
error.e0123: "知识不足回复策略不合法"
error.e0124: "公司不存在"
error.e0125: "公司名称不能为空"
error.e0126: "公司名称已存在"
@@ -332,7 +332,7 @@ error.e0332: "请选择要移动的FAQ"
error.e0333: "请选择要移动的文档"
error.e0334: "负责人不存在"
error.path.invalid: "路径参数错误"
error.e0336: "转人工式不合法"
error.e0336: "转人工执行方式不合法"
error.e0337: "通知不存在"
error.e0338: "邮箱已存在"
error.e0339: "配置名称不能为空"
@@ -0,0 +1,21 @@
import assert from "node:assert/strict"
import test from "node:test"
import { readFile } from "node:fs/promises"
const configWorkbenchSource = await readFile(new URL("./config-workbench.tsx", import.meta.url), "utf8")
const zhMessagesSource = await readFile(new URL("../../../../messages/zh-CN.json", import.meta.url), "utf8")
test("AI Agent workflow-era policy copy separates handoff execution from knowledge fallback", () => {
const combinedSource = `${configWorkbenchSource}\n${zhMessagesSource}`
assert.match(combinedSource, /转人工执行方式/)
assert.match(combinedSource, /知识不足回复策略/)
assert.match(combinedSource, /知识不足回复文案/)
assert.match(combinedSource, /AI继续接待并提醒人工/)
assert.match(combinedSource, /直接说明知识不足/)
assert.match(combinedSource, /引导用户补充信息/)
assert.doesNotMatch(configWorkbenchSource, /转人工模式/)
assert.doesNotMatch(configWorkbenchSource, /兜底策略/)
assert.doesNotMatch(configWorkbenchSource, /兜底文案/)
})
@@ -278,14 +278,14 @@ export function AIAgentConfigWorkbench({
() => [
{ value: String(AIAgentHandoffMode.WaitPool), label: "进入待接入池" },
{ value: String(AIAgentHandoffMode.DefaultTeamPool), label: "进入默认客服组待接入池" },
{ value: String(AIAgentHandoffMode.AIHoldAndNotify), label: "AI托底并提醒人工" },
{ value: String(AIAgentHandoffMode.AIHoldAndNotify), label: "AI继续接待并提醒人工" },
],
[]
)
const fallbackModeOptions = useMemo(
() => [
{ value: String(AIAgentFallbackMode.NoAnswer), label: "直接声明无答案" },
{ value: String(AIAgentFallbackMode.SuggestRetry), label: "建议补充信息" },
{ value: String(AIAgentFallbackMode.NoAnswer), label: "直接说明知识不足" },
{ value: String(AIAgentFallbackMode.SuggestRetry), label: "引导用户补充信息" },
],
[]
)
@@ -652,11 +652,11 @@ export function AIAgentConfigWorkbench({
{activeSection === "basic" ? (
<ConfigSection>
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
<FieldBlock label="转人工式">
<OptionCombobox value={handoffMode} options={handoffModeOptions} placeholder="选择转人工式" onChange={setHandoffMode} />
<FieldBlock label="转人工执行方式">
<OptionCombobox value={handoffMode} options={handoffModeOptions} placeholder="选择转人工执行方式" onChange={setHandoffMode} />
</FieldBlock>
<FieldBlock label="兜底策略">
<OptionCombobox value={fallbackMode} options={fallbackModeOptions} placeholder="选择兜底策略" onChange={setFallbackMode} />
<FieldBlock label="知识不足回复策略">
<OptionCombobox value={fallbackMode} options={fallbackModeOptions} placeholder="选择知识不足回复策略" onChange={setFallbackMode} />
</FieldBlock>
</div>
<AddRow
@@ -674,7 +674,7 @@ export function AIAgentConfigWorkbench({
items={selectedTeamOptions}
onRemove={(id) => setSelectedTeamIds((current) => current.filter((item) => item !== id))}
/>
<FieldBlock label="兜底文案">
<FieldBlock label="知识不足回复文案">
<Textarea rows={5} value={fallbackMessage} onChange={(event) => setFallbackMessage(event.target.value)} />
</FieldBlock>
<FieldBlock label="描述">
+3 -3
View File
@@ -5,8 +5,8 @@ export enum AIAgentFallbackMode {
SuggestRetry = 2,
}
export const AIAgentFallbackModeLabels: Record<AIAgentFallbackMode, string> = {
[AIAgentFallbackMode.NoAnswer]: "直接声明无答案",
[AIAgentFallbackMode.SuggestRetry]: "建议补充信息",
[AIAgentFallbackMode.NoAnswer]: "直接说明知识不足",
[AIAgentFallbackMode.SuggestRetry]: "引导用户补充信息",
}
export enum AIAgentHandoffMode {
@@ -17,7 +17,7 @@ export enum AIAgentHandoffMode {
export const AIAgentHandoffModeLabels: Record<AIAgentHandoffMode, string> = {
[AIAgentHandoffMode.WaitPool]: "进入待接入池",
[AIAgentHandoffMode.DefaultTeamPool]: "进入默认客服组待接入池",
[AIAgentHandoffMode.AIHoldAndNotify]: "AI托底并提醒人工",
[AIAgentHandoffMode.AIHoldAndNotify]: "AI继续接待并提醒人工",
}
export enum AIModelType {
+16 -16
View File
@@ -1034,15 +1034,15 @@
"serviceAiFirst": "AI 优先",
"handoffWaitPool": "进入待接入池",
"handoffDefaultTeamPool": "进入默认客服组待接入池",
"handoffAiHoldAndNotify": "AI托底并提醒人工",
"fallbackNoAnswer": "直接声明无答案",
"fallbackSuggestRetry": "建议补充信息",
"handoffAiHoldAndNotify": "AI继续接待并提醒人工",
"fallbackNoAnswer": "直接说明知识不足",
"fallbackSuggestRetry": "引导用户补充信息",
"nameRequired": "名称不能为空",
"aiConfigRequired": "请选择 AI 配置",
"serviceModeRequired": "请选择服务模式",
"replyTimeoutInvalid": "回复超时秒数必须是大于等于 0 的整数",
"handoffModeRequired": "请选择转人工式",
"fallbackModeRequired": "请选择兜底策略",
"handoffModeRequired": "请选择转人工执行方式",
"fallbackModeRequired": "请选择知识不足回复策略",
"loadDetailFailed": "加载 AI Agent 详情失败",
"loadAiConfigFailed": "加载 AI 配置失败",
"loadTeamsFailed": "加载客服组失败",
@@ -1071,14 +1071,14 @@
"welcomeMessage": "欢迎语",
"systemPrompt": "系统提示词",
"sectionStrategy": "服务策略",
"handoffMode": "转人工式",
"selectHandoffMode": "请选择转人工式",
"searchHandoffMode": "搜索转人工式",
"emptyHandoffMode": "未找到转人工式",
"handoffMode": "转人工执行方式",
"selectHandoffMode": "请选择转人工执行方式",
"searchHandoffMode": "搜索转人工执行方式",
"emptyHandoffMode": "未找到转人工执行方式",
"replyTimeoutSeconds": "回复超时秒数",
"replyTimeoutHelp": "AI 自动回复的异步执行超时时间。填 0 时使用系统默认值 180 秒。",
"teams": "客服组",
"currentHandoffMode": "当前转人工式:{mode}",
"currentHandoffMode": "当前转人工执行方式:{mode}",
"handoffNeedsTeam": "。该模式要求至少配置一个客服组。",
"handoffOnlyWhenNeeded": "。仅在涉及转人工时生效。",
"selectTeam": "请选择客服组",
@@ -1097,12 +1097,12 @@
"emptyKnowledge": "没有可添加的知识库",
"add": "添加",
"knowledgeRequired": "请至少选择一个知识库",
"fallbackMode": "兜底策略",
"selectFallbackMode": "请选择兜底策略",
"searchFallbackMode": "搜索兜底策略",
"emptyFallbackMode": "未找到兜底策略",
"fallbackMessage": "兜底文案",
"fallbackMessageHint": "知识库未命中或命中证据不足时,会按这里的策略和文案进行兜底回复。",
"fallbackMode": "知识不足回复策略",
"selectFallbackMode": "请选择知识不足回复策略",
"searchFallbackMode": "搜索知识不足回复策略",
"emptyFallbackMode": "未找到知识不足回复策略",
"fallbackMessage": "知识不足回复文案",
"fallbackMessageHint": "知识库未命中或命中证据不足时,会按这里的策略和文案回复;是否转人工由会话流程决定。",
"skillsHint": "用于固定业务流程和多步任务编排。",
"selectSkill": "选择并添加 Skill",
"searchSkill": "搜索 Skill",