UNPKG

nextra-dify-plugin

Version:

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

327 lines (248 loc) 8.43 kB
# Nextra Dify Plugin 一个用于将 Nextra 文档项目与 Dify 知识库集成的 Next.js Webpack 插件。 ## ✨ 特性 - 🔄 **自动同步**: 自动将 Nextra 文档同步到 Dify 知识库 - 📝 **MDX 支持**: 智能解析 MDX 文件内容和 frontmatter - ✂️ **智能分割**: 支持自定义分割规则,将长文档分割为多个知识块 - 🎯 **灵活配置**: 支持包含/排除规则,精确控制同步范围 - 🏗️ **构建集成**: 无缝集成到 Next.js 构建流程 - 🔍 **智能命名**: 基于文件路径和菜单结构的智能文档命名 - 🎛️ **高级处理**: 支持 Dify 完整的文档处理规则配置 - 📦 **ESM 支持**: 支持 ES 模块和 CommonJS 双重导入方式 ## 📦 安装 ```bash # Using npm npm install nextra-dify-plugin # Using yarn yarn add nextra-dify-plugin # Using pnpm pnpm add nextra-dify-plugin ``` ## 🚀 快速开始 ### 1. 环境变量配置 在项目根目录创建 `.env.local` 文件: ```env # Dify API 配置 DIFY_KNOWLEDGE_BASE_ID=your-knowledge-base-id DIFY_API_TOKEN=your-api-token # 可选:自定义 API 地址 DIFY_API_BASE_URL=https://api.dify.ai/v1 ``` ### 2. Next.js 配置 #### ESM 方式 (推荐) ```javascript // next.config.mjs import { NextraDifyPlugin } from 'nextra-dify-plugin' /** @type {import('next').NextConfig} */ const nextConfig = { webpack: (config, { dev, isServer }) => { // 只在生产构建的客户端侧启用 if (!dev && !isServer) { config.plugins.push( new NextraDifyPlugin({ knowledgeBaseId: process.env.DIFY_KNOWLEDGE_BASE_ID, apiToken: process.env.DIFY_API_TOKEN, projectName: 'my-docs', enableUpload: true, enableSplit: true, splitMarker: '<!-- split -->', include: ['pages/**/*.mdx', 'docs/**/*.mdx'], exclude: ['node_modules/**', '.next/**'], maxChunkSize: 4000, maxChunkSplitBeforeMarker: '^##\\s', // 正则:只匹配行首的二级标题 }) ) } return config }, } export default nextConfig ``` #### CommonJS 方式 ```javascript // next.config.js const { NextraDifyPlugin } = require('nextra-dify-plugin') /** @type {import('next').NextConfig} */ const nextConfig = { webpack: (config, { dev, isServer }) => { if (!dev && !isServer) { config.plugins.push( new NextraDifyPlugin({ knowledgeBaseId: process.env.DIFY_KNOWLEDGE_BASE_ID, apiToken: process.env.DIFY_API_TOKEN, projectName: 'my-docs', enableUpload: true, enableSplit: true, splitMarker: '<!-- split -->', include: ['pages/**/*.mdx', 'docs/**/*.mdx'], exclude: ['node_modules/**', '.next/**'], }) ) } return config }, } module.exports = nextConfig ``` ## ⚙️ 配置选项 ### 基础配置 | 选项 | 类型 | 必需 | 默认值 | 说明 | |------|------|------|--------|------| | `knowledgeBaseId` | `string` | ✅ | - | Dify 知识库 ID | | `apiToken` | `string` | ✅ | - | Dify API Token | | `projectName` | `string` | ✅ | - | 项目名称,用作文档命名前缀 | | `enableUpload` | `boolean` | ❌ | `false` | 是否启用上传功能 | | `enableSplit` | `boolean` | ❌ | `false` | 是否启用内容分割 | | `splitMarker` | `string` | ❌ | `'---'` | 分割标记 | | `include` | `string[]` | ❌ | `['**/*.mdx']` | 包含规则 (glob 模式) | | `exclude` | `string[]` | ❌ | `['node_modules/**', '.next/**']` | 排除规则 (glob 模式) | | `apiBaseUrl` | `string` | ❌ | `'https://api.dify.ai/v1'` | Dify API 基础 URL | | `maxChunkSize` | `number` | ❌ | `5000` | 分割时每个 chunk 的最大字符数 | | `maxChunkSplitBeforeMarker` | `string` | ❌ | - | 超出最大字符数时,尝试在此标志前截断,支持正则表达式 | ### 高级处理规则配置 插件支持 Dify 的完整文档处理规则配置: ```javascript config.plugins.push( new NextraDifyPlugin({ // ... 基础配置 process_rule: { mode: 'custom', // 'automatic' | 'custom' pre_processing_rules: [ { id: 'remove_extra_spaces', enabled: true }, { id: 'remove_urls_emails', enabled: false } ], segmentation: { separator: '\n\n\n\n', max_tokens: 2000, parent_mode: 'full-doc' // 'full-doc' | 'paragraph' }, subchunk_segmentation: { separator: '\n\n', max_tokens: 400, chunk_overlap: 50 }, doc_type: 'business_document', // 文档类型 doc_metadata: { title: 'API Documentation', language: 'Chinese', author: 'Development Team', description: 'Complete API reference' } } }) ) ``` #### 文档类型 (`doc_type`) 支持的文档类型: - `'book'` - 图书 - `'web_page'` - 网页 - `'paper'` - 学术论文/文章 - `'social_media_post'` - 社交媒体帖子 - `'wikipedia_entry'` - 维基百科条目 - `'personal_document'` - 个人文档 - `'business_document'` - 商业文档 - `'im_chat_log'` - 即时通讯记录 - `'synced_from_notion'` - Notion 同步文档 - `'synced_from_github'` - GitHub 同步文档 - `'others'` - 其他文档类型 ## 📝 使用方法 ### 基础使用 1. 配置环境变量和 Next.js 配置 2. 运行生产构建:`npm run build` 3. 插件会自动处理所有匹配的 MDX 文件并上传到 Dify 知识库 ### 内容分割 插件支持两种内容分割方式: #### 1. 使用分割标记 在 MDX 文件中使用分割标记来控制内容分割: ```mdx --- title: API 使用指南 description: 详细的 API 使用说明 --- # API 使用指南 这是 API 的基础介绍内容。 <!-- split --> ## 认证 API 使用 Bearer Token 进行认证。 <!-- split --> ## 基础用法 这里是具体的使用示例... ``` #### 2. 智能字符数分割 当内容长度超过 `maxChunkSize` 时,插件会自动分割内容。如果配置了 `maxChunkSplitBeforeMarker`,插件会尝试在指定标志前进行截断,避免破坏上下文连贯性。 该选项支持正则表达式,提供更精确的匹配控制: ```javascript plugin.push(new NextraDifyPlugin({ // ... 其他配置 maxChunkSize: 4000, // 常用正则表达式示例: maxChunkSplitBeforeMarker: '^##\\s', // 只匹配行首的二级标题 // maxChunkSplitBeforeMarker: '^###\\s', // 只匹配行首的三级标题 // maxChunkSplitBeforeMarker: '^##[^#]', // 匹配二级标题,但不匹配三级标题 // maxChunkSplitBeforeMarker: '^#{1,3}\\s', // 匹配一到三级标题 })) ``` 这样可以确保内容不会在段落中间被截断,而是在语义边界(如标题)处分割。正则表达式的使用让您可以精确控制分割点,避免 `##` 误匹配 `###` 等问题。 ### 文档命名规则 文档名称按以下规则生成: - 基础格式:`{projectName}_{菜单路径}` - 分割文档:`{projectName}_{菜单路径}_{序号}` 示例: - 文件:`pages/api/authentication.mdx` - 生成名称:`my-docs_pages_api_authentication` - 分割后:`my-docs_pages_api_authentication_1`, `my-docs_pages_api_authentication_2` ## 🔧 API 参考 ### NextraDifyPlugin 主插件类,实现 Webpack 插件接口。 ```typescript import { type DifyPluginOptions, NextraDifyPlugin } from 'nextra-dify-plugin' const plugin = new NextraDifyPlugin(options) ``` ### DifyClient Dify API 客户端,用于与 Dify 知识库交互。 ```typescript import { DifyClient } from 'nextra-dify-plugin' const client = new DifyClient(apiToken, knowledgeBaseId, baseURL, processRule) ``` ### MDXParser MDX 文件解析器,用于解析和处理 MDX 内容。 ```typescript import { MDXParser } from 'nextra-dify-plugin' const parser = new MDXParser(options) ``` ### 类型定义 ```typescript import type { DifyApiResponse, DifyDocument, DifyPluginOptions, DocumentChunk, DocumentMetadata, DocumentType, MDXFile, PreProcessingRule, ProcessRule, SegmentationRule, SubchunkSegmentationRule, UploadResponse } from 'nextra-dify-plugin' ``` ## 🛠️ 开发 ```bash # 安装依赖 pnpm install # 开发模式 pnpm dev # 构建 pnpm build # 运行测试 pnpm test # 代码检查 pnpm lint # 测试文档项目 pnpm test-docs pnpm test-docs:build pnpm test-docs:start ``` ## 📜 License MIT License - 查看 [LICENSE](LICENSE) 文件了解详细信息。