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

  1. 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.
  2. Migrate the legacy node id to the '<prefix>:<uuid>' format (or add a tolerant branch that generates a fresh prefixed id instead of throwing).
  3. If caused by an import/export path, regenerate node ids server-side after import so all ids conform before replaceNodeId runs.
  4. Pin the workflow schema version and reject/repair templates whose node ids lack the separator at import time.
  5. 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

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)