关于 service-agentforce-channel-configure
此 Skill 将现有 Agentforce Agent 连接到现有 Salesforce 渠道,并配置队列处理溢出任务。它涵盖 Enhanced Chat 或 Messaging、Voice 和 Email-to-Case 路由;不负责创建渠道或 Agent。
主要功能
- 01将渠道入站任务路由给 Agent
- 02配置备用队列
- 03支持聊天和消息渠道
- 04配置 Voice 路由流
- 05配置 Email-to-Case 路由
- 06可选配置出站升级
适用场景
- 01将 Agent 连接到现有聊天渠道
- 02把 Voice 呼叫路由给 Agentforce Agent
- 03设置 Email-to-Case Agent 路由
- 04为不可用的 Agent 提供备用队列
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ forcedotcom/ sf-skills --skill service-agentforce-channel-configure安装后在 Claude Code 中输入/service-agentforce-channel-configure确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/BotEmailDefinition.botEmailDefinition-meta.xmlmdapi-package.xmlsettings-mdapi-package.xmlassets/email/unfiled$public/AgentforceForServiceEmailTemplate.emailAgentforceForServiceEmailTemplate.email-meta.xmlreferences/agent-wiring.mdbotemaildefinition.mdchannel-branch-email.mdchannel-branch-voice.mdchannel-types.mdlive-traffic-gate.mdqueue-resolution.mdrouting-flow.mdscripts/validate-botemaildefinition.pyvalidate-emailtemplate.py详细介绍
service-agentforce-channel-configure:将 Agentforce 代理接入渠道
在现有渠道和现有 Agentforce 代理之间添加入站路由。代理会接收来自该渠道的工作项;当代理不可用时,备用队列会处理溢出的工作项。
此技能通用,适用于任何 Agentforce 代理,而不仅限于 Help Agent 模板。
范围
包含:
- 解析或创建
QueueSobjectSobjectType 正确的备用队列 - 分支 A(增强型聊天 / 增强型消息):在现有 MessagingChannel 上部署
sessionHandlerType=AgentforceServiceAgent和sessionHandlerQueue,然后通过 Data API PATCH 绑定SessionHandlerId - 分支 B(语音):假定电话号码和
PstnVoiceMessagingChannel 已存在(由调用方预先配置,例如service-helpagent-coordinate),然后创建入站 RoutingFlow(routingType: Copilot),将请求路由给代理,并将队列设为备用队列 - 分支 C(Email-to-Case):通过直接分配案例所有者或 Omni-Channel RoutingFlow 配置入站路由;另外部署
BotEmailDefinition(Email Configuration),将代理关联到 Service Email,并将其绑定到路由地址 - 可选的出站升级:将已验证的代理到人工交接约定交由
service-agentforce-human-escalation-configure处理
不包含:
- 创建代理——使用
agentforce-generate或service-helpagent-coordinate - 创建 MessagingChannel——使用
service-digital-engagement-channel-configure - 创建 Embedded Service Deployment——使用
service-digital-engagement-deployment-configure - 创建语音或 Email-to-Case 渠道基础设施
必需输入
- 代理
DeveloperName和代理标签(MasterLabel)——必须是现有且处于活动状态的代理 - 渠道类型——以下之一:增强型聊天、增强型消息(第三方)、语音、Email-to-Case
- 渠道标识符——MessagingChannel
DeveloperName(分支 A),或渠道名称/上下文(分支 B/C) - 目标组织别名
工作流
步骤按顺序执行。继续之前,先阅读 references/channel-types.md,确认路由分支。
阶段 0 — 生产环境写入保护(强制,在任何写入操作之前)
此技能会执行元数据/数据写入(编辑 MessagingChannel、部署 RoutingFlow、重新发布代理)。任何写入操作之前,都必须识别目标组织类型,并拒绝对真实生产环境进行操作:
sf data query --target-org $ORG --json \
--query "SELECT Id, IsSandbox, TrialExpirationDate, OrganizationType FROM Organization LIMIT 1"
- 仅当
IsSandbox=true、或TrialExpirationDate非 null(试用版/CDO)、或OrganizationType为Developer Edition/Base Edition时,safe_to_write才为 true。 - 如果
safe_to_write为 false,立即停止——明确说明这是客户的真实生产组织,不会应用升级/渠道接入配置。不要进入任何写入阶段。 - 如果
safe_to_write为 true,展示写入计划(将更改哪些 MessagingChannel/RoutingFlow/代理),并在继续之前征得用户对目标组织的明确确认。
绝不可绕过此检查——此处误写会导致实时客户流量被重新路由。
阶段 1 — 验证 Agent 并解析队列
-
确认 Agent 存在且有一个活动版本:
# Get the definition sf data query --target-org $ORG --json \ --query "SELECT Id, DeveloperName, MasterLabel FROM BotDefinition WHERE DeveloperName='{AGENT_DEVELOPER_NAME}'" # Check for an Active version sf data query --target-org $ORG --json \ --query "SELECT Id, Status FROM BotVersion WHERE BotDefinitionId='{BOT_DEFINITION_ID}' AND Status='Active' LIMIT 1"如果找不到定义,或没有任何版本的
Status = Active,请停止并显示明确的消息。分支 A 注意事项 — Active BotVersion 是将 Agent 绑定为
sessionHandlerAsa的必要条件,但并非充分条件。 平台只接受已配置/连接为可部署的 Agentforce Service Agent(通常是ExternalCopilot)的 Agent。绑定仅处于 Active 状态的 Agent 会导致阶段 2 部署失败,并提示Only active Agentforce Service Agents are supported for a Messaging Channel。写入前请以只读方式确认是否可绑定:如果该组织中已有任何 MessagingChannel 使用sessionHandlerType=AgentforceServiceAgent,请检索该对象(sf project retrieve start --metadata "MessagingChannel:{EXISTING}" --target-org $ORG)并读取其<sessionHandlerAsa>— 该集合就是该组织中可确证能绑定的 ASA。如果选定的 Agent 不是已配置的 ASA,且不存在可绑定的 ASA,请停止并报告BLOCKED:请提供一个已配置为 Agentforce Service Agent 的 Agent。 -
解析后备队列和路由配置 — 按照
references/queue-resolution.md操作:- 根据渠道类型确定 SobjectType(参见
references/channel-types.md) - 查询现有兼容队列;通过
AskUserQuestion呈现,或创建新队列 - 查询是否已有
QueueRoutingConfig;如果没有,则使用正确的容量百分比创建一个 - 记录
QUEUE_DEVELOPER_NAME、QUEUE_NAME和QUEUE_ID
- 根据渠道类型确定 SobjectType(参见
阶段 2 — 配置入站路由
实时流量警告关卡(在任何分支执行前运行)
进行任何路由更改之前,请检测该渠道是否已有活动的入站路由(分支 A:SessionHandlerType 非空;分支 B/C:有任何活动的 RoutingFlow 分配给服务渠道)。如果有,先检查用户的提示是否已说明时间选择(“暂不切换”/“手动接线”/“先审核”→ 静默延期;“立即切换”/“立即激活”→ 静默继续)。仅当提示中未说明时,才通过 AskUserQuestion 发出警告,让用户选择 “立即重新路由” 或 “完成设置,然后手动接线” — 如果用户的回复含糊或未选择,则默认延期(绝不进行实时重新路由)。延期时,设置 DEFER_INBOUND_ROUTING=true,跳过所选分支中的渠道激活步骤,并在阶段 2 末尾打印手动接线说明。
如果该渠道没有现有路由,则完全跳过此关卡,直接继续。
完整的检测查询、准确的 AskUserQuestion 代码块、各分支的延期流程规则以及手动接线文案:references/live-traffic-gate.md。
分支 A — 增强型聊天 / 增强型消息(第三方)
无需 RoutingFlow。仅使用 sessionHandlerType + sessionHandlerQueue 部署 MessagingChannel,然后通过 Data API PATCH 绑定机器人。在 v67 中,Metadata API 不接受 sessionHandlerAsa — 部署时会静默丢弃该字段,除非运行 PATCH,否则 SessionHandlerId 会保持为 null。PATCH 之前,机器人必须处于 Active 状态(否则会提示“Only active Agentforce Service Agents are supported”)。
按顺序执行全部五个步骤。在当前 SFDX 项目中执行检索和编辑,以便部署从 force-app 读取编辑后的 .messagingChannel-meta.xml;不要使用临时目录。
-
将当前 MessagingChannel 元数据检索到工作目录项目中:
sf project retrieve start \ --metadata "MessagingChannel:{CHANNEL_DEVELOPER_NAME}" \ --target-org $ORG -
就地编辑检索到的
.messagingChannel-meta.xml— 只设置以下两个字段(不要添加<sessionHandlerAsa>):<sessionHandlerType>AgentforceServiceAgent</sessionHandlerType> <sessionHandlerQueue>{QUEUE_DEVELOPER_NAME}</sessionHandlerQueue>使用文件编辑工具(Edit/Write)应用此编辑,使更改保存到工作目录中检索到的文件
force-app/main/default/messagingChannels/{CHANNEL_DEVELOPER_NAME}.messagingChannel-meta.xml— 不要通过内联sed/catheredoc 手动将其编辑到临时路径。步骤 3 中的部署必须读取这同一个磁盘文件。 -
部署:
sf project deploy start \ --metadata "MessagingChannel:{CHANNEL_DEVELOPER_NAME}" \ --target-org $ORG如果部署失败,并提示
Only active Agentforce Service Agents are supported for a Messaging Channel,则此组织中的该 Agent 无法绑定(参见 Phase 1 注意事项)。不要使用同一个 Agent 重试 — 通道保持不变(失败的部署是原子操作)。报告BLOCKED,并说明补救措施:绑定一个已配置为 Agentforce Service Agent 的 Agent,或为此 Agent 完成配置,然后重新运行。 -
通过 Data API PATCH 绑定机器人:
CHAN_ID=$(sf data query --target-org $ORG --json \ --query "SELECT Id FROM MessagingChannel WHERE DeveloperName='{CHANNEL_DEVELOPER_NAME}'" \ | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['records'][0]['Id'])") BOT_ID=$(sf data query --target-org $ORG --json \ --query "SELECT Id FROM BotDefinition WHERE DeveloperName='{AGENT_DEVELOPER_NAME}'" \ | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['records'][0]['Id'])") QUEUE_ID=$(sf data query --target-org $ORG --json \ --query "SELECT Id FROM Group WHERE Type='Queue' AND DeveloperName='{QUEUE_DEVELOPER_NAME}'" \ | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['records'][0]['Id'])") sf api request rest --method PATCH -o $ORG \ "/services/data/v67.0/sobjects/MessagingChannel/${CHAN_ID}" \ --body "{\"SessionHandlerId\":\"${BOT_ID}\",\"FallbackQueueId\":\"${QUEUE_ID}\"}" # Expected: HTTP 204 -
验证:
sf data query --target-org $ORG --json \ --query "SELECT SessionHandlerId, FallbackQueueId FROM MessagingChannel WHERE Id='${CHAN_ID}'"SessionHandlerId和FallbackQueueId均不得为 null。
无需更改 Agent 文件 — 无需重新发布。继续执行 Phase 3(可选)。
分支 B — 语音
通过入站 Copilot RoutingFlow,将 PstnVoice MessagingChannel 接入,并将队列设为回退队列;重新发布 Agent 之前,还需添加必需的 modality voice: 块。
从头到尾遵循 references/channel-branch-voice.md。要点:
- 步骤 0 — 复用现有的
PstnVoiceMessagingChannel,或先让service-helpagent-coordinate使用该技能的 Voice 通道参考配置一个通道;如果组织使用合作伙伴电话服务提供商,则中止(参见references/channel-types.md)。 - 步骤 1–3 — 使用
references/routing-flow.md中的模板编写并部署入站 RoutingFlow,确认ActiveVersionId非 null。 - 步骤 4 — 为
{CHANNEL_DEVELOPER_NAME}部署一个 MessagingChannel 元数据文件,设置sessionHandlerType=Flow、sessionHandlerFlow={FLOW_DEVELOPER_NAME}、sessionHandlerQueue={QUEUE_DEVELOPER_NAME}。否则不会执行该流程,通话会挂断。确认SessionHandlerId以300开头。 - 步骤 5 — 如果
.agent文件中缺少平台默认的modality voice:块,则将其追加进去(voice_idUgBBYS2sOqTuMpoF3BR0,"Mark",en_US);不要询问用户。按照references/agent-wiring.md重新发布。
继续执行 Phase 3(可选)。
分支 C — 电子邮件转案例
让用户选择直接分配案例所有者,或使用 Omni-Channel Copilot RoutingFlow。此分支需要 API v68.0+、connection service_email: 接入方式以及 BotEmailDefinition。
请完整遵循 references/channel-branch-email.md。关键注意事项(完整操作指南见该文件):
- 步骤 1 — 通过 Tooling-API PATCH 或
--metadata-dirSettings:Case部署来绑定路由地址字段,绝不能使用源--metadata Settings:Case部署(它会读取sourceApiVersion并修改用户的项目)。 - 步骤 2 — 选择入站路由(
AskUserQuestion):案例所有者(caseOwner= Agent 的机器人用户)或 Omni-Channel 流(CopilotRoutingFlow +routingFlow/fallbackQueue)。无论选择哪种方式,都要解析机器人用户;路由字段应放入步骤 4d 的部署中。 - 步骤 3 — Agent 已处于活动状态,因此必须通过 停用 → 发布 → 激活 添加
connection service_email:接入方式(直接发布会失败,并显示couldn't find the default agent user)。如果需要升级处理,也在此处一并批量添加出站路由。 - 步骤 4 — BotEmailDefinition:预检保存时的关卡,验证回复模板,通过
--metadata-dir部署,然后通过一次Settings:Case部署绑定路由地址(包括botEmailDefinition+ 步骤 2 的路由字段 + 必需的casePriority)。如果失败则停止。
验证路由地址绑定后,分支 C 即完成。继续进入阶段 3。
阶段 3 — 出站升级处理(可选)
权威负责人: 完整的 Agent 到人工升级处理由
service-agentforce-human-escalation-configure负责。这包括升级处理主题、规划器耦合、有人值守的人工队列、出站流、失败阈值指令、重新发布和确定性验证。
确认入站路由后,询问用户:
“入站路由已设置完成 — 该渠道会将请求路由到 [agent name]。你是否也想配置出站升级处理,以便 Agent 在收到请求时转交给人工处理?”
如果是,则委派给 service-agentforce-human-escalation-configure。将已解析的 Agent、
渠道类型、上下文对象和后备队列作为已知输入传递。不要在此处重复该技能的
写入或验证步骤。
规则 / 约束
| 规则 | 原因 |
|---|---|
| 进行任何更改前,验证 Agent 存在且处于 Active 状态 | 将渠道连接到不存在或非活动的 Agent 会导致运行时静默失败 |
如果渠道已有活跃的入站路由,请遵循提示词中明确的延后 / 切换意图,不要询问;否则通过 AskUserQuestion 发出警告,并在意图不明确时默认延后 | 重新路由会立即生效并影响实时流量——队列和 RoutingFlow 的创建始终继续;只有激活步骤需要经过确认,安全默认选项不会造成破坏 |
| 延后时,在 Phase 3 之前打印准确的手动连接说明 | 操作人员需要清楚知道准备好切换时要运行哪些命令 |
| 未先检索当前元数据时,绝不修改 MessagingChannel | 未检索便覆盖会丢失现有设置 |
分支 A:不创建 RoutingFlow,也不重新发布 Agent;通过元数据部署 sessionHandlerType + sessionHandlerQueue,然后通过 Data API PATCH 设置 SessionHandlerId | v67 中 Metadata API 不接受 sessionHandlerAsa——部署会静默丢弃该字段,因此必须在部署后通过 Data API PATCH 绑定机器人。执行 PATCH 前,机器人必须处于 Active 状态 |
| 分支 B/C:始终创建新的 RoutingFlow,绝不复用现有组织级流程 | 开箱即用的平台流程通常有 ActiveVersionId: null,无法引用 |
分支 B/C:使用 routingType: Copilot 和 copilotLabel,不要使用 QueueBased | QueueBased 会直接路由到队列;Copilot 会先路由到 Agent,队列作为后备 |
必须查询 Queue Id 并将其写入 RoutingFlow XML | queueId 参数需要硬编码的 18 位记录 Id——不得留空 |
队列命名:{ChannelTypeLabel} Queue | 按渠道类型命名,而非按 Agent 命名 |
| 出站升级为可选步骤——绝不因其阻碍入站路由完成 | 入站和出站彼此独立;无需完成出站步骤,入站连接便已完成 |
分支 C:通过 --metadata-dir 部署 BotEmailDefinition,绝不使用 --metadata BotEmailDefinition:<name> | 它不在 CLI 的 SDR 注册表中,因此按名称指定类型的部署会失败;元数据格式部署可行 |
分支 C:不要将带有 ServiceCustomerVerification 主题的 Agent 连接到电子邮件 | 检测到后停止——不要自动移除(它可能是合法的多渠道 Agent 配置)。参见 channel-branch-email.md 第 4a 步 |
验证清单
队列
- 队列有一条
QueueSobject记录,且SobjectType与渠道类型相符 - 运行用户是队列成员(如果是新建队列)
- 队列有正确
CapacityPercentage的QueueRoutingConfig(Chat / Voice / Email 分别为 50 / 100 / 25)
分支 A — MessagingChannel
- 部署后
SessionHandlerType = AgentforceServiceAgent - Data API PATCH 前,机器人处于 Active 状态
- Data API PATCH 后,
SessionHandlerId非空(与机器人的BotDefinition.Id匹配,以0Xx开头) - Data API PATCH 后,
FallbackQueueId非空(与解析出的队列 Id 匹配)
分支 B/C — RoutingFlow
- RoutingFlow 的
ActiveVersionId非空 - 流程的
routeWork操作中routingType = Copilot -
copilotLabel与 Agent 的确切MasterLabel匹配 -
queueId已填写(非空)
分支 C — 电子邮件路由地址
- 如果是新建:已创建
EmailRoutingAddress记录,且PersonalName和Address正确 - 如果是新建:已为 CaseSettings 补丁设置
caseOrigin、saveEmailHeaders: true、addressType: EmailToCase - 如果是新建:已告知用户验证邮件已发送到支持地址(不阻塞后续操作)
分支 C — BotEmailDefinition
- 预检通过:Agent 为
EinsteinServiceAgent,且其机器人用户具有agentforceServiceAgentUser;活动版本包含ServiceEmail界面;电子邮件 Agent 上没有ServiceCustomerVerification主题 - 回复
EmailTemplate为 SFX、HTML、公开,并包含[[[GENERATED_CONTENT]]]+[[[LEGAL_DISCLOSURE]]] - 无头路径(API ≥68):通过
--metadata-dir部署BotEmailDefinition,且返回success: true;legalDisclaimer/signature至少为 10 个字符 - 将路由地址的
botEmailDefinition子项设置为已部署组件的fullName - 在同一路由地址上设置入站路由:使用
caseOwner+caseOwnerType或routingFlow+fallbackQueue,并包含casePriority
可选阶段 3 — 出站升级
-
service-agentforce-human-escalation-configure返回CONFIGURED或ALREADY-CONFIGURED
参考文件索引
| 文件 | 阅读时机 |
|---|---|
references/channel-types.md | 阶段 1 — 确定 SobjectType 和路由分支 |
references/queue-resolution.md | 阶段 1 — 查询、创建队列并捕获 Id |
references/live-traffic-gate.md | 阶段 2 — 检测查询、延迟流规则,以及实时流量警告门控的手动接线副本 |
references/channel-branch-voice.md | 分支 B — 完整的 Voice 入站接线:PstnVoice 通道选择、RoutingFlow、MessagingChannel 分配、modality voice: 重新发布 |
references/channel-branch-email.md | 分支 C — 完整的 Email-to-Case 接线:API v68.0+ 前置条件门控、CaseSettings 标志、EmailRoutingAddress + 读取-修改-写入补丁、入站 RoutingFlow、必需的 connection service_email: 界面区块、无头 BotEmailDefinition 部署、路由地址绑定 |
references/botemaildefinition.md | 分支 C 步骤 4 — BotEmailDefinition 字段、保存时的验证顺序、ASA 模板规则、--metadata-dir 部署步骤、ServiceEmail 界面前置条件、组合组织门控 |
references/routing-flow.md | 分支 B/C — 入站 RoutingFlow XML 模板、部署、验证 |
references/agent-wiring.md | 阶段 3(可选)— 出站升级 connection 区块 |
assets/BotEmailDefinition.botEmailDefinition-meta.xml | 分支 C 步骤 4c — BotEmailDefinition 源文件的起始模板 |
assets/mdapi-package.xml | 分支 C 步骤 4c — --metadata-dir 部署所用的元数据格式 package.xml |
assets/email/unfiled$public/AgentforceForServiceEmailTemplate.email + .email-meta.xml | 分支 C 步骤 4b(备用方案)— 用户没有模板时使用的最简 ASA 兼容 SFX 回复模板 |
scripts/validate-botemaildefinition.py | 分支 C 步骤 4c — 部署前验证 BotEmailDefinition 文件 |
scripts/validate-emailtemplate.py | 分支 C 步骤 4b(备用方案)— 部署前验证 SFX 模板 |