iflytek/astron-agent · error · BusinessException

REPO_FILE_NOT_EXIST

REPO_FILE_NOT_EXIST

Error message

REPO_FILE_NOT_EXIST

What it means

BusinessException(REPO_FILE_NOT_EXIST) thrown in enableKnowledge after the knowledge row is found: getOnly(QueryWrapper uuid = knowledge.getFileId()) returns null because no FileInfoV2 row matches the knowledge's fileId uuid. The knowledge record's backing file reference is dangling, so the enable flow cannot resolve the repo context and aborts.

Solutions

  1. Re-upload or re-link the backing file, then retry enabling the knowledge entry.
  2. Delete and recreate the knowledge entry if its file is permanently gone.
  3. Run a consistency check joining knowledge.file_id against file_info_v2.uuid to find orphaned rows.
  4. Add cascade cleanup (or a guard) so deleting a file removes/disables its dependent knowledge entries.

Example fix

// before: deleting a file leaves orphaned knowledge
await repoApi.deleteFile(fileId);
// after: clean up dependent knowledge entries first
const dependents = await knowledgeApi.listByFileId(fileId);
for (const k of dependents) await knowledgeApi.delete(k.id);
await repoApi.deleteFile(fileId);
Defensive patterns

Strategy: validation

Validate before calling

const file = await repoApi.getFileByUuid(knowledge.fileId).catch(() => null);
if (!file) throw new Error(`knowledge ${knowledge.id} references missing file ${knowledge.fileId}`);

Type guard

function hasBackingFile(knowledge, file) {
  return Boolean(file) && file.uuid === knowledge.fileId;
}

Try / catch

try {
  await knowledgeApi.enable(id, enabled);
} catch (e) {
  if (e.code === 'REPO_FILE_NOT_EXIST') {
    throw new Error('backing file missing; re-upload the source file before enabling');
  }
  throw e;
}

Prevention

When it happens

Trigger: Enabling a knowledge entry whose backing file was deleted (file removed but knowledge row kept), or whose fileId uuid was never correctly populated / points at another environment's files.

Common situations: Orphaned knowledge rows left behind after file deletion without cascade cleanup; data migrations that regenerated FileInfoV2 records with new uuids; imports between environments breaking uuid references.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


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

Appendix: source

Thrown at console/backend/toolkit/src/main/java/com/iflytek/astron/console/toolkit/service/repo/KnowledgeService.java:243

     * @return knowledge ID
     * @throws BusinessException if knowledge not found or operation fails
     */
    public String enableKnowledge(String id, Integer enabled) {
        MysqlKnowledge mysqlKnowledge = knowledgeMapper.selectById(id);
        if (mysqlKnowledge == null) {
            throw new BusinessException(ResponseEnum.REPO_KNOWLEDGE_NOT_EXIST);
        }
        Knowledge knowledge = new Knowledge();
        BeanUtils.copyProperties(mysqlKnowledge, knowledge);

        Integer originEnabled = knowledge.getEnabled();
        if (Objects.equals(originEnabled, enabled)) {
            return knowledge.getId();
        }

        FileInfoV2 fileInfoV2 = fileInfoV2Service.getOnly(new QueryWrapper<FileInfoV2>().eq("uuid", knowledge.getFileId()));
        if (fileInfoV2 == null) {
            throw new BusinessException(ResponseEnum.REPO_FILE_NOT_EXIST);
        }

        RepoContext repoContext = this.getRepoContext(fileInfoV2.getId());

        JSONObject content = knowledge.getContent();
        String auditSuggest = content.getString("auditSuggest");
        if (!(StringUtils.isEmpty(auditSuggest) || "pass".equals(auditSuggest)) && enabled == 1) {
            return knowledge.getId();
        }

        knowledge.setEnabled(enabled);
        knowledge.setUpdatedAt(LocalDateTime.now());

        try {
            String source = fileInfoV2.getSource();
            if (enabled == 1) {// Enable - re-add
                JSONArray jsonArray = new JSONArray();

View on GitHub (pinned to 5e758547a8)