Key Concepts
| Concept | Description |
|---|---|
| Session Memory | Declare and use variables that hold data within a single conversation — collected values, flags, and intermediate results that are discarded when the session ends. |
| Persistent Memory | Store facts that survive across sessions, such as user preferences and history. Covers user-scoped, project-scoped and execution-tree scoped variables and access control. |
| Recall | Automatically loads values from persistent memory into session context at lifecycle events like session start or before a search. |
| Remember Triggers | Automatically stores values into persistent memory when a condition is met. |
| Manipulate State: SET, CLEAR, and TRANSFORM | Assign values, remove variables, and reshape data arrays during flow execution using SET, CLEAR, and TRANSFORM directives. |
| Best Practices | Recommended patterns for naming variables, providing fallback values, and managing reset behavior. |
Session Memory
Session variables hold data that is relevant only during a single conversation. They are created when the session starts and discarded when the session ends (unless RESET: never is specified).Declare session variables
Add aMEMORY: block with a session: section to your agent definition in the ABL editor.
| Property | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Variable name, used as the key in session context. |
| TYPE | string | number | boolean | date | array | object | No | Value type for runtime validation and field resolution. |
| DESCRIPTION | string | No | Human-readable description of the variable’s purpose. |
| INITIAL | any | No | Initial value assigned when the session starts. Initial value is null by default. |
| RESET | per_session | per_step | never | No | When to reset the variable. Default is per_session. See Reset behavior. |
| Value | Behavior |
|---|---|
| per_session | Variable is initialized at session start and cleared when the session ends. This is the default. |
| per_step | Variable is reset to its initial value at the start of each flow step. Useful for step-scoped accumulators. |
| never | Variable persists for the lifetime of the runtime process. Use sparingly; prefer persistent memory instead. |
| per_activation | Variable is reset to INITIAL every time the agent is activated, including repeated activations of the same agent. |
Access session variables in response templates
Reference session variables by name inside{{ }} in RESPOND blocks.
Access session variables in step conditions
Use session variables inCHECK, constraint expressions, and ON_INPUT transition logic.
Troubleshooting
- Variable is undefined in template. The variable has not been set yet in the current flow. Ensure the step that sets it executes before the step that reads it.
- Variable resets unexpectedly. Check
RESET. Variables withRESET: per_stepclear at each step transition. Useper_sessionorneverfor longer-lived values. - Type mismatch at runtime.
TYPEenables runtime validation. If you declareTYPE: numberbut assign a string, the runtime logs a warning. Coerce tool results and user inputs to the declared type.
Persistent Memory
Persistent variables are stored in the platform’s fact store and survive across sessions. Persistent memory fields are scoped to a user, a execution chain or an entire project.Declare persistent variables
Add apersistent: section under MEMORY:. Use dot-notation paths to name each variable and bind them to a scope.
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
| path | string | Yes | — | Dot-notation path (e.g., user.preferred_chains), where the first segment indicates the scope(user, project or workflow) and second indicates the name of the field. |
| SCOPE | user | project | execution_tree | No | user | Ownership scope. user is per-user; project is shared across all users. execution_tree is for an entire execution workflow across agents. If this scope differs from the scope in the path, scope takes precedence. |
| ACCESS | read | write | readwrite | No | readwrite | Access direction. Constrains whether the agent can read, write, or both. |
| TYPE | string | number | boolean | date | array | object | No | — | Value type for runtime validation. |
| UNIT | string | No | — | Unit of the stored value (e.g., USD, km). Informational metadata only. |
| DEFAULT | any | No | null | Default value when no fact exists in the store. |
| DESCRIPTION | string | No | — | Human-readable description. |
Scoping rules
| Scope | Description |
|---|---|
| User scope (SCOPE: user) | Values are unique per authenticated user. Two users in the same project see different values for the same path. |
| Project scope (SCOPE: project) | Values are shared across all users within the project. Useful for reference data, feature flags, or global configuration. |
| Execution-tree scope (SCOPE: execution_tree) | Values are shared across one workflow / handoff tree only. This is the preferred scope for cross-agent state such as auth tokens, selected account IDs, or in-flight case context. |
Access Control
Restrict whether the agent can read, write, or both for each persistent path.| Value | Behavior |
|---|---|
read | Agent can read but not modify the value. |
write | Agent can write but not read the current value. |
readwrite | Agent can both read and modify. (Default.) |
Access Persistent Variables in Expressions
Use the full dot-notation path within{{ }} to read persistent variables in SET expressions and RESPOND templates.
Troubleshooting
- Persistent value is null on first session. The value has not been stored yet. Use
DEFAULTto provide a fallback, or useCOALESCE()in expressions. - Value not persisting across sessions. Ensure the value is written using a
remembertrigger orSETstatement. Declaring a persistent path does not automatically populate it. - Wrong user sees another user’s data. Verify
SCOPE: useris set. Project-scoped variables are shared. User-scoped variables require user authentication to resolve correctly.
Remember Triggers
Remember triggers write values to persistent memory when a condition evaluates totrue during conversation.
user_name gets a value during the conversation (from a GATHER step, SET assignment, or tool result), the trigger fires and stores it to user.name. TTL: "90d" means the stored fact expires after 90 days.
Remember Trigger Properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
| WHEN | string | Yes | — | Condition expression that triggers the store operation. Evaluated after each turn. |
| STORE | object | Yes | — | Defines the value expression and the target persistent path. Syntax: value_expr -> target_path. |
| TTL | string | No | — | Time-to-live for the stored fact. After expiration, the value is deleted. Examples: “30d”, “24h”. TTL values use a duration string: s - Seconds, m - Minutes, h - Hours, d - Days |
Store computed values
Store a computed object instead of a raw variable value.Recall
Recall automatically stores values into persistent memory when conditions are met, and loads stored facts back into the session at specific lifecycle events.Add recall instructions
user.name, user.language, and user.preferred_agent from persistent memory and injects them into the session context.
Recall Properties
| Field | Required | Description |
|---|---|---|
ON | Yes | Canonical event name such as session:start or tool:<name>:after. |
ACTION | Yes | inject_context, load_memory, or prompt_llm. |
PATHS | No | Durable memory paths to retrieve for inject_context or load_memory. |
DOMAIN | No | Named memory domain used by load_memory when paths are domain-scoped. |
INSTRUCTION | No | Prompt text used by prompt_llm to shape how retrieved context is applied. |
| Event | When it fires |
|---|---|
| session:start | When a new session initializes, before any user input. |
| search:before | Before a search or retrieval operation. |
| Action | Behavior |
|---|---|
inject_context | Loads specified persistent paths directly into session variables. |
load_memory | Loads all facts in the specified domain into context. |
prompt_llm | Passes the instruction text to the LLM as additional context. (Default.) |
Recall before search operations
Load relevant user context before a knowledge base search executes.travel_preferences domain into the session, allowing the search to incorporate user preferences.
Inject recalled data as an LLM instruction
Instead of directly injecting variables, pass an instruction to the LLM on how to use the recalled information.Combined remember and recall pattern
A complete pattern that stores user preferences during a conversation and recalls them at the start of future sessions.Troubleshooting
- Remember trigger never fires. The
WHENcondition references a variable that is never set during conversation. Verify the variable name matches what your flow or tools produce. - Recalled value is stale. The fact may have expired (TTL elapsed). Check the TTL setting and extend it if needed.
- Recall injects null values. The persistent path has not been written to yet. Use
DEFAULTon the persistent variable declaration to provide a fallback.
Manipulate State: SET, CLEAR, and TRANSFORM
UseSET, CLEAR, and TRANSFORM directives in flow steps to assign values, remove variables, and reshape data arrays during execution.
SET a variable
UseSET in a flow step to assign a value to a session variable. The expression is resolved at execution time.
SET expressions support arithmetic, string interpolation, dot-notation access, and function calls.
From tool results:
ON_INPUT branches:
CLEAR a variable
UseCLEAR to remove one or more variables from the session. After a CLEAR, the variable is undefined and any template reference to it renders as empty.
TRANSFORM an array
UseTRANSFORM to filter, map, sort, and limit array data in a single pipeline.
In the following example TRANSFORM creates a new array affordable_hotels without modifying the source array.
Full pipeline:
Troubleshooting
SETexpression produces null. The right-hand variable may not be defined yet. Verify the data source (tool result, gathered field, or priorSET) runs before this step.CLEARdoes not reset aGATHERfield. Clearing a variable removes it from the session, but theGATHERstep may not re-prompt for it unless the step is re-entered. UseCLEARwithin aSUB_INTENTorDIGRESSIONthat resumes the same step.TRANSFORMproduces empty array. TheFILTERcondition may be too strict, or the source array is empty. Check the source variable and filter expression.
Best Practices
- Use meaningful variable names. Use names like
user_preferences,order_history, orconversation_context. Avoid generic names likevar1,data, ortemp. - Use
COALESCE()for persistent variables. Persistent paths may not be populated on a user’s first session. UseCOALESCE(user.name, "valued customer")to provide a safe fallback. - Set defaults on persistent variables. Declare
DEFAULTvalues so the agent behaves correctly before any data has been stored. - Use
CLEARwithin sub-intents to reset state. Clearing a variable removes it from the session, but aGATHERstep only re-prompts when the step is re-entered. PairCLEARwith aSUB_INTENTorDIGRESSIONthat resumes the same step. - Prefer
per_sessionreset overnever. Variables withRESET: neverpersist for the lifetime of the runtime process. Reserve this for counters or flags where cross-session accumulation is intentional.
Further Reading
- Memory & Constraints Reference — Full ABL syntax for MEMORY and CONSTRAINTS blocks.
- GATHER Reference — Collecting user input into session variables.
- Flow Reference — Flow step directives including SET, CLEAR, TRANSFORM.