npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@memberjunction/ai-vectordb

v2.125.0

Published

MemberJunction: AI Vector Database Module

Downloads

4,265

Readme

@memberjunction/ai-vectordb

The MemberJunction AI Vector Database package provides a standardized interface and base classes for working with vector databases in the MemberJunction ecosystem. This package serves as a common abstraction layer that allows different vector database implementations to be used interchangeably.

Features

  • Abstract Base Class: Common API for all vector database implementations
  • Index Management: Create, list, edit, and delete vector indexes
  • Record Operations: Comprehensive CRUD operations for vector records
  • Query Capabilities: Flexible vector similarity search with filtering
  • Type Definitions: Comprehensive TypeScript type definitions
  • Provider Agnostic: Works with any vector database that implements the interface
  • Standardized Response Format: Consistent response format across providers
  • Secure API Key Management: Protected API key handling with validation

Installation

npm install @memberjunction/ai-vectordb

Core Components

VectorDBBase

The abstract base class that all vector database providers must implement:

export abstract class VectorDBBase {
  // Protected getter for API key access by subclasses
  protected get apiKey(): string;
  
  constructor(apiKey: string);
  
  // Index operations
  abstract listIndexes(): IndexList | Promise<IndexList>;
  abstract getIndex(params: BaseRequestParams): BaseResponse | Promise<BaseResponse>;
  abstract createIndex(params: CreateIndexParams): BaseResponse | Promise<BaseResponse>;
  abstract deleteIndex(params: BaseRequestParams): BaseResponse | Promise<BaseResponse>;
  abstract editIndex(params: EditIndexParams): BaseResponse | Promise<BaseResponse>;
  abstract queryIndex(params: QueryOptions): BaseResponse | Promise<BaseResponse>;
  
  // Record operations
  abstract createRecord(record: VectorRecord): BaseResponse | Promise<BaseResponse>;
  abstract createRecords(record: VectorRecord[]): BaseResponse | Promise<BaseResponse>;
  abstract getRecord(param: BaseRequestParams): BaseResponse | Promise<BaseResponse>;
  abstract getRecords(params: BaseRequestParams): BaseResponse | Promise<BaseResponse>;
  abstract updateRecord(record: UpdateOptions): BaseResponse | Promise<BaseResponse>;
  abstract updateRecords(records: UpdateOptions): BaseResponse | Promise<BaseResponse>;
  abstract deleteRecord(record: VectorRecord): BaseResponse | Promise<BaseResponse>;
  abstract deleteRecords(records: VectorRecord[]): BaseResponse | Promise<BaseResponse>;
}

Key Types and Interfaces

Vector Records

export type VectorRecord<T extends RecordMetadata = RecordMetadata> = {
  id: string;                 // Unique identifier for the record
  values: RecordValues;       // Vector embedding values (array of numbers)
  sparseValues?: RecordSparseValues; // Optional sparse representation for hybrid search
  metadata?: T;               // Optional metadata for filtering and identification
};

export type RecordValues = Array<number>;

export type RecordSparseValues = {
  indices: Array<number>;     // List of indices where non-zero values are present
  values: Array<number>;      // The values that correspond to the positions in indices
};

export type RecordMetadataValue = string | boolean | number | Array<string>;
export type RecordMetadata = Record<string, RecordMetadataValue>;

Index Description

export type IndexDescription = {
  name: string;               // Name of the index
  dimension: number;          // Vector dimension size
  metric: IndexModelMetricEnum; // Distance metric: 'cosine', 'euclidean', or 'dotproduct'
  host: string;               // Host where the index is located
};

Query Options

For similarity search in vector databases:

// Base query parameters
export type QueryParamsBase = {
  topK: number;              // Number of results to return
  includeValues?: boolean;   // Whether to include vector values in results
  includeMetadata?: boolean; // Whether to include metadata in results
  filter?: object;           // Metadata filter to apply
};

// Query by vector values
export type QueryByVectorValues = QueryParamsBase & {
  vector: RecordValues;      // The query vector to find similar vectors for
};

// Query by record ID
export type QueryByRecordId = QueryParamsBase & {
  id: string;                // Use an existing record's vector to query
};

// Combined query options type
export type QueryOptions = QueryByRecordId | QueryByVectorValues;

Query Response

export type QueryResponse<T extends RecordMetadata = RecordMetadata> = {
  matches: Array<ScoredRecord<T>>; // Results sorted by similarity
  namespace: string;               // Namespace where query was executed
  usage?: OperationUsage;          // Usage information
};

export interface ScoredRecord<T extends RecordMetadata = RecordMetadata> extends VectorRecord<T> {
  score?: number;                  // Similarity score (interpretation depends on metric)
}

export type OperationUsage = {
  readUnits?: number;              // Number of read units consumed by operation
};

Usage Examples

While this package primarily provides interfaces and base classes, here's how it would be used with a concrete implementation:

Implementing a Vector Database Provider

Create a provider by implementing the VectorDBBase abstract class:

import { VectorDBBase, VectorRecord, BaseResponse, CreateIndexParams } from '@memberjunction/ai-vectordb';

class MyVectorDBProvider extends VectorDBBase {
  constructor(apiKey: string) {
    super(apiKey);
  }
  
  async listIndexes() {
    // Implementation for listing indexes
    return {
      indexes: [
        // Index descriptions
      ]
    };
  }
  
  async createIndex(params: CreateIndexParams): Promise<BaseResponse> {
    // Implementation for creating an index
    try {
      // Provider-specific code
      return {
        success: true,
        message: 'Index created successfully',
        data: { /* index info */ }
      };
    } catch (error) {
      return {
        success: false,
        message: error.message,
        data: null
      };
    }
  }
  
  // Implement remaining methods...
}

Using a Vector Database Provider

Once a provider is implemented, you can use it with a consistent API:

import { VectorDBBase, VectorRecord } from '@memberjunction/ai-vectordb';
import { MyVectorDBProvider } from './my-vector-db-provider';

async function workWithVectors() {
  // Initialize the provider
  const vectorDB: VectorDBBase = new MyVectorDBProvider('your-api-key');
  
  // Create an index
  const createResult = await vectorDB.createIndex({
    id: 'my-index',
    dimension: 1536,
    metric: 'cosine' as IndexModelMetricEnum
  });
  
  if (createResult.success) {
    console.log('Index created:', createResult.data);
  }
  
  // Insert a vector
  const insertResult = await vectorDB.createRecord({
    id: 'record-1',
    values: [0.1, 0.2, 0.3, /* ... */],
    metadata: {
      category: 'document',
      title: 'Sample Document'
    }
  });
  
  // Query for similar vectors
  const queryResult = await vectorDB.queryIndex({
    vector: [0.1, 0.2, 0.3, /* ... */],
    topK: 5,
    includeMetadata: true,
    filter: {
      category: 'document'
    }
  });
  
  if (queryResult.success) {
    console.log('Similar vectors:', queryResult.data.matches);
  }
}

Provider Implementations

MemberJunction provides implementations for popular vector databases:

  • @memberjunction/ai-vectors-pinecone - Implementation for Pinecone vector database

You can also create your own implementation for any vector database service by extending the VectorDBBase class.

Integration with MemberJunction Ecosystem

This package integrates with the broader MemberJunction AI vector ecosystem:

  • @memberjunction/ai-vectors - Core vector functionality
  • @memberjunction/ai-vectors-sync - Synchronize entity data to vector databases
  • @memberjunction/ai-vectors-dupe - Duplicate detection using vector similarity

Error Handling

The VectorDBBase constructor validates the API key and throws an error if it's empty or invalid:

try {
  const vectorDB = new MyVectorDBProvider('');
} catch (error) {
  // Error: API key cannot be empty
}

All methods return a standardized BaseResponse format:

export type BaseResponse = {
  success: boolean;  // Whether the operation succeeded
  message: string;   // Human-readable message about the operation
  data: any;         // Operation-specific response data
};

Additional Types

Request Parameters

export type BaseRequestParams = {
  id: string;
  data?: any;
};

export type CreateIndexParams = BaseRequestParams & {
  dimension: number;
  metric: IndexModelMetricEnum;
  additionalParams?: any;
};

export type EditIndexParams = BaseRequestParams & {
  // Additional fields specific to the provider
};

Dependencies

  • @memberjunction/core: ^2.43.0 - MemberJunction core library
  • @memberjunction/global: ^2.43.0 - MemberJunction global utilities
  • dotenv: ^16.4.1 - Environment variable management

Development Dependencies

  • @types/node: 20.14.2
  • ts-node-dev: ^2.0.0
  • typescript: ^5.4.5

Scripts

  • npm run build - Compile TypeScript to JavaScript
  • npm run start - Run the development server with ts-node-dev
  • npm test - Run tests (currently not implemented)

License

ISC