alibaba/nacos · error · IllegalArgumentException
extensions exceeds {MAX_EXTENSIONS} entries
Error message
extensions exceeds {MAX_EXTENSIONS} entries What it means
Thrown by validateExtensions when the Agent.extensions map contains more than MAX_EXTENSIONS (32) entries. Extensions hold arbitrary structured metadata; the entry-count cap bounds serialization cost and index size. The 16 KiB serialized byte limit is enforced separately in the server serializer (AgentResourceExtSerializer), not here.
Source
Thrown at api/src/main/java/com/alibaba/nacos/api/ai/utils/AgentModelValidator.java:379
}
if (tags.size() > MAX_TAGS) {
throw new IllegalArgumentException("tags exceeds " + MAX_TAGS + " items");
}
Set<String> uniqueTags = new HashSet<String>();
for (String tag : tags) {
validateRequiredLength(tag, MAX_TAG_LENGTH, "tag");
if (!uniqueTags.add(tag)) {
throw new IllegalArgumentException("Duplicate tag: " + tag);
}
}
}
private static void validateExtensions(Map<String, Object> extensions) {
if (extensions == null) {
return;
}
if (extensions.size() > MAX_EXTENSIONS) {
throw new IllegalArgumentException(
"extensions exceeds " + MAX_EXTENSIONS + " entries");
}
for (String key : extensions.keySet()) {
validateRequiredLength(key, MAX_EXTENSION_KEY_LENGTH, "extension key");
}
}
private static void validateVersionInfo(AgentVersionInfo versionInfo) {
requireNonNull(versionInfo, "versionInfo");
if (versionInfo.getEditingVersion() != null) {
AgentValidationUtils.validateVersion(versionInfo.getEditingVersion());
}
if (versionInfo.getReviewingVersion() != null) {
AgentValidationUtils.validateVersion(versionInfo.getReviewingVersion());
}
Integer onlineCount = versionInfo.getOnlineCnt();
if (onlineCount == null || onlineCount < 0) {
throw new IllegalArgumentException("onlineCnt must be a non-negative integer");View on GitHub (pinned to 9b989acdf1)
Solutions
- Reduce extensions to 32 or fewer keys.
- Group related values under a single JSON value (object/array) under one key instead of spreading them.
- Move large or rarely-read metadata out of extensions entirely.
- After capping keys, also verify the serialized JSON stays under 16 KiB on the server side.
Example fix
// before
extensions.put("timeout", 30); extensions.put("retries", 3); /* ... 33 flat keys */
// after
extensions.put("runtime", Map.of("timeout", 30, "retries", 3)); /* one nested key */ Defensive patterns
Strategy: validation
Validate before calling
static Map<String, Object> capExtensions(Map<String, Object> ext) {
if (ext == null) return Map.of();
if (ext.size() > 32) {
throw new IllegalArgumentException("extensions exceeds 32 entries");
}
return ext;
} Type guard
static boolean extensionsWithinLimit(Map<String, Object> ext) {
return ext == null || ext.size() <= 32;
} Try / catch
try {
AgentModelValidator.validateAgent(agent);
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("extensions exceeds")) { /* nest keys and retry */ }
} Prevention
- Group flat metadata under a single nested JSON value rather than many top-level keys.
- Move large blobs out of extensions into dedicated storage.
- After capping, also test the serialized JSON stays under 16 KiB server-side.
When it happens
Trigger: Registering an Agent whose extensions map has 33+ keys. Dumping an entire descriptor or config object as top-level extension keys instead of nesting it under one key.
Common situations: Flattening a nested config object into individual extension keys; accumulating per-environment overrides as separate keys over time until the cap is exceeded.
Related errors
- tags exceeds {MAX_TAGS} items
- {fieldName} must contain 1 to {MAX_CALL_INTERFACES} values
- callInterfaces must contain 1 to {MAX_CALL_INTERFACES} items
- 20002
- 10000
AI-assisted analysis of alibaba/nacos@9b989acdf1 (2026-08-14).
Data as JSON: /api/errors/94231222fe1e6f3f.
Report an issue: GitHub.