By default, when an Activity or Decision Policy declares required slots, the Reasoning Engine is required to gather values for all slots before that Activity or Decision Policy can be invoked. Similarly, when gathering a value for a slot, the user is required to provide a means of value population (user provided value or resolver generated candidates), or the plugin cannot continue successfully.
Optional slots relax these requirements. With the Slot Inference Policy and fallback values, you can configure slots to:
The Slot Inference Policy determines how the reasoning engine gathers values for a slot. Configure this setting when creating or editing a slot.

Fallback expressions use DSL to define default values for optional slots. When the fallback value is an object type, you must explicitly declare the full object structure in the DSL expression.
A fallback (default) value provides a predefined value when the user doesn’t supply one. Fallback values can be:
10, "N/A", blank)data.ticket_comment_optional)For slots that expect an object (such as those using a static resolver), you cannot simply provide a primitive value you must pass a value from the data bank or construct the complete object.
Static resolvers expect an object with value and display_name properties:
In the Fallback Expression DSL Editor, write this as:
If your fallback references an object from another slot, ensure the expression returns the complete object structure:
This works when previous_priority is already an object with the expected shape. If you need to transform or construct the object from other data:
When a slot’s fallback value references another slot, the referenced slot must be collected first. This dependency affects how you configure your conversational process.


In this example:
recent_address is a resolved object containing address detailscity is an optional slot where the user can specify a new city if it has changeddata.recent_address.cityBecause city depends on recent_address, the recent_address slot must be positioned to the left in the Required Slots list. This ensures the reasoning engine collects recent_address first, making its properties available for the city fallback expression.
The Reasoning Engine processes required slots from left to right. If a slot with a fallback expression referencing another slot is positioned before its dependency, the fallback expression will fail to resolve the referenced data won’t exist yet.
Use this when you never want to prompt for a slot and make the value NULL if nothing is explicitly provided by the user.

The slot will be initialized with Null unless the user explicitly provides a value in the conversation.
Use this when you want optional prompting with a fallback.

The slot may be requested; if the user skips or the value can’t be inferred, “This ticket has been updated by …” (a static string) is used.
File slots have specific limitations when combined with optional slot configurations.
Setting a file slot’s inference policy to Always Infer will not work as expected. When Always Infer is selected, the AI agent does not prompt the user which means the “Upload file” button never appears in the conversation.
Since file slots can only be populated through the dedicated upload button, and Always Infer suppresses that prompt, the slot will never receive a value.
Result: The file slot remains empty and falls back to the default value (if configured) or fails.
Fallback expressions cannot be used meaningfully with file slots. There is no way to:
File content must come from real time user interaction with the upload button.
Use Infer if Available or Always Ask for file slots with NULL fallback
This is the only inference policy that provides meaningful optional behavior for file slots.
Always Infer for truly optional fields that shouldn’t interrupt the flow. Use Infer if Available when you want smart defaults but still want to sometimes prompt the user