Skip to main content

KV Store API

The KV Store API provides a persistent key-value storage solution for agent state management. It allows you to store, retrieve, and query structured data with support for namespaces and advanced querying capabilities.

Overview

The KV Store module enables you to:

  • Store Data: Persist arbitrary JSON-serializable values
  • Organize: Use namespaces to group related data
  • Query: Search and filter records using a powerful DSL
  • Manage: Create, update, and delete storage instances

Key Concepts

Instances

A KV store instance is an isolated storage container with its own set of namespaces and records. Each instance has a unique ID and can be configured independently.

Namespaces

Namespaces provide a way to group related key-value pairs within an instance. For example, you might use different namespaces for different users, sessions, or data types.

Records

Each record in the KV store consists of:

  • instanceId: The ID of the storage instance
  • namespace: The namespace grouping
  • key: The unique key within the namespace
  • value: Any JSON-serializable value
  • timestamps: Creation and update timestamps

Quick Start Example

import codebolt from '@codebolt/codeboltjs';

// Wait for connection
await codebolt.waitForReady();

// Create a new KV store instance
const instance = await codebolt.kvStore.createInstance(
'user-sessions',
'Stores active user session data'
);
console.log('Created instance:', instance.data.instance.id);

// Store a value
await codebolt.kvStore.set(
instance.data.instance.id,
'sessions',
'user-123',
{ loggedIn: true, lastActive: Date.now() }
);

// Retrieve the value
const result = await codebolt.kvStore.get(
instance.data.instance.id,
'sessions',
'user-123'
);
console.log('User session:', result.data.value);

// Query for all records in a namespace
const queryResult = await codebolt.kvStore.query({
from: { instance: instance.data.instance.id, namespace: 'sessions' }
});
console.log('All sessions:', queryResult.data.result.records);

Response Structure

All KV Store API functions return responses with a consistent structure:

{
type: 'kvStore.operationName',
success: true,
data: {
// Operation-specific data
},
message: 'Optional message',
error: 'Error details if failed',
timestamp: '2024-01-19T10:00:00Z',
requestId: 'unique-request-id'
}

Common Use Cases

Agent State Persistence

Store agent state between executions:

// Save agent state
await codebolt.kvStore.set(
instanceId,
'agent-state',
'agent-1',
{ step: 5, context: { userId: '123' } }
);

// Load agent state
const state = await codebolt.kvStore.get(instanceId, 'agent-state', 'agent-1');

Configuration Storage

Store configuration settings:

await codebolt.kvStore.set(
instanceId,
'config',
'app-settings',
{ theme: 'dark', language: 'en' }
);

Caching

Cache expensive computation results:

const cacheKey = `calc-${inputs.hash}`;
const cached = await codebolt.kvStore.get(instanceId, 'cache', cacheKey);

if (cached.data.exists) {
return cached.data.value;
}

const result = await expensiveCalculation();
await codebolt.kvStore.set(instanceId, 'cache', cacheKey, result);

Session Management

Manage user sessions:

// Create session
await codebolt.kvStore.set(
instanceId,
'sessions',
sessionId,
{ userId, createdAt: Date.now() }
);

// Get active sessions
const active = await codebolt.kvStore.query({
from: { instance: instanceId, namespace: 'sessions' },
where: [{ field: 'value.createdAt', operator: 'gte', value: Date.now() - 3600000 }]
});

Query DSL Reference

The query DSL provides powerful filtering and sorting capabilities:

const query = {
from: {
instance: 'instance-id', // Required: instance ID
namespace: 'optional-namespace' // Optional: filter by namespace
},
where: [ // Optional: filter conditions
{
field: 'value.someField', // Field to filter on
operator: 'eq', // Comparison operator
value: 'expected-value' // Value to compare against
}
],
select: ['key', 'value'], // Optional: fields to return
orderBy: { // Optional: sort order
field: 'createdAt',
direction: 'desc'
},
limit: 10, // Optional: max records to return
offset: 0 // Optional: records to skip
};

Supported Operators

OperatorDescriptionExample
eqEqual to{ field: 'value.status', operator: 'eq', value: 'active' }
neqNot equal to{ field: 'value.status', operator: 'neq', value: 'deleted' }
gtGreater than{ field: 'value.count', operator: 'gt', value: 10 }
gteGreater than or equal{ field: 'value.score', operator: 'gte', value: 100 }
ltLess than{ field: 'value.age', operator: 'lt', value: 18 }
lteLess than or equal{ field: 'value.price', operator: 'lte', value: 99.99 }
containsContains substring{ field: 'value.name', operator: 'contains', value: 'test' }
startsWithStarts with{ field: 'value.email', operator: 'startsWith', value: 'admin' }
endsWithEnds with{ field: 'value.domain', operator: 'endsWith', value: '.com' }

Notes and Best Practices

Instance Management

  • Use descriptive instance names to organize data by purpose
  • Create separate instances for different environments (dev, staging, prod)
  • Delete instances that are no longer needed to free up storage

Namespace Organization

  • Use meaningful namespace names that reflect your data structure
  • Consider using user IDs, session IDs, or feature names as namespaces
  • Keep related data in the same namespace for easier querying

Key Design

  • Use unique, descriptive keys within namespaces
  • Consider using composite keys for complex data (e.g., user:123:profile)
  • Avoid using special characters that might need escaping

Performance Considerations

  • Use queries instead of multiple get operations when fetching multiple records
  • Use select to limit returned fields for large values
  • Set appropriate limit values on queries to avoid fetching too much data

Error Handling

  • Always check the success field of responses
  • Handle cases where keys don't exist (exists: false in get responses)
  • Use try-catch blocks when performing critical operations
  • createInstance - Creates a new KV store instance for storing key-value data.
  • getInstance - Gets details of a specific KV store instance.
  • listInstances - Lists all available KV store instances.
  • updateInstance - Updates the name or description of a KV store instance.
  • deleteInstance - Deletes a KV store instance and all its data.
  • get - Retrieves a value from the KV store by key.
  • set - Stores a value in the KV store with a specified key.
  • delete - Deletes a specific key-value pair from the KV store.
  • deleteNamespace - Deletes all key-value pairs in a namespace.
  • query - Queries the KV store using a flexible DSL.
  • getNamespaces - Lists all namespaces in a KV store instance.
  • getRecordCount - Gets the total number of records in an instance or namespace.