Isolation Context Fields (teamId, agentId, userId, sessionId, taskId) in the TencentDB Agent Memory v3 SDK
The v3 SDK uses an IsolationContext to enforce multi-dimensional tenancy for all L0/L1/Profile data, requiring userId, agentId, and sessionId as mandatory fields while treating teamId and taskId as optional dimensions for additional filtering.
The Isolation Context is the cornerstone of data separation in the TencentDB Agent Memory v3 SDK. Every write operation to conversational memory (L0), extracted records (L1), or user profiles must carry a complete context that binds the data to specific organizational boundaries. This article explains each field's purpose, validation rules, and practical usage patterns based on the actual source implementation.
Core IsolationContext Fields Explained
The IsolationContext interface in [MemoryCore/src/core/store/isolation.ts](https://github.com/TencentCloud/TencentDB-Agent-Memory/blob/feat/server_team/MemoryCore/src/core/store/isolation.ts#L25-L31) defines five primary identifier fields that establish a three-dimensional tenancy model:
| Field | Type | Purpose | Required |
|---|---|---|---|
teamId |
string |
Organizational boundary for multi-team deployments | Optional |
userId |
string |
End-user who generated the interaction data | Yes |
agentId |
string |
Agent or service processing the request | Yes |
sessionId |
string |
Unique conversation token grouping related exchanges | Yes |
taskId |
string |
Cross-session business identifier (e.g., support ticket) | Optional |
The userId, agentId, and sessionId combination creates the fundamental isolation boundary. The sessionId is particularly critical because all L1 extraction operations in the v3 SDK are session-based—omitting this field breaks the memory chaining mechanism.
Optional Dimensions: teamId and taskId
teamId
The teamId field enables multi-tenant deployments where a single memory store serves multiple organizational units. When provided, it adds an additional filter layer to all data operations. The field accepts any string identifier and integrates cleanly with enterprise identity systems.
taskId
Unlike sessionId, which is ephemeral and conversation-scoped, taskId serves as a persistent business identifier that can span multiple sessions. Use this field when you need to correlate memory records across separate conversations—for example, tracking a multi-day support ticket or a long-running workflow. The taskId never substitutes for sessionId; both can coexist in the same context.
Validation with assertIsolation
The SDK validates isolation contexts through the assertIsolation function. This utility enforces field requirements and normalizes missing values when legacy compatibility mode is active:
- Strict mode (
enforce: true, legacy mode off): ThrowsIsolationErrorif any mandatory field is empty - Legacy mode (
legacyCompatMode: true): Substitutes missing mandatory fields with placeholder values (defaultor legacy identifiers)
import { IsolationContext, assertIsolation } from '@tencentdb/memory-core';
// Strict validation for production writes
const strictContext: IsolationContext = assertIsolation({
teamId: 'org-engineering', // optional
userId: 'user-48291',
agentId: 'agent-copilot-v3',
sessionId: 'sess-a7f3e9d2',
taskId: 'ticket-INF-2024-0892', // optional
}, { enforce: true, legacyCompatMode: false });
// Legacy mode for migrating existing data
const legacyContext = assertIsolation({
userId: 'legacy-user-001',
// agentId and sessionId omitted
}, { legacyCompatMode: true });
// Results in agentId='default', sessionId derived from legacy sessionKey
Query Filtering with IsolationFilter
For data retrieval, the SDK provides IsolationFilter—a parallel type where all fields are optional. Omitted fields mean "match any value for this dimension," enabling flexible query scopes:
import { IsolationFilter, buildIsolationWhere } from '@tencentdb/memory-core';
// Filter: all sessions for a specific user-agent pair
const filter: IsolationFilter = {
userId: 'user-48291',
agentId: 'agent-copilot-v3',
// sessionId omitted: search across all sessions
// teamId omitted: search across all teams
};
const { clause, params } = buildIsolationWhere(filter, 'm.');
// clause: "m.user_id = ? AND m.agent_id = ?"
// params: ['user-48291', 'agent-copilot-v3']
The buildIsolationWhere function constructs parameterized SQL WHERE clauses, preventing injection while maintaining query performance. The optional prefix parameter (shown as 'm.' above) handles table aliasing in complex joins.
Runtime Verification with rowMatchesIsolation
After retrieval, the rowMatchesIsolation function performs post-query validation to ensure database records conform to the requested isolation boundaries. This defense-in-depth approach catches any edge cases where query construction might not fully enforce tenant separation.
Field Usage Patterns by Data Layer
| Data Layer | Typical Isolation Pattern |
|---|---|
| L0 (Raw Conversations) | Full context with sessionId as primary key component |
| L1 (Extracted Records) | userId + agentId + sessionId for session-scoped facts; taskId for cross-session aggregation |
| Profile (User Models) | userId + agentId with teamId for organizational segmentation |
Summary
- IsolationContext in the v3 SDK mandates
userId,agentId, andsessionIdfor all write operations to ensure proper data segmentation teamIdenables multi-tenant deployments whiletaskIdsupports cross-session business correlation- Use
assertIsolationfor input validation with configurable strictness and legacy compatibility - Query operations use IsolationFilter with
buildIsolationWhereto construct safe, parameterized SQL - Post-retrieval verification via
rowMatchesIsolationprovides additional security guarantees
Frequently Asked Questions
What happens if I omit a mandatory IsolationContext field?
The SDK throws an IsolationError when enforce: true and legacyCompatMode: false. With legacy mode enabled, missing fields receive placeholder values (default or derived from sessionKey), allowing gradual migration of existing data without breaking changes.
Can I use taskId instead of sessionId for session-scoped queries?
No. The taskId field is designed for cross-session identification—it never replaces sessionId. When you need session-specific memory retrieval, always include sessionId in your context or filter.
How does teamId interact with other isolation fields?
The teamId operates as an optional organizational boundary that works orthogonally to user-agent-session isolation. Records with matching userId, agentId, and sessionId but different teamId values are treated as distinct entities, enabling true multi-tenant separation within a shared database.
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:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →