Session Module in AgentScope: Managing Conversation State Persistence

The Session module in AgentScope provides a pluggable abstraction layer that separates conversation logic from state persistence through a uniform API for saving and loading StateModule objects across JSON files or Redis backends.

The Session module is a core infrastructure component in the AgentScope framework that enables robust conversation state management. By decoupling runtime logic from storage mechanisms, it allows agents to remain stateless while ensuring continuity across distributed deployments and service restarts.

Core Architecture of the Session Module

The Session module implements a backend-agnostic design through abstract base classes and concrete storage implementations.

SessionBase: The Abstract Contract

SessionBase defines the universal interface for all session backends in src/agentscope/session/_session_base.py. It specifies the two critical methods that every backend must implement:

  • save_session_state(session_id, user_id, **modules) – Serializes and persists state dictionaries
  • load_session_state(session_id, user_id, **modules) – Retrieves and restores state dictionaries

This abstraction ensures that application code remains identical regardless of whether state is stored locally or in a distributed cache.

JSONSession: File-Based Persistence

JSONSession provides the default zero-dependency storage implementation in src/agentscope/session/_json_session.py. It writes human-readable JSON files to a configurable directory, using filenames that incorporate both session_id and user_id to support multi-tenant scenarios.

This backend is ideal for development, debugging, and single-node deployments where external dependencies should be minimized.

RedisSession: Distributed State Management

RedisSession in src/agentscope/session/_redis_session.py offers production-grade state management using Redis. It supports:

  • TTL (Time-To-Live) expiration for automatic session cleanup via the key_ttl parameter
  • Key prefixing for namespace isolation in multi-tenant environments
  • Connection pooling for high-throughput scenarios

This backend enables horizontal scaling of agent services across multiple processes or machines while maintaining session continuity.

StateModule: Serializable State Interface

The StateModule class in src/agentscope/module/_state_module.py provides the serialization contract that enables any object to participate in session management. Key capabilities include:

  • Recursive state gathering – Automatically collects state from nested sub-modules
  • Custom serialization – Supports register_state() with custom to_json/from_json functions for complex objects
  • Attribute registration – Explicit control over which fields persist across sessions

Any agent or tool that inherits from or contains a StateModule can transparently save and restore its internal state through the Session API.

How the Session Module Manages Conversation State

The Session module orchestrates state persistence through a five-phase workflow that remains transparent to agent business logic.

  1. State Definition
    Components subclass StateModule and register attributes requiring persistence using register_state("attribute_name").

  2. Runtime Mutation
    During conversation processing, agents modify their registered attributes normally. The StateModule tracks these changes in memory.

  3. State Extraction
    When persistence is required, the Session backend calls state_dict() on each registered StateModule. This recursively serializes all registered attributes and nested modules into a JSON-compatible dictionary.

  4. Storage Operation
    The backend writes the serialized dictionary to its storage medium:

    • JSONSession writes to {save_dir}/{user_id}_{session_id}.json
    • RedisSession stores as a hash or JSON string under {key_prefix}{user_id}:{session_id}
  5. State Restoration
    Upon subsequent requests, load_session_state() retrieves the stored dictionary and invokes load_state_dict() on each target module, reconstructing the exact runtime state including nested objects.

Practical Implementation Examples

Creating a Stateful Component with StateModule

Define a persistent counter that survives service restarts:


# my_agent.py

from agentscope.module import StateModule

class PersistentCounter(StateModule):
    def __init__(self):
        super().__init__()
        self.count = 0
        # Register the attribute for automatic serialization

        self.register_state("count")
    
    def increment(self):
        self.count += 1
        return self.count

Persisting State with JSONSession

Implement local file-based persistence for development:

import asyncio
from agentscope.session import JSONSession
from my_agent import PersistentCounter

async def demo_json_session():
    # Initialize the JSON backend

    session = JSONSession(save_dir="./session_data")
    counter = PersistentCounter()
    
    # Simulate conversation processing

    counter.increment()
    counter.increment()
    print(f"Current count: {counter.count}")  # Output: 2

    
    # Persist state to disk

    await session.save_session_state(
        session_id="chat-42",
        user_id="alice",
        counter=counter,
    )
    
    # Simulate new process instance

    new_counter = PersistentCounter()
    await session.load_session_state(
        session_id="chat-42",
        user_id="alice",
        counter=new_counter,
    )
    print(f"Restored count: {new_counter.count}")  # Output: 2

asyncio.run(demo_json_session())

The JSONSession class writes files to {save_dir}/{user_id}_{session_id}.json as implemented in src/agentscope/session/_json_session.py.

Scaling with RedisSession

Deploy distributed state management for production:

from agentscope.session import RedisSession

redis_session = RedisSession(
    host="redis.production.internal",
    port=6379,
    db=0,
    password="secure_password",
    key_prefix="agentscope:prod:",
    key_ttl=7200,  # 2-hour expiration

)

# Usage remains identical to JSONSession

await redis_session.save_session_state(
    session_id="chat-42",
    user_id="alice",
    counter=counter,
)

The RedisSession implementation in src/agentscope/session/_redis_session.py supports connection pooling, key prefixing, and TTL management for multi-tenant deployments.

Integration with High-Level APIs

AgentScope's Conversation and RealtimeAgent classes accept session backends directly:

from agentscope.session import JSONSession
from agentscope import Conversation

conversation = Conversation(
    session_backend=JSONSession(save_dir="./conv_state"),
    session_id="conv-001",
    # ... other parameters

)

The framework automatically invokes save_session_state at conversation checkpoints and load_session_state when resuming existing sessions.

Design Benefits and Best Practices

The Session module architecture provides several operational advantages:

  • Storage Interchangeability – Switch between JSON and Redis by changing a single import without modifying agent logic
  • Stateless Service Design – Agents run as ephemeral processes while the session backend guarantees continuity across restarts and scaling events
  • Fine-Grained Serialization – Use register_state() with custom to_json/from_json functions for complex objects like neural network weights or database connections
  • Multi-Tenant Isolation – Both backends automatically embed user_id in storage keys, preventing cross-user data leakage
  • Automatic Cleanup – Redis backend supports TTL expiration to prevent indefinite storage growth in high-throughput environments

Summary

  • The Session module in AgentScope provides a unified API for persisting and restoring conversation state through save_session_state and load_session_state methods.
  • Three core classes implement the architecture: SessionBase defines the interface, JSONSession provides file-based storage, and RedisSession enables distributed caching with TTL support.
  • StateModule objects register serializable attributes and recursively manage nested state, allowing any agent component to participate in persistence without knowing storage details.
  • The module supports multi-tenant deployments through automatic user_id scoping and allows hot-swapping storage backends without code changes.

Frequently Asked Questions

What is the difference between JSONSession and RedisSession in AgentScope?

JSONSession stores conversation state as local JSON files in a configurable directory, making it ideal for development and single-node deployments with no external dependencies. RedisSession stores state in a Redis instance with support for key prefixing, connection pooling, and TTL expiration, enabling horizontal scaling and distributed agent services across multiple machines.

How does StateModule handle nested objects?

StateModule automatically discovers and serializes nested StateModule instances through recursive state_dict() calls. When registering attributes, you can include other StateModule objects as values, and the parent module will traverse the entire tree during save operations. During restoration, load_state_dict() recursively reconstructs the nested hierarchy, ensuring complex agent architectures maintain their internal relationships across sessions.

Can I use the Session module with custom agent implementations?

Yes, any custom agent can participate in session management by inheriting from StateModule or including a StateModule attribute. Register the specific attributes requiring persistence using register_state(), then pass the agent instance to save_session_state() and load_session_state() methods. The Session module is backend-agnostic, so your agent code remains identical whether using JSON files or Redis clusters.

Where are session files stored when using JSONSession?

JSONSession writes files to the directory specified by the save_dir parameter during initialization. The actual filename follows the pattern {user_id}_{session_id}.json to ensure multi-tenant isolation. For example, with save_dir="./session_data", user_id="alice", and session_id="chat-42", the full path becomes ./session_data/alice_chat-42.json.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →