Agentforce Prompt Builder 程序化访问与批处理指南

Prompt Builder 程序化访问和批处理完整指南。涵盖三种访问方式(Connect REST API/Connect in Apex/Invocable Actions)、AiJobRun 三步批处理模式(创建 Job→创建 Item→ReadyToStart)、不可变性和速率限制、AiJobRunStatusEvent 平台事件监控(Trigger + Handler 完整代码)、生产环境去重/失败处理/异步写回注意事项。...

📅 2026/7/5 ✍️ ponybai 🏷️ agentforce, salesforce, apex
Prompt Builder

程序化访问 Prompt Template

Prompt Builder 让你创建和管理能整合 CRM 数据的提示模板(merge fields、flows、related lists、Apex)。有三种程序化访问方式:

方式适用场景关键接口
Connect REST API外部 Web 应用集成Prompt Template Generations Resource。请求:指定模板 + 输入参数。响应:生成文本 + 引用(citations)
Connect in Apex组织内 Apex 代码集成ConnectApi.EinsteinLLM.generateMessagesForPromptTemplate()。传入开发者名称 + 输入参数,获取生成文本和可选引用(citationMode: 'post_generation'
Invocable Actions平台级集成(Flow Builder 等)Generate Prompt Response Invocable Action。从 Flow Builder、Process Builder 或其他可调用上下文中调用

跨组织部署:使用 Metadata API 的 GenAiPromptTemplate(模板定义)和 GenAiPromptTemplateActv(激活状态)在 Sandbox 和 Production 组织之间部署。

程序化访问

Prompt Template 批处理(Batch Processing)

使用 AiJobRunAiJobRunItem 对象异步生成大规模响应。典型用例:夜间总结 Case 积压、批量内容生成、批量翻译、大规模记录充实。

批处理

三步批处理模式

步骤 1 — 创建 AiJobRun:

AiJobRun jobRun = new AiJobRun(
  JobType = 'PromptTemplate',
  Target  = 'Summarize_Case',  // DeveloperName 推荐用于跨组织可移植性
  Status  = 'New'
);
insert as user jobRun;

步骤 2 — 创建 AiJobRunItem 记录(每个输入记录一条):

Map<String, Object> payload = new Map<String, Object>{
  'Input:Case' => new Map<String, Object>{ 'id' => c.Id }
};
items.add(new AiJobRunItem(
  AiJobRunId = jobRun.Id, Status = 'Ready',
  Input = JSON.serialize(payload)
));
insert as user items;
// Input 格式: {"Input:Case":{"id":"<CaseId>"}}
// Response 格式: {"promptResponse":"<LLM text>"}

步骤 3 — 翻转为 ReadyToStart:

jobRun.Status = 'ReadyToStart';
update as user jobRun;
// 此后不可更改(不可变性规则生效)

关键约束

约束说明
不可变性一旦进入 InProgress,AiJobRunId/Input 字段不可更改,不能删除
状态变更InProgress、Completed、Failed —— 用户无法更改
速率限制标准:1,000 条/AiJobRun;原生批处理模型:10,000 条/AiJobRun;Apex:最多 5 个 AiJobRun/24 小时
处理顺序多个 ReadyToStart 作业按 CreatedDate 排列;如秒级内更新,精确顺序不保证
三步批处理

作业监控和平台事件

使用 AiJobRunStatusEvent 平台事件监控作业完成状态。事件在每个状态转换时触发:InProgress → Completed → Failed。

事件 Schema

AiJobRunIdentifier(父 Id)、StatusJobTypeTarget

Trigger — 过滤 Completed 事件

trigger AiJobRunStatusEventTrigger on AiJobRunStatusEvent (after insert) {
  Set<Id> completedJobRunIds = new Set<Id>();
  for (AiJobRunStatusEvent e : Trigger.new) {
    if (e.Status == 'Completed' && String.isNotBlank(e.AiJobRunIdentifier)) {
      completedJobRunIds.add((Id) e.AiJobRunIdentifier);
    }
  }
  // 调用 Handler
}

Handler — 处理已完成项目

  1. 查询 AiJobRunItem WHERE AiJobRunId IN :completedJobRunIds AND Status = 'Completed'
  2. 提取 Input JSON → 解析 caseId:{"Input:Case":{"id":"<CaseId>"}}
  3. 提取 Response JSON → 解包 promptText:{"promptResponse":"<LLM text>"}
  4. 将结果写回(如作为 CaseComment)

生产环境注意事项

  • 去重:平台事件可能被重新投递 —— 按 AiJobRunId + ParentId 去重
  • 失败处理:项目可能以 Status='Failed' 结束 —— 与成功记录一起查询
  • 异步写回:对接近 10,000 条的限制,将写回操作转移到 Database.Batchable 或 Queueable
  • 异常处理:始终捕获异常 —— 未捕获异常会导致事件批次失败;9 次重试后平台会禁用订阅

完整模式

  1. 创建 AiJobRun (New) → 2. 创建 AiJobRunItem 列表 (Ready) → 3. 更新为 ReadyToStart
  2. 订阅 AiJobRunStatusEvent (Completed) → 5. 处理结果:解析 Input 获取源记录 Id → 解析 Response 获取 LLM 文本 → 写回
作业监控和平台事件

Prompt Builder 从单个模板调用到数千条记录的批量处理,为你提供了强大、受管控的方式将生成式 AI 整合到 Salesforce 工作流中。