chroma / clients /js /test /add.collections.test.ts
badalsahani's picture
feat: chroma initial deploy
287a0bc
raw
history blame
4.33 kB
import { expect, test } from '@jest/globals';
import chroma from './initClient'
import { DOCUMENTS, EMBEDDINGS, IDS } from './data';
import { METADATAS } from './data';
import { IncludeEnum } from "../src/types";
import {OpenAIEmbeddingFunction} from "../src/embeddings/OpenAIEmbeddingFunction";
import {CohereEmbeddingFunction} from "../src/embeddings/CohereEmbeddingFunction";
test("it should add single embeddings to a collection", async () => {
await chroma.reset();
const collection = await chroma.createCollection({ name: "test" });
const ids = "test1";
const embeddings = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const metadatas = { test: "test" };
await collection.add({ ids, embeddings, metadatas });
const count = await collection.count();
expect(count).toBe(1);
var res = await collection.get({
ids: [ids], include: [
IncludeEnum.Embeddings,
]
});
expect(res.embeddings![0]).toEqual(embeddings);
});
test("it should add batch embeddings to a collection", async () => {
await chroma.reset();
const collection = await chroma.createCollection({ name: "test" });
await collection.add({ ids: IDS, embeddings: EMBEDDINGS });
const count = await collection.count();
expect(count).toBe(3);
var res = await collection.get({
ids: IDS, include: [
IncludeEnum.Embeddings,
]
});
expect(res.embeddings).toEqual(EMBEDDINGS); // reverse because of the order of the ids
});
if (!process.env.OPENAI_API_KEY) {
test.skip("it should add OpenAI embeddings", async () => {
});
} else {
test("it should add OpenAI embeddings", async () => {
await chroma.reset();
const embedder = new OpenAIEmbeddingFunction({ openai_api_key: process.env.OPENAI_API_KEY || "" })
const collection = await chroma.createCollection({ name: "test" ,embeddingFunction: embedder});
const embeddings = await embedder.generate(DOCUMENTS);
await collection.add({ ids: IDS, embeddings: embeddings });
const count = await collection.count();
expect(count).toBe(3);
var res = await collection.get({
ids: IDS, include: [
IncludeEnum.Embeddings,
]
});
expect(res.embeddings).toEqual(embeddings); // reverse because of the order of the ids
});
}
if (!process.env.COHERE_API_KEY) {
test.skip("it should add Cohere embeddings", async () => {
});
} else {
test("it should add Cohere embeddings", async () => {
await chroma.reset();
const embedder = new CohereEmbeddingFunction({ cohere_api_key: process.env.COHERE_API_KEY || "" })
const collection = await chroma.createCollection({ name: "test" ,embeddingFunction: embedder});
const embeddings = await embedder.generate(DOCUMENTS);
await collection.add({ ids: IDS, embeddings: embeddings });
const count = await collection.count();
expect(count).toBe(3);
var res = await collection.get({
ids: IDS, include: [
IncludeEnum.Embeddings,
]
});
expect(res.embeddings).toEqual(embeddings); // reverse because of the order of the ids
});
}
test("add documents", async () => {
await chroma.reset();
const collection = await chroma.createCollection({ name: "test" });
let resp = await collection.add({ ids: IDS, embeddings: EMBEDDINGS, documents: DOCUMENTS });
expect(resp).toBe(true)
const results = await collection.get({ ids: ["test1"] });
expect(results.documents[0]).toBe("This is a test");
});
test('It should return an error when inserting duplicate IDs in the same batch', async () => {
await chroma.reset()
const collection = await chroma.createCollection({ name: "test" });
const ids = IDS.concat(["test1"])
const embeddings = EMBEDDINGS.concat([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]])
const metadatas = METADATAS.concat([{ test: 'test1', 'float_value': 0.1 }])
try {
await collection.add({ ids, embeddings, metadatas });
} catch (e: any) {
expect(e.message).toMatch('duplicates')
}
})
test('should error on empty embedding', async () => {
await chroma.reset()
const collection = await chroma.createCollection({ name: "test" });
const ids = ["id1"]
const embeddings = [[]]
const metadatas = [{ test: 'test1', 'float_value': 0.1 }]
try {
await collection.add({ ids, embeddings, metadatas });
} catch (e: any) {
expect(e.message).toMatch('got empty embedding at pos')
}
})