dify/web/features/new-rag/create-knowledge-workflow.ts
Stephen Zhou 2a0661a769
feat(dataset): add New Knowledge creation flow (#39315)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-23 07:25:14 +00:00

91 lines
2.7 KiB
TypeScript

import type { KnowledgeSpaceCreationResponse } from '@dify/contracts/knowledge-fs/types.gen'
import { consoleClient } from '@/service/client'
export const NAME_MAX_LENGTH = 160
export const DESCRIPTION_MAX_LENGTH = 2000
export type KnowledgeVisibility = 'all_members' | 'only_me'
type CreateKnowledgeValues = {
existingKnowledge?: KnowledgeSpaceCreationResponse
description: string
idempotencyKey: string
name: string
onCreated: (knowledgeSpace: KnowledgeSpaceCreationResponse) => void
visibility: KnowledgeVisibility
}
export class KnowledgeCreationError extends Error {
readonly stage: 'create' | 'policy'
readonly originalError: unknown
readonly createdKnowledge?: KnowledgeSpaceCreationResponse
constructor(
stage: 'create' | 'policy',
originalError: unknown,
createdKnowledge?: KnowledgeSpaceCreationResponse,
) {
super(`Knowledge creation failed during ${stage}`)
this.name = 'KnowledgeCreationError'
this.stage = stage
this.originalError = originalError
this.createdKnowledge = createdKnowledge
}
}
function responseStatus(error: unknown) {
if (error instanceof Response) return error.status
if (error && typeof error === 'object' && 'status' in error) return error.status
if (error && typeof error === 'object' && 'data' in error) {
const data = error.data
if (data && typeof data === 'object' && 'status' in data) return data.status
}
}
export function isDefinitiveCreationRejection(error: unknown) {
const status = responseStatus(error)
return status === 400 || status === 401 || status === 403 || status === 422
}
export async function createKnowledge(
values: CreateKnowledgeValues,
): Promise<KnowledgeSpaceCreationResponse> {
let created = values.existingKnowledge
if (!created) {
try {
created = await consoleClient.knowledgeFs.createKnowledgeSpace({
body: {
description: values.description || undefined,
idempotencyKey: values.idempotencyKey,
name: values.name,
},
})
} catch (error) {
throw new KnowledgeCreationError('create', error)
}
}
values.onCreated(created)
try {
if (values.visibility === 'all_members') {
const policy = await consoleClient.knowledgeFs.getKnowledgeSpacesByIdAccessPolicy({
params: { id: created.id },
})
if (policy.visibility !== values.visibility) {
await consoleClient.knowledgeFs.patchKnowledgeSpacesByIdAccessPolicy({
body: {
expectedRevision: policy.revision,
partialMemberSubjectIds: [],
visibility: values.visibility,
},
params: { id: created.id },
})
}
}
} catch (error) {
throw new KnowledgeCreationError('policy', error, created)
}
return created
}