reasoning mode, switching prompt structure, or passing provider-specific parameters.
Enable advanced mode
Select Advanced
Tap the Advanced radio button at the top of the section. The individual simple-mode fields are replaced by a Request Body text area and a Suggestion Content field.
String values are mapped (what a string map is)
All string fields are exposed as a map with four variants so you can embed them safely in JSON. It will be referred as “string map” in this guide. The available variants are:
| Variant | Description |
|---|---|
{{field.raw}} | Original unescaped string |
{{field.jsonEscaped}} | JSON-escaped (backslashes, quotes, newlines escaped) |
{{field.regexLiteral}} | Regex-literal surrounded by\Q…\E) |
{{field.regexLiteralEscaped}} | Regex-literal first, then JSON-escaped |
In JSON templates, use .jsonEscaped so that special characters in the conversation don’t break the JSON structure.
Top-level fields
| Field | Type | Description |
|---|---|---|
{{currentTyping}} | string map | What the user is currently typing |
{{currentTypingTrimmed}} | string map | currentTyping without the last incomplete token |
{{currentTypingLastToken}} | string map | The last incomplete token the user is typing |
{{currentTypingEndsWithSeparator}} | boolean | true if the typing ends with a space or punctuation |
{{pkgName}} | string map | Package name of the active app |
{{<package>_<name>_<of>_<app>}} | true | Field name is the package name of the active app with . replaced by _, value is always true |
pastMessages | list | The conversation history as a list of turns (oldest first) |
null / falsy when empty, so {{#currentTyping}}…{{/currentTyping}} can be used to conditionally render content only when the user is typing something.
The pastMessages list
{{#pastMessages}}…{{/pastMessages}} iterates over the conversation history as a list of turns (oldest first). Each turn represents one or more consecutive messages sent by the same role (either all sent by the user, or all received from the other party).
List items of pastMessages:
| Field | Type | Description |
|---|---|---|
{{sent}} | boolean | true if this turn contains messages sent by the user (“Me”) |
{{received}} | boolean | true if this turn contains messages received from the other party |
{{sender}} | string map | The sender name/role (e.g. "Me") |
{{messages}} | list | The list of individual messages in this turn (see below) |
messageslist within a pastMessages turn:
Use {{#messages}}…{{/messages}} to iterate over individual messages in the current turn:
| Field | Type | Description |
|---|---|---|
{{content}} | string map | The message text |
{{sent}} | boolean | true if sent by the user |
{{received}} | boolean | true if received from the other party |
{{sender}} | string map | The sender name/role (e.g. "Me") |
Example
Per-app system prompt using package name booleans
Note: package name dots are replaced with underscores, socom.whatsappbecomescom_whatsapp.
Prefill the user’s current typing as the start of the assistant turn
Note: Some models are bad at continuing from partial words, so currentTypingTrimmed comes in handy here to prefill only the last complete token, allowing the model to generate the full last word. You can hint the last word somewhere else in the prompt.
2. Suggestion Content Template
Found in the Advanced config section below the Request Body field. After the model responds, this Mustache template is rendered to form the final suggestion text shown to the user. This exists because some API setups use assistant prefill — you send the user’s current typing as the start of the assistant’s response, and the model returns only the continuation. The template lets you join them back together. The same context fields from the request body are available, plus two extras:| Field | Type | Description |
|---|---|---|
{{assistantMessage}} | string | The raw text returned by the model |
{{assistantMessageAutoTrimCurrentTyping}} | string | The model response, but if it starts with currentTyping, that part would be trimmed automatically |
{{assistantMessageAutoTrimCurrentTypingTrimmed}} | string | Same as above, but currentTypingTrimmed is used for the trimming instead of currentTyping (only complete tokens are prefixed) |
| (all other fields previously stated) | - | Same as request body template, with .raw / .jsonEscaped / .regexLiteral / .regexLiteralEscaped variants |
currentTyping and other string map fields, assistantMessage and assistantMessageAutoTrimCurrentTyping are already plain strings so no variant suffix is needed.
After rendering, any two consecutive spaces is collapsed to one, handling the case where currentTyping ends with a space and the model response also starts with one (or vice versa).
Show response as-is
Prepend the user’s current typing (usually with assistant prefill)
If your request body sendscurrentTyping as the start of the assistant turn (the model only returns the continuation):
"sounds good, I'll be" and the model returns " there at 7". The suggestion becomes "sounds good, I'll be there at 7".
Add a suffix
Not sure who would need this, you can also add a suffix like this:When to use advanced mode
Advanced mode is the right choice when you need to:- Use non-standard model parameters that your provider supports but that simple mode doesn’t expose.
- Restructure the prompt entirely
