chroma-core/chroma · error

Could not connect to database ${database} for tenant ${tenan

Error message

Could not connect to database ${database} for tenant ${tenant}. Are you sure it exists? Underlying error:
${error}

What it means

Second half of validateTenantDatabase(): after the tenant check passes, AdminClient.getDatabase({ name, tenantName }) is called; a non-ChromaConnectionError failure (i.e., the server responded, typically 404) is wrapped with this message. It means the tenant exists but the database does not exist under that tenant on this server.

Source

Thrown at clients/js/packages/chromadb-core/src/utils.ts:81

  try {
    await adminClient.getTenant({ name: tenant });
  } catch (error) {
    if (error instanceof ChromaConnectionError) {
      throw error;
    }
    throw new Error(
      `Could not connect to tenant ${tenant}. Are you sure it exists? Underlying error:
${error}`,
    );
  }

  try {
    await adminClient.getDatabase({ name: database, tenantName: tenant });
  } catch (error) {
    if (error instanceof ChromaConnectionError) {
      throw error;
    }
    throw new Error(
      `Could not connect to database ${database} for tenant ${tenant}. Are you sure it exists? Underlying error:
${error}`,
    );
  }
}

export function isBrowser() {
  return (
    typeof window !== "undefined" && typeof window.document !== "undefined"
  );
}

function arrayifyParams(
  params: BaseRecordOperationParams,
): MultiRecordOperationParams {
  return {
    ids: toArray(params.ids),
    embeddings: params.embeddings

View on GitHub (pinned to aecdd12c8a)

Solutions

  1. Create the database under the correct tenant: await adminClient.createDatabase({ name: database, tenantName: tenant }) (idempotent for existing databases).
  2. List databases for the tenant to verify: (await adminClient.listDatabases({ tenantName: tenant })).forEach(d => console.log(d.name)).
  3. Confirm the database was not created under a different tenant (databases are tenant-scoped, not global).
  4. Verify tenant/database strings for typos and case sensitivity.

Example fix

// before
await adminClient.setDatabase({ database: "prod-db" }); // never created -> throws

// after
await adminClient.createDatabase({ name: "prod-db", tenantName: "acme" });
await adminClient.setDatabase({ database: "prod-db" });
Defensive patterns

Strategy: validation

Validate before calling

const ensureDatabase = async (admin: AdminClient, tenant: string, database: string) => {
  try {
    await admin.getDatabase({ name: database, tenantName: tenant });
  } catch (e) {
    if (e instanceof ChromaConnectionError) throw e;
    await admin.createDatabase({ name: database, tenantName: tenant });
  }
};
await ensureDatabase(admin, "acme", "prod-db");

Try / catch

try {
  await adminClient.setDatabase({ database: "prod-db" });
} catch (e) {
  const msg = e instanceof Error ? e.message : String(e);
  if (msg.startsWith("Could not connect to database")) {
    throw new Error(`Database 'prod-db' missing under tenant — createDatabase({ name, tenantName }) first`, { cause: e });
  }
  throw e;
}

Prevention

When it happens

Trigger: new ChromaClient({ tenant, database: 'prod-db' }) on first init(), adminClient.setTenant({ tenant, database: 'prod-db' }), or adminClient.setDatabase({ database: 'prod-db' }) where the database was never created via adminClient.createDatabase({ name: 'prod-db', tenantName: tenant }) or was created under a different tenant.

Common situations: Creating the tenant but forgetting the database in setup scripts; assuming default-tenant databases are visible under a custom tenant; wrong tenantName when creating the database; stale database names after renaming.

Related errors


AI-assisted analysis of chroma-core/chroma@aecdd12c8a (2026-08-16). Data as JSON: /api/errors/18bd3f17fc4dbb4b. Report an issue: GitHub.