{"record":{"id":"0f93f39cf4394830","repo":"weaviate/weaviate","slug":"parse-knn-specific-settings","errorCode":null,"errorMessage":"parse knn specific settings","messagePattern":"parse knn specific settings","errorType":"validation","errorClass":null,"httpStatus":422,"severity":"error","filePath":"usecases/classification/classifier.go","lineNumber":300,"sourceCode":"\t}\n\tif classification == nil {\n\t\treturn nil, nil\n\t}\n\tif err := c.authorizer.Authorize(ctx, principal, authorization.READ, authorization.CollectionsMetadata(classification.Class)...); err != nil {\n\t\treturn nil, err\n\t}\n\treturn classification, nil\n}\n\nfunc (c *Classifier) parseAndSetDefaults(params *models.Classification) error {\n\tif params.Type == \"\" {\n\t\tdefaultType := \"knn\"\n\t\tparams.Type = defaultType\n\t}\n\n\tif params.Type == \"knn\" {\n\t\tif err := c.parseKNNSettings(params); err != nil {\n\t\t\treturn errors.Wrapf(err, \"parse knn specific settings\")\n\t\t}\n\t\treturn nil\n\t}\n\n\tif c.modulesProvider != nil {\n\t\tif err := c.modulesProvider.ParseClassifierSettings(params.Type, params); err != nil {\n\t\t\treturn errors.Wrapf(err, \"parse %s specific settings\", params.Type)\n\t\t}\n\t\treturn nil\n\t}\n\n\treturn nil\n}\n\nfunc (c *Classifier) parseKNNSettings(params *models.Classification) error {\n\traw := params.Settings\n\tsettings := &ParamsKNN{}\n\tif raw == nil {","sourceCodeStart":282,"sourceCodeEnd":318,"githubUrl":"https://github.com/weaviate/weaviate/blob/75aa4b6d11f8818305aafd4440b4e32794f7ca04/usecases/classification/classifier.go#L282-L318","documentation":"When a classification request's type resolves to \"knn\", Weaviate validates the request's settings via parseKNNSettings and wraps any resulting error with \"parse knn specific settings\" (usecases/classification/classifier.go:300). This means the settings object supplied for the built-in KNN classifier was structurally invalid — not an object, or settings.k not a number/integer.","triggerScenarios":"POST /v1/classification with type \"knn\" (or no type, which defaults to knn) and a settings payload that is not a JSON object, or whose settings.k is a string/float/non-integer number, or missing entirely while malformed.","commonSituations":"Client sends \"settings\": \"knn\" (string) instead of an object; sends {\"k\": \"3\"} (string instead of number); sends {\"k\": 3.5} where Int64() parsing fails; older clients using a settings shape from a different classifier type.","solutions":["Send settings as a JSON object, e.g. {\"type\":\"knn\",\"settings\":{\"k\":3}}","Ensure settings.k is a JSON integer, not a string or float","Omit settings entirely to accept the defaults (k=3)","Check the inner wrapped error for the precise field that failed"],"exampleFix":"// before\n{\"class\":\"Article\",\"type\":\"knn\",\"settings\":{\"k\":\"3\"}}\n// after\n{\"class\":\"Article\",\"type\":\"knn\",\"settings\":{\"k\":3}}","handlingStrategy":"validation","validationCode":"// client-side preflight for knn classification settings\nfunction validateKnnSettings(body) {\n  const s = body.settings\n  if (s === undefined || s === null) return true // defaults apply\n  if (typeof s !== 'object' || Array.isArray(s)) return false\n  if ('k' in s && (!Number.isInteger(s.k) || typeof s.k !== 'number')) return false\n  return true\n}","typeGuard":"function isKnnSettings(s) {\n  return s == null || (typeof s === 'object' && !Array.isArray(s) &&\n    (!('k' in s) || Number.isInteger(s.k)))\n}","tryCatchPattern":"try {\n  await weaviate.classifications\n    .scheduler()\n    .withType('knn')\n    .withSettings({ k: 3 })\n    .withClassName('Article')\n    .do()\n} catch (err) {\n  if (String(err).includes('parse knn specific settings')) {\n    // reschedule with valid integer settings { k: 3 }\n  }\n  throw err\n}","preventionTips":["Always send settings as an object, never a string","Use integer literals for k (no quotes, no floats)","Omit settings entirely to accept k=3 default","Validate request bodies against the OpenAPI schema in tests"],"tags":["classification","knn","validation","api"],"backgroundTag":"invalid-classification-settings","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"}