UNPKG

nextra-dify-plugin

Version:

A Next.js webpack plugin for integrating Dify knowledge base with Nextra documentation

247 lines (241 loc) 7.25 kB
import { Compiler } from 'webpack'; interface DifyPluginOptions { /** Dify知识库ID */ knowledgeBaseId: string; /** Dify API Token */ apiToken: string; /** 项目名称,用作文档命名前缀 */ projectName: string; /** 是否启用上传功能,通常在build场景下使用 */ enableUpload?: boolean; /** 是否启用MDX文件分割 */ enableSplit?: boolean; /** 分割标记,用于识别MDX文件中的分割点 */ splitMarker?: string; /** 包含规则,支持glob模式 */ include?: string[]; /** 排除规则,支持glob模式 */ exclude?: string[]; /** Dify API基础URL */ apiBaseUrl?: string; /** 分割时每个chunk的最大字符数 */ maxChunkSize?: number; /** 超出最大分隔字数块需要保证在这个标志之前,支持正则表达式字符串 */ maxChunkSplitBeforeMarker?: string; /** 处理规则 */ process_rule?: ProcessRule; /** 在上传之前是否删除所有文档 */ deleteAllDocumentsBeforeUpload?: boolean; } interface ProcessRule { /** 清洗、分段模式 */ mode: 'automatic' | 'custom'; indexing_technique: 'high_quality' | 'economy'; /** 自定义规则(自动模式下,该字段为空) */ rules?: { /** 预处理规则 */ pre_processing_rules?: PreProcessingRule[]; /** 父分段的召回模式 */ parent_mode?: 'full-doc' | 'paragraph'; /** 分段规则 */ segmentation?: SegmentationRule; /** 子分段规则 */ subchunk_segmentation?: SubchunkSegmentationRule; }; /** 文档类型 */ doc_type?: DocumentType; /** 文档元数据(如提供文档类型则必填,字段因文档类型而异) */ doc_metadata?: DocumentMetadata; /** 索引内容的形式 */ doc_form: 'text_model' | 'hierarchical_model' | 'qa_model'; /** 文档语言 */ doc_language?: string; } interface PreProcessingRule { /** 预处理规则的唯一标识符 */ id: 'remove_extra_spaces' | 'remove_urls_emails'; /** 是否选中该规则,不传入文档 ID 时代表默认值 */ enabled: boolean; } interface SegmentationRule { /** 自定义分段标识符,目前仅允许设置一个分隔符。默认为 \n */ separator?: string; /** 最大长度(token)默认为 1000 */ max_tokens?: number; } interface SubchunkSegmentationRule { /** 分段标识符,目前仅允许设置一个分隔符。默认为 */ separator?: string; /** 最大长度 (token) 需要校验小于父级的长度 */ max_tokens?: number; /** 分段重叠指的是在对数据进行分段时,段与段之间存在一定的重叠部分 */ chunk_overlap?: number; } type DocumentType = 'book' | 'web_page' | 'paper' | 'social_media_post' | 'wikipedia_entry' | 'personal_document' | 'business_document' | 'im_chat_log' | 'synced_from_notion' | 'synced_from_github' | 'others'; interface DocumentMetadata { title?: string; language?: string; author?: string; publisher?: string; publication_date?: string; publish_date?: string; isbn?: string; category?: string; url?: string; topic?: string; keywords?: string; description?: string; } interface MDXFile { /** 文件路径 */ path: string; /** 文件内容 */ content: string; /** frontmatter数据 */ frontmatter: Record<string, any>; /** 文档标题 */ title: string; /** 菜单层级路径 */ menuPath: string[]; } interface DocumentChunk { /** chunk标识符 */ id: string; /** chunk内容 */ content: string; /** 文档名称 */ name: string; /** chunk在文档中的序号 */ index: number; } interface DifyDocument { /** 文档ID */ id: string; /** 文档名称 */ name: string; /** 创建时间 */ created_at: string; /** 更新时间 */ updated_at: string; /** 文档状态 */ status: string; } interface DifyApiResponse<T = any> { /** 响应数据 */ data: T; /** 是否成功 */ success: boolean; /** 错误信息 */ message?: string; } interface UploadResponse { /** 文档ID */ document_id: string; /** 文档名称 */ name: string; /** 操作类型:create或update */ operation: 'create' | 'update'; } declare class DifyClient { private client; private knowledgeBaseId; private documents; private process_rule; constructor(apiToken: string, knowledgeBaseId: string, baseURL: string | undefined, process_rule: ProcessRule); /** * 获取知识库中的所有文档 */ initDocuments(): Promise<DifyDocument[]>; /** * 获取文档 */ getDocuments(): Promise<DifyDocument[]>; /** * 根据文档名称查找文档 */ findDocumentByName(name: string): Promise<DifyDocument | null>; deleteModuleDocuments(moduleName: string): Promise<void>; /** * 删除所有文档 */ deleteAllDocumentsForCurProject(projectName: string): Promise<void>; /** * 删除文档 */ deleteDocument(documentId: string): Promise<void>; /** * 创建新文档 */ createDocument(name: string, content: string): Promise<UploadResponse>; /** * 更新现有文档 */ updateDocument(documentId: string, name: string, content: string): Promise<UploadResponse>; /** * 上传或更新文档 */ uploadDocument(name: string, content: string): Promise<UploadResponse>; } declare class MDXParser { private options; constructor(options: DifyPluginOptions); /** * 解析MDX文件 */ parseMDXFile(filePath: string, basePath: string): MDXFile; /** * 生成文档名称 */ generateDocumentName(mdxFile: MDXFile, chunkIndex?: number): string; /** * 分割MDX内容 */ splitContent(content: string): string[]; /** * 将MDX文件转换为文档块 */ convertToDocumentChunks(mdxFile: MDXFile): DocumentChunk[]; /** * 清理和格式化内容 */ cleanContent(content: string): string; /** * 处理MDX文件,返回准备上传的文档块 */ processMDXFile(filePath: string, basePath: string): DocumentChunk[]; } declare class NextraDifyPlugin { private options; private difyClient; private mdxParser; constructor(options: DifyPluginOptions); /** * webpack插件应用方法 */ apply(compiler: Compiler): void; /** * 处理所有文档 */ processDocuments(context: string): Promise<void>; /** * 查找所有MDX文件 */ findMDXFiles(basePath: string): Promise<string[]>; /** * 处理单个文件 */ processFile(filePath: string, basePath: string): Promise<void>; /** * 上传文档块 */ uploadChunk(chunk: { name: string; content: string; }): Promise<void>; /** * 验证配置 */ static validateOptions(options: DifyPluginOptions): void; } export { DifyClient, MDXParser, NextraDifyPlugin }; export type { DifyApiResponse, DifyDocument, DifyPluginOptions, DocumentChunk, MDXFile, UploadResponse };