iflytek/astron-agent · warning

read_failed

read_failed

Error message

read_skill completed, skillId={}, status=failed, errorType={}

What it means

ReadSkillToolCallback.call reads a skill's content: it downloads the skill text via runtime.downloadText(downloadUrl) and returns its manifest. Any exception (download failure, invalid manifest, missing skill) is caught, logged as a warning with only the exception class name, and converted to a JSON result with error code 'read_failed' — details are deliberately not returned to the model.

Solutions

  1. Check hub logs for the full exception stack trace (details are logged server-side, not returned)
  2. Verify the skill file exists in object storage and the download URL is valid/not expired
  3. Confirm object storage (MinIO/S3) is reachable and healthy
  4. Re-upload or recreate the skill if its artifact is missing

Example fix

null
Defensive patterns

Strategy: try-catch

Try / catch

try { result.put("content", runtime.downloadText(downloadUrl)); } catch (Exception e) { log.warn("read_skill failed, skillId={}, errorType={}", skillId, e.getClass().getSimpleName(), e); result.put("error", "read_failed"); }

Prevention

When it happens

Trigger: downloadText fails (skill file missing in object storage, presigned URL expired, network error), manifest() throws, or the skillId does not exist in the runtime while the agent calls the read_skill tool.

Common situations: Skill artifact deleted or not uploaded to storage; expired/invalid download URL; storage service (MinIO/S3) outage; malformed skill package; skill deleted between listing and reading.

Understand the failure class

Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.

Related errors


AI-assisted analysis of iflytek/astron-agent@5e758547a8 (2026-09-12). Data as JSON: /api/errors/4231e399ca208132. Report an issue: GitHub.

Appendix: source

Thrown at console/backend/hub/src/main/java/com/iflytek/astron/console/hub/service/chat/springai/ReadSkillToolCallback.java:76

        result.put("description", description);
        try {
            if (StringUtils.isNotBlank(requestedPath)) {
                JSONObject resource = findResource(requestedPath);
                if (resource == null) {
                    result.put("path", requestedPath);
                    result.put("error", "resource_not_found");
                    result.put("available_resources", manifest());
                    return result.toJSONString();
                }
                result.put("path", normalizePath(resource.getString("path")));
                result.put("content", runtime.downloadText(resource.getString("downloadUrl")));
                return logSuccess(result);
            }
            result.put("content", runtime.downloadText(downloadUrl));
            result.put("resources", manifest());
            return logSuccess(result);
        } catch (Exception e) {
            log.warn(
                    "read_skill completed, skillId={}, status=failed, errorType={}",
                    skillId,
                    e.getClass().getSimpleName());
            result.put("error", "read_failed");
            return result.toJSONString();
        }
    }

    private String logSuccess(JSONObject result) {
        String serialized = result.toJSONString();
        log.info(
                "read_skill completed, skillId={}, status=success, responseBytes={}",
                skillId,
                serialized.getBytes(java.nio.charset.StandardCharsets.UTF_8).length);
        return serialized;
    }

    private String parsePath(String toolInput) {

View on GitHub (pinned to 5e758547a8)