Spaces:
Running
Running
import { IEmbeddingFunction } from './embeddings/IEmbeddingFunction'; | |
import { Configuration, ApiApi as DefaultApi } from "./generated"; | |
import { handleSuccess, handleError } from "./utils"; | |
import { Collection } from './Collection'; | |
import { ChromaClientParams, CollectionMetadata, CollectionType, ConfigOptions, CreateCollectionParams, DeleteCollectionParams, GetCollectionParams, GetOrCreateCollectionParams, ListCollectionsParams } from './types'; | |
import { | |
AuthOptions, | |
ClientAuthProtocolAdapter, | |
IsomorphicFetchClientAuthProtocolAdapter | |
} from "./auth"; | |
import { DefaultEmbeddingFunction } from './embeddings/DefaultEmbeddingFunction'; | |
import { AdminClient } from './AdminClient'; | |
const DEFAULT_TENANT = "default_tenant" | |
const DEFAULT_DATABASE = "default_database" | |
export class ChromaClient { | |
/** | |
* @ignore | |
*/ | |
private api: DefaultApi & ConfigOptions; | |
private apiAdapter: ClientAuthProtocolAdapter<any>|undefined; | |
private tenant: string = DEFAULT_TENANT; | |
private database: string = DEFAULT_DATABASE; | |
private _adminClient?: AdminClient | |
/** | |
* Creates a new ChromaClient instance. | |
* @param {Object} params - The parameters for creating a new client | |
* @param {string} [params.path] - The base path for the Chroma API. | |
* @returns {ChromaClient} A new ChromaClient instance. | |
* | |
* @example | |
* ```typescript | |
* const client = new ChromaClient({ | |
* path: "http://localhost:8000" | |
* }); | |
* ``` | |
*/ | |
constructor({ | |
path, | |
fetchOptions, | |
auth, | |
tenant = DEFAULT_TENANT, | |
database = DEFAULT_DATABASE, | |
}: ChromaClientParams = {}) { | |
if (path === undefined) path = "http://localhost:8000"; | |
this.tenant = tenant; | |
this.database = database; | |
const apiConfig: Configuration = new Configuration({ | |
basePath: path, | |
}); | |
if (auth !== undefined) { | |
this.apiAdapter = new IsomorphicFetchClientAuthProtocolAdapter(new DefaultApi(apiConfig), auth); | |
this.api = this.apiAdapter.getApi(); | |
} else { | |
this.api = new DefaultApi(apiConfig); | |
} | |
this._adminClient = new AdminClient({ | |
path: path, | |
fetchOptions: fetchOptions, | |
auth: auth, | |
tenant: tenant, | |
database: database | |
}); | |
// TODO: Validate tenant and database on client creation | |
// this got tricky because: | |
// - the constructor is sync but the generated api is async | |
// - we need to inject auth information so a simple rewrite/fetch does not work | |
this.api.options = fetchOptions ?? {}; | |
} | |
/** | |
* Resets the state of the object by making an API call to the reset endpoint. | |
* | |
* @returns {Promise<boolean>} A promise that resolves when the reset operation is complete. | |
* @throws {Error} If there is an issue resetting the state. | |
* | |
* @example | |
* ```typescript | |
* await client.reset(); | |
* ``` | |
*/ | |
public async reset(): Promise<boolean> { | |
return await this.api.reset(this.api.options); | |
} | |
/** | |
* Returns the version of the Chroma API. | |
* @returns {Promise<string>} A promise that resolves to the version of the Chroma API. | |
* | |
* @example | |
* ```typescript | |
* const version = await client.version(); | |
* ``` | |
*/ | |
public async version(): Promise<string> { | |
const response = await this.api.version(this.api.options); | |
return await handleSuccess(response); | |
} | |
/** | |
* Returns a heartbeat from the Chroma API. | |
* @returns {Promise<number>} A promise that resolves to the heartbeat from the Chroma API. | |
* | |
* @example | |
* ```typescript | |
* const heartbeat = await client.heartbeat(); | |
* ``` | |
*/ | |
public async heartbeat(): Promise<number> { | |
const response = await this.api.heartbeat(this.api.options); | |
let ret = await handleSuccess(response); | |
return ret["nanosecond heartbeat"] | |
} | |
/** | |
* Creates a new collection with the specified properties. | |
* | |
* @param {Object} params - The parameters for creating a new collection. | |
* @param {string} params.name - The name of the collection. | |
* @param {CollectionMetadata} [params.metadata] - Optional metadata associated with the collection. | |
* @param {IEmbeddingFunction} [params.embeddingFunction] - Optional custom embedding function for the collection. | |
* | |
* @returns {Promise<Collection>} A promise that resolves to the created collection. | |
* @throws {Error} If there is an issue creating the collection. | |
* | |
* @example | |
* ```typescript | |
* const collection = await client.createCollection({ | |
* name: "my_collection", | |
* metadata: { | |
* "description": "My first collection" | |
* } | |
* }); | |
* ``` | |
*/ | |
public async createCollection({ | |
name, | |
metadata, | |
embeddingFunction | |
}: CreateCollectionParams): Promise<Collection> { | |
if (embeddingFunction === undefined) { | |
embeddingFunction = new DefaultEmbeddingFunction(); | |
} | |
const newCollection = await this.api | |
.createCollection(this.tenant, this.database, { | |
name, | |
metadata, | |
}, this.api.options) | |
.then(handleSuccess) | |
.catch(handleError); | |
if (newCollection.error) { | |
throw new Error(newCollection.error); | |
} | |
return new Collection(name, newCollection.id, this.api, metadata, embeddingFunction); | |
} | |
/** | |
* Gets or creates a collection with the specified properties. | |
* | |
* @param {Object} params - The parameters for creating a new collection. | |
* @param {string} params.name - The name of the collection. | |
* @param {CollectionMetadata} [params.metadata] - Optional metadata associated with the collection. | |
* @param {IEmbeddingFunction} [params.embeddingFunction] - Optional custom embedding function for the collection. | |
* | |
* @returns {Promise<Collection>} A promise that resolves to the got or created collection. | |
* @throws {Error} If there is an issue getting or creating the collection. | |
* | |
* @example | |
* ```typescript | |
* const collection = await client.getOrCreateCollection({ | |
* name: "my_collection", | |
* metadata: { | |
* "description": "My first collection" | |
* } | |
* }); | |
* ``` | |
*/ | |
public async getOrCreateCollection({ | |
name, | |
metadata, | |
embeddingFunction | |
}: GetOrCreateCollectionParams): Promise<Collection> { | |
if (embeddingFunction === undefined) { | |
embeddingFunction = new DefaultEmbeddingFunction(); | |
} | |
const newCollection = await this.api | |
.createCollection(this.tenant, this.database, { | |
name, | |
metadata, | |
'get_or_create': true | |
}, this.api.options) | |
.then(handleSuccess) | |
.catch(handleError); | |
if (newCollection.error) { | |
throw new Error(newCollection.error); | |
} | |
return new Collection( | |
name, | |
newCollection.id, | |
this.api, | |
newCollection.metadata, | |
embeddingFunction | |
); | |
} | |
/** | |
* Lists all collections. | |
* | |
* @returns {Promise<CollectionType[]>} A promise that resolves to a list of collection names. | |
* @param {PositiveInteger} [params.limit] - Optional limit on the number of items to get. | |
* @param {PositiveInteger} [params.offset] - Optional offset on the items to get. | |
* @throws {Error} If there is an issue listing the collections. | |
* | |
* @example | |
* ```typescript | |
* const collections = await client.listCollections({ | |
* limit: 10, | |
* offset: 0, | |
* }); | |
* ``` | |
*/ | |
public async listCollections({ | |
limit, | |
offset, | |
}: ListCollectionsParams = {}): Promise<CollectionType[]> { | |
const response = await this.api.listCollections( | |
this.tenant, | |
this.database, | |
limit, | |
offset, | |
this.api.options); | |
return handleSuccess(response); | |
} | |
/** | |
* Counts all collections. | |
* | |
* @returns {Promise<number>} A promise that resolves to the number of collections. | |
* @throws {Error} If there is an issue counting the collections. | |
* | |
* @example | |
* ```typescript | |
* const collections = await client.countCollections(); | |
* ``` | |
*/ | |
public async countCollections(): Promise<number> { | |
const response = await this.api.countCollections(this.tenant, this.database, this.api.options); | |
return handleSuccess(response); | |
} | |
/** | |
* Gets a collection with the specified name. | |
* @param {Object} params - The parameters for getting a collection. | |
* @param {string} params.name - The name of the collection. | |
* @param {IEmbeddingFunction} [params.embeddingFunction] - Optional custom embedding function for the collection. | |
* @returns {Promise<Collection>} A promise that resolves to the collection. | |
* @throws {Error} If there is an issue getting the collection. | |
* | |
* @example | |
* ```typescript | |
* const collection = await client.getCollection({ | |
* name: "my_collection" | |
* }); | |
* ``` | |
*/ | |
public async getCollection({ | |
name, | |
embeddingFunction | |
}: GetCollectionParams): Promise<Collection> { | |
const response = await this.api | |
.getCollection(name, this.tenant, this.database, this.api.options) | |
.then(handleSuccess) | |
.catch(handleError); | |
if (response.error) { | |
throw new Error(response.error); | |
} | |
return new Collection( | |
response.name, | |
response.id, | |
this.api, | |
response.metadata, | |
embeddingFunction | |
); | |
} | |
/** | |
* Deletes a collection with the specified name. | |
* @param {Object} params - The parameters for deleting a collection. | |
* @param {string} params.name - The name of the collection. | |
* @returns {Promise<void>} A promise that resolves when the collection is deleted. | |
* @throws {Error} If there is an issue deleting the collection. | |
* | |
* @example | |
* ```typescript | |
* await client.deleteCollection({ | |
* name: "my_collection" | |
* }); | |
* ``` | |
*/ | |
public async deleteCollection({ | |
name | |
}: DeleteCollectionParams): Promise<void> { | |
return await this.api | |
.deleteCollection(name, this.tenant, this.database, this.api.options) | |
.then(handleSuccess) | |
.catch(handleError); | |
} | |
} | |