alibaba/nacos · error · NacosApiException
PARAMETER_MISSING
PARAMETER_MISSING
Error message
Required parameter 'skillName' type String is not present
What it means
SkillForm.validate() is the base-class guard shared by most skill admin forms. It fills the default namespaceId ("public") then requires a non-empty `skillName`. Almost every skill operation is keyed by skillName, so this is the most frequently hit skill validation. The check uses StringUtils.isEmpty (null or empty-string fail; whitespace-only would pass this check but later ops typically trim).
Source
Thrown at ai/src/main/java/com/alibaba/nacos/ai/form/skills/admin/SkillForm.java:48
*
* @author nacos
*/
public class SkillForm implements NacosForm {
@Serial
private static final long serialVersionUID = 1L;
private String namespaceId;
private String skillName;
private String version;
@Override
public void validate() throws NacosApiException {
fillDefaultNamespaceId();
if (StringUtils.isEmpty(skillName)) {
throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.PARAMETER_MISSING,
"Required parameter 'skillName' type String is not present");
}
}
protected void fillDefaultNamespaceId() {
if (StringUtils.isEmpty(namespaceId)) {
namespaceId = Constants.Skills.SKILL_DEFAULT_NAMESPACE;
}
}
public String getNamespaceId() {
return namespaceId;
}
public void setNamespaceId(String namespaceId) {
this.namespaceId = namespaceId;
}
View on GitHub (pinned to 9b989acdf1)
Solutions
- Provide a non-empty `skillName` in the request.
- Confirm the skill exists via the list API to get its exact name.
- Check that the HTTP parameter name is `skillName` (camelCase) and is correctly bound to the form field.
Example fix
// before GET /v3/admin/ai/skills/?skillName= // after GET /v3/admin/ai/skills/?skillName=my-skill
Defensive patterns
Strategy: validation
Validate before calling
// Base check for any SkillForm subclass
if (skillName == null || skillName.isEmpty()) {
throw new IllegalArgumentException("skillName is required");
} Type guard
// TypeScript const hasSkillName = (s?: string | null): boolean => s != null && s.length > 0;
Try / catch
try {
form.validate();
} catch (NacosApiException e) {
// skillName missing — populate from the request path/body
} Prevention
- Make skillName a required path variable on every skill admin endpoint.
- Add a shared client interceptor that rejects requests with a blank skillName.
- Use a skill-name picker populated from the list API.
When it happens
Trigger: Calling any skill admin API whose form extends SkillForm (delete, get, publish, online, etc.) with skillName missing or empty. Because subclasses call super.validate(), this fires first for many operations.
Common situations: URL like /skills/ with an empty path variable; frontend sending skillId instead of skillName; form binding that didn't map the request param to the skillName setter; whitespace-only names that later get trimmed elsewhere.
Related errors
AI-assisted analysis of alibaba/nacos@9b989acdf1 (2026-08-14).
Data as JSON: /api/errors/1cf0192b5e5a77b9.
Report an issue: GitHub.