> ## Documentation Index
> Fetch the complete documentation index at: https://docs.upsonic.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Attributes

> Configuration options for the Memory class

## Memory Class Parameters

### Save Flags

Control what is persisted to storage after each run.

| Parameter              | Type   | Default | Description                              |
| ---------------------- | ------ | ------- | ---------------------------------------- |
| `full_session_memory`  | `bool` | `False` | Persist complete chat history to storage |
| `summary_memory`       | `bool` | `False` | Generate and persist session summaries   |
| `user_analysis_memory` | `bool` | `False` | Analyze and persist user trait profiles  |

### Load Flags

Control what is injected into subsequent runs as context. Each defaults to its corresponding save flag.

| Parameter                   | Type           | Default | Description                                                        |
| --------------------------- | -------------- | ------- | ------------------------------------------------------------------ |
| `load_full_session_memory`  | `bool \| None` | `None`  | Inject chat history into runs (defaults to `full_session_memory`)  |
| `load_summary_memory`       | `bool \| None` | `None`  | Inject session summary into runs (defaults to `summary_memory`)    |
| `load_user_analysis_memory` | `bool \| None` | `None`  | Inject user profile into runs (defaults to `user_analysis_memory`) |

### General Parameters

| Parameter                | Type                           | Default    | Description                                         |
| ------------------------ | ------------------------------ | ---------- | --------------------------------------------------- |
| `storage`                | `Storage`                      | (required) | Storage backend for persistence                     |
| `session_id`             | `str \| None`                  | `None`     | Session identifier (auto-generated if not provided) |
| `user_id`                | `str \| None`                  | `None`     | User identifier (auto-generated if not provided)    |
| `num_last_messages`      | `int \| None`                  | `None`     | Limit history to last N message turns               |
| `model`                  | `str \| Model \| None`         | `None`     | Model for summaries/user analysis                   |
| `user_profile_schema`    | `BaseModel \| None`            | `None`     | Custom Pydantic model for user profiles             |
| `dynamic_user_profile`   | `bool`                         | `False`    | Let agent create custom profile fields              |
| `user_memory_mode`       | `Literal['update', 'replace']` | `'update'` | How to update user profiles                         |
| `feed_tool_call_results` | `bool`                         | `False`    | Include tool call results in history                |
| `debug`                  | `bool`                         | `False`    | Enable debug logging                                |
| `debug_level`            | `int`                          | `1`        | Debug verbosity (1-2)                               |

## Basic Configuration

```python theme={null}
from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

storage = SqliteStorage(db_file="agent.db")

memory = Memory(
    storage=storage,
    session_id="session_001",
    user_id="user_123",
    full_session_memory=True,
    summary_memory=True,
    user_analysis_memory=True,
    model="anthropic/claude-sonnet-4-5"
)

agent = Agent("anthropic/claude-sonnet-4-5", memory=memory)

result = agent.do(Task("Hello! I'm learning Python"))
print(result)
```

## Save/Load Separation

Save everything to storage but only inject summaries and user profiles into subsequent runs.
This reduces token usage while preserving full history for auditing or debugging.

```python theme={null}
from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

storage = SqliteStorage(db_file="efficient.db")

memory = Memory(
    storage=storage,
    session_id="session_001",
    user_id="user_123",
    full_session_memory=True,         # Save raw chat history
    summary_memory=True,              # Save summaries
    user_analysis_memory=True,        # Save user profiles
    load_full_session_memory=False,   # Don't inject raw history into context
    load_summary_memory=True,         # Inject summary instead
    load_user_analysis_memory=True,   # Inject user profile
    model="anthropic/claude-sonnet-4-5"
)

agent = Agent("anthropic/claude-sonnet-4-5", memory=memory)

result1 = agent.do(Task("My name is Alice, I work on ML pipelines"))
result2 = agent.do(Task("What do you know about me?"))
print(result2)  # Recalls via summary + user profile, not raw history
```

## Summary-Only Mode

Use summaries without persisting full chat history:

```python theme={null}
from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

storage = SqliteStorage(db_file="summary_only.db")

memory = Memory(
    storage=storage,
    session_id="session_001",
    full_session_memory=False,  # No raw history saved
    summary_memory=True,        # Only summaries are saved and injected
    model="anthropic/claude-sonnet-4-5"
)

agent = Agent("anthropic/claude-sonnet-4-5", memory=memory)

result1 = agent.do(Task("The project deadline is next Friday"))
result2 = agent.do(Task("When is the deadline?"))
print(result2)  # Recalls via summary
```

## Message Limiting

Control memory size by limiting message history:

```python theme={null}
from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

storage = SqliteStorage(db_file="agent.db")

memory = Memory(
    storage=storage,
    session_id="session_001",
    full_session_memory=True,
    num_last_messages=10  # Keep only last 10 turns
)

agent = Agent("anthropic/claude-sonnet-4-5", memory=memory)

result = agent.do(Task("What topics have we discussed?"))
print(result)
```

## Custom User Profile Schema

Define specific fields for user profiles:

```python theme={null}
from pydantic import BaseModel, Field
from typing import Optional, List
from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

class CustomerProfile(BaseModel):
    name: Optional[str] = Field(None, description="Customer name")
    company: Optional[str] = Field(None, description="Company name")
    role: Optional[str] = Field(None, description="Job role")
    interests: Optional[List[str]] = Field(None, description="Areas of interest")

storage = SqliteStorage(db_file="customer.db")

memory = Memory(
    storage=storage,
    session_id="session_001",
    user_id="customer_456",
    user_analysis_memory=True,
    user_profile_schema=CustomerProfile,
    model="anthropic/claude-sonnet-4-5"
)

agent = Agent("anthropic/claude-sonnet-4-5", memory=memory)

result = agent.do(Task("I'm John from Acme Corp, working as a data engineer"))
print(result)
```

## Update Modes

Control how user profiles are updated:

| Mode        | Behavior                               |
| ----------- | -------------------------------------- |
| `'update'`  | Merge new traits with existing profile |
| `'replace'` | Replace entire profile with new traits |

```python theme={null}
from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

storage = SqliteStorage(db_file="profiles.db")

memory = Memory(
    storage=storage,
    session_id="session_001",
    user_id="user_789",
    user_analysis_memory=True,
    user_memory_mode='update',  # Default: merge new with existing
    model="anthropic/claude-sonnet-4-5"
)

agent = Agent("anthropic/claude-sonnet-4-5", memory=memory)

result = agent.do(Task("I prefer dark mode and use vim"))
print(result)
```
