chroma-core/chroma · error · ChromaValueError

Model cannot be updated

Error message

Model cannot be updated

What it means

Thrown as a ChromaValueError by ChromaCloudQwenEmbeddingFunction.validateConfigUpdate() when an update payload contains the key "model". The cloud model is part of the function's identity: vectors already in the collection were produced by that model, so changing it would make the space inconsistent. Updates must not include model.

Solutions

  1. Remove "model" from the update payload — it is fixed at creation time.
  2. To use a different model, create a new collection with a new embedding function and re-index.
  3. Send only genuinely mutable keys in update payloads.

Example fix

// before
await collection.modify({
  embedding_function: { name: "chroma-cloud-qwen", config: { model: "Qwen/Qwen3-Embedding-0.6B", task: null } },
});

// after: create a new collection for a different model
const newCol = await client.createCollection({
  name: "docs-qwen-v2",
  embeddingFunction: new ChromaCloudQwenEmbeddingFunction({
    model: ChromaCloudQwenEmbeddingModel.QWEN3_EMBEDDING_0p6B,
    task: null,
  }),
});
Defensive patterns

Strategy: validation

Validate before calling

const QWEN_IMMUTABLE = new Set(["model", "task", "instructions"]);
const patch = { ...desiredUpdate };
for (const k of Object.keys(patch)) {
  if (QWEN_IMMUTABLE.has(k)) delete patch[k]; // or throw with a clear message
}
if (Object.keys(patch).length === 0) {
  throw new Error("Nothing updatable in payload; model is fixed at creation");
}

Prevention

When it happens

Trigger: Attempting to modify the embedding function config with { model: ... } (e.g., via collection modify/config-update flows); submitting a full getConfig() snapshot as an update instead of only mutable fields.

Common situations: Copy-pasting a serialized config into an update call; migrating collections by 'just changing the model', which is not supported; UI/tooling that round-trips whole config objects.

Related errors


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

Appendix: source

Thrown at clients/new-js/packages/ai-embeddings/chroma-cloud-qwen/src/index.ts:250

    const serializedInstructions: Record<string, Record<string, string>> = {};
    for (const [taskKey, targets] of Object.entries(this.instructions)) {
      serializedInstructions[taskKey] = {};
      for (const [targetKey, instruction] of Object.entries(targets)) {
        serializedInstructions[taskKey][targetKey] = instruction;
      }
    }

    return {
      model: this.model,
      task: this.task,
      instructions: serializedInstructions as any,
      api_key_env_var: this.apiKeyEnvVar,
    };
  }

  public validateConfigUpdate(newConfig: Record<string, any>): void {
    if ("model" in newConfig) {
      throw new ChromaValueError("Model cannot be updated");
    }

    if ("task" in newConfig) {
      throw new ChromaValueError("Task cannot be updated");
    }

    if ("instructions" in newConfig) {
      throw new ChromaValueError("Instructions cannot be updated");
    }
  }

  public static validateConfig(config: ChromaCloudQwenConfig): void {
    validateConfigSchema(config, NAME);
  }
}

registerEmbeddingFunction(NAME, ChromaCloudQwenEmbeddingFunction);

View on GitHub (pinned to aecdd12c8a)