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