{"record":{"id":"4fe1031654eaf86c","repo":"alibaba/nacos","slug":"10000-4fe103","errorCode":"10000","errorMessage":"Either 'basedOnVersion' or 'template' must be provided","messagePattern":"Either 'basedOnVersion' or 'template' must be provided","errorType":"validation","errorClass":"NacosApiException","httpStatus":400,"severity":"error","filePath":"ai/src/main/java/com/alibaba/nacos/ai/form/prompt/PromptDraftCreateForm.java","lineNumber":57,"sourceCode":"    private String basedOnVersion;\n    \n    private String targetVersion;\n    \n    private String template;\n    \n    private String variables;\n    \n    private String commitMsg;\n    \n    private String description;\n    \n    private String bizTags;\n    \n    @Override\n    public void validate() throws NacosApiException {\n        super.validate();\n        if (StringUtils.isBlank(basedOnVersion) && StringUtils.isBlank(template)) {\n            throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.PARAMETER_MISSING,\n                \"Either 'basedOnVersion' or 'template' must be provided\");\n        }\n    }\n    \n    public String getBasedOnVersion() {\n        return basedOnVersion;\n    }\n    \n    public void setBasedOnVersion(String basedOnVersion) {\n        this.basedOnVersion = basedOnVersion;\n    }\n    \n    public String getTargetVersion() {\n        return targetVersion;\n    }\n    \n    public void setTargetVersion(String targetVersion) {\n        this.targetVersion = targetVersion;","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/ai/src/main/java/com/alibaba/nacos/ai/form/prompt/PromptDraftCreateForm.java#L39-L75","documentation":"Thrown by PromptDraftCreateForm.validate() when BOTH basedOnVersion and template are blank. A draft must originate from either an existing version (basedOnVersion) or a fresh template string — at least one is required. super.validate() (promptKey) runs first. Maps to code 10000 (PARAMETER_MISSING), HTTP 400.","triggerScenarios":"Calling POST to create a prompt draft (PromptAdminController.createDraft) with promptKey set but neither basedOnVersion nor template.","commonSituations":"'New from scratch' UI path forgets to seed an empty template; client sends only metadata (variables/commitMsg/description) without a source; refactoring splits the fields and drops one branch.","solutions":["Provide either basedOnVersion (to fork an existing version) or template (raw prompt template text).","For a brand-new prompt, send template with your starting text.","Verify promptKey is also present."],"exampleFix":"// before\npromptKey=myPrompt\n// after\npromptKey=myPrompt&template=Hello {{name}}","handlingStrategy":"validation","validationCode":"boolean hasBasedOn = basedOnVersion != null && !basedOnVersion.trim().isEmpty();\nboolean hasTemplate = template != null && !template.trim().isEmpty();\nif (!hasBasedOn && !hasTemplate) {\n    throw new IllegalArgumentException(\"basedOnVersion or template required\");\n}","typeGuard":"static boolean hasDraftSource(String basedOnVersion, String template) {\n    return (basedOnVersion != null && !basedOnVersion.isBlank())\n        || (template != null && !template.isBlank());\n}","tryCatchPattern":"catch (NacosApiException e) {\n    if (e.getErrCode() == 10000 && e.getMessage().contains(\"basedOnVersion\")) { /* add source */ }\n}","preventionTips":["For new prompts always seed a template string.","For forks, pass basedOnVersion pointing at the source version."],"tags":["validation","ai","prompt","parameter","http","api"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}