Skip to main content

Overview

User Analysis Memory extracts user traits from conversations and builds persistent profiles. This enables personalization across sessions and adaptive agent behavior.

Basic Usage

from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

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

memory = Memory(
    storage=storage,
    session_id="session_001",
    user_id="user_abc",
    user_analysis_memory=True,
    model="openai/gpt-4o"  # Required for trait extraction
)

agent = Agent("openai/gpt-4o", memory=memory)

result1 = agent.do(Task("I'm a data scientist with 5 years of ML experience"))
result2 = agent.do(Task("What do you know about me?"))
print(result2)  # "You're a data scientist with 5 years of ML experience"

Custom Profile Schema

Define specific fields to track:
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 DeveloperProfile(BaseModel):
    name: Optional[str] = Field(None, description="Developer name")
    languages: Optional[List[str]] = Field(None, description="Programming languages")
    experience_years: Optional[int] = Field(None, description="Years of experience")
    preferred_editor: Optional[str] = Field(None, description="Preferred code editor")

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

memory = Memory(
    storage=storage,
    session_id="session_001",
    user_id="dev_123",
    user_analysis_memory=True,
    user_profile_schema=DeveloperProfile,
    model="openai/gpt-4o"
)

agent = Agent("openai/gpt-4o", memory=memory)

result = agent.do(Task("I'm Alice, I use Python and Go, been coding for 8 years, love VS Code"))
print(result)

Dynamic Profile Generation

Let the agent discover and create custom fields:
from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

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

memory = Memory(
    storage=storage,
    session_id="session_001",
    user_id="user_456",
    user_analysis_memory=True,
    dynamic_user_profile=True,  # Agent creates custom fields
    model="openai/gpt-4o"
)

agent = Agent("openai/gpt-4o", memory=memory)

result = agent.do(Task("I prefer concise answers, work night shifts, and love hiking"))
print(result)  # Agent adapts to learned preferences

Cross-Session Persistence

User profiles persist across sessions:
from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

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

# Session 1: Learn about user
memory1 = Memory(
    storage=storage,
    session_id="session_001",
    user_id="customer_789",
    user_analysis_memory=True,
    model="openai/gpt-4o"
)
agent1 = Agent("openai/gpt-4o", memory=memory1)
agent1.do(Task("I'm John, I run a small bakery in Seattle"))

# Session 2: New session, same user - profile is loaded
memory2 = Memory(
    storage=storage,
    session_id="session_002",  # Different session
    user_id="customer_789",     # Same user
    user_analysis_memory=True,
    model="openai/gpt-4o"
)
agent2 = Agent("openai/gpt-4o", memory=memory2)
result = agent2.do(Task("Remind me what you know about me"))
print(result)  # "You're John, you run a bakery in Seattle"

Update Modes

ModeBehavior
'update'Merge new traits with existing profile (default)
'replace'Replace entire profile with new traits
from upsonic import Agent, Task
from upsonic.storage.memory import Memory
from upsonic.storage.sqlite import SqliteStorage

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

# Update mode: accumulates traits
memory = Memory(
    storage=storage,
    session_id="session_001",
    user_id="user_123",
    user_analysis_memory=True,
    user_memory_mode='update',
    model="openai/gpt-4o"
)

agent = Agent("openai/gpt-4o", memory=memory)
result = agent.do(Task("I also speak Spanish and French"))
print(result)

Parameters

ParameterTypeDefaultDescription
user_analysis_memoryboolFalseEnable user profiling
user_idstrauto-generatedUser identifier
modelstr | Model(required)Model for trait extraction
user_profile_schemaBaseModel | NoneNoneCustom profile schema
dynamic_user_profileboolFalseAuto-generate profile fields
user_memory_modeLiteral['update', 'replace']'update'Profile update strategy