Skip to content

TypeScript SDK

The TypeScript SDK (agent-memory-client) provides a type-safe client for integrating memory capabilities into Node.js and browser applications.

Version: 0.3.2+ Requirements: Node.js 20.0.0 or higher

Installation

npm install agent-memory-client
# or
yarn add agent-memory-client
# or
pnpm add agent-memory-client

Quick Start

import { MemoryAPIClient, UserId, Topics } from "agent-memory-client";

// Create client
const client = new MemoryAPIClient({
  baseUrl: "http://localhost:8000",
  defaultNamespace: "my-app",
});

// Store a memory
await client.createLongTermMemory([
  {
    text: "User prefers morning meetings",
    memory_type: "semantic",
    topics: ["scheduling", "preferences"],
    user_id: "alice",
  },
]);

// Search memories with filters
const results = await client.searchLongTermMemory({
  text: "when does user prefer meetings",
  userId: new UserId({ eq: "alice" }),
  topics: new Topics({ any: ["scheduling"] }),
  limit: 5,
});

for (const memory of results.memories) {
  console.log(`${memory.text} (distance: ${memory.dist})`);
}

// Clean up
client.close();

Client Configuration

import { MemoryAPIClient, type MemoryClientConfig } from "agent-memory-client";

const config: MemoryClientConfig = {
  baseUrl: "http://localhost:8000",  // Required
  timeout: 30000,                     // Request timeout (ms)
  defaultNamespace: "production",     // Default namespace
  defaultModelName: "gpt-4o",        // For auto-summarization
  defaultContextWindowMax: 128000,    // Context window limit
  apiKey: "your-api-key",            // Optional API key auth
  bearerToken: "your-jwt",           // Optional JWT auth
};

const client = new MemoryAPIClient(config);

Memory Operations

Creating Memories

import type { MemoryRecord } from "agent-memory-client";

const memories: MemoryRecord[] = [
  {
    text: "User works as a software engineer at TechCorp",
    memory_type: "semantic",
    topics: ["career", "work"],
    entities: ["TechCorp"],
    user_id: "alice",
  },
];

await client.createLongTermMemory(memories);

Searching with Filters

The SDK provides type-safe filter classes:

import {
  SessionId,
  Namespace,
  UserId,
  Topics,
  Entities,
  CreatedAt,
  LastAccessed,
  MemoryType,
} from "agent-memory-client";

// Basic search
const results = await client.searchLongTermMemory({
  text: "user preferences",
  limit: 10,
});

// With filters
const filtered = await client.searchLongTermMemory({
  text: "programming languages",
  userId: new UserId({ eq: "alice" }),
  topics: new Topics({ any: ["programming", "languages"] }),
  memoryType: new MemoryType({ eq: "semantic" }),
  createdAt: new CreatedAt({ gte: new Date("2024-01-01") }),
  distanceThreshold: 0.3,
  limit: 5,
});

// Process results
for (const memory of filtered.memories) {
  const relevance = memory.dist ? 1 - memory.dist : null;
  console.log(`[${relevance?.toFixed(2)}] ${memory.text}`);
}

Filter Reference

Filter Options Description
SessionId eq, in_, not_eq, not_in Filter by session ID
Namespace eq, in_, not_eq, not_in Filter by namespace
UserId eq, in_, not_eq, not_in Filter by user ID
Topics any, all, none Filter by topics
Entities any, all, none Filter by entities
CreatedAt gte, lte, eq Filter by creation date
LastAccessed gte, lte, eq Filter by last access
MemoryType eq, in_, not_eq, not_in Filter by type

Editing and Deleting

// Edit a memory
const updated = await client.editLongTermMemory("memory-id", {
  text: "Updated text content",
  topics: ["updated", "topics"],
});

// Get a specific memory
const memory = await client.getLongTermMemory("memory-id");

// Delete memories
await client.deleteLongTermMemories(["memory-id-1", "memory-id-2"]);

Working Memory

import type { WorkingMemory } from "agent-memory-client";

// Get or create working memory
const response = await client.getOrCreateWorkingMemory("session-123", {
  userId: "alice",
  namespace: "my-app",
});

// Update working memory
const workingMemory: Partial<WorkingMemory> = {
  messages: [
    { role: "user", content: "I'm planning a trip to Italy" },
    { role: "assistant", content: "That sounds exciting!" },
  ],
  memories: [
    {
      text: "User is planning a trip to Italy",
      memory_type: "semantic",
      topics: ["travel"],
    },
  ],
  data: { destination: "Italy" },
};

await client.putWorkingMemory("session-123", workingMemory);

// Delete working memory
await client.deleteWorkingMemory("session-123");

Forgetting Memories

import type { ForgetPolicy } from "agent-memory-client";

const policy: ForgetPolicy = {
  max_age_days: 90,
  max_inactive_days: 30,
  budget: 100,
  memory_type_allowlist: ["episodic"],
};

// Preview what would be deleted
const preview = await client.forgetLongTermMemories({
  policy,
  namespace: "my-app",
  dryRun: true,
});
console.log(`Would delete ${preview.deleted} of ${preview.scanned}`);

// Execute forget
const result = await client.forgetLongTermMemories({
  policy,
  namespace: "my-app",
  pinnedIds: ["keep-this-memory"],
});

Summary Views

import type { CreateSummaryViewRequest } from "agent-memory-client";

// Create a summary view
const request: CreateSummaryViewRequest = {
  name: "User Topic Summaries",
  source: "long_term",
  group_by: ["user_id", "topics"],
  time_window_days: 30,
  continuous: true,
};

const view = await client.createSummaryView(request);

// Run a partition
const partition = await client.runSummaryViewPartition(view.id, {
  user_id: "alice",
  topics: "travel",
});
console.log(`Summary: ${partition.summary}`);

// Run full view as background task
const task = await client.runSummaryView(view.id, { force: true });

// Poll for completion
let taskStatus = await client.getTask(task.id);
while (taskStatus && !["completed", "failed"].includes(taskStatus.status)) {
  await new Promise((r) => setTimeout(r, 1000));
  taskStatus = await client.getTask(task.id);
}

// List and delete views
const views = await client.listSummaryViews();
await client.deleteSummaryView(view.id);

Bulk Operations

// Bulk create with rate limiting
const batches = [memories1, memories2, memories3];
const results = await client.bulkCreateLongTermMemories(batches, {
  batchSize: 50,
  delayBetweenBatches: 100,
});

// Auto-paginating search
for await (const memory of client.searchAllLongTermMemories({
  text: "user preferences",
  userId: new UserId({ eq: "alice" }),
  batchSize: 50,
})) {
  console.log(memory.text);
}

Error Handling

import {
  MemoryClientError,
  MemoryNotFoundError,
  MemoryServerError,
  MemoryValidationError,
} from "agent-memory-client";

try {
  const memory = await client.getLongTermMemory("invalid-id");
  if (memory === null) {
    console.log("Memory not found");
  }
} catch (error) {
  if (error instanceof MemoryNotFoundError) {
    console.log("Memory does not exist");
  } else if (error instanceof MemoryServerError) {
    console.log(`Server error: ${error.message}`);
  } else if (error instanceof MemoryValidationError) {
    console.log(`Invalid input: ${error.message}`);
  } else if (error instanceof MemoryClientError) {
    console.log(`Client error: ${error.message}`);
  }
}

Memory Prompt

import type { MemoryPromptRequest } from "agent-memory-client";

const request: MemoryPromptRequest = {
  query: "What are the user's preferences?",
  session: {
    session_id: "session-123",
    user_id: "alice",
    model_name: "gpt-4o",
  },
  long_term_search: {
    text: "user preferences",
    limit: 5,
  },
};

const context = await client.memoryPrompt(request);
// Use context.messages with your LLM

Type Exports

The SDK exports all types for TypeScript usage:

import type {
  // Client config
  MemoryClientConfig,
  SearchOptions,
  // Models
  WorkingMemory,
  WorkingMemoryResponse,
  MemoryMessage,
  MemoryRecord,
  MemoryRecordResults,
  // Forget
  ForgetPolicy,
  ForgetResponse,
  // Summary Views
  SummaryView,
  CreateSummaryViewRequest,
  SummaryViewPartitionResult,
  // Tasks
  Task,
  TaskStatus,
} from "agent-memory-client";