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
- Check hub logs for the full exception stack trace (details are logged server-side, not returned)
- Verify the skill file exists in object storage and the download URL is valid/not expired
- Confirm object storage (MinIO/S3) is reachable and healthy
- 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
- Validate skillId existence before downloading
- Use refreshable credentials/short-URL regeneration for object storage downloads
- Keep skill artifacts and manifests together and verify on upload
- Alert on object-storage error rates affecting skill reads
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
- REPO_FILE_DOWNLOAD_FAILED
- Skill resource is unavailable
- MCP tool call failed, tool=
- run_failed
- Skill resource download failed: HTTP
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)