Skip to main content
Beta
Trademark & affiliation notice. Epic is a registered trademark of Epic Systems Corporation. Corti is not endorsed, certified, sponsored by, or affiliated with Epic Systems Corporation. SmartPhrase and SmartLink availability and behavior depend on each customer’s Epic configuration.The SmartPhrase and SmartLink token names used throughout this recipe (.vitals, .name, .dob, .meds, .allergies, .pe-normal-male, etc.) are illustrative examples only. Customers should confirm the exact token names available in their own Epic environment with their Epic build team.

Scenario

A customer’s Epic note template includes dynamic data fields — vitals, active medications, or encounter details — that they want populated automatically from Epic’s own database rather than from the conversation transcript. They want Corti to generate the narrative note sections (HPI, A&P, etc.) while Epic handles the structured data fields it already owns. The goal: Corti’s output includes SmartPhrase tokens as literal strings. After the note is delivered to Epic, the provider refreshes and Epic — subject to the customer’s Epic configuration — expands those tokens with live EHR data.

You can instruct Corti to include a SmartPhrase token verbatim in the generated output by adding it to the relevant section’s contentPrompt or writingStylePrompt. Corti treats it as literal text in its output; Epic — subject to the customer’s Epic configuration — handles the expansion later. Example use case: Include .vitals at the top of the Physical Exam section so that when the provider refreshes the note in Epic, the current encounter vitals can appear automatically — provided the customer’s Epic environment has that SmartLink configured. What you do:
  1. When defining or customizing your section, add an explicit instruction telling the model to include the SmartPhrase token as a literal string in the output at the appropriate location.
  2. Ensure the instruction specifies that the token should appear exactly as typed — dot prefix included — and should not be paraphrased or removed.
  3. Deliver the generated output to Epic via your standard integration path. The token will be present in the raw text.
  4. When the provider opens the note and clicks Refresh (or accepts the SmartLink), Epic — depending on the customer’s configuration — expands .vitals with the patient’s current encounter vitals.
Section contentPrompt — include a SmartPhrase token
{
  "name": "Physical Exam",
  "languages": ["en"],
  "generation": {
    "instructions": {
      "contentPrompt": "Generate a physical exam section based on findings discussed in the conversation. Begin the section with the exact string '.vitals' on its own line — this is a SmartPhrase token intended for downstream expansion by the EHR (subject to the customer's EHR configuration) and must appear verbatim. Do not describe or paraphrase it. After the SmartPhrase token, document the physical examination findings from the encounter.",
      "writingStylePrompt": "Use concise clinical language. Present findings in a structured format with organ system subheadings."
    }
  }
}
What happens in Epic: The generated note section arrives with .vitals as a literal string at the top of the Physical Exam section. The provider sees it highlighted in blue (like other SmartLink data) and clicks Refresh — Epic, subject to the customer’s configuration, queries the current encounter’s vital signs from the database and expands the token in place. Provided the customer’s Epic environment supports the relevant token, this approach can be used with data-driven SmartLink tokens such as .vitals, .name, .dob, .meds (active medications), .allergies, and similar.
The token names above are illustrative examples — the actual SmartPhrase / SmartLink library available to a given organization is defined by that customer’s Epic build team and individual clinicians, and exact token names may vary. Confirm the names in your own Epic environment before relying on them.

What’s NOT supported: text-expansion SmartPhrases that Corti should replace (e.g., .pe-normal-male)

This is an important boundary to understand. The request that comes up: “Can Corti include .pe-normal-male in the Physical Exam section, and then replace the ‘normal’ boilerplate with the actual findings from the conversation?” Why this doesn’t work today: The workflow described involves two sequential steps:
  1. Epic expands .pe-normal-male → inserts a paragraph of “within normal limits” boilerplate text into the note.
  2. An AI system reads the conversation transcript, identifies where the expanded text differs from the actual findings, and edits the note in Epic accordingly.
Step 2 requires the ability to programmatically read and modify note content inside the Epic note editor after a SmartPhrase has expanded. That capability requires an appropriate Epic-supported integration capability — or another customer-approved workflow — that allows note content to be read and modified after expansion. The specific integration name, surface, and availability depend on each customer’s Epic build and agreement with Epic.
  • A bidirectional integration of this kind would typically allow an ambient vendor to receive the section structure, understand which sections are ambient-owned vs. EHR-owned, and push edits back at the field level.
  • Independently, Corti Agents can be used for secondary content reviews/edits, connections to knowledge sources, ICD-10/SNOMED code annotation, and similar tasks that operate on Corti-generated content before delivery.

What you can do instead:

  • Instruct Corti to generate the full physical exam narrative from the conversation transcript directly, without relying on a pre-built normal PE SmartPhrase as a starting point. This is the standard ambient scribing approach.
  • If there are specific exam components where a normal default is clinically appropriate and the conversation contains no findings to override, you can instruct the model to generate appropriate “within normal limits” language itself rather than delegating to a SmartPhrase.

Summary

When to use SmartPhrase tokens in Corti templates:

SmartPhrase typeIllustrative exampleCorti can include as literal token?Epic expands on Refresh (subject to customer config)?Notes
Data-driven SmartLinks.vitals, .meds, .allergies, .dob✅ Yes✅ Yes — depending on the customer’s Epic configurationSupported. Instruct the model to include the token verbatim. Token names shown are illustrative; confirm availability in your Epic environment.
Text-expansion boilerplate only.pe-normal-male✅ Yes (token only)✅ Yes (expansion only) — depending on the customer’s Epic configurationCorti can include the token; Epic may then expand it — but Corti cannot subsequently modify the expanded text to reflect actual findings.
Text-expansion + AI replacement of normals with findings.pe-normal-male → then replace with actual PE findings❌ Not supportedRequires an appropriate Epic-supported integration capability (or other customer-approved workflow) that allows note content to be read and modified after expansion — not available out of the box.

Don’t forget about dictation

When using the /transcribe API for direct dictation into Epic, commands can also be defined for adding SmartPhrases during live documentation.

Bottom line:

Why this lever: Corti can include any SmartPhrase token as literal text in its output, and Epic — depending on the customer’s Epic configuration — can expand data-driven SmartLinks when the provider refreshes the note. What Corti cannot do today is read the result of that expansion and modify it. Caveat: For the majority of ambient scribing use cases — HPI, A&P, Assessment — this is not a limitation, because those sections are generated entirely from the conversation. It only becomes relevant when a customer’s workflow depends on using Epic’s normal-finding SmartPhrases as editable starting points.
See also: Customization Cookbook · Migrate from Classic