JavaScript SDK

Official JavaScript/TypeScript client for Memoid

Installation

npm install memoid
# or
pnpm add memoid
# or
yarn add memoid

Quick Start

import { MemoryClient } from 'memoid';

const client = new MemoryClient('your-api-key');

// Add memory
await client.add({
  messages: [
    { role: 'user', content: 'I love hiking' }
  ],
  userId: 'user_123'
});

// Search
const results = await client.search({
  query: 'hobbies',
  userId: 'user_123'
});

Client Configuration

import { MemoryClient } from 'memoid';

const client = new MemoryClient('your-api-key', {
  baseUrl: 'https://api.memoid.dev', // Custom endpoint
  timeout: 30000, // Request timeout in ms
});

Memory Operations

Add Memories

const result = await client.add({
  messages: [
    { role: 'user', content: 'My name is Alex' },
    { role: 'assistant', content: 'Nice to meet you!' }
  ],
  userId: 'user_123',
  agentId: 'assistant_1', // Optional
  metadata: { source: 'chat' }, // Optional
  infer: true, // Extract facts (default)
  extractGraph: false // Extract entities (default)
});

result.memories.forEach(m => {
  console.log(`Added: ${m.memory}`);
});

List Memories

const memories = await client.list({
  userId: 'user_123',
  limit: 50
});

memories.forEach(m => {
  console.log(`${m.id}: ${m.memory}`);
});

Get Memory

const memory = await client.get('mem_abc123');
console.log(memory.memory);

Update Memory

await client.update('mem_abc123', {
  memory: 'Updated text',
  metadata: { updated: true }
});

Delete Memory

await client.delete('mem_abc123');

Delete All

await client.deleteAll({ userId: 'user_123' });

Search

const results = await client.search({
  query: 'What does the user like?',
  userId: 'user_123',
  limit: 10,
  threshold: 0.7
});

results.forEach(r => {
  console.log(`${r.memory} (score: ${r.score.toFixed(2)})`);
});

Knowledge Graph

Extract Knowledge

const result = await client.extractKnowledge({
  text: 'John works at Acme Corp',
  store: true
});

result.entities.forEach(e => {
  console.log(`Entity: ${e.name} (${e.type})`);
});

Add Entity

await client.addEntity({
  name: 'Acme Corp',
  type: 'organization',
  attributes: { industry: 'tech' }
});

Add Relationship

await client.addRelationship({
  source: 'John',
  relation: 'works_at',
  target: 'Acme Corp'
});

Query Graph

const result = await client.graphQuery({
  entity: 'John',
  depth: 2
});

result.entities.forEach(e => console.log(e.name));

TypeScript Types

import type {
  Memory,
  SearchResult,
  Entity,
  Relationship,
  AddOptions,
  SearchOptions
} from 'memoid';

const memory: Memory = {
  id: 'mem_123',
  memory: 'User likes hiking',
  userId: 'user_123',
  createdAt: new Date()
};

Error Handling

import { MemoryClient, MemoidError, RateLimitError } from 'memoid';

const client = new MemoryClient('your-api-key');

try {
  await client.add({ messages: [...], userId: 'user_123' });
} catch (error) {
  if (error instanceof RateLimitError) {
    console.log(`Rate limited. Retry after ${error.retryAfter}s`);
  } else if (error instanceof MemoidError) {
    console.log(`Error: ${error.message}`);
  }
}

Complete Example

import OpenAI from 'openai';
import { MemoryClient } from 'memoid';

const memory = new MemoryClient('memoid-key');
const openai = new OpenAI({ apiKey: 'openai-key' });

async function chat(userId: string, message: string): Promise<string> {
  // Get context
  const memories = await memory.search({
    query: message,
    userId,
    limit: 5
  });

  const context = memories.map(m => `- ${m.memory}`).join('\n');

  // Generate response
  const response = await openai.chat.completions.create({
    model: 'gpt-4',
    messages: [
      { role: 'system', content: `Context:\n${context}` },
      { role: 'user', content: message }
    ]
  });

  const reply = response.choices[0].message.content!;

  // Store conversation
  await memory.add({
    messages: [
      { role: 'user', content: message },
      { role: 'assistant', content: reply }
    ],
    userId
  });

  return reply;
}