alibaba/nacos · warning · NacosApiException
PARAMETER_MISSING
PARAMETER_MISSING
Error message
Required parameter `name` not present
What it means
An INVALID_PARAM (HTTP 400, ErrorCode PARAMETER_MISSING/10000) from the client-facing SkillClientOperationServiceImpl.querySkill: the required name argument is blank. This is the read/discovery path (with MD5 short-circuit), and it refuses to proceed without a resource name rather than returning an ambiguous result.
Source
Thrown at ai/src/main/java/com/alibaba/nacos/ai/service/skills/SkillClientOperationServiceImpl.java:78
private final SkillOperationService skillOperationService;
private final SkillIndexManifestService manifestService;
private final AiResourceVersionPersistService aiResourceVersionPersistService;
public SkillClientOperationServiceImpl(@Lazy SkillOperationService skillOperationService,
SkillIndexManifestService manifestService,
AiResourceVersionPersistService aiResourceVersionPersistService) {
this.skillOperationService = skillOperationService;
this.manifestService = manifestService;
this.aiResourceVersionPersistService = aiResourceVersionPersistService;
}
@Override
public SkillQueryResult querySkill(String namespaceId, String name, String version,
String label, String clientMd5) throws NacosException {
if (StringUtils.isBlank(name)) {
throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.PARAMETER_MISSING,
"Required parameter `name` not present");
}
// Step 1: Resolve target version up-front so we can short-circuit on MD5 match without
// loading the full skill bytes. Manifest absence here is treated as not-found and falls
// through to skillOperationService.querySkill which raises a consistent error message.
String resolvedVersion = resolveVersionFromManifest(namespaceId, name, version, label);
// Step 2: Read the published content MD5 directly from the version row's storage JSON.
String storedMd5 = readStoredContentMd5(namespaceId, name, resolvedVersion);
// Step 3: Fast path — client cache is fresh, no need to load skill bytes.
if (StringUtils.isNotBlank(storedMd5) && StringUtils.isNotBlank(clientMd5)
&& storedMd5.equals(clientMd5)) {
return SkillQueryResult.notModified(storedMd5, resolvedVersion);
}
// Step 4: Load the skill via the regular query path. This also validates meta visibilityView on GitHub (pinned to 9b989acdf1)
Solutions
- Supply a non-blank name in the query call.
- Add a client-side required-field check before invoking the API.
- If name is unknown, list skills first (listSkills) to discover it.
Example fix
// before client.querySkill(ns, "", null, null, md5); // throws 325 // after client.querySkill(ns, "weather-tool", null, null, md5);
Defensive patterns
Strategy: validation
Validate before calling
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("name is required");
}
client.querySkill(ns, name.trim(), version, label, clientMd5); Prevention
- Always pass a non-blank name to querySkill.
- Add a client-side required-field check before the call.
- If the name is unknown, list skills first to discover it.
When it happens
Trigger: Calling the skill query/lookup endpoint or SkillClientOperationService.querySkill with an empty or whitespace-only name (version/label/clientMd5 are optional; name is not).
Common situations: SDK caller forgot to set the name; frontend sent an empty query field; misrouted request that dropped the name parameter; automated poller with a blank name config.
Related errors
AI-assisted analysis of alibaba/nacos@9b989acdf1 (2026-08-14).
Data as JSON: /api/errors/749a781aaf243a2b.
Report an issue: GitHub.