Skip to main content
A user action in your view does not advance the conversation: the model only acts on conversation turns. useSendFollowUpMessage posts a message into the conversation as if the user had typed it, starting the next assistant turn.

Example

Tapping a product asks the model to tell the shopper more about it, while the carousel stays on screen.

Returns

useSendFollowUpMessage returns a single, memoized function, safe to pass to effects and handlers.

sendFollowUpMessage

Posts the message and returns the host’s promise, which rejects when the host refuses the message. The promise carries no value: any model reply lands in the conversation, not back in the view.
  • prompt the text posted as a user turn, model-visible, as if the user had typed it, or an array of MCP content blocks. The view keeps running after the message is posted.
  • options
    • scrollToBottom asks the host to scroll the conversation to the newest message after posting; omit it for the host default, or set false to keep the scroll position and the view on screen.
    • target: "new" sends the message to a new conversation instead of the active one. On hosts that don’t advertise openai/message, the call rejects with a NotSupportedError and nothing is posted.
scrollToBottom is specific to ChatGPT. target and titled items come from the OpenAI MCP extensions: only ChatGPT reads them, and mobile only supports the active conversation. ChatGPT doesn’t accept audio blocks, nor resource links on iOS.

Titled items

On ChatGPT, a text or image block with _meta["openai/title"] becomes a labeled item in the message, which the user can remove as one unit. Untitled text stays ordinary message text.
Content blocks and target are sent through the MCP Apps ui/message request, also inside ChatGPT, so scrollToBottom doesn’t apply to them.

useCallTool

Call a server tool without a conversation turn

useToolInfo

Read the tool result the view mounted with

DataLLM

Sync on-screen state to the model passively