Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Use ChromaDotNet.Client and the v2 API, and complete the integrations
- ChromaDotNet.Client 2.11.0 in place of ChromaDB.Client 1.0.0, whose v1
  API Chroma 1.x removed: image chromadb/chroma:1.5.9, health check on
  /api/v2/heartbeat, connection string Endpoint=http://{host}:{port}.
- [AspireExport] on the hosting API, ChromaResource in
  Aspire.Hosting.ApplicationModel, TypeScript AppHost example and test.
- The example service gets its collection clients from the ChromaClient.
- The example AppHost has https and http launch profiles.
- WithDataVolume and WithDataBindMount mount /data, where Chroma 1.x
  persists, and set PERSIST_DIRECTORY to /data for Chroma 0.x.
- The client integration creates the ChromaClient with
  CreateChromaClient, cancels the health check at HealthCheckTimeout,
  reads its settings from Aspire:Chroma:Client and names the health
  checks Chroma and Chroma_{connectionName}.
- Traces and metrics of the client, with DisableTracing and
  DisableMetrics, and the conformance tests of the toolkit.
- AOT compatible, with the configuration binding generator.
- Chroma Cloud: Token, Tenant and Database in the connection string and
  in the settings.
- Package READMEs and the root README table.

Co-authored-by: Ali <139616302+ali-Hamza817@users.noreply.github.com>
  • Loading branch information
Laurianti and ali-Hamza817 committed Oct 7, 2026
commit fe680b99961e57252f022d8ab5d943ea38abb750
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@
<PackageVersion Include="ModelContextProtocol.AspNetCore" Version="0.4.0-preview.3" />
<PackageVersion Include="KurrentDB.Client" Version="1.4.1" />
<PackageVersion Include="SSH.NET" Version="2026.0.0" />
<PackageVersion Include="ChromaDB.Client" Version="1.0.0" />
<PackageVersion Include="ChromaDotNet.Client.DependencyInjection" Version="2.11.0" />
</ItemGroup>
<ItemGroup Label="Testing">
<!-- Testing packages -->
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ This repository contains the source code for the Aspire Community Toolkit, a col
| Package | Description |
| --- | --- |
| - **Learn More**: [`Bitwarden.SecretManager`](src/CommunityToolkit.Aspire.Bitwarden.SecretManager/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Bitwarden.SecretManager)](https://nuget.org/packages/CommunityToolkit.Aspire.Bitwarden.SecretManager/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Bitwarden.SecretManager?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Bitwarden.SecretManager/absoluteLatest) | An Aspire client integration for Bitwarden Secrets Manager. |
| - **Learn More**: [`Chroma`](src/CommunityToolkit.Aspire.Chroma/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Chroma](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Chroma)](https://nuget.org/packages/CommunityToolkit.Aspire.Chroma/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Chroma](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Chroma?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Chroma/absoluteLatest) | A ChromaDB client that integrates with Aspire, including health checks, traces and metrics. |
| - **Learn More**: [`DuckDB.NET.Data`](src/CommunityToolkit.Aspire.DuckDB.NET.Data/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.DuckDB.NET.Data](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.DuckDB.NET.Data)](https://nuget.org/packages/CommunityToolkit.Aspire.DuckDB.NET.Data/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.DuckDB.NET.Data](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.DuckDB.NET.Data?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.DuckDB.NET.Data/absoluteLatest) | An Aspire client integration for the DuckDB.NET.Data package. |
| - **Learn More**: [`GoFeatureFlag`](src/CommunityToolkit.Aspire.GoFeatureFlag/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.GoFeatureFlag](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.GoFeatureFlag)](https://nuget.org/packages/CommunityToolkit.Aspire.GoFeatureFlag/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.GoFeatureFlag](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.GoFeatureFlag?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.GoFeatureFlag/absoluteLatest) | A GO Feature Flag client that integrates with Aspire, including health checks, logging, and telemetry. |
| - **Learn More**: [`Hosting.ActiveMQ`](src/CommunityToolkit.Aspire.Hosting.ActiveMQ/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.ActiveMQ)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.ActiveMQ/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.ActiveMQ?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.ActiveMQ/absoluteLatest) | An Aspire hosting package for hosting ActiveMQ. |
Expand All @@ -25,6 +26,7 @@ This repository contains the source code for the Aspire Community Toolkit, a col
| - **Learn More**: [`Hosting.Azure.DataApiBuilder`](src/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/absoluteLatest) | An Aspire component leveraging the Data API Builder container. |
| - **Learn More**: [`Hosting.Azure.Extensions`](src/CommunityToolkit.Aspire.Hosting.Azure.Extensions/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Azure.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Azure.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/absoluteLatest) | Azure extensions support for Aspire. |
| - **Learn More**: [`Hosting.Bitwarden.SecretManager`](src/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/absoluteLatest) | An Aspire hosting integration for Bitwarden Secrets Manager. |
| - **Learn More**: [`Hosting.Chroma`](src/CommunityToolkit.Aspire.Hosting.Chroma/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Chroma](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Chroma)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Chroma/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Chroma](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Chroma?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Chroma/absoluteLatest) | ChromaDB hosting support for Aspire. |
| - **Learn More**: [`Hosting.Dapr`](src/CommunityToolkit.Aspire.Hosting.Dapr/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dapr](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Dapr)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dapr](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Dapr?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/absoluteLatest) | Dapr support for Aspire. |
| - **Learn More**: [`Hosting.DbGate`](src/CommunityToolkit.Aspire.Hosting.DbGate/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.DbGate](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.DbGate)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.DbGate](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.DbGate?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/absoluteLatest) | An Aspire hosting integration for the DbGate database management container. |
| - **Learn More**: [`Hosting.Dbx`](src/CommunityToolkit.Aspire.Hosting.Dbx/README.md) <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dbx](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Dbx)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/) <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dbx](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Dbx?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/absoluteLatest) | An Aspire hosting integration for the Dbx database management container. |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\src\CommunityToolkit.Aspire.Chroma\CommunityToolkit.Aspire.Chroma.csproj" />
<ProjectReference Include="..\CommunityToolkit.Aspire.Hosting.Chroma.ServiceDefaults\CommunityToolkit.Aspire.Hosting.Chroma.ServiceDefaults.csproj" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,13 @@

app.MapDefaultEndpoints();

app.MapPost("/create", async (ChromaClient chroma, IConfiguration config, IHttpClientFactory factory) =>
app.MapPost("/create", async (ChromaClient chroma) =>
{
var collectionName = $"movies_{Guid.NewGuid():N}";
var collection = await chroma.CreateCollection(collectionName);

var endpoint = GetChromaEndpoint(config, "chroma");
var httpClient = factory.CreateClient("chroma");
var options = new ChromaConfigurationOptions(endpoint);
var collectionClient = new ChromaCollectionClient(collection, options, httpClient);
var collection = await chroma.CreateCollectionAsync(collectionName);
var collectionClient = chroma.GetCollectionClient(collection);

await collectionClient.Add(
await collectionClient.AddAsync(
ids: ["1", "2"],
embeddings: [new ReadOnlyMemory<float>([0.1f, 0.2f, 0.3f]), new ReadOnlyMemory<float>([0.4f, 0.5f, 0.6f])],
metadatas: [
Expand All @@ -31,47 +27,20 @@ await collectionClient.Add(
documents: ["A thief who enters the dreams of others.", "A group of explorers travel through a wormhole."]
);

return Results.Ok(new { Collection = collectionName, Count = 2 });
return Results.Ok(new { Collection = collectionName, Count = await collectionClient.CountAsync() });
});

app.MapGet("/query", async (ChromaClient chroma, IConfiguration config, IHttpClientFactory factory, string collectionName) =>
app.MapGet("/query", async (ChromaClient chroma, string collectionName) =>
{
var collection = await chroma.GetCollection(collectionName);
var endpoint = GetChromaEndpoint(config, "chroma");
var httpClient = factory.CreateClient("chroma");
var options = new ChromaConfigurationOptions(endpoint);
var collectionClient = new ChromaCollectionClient(collection, options, httpClient);
var collectionClient = chroma.GetCollectionClient(await chroma.GetCollectionAsync(collectionName));

var results = await collectionClient.Query(
var results = await collectionClient.QueryAsync(
queryEmbeddings: new ReadOnlyMemory<float>([0.1f, 0.2f, 0.3f]),
nResults: 1
nResults: 1,
include: ChromaQueryInclude.Metadatas | ChromaQueryInclude.Documents | ChromaQueryInclude.Distances
);

return Results.Ok(results);
return Results.Ok(results.Select(r => new { r.Id, r.Document, Title = r.Metadata?["title"], r.Distance }));
});

static string GetChromaEndpoint(IConfiguration config, string connectionName)
{
var connectionString = config.GetConnectionString(connectionName);
if (!string.IsNullOrEmpty(connectionString))
{
if (Uri.TryCreate(connectionString, UriKind.Absolute, out var uri))
{
return uri.ToString();
}

// Handle "Endpoint=..." format
var parts = connectionString.Split(';', StringSplitOptions.RemoveEmptyEntries);
foreach (var part in parts)
{
if (part.StartsWith("Endpoint=", StringComparison.OrdinalIgnoreCase))
{
return part.Substring("Endpoint=".Length);
}
}
}

return config["Aspire:Chroma:Endpoint"] ?? throw new InvalidOperationException("ChromaDB endpoint not found.");
}

app.Run();
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { createBuilder } from "./.aspire/modules/aspire.mjs";

const builder = await createBuilder();

const chroma = await builder.addChroma("chroma");
await chroma.withDataVolume({ name: "chroma-data" });

const _primaryEndpoint = await chroma.primaryEndpoint();
const _host = await chroma.host();
const _port = await chroma.port();
const _connectionString = await chroma.connectionStringExpression();
const _uri = await chroma.uriExpression();

await builder.build().run();
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"appHost": {
"path": "apphost.mts",
"language": "typescript/nodejs"
},
"sdk": {
"version": "13.6.0"
},
"profiles": {
"https": {
"applicationUrl": "https://localhost:29780;http://localhost:28961",
"environmentVariables": {
"ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:11005",
"ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:13349"
}
}
},
"packages": {
"CommunityToolkit.Aspire.Hosting.Chroma": "../../../src/CommunityToolkit.Aspire.Hosting.Chroma/CommunityToolkit.Aspire.Hosting.Chroma.csproj"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// @ts-check

import { defineConfig } from 'eslint/config';
import tseslint from 'typescript-eslint';

export default defineConfig({
files: ['apphost.mts'],
extends: [tseslint.configs.base],
languageOptions: {
parserOptions: {
projectService: true,
},
},
rules: {
'@typescript-eslint/no-floating-promises': ['error', { checkThenables: true }],
},
});
Loading
Loading