field-service-prework-brief-deployer-configure について
Field Service Mobile 向け Einstein Pre-Work Brief の決定的な設定をデプロイして有効化する Salesforce スキルです。必要な組織設定、ライセンス、パイロット技術者が揃った管理者向けで、メタデータ、権限、レイアウト、テスト作業指示を自動処理します。
主な機能
- 01プロンプトテンプレートのデプロイと有効化
- 02Lightning Data Service の有効化
- 03ライセンスと権限セットの割り当て
- 04Work Order レイアウトへの項目追加
- 05予定済みテスト作業の作成または更新
活用シーン
- 01パイロット技術者向け Pre-Work Brief の設定
- 02モバイル検証用テスト作業指示の準備
- 03不足分だけを適用する設定の再実行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ forcedotcom/ sf-skills --skill field-service-prework-brief-deployer-configureインストール後、Claude Code で/field-service-prework-brief-deployer-configureを入力して読み込まれたか確認します。
詳細
Fs Prework Brief Deployer の管理
このスキルを使用するタイミング
ディスパッチ経由で、Einstein Pre-Work Brief の決定論的な部分を Field Service Mobile の対象組織にデプロイします。対象には、プロンプトテンプレート、Lightning Data Service、ライセンスと権限セット、作業指示のレイアウト項目、スケジュール済みのテスト作業指示が含まれます。
ワークフロー
Field Service Pre-Work Brief Deployer
dispatch 経由で Einstein Pre-Work Brief の決定論的な部分を Field Service Mobile にデプロイします。
このスキルは、Einstein for Field Service アドオンがすでにプロビジョニングされている組織を対象に、Pre-Work Brief を稼働させるための自動化可能なすべての手順を実行します。3 つのメタデータアーティファクトをデプロイし、ライセンスと権限セットを割り当て、技術者のレイアウトに作業指示の項目を表示し、今日の時間枠にスケジュールされたテスト作業指示を設定し、Connect API 経由でプロンプトテンプレートを有効化します。このワークフローは最初から最後まで完全に自動化できます。どうしても手動で行う必要がある手順はありません。デバイス上でのレンダリング検証(グラウンディングによって作業固有のコンテンツが生成されることの確認)は、このデプロイプリミティブではなく、Pre-Work Brief を統括するスキルが担当します。
このスキルは、判断を伴わないデプロイプリミティブです。組織の診断/振り分け(未プロビジョニングの場合は停止)、技術者の選定、新規データと既存データのどちらを使用するかの判断は、統括するスキルが行い、入力または選択ポイントとして渡します。
実行内容
- プロンプトテンプレート —
einstein_gpt__fieldServicePreWorkBriefGenAiPromptTemplate(Pre_Work_Brief)を Published としてデプロイします。 - Lightning Data Service — Field Service 設定で Lightning Data Service を有効にします(
lsdkForFieldServiceMobilePref組織設定。LDS が無効だと、モバイルでブリーフが空白になります)。 - ライセンスと権限セット — Einstein for Field Service PSL と権限セットを管理者とパイロット技術者に割り当てます。
- 項目レベルのアクセス権 —
PreWorkBrief_Field_Accessをデプロイし、FLS を設定して、技術者のレイアウトにWorkOrder.PreWorkBriefPromptTemplateを表示します。 - テストデータ — デプロイしたテンプレートを指定するテスト用の作業指示、サービス予定、割り当て済みリソースを今日の時間枠に作成します(または、既存の作業指示にテンプレートを指定します)。
入力
- 対象組織 — Einstein for Field Service アドオンがプロビジョニングされている組織です。アドオンがない場合、組織は未プロビジョニングです。停止してください。この振り分けは統括するスキルが担当します。
- パイロット技術者 — 統括するスキルが選定したユーザー名とユーザー ID。アクティブな
ServiceResourceが必要です。 - テストデータモード —
fresh(新しいテスト用作業指示の一連のデータを作成)またはexisting(指定された実際の作業指示にテンプレートを指定し、そのサービス予定を今日の時間枠に移動)。デフォルトはfreshです。
前提条件
- Einstein for Field Service アドオンがプロビジョニングされていること(Einstein for Field Service 権限セットライセンスが存在すること)。
- 管理者に Customize Application および Manage Profiles and Permission Sets の権限があること。
- Einstein の生成 AI の基本設定(Data 360 グラウンディングを含む)が組織で完了していること。
- パイロット技術者が選定され、アクティブな
ServiceResourceがあること。
正常なフロー(新規テストデータ)
プロビジョニングを検証 → ライセンスと権限セットを割り当て → 権限セットの割り当てを検証 → 既存のテンプレートを検出 → プロンプトテンプレートをデプロイ → テンプレートのデプロイを検証 → Field Service の設定を読み取る → LDS 設定をデプロイ → LDS が有効であることを検証 → フィールドアクセス権限セットをデプロイ → Work Order レイアウトを読み取る → フィールドをレイアウトに追加 → レイアウト上のフィールドを検証 → テスト用 Work Order を作成 → Service Appointment を作成 → リソースを割り当て → テスト用 Work Order がスケジュール済みであることを検証 → テンプレートのバージョンを解決 → プロンプトテンプレートを有効化(Connect API) → 有効化を検証。
既存テスト用 Work Order の分岐 — test-data-mode が existing の場合、create-test-workorder / create-service-appointment / assign-resource をスキップし、代わりに point-existing-workorder を実行します。実際の Work Order の PreWorkBriefPromptTemplate を更新し、その Service Appointment を本日の時間帯に移動します。
すべてのステップは冪等です。書き込み前に組織の状態を確認するため、再実行しても変更は適用されません。
順序が重要です
- プロンプトテンプレートをデプロイする前に、管理者の権限セット(
EinsteinGPTPromptTemplateManagerを含む)を割り当ててください。 管理者にこの権限がない場合、Prompt Builder から Pre-Work Brief テンプレートタイプが何も通知されずに消え、エラーメッセージが表示されることなく、ドロップダウンの選択肢が見つからない状態でデプロイが失敗します。 - **デバイス上で使用する前に LDS(
lsdkForFieldServiceMobilePref)を有効にしてください。**有効にしないと、モバイルではブリーフが空白で表示されます。
注意点
GenAiPromptTemplateは SOQL/REST でクエリできません。 検出し、Metadata のディープリードで名前から(type=GenAiPromptTemplate、fullName=Pre_Work_Brief)0hfで始まる Id を解決してください。クエリは使用しないでください。- テンプレートのデプロイ本文は、シリアライズされた文字列ではなく JSON オブジェクトとして送信してください。
- レコード全体への書き込みに関する落とし穴 — 2 つの異なる仕組みで、どちらも生の MDAPI デプロイではありません。
deploy-lds-settingとadd-field-to-layoutはどちらも既存のレコード全体を書き込みますが、その方法は異なります。LDS は Field Service 設定コントローラー(saveFieldServiceSettingsConfig)を経由します。フィールド単位のisChanged<Field>による部分パッチで、その本文はトップレベルのuserSettingsキーでラップする必要があります —{"userSettings": {"lsdkForFieldServiceMobilePref": true, "isChangedLsdkForFieldServiceMobilePref": true}}。フラットな本文(フィールドがトップレベルにある場合)は 500CONTROLLER_ERRORNullPointerException(userSettings is null) を返します。Work Order レイアウトは Tooling API のLayout.Metadataのラウンドトリップで、全体置換が行われます。現在の Metadata を先に読み取り(Tooling のLayoutGET —read-workorder-layoutのdescribe/layoutsは配置の確認専用です)、新しいフィールドだけを追加して、オブジェクト全体を PATCH で書き戻してください(省略したキーはデフォルト値にリセットされます)。書き込み時にはfeedLayoutを null に設定し、ServiceReportRelatedList関連リストを削除してください。そうしないと PATCH が 400 を返します(レイアウトのステップの注記を参照)。これは SOAP MDAPI でも/headless/metadata(ルーティングされていません)でもありません — ディスパッチのパススルー経由の Tooling REST です。
プロンプトテンプレートを有効化する(Connect API)
このテンプレートをデプロイした時点では、ステータスは公開済みであり、有効ではありません。有効化するまでランタイムカタログに表示されず、モバイルアプリには 「問題が発生しました。」 と表示されます。有効化はConnect APIを使ってプログラムから実行できます(v65.0/API 258以降で利用可能です)。
PUT /services/data/v67.0/einstein/prompt-templates/{devName}/versions/{versionId}/status?action=activate&ignoreWarnings=false
Body: {}
- まず
versionIdを特定します。 GET/services/data/v67.0/einstein/prompt-templates/{devName}を実行し、childRelationships.GenAiPromptTemplateVersions[].fields.Id.value(3vNで始まるバージョンID)を読み取ります。このGETは、テンプレートが無効でカタログに存在しない場合でも機能します。 - 成功すると、レスポンスは
isSuccessful:true、statusCode:"200"となり、additionalData.wrappedMap.summary.overallSeverityはSAFEになります。テンプレートレベルのIsActiveがtrueに変わり、ActiveVersionIdに値が設定されます(バージョン自体のStatusはPublishedのままです。バージョンレベルの「Published」は、テンプレートレベルでは「Active」を意味します)。 - Apexからは呼び出せません。 このエンドポイントには
@ConnectHidden(from=Apex)が指定されています。ConnectApiではなく、dispatch(またはsf api request rest --method PUT)から呼び出してください。以前にApexのConnectApi.EinsteinLLMやTooling/メタデータを使った方法が失敗したのはこのためです。また、URLの形式が誤っていたこと(/versions/{id}/status?action=activateではなく/activate)と、APIバージョンが早すぎたこと(v62~v66)も原因でした。 verify-activationでは、直後にランタイムのプロンプトテンプレートカタログを読み取り(GET /einstein/prompt-templates?pageSize=200を実行し、Pre_Work_Briefが表示されることを確認)、有効化が反映されたことを確認します。
2026-07-22に非本番組織で実機検証済みです。IsActiveがFalseからTrueに変わり、ActiveVersionIdに値が設定され、同じ呼び出しでテンプレートがランタイムカタログに表示されました。
スコープの境界 — デバイス上でのレンダリング
デバイス上での検証(技術者がField Serviceモバイルアプリを開き、「概要」タブにジョブ固有のコンテンツが表示されることを確認する作業)は、このデプロイプリミティブの対象外であり、連携するPre-Work Briefスキルが担当します。verify-activationでテンプレートが有効であることは確認できますが、Data 360によるグラウンディングでジョブ固有のコンテンツが実際に生成されていることを確認できるのは、デバイス上でのレンダリングだけです。この確認は別途必要で、連携するスキルが担当します。技術者がデバイスで見る内容を返すヘッドレスインターフェースはありません。
出典
sf-skills-internalの連携スキルfield-service-prework-brief-configure(およびそのreferences/ファイル)と、Einstein Pre-Work Briefに関するSalesforceヘルプをもとに作成しました。ディスパッチャー組織で実機検証済みです。ハーネスは実行ごとに、このスキルから順序付きの型付きSORを導出します。
─────
ランタイムコンテキスト(Headless 360/エージェント型): このスキルをHeadless 360/エージェント型のコンテキストで実行する場合は、可能であればCLIツール(sf project deploy、sfdx、シェルコマンド)よりもdispatchツールを優先してください。利用可能な操作は以下のsteps:に記載されています。各操作はライブ組織で検証済みです。正規パスに対してdispatchを使用してください。該当する機能にAPIパスが存在しない場合に限り、CLIへのフォールバックが許容されます。
重要な制約
前提条件:
- EinsteinFieldServicePslがプロビジョニング済みであること(確認方法:
GET /services/data/v67.0/query?q=SELECT Id FROM PermissionSetLicense WHERE DeveloperName='EinsteinFieldServicePsl' returns totalSize>=1) - 管理者にCustomize ApplicationとManage Profiles and Permission Setsの権限があること(確認方法:
session user is a Setup admin) - Einstein生成AIの基本設定(Data 360によるグラウンディングを含む)が完了していること(確認方法:
org-level Einstein Pref enabled; grounding sources reachable) - アクティブなServiceResourceを持つパイロット技術者が選定されていること(確認方法:
GET /services/data/v67.0/query?q=SELECT Id, RelatedRecordId FROM ServiceResource WHERE IsActive=true AND RelatedRecordId='<pilot-user-id>' returns totalSize=1)
検証チェックリスト
書き込み操作のたびに、状態を再読み込みして効果を確認します。
- (書き込み)後:
verify-provisioning(GET /services/data/v67.0/query)を呼び出します assign-perms-admin後:verify-permset-admin(GET /services/data/v67.0/query)を呼び出しますverify-showpreworkbrief-perm後:detect-existing-template(GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName})を呼び出しますdeploy-prompt-template-header後:verify-template-deployed(GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName})を呼び出しますdeploy-lds-setting後:verify-lds-enabled(GET /headless/invoke/platform/document-builder)を呼び出しますadd-field-to-layout後:verify-field-on-layout(GET /services/data/v67.0/sobjects/WorkOrder/describe/layouts)を呼び出しますassign-resource後:verify-workorder-scheduled(GET /services/data/v67.0/query)を呼び出しますactivate-prompt-template後:verify-activation(GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName})を呼び出しますassign-fs-einstein-user-admin後:verify-showpreworkbrief-perm(GET /services/data/v67.0/query)を呼び出します
操作リファレンス
目的別にまとめた操作です。上記のワークフローを構成する要素として使用します。
Summary
| Operation | Purpose | Status | Call | Depends on |
|---|---|---|---|---|
verify-provisioning | verify | — | GET /services/data/v67.0/query | — |
assign-psl-admin | write | — | POST /services/data/v67.0/sobjects/PermissionSetLicenseAssign | verify-provisioning |
assign-perms-admin | write | — | POST /services/data/v67.0/sobjects/PermissionSetAssignment | assign-psl-admin |
verify-permset-admin | verify | — | GET /services/data/v67.0/query | assign-perms-admin |
detect-existing-template | verify | — | GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName} | verify-showpreworkbrief-perm |
deploy-prompt-template-header | write | — | PATCH /headless/invoke/platform/einstein-prompt-studio/insert-prompt-template | detect-existing-template |
verify-template-deployed | verify | — | GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName} | deploy-prompt-template-header |
read-fieldservice-settings | read | — | GET /headless/invoke/platform/document-builder | verify-template-deployed |
deploy-lds-setting | write | — | PATCH /headless/invoke/platform/document-builder-rlm/save-field-service-settings-config | read-fieldservice-settings |
verify-lds-enabled | verify | — | GET /headless/invoke/platform/document-builder | deploy-lds-setting |
deploy-field-access-permset | write | — | POST /services/data/v67.0/sobjects/PermissionSet | verify-lds-enabled |
assign-perms-technician | write | — | POST /services/data/v67.0/sobjects/PermissionSetAssignment | deploy-field-access-permset |
read-workorder-layout | read | — | GET /services/data/v67.0/sobjects/WorkOrder/describe/layouts | assign-perms-technician |
verify-field-on-layout | verify | — | GET /services/data/v67.0/sobjects/WorkOrder/describe/layouts | add-field-to-layout |
create-test-workorder | write | — | POST /services/data/v67.0/sobjects/WorkOrder | verify-field-on-layout |
create-service-appointment | write | — | POST /services/data/v67.0/sobjects/ServiceAppointment | create-test-workorder |
assign-resource | write | — | POST /services/data/v67.0/sobjects/AssignedResource | create-service-appointment |
verify-workorder-scheduled | verify | — | GET /services/data/v67.0/query | assign-resource |
point-existing-workorder | write | — | PATCH /services/data/v67.0/sobjects/WorkOrder/{Id} | verify-field-on-layout |
resolve-template-version | read | — | GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName} | verify-workorder-scheduled, point-existing-workorder |
activate-prompt-template | write | — | PUT /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName}/versions/{versionId}/status?action=activate&ignoreWarnings=false | resolve-template-version |
verify-activation | verify | — | GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName} | activate-prompt-template |
assign-fs-einstein-psl-admin | write | — | POST /services/data/v67.0/sobjects/PermissionSetLicenseAssign | verify-permset-admin |
assign-fs-einstein-user-admin | write | — | POST /services/data/v67.0/sobjects/PermissionSetAssignment | assign-fs-einstein-psl-admin |
verify-showpreworkbrief-perm | verify | — | GET /services/data/v67.0/query | assign-fs-einstein-user-admin |
add-field-to-layout | write | — | PATCH /services/data/v67.0/tooling/sobjects/Layout/{layoutId} | read-workorder-layout |
Dependency graph
graph TD
verify_provisioning["verify-provisioning (verify)"]
assign_psl_admin["assign-psl-admin (write)"]
assign_perms_admin["assign-perms-admin (write)"]
verify_permset_admin["verify-permset-admin (verify)"]
detect_existing_template["detect-existing-template (verify)"]
deploy_prompt_template_header["deploy-prompt-template-header (write)"]
verify_template_deployed["verify-template-deployed (verify)"]
read_fieldservice_settings["read-fieldservice-settings (read)"]
deploy_lds_setting["deploy-lds-setting (write)"]
verify_lds_enabled["verify-lds-enabled (verify)"]
deploy_field_access_permset["deploy-field-access-permset (write)"]
assign_perms_technician["assign-perms-technician (write)"]
read_workorder_layout["read-workorder-layout (read)"]
verify_field_on_layout["verify-field-on-layout (verify)"]
create_test_workorder["create-test-workorder (write)"]
create_service_appointment["create-service-appointment (write)"]
assign_resource["assign-resource (write)"]
verify_workorder_scheduled["verify-workorder-scheduled (verify)"]
point_existing_workorder["point-existing-workorder (write)"]
resolve_template_version["resolve-template-version (read)"]
activate_prompt_template["activate-prompt-template (write)"]
verify_activation["verify-activation (verify)"]
assign_fs_einstein_psl_admin["assign-fs-einstein-psl-admin (write)"]
assign_fs_einstein_user_admin["assign-fs-einstein-user-admin (write)"]
verify_showpreworkbrief_perm["verify-showpreworkbrief-perm (verify)"]
add_field_to_layout["add-field-to-layout (write)"]
verify_provisioning --> assign_psl_admin
assign_psl_admin --> assign_perms_admin
assign_perms_admin --> verify_permset_admin
verify_showpreworkbrief_perm --> detect_existing_template
detect_existing_template --> deploy_prompt_template_header
deploy_prompt_template_header --> verify_template_deployed
verify_template_deployed --> read_fieldservice_settings
read_fieldservice_settings --> deploy_lds_setting
deploy_lds_setting --> verify_lds_enabled
verify_lds_enabled --> deploy_field_access_permset
deploy_field_access_permset --> assign_perms_technician
assign_perms_technician --> read_workorder_layout
add_field_to_layout --> verify_field_on_layout
verify_field_on_layout --> create_test_workorder
create_test_workorder --> create_service_appointment
create_service_appointment --> assign_resource
assign_resource --> verify_workorder_scheduled
verify_field_on_layout --> point_existing_workorder
verify_workorder_scheduled --> resolve_template_version
point_existing_workorder --> resolve_template_version
resolve_template_version --> activate_prompt_template
activate_prompt_template --> verify_activation
verify_permset_admin --> assign_fs_einstein_psl_admin
assign_fs_einstein_psl_admin --> assign_fs_einstein_user_admin
assign_fs_einstein_user_admin --> verify_showpreworkbrief_perm
read_workorder_layout --> add_field_to_layout
Read operations
read-fieldservice-settings
Field Service の設定シングルトンを読み取ります(userSettings マップ — モバイル上の LDS 用の lsdkForFieldServiceMobilePref、その他の設定)。結果は、verify-lds-enabled における deploy-lds-setting の読み戻し契約で使う書き込み前のスナップショットです。FieldServiceSettings SOR から再利用されます。
呼び出し: GET /headless/invoke/platform/document-builder
依存関係: verify-template-deployed
出力: body.body にある FieldServiceSettingsSerializer マップ。重要なキーは lsdkForFieldServiceMobilePref です(Field Service Mobile 用の Lightning Data Service — これがないと、Pre-Work Brief はデバイス上で空白になります)。このステップは verify-lds-enabled 用のスナップショットです。deploy-lds-setting はマップ全体を使用しません(入力を参照してください。コントローラーでは isChanged の部分パッチセマンティクスが使われます)。
read-workorder-layout
WorkOrder のページレイアウトとレコードタイプを列挙します。結果は add-field-to-layout / verify-field-on-layout に渡されます。レスポンスは大きくなります(約 200KB)。
呼び出し: GET /services/data/v67.0/sobjects/WorkOrder/describe/layouts
依存関係: assign-perms-technician
出力: layoutSections/detailLayoutSections と buttonLayoutSection を含む layouts[] 配列、および recordTypeId -> layoutId のマッピングである recordTypeMappings[]。技術者のレイアウトの detailLayoutSections[].layoutRows[].layoutItems[].layoutComponents[].value を調べて、'PreWorkBriefPromptTemplate' が含まれているか確認します。
resolve-template-version
デプロイ済みの Pre_Work_Brief テンプレートから 3vN プレフィックスのバージョン Id を抽出します。detect-existing-template / verify-template-deployed と同じ GET ですが、このステップでは有効化にバージョン Id 自体が必要なため、別の ID のもとで再読み込みします。childRelationships.GenAiPromptTemplateVersions[].fields.Id.value を読み取り、fields.Status.value == 'Published' となるエントリー(有効化前のバージョン)を選択します。
呼び出し: GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName}
入力:
promptTemplateDevName(String) — このワークフローでは固定値 'Pre_Work_Brief' です。
依存関係: verify-workorder-scheduled、point-existing-workorder
出力: childRelationships.GenAiPromptTemplateVersions[].fields.Id.value — activate-prompt-template が使用する 3vN プレフィックスのバージョン Id。テンプレートが無効な場合やランタイムカタログに存在しない場合でも、GET は機能します。
注記: branch_join:両方のテストデータ分岐の合流点です。verify-workorder-scheduled は新規分岐の末端、point-existing-workorder は既存分岐の末端です。この2つは相互排他的であるため、先行ステップのうち実行されるのは必ず一方です。どちらのモードでも有効化が実行されます。ここでの depends_on はバリアではなく OR 結合として扱ってください。
書き込み操作
assign-psl-admin
PermissionSetLicenseAssign の作成を通じて、管理者ユーザーに Einstein-for-Field-Service PSL を付与します。冪等です。DUPLICATE_VALUE(STATUSCODE)は、割り当て済みとして成功扱いにします。
呼び出し: POST /services/data/v67.0/sobjects/PermissionSetLicenseAssign
入力:
AssigneeId(String) — 18 文字のユーザー Id(005 プレフィックス)。PermissionSetLicenseId(String) — verify-provisioning から取得した 0PL プレフィックスの PSL Id。- 取得元: verify-provisioning の出力
依存関係: verify-provisioning
ロールバック: DELETE /sobjects/PermissionSetLicenseAssign/{id}
注記: 冪等性:DUPLICATE_VALUE -> 成功(割り当て済み)
assign-perms-admin
管理者に EinsteinGPTPromptTemplateManager を付与します。これにより、Prompt Studio での作成アクセスが可能になります。注(2026-08-25 修正):この権限セットでは、Pre-Work Brief テンプレートの TYPE は表示されません。このタイプは UserPermission ShowPreWorkBriefGA によって制御されています(assign-fs-einstein-user-admin を参照)。FS 評価用のフル機能組織では ShowPreWorkBriefGA が既定で有効なため、この権限セットだけで十分なように見えましたが、新規組織ではそうではありません。冪等性あり:DUPLICATE_VALUE は割り当て済みとして処理し、エラーを無視します。
呼び出し: POST /services/data/v67.0/sobjects/PermissionSetAssignment
入力:
AssigneeId(String)PermissionSetId(String) — 0PS で始まる PermissionSet Id です。SELECT Id FROM PermissionSet WHERE Name='EinsteinGPTPromptTemplateManager' を使用して解決します。
依存関係: assign-psl-admin
ロールバック: DELETE /sobjects/PermissionSetAssignment/{id}
注記: 冪等性:DUPLICATE_VALUE → 成功。skill_gotcha:deploy-prompt-template-header の前にこれを省略すると、エラーは表示されず、ドロップダウンの選択肢が欠落するというサイレントな失敗が発生します。
deploy-prompt-template-header
Pre_Work_Brief GenAiPromptTemplate(type einstein_gpt__fieldServicePreWorkBrief)を、version、WorkOrder input、Flow DataProvider を childRelationships 経由でインラインに含めた単一の insertPromptTemplate 呼び出しで作成します。insertPromptTemplate はヘッダーのみのレコードを拒否し("Prompt Template[null] has no versions")、createPromptTemplateVersion は既存のテンプレートにしかバージョンを追加できないため、ヘッダー、バージョン、入力、プロバイダーは単一のトランザクションでまとめて作成します。detect-existing-template が 200 を返した場合はスキップします。スキルにおける MDAPI デプロイ前提を修正しました。このディスパッチャーでは /headless/metadata にルーティングされないため、einstein-prompt-studio が正規の代替手段です。
呼び出し: PATCH /headless/invoke/platform/einstein-prompt-studio/insert-prompt-template
入力:
-
promptTemplate(object) — 単一呼び出しで挿入する完全な GenAiPromptTemplate。JSON オブジェクトとして送信します(シリアライズされた文字列ではありません)。正確なネスト構造は次のとおりです(各ノードはラッパー形式 {apiName, id:null, isStandard:false, isOverridable:false, additionalFields:{}, fields:{...}, childRelationships:{...}} を使用します)。 apiName は必ずノードのエンティティ型名を指定してください(null は不可)。最上位ノードには 'GenAiPromptTemplate'、ネストされたノードには 'GenAiPromptTemplateVersion'、'GenAiPromptTemplateInput'、'GenAiPromptTemplateDataProvider'、'GenAiPromptTemplateDataProviderParam' を指定します。apiName が null の場合、CONTROLLER_ERROR("Cannot invoke String.equals ... getApiName() is null")が発生します。Flow の参照(DataProvider の Definition/ReferenceName と、バージョンの Content マージフィールド)には、名前空間を含む完全な Flow 名 sfdc_fieldservice__ModifyPWB を使用する必要があります。FlowDefinitionView.ApiName(ModifyPWB)のみを指定すると、flow-accessibility("ModifyPWB is not accessible")で失敗します。promptTemplate.fields: DeveloperName='Pre_Work_Brief', MasterLabel='Pre-Work Brief', Type='einstein_gpt__fieldServicePreWorkBrief', Visibility='Global'
promptTemplate.childRelationships.GenAiPromptTemplateVersions[0]: .fields: Content='{!$Flow:sfdc_fieldservice__ModifyPWB.Prompt}', PrimaryModel='sfdc_ai__DefaultOpenAIGPT4OmniMini' .childRelationships.GenAiPromptTemplateInputs[0].fields: ApiName='WorkOrder' (テンプレート型のスキーマ入力名と一致する必要があります), ReferenceName='Input:WorkOrder', MasterLabel='Work Order', Definition='SOBJECT://WorkOrder', IsRequired=true .childRelationships.GenAiPromptTemplateDataProviders[0]: .fields: Definition='flow://sfdc_fieldservice__ModifyPWB', ReferenceName='Flow:sfdc_fieldservice__ModifyPWB' .childRelationships.GenAiPromptTemplateDataProviderParams[0].fields: Definition='SOBJECT://WorkOrder', ParameterName='WorkOrder', IsRequired=true, ValueExpression='{!$Input:WorkOrder}'
Flow DataProvider は必ず明示的に指定してください。設定済みアクションのゲートが有効な場合、自動的に導出されるのは DataGraph プロバイダーのみで、Flow プロバイダーはクライアント側で管理します。前提条件:対象の組織に sfdc_fieldservice__ModifyPWB フロー(ProcessType=PromptFlow、active)と WorkOrder 入力変数が存在しない場合、MissingTemplateInputs/プロバイダー検証エラーが繰り返し発生します。
依存関係: detect-existing-template
出力: 0hf で始まる Id、DeveloperName、MasterLabel、IsActive=false を持つ作成済みテンプレートレコードと、インラインのバージョン(LastCreatedVersionId は 3vN で始まり、LastUsedVersionNumber=1)。
deploy-lds-setting
saveFieldServiceSettingsConfig を使用して、Field Service Mobile の Lightning Data Service を有効にします。リクエストの形式(重要):PATCH の本文では、差分をトップレベルの「userSettings」キーの下に含める必要があります — {"userSettings": {"lsdkForFieldServiceMobilePref": true, "isChangedLsdkForFieldServiceMobilePref": true}}。フラットな本文(フィールドがトップレベルにある形式)を送信すると、500 CONTROLLER_ERROR NullPointerException(「userSettings is null」)が発生します。userSettings 内では、コントローラーは isChanged による部分パッチのセマンティクスを使用します。lsdkForFieldServiceMobilePref=true と isChangedLsdkForFieldServiceMobilePref=true をセットで渡してください。isChanged フラグを省略すると、本文が true の 200 が返されますが、何も永続化されません。userSettings 内には、差分と対応する isChanged フラグのみを送信し、読み戻したマップ全体は送信しないでください。本文が true の 200 が返っても、それだけでは永続化の証明にはなりません。必ず getFieldServiceSettingsConfig で読み戻して確認してください。
呼び出し: PATCH /headless/invoke/platform/document-builder-rlm/save-field-service-settings-config
入力:
lsdkForFieldServiceMobilePref(boolean) — Lightning-SDK-for-Field-Service-Mobile 組織設定の目標値(有効にする場合は true)。ORG_PREFERENCE_LSDK_FOR_FIELD_SERVICE_MOBILE によって管理されます。isChangedLsdkForFieldServiceMobilePref(boolean) — lsdkForFieldServiceMobilePref を永続化するには true にする必要があります。コントローラーのフィールドごとの isChanged ゲートは、対応するフラグが存在しない、または false の場合、そのフィールドを黙ってスキップします。本文が {body:true} の 200 が返っても、値が反映されたことの確認にはなりません。必ず getFieldServiceSettingsConfig で読み戻して確認してください。
依存関係: read-fieldservice-settings
ロールバック: lsdkForFieldServiceMobilePref=<書き込み前のスナップショット値> と isChangedLsdkForFieldServiceMobilePref=true を指定して再度 PATCH します。
注記: partial_patch_semantics:フィールドごとの isChanged ゲート。本文が true の 200 が返っても、書き込みの確認にはなりません。必ず読み戻してください。
deploy-field-access-permset
PermissionSet「PreWorkBrief_Field_Access」と、WorkOrder.PreWorkBriefPromptTemplate 用の FieldPermissions 行(Read を付与)を作成します。ネイティブの CRUD により、このスキルが想定していた MDAPI デプロイの手順を置き換えます。冪等性があります。PermissionSet の挿入時に DUPLICATE_DEVELOPER_NAME が発生した場合は無視し、既存のパーミッションセットを再利用します。
呼び出し: POST /services/data/v67.0/sobjects/PermissionSet
入力:
Name(String) — 「PreWorkBrief_Field_Access」Label(String) — 「Pre-Work Brief Field Access」
依存関係: verify-lds-enabled
出力: 作成された PermissionSet Id(0PS で始まる)。後続の POST /sobjects/FieldPermissions では、ParentId として使用し、SobjectType='WorkOrder'、Field='WorkOrder.PreWorkBriefPromptTemplate'、PermissionsRead=true を指定します。
ロールバック: DELETE /sobjects/PermissionSet/{id}
注記: composite:後続処理:ParentId=、SobjectType='WorkOrder'、Field='WorkOrder.PreWorkBriefPromptTemplate'、PermissionsRead=true を指定して POST /sobjects/FieldPermissions を実行します。
assign-perms-technician
パイロット技術者に PSL、FieldServiceMobileStandardPermSet、PreWorkBrief_Field_Access を付与します。書き込みは 3 回(PermissionSetLicenseAssign 1 回と PermissionSetAssignment 2 回)です。冪等性があります。各行で DUPLICATE_VALUE は無視されます。
呼び出し: POST /services/data/v67.0/sobjects/PermissionSetAssignment
入力:
AssigneeId(String) — パイロット技術者の User Id。PermissionSetId(String) — パーミッションセットごとに 1 回ずつ呼び出します。PSL は PermissionSetLicenseId を指定して POST /sobjects/PermissionSetLicenseAssign を実行し、付与します。
依存関係: deploy-field-access-permset
ロールバック: 各行について DELETE /services/data/v67.0/sobjects/PermissionSetAssignment/{id} を実行します(PSL については DELETE /services/data/v67.0/sobjects/PermissionSetLicenseAssign/{id} も実行します)。
注記: 冪等性:行ごとに DUPLICATE_VALUE → 成功
create-test-workorder
PreWorkBriefPromptTemplate を指定したテスト用 WorkOrder を作成します。test-data-mode=existing の場合はスキップされ、代わりに point-existing-workorder ブランチが実行されます。実行後のクリーンアップ用に、Subject に 'B4Expertise_<run_id>_create-test-workorder' の冪等性タグを付けます。
呼び出し: POST /services/data/v67.0/sobjects/WorkOrder
入力:
Subject(String) — 実行後のクリーンアップ用に 'B4Expertise_<run_id>_create-test-workorder' のタグを付けます。Status(String) — 例:'New'PreWorkBriefPromptTemplate(String) — WorkOrder.PreWorkBriefPromptTemplate は GenAiPromptTemplate への参照項目です。DeveloperName ではなく、0hf プレフィックスのテンプレート Id を渡します。verify-template-deployed のレスポンス本文(GET /einstein/prompt-templates/Pre_Work_Brief)から Id を解決します。トップレベルの "id"、または "fields" オブジェクト内の "Id" 値を読み取ります。DeveloperName 'Pre_Work_Brief' を渡すと、400 INVALID_INPUT "Enter a valid Pre-Work Brief prompt template ID" が返されます。
依存関係: verify-field-on-layout
ロールバック: DELETE /sobjects/WorkOrder/{id}
create-service-appointment
テスト用 WorkOrder の ServiceAppointment を作成し、技術者が今日デバイス上で予定を確認できるように、SchedStartTime/SchedEndTime を今日の時間枠内に設定します。
呼び出し: POST /services/data/v67.0/sobjects/ServiceAppointment
入力:
ParentRecordId(String) — create-test-workorder の WorkOrder Id。- ソース:
create-test-workorderの出力
- ソース:
SchedStartTime(String) — 今日の時間枠内の ISO 日時。SchedEndTime(String)
依存関係: create-test-workorder
ロールバック: DELETE /sobjects/ServiceAppointment/{id}
assign-resource
パイロット技術者の ServiceResource とテスト用 ServiceAppointment をリンクする AssignedResource を作成します。SELECT Id FROM ServiceResource WHERE RelatedRecordId='' AND IsActive=true で ServiceResource を解決します。
呼び出し: POST /services/data/v67.0/sobjects/AssignedResource
入力:
ServiceAppointmentId(String)ServiceResourceId(String)
依存関係: create-service-appointment
ロールバック: DELETE /sobjects/AssignedResource/{id}
point-existing-workorder
既存テストデータのブランチです。既存の実際の WorkOrder の PreWorkBriefPromptTemplate を Pre_Work_Brief テンプレート Id に PATCH し、さらに ServiceAppointment の SchedStartTime/SchedEndTime を今日の時間枠内に PATCH します。test-data-mode=existing の場合、create-test-workorder -> create-service-appointment -> assign-resource の代わりに実行されます。
呼び出し: PATCH /services/data/v67.0/sobjects/WorkOrder/{Id}
入力:
Id(String) — パス — 調整を行うスキルから渡される WorkOrder Id。PreWorkBriefPromptTemplate(String) — 0hf プレフィックスの GenAiPromptTemplate Id(DeveloperName ではありません)。verify-template-deployed のレスポンス本文から解決します。DeveloperName 'Pre_Work_Brief' を指定して PATCH すると、400 INVALID_INPUT が返されます。
依存関係: verify-field-on-layout
ロールバック: PATCH の前に、変更前の PreWorkBriefPromptTemplate と SA の SchedStart/End を保存し、ロールバック時に元に戻す PATCH を行います。
注記: composite: フォローアップ:今日の時間枠内の SchedStartTime と SchedEndTime を指定して、PATCH /sobjects/ServiceAppointment/{SA-Id} を実行します。; branch: test-data-mode=='existing' の場合にのみ実行されます。create-test-workorder / create-service-appointment / assign-resource とは相互排他です。
activate-prompt-template
einstein-gpt-connect-api のバージョンステータスエンドポイントを使用して、Pre_Work_Brief を Published から Active に切り替えます。リクエスト本文は空です。成功時のレスポンスは isSuccessful:true、statusCode:"200"、additionalData.wrappedMap.summary.overallSeverity:"SAFE" です。テンプレートレベルの IsActive は true に切り替わり、ActiveVersionId が設定されます(バージョン自体の Status は Published のままです。バージョンレベルの「Published」は、テンプレートレベルの「Active」に相当します)。冪等性があります。すでに Active のバージョンを再度有効化すると、200 SAFE が返されます。エンドポイントは @ConnectHidden(from=Apex) のため、ConnectApi ではなく、dispatch またはネイティブ REST 経由で呼び出してください。
呼び出し: PUT /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName}/versions/{versionId}/status?action=activate&ignoreWarnings=false
入力:
promptTemplateDevName(String) — パスパラメーター。このワークフローでは固定値 'Pre_Work_Brief' を指定します。versionId(String) — パスパラメーター。resolve-template-version から取得した 3vN で始まるバージョン Id です。- ソース:
resolve-template-versionの出力
- ソース:
action(String) — クエリパラメーター。'activate'(この手順)または 'deactivate'(ロールバック)を指定します。デフォルト値はありません。ignoreWarnings(boolean) — クエリパラメーター。デフォルトは false です。WARNING の重大度を持つ安全な変更の評価を受け入れて、とにかく有効化する場合は true に設定します。リスクのある有効化をプラットフォームの安全な変更ルールでブロックする場合は false のままにします。
依存関係: resolve-template-version
出力: isSuccessful:true、statusCode:"200"、errorMessages:[]、hasWarning:false、warningMessages:[]、templateId はエコーバックされ、templateType:"einstein_gpt__fieldServicePreWorkBrief"、versionId はエコーバックされ、additionalData.wrappedMap.summary.overallSeverity:"SAFE"(または "WARNING"/"ERROR")です。書き込み後の副作用: fields.IsActive は false から true に切り替わり、fields.ActiveVersionId には渡された versionId が設定されます。
ロールバック: PUT /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName}/versions/{versionId}/status?action=deactivate
注意: empty_body: リクエスト本文は空です({})。フィールドはありません。; apex_hidden: エンドポイントは @ConnectHidden(from=Apex) のため、ConnectApi.EinsteinLLM からは呼び出せません。dispatch / sf api request rest --method PUT / 任意のネイティブ REST クライアント経由で呼び出してください。; access_check: x-sfdc.org-access-check: EinsteinGPT.orgHasEinsteinGPTEnabled — 組織で Einstein GPT を有効にする必要があります。; idempotency: すでに Active のバージョンを再度有効化すると、エラーなしで 200 SAFE が返されます。安全に再実行できます。; api_version: v65.0 以降で利用可能です(API 258 以降)。それ以前のバージョン(v62-v66 の一部)や、誤った URL 形式(/versions/{id}/status?action=activate ではなく /activate)では、2xx 以外が返されます。
assign-fs-einstein-psl-admin
EinsteinFieldServicePsl PSL(「Einstein for Field Service」)を管理者に付与します。この PSL によって UserPermission ShowPreWorkBriefGA がライセンスされ、fieldServicePreWorkBrief テンプレートタイプの使用が可能になります。冪等性があります。DUPLICATE_VALUE は、すでに割り当て済みとして成功扱いにします。
呼び出し: POST /services/data/v67.0/sobjects/PermissionSetLicenseAssign
入力:
AssigneeId(String) — 18 文字の管理者 User Id(005 で始まる値)。PermissionSetLicenseId(String) — 0PL で始まる PSL Id。SELECT Id FROM PermissionSetLicense WHERE DeveloperName='EinsteinFieldServicePsl' を実行して解決します。
依存関係: verify-permset-admin
ロールバック: DELETE /sobjects/PermissionSetLicenseAssign/{id}
注意: idempotency: DUPLICATE_VALUE -> 成功(すでに割り当て済み)
assign-fs-einstein-user-admin
管理者に EinsteinFieldServiceUser 権限セット(PermissionsShowPreWorkBriefGA=true)を付与します。これにより UserPermission ShowPreWorkBriefGA が付与され、getPromptTemplateTypes / insertPromptTemplate で fieldServicePreWorkBrief テンプレートタイプが有効になります。これは後続処理に不可欠です。deploy-prompt-template-header より前に適用する必要があります。そうしないと、このタイプは「有効ではない」と判定されます。冪等です。
呼び出し: POST /services/data/v67.0/sobjects/PermissionSetAssignment
入力:
AssigneeId(String)PermissionSetId(String) — 0PS プレフィックス付きの PermissionSet ID です。SELECT Id FROM PermissionSet WHERE Name='EinsteinFieldServiceUser' で解決します。
依存関係: assign-fs-einstein-psl-admin
ロールバック: DELETE /sobjects/PermissionSetAssignment/{id}
注意: 冪等性: DUPLICATE_VALUE は成功として扱います。skill_gotcha: これがないと、デプロイは「Prompt Template Type is not valid」というエラーで失敗します(権限があらかじめ付与されているフル FS 評価用組織では、エラーは表示されません)。
add-field-to-layout
Tooling API の Layout.Metadata のラウンドトリップを使用して、技術者の作業指示ページレイアウトに WorkOrder.PreWorkBriefPromptTemplate を追加します(未対応ではありません。以前の「レイアウト全体を書き込む API はない」という注記は、ディスパッチサーフェスについて誤りでした。/headless/metadata はルーティングされていませんが、Tooling REST はそのまま通過します。また、これは SOAP MDAPI ではありません)。ラウンドトリップの手順:(1)レイアウト Id を解決します — GET /tooling/query?q=SELECT Id, Name, TableEnumOrId FROM Layout WHERE TableEnumOrId='WorkOrder'(00h で始まる Id)。(2)メタデータ全体を読み取ります — GET /tooling/sobjects/Layout/{id} を実行し、Metadata オブジェクトを保持します。(3)layoutSections[].layoutColumns[].layoutItems[] に layoutItem {behavior:'Edit', field:'PreWorkBriefPromptTemplate'} を挿入します(例:「Information」セクション)。(4){"Metadata": } を指定して /tooling/sobjects/Layout/{id} に PATCH します — HTTP 204 = 成功。Tooling Metadata への書き込みは全体置換のため、Metadata オブジェクト全体をラウンドトリップし、追加する項目だけを変更してください。書き込み時に注意すべき点が 2 つあります(どちらも PATCH が 400 になります)。(a)feedLayout.rightComponents[].componentType は読み取り時に文字列として返されますが、書き込み側では拒否されます(「Cannot deserialize instance of complexvalue from VALUE_STRING」)— 書き込み時に feedLayout:null を設定します(Chatter フィードの表示レイアウトがデフォルトにリセットされます)。(b)ServiceReportRelatedList 関連リストは書き込み時の検証に失敗します(「Mass quick actions don't support ServiceReport」)— その relatedLists エントリを削除します。どちらも全体置換による副作用です(フィード表示がリセットされ、Service Reports 関連リストが削除されます)。このフィールドを表示するために許容できる変更であり、Layout Editor で元に戻せます。項目レベルのセキュリティは deploy-field-access-permset(FieldPermissions)で別途付与します — この手順はレイアウトへの配置のみを行います。
呼び出し: PATCH /services/data/v67.0/tooling/sobjects/Layout/{layoutId}
入力:
layoutId(String) — 00h で始まる Layout Id。GET /tooling/query?q=SELECT Id FROM Layout WHERE TableEnumOrId='WorkOrder' で解決します。Metadata(object) — GET /tooling/sobjects/Layout/{id} からラウンドトリップした Layout Metadata オブジェクト全体。layoutSections の列に、layoutItem {behavior:'Edit', field:'PreWorkBriefPromptTemplate'} を 1 つ追加します。feedLayout:null を設定し、ServiceReportRelatedList の relatedLists エントリを削除します(説明にある注意点を参照)。全体置換のセマンティクスにより、省略したキーはデフォルトにリセットされます。
依存関係: read-workorder-layout
出力: HTTP 204 No Content = レイアウトが更新されました。verify-field-on-layout(describe/layouts のスキャン)で確認します。
ロールバック: 手順(2)で取得した書き込み前の Metadata スナップショットを指定して /tooling/sobjects/Layout/{id} に再度 PATCH します。
注記: transport:ディスパッチ上のネイティブパススルーによる Tooling REST — Metadata API SOAP ではありません。/headless/metadata は引き続きルーティングされません。;full_replace:Tooling Metadata への書き込みはレイアウト全体を置換します。Metadata オブジェクト全体をラウンドトリップし、追加する項目だけを変更してください。;write_footguns:feedLayout は null にする必要があります(書き込み側でラウンドトリップされた componentType の文字列が拒否されます)。ServiceReportRelatedList は削除する必要があります(「Mass quick actions don't support ServiceReport」)。どちらも全体置換による副作用です。
検証操作
verify-provisioning
EinsteinFieldServicePsl の PermissionSetLicense を読み取ります。行が 0 件の場合、組織はプロビジョニングされていません。連携スキルは STOP に進みます。冪等な読み取りです。
呼び出し: GET /services/data/v67.0/query
入力:
q(String) — SOQL:SELECT Id, DeveloperName FROM PermissionSetLicense WHERE DeveloperName='EinsteinFieldServicePsl'
出力: records[0].Id = assign-psl-admin / assign-perms-technician で使用する、0PL で始まる PSL Id。
verify-permset-admin
プロンプトテンプレートをデプロイする前に、管理者が EinsteinGPTPromptTemplateManager を保持していることを SOQL で確認します。ドロップダウンに項目が表示されないまま失敗する問題を防ぎます。
呼び出し: GET /services/data/v67.0/query
入力:
q(String) — SELECT Id FROM PermissionSetAssignment WHERE AssigneeId='' AND PermissionSet.Name='EinsteinGPTPromptTemplateManager'
依存先: assign-perms-admin
出力: totalSize>=1 -> ゲート通過。
detect-existing-template
ランタイムカタログ経由で Pre_Work_Brief を読み取ります。役割は 2 つあります。(1) 冪等性ゲート — fields.DeveloperName='Pre_Work_Brief' を含む 200 が返された場合は deploy-prompt-template-header / -version をスキップし、404 の場合は続行します。(2) 有効化前の事前読み取り — fields.IsActive と fields.ActiveVersionId を取得します。GenAiPromptTemplate は SOQL/Tooling クエリで取得できません。この Connect API が正規の読み取り経路です。
呼び出し: GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName}
入力:
promptTemplateDevName(String) — このワークフローでは固定値 'Pre_Work_Brief' を使用します。
依存先: verify-showpreworkbrief-perm
出力: fields.Id = 0hf で始まるテンプレート ID。fields.IsActive はブール値。fields.ActiveVersionId(有効な場合に設定され、そうでない場合は null)。childRelationships.GenAiPromptTemplateVersions[].fields.Id.value = 3vN で始まるバージョン ID(テンプレートが無効でも Published)。
注記: skill_gotcha: GenAiPromptTemplate に対する SOQL/Tooling は INVALID_TYPE 400 を返します。この Connect API が唯一の読み取り経路です。
verify-template-deployed
デプロイ後に Pre_Work_Brief を読み戻します。fields.Id が設定されていることと、childRelationships.GenAiPromptTemplateVersions にデプロイしたバージョンが Status='Published' で含まれていることを確認します。detect-existing-template と同じエンドポイントで、デプロイ前後の契約を構成します。後続ステップが必要とする 0hf で始まるテンプレート ID を出力します(create-test-workorder / point-existing-workorder はこのレスポンスの fields.Id を読み取ります)。
呼び出し: GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName}
入力:
promptTemplateDevName(String)
依存先: deploy-prompt-template-header
出力: fields.Id が存在する(0hf で始まる — 後続処理で WorkOrder.PreWorkBriefPromptTemplate の参照に使用)。childRelationships.GenAiPromptTemplateVersions[].fields.Status == 'Published'。有効化前は fields.IsActive == false(activate-prompt-template で切り替わります)。
verify-lds-enabled
Field Service 設定を読み戻し、書き込み後に body.body.lsdkForFieldServiceMobilePref==true であることを確認します。read-fieldservice-settings と同じエンドポイントで、読み取り前後の書き込み契約を構成します。deploy-lds-setting は、対応する isChanged フラグが設定されているかどうかにかかわらず 200 を返すため、この確認が必要です。
呼び出し: GET /headless/invoke/platform/document-builder
依存先: deploy-lds-setting
出力: 書き込み後に body.body.lsdkForFieldServiceMobilePref == true。この値に差異がある場合、deploy-lds-setting で対応する isChangedLsdkForFieldServiceMobilePref フラグが設定されていなかったことを示します。
verify-field-on-layout
WorkOrder レイアウトの describe(GET /sobjects/WorkOrder/describe/layouts)をスキャンし、技術者のレイアウトセクションに value='PreWorkBriefPromptTemplate' を持つ layoutComponent があるか確認します。存在する場合は add-field-to-layout が適用済みです。存在しない場合は、Tooling Metadata PATCH が適用されていません(ラウンドトリップと 2 つの書き込み時の落とし穴を再確認してください)。
呼び出し: GET /services/data/v67.0/sobjects/WorkOrder/describe/layouts
依存先: add-field-to-layout
出力: ブール値: 技術者のレイアウトに PreWorkBriefPromptTemplate が存在するか。false で add-field-to-layout が未解決の場合は、ハードフェイルする代わりにレイアウトエディターへのディープリンクをユーザーに提示します。
verify-workorder-scheduled
SOQL によるスモークテスト:SELECT Id, SchedStartTime FROM ServiceAppointment WHERE WorkOrderId='' AND SchedStartTime = TODAY。冪等性と、今日の時間枠内に登録されていることの契約を確認します。
呼び出し: GET /services/data/v67.0/query
入力:
q(String)
依存関係: assign-resource
出力: totalSize==1 -> 一連の処理が今日中に完了しています。0 -> SA が今日の時間枠外にあるか、存在しません。
verify-activation
ランタイムのプロンプトテンプレートカタログを読み取り、有効化が反映されたことを確認します。同等の読み取り方法が2つあります。どちらかを選んでください。(a) 詳細を読み取る GET /einstein/prompt-templates/{devName} を実行し、fields.IsActive.value==true かつ fields.ActiveVersionId.value が設定されていることを確認します。(b) カタログ一覧の GET /einstein/prompt-templates?pageSize=200 を実行し、promptRecords[] に fields.DeveloperName.value=='Pre_Work_Brief' かつ fields.IsActive.value==true のエントリが含まれていることを確認します。カタログ一覧を使う方法では、テンプレートがランタイムカタログに表示されていること(エージェント/モバイルクライアントから参照できること)も確認できます。
呼び出し: GET /services/data/v67.0/einstein/prompt-templates/{promptTemplateDevName}
入力:
promptTemplateDevName(String)
依存関係: activate-prompt-template
出力: fields.IsActive.value==true かつ fields.ActiveVersionId.value が設定済み -> 有効化が反映されています。任意のカタログ一覧による代替確認では、GET /einstein/prompt-templates?pageSize=200 を実行し、promptRecords[?fields.DeveloperName.value=='Pre_Work_Brief'].fields.IsActive.value==true であることを確認すると、ランタイムカタログから参照できることを確認できます。
verify-showpreworkbrief-perm
プロンプトテンプレートをデプロイする前に、管理者が実効的に UserPermission ShowPreWorkBriefGA を保有していることを確認します。これは fieldServicePreWorkBrief タイプの実際のゲートです。「Prompt Template Type is not valid」エラーを防ぎます。
呼び出し: GET /services/data/v67.0/query
入力:
q(String) — SELECT Id FROM PermissionSetAssignment WHERE AssigneeId='' AND PermissionSet.Name='EinsteinFieldServiceUser'
依存関係: assign-fs-einstein-user-admin
出力: totalSize>=1 -> ゲートが解除されています(ShowPreWorkBriefGA が付与されています)。