Acontext
FeaturesContext Engineering

Copy Session

Duplicate sessions to experiment safely or create conversation branches

Create independent copies of sessions with all messages, tasks, and configurations intact. Perfect for experimentation, checkpointing, and branching workflows.

Use Cases

  • Experimentation: Try different approaches without affecting the original conversation
  • Checkpointing: Save progress at key decision points
  • Branching workflows: Explore parallel conversation paths from a common starting point
  • Template sessions: Reuse successful session patterns

Basic Usage

from acontext import AcontextClient
import os

client = AcontextClient(api_key=os.getenv("ACONTEXT_API_KEY"))

# Copy a session
result = client.sessions.copy(session_id="session-uuid")

print(f"Original session: {result.old_session_id}")
print(f"Copied session: {result.new_session_id}")

# Now you can modify the copied session independently
client.sessions.store_message(
    session_id=result.new_session_id,
    blob={"role": "user", "content": "Let's try a different approach"},
    format="openai"
)
import { AcontextClient } from '@acontext/acontext';

const client = new AcontextClient({
    apiKey: process.env.ACONTEXT_API_KEY,
});

// Copy a session
const result = await client.sessions.copy("session-uuid");

console.log(`Original session: ${result.oldSessionId}`);
console.log(`Copied session: ${result.newSessionId}`);

// Now you can modify the copied session independently
await client.sessions.storeMessage(
    result.newSessionId,
    { role: "user", content: "Let's try a different approach" },
    { format: "openai" }
);

Async Usage

from acontext import AsyncAcontextClient
import os
import asyncio

async def copy_example():
    async with AsyncAcontextClient(api_key=os.getenv("ACONTEXT_API_KEY")) as client:
        result = await client.sessions.copy(session_id="session-uuid")
        print(f"Copied session: {result.new_session_id}")

asyncio.run(copy_example())
import { AcontextClient } from '@acontext/acontext';

const client = new AcontextClient({
    apiKey: process.env.ACONTEXT_API_KEY,
});

const result = await client.sessions.copy("session-uuid");
console.log(`Copied session: ${result.newSessionId}`);

What Gets Copied

When you copy a session, the following are duplicated:

  • Messages: All messages with preserved parent-child relationships
  • Tasks: All tasks with their order, status, and data
  • Configurations: Session configs and settings
  • User association: The copied session belongs to the same project

What Doesn't Get Copied

  • Asset files: S3 assets are shared (not duplicated) between sessions for efficiency
  • Message processing status: Copied messages are marked as "pending" for reprocessing
  • Task-message links: These are cleared and will be reassigned by the core service

Independence

The copied session is completely independent:

  • Changes to the original session don't affect the copy
  • Changes to the copy don't affect the original
  • Each session can have different messages, tasks, and configs going forward

Limitations

Size Limit

Sessions with more than 5,000 messages cannot be copied synchronously. You'll receive an error:

{
  "error": "SESSION_TOO_LARGE",
  "message": "Session exceeds maximum copyable size (5000 messages). Consider using async copy."
}

For large sessions, async copy support is planned for a future release.

Error Handling

from acontext import AcontextClient
from acontext.exceptions import AcontextError

client = AcontextClient(api_key="...")

try:
    result = client.sessions.copy(session_id="invalid-uuid")
except AcontextError as e:
    if "SESSION_NOT_FOUND" in str(e):
        print("Session does not exist or you don't have access")
    elif "SESSION_TOO_LARGE" in str(e):
        print("Session is too large to copy synchronously")
    else:
        print(f"Copy failed: {e}")
import { AcontextClient } from '@acontext/acontext';

const client = new AcontextClient({ apiKey: "..." });

try {
    const result = await client.sessions.copy("invalid-uuid");
} catch (error) {
    const message = error.message || String(error);
    
    if (message.includes("SESSION_NOT_FOUND")) {
        console.log("Session does not exist or you don't have access");
    } else if (message.includes("SESSION_TOO_LARGE")) {
        console.log("Session is too large to copy synchronously");
    } else {
        console.log(`Copy failed: ${error}`);
    }
}

Common Patterns

Experiment and Compare

Copy a session to try different approaches, then compare results:

result = client.sessions.copy(session_id=original_id)
experimental_id = result.new_session_id

client.sessions.store_message(
    session_id=experimental_id,
    blob={"role": "user", "content": "Alternative approach..."},
    format="openai"
)

original = client.sessions.get_token_counts(session_id=original_id)
experimental = client.sessions.get_token_counts(session_id=experimental_id)

print(f"Original: {original.total_tokens} tokens")
print(f"Experimental: {experimental.total_tokens} tokens")
const result = await client.sessions.copy(originalId);
const experimentalId = result.newSessionId;

await client.sessions.storeMessage(
    experimentalId,
    { role: "user", content: "Alternative approach..." },
    { format: "openai" }
);

const original = await client.sessions.getTokenCounts(originalId);
const experimental = await client.sessions.getTokenCounts(experimentalId);

console.log(`Original: ${original.totalTokens} tokens`);
console.log(`Experimental: ${experimental.totalTokens} tokens`);

Checkpoint Before Major Changes

Create a checkpoint before making significant changes:

checkpoint = client.sessions.copy(session_id=session_id)
print(f"Checkpoint created: {checkpoint.new_session_id}")

client.sessions.store_message(
    session_id=session_id,
    blob={"role": "user", "content": "Major change..."},
    format="openai"
)
const checkpoint = await client.sessions.copy(sessionId);
console.log(`Checkpoint created: ${checkpoint.newSessionId}`);

await client.sessions.storeMessage(
    sessionId,
    { role: "user", content: "Major change..." },
    { format: "openai" }
);

Template Sessions

Create a base session as a template and copy it for each new conversation:

template_id = "template-session-uuid"
client.sessions.store_message(
    session_id=template_id,
    blob={"role": "system", "content": "You are a helpful assistant..."},
    format="openai"
)

new_conversation = client.sessions.copy(session_id=template_id)
const templateId = "template-session-uuid";
await client.sessions.storeMessage(
    templateId,
    { role: "system", content: "You are a helpful assistant..." },
    { format: "openai" }
);

const newConversation = await client.sessions.copy(templateId);

Performance

Copy operations typically complete in:

  • < 1 second: Sessions with < 100 messages
  • < 3 seconds: Sessions with < 1000 messages
  • < 5 seconds: Sessions with < 5000 messages

The operation is atomic - either the entire copy succeeds or fails with no partial state.

Last updated on

On this page