memory.options, with
five independent switches. An agent saved with no memory block gets the
platform defaults: the last ten messages, a title generated from the first
message, nothing else.
Everything below goes through
PATCH /v1/agents/{id}/draft. An unknown
key or a value out of range answers 400 naming the path, so a typo never
saves as a setting that silently does nothing. "memory": null restores the
platform defaults.
Remembering a user across conversations and runs
A scheduled automation runs in a new conversation every time (see Result threads), so nothing thread-scoped carries from Monday’s run to Tuesday’s. What does carry is the user’s working memory, when it is kept per user and someone keeps it current. The combination:workingMemory.scope: "resource"— one record per user (it is the default scope). A user’s chats and their automation runs share it: a run executes as its owner, on the same user record.observation.manageWorkingMemory— the observer updates the notes in the background, from what it observed. The agent no longer has to remember to do it mid-answer, and gets the notes read-only in its system prompt.observation.bufferOnIdle— the observer also runs at the end of every turn, however short. Without it a run’s conversation (one user message, one answer) would never reach the observer’s token interval, and the notes would never be written.observation.threadTitle— the observer renames the conversation when its topic meaningfully changes, so the thread list follows what was actually discussed.
Working memory
workingMemory: true is the same as { "enabled": true }. The notes are
injected into the agent’s system prompt on every turn.
The observer (observational memory)
observationalMemory: true turns it on with every default below.
Titles: the first one and the rewrites
Two writers can name a conversation.generateTitle names it from the
first message, as soon as the first answer is saved, so the thread list is
never blank. With observation.threadTitle the observer proposes a title
at the end of its first pass — that one replaces the first — and from then
on rewrites it only when the topic meaningfully changes; it is shown its own
previous title and told to leave it alone otherwise. A rewrite lands on the
thread itself and reaches every open client as a thread update over
GET /v1/events, like any
other change to the row.
Turn generateTitle off (false) to let the observer be the only writer;
the conversation is then untitled until its first observation.
Cost
The observer, the reflector and the title model run on the organization’s own key, under the billing group of the conversation they belong to (an automation run’s: its owner’s group), and show up in that group’s usage like the agent’s own calls. The shape, with the defaults above:- one background observer call every
bufferTokensworth of new messages (every 4,500 tokens), on the conversation’s messages since the last one; - with
bufferOnIdle, one background observer call at the end of every turn — the cost of remembering a user across runs is one small-model call per run; - one reflector call each time the observation log passes its threshold;
- one title call per conversation (
generateTitle), plus a title rewrite only when the observer decides the topic changed — part of its normal call, not an extra one.
blockAfter, the synchronous safety valve.
Long-term recall (semantic recall)
semanticRecall: true uses the defaults. Each turn costs one embedding of
the new message, and each saved message one embedding, on the platform
embedding model.