> ## Documentation Index
> Fetch the complete documentation index at: https://docs.elementum.io/llms.txt
> Use this file to discover all available pages before exploring further.

# July 2026

> Elementum platform releases for July 2026.

export const EmailSubscriptionPicker = ({webhookUrl, logUrl = "https://script.google.com/macros/s/AKfycbwYKNyp9YTtV7fhwZOKwePB-0_cOz8jOD1kBLEprmvbTD5LBPn_iSuYagvaWlxbmtg/exec", heading = "Subscribe to email updates", description, buttonLabel = "Subscribe", lists = [{
  key: "ga-releases",
  label: "General Availability Release notifications",
  description: "Get an email when a new release ships — about twice a month."
}, {
  key: "upcoming-features",
  label: "Upcoming Feature updates",
  description: "Hear about new Beta features being tested — expect a few updates each week."
}]}) => {
  const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  const MAX_TEXT_LENGTH = 120;
  const MODEL_DEPRECATIONS_KEY = "model-deprecations";
  const hasDeprecationsList = lists.some(list => list.key === MODEL_DEPRECATIONS_KEY);
  const subscribeLists = hasDeprecationsList && lists.length > 1 ? lists.filter(list => list.key !== MODEL_DEPRECATIONS_KEY) : lists;
  const logSubmissionAttempt = payload => {
    if (!logUrl) return;
    try {
      fetch(logUrl, {
        method: "POST",
        mode: "no-cors",
        keepalive: true,
        headers: {
          "Content-Type": "text/plain;charset=UTF-8"
        },
        body: JSON.stringify(payload)
      }).catch(() => {});
    } catch (e) {}
  };
  const [firstName, setFirstName] = useState("");
  const [lastName, setLastName] = useState("");
  const [company, setCompany] = useState("");
  const [email, setEmail] = useState("");
  const [website, setWebsite] = useState("");
  const [selectedLists, setSelectedLists] = useState(() => subscribeLists.map(l => l.key));
  const [status, setStatus] = useState("idle");
  const [errorMessage, setErrorMessage] = useState("");
  const isSubmitting = status === "loading";
  const [uid] = useState(() => `esp-${Math.random().toString(36).slice(2, 9)}`);
  const firstNameId = `${uid}-first-name`;
  const lastNameId = `${uid}-last-name`;
  const companyId = `${uid}-company`;
  const emailId = `${uid}-email`;
  const websiteId = `${uid}-website`;
  const statusId = `${uid}-status`;
  const toggleList = key => {
    setSelectedLists(prev => prev.includes(key) ? prev.filter(k => k !== key) : [...prev, key]);
  };
  const handleSubmit = async event => {
    event.preventDefault();
    setErrorMessage("");
    if (website.trim().length > 0) {
      setStatus("success");
      setFirstName("");
      setLastName("");
      setCompany("");
      setEmail("");
      return;
    }
    const trimmedFirstName = firstName.trim();
    const trimmedLastName = lastName.trim();
    const trimmedCompany = company.trim();
    const trimmedEmail = email.trim();
    if (!trimmedFirstName || trimmedFirstName.length > MAX_TEXT_LENGTH) {
      setStatus("error");
      setErrorMessage("Please enter your first name (up to 120 characters).");
      return;
    }
    if (!trimmedLastName || trimmedLastName.length > MAX_TEXT_LENGTH) {
      setStatus("error");
      setErrorMessage("Please enter your last name (up to 120 characters).");
      return;
    }
    if (!trimmedCompany || trimmedCompany.length > MAX_TEXT_LENGTH) {
      setStatus("error");
      setErrorMessage("Please enter your company (up to 120 characters).");
      return;
    }
    if (!EMAIL_REGEX.test(trimmedEmail)) {
      setStatus("error");
      setErrorMessage("Please enter a valid email address.");
      return;
    }
    if (selectedLists.length === 0) {
      setStatus("error");
      setErrorMessage("Select at least one list to subscribe to.");
      return;
    }
    if (!webhookUrl) {
      setStatus("error");
      setErrorMessage("This form is not configured yet. Please try again later.");
      return;
    }
    setStatus("loading");
    const payload = {
      firstName: trimmedFirstName,
      lastName: trimmedLastName,
      company: trimmedCompany,
      email: trimmedEmail,
      lists: selectedLists.filter(key => subscribeLists.some(list => list.key === key)),
      action: "subscribe",
      source: typeof window !== "undefined" ? window.location.pathname : "",
      submittedAt: new Date().toISOString()
    };
    logSubmissionAttempt(payload);
    try {
      const response = await fetch(webhookUrl, {
        method: "POST",
        mode: "no-cors",
        headers: {
          "Content-Type": "text/plain;charset=UTF-8"
        },
        body: JSON.stringify(payload)
      });
      if (response.type !== "opaque" && !response.ok) {
        throw new Error(`Request failed with status ${response.status}`);
      }
      setStatus("success");
      setFirstName("");
      setLastName("");
      setCompany("");
      setEmail("");
      setSelectedLists(subscribeLists.map(l => l.key));
    } catch (err) {
      setStatus("error");
      setErrorMessage("We couldn't complete your subscription right now. Please try again in a moment.");
    }
  };
  const inputClass = "w-full rounded-md border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-900 placeholder:text-zinc-400 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100 dark:placeholder:text-zinc-500";
  const labelClass = "block text-sm font-medium text-zinc-700 dark:text-zinc-200 mb-1";
  const checkboxLabelClass = "flex items-start gap-2 text-sm text-zinc-700 dark:text-zinc-200";
  const checkboxClass = "mt-0.5 h-4 w-4 rounded border-zinc-300 text-blue-600 focus:ring-blue-600/30 dark:border-zinc-700 dark:bg-zinc-900";
  return <div className="email-form not-prose my-4 rounded-xl border border-zinc-200 bg-zinc-50 p-5 dark:border-zinc-800 dark:bg-zinc-900/40">
      <h3 className="m-0 text-base font-semibold text-zinc-900 dark:text-zinc-50">
        {heading}
      </h3>
      {description ? <p className="mt-1 mb-0 text-sm text-zinc-600 dark:text-zinc-300">{description}</p> : null}

      <form onSubmit={handleSubmit} noValidate className="mt-4 flex flex-col gap-3">
        <div className="grid gap-3 md:grid-cols-2">
          <div>
            <label htmlFor={firstNameId} className={labelClass}>
              First name
            </label>
            <input id={firstNameId} type="text" name="firstName" autoComplete="given-name" required maxLength={MAX_TEXT_LENGTH} value={firstName} onChange={e => setFirstName(e.target.value)} disabled={isSubmitting} className={inputClass} placeholder="Jane" />
          </div>
          <div>
            <label htmlFor={lastNameId} className={labelClass}>
              Last name
            </label>
            <input id={lastNameId} type="text" name="lastName" autoComplete="family-name" required maxLength={MAX_TEXT_LENGTH} value={lastName} onChange={e => setLastName(e.target.value)} disabled={isSubmitting} className={inputClass} placeholder="Doe" />
          </div>
        </div>

        <div className="grid gap-3 md:grid-cols-2">
          <div>
            <label htmlFor={companyId} className={labelClass}>
              Company
            </label>
            <input id={companyId} type="text" name="company" autoComplete="organization" required maxLength={MAX_TEXT_LENGTH} value={company} onChange={e => setCompany(e.target.value)} disabled={isSubmitting} className={inputClass} placeholder="Acme Corp" />
          </div>
          <div>
            <label htmlFor={emailId} className={labelClass}>
              Work email
            </label>
            <input id={emailId} type="email" name="email" autoComplete="email" required value={email} onChange={e => setEmail(e.target.value)} disabled={isSubmitting} className={inputClass} placeholder="jane@acme.com" />
          </div>
        </div>

        {subscribeLists.length > 1 ? <fieldset className="mt-1 flex flex-col gap-2">
            <legend className={labelClass}>Subscribe me to:</legend>
            {subscribeLists.map(list => {
    const checkboxId = `${uid}-list-${list.key}`;
    return <label key={list.key} htmlFor={checkboxId} className={checkboxLabelClass}>
                  <input id={checkboxId} type="checkbox" name="lists" value={list.key} checked={selectedLists.includes(list.key)} onChange={() => toggleList(list.key)} disabled={isSubmitting} className={checkboxClass} />
                  <span className="flex flex-col">
                    <span className="font-medium">{list.label}</span>
                    {list.description ? <span className="text-zinc-500 dark:text-zinc-400">{list.description}</span> : null}
                  </span>
                </label>;
  })}
          </fieldset> : null}

        <div aria-hidden="true" style={{
    position: "absolute",
    left: "-10000px",
    top: "auto",
    width: "1px",
    height: "1px",
    overflow: "hidden"
  }}>
          <label htmlFor={websiteId}>Website (leave blank)</label>
          <input id={websiteId} type="text" name="website" tabIndex={-1} autoComplete="off" value={website} onChange={e => setWebsite(e.target.value)} />
        </div>

        <button type="submit" disabled={isSubmitting} className="mt-1 inline-flex w-full items-center justify-center rounded-md bg-blue-600 px-4 py-2 text-sm font-semibold text-white shadow-sm transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60 dark:bg-blue-500 dark:hover:bg-blue-400">
          {isSubmitting ? "Subscribing…" : buttonLabel}
        </button>

        <div id={statusId} role="status" aria-live="polite" className="min-h-[1.25rem] text-sm">
          {status === "success" ? <span className="text-emerald-700 dark:text-emerald-400">
              Thanks — your subscription was submitted.
            </span> : null}
          {status === "error" ? <span className="text-red-700 dark:text-red-400">{errorMessage}</span> : null}
        </div>
      </form>

      <p className="mt-3 mb-0 text-xs text-zinc-500 dark:text-zinc-400">
        Already subscribed?{" "}
        <a href="/release-notes/unsubscribe" className="underline hover:text-zinc-700 dark:hover:text-zinc-200">
          Unsubscribe
        </a>
        .
      </p>
    </div>;
};

export const ReleaseDocButton = ({href, label}) => {
  return <a href={href} className="not-prose no-underline inline-flex items-center gap-2 px-3 py-1.5 mt-1 mb-3 rounded-md bg-emerald-600 hover:bg-emerald-700 text-white hover:text-white text-sm font-medium shadow-sm transition-colors dark:bg-emerald-500 dark:hover:bg-emerald-400" style={{
    textDecoration: "none"
  }}>
      <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
        <path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20" />
      </svg>
      <span>{label}</span>
      <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
        <line x1="5" y1="12" x2="19" y2="12" />
        <polyline points="12 5 19 12 12 19" />
      </svg>
    </a>;
};

<Note>
  The colored badges indicate the area of Elementum where you will see the update (for example, Apps, Tables, Intelligence, or Automations).
</Note>

<Tabs>
  <Tab title="General Availability">
    ## July 23, 2026

    ### Agents & AI

    **Browser Use Agent Improvements** <Badge color="blue" size="sm">Intelligence</Badge> - Browser use agents can now handle attachments and run on your own model, so they can automate document-driven workflows on external websites end to end.

    * Feed input attachments — PDFs, spreadsheets, and images — to the agent so it can read and act on their contents.
    * Capture output attachments such as screenshots, downloaded PDFs, and confirmation numbers, and return them to the calling action.
    * Bring your own model to power the browser use agent, including Snowflake Cortex models.

    <ReleaseDocButton href="/ai-agents/agents-experience#agent-types" label="See more about agent types" />

    ### Apps

    **Conditional Record View** <Badge color="orange" size="sm">Apps</Badge> - Record detail pages can render a dynamic layout whose fields, sections, and components appear based on conditional visibility rules, so people see only the information relevant to the record in front of them instead of a one-size-fits-all page.

    * Build a dynamic Record Details Layout that shows the fields, sections, and components defined for each record type, including rich content like attachments, tags, assignees, and rich text.
    * Add conditional visibility rules to any field, section, or component, driven by other field values, stage, or user and group permissions.
    * Rules are evaluated per user and per record, so the same record can show different information depending on who is viewing it and its current state.

    <ReleaseDocButton href="/workflows/layouts#dynamic-record-details-layout" label="See more about dynamic Record Details Layouts" />

    **Multi-Select Picklist Badges** <Badge color="orange" size="sm">Record Details</Badge> - Multi-select picklist fields on a record now show every selected value as its own badge, so you can read the full set at a glance instead of only the first value with a "+N" counter.

    * Each badge displays the option's configured icon alongside its label, and badges stay in the order the values were saved.
    * Long value lists stay compact: the field collapses to about two lines with an inline "Show more" / "Show less" control that reports the exact number of hidden values.
    * Display only — this replaces the old hover tooltip and changes nothing about how you edit picklists or which values are stored. Record view is the only surface affected; List View, Board View, and mobile are unchanged for now.

    <ReleaseDocButton href="/support/faq/faq-apps#managing-records" label="See how multi-select values display on a record" />

    ### Automations

    **Sort and Limit on Search Records Action** <Badge color="yellow" size="sm">Automations</Badge> - The Search Records automation action can now sort results by one or more fields and cap how many records it returns, so downstream steps only receive the records that matter.

    * Sort results by one or more fields in ascending or descending order.
    * Order by multiple fields, with results sorted by the first field and then by each subsequent field in priority order.
    * Set a limit between 1 and 500 to cap how many records pass to downstream steps such as Repeat for Each.

    <ReleaseDocButton href="/workflows/automation-actions-reference#search-records" label="See more about the Search Records action" />

    ### Platform

    **SIP Trunking Provider** <Badge color="purple" size="sm">Org Settings</Badge> - Bring your own telephony provider to Elementum by connecting SIP trunk-enabled phone providers to power voice agents.

    * Enable the SIP Trunk option in Organization Settings (available to Org Admins).
    * Configure the provider with username and password credentials, then use the callback URL Elementum provides to complete setup on the provider side.
    * Assign the provider when setting up phone numbers for voice agents.

    <ReleaseDocButton href="/administration/set-up-phone-integrations-for-agents#add-a-phone-provider" label="See more about SIP Trunking" />

    **Voice: Employee ID with OTP Authentication** <Badge color="purple" size="sm">Org Settings</Badge> - Voice agents support a new phone authentication type where callers verify with their employee ID and a one-time password sent by email, so any employee can reach an agent from any phone.

    * Admins configure "Employee ID w/ OTP" as a phone authentication type on a voice agent.
    * Callers reach the agent without a pre-registered phone number.
    * Callers provide their employee ID, receive a one-time password by email, and speak or type the OTP to authenticate.

    <ReleaseDocButton href="/ai-agents/agents-phone-integration#employee-id-with-otp-authentication" label="See more about voice caller authentication" />

    **Voice: Organization Management** <Badge color="purple" size="sm">Org Settings</Badge> - A single management surface brings all voice telephony configuration — phone numbers, providers, SIP settings, and voice agent mappings — into one place in Organization Settings.

    * Phone Numbers tab: view, add, and edit every provisioned number across the org, with provider, type, gateway, and language at a glance; searchable and sortable.
    * Phone Providers tab: configure carrier-managed and SIP trunk providers, and manage your org's SIP domain and allowed IP addresses with validation.
    * Voice Agents tab: see every voice-enabled agent with its app, gateway, and assigned numbers, plus active/inactive gateway status and surfaced configuration gaps.

    <ReleaseDocButton href="/administration/set-up-phone-integrations-for-agents#organization-voice-management" label="See more about organization voice management" />

    ## July 9, 2026

    ### Agents & AI

    **Studio Agents: Flow Builder** <Badge color="blue" size="sm">Intelligence</Badge> - Build automations, agents, and flows in Elementum through natural language with a coding-based agent.

    * Configure a Studio Agent with a supported model (currently Anthropic).
    * Describe what you need and watch the agent generate each step of the flow.
    * Preview the workflow and continue chatting to refine each step.
    * After publishing, manually edit each step.

    <ReleaseDocButton href="/ai-agents/studio-agents" label="See more about Studio Agents" />

    **Updated Agent Overview Page** <Badge color="blue" size="sm">Intelligence</Badge> - The agent detail page opens to a refreshed overview with read-only configuration settings at a glance, matching the design of the gateway page. Click into any section to edit that area of the agent's configuration.

    <ReleaseDocButton href="/ai-agents/agents-overview" label="See more about Agents" />

    ### Apps

    **Org Default Columns** <Badge color="orange" size="sm">Apps</Badge> - App admins can now adjust which columns appear in Table View Widgets for everyone with access.

    * Open **Display Settings** on a Table View Widget to adjust which columns are visible.
    * Individual users can still adjust their own column view on top of the default.
    * If a user has personalized the layout, they can click **Reset to Default** in Display Settings to restore the admin-defined view.

    <ReleaseDocButton href="/workflows/managed-views#widget-column-layouts" label="See more about Widget Column Layouts" />

    ### Platform

    **Custom Platform Branding** <Badge color="purple" size="sm">Org Settings</Badge> - Set a custom accent color and logo that carry across the platform so external collaborators immediately recognize which customer they're working in, reducing wrong-account mistakes.

    * Available in Organization Settings to Organization Admins.
    * Accent color applies to primary buttons, links, active states in main and sub navigation, icon hover states, and the login flow.
    * Add a custom logo to appear on the login page and the Elementum organization icon.

    <ReleaseDocButton href="/administration/platform-branding" label="See more about Custom Platform Branding" />
  </Tab>

  <Tab title="Enterprise">
    ## July 23, 2026

    ### Agents & AI

    **[Dynamic Dropdowns on Agent-Driven Forms](/ai-agents/agents-tools-and-deployment#dynamic-dropdowns)** <Badge color="blue" size="sm">Intelligence</Badge>

    **[Custom AI Provider](/ai-agents/ai-services#configure-a-custom-provider)** <Badge color="blue" size="sm">Intelligence</Badge>

    **[Advanced Skill Discovery](/ai-agents/agents-skills#tune-skill-discovery)** <Badge color="blue" size="sm">Intelligence</Badge>

    **[Cross-App Skill Sharing](/ai-agents/agents-skills#share-skills-across-apps)** <Badge color="blue" size="sm">Intelligence</Badge>

    **[Agent Context Management via Summarization](/ai-agents/agents-experience#conversation-history)** <Badge color="blue" size="sm">Intelligence</Badge>

    **[Voice Agent Authentication Configurability](/ai-agents/agents-phone-integration#voice-properties)** <Badge color="blue" size="sm">Intelligence</Badge>

    **[Agent Evaluation Suites](/ai-agents/agents-evaluations)** <Badge color="blue" size="sm">Intelligence</Badge>

    ### Apps

    **[Presence in Automations](/workflows/automation-system#viewer-presence)** <Badge color="orange" size="sm">Apps</Badge>

    **[Schedule Trigger in Automations](/workflows/automation-triggers-reference#schedule)** <Badge color="orange" size="sm">Apps</Badge>

    **[Linked Record Approvals](/workflows/approval-processes#linked-record-approvals)** <Badge color="orange" size="sm">Apps</Badge>

    **[Execution History Filters](/workflows/automation-system#execution-history-filters)** <Badge color="orange" size="sm">Apps</Badge>

    ### Automations

    **[Accept Files Through Run Agent Task](/workflows/agent-task-automation#file-inputs)** <Badge color="yellow" size="sm">Automations</Badge>

    **[Agent Email Conversation Action](/workflows/automation-actions-reference#initiate-email-conversation)** <Badge color="yellow" size="sm">Automations</Badge>

    ### Experience

    **[Fulfiller In-App Experience](/getting-started/home-page#customize-the-navigation-menu)** <Badge color="teal" size="sm">Navigation</Badge>

    ### Platform

    **[AI Provider Failover](/ai-agents/ai-services#configure-provider-failover)** <Badge color="purple" size="sm">Org Settings</Badge>

    **[Bedrock IAM Role Authentication](/ai-agents/bedrock-setup#step-1-prepare-aws-authentication)** <Badge color="purple" size="sm">Org Settings</Badge>

    **[External User Re-Authentication](/administration/external-user-reauth)** <Badge color="purple" size="sm">Org Settings</Badge>

    **[Organization Model Migration](/ai-agents/ai-services#migrate-a-model-across-the-organization)** <Badge color="purple" size="sm">Org Settings</Badge>

    **[Voice Agent Gateway](/ai-agents/agent-gateways#voice)** <Badge color="purple" size="sm">Org Settings</Badge>

    ## July 22, 2026

    ### Apps

    **App Maintenance Mode** <Badge color="orange" size="sm">Apps</Badge> - App admins can temporarily take an App offline while making updates, replacing its content with a maintenance page for users.

    * Turn on **Under Maintenance** in the App's settings to show users a maintenance page with instructions to contact their administrator.
    * App admins retain access to settings while maintenance mode is enabled and can restore the App immediately by turning off the toggle.
    * Scheduled automations and other background work continue running while the App is under maintenance.

    <ReleaseDocButton href="/getting-started/build-an-app#take-an-app-offline-for-maintenance" label="See more about taking an App offline for maintenance" />

    ## July 17, 2026

    ### Agents & AI

    **TIFF File Support for Agents** <Badge color="blue" size="sm">Intelligence</Badge> - Agents can now process and understand TIFF file contents passed in via chat or automation, removing a file-format gap for enterprises that rely on TIFF for scanned documents, images, and legacy archives.

    * Works across all agent interaction surfaces where file attachments are supported.
    * No additional configuration required — agents on multimodal-capable models interpret TIFF content automatically.

    <ReleaseDocButton href="/ai-agents/agents-interacting#sharing-files-in-a-conversation" label="See more about sharing files in a conversation" />

    ## July 15, 2026

    ### Agents & AI

    **Conversation Timeout & Record Creation for Elementum Chat** <Badge color="blue" size="sm">Intelligence</Badge> - Admins can now configure an inactivity timeout and post-conversation record creation for agent chats in Elementum, matching the behavior already available on Voice, A2A, Teams, and Slack.

    * Set an inactivity timeout on agent chats in Elementum so idle conversations close automatically.
    * Configure whether a record is created when an Elementum chat ends.
    * The "Agent Conversation Ended" automation trigger now supports Elementum as a conversation channel type, enabling the same post-processing workflows available on other channels.

    <ReleaseDocButton href="/workflows/automation-triggers-reference#agent-conversation-ended" label="See more about the Agent Conversation Ended trigger" />

    ## July 10, 2026

    ### Automations

    **Saving Attachments Between Apps and from Agents** <Badge color="yellow" size="sm">Automations</Badge> - Copy files between records of different types and save files from agent interactions directly in automations.

    * Copy a file from a record of one type to a record of a different type within an automation, enabling cross-app file workflows.
    * Save a file provided by a user during an agent interaction to a record in an automation.

    <ReleaseDocButton href="/workflows/file-uploads-attachments#receiving-files-from-agent-interactions" label="See more about receiving files from agent interactions" />

    ## July 8, 2026

    ### Platform

    **Organization Admin Object Visibility** <Badge color="purple" size="sm">Org Settings</Badge> - Users assigned the **Admin** role in **Org Settings → Roles & Permissions** can now see every Object (Apps, Elements, Tasks, Tables) and every record in the organization, without being explicitly granted access through data access policies or record sharing.

    * Applies to **Organization** Admins only. Object-level admins (assigned inside an individual App, Element, or Task) remain scoped to that Object.
    * Read access extends across all Apps, Elements, Tasks, and Tables in the org, including Objects an Admin has not been added to.
    * Records are visible regardless of [object data access policies](/workflows/object-data-access) or per-record sharing — Org Admins can read any record for audits, compliance reviews, or emergency support.
    * Visibility is **view-only**. Edit, update, delete, and other write actions remain governed by the Admin's existing role assignments and any Object-level permissions.
    * Activity by Org Admins reading records they would not otherwise see is captured in the [activity log](/administration/activity-log) for audit purposes.

    <ReleaseDocButton href="/administration/roles-permissions#managed-roles" label="See more about the Admin organization role" />

    ## July 6, 2026

    ### Agents & AI

    **Generate Embeddings via Bedrock Models** <Badge color="purple" size="sm">Org Settings</Badge> - Generate embeddings natively inside automations using your own Bedrock account, without leaving Elementum. This does not replace AI Search; it's for custom implementations where the raw embeddings are needed.

    * Add Amazon Bedrock embedding models in AI Services and use them in the AI Transform automation task.
    * Optionally configure embedding dimensions per model.
    * Resulting embeddings are available as a reference for use in downstream automation steps.

    <ReleaseDocButton href="/ai-agents/ai-services#create-an-embedding-service" label="See more about embedding services" />
  </Tab>
</Tabs>

## Stay in the loop

<EmailSubscriptionPicker webhookUrl="https://elementum.elementum.io/api/v1/webhooks/38fad8b3-0323-44ba-be52-d622b1a29289" heading="Subscribe to release email updates" description="Choose what you'd like to hear about. Both lists are selected by default." />
