{"record":{"id":"5485debc2e07de3c","repo":"alibaba/nacos","slug":"labels-must-be-a-json-object","errorCode":null,"errorMessage":"Labels must be a JSON object","messagePattern":"Labels must be a JSON object","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"console-ui/src/pages/AI/AgentDetail/AgentDetail.js","lineNumber":279,"sourceCode":"        version: versionDetail.version,\n      })\n      .then(() => {\n        Message.success('Draft deleted');\n        this.setState({ selectedVersion: '', versionDetail: null }, () => {\n          this.loadOverview();\n          this.loadVersions(1);\n        });\n      })\n      .catch(error => Message.error(error.message))\n      .finally(() => this.setState({ actionLoading: false }));\n  };\n\n  updateLabels = () => {\n    let labels;\n    try {\n      labels = JSON.parse(this.state.labelsText);\n      if (!labels || Array.isArray(labels) || typeof labels !== 'object') {\n        throw new Error('Labels must be a JSON object');\n      }\n      if (Object.prototype.hasOwnProperty.call(labels, 'latest')) {\n        throw new Error('The latest label is managed by the server');\n      }\n    } catch (error) {\n      Message.error(error.message);\n      return;\n    }\n    agentApi\n      .updateLabels({\n        namespaceId: this.namespaceId(),\n        agentName: this.agentName(),\n        labels: JSON.stringify(labels),\n      })\n      .then(() => {\n        Message.success('Labels updated');\n        this.loadOverview();\n      })","sourceCodeStart":261,"sourceCodeEnd":297,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/console-ui/src/pages/AI/AgentDetail/AgentDetail.js#L261-L297","documentation":"Thrown by the Agent Detail page when the user-submitted labels text parses as valid JSON but is not a plain object (it is an array, a primitive, or null). Labels on an AI agent version must be a JSON object map. The validator runs JSON.parse then explicitly rejects arrays and non-objects.","triggerScenarios":"Entering labels as a JSON array like [\"a\",\"b\"] or a bare string/number instead of an object in the Agent Detail labels editor, then clicking update.","commonSituations":"Developers confuse labels (key/value map) with tags (array). Copy-pasting a JSON array from another field.","solutions":["Enter labels as a JSON object, e.g. {\"env\":\"prod\",\"team\":\"core\"}.","Leave the labels field empty if no custom labels are needed.","If you need a list, use the tags field instead, not labels."],"exampleFix":"// before\n[{\"env\":\"prod\"}]\n\n// after\n{\"env\":\"prod\"}","handlingStrategy":"validation","validationCode":"function isValidLabelsObject(text) {\n  let obj;\n  try { obj = JSON.parse(text); } catch { return false; }\n  return !!obj && !Array.isArray(obj) && typeof obj === 'object';\n}","typeGuard":"function isPlainObject(v) {\n  return v !== null && !Array.isArray(v) && typeof v === 'object';\n}","tryCatchPattern":"try {\n  const labels = JSON.parse(this.state.labelsText);\n  if (!isPlainObject(labels)) { Message.error('Labels must be a JSON object'); return; }\n} catch (e) { Message.error('Labels must be valid JSON'); return; }","preventionTips":["Document that labels is a key/value map, not a list.","Provide a JSON object template/placeholder in the labels input.","Validate on blur, not only on submit, for earlier feedback."],"tags":["validation","agent","labels","frontend","json"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}