iflytek/astron-agent · error · RuntimeException
Assistant backend data does not conform to specifications
Error message
Assistant backend data does not conform to specifications
What it means
Thrown by BotChainServiceImpl.getNewNodeId when regenerating a node ID during workflow cloning (replaceNodeId) and the original node id string contains no ':' separator. The method expects ids of the form '<prefix>:<suffix>' and rewrites the suffix with a UUID; a colon-less id means the stored canvas JSON (open/gcy fields) does not match the expected backend schema.
Solutions
- Find the offending node id in the log line '***** {id} no colon found' and inspect the bot's open/gcy JSON to locate the malformed node.
- Migrate the legacy node id to the '<prefix>:<uuid>' format (or add a tolerant branch that generates a fresh prefixed id instead of throwing).
- If caused by an import/export path, regenerate node ids server-side after import so all ids conform before replaceNodeId runs.
- Pin the workflow schema version and reject/repair templates whose node ids lack the separator at import time.
- Add a data-migration script for existing rows whose canvas JSON contains colon-less node ids.
Example fix
// before
public static String getNewNodeId(String original) {
int colonIndex = original.indexOf(':');
if (colonIndex != -1) {
return original.substring(0, colonIndex + 1) + UUID.randomUUID();
}
log.info("***** {} no colon found", original);
throw new RuntimeException("Assistant backend data does not conform to specifications");
}
// after
public static String getNewNodeId(String original) {
int colonIndex = original.indexOf(':');
if (colonIndex != -1) {
return original.substring(0, colonIndex + 1) + UUID.randomUUID();
}
// legacy ids without prefix: mint a fresh prefixed id instead of failing the clone
log.warn("Node id has no colon prefix, generating new id: {}", original);
return "node:" + UUID.randomUUID();
} Defensive patterns
Strategy: validation
Validate before calling
// before cloning/importing a workflow, validate node ids in the canvas JSON
JSONArray nodes = JSONObject.parseObject(botMap.getOpen()).getJSONArray("nodes");
for (Object o : nodes) {
String id = ((JSONObject) o).getString("id");
if (id == null || !id.contains(":")) {
throw new IllegalArgumentException("Node id missing '<prefix>:' separator: " + id);
}
} Try / catch
try {
BotChainServiceImpl.replaceNodeId(botMap);
} catch (RuntimeException e) {
if (e.getMessage().contains("does not conform to specifications")) {
// a node id lacked the colon prefix: inspect 'no colon found' logs,
// repair/migrate the canvas JSON, then retry the clone
}
} Prevention
- Validate node id format ('<prefix>:<suffix>') at workflow import and save time, not only at clone time.
- Run a one-time migration over stored open/gcy JSON to normalize legacy colon-less ids.
- Reject exported templates whose canvas JSON doesn't match the server schema at upload.
- Never hand-edit open/gcy JSON columns directly in the DB.
- Watch the 'no colon found' log as a canary for schema drift from upstream MaaS.
When it happens
Trigger: Cloning/duplicating a bot whose workflow canvas JSON contains legacy or hand-edited node ids without the '<prefix>:' prefix; imported/exported workflow templates produced by a different tool version; upstream MaaS data whose node id format changed between versions.
Common situations: Older workflows created before the id-format convention was introduced; workflows imported via exported templates that bypassed server-side id generation; manual DB edits of the open/gcy JSON columns; a MaaS upgrade that changed node id generation.
Understand the failure class
Background: "invalid id" errors: invalid identifier format — why libraries reject IDs before lookup, and how to fix them — this error's family across 37 libraries.
Related errors
AI-assisted analysis of iflytek/astron-agent@5e758547a8 (2026-09-12).
Data as JSON: /api/errors/5affff03454d59ee.
Report an issue: GitHub.
Appendix: source
Thrown at console/backend/hub/src/main/java/com/iflytek/astron/console/hub/service/workflow/impl/BotChainServiceImpl.java:141
botMap.setOpen(openStr);
botMap.setGcy(gcyStr);
}
/**
* Get new node ID
*
* @param original Original node ID string
* @return New node ID string, if the original string contains a colon, add a random UUID after the
* colon, otherwise throw an exception
*/
public static String getNewNodeId(String original) {
int colonIndex = original.indexOf(':');
if (colonIndex != -1) {
return original.substring(0, colonIndex + 1) + UUID.randomUUID();
}
// If no colon is found, return the original string
log.info("***** {} no colon found", original);
throw new RuntimeException("Assistant backend data does not conform to specifications");
}
}
View on GitHub (pinned to 5e758547a8)