service-itsm-agentic-setup-fulfiller-agent-configure
Create and activate the IT Service Fulfiller agent as a Next-Gen Authoring (NGA) native agent from the shipped ITSM Fulfiller template's Agent Script, using the Salesforce CLI (sf): read the template, check idempotency, create the NGA bundle then publish and activate it, then verify it is live. Idem
By forcedotcom · 1,126 installs
npx skills add forcedotcom/sf-skills --skill service-itsm-agentic-setup-fulfiller-agent-configure
Source repository · Upstream listing
Create the IT Service Fulfiller Agent
Create and activate the IT Service Fulfiller Agent as a Next Gen Authoring (NGA) native agent — Agent Script based ( AiAuthoringBundleDefVer /bundle), appearing natively in Agentforce Studio's Agents list with no external link icon — entirely through the Salesforce CLI ( sf ) . This skill does not call the legacy /connect/service itsm/createAgent ; instead it reuses the shipped ITSM Fulfiller template's agentScript and feeds it into the NGA bundle pipeline:
1. POST /nextgen authoring/bundles ( createBundleWithVersion ) — creates the bundle + first version from the template's Agent Script.
2. POST /nextgen authoring/bundle versions/{id}/publish — publishes the version (creates the underlying BotDefinition / BotVersion ).
3. POST /nextgen authoring/bundle versions/{id}/activate — activates it.
Commands: sf api request rest for Connect API GET/POST; sf data query for the SOQL idempotency + verify reads.
Helper scripts (invoked via Bash ) hold every JSON parsing / decision rule so the model never eyeballs a response body (A9): classify preflight.mjs (Studio access + template provisioning verdict), classify agent existence.mjs (idempotency + reactivation need from the BotDefinition SOQL), build create body.mjs (HTML decodes the template's agentScript , normalizes it for the org's enabled features via strip release management.mjs , substitutes config.developer name / config.agent label , writes the bundle create body to a JSON file so large content and free text quotes never hit an inline shell string), render report.mjs (deterministic report renderer — single source of report text for chat turn and harness file).
The Fulfiller agent is the IT technician facing assistant — incident triage, case summarization, field updates, related record automations. The employee self service surface is service itsm agentic setup employee agent configure .
Scope
In scope : Reading agent templates ; extracting the Fulfiller template's Agent Script ( svc itsm intelligence ITSrvcMgmtFulfiller ); creating the Fulfiller agent as an NGA native agent via createBundleWithVersion → publish → activate ; SOQL verifying live; idempotent skip on duplicate developer name; normalizing the created Agent Script so it activates cleanly on any Agentforce for IT Service org (internal step, never surfaced to the user — see below) — all via sf .
Out of scope : The Employee agent — broad or ~47 specializations under svc emp intelligence ( service itsm agentic setup employee agent configure ); enabling org level feature toggles (validated by service itsm agentic setup agentforce studio validate ); low level topic/action authoring; perm set assignment; content bundle deployment; CMDB CRUD; Discovery / Service Graph; the legacy createAgent route.
Preconditions
If any of these are unmet, sf surfaces an auth error or a 401 / 403 / 404 ; surface the raw error verbatim and stop — do not fabricate state .
1. sf CLI authenticated to the target org ( sf org display o <alias shows Connected). All calls use target org <alias ; never extract the access token by hand.
2. API v67.0+ — pinned in the URL path; do not hand edit below the minimum.
3. ITSM features + Fulfiller template provisioned ( svc itsm intelligence ITSrvcMgmtFulfiller ). If agent templates returns nothing or the routes 404, run service itsm agentic setup agentforce studio validate .
4. node ≥ 18 on PATH.
Operations at a glance
Concern Command Notes
Studio access (precondition read) sf api request rest "/services/data/v67.0/agentforce studio/access/Agents" method GET o <alias hasAccess=false ⇒ prerequisite hand off
List agent templates + Agent Script (read) sf api request rest "/services/data/v67.0/connect/service itsm/agent templates?agentType=AgentforceEmployeeAgent" method GET o <alias agentType=AgentforceEmployeeAgent required; confirms Fulfiller template + non empty agentScript
Enumerate the existing agent + latest version status (read) sf data query q "SELECT Id,DeveloperName,MasterLabel,AgentTemplate,(SELECT Id,Status FROM BotVersions ORDER BY VersionNumber DESC LIMIT 1) FROM BotDefinition WHERE Id='<botDefinitionId ' OR AgentTemplate='<agentTemplate ' OR DeveloperName='<developerName '" o <alias json Keyed PRIMARILY on the template's botDefinitionId (Phase 1 row); OR AgentTemplate= is a defensive fallback that would catch a live agent instantiated from the OOTB source template ( svc itsm intelligence ITSrvcMgmtFulfiller = Phase 1 template.id ) regardless of its DeveloperName; OR DeveloperName= is the real guard here — the normal Fulfiller case (never pre provisioned; null AgentTemplate ) and the guard for a dangling Id link (deleted target). Classified by scripts/classify agent existence.mjs ; Active latest ⇒ ALREADY CREATED; Inactive latest ⇒ offer reactivation
Create the NGA bundle (write) sf api request rest "/services/data/v67.0/nextgen authoring/bundles" method POST body @<body file o <alias Body built by scripts/build create body.mjs ; response id = the bundle version Id
Publish the bundle version (write) sf api request rest "/services/data/v67.0/nextgen authoring/bundle versions/<bundleVersionId /publish" method POST body '{}' o <alias Returns publishedBotId / publishedBotVersionId — creates the underlying BotDefinition / BotVersion
Activate the bundle version (write) sf api request rest "/services/data/v67.0/nextgen authoring/bundle versions/<bundleVersionId /activate" method POST body '{}' o <alias Empty response on success; agent is now live and NGA native
Activate an existing inactive version (write) sf api request rest "/services/data/v67.0/connect/bot versions/<latestVersionId /activation" method POST body '{"status":"Active"}' o <alias Reactivation path only (Phase 2b) — skips create/publish
Verify agent is live (read) sf data query q "SELECT ... FROM BotDefinition WHERE Id='<verifyId '" o <alias json <verifyId = create path's publishedBotId (Phase 5) or the Phase 2 classifier's returned live matched Id (its botDefinitionId / agentId ) on ALREADY CREATED / reactivation — not the null Phase 1 template botDefinitionId , never the collected developerName; confirm BotDefinition present + latest version Active
Full command shapes and the ITSM Connect API reference live in references/cli invocation.md ; the reactivation path call + idempotency verdict table live in references/reactivation.md ; the response body error codes and recurring gotchas live in references/error taxonomy.md .
Never extract the access token. Use sf api request rest / sf data query directly — they use the CLI's stored session for the target org. Do not pull the accessToken out of sf org display and hand build an HTTP request with it; that bypasses the CLI session and leaks a bearer token into shell context.
json rule. sf data query takes json (results come back in a .result.records[] envelope — that's what the classifier expects). sf api request rest does not — omit json there; its raw stdout body is already JSON.
Shipped ITSM Fulfiller agent template
Template identifier Default developer name
svc itsm intelligence ITSrvcMgmtFulfiller ( masterLabel "IT Service Fulfiller") IT Service Fulfiller Agent
The agentScript field is the source of truth for the NGA create — not id . scripts/build create body.mjs matches on masterLabel , HTML decodes agentScript , and substitutes the collected <developerName / <label into config.developer name / config.agent label before it becomes the bundle's resourceContent . The Employee facing agent is handled by service itsm agentic setup employee agent configure .
Internal template normalization — never surfaced to the user. Before the decoded script becomes resourceContent , scripts/strip release management.mjs removes the topic ReleaseManagement: block — plus its go to ReleaseManagement: selector transition and routing bullet. That topic's only action, svc itsm intelligence SummarizeRelease , is gated behind an org preference ( ReleaseManagementPref ) and is not surfaced by /actions/custom/generatePromptResponse on an org that has not enabled it; shipping it would make activate return HTTP 200 with a {success:false, "... does not exist"} silent failure body. classify action availability.mjs applies the identical transform so Phase 2c scans the same normalized script — the two callers must stay in lock step. The transform is a no op if the block is absent (safe against future template revisions). This normalization is an implementation detail: do NOT mention it, the removed subagent, or Release Management in chat narration, the confirm to write step, or the report — the admin only ever sees that the agent was created and activated.
Architecture — Creation stages
Stage What happens Tool used
Preflight Confirm Studio access ( agentforce studio/access/Agents ) and that the template's agentScript is present Bash ( sf api request rest )
Enumerate Read the Fulfiller template ( agent templates ) and existing agents + latest version status (SOQL on BotDefinition / BotVersions ); classify idempotency and reactivation need via script Bash ( sf , node )
Confirm to write Present the exact developerName + label (the NGA create target), OR — if the existing agent is inactive — present the reactivation option instead, and require explicit "yes" either way AskUserQuestion
Create (create path only) POST createBundleWithVersion (builds the NGA bundle + first version from the decoded, substituted template Agent Script) Bash ( sf api request rest , node )
Publish (create path only) POST .../bundle versions/<id /publish (creates the underlying BotDefinition / BotVersion ) Bash ( sf api request rest )
Activate POST .../bundle versions/<id /activate (create path) OR POST .../connect/bot versions/<latestVersionId /activation with {"status":"Active"} (reactivation path — skips create/publish) Bash ( sf api request rest )
Verify SOQL read BotDefinition / BotVersions and confirm the agent exists with an Active latest version Bash ( sf data query )
Idempotency : keyed PRIMARILY on the template's botDefinitionId (Phase 1 agent templates row — the platform's authoritative template→ BotDefinition link), FALLING BACK first to the BotDefinition's AgentTemplate (the OOTB namespaced source template = Phase 1 template.id ) and then to the collected <developerName . The Phase 2 read is BotDefinition WHERE Id='<botDefinitionId ' OR AgentTemplate='<agentTemplate ' OR DeveloperName='<developerName ' (the OR AgentTemplate= half is a defensive key that would catch a live agent instantiated from the source template regardless of its DeveloperName ; the OR DeveloperName= half is both the null botDefinitionId fallback — the normal Fulfiller case — AND the guard for a dangling Id link whose target BotDefinition was deleted), + latest BotVersion.Status (classified by the helper script). Outcomes: no match on any key ⇒ exists:false ⇒ create; latestVersionStatus:"Active" ⇒ ALREADY CREATED (skip the write, fall through to Phase 7 verification); needsActivation:true (latest version Inactive ) ⇒ offer to activate the existing version instead of creating a new agent (Phase 2b) rather than silently skipping or duplicating. Why the fallbacks matter: the Fulfiller is never pre provisioned and this skill's create path never stamps templateName , so BOTH the template's botDefinitionId AND the agent's AgentTemplate are always null — the <developerName keyed fallback is the guard that actually catches a repeat run; short circuiting straight to create o