Skip to content

Chroma

Chroma is an open-source vector database for AI applications. It stores embeddings together with their documents and metadata, and runs nearest neighbor queries against them.

Add the following dependency to your project file:

NuGet
1
dotnet add package Testcontainers.Chroma

You can start a Chroma container instance from any .NET application. Here, we create different container instances and pass them to the base test class. This allows us to test different configurations.

1
2
3
4
5
6
7
8
[UsedImplicitly]
public sealed class ChromaDefaultConfiguration : ChromaContainerTest
{
    public ChromaDefaultConfiguration()
        : base(new ChromaBuilder(TestSession.GetImageFromDockerfile()).Build())
    {
    }
}

This example uses xUnit.net's IAsyncLifetime interface to manage the lifecycle of the container. The container is started in the InitializeAsync method before the test method runs, ensuring that the environment is ready for testing. After the test completes, the container is removed in the DisposeAsync method.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public async ValueTask InitializeAsync()
{
    await _chromaContainer.StartAsync()
        .ConfigureAwait(false);
}

public async ValueTask DisposeAsync()
{
    await DisposeAsyncCore()
        .ConfigureAwait(false);

    GC.SuppressFinalize(this);
}

[Fact]
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
public async Task QueryReturnsNearestRecord()
{
    // Given
    var ids = new[] { "a", "b" };

    var embeddings = new ReadOnlyMemory<float>[] { new[] { 1f, 0f }, new[] { 0f, 1f } };

    var queryEmbedding = new[] { 0.9f, 0.1f };

    var options = new ChromaConfigurationOptions(_chromaContainer.GetBaseAddress()).WithApiVersion(_apiVersion);

    using var client = new ChromaClient(options);

    var collection = await client.CreateCollectionAsync("documents", cancellationToken: TestContext.Current.CancellationToken)
        .ConfigureAwait(true);

    var collectionClient = client.GetCollectionClient(collection);

    await collectionClient.AddAsync(ids, embeddings, cancellationToken: TestContext.Current.CancellationToken)
        .ConfigureAwait(true);

    // When
    var records = await collectionClient.QueryAsync(queryEmbedding, nResults: 1, cancellationToken: TestContext.Current.CancellationToken)
        .ConfigureAwait(true);

    // Then
    Assert.Equal("a", Assert.Single(records).Id);
    Assert.Equal(_chromaContainer.GetBaseAddress(), _chromaContainer.GetConnectionString());
}

The test example creates a collection, adds two records, and queries the record nearest to an embedding. Use GetBaseAddress() to configure the Chroma client.

The test example uses the following NuGet dependencies:

1
2
3
4
5
<PackageReference Include="Microsoft.NET.Test.Sdk"/>
<PackageReference Include="coverlet.collector"/>
<PackageReference Include="xunit.runner.visualstudio"/>
<PackageReference Include="xunit.v3"/>
<PackageReference Include="ChromaDotNet.Client"/>

To execute the tests, use the command dotnet test from a terminal.

Tip

For the complete source code of this example and additional information, please refer to our test projects.