dify/web/features/new-rag/knowledge-fs-task-error.ts
2026-08-21 15:31:59 +08:00

143 lines
7.8 KiB
TypeScript

import type { KnowledgeFsPublicFailureResponse } from '@dify/contracts/api/console/knowledge-fs/types.gen'
export type KnowledgeFsTaskFailureMessageKey =
| 'newKnowledge.taskFailure.access'
| 'newKnowledge.taskFailure.configuration'
| 'newKnowledge.taskFailure.conflict'
| 'newKnowledge.taskFailure.documentProcessing'
| 'newKnowledge.taskFailure.internal'
| 'newKnowledge.taskFailure.invalid'
| 'newKnowledge.taskFailure.modelConfiguration'
| 'newKnowledge.taskFailure.modelService'
| 'newKnowledge.taskFailure.parser'
| 'newKnowledge.taskFailure.research'
| 'newKnowledge.taskFailure.source'
| 'newKnowledge.taskFailure.temporary'
| 'newKnowledge.taskFailure.upload'
const failureMessageKeyByCode = {
DOCUMENT_COMPILATION_FAILED: 'newKnowledge.taskFailure.documentProcessing',
DOCUMENT_COMPILATION_RETRYABLE: 'newKnowledge.taskFailure.documentProcessing',
DOCUMENT_DISABLED: 'newKnowledge.taskFailure.conflict',
DOCUMENT_PARSER_INPUT_INVALID: 'newKnowledge.taskFailure.parser',
DOCUMENT_PARSER_NOT_CONFIGURED: 'newKnowledge.taskFailure.parser',
DOCUMENT_PARSER_RATE_LIMITED: 'newKnowledge.taskFailure.parser',
DOCUMENT_PARSER_RESPONSE_INVALID: 'newKnowledge.taskFailure.parser',
DOCUMENT_PARSER_UNAVAILABLE: 'newKnowledge.taskFailure.parser',
EMBEDDING_DIMENSION_INVALID: 'newKnowledge.taskFailure.modelConfiguration',
EMBEDDING_DIMENSION_UNSUPPORTED: 'newKnowledge.taskFailure.modelConfiguration',
EXECUTION_ATTEMPTS_EXHAUSTED: 'newKnowledge.taskFailure.documentProcessing',
KNOWLEDGE_FS_ACCESS_DENIED: 'newKnowledge.taskFailure.access',
KNOWLEDGE_FS_CONFLICT: 'newKnowledge.taskFailure.conflict',
KNOWLEDGE_FS_INTERNAL_ERROR: 'newKnowledge.taskFailure.internal',
KNOWLEDGE_FS_INVALID_REQUEST: 'newKnowledge.taskFailure.invalid',
KNOWLEDGE_FS_NOT_FOUND: 'newKnowledge.taskFailure.access',
KNOWLEDGE_FS_RATE_LIMITED: 'newKnowledge.taskFailure.temporary',
KNOWLEDGE_FS_TIMEOUT: 'newKnowledge.taskFailure.temporary',
KNOWLEDGE_FS_UNAVAILABLE: 'newKnowledge.taskFailure.temporary',
KNOWLEDGE_SPACE_MANIFEST_NOT_FOUND: 'newKnowledge.taskFailure.modelConfiguration',
KNOWLEDGE_SPACE_MODEL_CONFIGURATION_REQUIRED: 'newKnowledge.taskFailure.modelConfiguration',
MODEL_CAPABILITY_MISMATCH: 'newKnowledge.taskFailure.modelConfiguration',
MODEL_CONFIGURATION_STALE: 'newKnowledge.taskFailure.conflict',
MODEL_CREDENTIAL_INVALID: 'newKnowledge.taskFailure.modelConfiguration',
MODEL_CREDENTIAL_VALIDATION_UNAVAILABLE: 'newKnowledge.taskFailure.modelService',
MODEL_IDENTITY_MISMATCH: 'newKnowledge.taskFailure.modelConfiguration',
MODEL_PREFLIGHT_CANCELED: 'newKnowledge.taskFailure.modelService',
MODEL_PREFLIGHT_FAILED: 'newKnowledge.taskFailure.modelService',
MODEL_PREFLIGHT_TIMEOUT: 'newKnowledge.taskFailure.modelService',
MODEL_PREFLIGHT_UNAVAILABLE: 'newKnowledge.taskFailure.modelService',
MODEL_PROFILE_ACTIVATION_INCOMPLETE: 'newKnowledge.taskFailure.modelConfiguration',
MODEL_PROFILE_ACTIVATION_PERMISSION_REQUIRED: 'newKnowledge.taskFailure.access',
MODEL_RUNTIME_FAILED: 'newKnowledge.taskFailure.modelService',
MODEL_RUNTIME_TIMEOUT: 'newKnowledge.taskFailure.modelService',
MODEL_RUNTIME_UNAVAILABLE: 'newKnowledge.taskFailure.modelService',
MODEL_SELECTION_NOT_FOUND: 'newKnowledge.taskFailure.modelConfiguration',
RESEARCH_TASK_CAPABILITY_REVOKED: 'newKnowledge.taskFailure.access',
RESEARCH_TASK_DISPATCH_DEAD: 'newKnowledge.taskFailure.research',
RESEARCH_TASK_EXECUTION_ATTEMPTS_EXHAUSTED: 'newKnowledge.taskFailure.research',
RESEARCH_TASK_FAILED: 'newKnowledge.taskFailure.research',
RESEARCH_TASK_PERMISSION_SNAPSHOT_INVALID: 'newKnowledge.taskFailure.access',
RESEARCH_TASK_RUNTIME_SNAPSHOT_INVALID: 'newKnowledge.taskFailure.research',
SOURCE_BULK_ACTION_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_CREDENTIAL_CONFIG_INVALID: 'newKnowledge.taskFailure.source',
SOURCE_CREDENTIAL_MUTATION_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_CREDENTIAL_TEST_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_CREDENTIAL_UNAVAILABLE: 'newKnowledge.taskFailure.source',
SOURCE_DOCUMENT_MATERIALIZATION_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_DOCUMENT_REPLACEMENT_SAGA_REQUIRED: 'newKnowledge.taskFailure.source',
SOURCE_ONLINE_DOCUMENT_CONFIG_INVALID: 'newKnowledge.taskFailure.source',
SOURCE_ONLINE_DOCUMENT_IMPORT_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_ONLINE_DOCUMENT_PAGE_FETCH_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_ONLINE_DOCUMENT_REQUEST_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_ONLINE_DRIVE_CONFIG_INVALID: 'newKnowledge.taskFailure.source',
SOURCE_ONLINE_DRIVE_FILE_DOWNLOAD_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_ONLINE_DRIVE_IMPORT_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_ONLINE_DRIVE_REQUEST_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_OPERATION_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_SECRET_INTEGRITY_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_SECRET_REF_CONFLICT: 'newKnowledge.taskFailure.conflict',
SOURCE_SYNC_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_WEBSITE_CRAWL_CONFIG_INVALID: 'newKnowledge.taskFailure.source',
SOURCE_WEBSITE_CRAWL_FAILED: 'newKnowledge.taskFailure.source',
SOURCE_WORKFLOW_FAILED: 'newKnowledge.taskFailure.source',
UPLOAD_INITIALIZATION_FAILED: 'newKnowledge.taskFailure.upload',
UPLOAD_INTEGRITY_MISMATCH: 'newKnowledge.taskFailure.upload',
} satisfies Record<KnowledgeFsPublicFailureResponse['code'], KnowledgeFsTaskFailureMessageKey>
export function knowledgeFsTaskFailureMessageKey(
failure: KnowledgeFsPublicFailureResponse | undefined,
legacyCode?: string,
): KnowledgeFsTaskFailureMessageKey | undefined {
if (!failure && !legacyCode) return
const normalizedLegacyCode = legacyCode?.toUpperCase()
if (normalizedLegacyCode && normalizedLegacyCode in failureMessageKeyByCode)
return failureMessageKeyByCode[normalizedLegacyCode as keyof typeof failureMessageKeyByCode]
if (failure) {
const messageKey = failureMessageKeyByCode[failure.code]
if (messageKey) return messageKey
}
if (failure?.action?.startsWith('configure_')) return 'newKnowledge.taskFailure.configuration'
if (failure?.action === 'reupload') return 'newKnowledge.taskFailure.invalid'
switch (failure?.category) {
case 'authorization':
case 'not_found':
return 'newKnowledge.taskFailure.access'
case 'configuration':
return 'newKnowledge.taskFailure.configuration'
case 'conflict':
return 'newKnowledge.taskFailure.conflict'
case 'dependency':
case 'rate_limit':
case 'timeout':
return 'newKnowledge.taskFailure.temporary'
case 'validation':
return 'newKnowledge.taskFailure.invalid'
case 'canceled':
case 'internal':
return 'newKnowledge.taskFailure.internal'
}
const code = normalizedLegacyCode ?? ''
if (/AUTH|DENIED|NOT_FOUND|PERMISSION/u.test(code)) return 'newKnowledge.taskFailure.access'
if (
/CREDENTIAL|CONFIG|MODEL_SELECTION|MODEL_CAPABILITY|MODEL_IDENTITY|NOT_CONFIGURED/u.test(code)
)
return 'newKnowledge.taskFailure.configuration'
if (/CONFLICT|STALE|CHANGED/u.test(code)) return 'newKnowledge.taskFailure.conflict'
if (/INVALID|MISMATCH|TOO_LARGE|UNSUPPORTED/u.test(code))
return 'newKnowledge.taskFailure.invalid'
if (/TIMEOUT|RATE_LIMIT|UNAVAILABLE|PROVIDER|PARSER|SOURCE/u.test(code))
return 'newKnowledge.taskFailure.temporary'
return 'newKnowledge.taskFailure.internal'
}
export function knowledgeFsTaskRecoveryPath(
failure: KnowledgeFsPublicFailureResponse | undefined,
knowledgeSpaceId: string,
): string | undefined {
if (failure?.action === 'configure_model') return `/datasets/new/${knowledgeSpaceId}/settings`
if (failure?.action === 'configure_source') return `/datasets/new/${knowledgeSpaceId}/sources`
if (failure?.action === 'reupload') return `/datasets/new/${knowledgeSpaceId}/documents?upload=1`
}