Skip to main content
This page requires Python familiarity. Agent Memory is an advanced feature requiring explicit configuration — it is not enabled by default. It is configured in JSON and accessed from Python functions.
Use Agent Memory when your agent needs to remember information about returning callers — preferences, past bookings, or verification status — across separate conversations. Without it, every call starts from scratch.
This feature is in early access. Functionality may evolve. Contact PolyAI support for guidance on production use.
It uses a key-value store attached to a user identifier (like phone number). Memory is read at the start of each turn and written after the conversation ends. You can:
  • Read memory using conv.memory.get("key")
  • Write memory by setting conv.state["key"] = value (if configured with state_keys)

Configuration

JSON config (Agent Studio)

To enable Agent Memory:
{
  "memory": {
    "repeat_caller": {
      "analytics_enabled": true,
      "state_keys": ["booking_day", "cheese_type"],
      "identifier_blacklist": ["+440000000000"]
    }
  }
}
  • analytics_enabled: Adds repeat caller metrics to Studio analytics
  • state_keys: Keys to save from conv.state to memory
  • identifier_blacklist: Optional list of excluded IDs (e.g. test numbers)

Using memory in functions

Read memory

def start_function(conv: Conversation):
    cheese = conv.memory.get("cheese_type")
    if cheese:
        conv.say(f"You previously picked {cheese}.")

Write memory (using conv.state)

def book(conv: Conversation):
  conv.state["cheese_type"] = "brie"
These fields will only be persisted if they are listed under state_keys in your config.

Example: conditional reuse

def start_function(conv: Conversation):
  booking_day = conv.memory.get("booking_day")
  cheese_type = conv.memory.get("cheese_type")
  if booking_day and cheese_type:
    conv.say(f"You booked {cheese_type} for {booking_day}. Rebook?")

Memory behavior

  • Memory is read once per turn and cached.
  • Memory is persisted at the end of a conversation.
  • Only supported identifier today: phone number.

FAQ

Can I store nested JSON?

No. Each value must be a string, number, or flat serializable object. Always avoid packing PII into a single field.

Can I check if memory exists?

Yes:
if "booking_day" in conv.memory:

Can I prevent overwrites?

Not directly, but you can check before writing:
if "cheese_type" not in conv.memory:
  conv.state["cheese_type"] = value

How do I get all memory fields?

Use the fields() method:
all_memory = conv.memory.fields()  # Returns a dict copy of all fields

How do I check how many fields are stored?

Use Python’s len():
field_count = len(conv.memory)
Last modified on March 22, 2026