{"record":{"id":"9fadbc291ab7a028","repo":"langgenius/dify","slug":"knowledge-creation-failed-during-create","errorCode":null,"errorMessage":"Knowledge creation failed during create","messagePattern":"Knowledge creation failed during create","errorType":"exception","errorClass":"KnowledgeCreationError","httpStatus":null,"severity":"error","filePath":"web/features/new-rag/create-knowledge-workflow.ts","lineNumber":64,"sourceCode":"  const status = responseStatus(error)\n  return status === 400 || status === 401 || status === 403 || status === 422\n}\n\nexport async function createKnowledge(\n  values: CreateKnowledgeValues,\n): Promise<KnowledgeSpaceCreationResponse> {\n  let created = values.existingKnowledge\n  if (!created) {\n    try {\n      created = await consoleClient.knowledgeFs.createKnowledgeSpace({\n        body: {\n          description: values.description || undefined,\n          idempotencyKey: values.idempotencyKey,\n          name: values.name,\n        },\n      })\n    } catch (error) {\n      throw new KnowledgeCreationError('create', error)\n    }\n  }\n  values.onCreated(created)\n\n  try {\n    if (values.visibility === 'all_members') {\n      const policy = await consoleClient.knowledgeFs.getKnowledgeSpacesByIdAccessPolicy({\n        params: { id: created.id },\n      })\n      if (policy.visibility !== values.visibility) {\n        await consoleClient.knowledgeFs.patchKnowledgeSpacesByIdAccessPolicy({\n          body: {\n            expectedRevision: policy.revision,\n            partialMemberSubjectIds: [],\n            visibility: values.visibility,\n          },\n          params: { id: created.id },\n        })","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/langgenius/dify/blob/ef8544b173fd6cd7a8e71df2cab576e52bebbfbc/web/features/new-rag/create-knowledge-workflow.ts#L46-L82","documentation":"Wrapped KnowledgeCreationError thrown when the createKnowledgeSpace API call (consoleClient.knowledgeFs.createKnowledgeSpace) rejects. It captures stage='create' and the original error so callers can distinguish a creation failure from a later policy failure. Because no knowledge space was created, no createdKnowledge is attached.","triggerScenarios":"Fires when values.existingKnowledge is undefined and the POST to create the knowledge space fails for any reason: 400 validation (duplicate name, over-length), 401/403 auth, 422 schema, 5xx server, or network error.","commonSituations":"Duplicate knowledge space name already exists, the idempotencyKey was reused with different payload, the user's session expired, or the KnowledgeFS backend is unreachable. The companion isDefinitiveCreationRejection helper identifies 400/401/403/422 as non-retryable.","solutions":["Inspect error.originalError.status to classify: 409/duplicate -> prompt for a new name; 401/403 -> re-auth; 5xx/network -> retry.","Reuse the same idempotencyKey when retrying with an identical payload to avoid duplicate spaces.","If isDefinitiveCreationRejection(error.originalError) is true, do not retry automatically.","Validate name length against NAME_MAX_LENGTH (160) and description against DESCRIPTION_MAX_LENGTH (2000) before calling."],"exampleFix":"// before\ncatch (error) {\n  throw new KnowledgeCreationError('create', error)\n}\n\n// after - caller-side classification\ntry {\n  return await createKnowledge(values)\n} catch (e) {\n  if (e instanceof KnowledgeCreationError && e.stage === 'create') {\n    if (isDefinitiveCreationRejection(e.originalError)) showFormError(e.originalError)\n    else scheduleRetry(values.idempotencyKey)\n  }\n  throw e\n}","handlingStrategy":"try-catch","validationCode":"// Validate inputs before calling createKnowledge\nfunction validateKnowledgeInput(values: CreateKnowledgeValues): string | null {\n  if (!values.name?.trim()) return 'Name is required'\n  if (values.name.length > NAME_MAX_LENGTH) return `Name exceeds ${NAME_MAX_LENGTH} chars`\n  if (values.description.length > DESCRIPTION_MAX_LENGTH) return `Description exceeds ${DESCRIPTION_MAX_LENGTH} chars`\n  if (!values.idempotencyKey) return 'Idempotency key is required'\n  return null\n}","typeGuard":"function isKnowledgeCreationError(e: unknown): e is KnowledgeCreationError {\n  return e instanceof KnowledgeCreationError\n}","tryCatchPattern":"try {\n  return await createKnowledge(values)\n} catch (e) {\n  if (e instanceof KnowledgeCreationError && e.stage === 'create') {\n    if (isDefinitiveCreationRejection(e.originalError)) throw new ValidationError(e.originalError)\n    // transient - safe to retry with same idempotencyKey\n    throw e\n  }\n  throw e\n}","preventionTips":["Generate a stable idempotencyKey per form submission so retries are safe.","Validate name/description lengths against NAME_MAX_LENGTH/DESCRIPTION_MAX_LENGTH before the call.","Use isDefinitiveCreationRejection to avoid retrying 400/401/403/422.","Check for duplicate names before submit to reduce 409s."],"tags":["frontend","knowledge","rag","api-error","error-wrapping"],"backgroundTag":null,"analyzedSha":"ef8544b173fd6cd7a8e71df2cab576e52bebbfbc","analyzedAt":"2026-08-12T05:15:17.394Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}