nextra-dify-plugin
Version:
A Next.js webpack plugin for integrating Dify knowledge base with Nextra documentation
247 lines (241 loc) • 7.25 kB
text/typescript
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 };