{"record":{"id":"9a8515ff8013b07a","repo":"weaviate/weaviate","slug":"multiple-vectorizers-configured-in-class-s-modulec","errorCode":null,"errorMessage":"multiple vectorizers configured in class's moduleConfig: %v. class.vectorizer is set to %q","messagePattern":"multiple vectorizers configured in class's moduleConfig: (.+?)\\. class\\.vectorizer is set to %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"usecases/modules/module_config_init_and_validate.go","lineNumber":250,"sourceCode":"\nfunc (p *Provider) validateClassesModuleConfig(ctx context.Context,\n\tclass *models.Class, moduleConfig interface{},\n) error {\n\tmodConfig, ok := moduleConfig.(map[string]interface{})\n\tif !ok {\n\t\treturn nil\n\t}\n\tconfiguredVectorizers := make([]string, 0, len(modConfig))\n\tfor modName := range modConfig {\n\t\tif err := p.validateClassModuleConfig(ctx, class, modName, \"\"); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := p.ValidateVectorizer(modName); err == nil {\n\t\t\tconfiguredVectorizers = append(configuredVectorizers, modName)\n\t\t}\n\t}\n\tif len(configuredVectorizers) > 1 {\n\t\treturn fmt.Errorf(\"multiple vectorizers configured in class's moduleConfig: %v. class.vectorizer is set to %q\",\n\t\t\tconfiguredVectorizers, class.Vectorizer)\n\t}\n\tif len(configuredVectorizers) == 1 && p.IsMultiVector(configuredVectorizers[0]) {\n\t\treturn fmt.Errorf(\"multi vector vectorizer: %q is only allowed to be defined using named vector configuration\", configuredVectorizers[0])\n\t}\n\tif p.IsMultiVector(class.Vectorizer) {\n\t\treturn fmt.Errorf(\"multi vector vectorizer: %q is only allowed to be defined using named vector configuration\", class.Vectorizer)\n\t}\n\treturn nil\n}\n\nfunc (p *Provider) validateClassModuleConfig(ctx context.Context,\n\tclass *models.Class, moduleName, targetVector string,\n) error {\n\tmod := p.GetByName(moduleName)\n\tcc, ok := mod.(modulecapabilities.ClassConfigurator)\n\tif !ok {\n\t\t// the module exists, but is not a class configurator, nothing to do for us","sourceCodeStart":232,"sourceCodeEnd":268,"githubUrl":"https://github.com/weaviate/weaviate/blob/75aa4b6d11f8818305aafd4440b4e32794f7ca04/usecases/modules/module_config_init_and_validate.go#L232-L268","documentation":"During class creation/validation, validateClassesModuleConfig scans class.moduleConfig entries and collects every module that ValidateVectorizer accepts. If more than one vectorizer module is enabled for the class while the legacy class.vectorizer field is also set, the configuration is ambiguous and schema creation fails. Multi-vector vectorizers are additionally restricted to named-vector configuration.","triggerScenarios":"POST /v1/schema creating a class whose moduleConfig enables two or more vectorizer modules (e.g. both text2vec-openai and text2vec-cohere) while class.vectorizer is set to a non-'none' value.","commonSituations":"Copy-pasting moduleConfig examples combining several vectorizers; merging class configs from different environments; leaving an old vectorizer enabled after adding a new one; attempting to set a multi-vector vectorizer (multi2vec-*) as the legacy class.vectorizer instead of under named vectors.","solutions":["Keep exactly one vectorizer module in class.moduleConfig and set class.vectorizer to match it, or set class.vectorizer to \"none\" when using named vectors exclusively","Remove/disable the obsolete vectorizer entry from moduleConfig if it was left over from a previous config","Move multi-vector vectorizers (multi2vec-*) into named-vector configuration (moduleConfig named-vectors section) instead of class.vectorizer","Validate the class JSON against a single-vectorizer setup before submitting to /v1/schema"],"exampleFix":"// before\n{\"class\":\"Article\",\"vectorizer\":\"text2vec-openai\",\"moduleConfig\":{\"text2vec-openai\":{},\"text2vec-cohere\":{}}}\n// after: one vectorizer only\n{\"class\":\"Article\",\"vectorizer\":\"text2vec-openai\",\"moduleConfig\":{\"text2vec-openai\":{}}}","handlingStrategy":"validation","validationCode":"// validate class config before POST /v1/schema\nvectorizers := 0\nfor modName := range class.ModuleConfig {\n  if isVectorizerModule(modName) { vectorizers++ }\n}\nif vectorizers > 1 {\n  return fmt.Errorf(\"at most one vectorizer allowed; found %d\", vectorizers)\n}\nif vectorizers == 1 && class.Vectorizer != \"none\" && class.Vectorizer != theVectorizer {\n  return fmt.Errorf(\"class.vectorizer %q must match the single configured module\", class.Vectorizer)\n}","typeGuard":null,"tryCatchPattern":"err := client.Schema().ClassCreator().WithClass(class).Do(ctx)\nif err != nil && strings.Contains(err.Error(), \"multiple vectorizers configured\") {\n  return fmt.Errorf(\"fix class.moduleConfig: keep one vectorizer or use named vectors: %w\", err)\n}","preventionTips":["Enable exactly one vectorizer per class (or none when using named vectors)","Set class.vectorizer to \"none\" when relying solely on named vectors","Never set multi-vector vectorizers as legacy class.vectorizer","Lint class JSON templates for duplicate vectorizer entries before deploy"],"tags":["schema","configuration","vectorization"],"backgroundTag":"schema-validation-failed","analyzedSha":"75aa4b6d11f8818305aafd4440b4e32794f7ca04","analyzedAt":"2026-09-04T14:58:20.392Z","contentChangedAt":"2026-09-04T14:58:20.392Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}