What "Einstein GPT" actually ships
Einstein GPT is the branding for four building blocks:
- Prompt Builder — a visual designer for grounded prompt templates
- Model Builder — connect your own model (OpenAI, Anthropic, Bedrock, Vertex, or a private endpoint)
- Copilot / Agentforce — the assistant surface
- Einstein Trust Layer — the safety layer around all of the above
Nothing is a black box; each block has an API and metadata type.
Prompt Templates as first-class metadata
Prompt templates are XML metadata (.prompt-meta.xml) deployed via SFDX. Anatomy:
<PromptTemplate>
<name>Draft_Followup_Email</name>
<type>Sales_Email</type>
<inputs>
<input name="Recipient" type="Contact"/>
<input name="Opportunity" type="Opportunity"/>
</inputs>
<body><![CDATA[
You are a rep at {!$User.Company.Name}.
Write a 120-word follow-up email to {!Recipient.FirstName} at
{!Recipient.Account.Name} about opportunity "{!Opportunity.Name}"
(stage: {!Opportunity.StageName}, close: {!Opportunity.CloseDate}).
Reference the last 3 activities: {!Related.Recipient.LastActivities}.
Sign off as {!$User.FirstName}.
]]></body>
</PromptTemplate>
Because it's metadata:
- It ships through your pipeline (feature branch → UAT → prod)
- It renders with the Trust Layer applied
- It can be invoked from Apex, Flow, LWC, or the Agentforce runtime
Invoking from Apex
ConnectApi.EinsteinPromptTemplateGenerationsInput req =
new ConnectApi.EinsteinPromptTemplateGenerationsInput();
req.inputParams = new Map<String, ConnectApi.WrappedValue>{
'Input:Recipient' => wrap(contactId),
'Input:Opportunity' => wrap(oppId)
};
ConnectApi.EinsteinPromptTemplateGenerationsRepresentation resp =
ConnectApi.EinsteinLLM.generateMessagesForPromptTemplate(
'Draft_Followup_Email', req);
String draft = resp.generations[0].text;
Grounding is the whole game
An ungrounded LLM will happily fabricate an opportunity that doesn't exist. Ground with:
- Merge fields for row-level data
- Related lists for recent activity
- Retrieval from Data Cloud vector search for unstructured docs
Vector search example (Data Cloud):
SELECT chunk_text, source_url
FROM KnowledgeArticles__chunk__dlm
WHERE VECTOR_COSINE(embedding, EMBED('how do I reset MFA?')) < 0.25
ORDER BY VECTOR_COSINE(embedding, EMBED('how do I reset MFA?'))
LIMIT 5;
Splice those chunks into the prompt as a <context> block. Cite source_url in the response for auditability.
Trust Layer defaults every team should keep on
- Zero-data-retention with the model provider
- PII masking (names, emails, phone) before the payload leaves the org
- Toxicity + prompt-injection filters
- Full audit log to
GenAiInteractionfor eDiscovery
Measuring value, not novelty
Instrument three metrics per use case:
- Adoption — % of reps using the assist per week
- Acceptance — % of generated drafts sent with < 20% edits
- Outcome — reply rate / win rate delta vs. control group
Kill features that don't move #3 within a quarter. Novelty burns trust.
