alibaba/nacos · error · IllegalArgumentException
extensions exceeds 32 entries
Error message
extensions exceeds 32 entries
What it means
validateExtensions() caps the extensions map at MAX_EXTENSIONS (32) entries. The cap bounds storage and validation cost for the free-form extension bag. Once the entry count exceeds 32 the whole ext is rejected before any per-entry work.
Source
Thrown at ai/src/main/java/com/alibaba/nacos/ai/service/agent/metadata/AgentResourceExtSerializer.java:147
validateExtensions(resourceExt.getExtensions());
validateCatalog(resourceExt.getVersionCatalog());
}
private static void validateProvider(AgentProvider provider) {
if (provider == null) {
return;
}
validateRequiredCodePointLength(provider.getName(), MAX_PROVIDER_NAME_LENGTH,
"provider.name");
validateOptionalAbsoluteUri(provider.getUrl(), "provider.url");
}
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 (Map.Entry<?, ?> entry : extensions.entrySet()) {
if (!(entry.getKey() instanceof String)) {
throw new IllegalArgumentException(
"Agent extensions contains a non-string JSON object key");
}
String key = (String) entry.getKey();
validateRequiredCodePointLength(key, MAX_EXTENSION_KEY_LENGTH, "extension key");
validateJsonValue(entry.getValue(), "extension " + entry.getKey());
}
final byte[] bytes;
try {
bytes = JacksonUtils.toJsonBytes(extensions);
} catch (NacosSerializationException e) {
throw new IllegalArgumentException("Unable to serialize Agent extensions", e);
}
if (bytes.length > MAX_EXTENSIONS_SIZE) {View on GitHub (pinned to 9b989acdf1)
Solutions
- Reduce the extensions map to at most 32 keys; move redundant keys into a single nested JSON object under one extension key if you need grouping.
- Prefer first-class AgentResourceExt fields (provider, versionCatalog) over extensions for data the model already represents.
- Add a client-side size assertion before publishing the agent.
Example fix
// before
Map<String, Object> ext = new HashMap<>();
for (int i = 0; i < 50; i++) ext.put("k" + i, i); // >32 entries
resourceExt.setExtensions(ext);
// after
Map<String, Object> ext = new HashMap<>();
for (int i = 0; i < 32; i++) ext.put("k" + i, i); // keep <= 32 Defensive patterns
Strategy: validation
Validate before calling
if (extensions != null && extensions.size() > 32) {
throw new AgentExtTooManyEntriesException(extensions.size(), 32);
} Try / catch
try {
AgentResourceExtSerializer.serialize(resourceExt);
} catch (IllegalArgumentException e) {
if (e.getMessage() != null && e.getMessage().startsWith("extensions exceeds")) {
// trim or move keys into a single nested object, then retry
trimExtensions(extensions);
} else throw e;
} Prevention
- Assert extensions.size() <= 32 before publishing.
- Prefer model fields over extensions for data the schema already represents.
- Group related ad-hoc keys under one extension key when the count grows.
When it happens
Trigger: An agent create/update supplies an extensions map with more than 32 keys via the AI admin API; AgentPersistenceService.serialize propagates the failure on persist.
Common situations: A client dumping many ad-hoc metadata keys (telemetry tags, feature flags) into extensions instead of using dedicated model fields, or a loop that auto-generates extension keys.
Related errors
- Agent extensions exceeds {} bytes
- Agent tags exceeds %s persisted characters
- Runtime Endpoint projection exceeds 1000 items
- Agent extensions contains a non-string JSON object key
- Unable to serialize Agent extensions
AI-assisted analysis of alibaba/nacos@9b989acdf1 (2026-08-14).
Data as JSON: /api/errors/734d5e323185d58c.
Report an issue: GitHub.