UNPKG

chromadb

Version:

A JavaScript interface for chroma

305 lines (275 loc) 8.2 kB
import { GetUserIdentityResponse, Include } from "./api"; /** * User identity information including tenant and database access. */ export type UserIdentity = GetUserIdentityResponse; /** * Metadata that can be associated with a collection. * Values must be boolean, number, or string types. */ export type CollectionMetadata = Record< string, boolean | number | string | null >; /** * Metadata that can be associated with individual records. * Values must be boolean, number, or string types. */ export type Metadata = Record<string, boolean | number | string | null>; /** * Base interface for record sets containing optional fields. */ export interface BaseRecordSet { /** Array of embedding vectors */ embeddings?: number[][]; /** Array of metadata objects */ metadatas?: Metadata[]; /** Array of document text content */ documents?: string[]; /** Array of URIs/URLs */ uris?: string[]; } export const baseRecordSetFields = [ "ids", "embeddings", "metadatas", "documents", "uris", ]; /** * Complete record set with required IDs for operations like add/update. */ export interface RecordSet extends BaseRecordSet { /** Array of unique record identifiers */ ids: string[]; } export interface PreparedRecordSet extends Omit<RecordSet, "embeddings"> { embeddings?: number[][] | string[]; } export interface PreparedInsertRecordSet extends PreparedRecordSet { embeddings: number[][] | string[]; } export const recordSetFields = [...baseRecordSetFields, "ids"]; /** * Record set for query operations with required embeddings. */ export interface QueryRecordSet extends BaseRecordSet { /** Optional array of record IDs to filter by */ ids?: string[]; /** Array of query embedding vectors (required for queries) */ embeddings: number[][]; } type LiteralValue = string | number | boolean; type LogicalOperator = "$and" | "$or"; type WhereOperator = "$gt" | "$gte" | "$lt" | "$lte" | "$ne" | "$eq"; type InclusionExclusionOperator = "$in" | "$nin"; type OperatorExpression = | { $gt: LiteralValue } | { $gte: LiteralValue } | { $lt: LiteralValue } | { $lte: LiteralValue } | { $ne: LiteralValue } | { $eq: LiteralValue } | { $and: LiteralValue } | { $or: LiteralValue } | { $in: LiteralValue[] } | { $nin: LiteralValue[] }; /** * Where clause for filtering records based on metadata. * Supports field equality, comparison operators, and logical operators. */ export type Where = | { [key: string]: LiteralValue | OperatorExpression } | { $and: Where[] } | { $or: Where[] }; type WhereDocumentOperator = | "$contains" | "$not_contains" | "$matches" | "$not_matches" | "$regex" | "$not_regex" | LogicalOperator; /** * Where clause for filtering based on document content. * Supports text search operators and logical combinations. */ export type WhereDocument = | { $contains: string } | { $not_contains: string } | { $matches: string } | { $not_matches: string } | { $regex: string } | { $not_regex: string } | { $and: WhereDocument[] } | { $or: WhereDocument[] }; /** * Enum specifying which fields to include in query results. */ export enum IncludeEnum { /** Include similarity distances in results */ distances = "distances", /** Include document text content in results */ documents = "documents", /** Include embedding vectors in results */ embeddings = "embeddings", /** Include metadata objects in results */ metadatas = "metadatas", /** Include URIs in results */ uris = "uris", } /** * Result class for get operations, containing retrieved records. * @template TMeta - The type of metadata associated with records */ export class GetResult<TMeta extends Metadata = Metadata> { public readonly documents: (string | null)[]; public readonly embeddings: number[][]; public readonly ids: string[]; public readonly include: Include[]; public readonly metadatas: (TMeta | null)[]; public readonly uris: (string | null)[]; /** * Creates a new GetResult instance. * @param data - The result data containing all fields */ constructor({ documents, embeddings, ids, include, metadatas, uris, }: { documents: (string | null)[]; embeddings: number[][]; ids: string[]; include: Include[]; metadatas: (TMeta | null)[]; uris: (string | null)[]; }) { this.documents = documents; this.embeddings = embeddings; this.ids = ids; this.include = include; this.metadatas = metadatas; this.uris = uris; } /** * Converts the result to a row-based format for easier iteration. * @returns Object containing include fields and array of record objects */ public rows() { return this.ids.map((id, index) => { return { id, document: this.include.includes("documents") ? this.documents[index] : undefined, embedding: this.include.includes("embeddings") ? this.embeddings[index] : undefined, metadata: this.include.includes("metadatas") ? this.metadatas[index] : undefined, uri: this.include.includes("uris") ? this.uris[index] : undefined, }; }); } } /** * Interface for query results in row format. * @template TMeta - The type of metadata associated with records */ export interface QueryRowResult<TMeta extends Metadata = Metadata> { /** Similarity distance to the query (if included) */ distance?: number | null; /** Document text content (if included) */ document?: string | null; /** Embedding vector (if included) */ embedding?: number[] | null; /** Unique record identifier */ id: string; /** Record metadata (if included) */ metadata?: TMeta | null; /** Record URI (if included) */ uri?: string | null; } /** * Result class for query operations, containing search results. * @template TMeta - The type of metadata associated with records */ export class QueryResult<TMeta extends Metadata = Metadata> { public readonly distances: (number | null)[][]; public readonly documents: (string | null)[][]; public readonly embeddings: (number[] | null)[][]; public readonly ids: string[][]; public readonly include: Include[]; public readonly metadatas: (TMeta | null)[][]; public readonly uris: (string | null)[][]; /** * Creates a new QueryResult instance. * @param data - The query result data containing all fields */ constructor({ distances, documents, embeddings, ids, include, metadatas, uris, }: { distances: (number | null)[][]; documents: (string | null)[][]; embeddings: (number[] | null)[][]; ids: string[][]; include: Include[]; metadatas: (TMeta | null)[][]; uris: (string | null)[][]; }) { this.distances = distances; this.documents = documents; this.embeddings = embeddings; this.ids = ids; this.include = include; this.metadatas = metadatas; this.uris = uris; } /** * Converts the query result to a row-based format for easier iteration. * @returns Object containing include fields and structured query results */ public rows(): QueryRowResult<TMeta>[][] { const queries: { distance?: number | null; document?: string | null; embedding?: number[] | null; id: string; metadata?: TMeta | null; uri?: string | null; }[][] = []; for (let q = 0; q < this.ids.length; q++) { const records = this.ids[q].map((id, index) => { return { id, document: this.include.includes("documents") ? this.documents[q][index] : undefined, embedding: this.include.includes("embeddings") ? this.embeddings[q][index] : undefined, metadata: this.include.includes("metadatas") ? this.metadatas[q][index] : undefined, uri: this.include.includes("uris") ? this.uris[q][index] : undefined, distance: this.include.includes("distances") ? this.distances[q][index] : undefined, }; }); queries.push(records); } return queries; } }