A practitioner’s guide to the $OraMessageHint signal — what the hints are, how they work, when each one fires, and which one to design for.

What Is a Message Hint?

In an agentic app, a single agent does many different jobs. The same agent might write a one-line summary at the top of the screen, render a chart in a dashboard tile, suggest a few priority actions, answer a typed question, and draft an email — all within one session. The app needs a way to tell the agent which of those jobs it is being asked to do at any given moment. That signal is the message hint.

Every time the app calls an agent, it attaches a hint value. The agent reads it from $context.$app.$OraMessageHint and responds accordingly. Think of it as the app’s shorthand: a small label that says “right now I need a summary,” or “right now the user clicked an action button — handle it.”

Because the hint carries this intent, you don’t build a separate agent for every screen element. You build one agent that recognizes the hint and branches its logic. This is what makes the capability “built in, not bolted on” — the orchestration is part of the framework, not something you wire up by hand.

The message hint is the signal the app sends with every request, telling the agent what kind of content is needed

How It Works

The mechanism is intentionally simple. On every request to an agent, the framework populates $context.$app.$OraMessageHint with one of a fixed set of values. Your agent’s workflow inspects that value and routes to the node that produces the right kind of output.

There are three things worth holding onto:

  • The framework decides which hint fires — not your code. You don’t trigger hints; the app does, based on what the user is doing and where they are in the app lifecycle.
  • Your job is to recognize and respond. For each hint your agent cares about, you decide what content to return.
  • One agent handles many hints. A switch (or equivalent branch) on the hint value sends each request to the appropriate handler within the same workflow.

You read the hint in an expression as {{ $context.$app.$OraMessageHint }}, or inside a Code node as $context.$app.$OraMessageHint.


The Ten Message Hint Values

There are ten hint values, and they fall into two natural families. Initialization hints fire automatically the moment an app loads. Interactive hints fire later, in response to what the user does.

The ten values, grouped by when they fire. You don’t choose the hint — you recognize it and respond

Complete Reference

Hint valueWhat the app is asking forWhat your agent should return
SummaryAn initial summary for this agent’s contributionA short (1–2 sentence) summary of the current state
InitSubtitleThe dynamic subtitle / session taglineA short, personalized subtitle line
InitDisplayThe initial information display at startupOne or more oraInfoDisplay blocks (may include actions or comms)
InitActionsPriority actionable insights at startupZero or more action suggestions
InitCommunicationsCommunication suggestions at startupZero or more oraComms blocks
QueryAn answer to something asked through Ask OracleAn answer to the question; may include displays, actions, or comms
InvokeActionHandling of an action the user triggeredFollow-up handling using the $OraAction payload
FillParametersCommunication parameters to be filledThe requested parameters, filled before generation/send
SendCommunicationThe communication to be sent / completedSend or complete the communication flow
AdditionalContentMore content for an expanded panelContent for the panel named in $OraPanelName

When Are Hints Triggered?

Hints arrive in a predictable rhythm. Understanding the sequence is what lets you design prompts that respond to the right trigger at the right time.

Startup: the five initialization hints

When an agentic app first loads, the framework fires its initialization hints in parallel — they run together rather than one after another. The first painted screen is assembled from whatever each agent returns for its hint.

At startup you can expect:

  • InitSubtitle — a dynamic tagline for the session (for example, a personalized welcome line).
  • Summary — a one- to two-sentence overview of the current state.
  • InitDisplay — the initial widgets and visual state, built from the display prompt.
  • InitActions — the priority actions the user should consider first.
  • InitCommunications — suggested messages relevant to the current state.
App load fans out into five initialization hints, each populating a different part of the first screen

After initialization: the interactive hints

Once the app is live, the remaining hints fire in response to user activity. Each one carries its own piece of context so your agent has what it needs to respond.

After the first paint, what the user does determines which hint fires next
Hint valueFires when…Context delivered to the agent
QueryThe user types in Ask OracleThe question in $context.$system.$inputMessage, plus $context.$system.$chatHistory for follow-ups
InvokeActionThe user clicks an action buttonThe action payload in $context.$app.$OraAction
FillParametersA communication needs its parameters filledThe parameters to fill in $context.$app.$OraCommsParamsToFill
SendCommunicationThe user confirms sendThe communication, for the designated agent to deliver
AdditionalContentThe user opens an extra panelThe panel name in $context.$app.$OraPanelName
Note on chat history: the user’s question is not automatically combined with prior turns. For a Query, pass both $context.$system.$inputMessage and $context.$system.$chatHistory into your query node so follow-up questions keep their context. (The older OraChatHistory is deprecated — use $context.$system.$chatHistory.)

When to Use Which Hint

Since the framework chooses the hint, “using” a hint really means deciding which hints your agent should handle, and what each handler produces. Use this as a design checklist when building an agent for an app.

  • Want a headline number or status line at the top? Handle Summary (and InitSubtitle for the tagline).
  • Want charts, cards, or record views on first load? Handle InitDisplay and select the widgets the agent may produce.
  • Want the app to suggest next steps? Handle InitActions to surface priority insights, and InvokeAction to process the click when the user takes one.
  • Want the user to ask free-form questions? Handle Query, and make the agent’s description specific so the orchestrator routes the right questions to it.
  • Need the app to draft a message? The communication hints (InitCommunications, FillParameters, SendCommunication) cover that — see the reference table above.
  • Want expandable detail panels? Handle AdditionalContent and branch on $OraPanelName.
A prerequisite worth calling out: an agent only participates in an app if it has been exposed to it. On the Output Tab of the Agent or LLM node, enable Expose to Agentic Apps and select the widgets the agent may produce. Without this, the agent can’t be selected in the app builder, and action- and display-related hints won’t be routed to it.

A Closer Look: InitDisplay and InitActions

These two initialization hints do the heavy lifting of an app’s first screen. InitDisplay builds what the user sees; InitActions tells them what to do about it. Both reward careful configuration, and both follow the same shape: enable the feature on the agent, write a specific prompt, and return the right structured output.

InitDisplay — building the initial view

When the hint is InitDisplay, the agent returns one or more oraInfoDisplay blocks. Each block carries a key attribute plus a small JSON payload describing what to render.

oraInfoDisplay fieldWhat it carries
titleThe display title shown to the user
patternIdThe widget to render — one of the seven widget types
descriptionA short description of what is being shown
propertiesThe widget-specific data object

The key attribute controls how a display is managed: unique for single, non-repeatable alerts; contextual for supplementary information; and list for lists of items. The patternId names the widget — there are seven to choose from: Chart, Card, Message List, Change List, Multi Record, Record, and Sankey.

Enabling InitDisplay is a two-step pattern:

  • Expose the agent. On the Output Tab, enable Expose to Agentic Apps, which reveals the App Experience Tab.
  • Select widgets, then prompt. On the App Experience Tab, under Select Widgets, choose which widgets this agent may produce — selecting at least one is what turns on the information display feature, and restricting the choice keeps the agent from emitting widget types you don’t want. Then use the Display Prompt to say how to present the data. Specific prompts produce specific output, for example: “Focus on the top 5 most critical items using the Message List widget.”

InitActions — surfacing what to do next

When the hint is InitActions, the agent’s workflow must produce one or more oraInsight entries — each a suggested next step the user can act on with a single click.

oraInsight fieldWhat it carries
titleA short label for the insight (a few words)
shortDescriptionA single sentence describing the insight
actionTextThe button label the user sees
followUpCommandWhat runs when the button is clicked (typically ora.Invoke(…))
priority  (optional)Set true to mark the insight as critical so it surfaces more prominently — use sparingly so it stays meaningful

For actions to appear, three configuration points must agree:

  • Output Tab on the LLM node. Enable Enable Actions for the Widgets. Without this, the framework won’t route action-related hints to the agent.
  • Agent Editor in the app builder. Enable Include in Actions, then provide the Initial Actions Prompt describing what kinds of actions this agent should suggest.
  • The agent prompt. When the hint is InitActions, the workflow actually produces the oraInsight entries.

InitActions has a natural second half. The followUpCommand on an insight usually calls ora.Invoke(…). When the user clicks the button, the framework fires InvokeAction and passes the action’s context in $context.$app.$OraAction — so design the two together: InitActions proposes the step, InvokeAction carries it out.


The Context That Travels With Each Hint

Hints rarely arrive alone. The framework also populates context variables that give the agent what it needs to respond. These are the ones you’ll reach for most often.

VariableTypeWhat it carries
$context.$app.$OraMessageHintStringThe request type — the hint value itself
$context.$app.$OraActionStringThe action payload; populated when the hint is InvokeAction. Set by ora.Invoke(…, context)
$context.$app.$OraAppContextStringLaunch context, typically passed via URL parameters, used to scope the experience
$context.$app.$OraUserContextObjectUser identity: fullName, userId, userName, guid
$context.$app.$OraCommsParamsToFillArrayParameters to fill; populated when the hint is FillParameters
$context.$system.$chatHistoryStringPrior conversation; available when the hint is Query
$context.$app.$OraPanelNameStringThe panel requesting content; populated when the hint is AdditionalContent
$context.$app.$OraAttachmentsStringFiles and contents associated with the conversation

Putting It Together: the Routing Pattern

The standard way to build an agent for an app is a single workflow that branches on the hint. A Switch node reads $context.$app.$OraMessageHint and routes each request to the handler that produces the right output.

A Switch on $OraMessageHint sends each request to its handler node — one workflow, many behaviors

Expressed as logic, the routing looks like this:

/* Route based on $OraMessageHint */

if  $OraMessageHint == "Summary"
      -> summary generation node
if  $OraMessageHint == "InitDisplay"
      -> initial display node
if  $OraMessageHint == "InitActions"
      -> actions generation node
if  $OraMessageHint == "Query"
      -> query handler  (include $chatHistory)
if  $OraMessageHint == "InvokeAction"
      -> action handler  (use $OraAction for context)

In a multi-agent app, an orchestrator first decides which agent should handle a request based on each agent’s description, and then the chosen agent’s workflow routes on the hint. That’s why specific, well-written agent descriptions matter: vague descriptions cause the orchestrator to skip your agent, or pick the wrong one.


Things to Remember

  • Don’t try to trigger hints. The framework fires them based on the app lifecycle and user activity. Design your agent to recognize and respond.
  • Branch on the hint in one workflow. A single agent with a Switch on $OraMessageHint is the intended pattern — not a separate agent per behavior.
  • Pass chat history yourself for queries. The user’s question and prior turns are separate; include both for coherent follow-ups.
  • Expose the agent first. Enable Expose to Agentic Apps on the Output Tab and select widgets, or the agent won’t appear in the app builder.
  • Write specific agent descriptions. Orchestrator routing for Query depends on them.
  • Invest in InitDisplay and InitActions. They build the first screen and tell users what to do next. Select widgets, write specific display and action prompts, and pair InitActions with InvokeAction.

New to Oracle Fusion AI Agents?

Explore AI Agent Studio Learning Path — blog series to help build from zero to production-grade AI agents, with deep dives on every agent pattern, node type, and tool integration.

Explore AI Agentic Apps Learning Path — blog series on everything you need to build Oracle Fusion AI Agentic Apps using AI Agent Studio.