广告位招商中 欢迎洽谈

如何在 Agentforce 中将 Invocable Apex、Flow 与 MuleSoft API 构建并发布为自定义操作

365Finds Editorial
已收录 11,430 篇 Wiki 文章

让你的 AI 用上 365 Wiki

复制这段快捷提示词,粘贴到你正在使用的 AI 对话中,然后继续提问。AI 会搜索 365 Wiki,帮你查资料、比较方案并给出建议。

下载完整 Skill

偶尔使用,快捷提示词就够了。经常使用,安装 365Wiki Skill:无需每次复制,还能更完整地研究问题、比较选择并规划下一步。没有常用工具?Gemini、Microsoft Copilot 等网页版 AI 也能使用。

365Wiki Skill

Salesforce Agentforce 正在将企业级 AI 从被动的文本对话演进为具备自主决策能力的智能体(Autonomous Agents)。面对真实的业务场景,智能体不仅需要回答知识库中的问题,更需要主动理解客户意图、选择企业内部的专业工具、执行事务处理,并根据执行结果推进后续任务。

Agentforce 开箱即用的标准操作(Standard Actions)主要覆盖草拟邮件、汇总记录等通用 CRM 任务。然而,企业级应用不可避免地需要触达专有业务规则、复杂的跨系统事务和实时第三方数据。Salesforce 后端开发人员与企业架构师需要通过构建**自定义操作(Custom Actions)**来扩展智能体的能力边界,其技术实现依托于三大核心支柱:

  1. Invocable Apex 方法:适用于复杂计算、严苛校验、高级 SOQL 查询以及需要确定性执行的代码逻辑。
  2. 无头自动化流程(Autolaunched Flow):适用于由管理员或低代码开发人员维护的标准 CRM 增删改查、审批路由与既有业务流程。
  3. 基于 External Services 与 API Catalog 的 MuleSoft API:连接底层 ERP(如 SAP、Oracle)、支付网关以及企业分布式微服务的系统桥梁。

本文将深入解析这三种操作模式的底层运行机制、代码实现规范、上下文工程(Context Engineering)配置要点以及企业级安全治理策略。


1. 核心架构:Atlas 推理引擎如何理解并调用操作

要构建出高可用、不易产生幻觉的操作,首先必须理解 Agentforce 的核心大脑——**Atlas 推理引擎(Atlas Reasoning Engine)**的工作方式。

[ 用户交互 / 全渠道接入 Omni-Channel ]
                  │
                  ▼
       [ Atlas 推理引擎 ]
      (ReAct: 推理 - 行动 - 观察)
                  │
   ┌──────────────┼──────────────┐
   ▼              ▼              ▼
[ 主题分类识别 ]  │ [ 业务护栏与上下文过滤 ]
   │              │
   └──────┬───────┘
          ▼
    [ 动作 / 工具选择 ]
          │
   ┌──────┼──────┐
   ▼      ▼      ▼
[ Apex ] [Flow] [MuleSoft / API]
   │      │      │
   └──────┼──────┘
          ▼
   [ 执行输出返回至 Atlas ]
          │
          ▼
  [ 组织最终答复或触发后续动作 ]

ReAct 运行机制与上下文工程

Atlas 引擎采用经典的 Reason-Act-Observe(推理-行动-观察) 循环机制:

在传统的程序开发中,模块间依赖于强类型签名与直接调用;而在自主智能体体系中,元数据即 Prompt。大语言模型无法直接审视 Apex 的内部代码逻辑,它完全依赖操作的 label、description、输入参数注解以及自然语言指令(Action Instructions)来做决策。模糊的描述会导致工具误用或参数抽取失败,而精确语义化的描述则是确保高确定性执行的关键。


2. 将 Invocable Apex 构建并发布为自定义操作

对于逻辑分支复杂、数据结构特殊、或有严格性能与安全要求的业务场景,Invocable Apex 是最灵活可控的选择。

步骤一:编写 Invocable Apex 类

Agentforce 依赖 @InvocableMethod 注解暴露代码。该方法必须声明为 public 或 global 的静态方法,接收输入包装类的 List,并返回输出包装类的 List。

以下是一个企业订单取消操作的标准实现范例:

public with sharing class OrderCancellationService {

    // 输入参数包装类:向智能体声明所需的输入项
    public class OrderCancellationRequest {
        @InvocableVariable(
            label = 'Order Number' 
            description = '客户需取消的订单编号,格式如 ORD-10023。' 
            required = true
        )
        public String orderNumber;

        @InvocableVariable(
            label = 'Cancellation Reason' 
            description = '客户说明的取消订单原因。' 
            required = false
        )
        public String reason;
    }

    // 输出参数包装类:向 Atlas 引擎返回结构化执行结果
    public class OrderCancellationResult {
        @InvocableVariable(
            label = 'Is Success' 
            description = '布尔标识,指示订单是否已成功标记为已取消。'
        )
        public Boolean isSuccess;

        @InvocableVariable(
            label = 'Cancellation Reference Code' 
            description = '确认取消后生成的审计凭据编号。'
        )
        public String referenceCode;

        @InvocableVariable(
            label = 'Status Message' 
            description = '操作结果说明或明确的失败原因描述。'
        )
        public String message;
    }

    @InvocableMethod(
        label = 'Cancel Customer Order'
        description = '取消处于待处理状态的客户订单并生成审计编号。仅当订单状态为 Pending 或 Processing 且客户明确要求取消时方可触发。'
        category = 'Order Management'
    )
    public static List<OrderCancellationResult> cancelOrders(List<OrderCancellationRequest> requests) {
        List<OrderCancellationResult> results = new List<OrderCancellationResult>();

        for (OrderCancellationRequest req : requests) {
            OrderCancellationResult res = new OrderCancellationResult();
            
            try {
                // 启用用户模式安全校验
                List<Order> orders = [
                    SELECT Id, Status, TotalAmount 
                    FROM Order 
                    WHERE OrderNumber = :req.orderNumber 
                    WITH USER_MODE 
                    LIMIT 1
                ];

                if (orders.isEmpty()) {
                    res.isSuccess = false;
                    res.message = '未找到匹配的有效订单编号:' + req.orderNumber;
                    results.add(res);
                    continue;
                }

                Order targetOrder = orders[0];
                if (targetOrder.Status == 'Activated' || targetOrder.Status == 'Completed') {
                    res.isSuccess = false;
                    res.message = '订单 ' + req.orderNumber + ' 已进入发货或完成状态,无法通过自助通道直接取消。';
                    results.add(res);
                    continue;
                }

                targetOrder.Status = 'Cancelled';
                targetOrder.Description = '通过 Agentforce 自动取消。原因:' + (req.reason != null ? req.reason : '未说明');

                Database.SaveResult sr = Database.update(targetOrder, AccessLevel.USER_MODE);
                if (sr.isSuccess()) {
                    res.isSuccess = true;
                    res.referenceCode = 'CAN-' + System.currentTimeMillis();
                    res.message = '订单取消成功。';
                } else {
                    res.isSuccess = false;
                    res.message = '数据库记录更新失败。';
                }
            } catch (Exception ex) {
                res.isSuccess = false;
                res.message = '处理订单取消时发生系统内部异常:' + ex.getMessage();
            }

            results.add(res);
        }

        return results;
    }
}

Apex 开发的关键准则

步骤二:在后台注册为 Agent 操作

  1. 进入 Salesforce Setup(设置),在快速查找框中输入 Agent,选择 Agentforce Assets(或 Agent Actions)。
  2. 点击 New Agent Action(新建操作)。
  3. 在 Reference Action Type(引用操作类型) 中选择 Apex。
  4. 选中已部署的类 OrderCancellationService 及其方法 Cancel Customer Order。
  5. 系统会自动基于代码注解预填充标签与参数说明。请在 Action Instructions(操作说明) 中补充业务规则(例如:“仅在已认证客户明确要求取消订单时调用。若客户未提供订单号,必须先行追问订单号。”)。
  6. 点击完成保存。

3. 将无头 Flow 构建并发布为自定义操作

对于典型的 CRM 记录增删改查、既有审批流调用以及业务规则相对简单的场景,Autolaunched Flow 提供了更高效的声明式交付手段。

流程类型限制

Agentforce 仅支持调用无触发器的自动启动流(Autolaunched Flow - No Trigger)。Screen Flow(屏幕流)需要浏览器人机界面交互,而 Record-Triggered Flow(记录触发流)由数据库底层事件驱动,两者均无法直接作为智能体的动作调用。无头流程的请求-响应模式契合智能体的执行生命周期。

[ 用户意图:"将我的收货地址变更为科技园南区 101 号" ]
                            │
                            ▼
           [ Agentforce 动作规划器 ]
                            │
 (抽取参数: orderId, streetAddress, city)
                            │
                            ▼
    [ Autolaunched Flow: 更新订单发货地址 ]
             ┌─────────────────────────┐
             │ Get Records: 查询目标订单 │
             ├─────────────────────────┤
             │ Decision: 是否已实际发货  │
             ├─────────────────────────┤
             │ Update Records: 更新地址 │
             └─────────────────────────┘
                            │
  (输出变量: isUpdated = True, confirmationMsg)
                            │
                            ▼
           [ Atlas 组织自然语言答复 ]

流程配置步骤

  1. 新建流程:打开 Flow Builder,选择 Autolaunched Flow (No Trigger)。
  2. 定义输入变量:
    • 创建文本型变量 var_orderId,勾选 Available for input(可用于输入)。
    • 填写详尽的 Description(说明):“目标订单记录的 18 位 Salesforce Record ID。”
    • 同样创建 var_streetAddress 等输入变量,并补充描述。
  3. 定义输出变量:
    • 创建布尔变量 var_isUpdated,勾选 Available for output(可用于输出)。说明注明:“地址更新成功落库时返回 True。”
    • 创建文本变量 var_statusMessage,勾选 Available for output,用于承载反馈信息。
  4. 编排逻辑:
    • 添加 Get Records(获取记录) 查询订单。
    • 添加 Decision(决策) 判断订单当前物流状态。
    • 若符合修改条件,添加 Update Records(更新记录) 更新配送信息。
    • 添加 Assignment(分配) 赋值输出变量。
  5. 保存并激活:保存命名为 Agent_Update_Order_Address 并执行激活。

步骤三:在后台注册为流程操作

  1. 访问 Setup > Agentforce Assets > New Agent Action。
  2. 选择 Reference Action Type = Flow。
  3. 选择刚才激活的流程 Agent_Update_Order_Address。
  4. 系统将识别所有开放输入与输出的变量,逐一确认各变量的自然语言描述是否充分准确。
  5. 配置操作调用说明并保存。

4. 通过 External Services 与 API Catalog 发布 MuleSoft API

智能体执行企业任务时,往往需要跨越 Salesforce 边界访问核心 ERP(SAP、Oracle)、外部库存中心或金融结算接口。MuleSoft 承担着跨系统数据编排与治理重任,而 Salesforce 则通过 External Services(外部服务) 与 API Catalog(API 目录) 将其无缝映射为智能体可调用的操作。

两种发布路径对比

实施方案实现路径适用场景
MuleSoft for Agentforce: Topic Center 与 API Catalog 联动在 Anypoint Platform 中通过 Topic Center 治理规格并直接同步到 Salesforce API Catalog已具备完善 Anypoint Platform 资产、由中央集成团队统一发布 API 的大型企业。
External Services for MuleSoft 导入依托 Named Credentials,直接导入 OpenAPI 3.0/2.0 规格文件生成操作点对点集成、快速连接指定外部接口或仅需向特定 Flow 与智能体提供能力的场景。
[ 底层企业系统 ERP / SAP / 核心数据库 ]
                  │
                  ▼
    [ MuleSoft Anypoint Platform ]
 (System, Process, Experience APIs)
                  │
   (Topic Center 治理 / OAS 3.0 规范)
                  │
                  ▼
  [ Salesforce Anypoint 关联与同步 ]
                  │
     ┌────────────┴────────────┐
     ▼                         ▼
[ Named Credentials ]  [ Salesforce API Catalog ]
 (凭据管理与鉴权)         (企业 API 统一发现)
     │                         │
     └────────────┬────────────┘
                  ▼
      [ External Services ]
      (自动生成 Invocable 操作)
                  │
                  ▼
  [ Agentforce 自定义操作资产库 ]

步骤一:设计适配 AI 识别的 OpenAPI 规范

Atlas 推理引擎需要解析 OpenAPI 规格书以确定路径参数与请求体。编写适配智能体的 API 时需遵循以下规范:

仓库实时库存查询 API 规范样例(OpenAPI 3.0):

openapi: 3.0.3
info:
  title: Enterprise Warehouse API
  version: 1.0.0
  description: 跨仓库存查询与即时发货可用性服务。
paths:
  /inventory/{sku}:
    get:
      summary: 根据商品 SKU 查询仓库可用库存
      description: 传入标准商品编码,返回各配送中心的实物库存量、发货可行性以及缺货补货周期。
      operationId: getInventoryBySku
      parameters:
        - name: sku
          in: path
          required: true
          description: 商品唯一标识编码,格式如 PROD-WIDGET-99。
          schema:
            type: string
      responses:
        '200':
          description: 成功获取库存信息
          content:
            application/json:
              schema:
                type: object
                properties:
                  sku:
                    type: string
                    description: 被查询的商品编码。
                  quantityOnHand:
                    type: integer
                    description: 仓库实体现有库存件数。
                  isAvailableToShip:
                    type: boolean
                    description: 是否满足立即打包出库条件。
                  warehouseRegion:
                    type: string
                    description: 负责承运该商品的主物流中心区域。
        '404':
          description: 商品编码在物料主数据中不存在

步骤二:在 Salesforce 中同步并生成操作

  1. 建立 Anypoint 信任连接:在 Salesforce 设置中进入 Anypoint Platform Setup,填入 Anypoint 组织凭据与连接密钥。
  2. API 目录同步:在 MuleSoft Topic Center 或 Exchange 中对 API 资产打上 sf-api-catalog 标签;回到 Salesforce 的 API Catalog 界面,找到已同步的 API 并激活所需端点。
  3. 配置 Named Credentials(指定凭据):绑定对应的 OAuth 2.0 凭据以确保外部 HTTP Callout 鉴权安全。
  4. 生成 Agent 操作:在 Agentforce Assets 中创建新操作,类型选择 External Service,绑定该 API 操作并确认入参描述。

5. 在 Agentforce Builder 中完成主题装配与操作编排

自定义操作注册到资产库后,必须装配到**主题(Topics)**中才能被智能体识别和调用。主题是 Atlas 引擎划分业务领域和划定操作边界的基本单元。

[ 自主智能体:客户服务专属智能体 ]
                 │
   ┌─────────────┴─────────────┐
   ▼                           ▼
[ 主题:订单履约与变更 ]    [ 主题:退换货与售后 ]
 (业务范围与路由分类)        (业务范围与路由分类)
   │
   ├───────────────────────────┐
   ▼                           ▼
[ 动作:订单查询 ]        [ 动作:取消客户订单 ]
(Autolaunched Flow)       (Invocable Apex)

步骤与配置要点

  1. 打开 Agentforce Builder,选择目标智能体(如 Service Agent)进入编辑视图。
  2. 选择既有主题或点击 New Topic(例如创建 Order Logistics and Changes)。
  3. 撰写 Topic Classification Description(主题分类描述):明确说明该主题负责的业务范围(如涵盖订单状态追踪、地址修改、发货加急及撤单办理)。
  4. 在主题的 Actions 标签页中点击 Add Action,勾选此前发布的 Apex、Flow 或 MuleSoft 操作。

编写高质量主题与操作指令

指令(Instructions)是引导智能体决策的自然语言护栏:

### 主题指令:Order Logistics and Changes
- 协助客户进行订单状态查询、物流跟踪、地址修改和订单取消。
- 在执行订单取消前,必须先复核订单状态并向用户确认其取消意图。
- 若订单已发货导致取消失败,应安抚客户并解释退换货政策。

### 操作指令:Cancel Customer Order
- 仅在用户明确提供订单编号并同意取消确认后方可触发此操作。
- 若用户未提供订单编号,请回复追问:"请问您需要取消的订单编号是多少?"
- 执行成功后,务必将返回的审计凭证编号(referenceCode)告知客户。

关键动作的人工确认(Human-in-the-Loop)

对于涉及记录变更、资金往来或业务取消的高敏感操作,建议在操作配置中勾选 Require Confirmation(要求确认)。启用后,智能体在真正执行底层代码或接口调用前,会主动向客户弹出确认询问(例如:“您确认要取消订单 ORD-10023 吗?取消后将无法撤回。”),待客户明确回复肯定后方才发起调用。


6. 技术选型决策矩阵

在实际项目架构中,合理权衡三种操作构建方式能够兼顾开发效率、维护成本与系统吞吐量。

架构评估维度Invocable ApexAutolaunched FlowMuleSoft External Services
主要技术栈要求Salesforce 专业开发人员(Apex)系统管理员 / 低代码配置人员集成架构师 / MuleSoft 工程师
执行运行环境Salesforce 核心底层环境Salesforce 核心底层环境外部企业系统与微服务集群
最佳适用场景复杂运算、多对象关联、批量事务、自定义鉴权与加密逻辑标品 CRUD、标准业务审批、已有自动化复用、直观业务流分支SAP/ERP 订单同步、跨云结算中心、外部库存中心、遗留系统对接
执行时延与限制Apex 同步 CPU 上限(10 秒)、常规 SOQL/DML 限制受 Flow 节点执行计数与遍历限制取决于外部网络延迟,支持长达 120 秒超时
版本维护模式Git、SFDX 与元数据打包规范Flow Builder 声明式版本启停Anypoint Exchange 契约管理与 API 治理
异常处理形态强类型 try-catch 捕获与自定义包装类返回故障分支(Fault Connector)与赋值节点标准 HTTP 状态码(2xx/4xx/5xx)与 JSON 错误实体

7. 测试验证、权限治理与上线策略

1. Agent User 运行上下文与权限排查

智能体在执行自定义操作时,使用的是后台配置的 Agent User 身份。常见的新功能上线失效通常是因为该运行用户缺少必要授权:

2. 多层级测试与质量保障

  1. 底层代码单元测试:为 Invocable Apex 编写完备的测试类(代码覆盖率建议达到 85% 以上),重点覆盖空入参、越权异常和边界场景。
  2. Agentforce Builder 实时交互测试:利用右侧预览对话窗口触发业务提问,在 Reasoning 追踪面板中实时观察 Atlas 引擎是否准确匹配到了正确的主题,是否抽齐了输入参数,以及是否顺利接收了返回值。
  3. Agentforce Testing Center 批量回归:使用测试中心构建多轮测试集,针对数百种常见用户问法进行批量评估,量化验证意图识别率、工具选择准确度及幻觉发生率。

通过将 Invocable Apex 的确定性执行力、Autolaunched Flow 的低代码敏捷度,以及 MuleSoft API 的企业级互联能力深度融合,开发团队能够为 Agentforce 打造出兼具灵活性、稳健性与高合规性的自定义操作架构。


参考资料