内容
<p align="center">
<img src="assets/NN.svg" alt="NarrativeNode" width="128" />
</p>
# NarrativeNode
**一款为作家设计的视觉剧情规划工具。采用节点编辑器的方式,为讲故事的人而设计。**
<p align="center">
<img src="docs/help/v2/main-app.webp" alt="NarrativeNode画布:带有实体芯片的场景节点,通过线连接" width="800" />
</p>
> ## 欢迎来到NarrativeNode!
>
> 嘿!NarrativeNode是我公开的第一个此类规模的项目。我是一名新独立开发者,我已经开发它几个月了,所以它的发布既令人兴奋又令人紧张。
>
> 我真的希望它对你有用,我也真诚地想听听你的想法。谢谢你来看!😄
>
> ~ Carasibana
---
## 什么是NarrativeNode?
NarrativeNode是一款适用于构建复杂故事的作家的规划工具。与其使用单独的人物卡、时间线电子表格和散落的笔记,不如在单一的视觉工作空间中规划整个故事:在一个画布中,每个场景都是一个节点,节点之间的线条显示人物、物品和地点如何在叙述中移动。
把它想象成一个故事流程图,每个框都知道其中每个人的状态和事物 - 以及记录场景3中的更改会自动将其更改传递到之后的每个场景。
如果你使用过ComfyUI或Blender的节点编辑器等工具,界面将立即熟悉。如果你没有,其核心思想很简单:故事的每个元素都生活在自己的节点中。你连接节点以显示故事的流程。你可以一次性查看整个情节,放大到某一特定时刻,或跟随某个角色的线索从其首次出现到最后出现,而不会失去对其他内容的关注。
---
## 它解决了什么问题?
规划一个只有一名角色和简单时间线的故事很简单。但大多数故事并非如此。
当你添加第二个视角角色、闪回、具有相互竞争的忠诚度的派系或在三个不同场景中易手的物品时,整个故事就会开始变得混乱。传统工具无法满足这一需求:
- **人物卡** 捕捉人物一开始的设定,但无法记录人物的成长。你每次都要手动更新每个文档 - 并手动将这些更改与之后的每个场景进行交叉引用。
- **索引卡和大纲** 显示情节结构,但不显示每个场景的世界状态。谁在房间里?他们知道什么?他们拿着什么?
- **电子表格** 理论上可以跟踪状态更改,但它们没有显示形状,一旦时间线变为非线性,它们就会崩溃,并且它们无法显示任何给定时刻实体之间的关系。
- **写作软件** 用于写作,不用于规划。使用相同的工具进行两者会使两者变得更难。
NarrativeNode 将故事视为一个动态图。每个角色、地点和物品的状态都由您定义的更改链自动计算。您在一个地方定义实体的起始状态,然后在每个场景中记录更改。后续场景会自动反映这些更改,如果两个更改相互矛盾,应用程序会标记以供审查。
NarrativeNode解决的另一个核心问题是 **时间顺序** (故事世界中实际发生的事情和时间)和 **叙事顺序** (读者体验到的顺序)之间的差距。画布始终显示时间顺序,因此您可以直观地规划整个世界时间线。视角系统允许您在时间线中路由叙事 - 闪回、非线性剪辑、未被目击的场景。当您导出时,输出遵循视角顺序,而不是画布布局,这样读者就能按照您预期的顺序阅读。
---
## 核心概念
三个理念使应用程序的其余部分得以实现。
### 1. 画布显示时间,视角路径定义故事。
画布上的场景按时间顺序排列:故事世界中事件发生的时间顺序。平行事件并排显示。您可以一目了然地看到整个时间线。
视角系统是分开的。您在每个场景中标记哪个角色具有视角。该序列定义了叙事顺序:读者遇到事件的顺序。导出遵循视角顺序,不遵循画布布局。时间线中按时间顺序最早的闪回场景可以通过视角角色路由到第六章。
没有视角角色的场景是离线的:它们是世界时间线的一部分,但读者不会直接目睹它们。
### 2. 实体有历史,而不仅仅是状态。
故事中的每个角色、地点、物品、派系和自定义元素都是 **实体**。每个实体都在画布上的 **设置节点** 中定义一次:名称、颜色、描述,以及您要跟踪的任何自定义属性。
之后,实体没有全局状态供您回去编辑。相反,您记录每个场景中的更改。角色受伤:在该场景节点中添加此更改。物品易手:在那里记录。名称更改、关系更改、属性移除:所有这些都在发生场景进行记录,而不是追溯。
应用程序通过沿着连接图从开始处向前跟踪实体的有效状态,在每个场景中计算其有效状态。您可以查看任何场景,并准确看到该时刻故事中每个实体的状态。
### 3. 更改向前传播,冲突自动浮现。
当您在某个场景中记录对实体的更改时,它会向前传播到后续的每个场景。如果您稍后意识到此更改应该更早发生,您可以移动它,传播更新。
如果后续场景已经记录了该更改的自己的版本,则会用警告指示器标记它。不会阻止或破坏任何内容:警告标志只是表示“可能需要查看”。您可以按照自己的节奏解决警告。
---
## 功能
### 画布和场景
- 无限可缩放的画布,用于以任意布局排列场景
- **场景节点**,带有标题、直接在节点上可见的简短摘要和侧边栏中的完整富文本内容区域
- **实体芯片**:每个场景节点持有彩色子部分,每个存在的实体一个;芯片显示该叙事点处实体的状态
- **线路**:从任意实体芯片拖动以连接到下一个场景;每条线路都可以带有过渡注释(旅行方式、时间跳跃、动机等)
- 每个实体遵循单一线性路径:每个芯片有一个输出连接,一个场景到下一个;实体可以自由跳过场景,但每个实体芯片一次只能继续到一个场景
- 场景中对实体类型的限制或场景数量无限制
- **章节和剧本**:使用画布上的列分隔符将场景分组到章节中;章节可以组织成剧本;组用于导出
- **可读性控制**:在连线可见性模式之间切换,自动整理线路路由,在线预览线路的过渡注释,并停靠或重新排列侧面板
### 场景时间
场景可以可选地记录它们发生的时间:一天中的时间、日期、季节和持续时间,针对可配置的日历。此信息可用于时间线视图和从场景构建的任何AI上下文。
### 实体
五种内置实体类型,以及完全可自定义的自定义类型:
| 类型 | 代表什么 |
|---|---|
| **角色** | 故事中的任何人或生物 |
| **地点** | 一个地方;支持父/子层次结构(例如城市 > 酒馆 > 后室) |
| **物品** | 在叙述中移动的物体(剑、信、地图) |
| **派系** | 一个团体、组织或忠诚 |
| **自定义** | 其他任何事物;按用户定义的类别组织(例如“咒语”、“古代文物”、“哥布林”) |
每个实体都有:
- 用户选择的 **颜色** 在整个画布上流动(线路、芯片和设置节点都使用它)
- **配置文件图片** (在应用程序中上传和裁剪)
- **描述**
- 任意数量的 **别名** (实体已知的其他名称)
- 任意数量的自定义 **属性**
- 与其他实体的 **关系**
### 自定义属性
属性可以是五种类型之一:
| 类型 | 描述 |
|---|---|
| **文本** | 自由文本,长度不限 |
| **媒体** | 支持的任何文件:图像、音频或视频;上传并嵌入到项目文件中 |
| **预设** | 从用户定义的列表中选择(例如“物种”列表,包含人类、精灵、矮人) |
| **文本列表** | 文本值的列表(例如昵称、头衔或标签的列表) |
| **实体列表** | 故事中的其他实体的列表(例如朋友列表、角色库存、位置的已知居民) |
属性可以在任何场景节点中添加、修改或删除为该场景的更改记录的一部分。更改从该点向前流动。
**预设列表** 在故事级别定义,并在需要它们的任何实体或属性之间共享。
### 关系
关系是连接实体的第一类对象:联盟、竞争、家族纽带、指挥链。像实体一样,关系在原点定义,然后在叙述中发展:参与者加入或离开,参与者之间的感知发生变化,角色和层次结构发生变化。在每个更改发生的场景中记录更改,并向前传播,审查标志系统与实体更改相同。关系的状态在相关的实体芯片和详细信息面板中显示。
### 知识和意识
NarrativeNode不仅跟踪故事中的内容,还跟踪谁知道这些内容。 **知识** 项目是离散的事实、秘密或世界中的信息。 **意识** 记录哪些角色在什么时候知道什么,程度如何。意识可以针对知识项目、实体、关系、个别属性和名称或别名进行跟踪。像其他所有内容一样,它在场景中作为更改记录,并向前计算,这样您可以询问在给定场景中谁知道给定的秘密并得到确切的答案。
### 环境、动机和观点
角色可以拥有比简单属性更丰富的叙事状态:
- **环境** 和 **动机**:情境条件和驱动力,每个都有描述和强度,在适用时记录。
- **观点**:角色如何看待另一个角色或情况,以描述、定向姿态捕获。
所有这三个都像其他更改一样沿着链条跟踪,它们会输入下面的AI聊天和角色卡功能。
### 标签
实体和场景可以标记,标签筛选器会将画布和库缩小到具有给定标签的内容。标签可以按项目定义,也可以保存在可重用的程序级池中。
### 更改跟踪
在每个场景节点中,每个实体芯片可以记录该实体在该场景的更改层:
- 名称更改
- 颜色更改
- 描述更改
- 配置文件图片更改
- 属性添加、修改和删除
- 关系添加和删除
每个芯片上的视觉指示器显示发生了什么类型的更改:绿色表示添加,红色表示删除,琥珀色表示修改。更改会自动传播到所有下游场景。
如果后续场景已经携带了对同一字段的自己的更改,则该场景会收到审查标志。所有标志都是信息性的,非阻塞的。 **警报**面板在一个位置收集所有未完成的审查标志,这样不会遗漏任何。
### 视角系统
视角跟踪在角色级别,而不是场景级别。在任何场景节点,您都可以标记哪个角色具有视角。这:
- 定义导出文档的顺序
- 允许完全非线性的讲故事:闪回、平行视角切换、读者从未目睹的场景
- 支持任何视角结构:整个故事的单一视角、多个旋转视角或全知叙述
画布显示时间顺序。导出始终遵循叙事顺序。
### 左侧边栏:实体库和详细信息面板
左侧边栏有两种模式,根据您正在执行的操作自动切换。
**实体库** 是默认视图。它显示故事中的所有实体,组织成选项卡:角色、地点、物品、派系和自定义。每个选项卡都有一个搜索栏,列出每个类型的每个实体及其颜色、配置文件图片和名称。从库中,您可以:
- 创建新实体(每个选项卡顶部的按钮)
- 点击任何实体在模态中打开它进行编辑
- 将实体从列表中拖动到画布或场景节点以添加它
- 使用每个行上的定位按钮在画布上找到实体的设置节点
- 在行上拖动握把手在选项卡内重新排序实体
**详细信息面板** 替换库视图,当您在画布上选择某些内容时。它是上下文相关的:点击场景节点会显示该场景的摘要和该场景中存在的实体芯片的列表;点击场景中的实体芯片(或选择实体节点)会显示该实体在叙事链的特定点上的完整详细信息,包括在该场景上应用的所有更改后的有效状态。
从详细信息面板中,您可以:
- 在选定的场景中查看实体的名称、颜色、配置文件图片、描述、属性和关系
- 使用箭头控件沿实体场景链前后导航
- 跳转到实体的设置节点或任何包含该实体的场景节点
- 跳转到相关实体在同一链位置(如果该实体尚未在此场景中,则添加它会触发上游搜索流程)
- 编辑当前场景的更改记录:在此特定场景节点添加、修改或删除属性值
切换画布上的选择会立即更新详细信息面板。点击空白画布空间会返回实体库。
### 文本编辑器
点击场景节点会打开 **编辑器面板**,在右侧边栏中:一个完整的TipTap富文本编辑器,用于编写该场景的全部内容。编辑器支持:
- 粗体、斜体、下划线、删除线
- 标题(H1、H2、H3)
- 项目符号列表和编号列表
- 引用块
- 文本颜色和高亮
- 字体大小和字体系列
- 链接
编辑器与左侧边栏独立:您可以同时在右侧的编辑器中编写内容,在左侧的库中打开详细信息面板。关闭编辑器不会丢弃内容;所有内容都与项目一起保存。
**实体名称高亮**:在编辑器中编写时,实体名称会自动高亮显示为其实体颜色作为视觉叠加层直接在文本中。这不会破坏现有内容;高亮仅作为视觉装饰应用于顶部。只有当前打开的场景中存在的实体才会被匹配,因此高亮仅限于实际在该场景中的实体。点击任何高亮名称都会在左侧的详细信息面板中打开该实体在当前场景链位置的内容。如果在此场景中记录了实体的名称更改,则两个名称都会独立高亮显示,每个名称都以相关颜色和状态显示。
### 参考节点
自由漂浮的画布节点,用于笔记、注释和参考材料,不受实体或场景系统约束。参考节点可以包含富文本或嵌入式媒体文件(图像、视频或音频)。使用它们进行世界构建笔记、情绪板、章节大纲或您要在画布上显示的任何其他材料,而不成为叙事结构的一部分。参考节点可调整大小、可折叠,并且可以放置在画布上的任何位置。
### 搜索和查找/替换
全局搜索从单个框跳转到项目中的任何实体、场景、知识项目或关系。单独的查找和替换工具在场景文本内容中工作。
### 目录
一个弹出面板,固定在画布顶部章节标题行。显示故事结构的分层结构:剧本包含章节,章节列出其场景,以视角叙事顺序显示。点击任何条目都会将画布移动并缩放至该场景或章节列。适用于快速导航大型故事并获取结构概览,而无需滚动。
### 时间线导航器
一个可调整大小的弹出面板,显示故事中所有实体与所有场景的网格。每一行是一个实体;每一列是一个场景;每个单元格显示该实体是否出现在该场景。按实体类型筛选行或按名称搜索。点击任何单元格都会导航到画布并打开该链位置的实体详细信息面板。适用于发现角色旅程中的空白或检查特定物品或位置出现在哪些场景中。
### 媒体预览面板
用于检查附件媒体的浮动面板。当您打开附加到实体属性的媒体文件时,它会在预览面板中以舒适的大小显示,并具有音频和视频文件的播放控件。
### 实体导入
从另一个 `.nnz` 项目文件导入实体。预览显示导入的内容以及每个实体如何映射到当前故事,然后再提交。
### Novelcrafter导入
导入以Novelcrafter编写的故事:导入其散文(Markdown、HTML或DOCX)和每个场景的文本都进入匹配的场景节点,准备继续规划。
### 导出
导出对话框允许您选择范围(完整故事、特定剧集、特定章节)和格式:
| 格式 | 备注 |
|---|---|
| **Markdown** | 清洁的 `.md` 文档,按叙事顺序排列 |
| **HTML** | 带有导航的静态网站 |
| **纯文本** | 简单的 `.txt` 文档 |
| **PDF** | 格式化的 PDF |
| **DOCX** | 兼容 Microsoft Word(也可在 LibreOffice / OpenOffice / Google Docs 中打开) |
| **NovelCrafter Markdown** | 与 NovelCrafter 的场景导入兼容 |
| **NovelCrafter DOCX** | NovelCrafter 兼容的 Word 文档 |
所有格式都遵循 POV 叙事顺序,而不是画布布局。
### 人物卡
导出任意人物为 SillyTavern 兼容的人物卡(带有嵌入的卡片数据),从您选择的场景中构建人物的有效状态,可选 AI 辅助问候。人人物卡也可以作为实体导入。
### 设置面板
设置面板有五个选项卡:
- **故事设置**:标题、作者、强调色、章节和剧集标签,以及其他故事级设置,保存在项目文件中
- **故事种子**:定义默认属性存根,自动应用于此项目中创建的每个新实体(例如,“魔法类型”预设属性自动添加到每个新角色)
- **默认种子**:定义创建新项目时复制的种子;一个模板,不是与现有项目的实时连接
- **程序设置**:应用程序级偏好
- **关于**:版本信息
### AI 聊天
应用内聊天面板让您与故事交谈。在角色中聊天(模型被赋予在所选场景中的角色有效状态),迭代场景,或将回复直接应用到场景的文本中。对话保存在项目中,并在线程浏览器中组织。您可以自带提供程序:任何 OpenAI 兼容的端点、OpenRouter、Anthropic 或本地 Ollama 或 LM Studio 服务器。系统提示可编辑和选择,API 密钥存储在操作系统的密钥链中,整个 AI 层可在程序设置中关闭。
### MCP 服务器(AI 代理控制)
NarrativeNode 包含一个内置的 **模型上下文协议** 服务器,因此外部 AI 客户端(Claude Desktop、Claude Code 和任何其他 MCP 兼容的客户端)可以通过结构化的工具表面读取和写入您的故事,而不是自由形式的聊天。
MCP 界面暴露了应用使用的相同历史链模型:工具接受一个可选的 `at` 参数,该参数命名一个场景,变更记录为该场景的链条条目,而不是重写源。读取返回命名场景下的实体有效状态,并应用所有上游。
代理在进行任何更改之前请求一个会话。在会话激活期间,应用内指示器显示代理正在执行的操作,会话可以随时在应用内结束。内置的工作流指南(可通过 `list_workflows` 工具发现)引导代理完成常见任务,例如从头开始建立故事、规划情节或起草散文。
MCP 服务器可以按需从 MCP 控制按钮启动,或在程序设置中设置为与应用程序自动启动。
#### 设置 Claude Desktop 或 Claude Code
NarrativeNode 附带一个小的 stdio 包装器(`backend/scripts/mcp_stdio_launcher.py`),MCP 主机应用程序将其作为子进程启动。该包装器无论 NarrativeNode 是否运行,都可以干净地启动,因此在 OS 登录时启动的主机不会在每次启动时将 `narrativenode` 标记为不健康。工具调用在 NN 启动时转发到 live FastMCP 服务器;当它离线时,它们会返回一条友好的内联消息,而不是崩溃。
**在粘贴之前,将下面每个代码片段中的 `<NN_ROOT>` 替换为磁盘上 NarrativeNode 存储库的绝对路径**。文字占位符不会解析为任何内容;主机将无法启动包装器。在 JSON 配置文件和 Claude Code CLI 中使用正斜杠 - Windows 上也可以正常处理。
虚拟环境 Python 位于:
- **Windows**:`<NN_ROOT>/.venv/Scripts/python.exe`
- **macOS / Linux**:`<NN_ROOT>/.venv/bin/python`
显式使用虚拟环境 Python - 包装器依赖于安装在 NN 的虚拟环境中的 `mcp` 包,而不是系统 Python。
**Claude Code**(CLI):
```sh
claude mcp add narrativenode \
<NN_ROOT>/.venv/Scripts/python.exe \
<NN_ROOT>/backend/scripts/mcp_stdio_launcher.py
claude mcp list # 验证:✓ 已连接
```
**Claude Desktop**:编辑 `%APPDATA%\Claude\claude_desktop_config.json`(Windows)或 `~/Library/Application Support/Claude/claude_desktop_config.json`(macOS),并在 `mcpServers` 下添加一个 `narrativenode` 条目:
```json
"narrativenode": {
"command": "<NN_ROOT>/.venv/Scripts/python.exe",
"args": ["<NN_ROOT>/backend/scripts/mcp_stdio_launcher.py"]
}
```
重启 Claude Desktop。`narrativenode` 服务器将在启动时保持健康,无论 NarrativeNode 是否正在运行。
完整的设置详细信息,包括用于非默认后端端口的 `NN_MCP_URL` 环境变量重写和一个可以在触摸主机配置之前运行的烟雾测试脚本,都在 `backend/scripts/README.md` 中。
### 内置帮助
应用内有一个引导式、截图说明的帮助系统:一个您可以从 NarrativeNode 内打开的每个面板和概念的演练。在您熟悉应用时非常方便。
### 项目文件格式
项目保存为 `.nnz` 文件:一个带有自定义扩展名的标准 ZIP 存档。内部是 `narrative.json`(完整的故事状态)和一个包含您附加到实体的任何文件的 `assets/` 文件夹。您可以使用任何 ZIP 工具打开 `.nnz` 文件来检查或手动备份其内容。
在 Windows 上,`.nnz` 文件可以与操作系统注册,以便双击它们可以直接打开 NarrativeNode。
---
## 它适用于谁?
- **小说家和小说作者**,计划多角色、多时间线故事
- **游戏大师和桌面 RPG 玩家**,跟踪战役传说、情节弧线和 NPC 连续性
- **编剧**,管理平行故事情节、闪回和剧本结构
- **任何作家**,其故事已经复杂到无法在平面文档或电子表格中容纳
---
## 入门指南
### 先决条件
首先安装这两个运行时环境(两者都是免费的):
- **Python 3.11 或更新版本** - 从 https://www.python.org/downloads/ 下载
在 Windows 上,在安装程序中勾选 **"将 python.exe 添加到 PATH"**,以便在终端中使用 `python` 命令。
- **Node.js 20.19+ 或 22.12+** (推荐 LTS 版本)- 从 https://nodejs.org/ 下载
它包含 `npm`,安装步骤将使用它来构建应用的界面。
在继续之前,请在终端中检查两者是否可用:
```bash
python --version
node --version
```
### 首次设置
在执行其他任何操作之前,请运行设置脚本一次。它会创建 Python 虚拟环境并安装所有依赖项:
```bash
python setup.py
# 或在 Windows 上:setup.bat
```
### 启动应用
```bash
python run.py
# 或在 Windows 上:run.bat
```
`setup.py` 在其最后一步构建前端,因此在设置完成后,`python run.py` 立即生效。它启动 FastAPI 后端,直接为构建的前端提供服务,并在默认浏览器中打开应用。
### 建议的首次会话
如果您是此应用的新手,此序列将在大约十分钟内展示核心工作流程:
1. **从画布工具栏创建新项目**。
2. **在实体库面板(左侧边栏)中添加一些实体**。创建两个角色和一个地点。每个实体都有自己的彩色设置节点放置在画布上。
3. **使用画布左上角的圆形“+”按钮或右键单击画布上的任意空白区域添加场景节点**。两者都可以打开一个菜单来选择要添加的节点类型。给场景一个标题和简短的摘要,面板中会出现相应的内容。
4. **将实体连接到场景**:从角色的设置节点的输出端口拖动到场景节点。角色在场景内显示为彩色芯片。对其他角色和地点重复此操作。
5. **添加第二个场景,并将实体从场景 1 连接到场景 2**。转换线可以带有注释,解释实体如何从一个场景移动到下一个场景。
6. **记录更改**:打开场景 2 并单击角色芯片。使用更改面板修改角色描述,或添加新属性,如“伤害:腕骨骨折”。此更改现在将传播到此后的每个场景。
7. **标记 POV**:在场景 1 上,单击角色芯片,选择他们作为该场景的 POV 承担者。对场景 2 执行相同操作。这定义了导出用的叙事顺序。
8. **在文本编辑器中写作**:单击场景节点,在右侧边栏的富文本编辑器中打开它。随意写出场景。
9. **导出**:从工具栏打开导出对话框。选择文件格式并导出故事。输出遵循 POV 叙事顺序。
---
## 技术栈
| 层 | 技术 |
|---|---|
| 后端 | Python 3.11+ / FastAPI / Pydantic v2 |
| 前端 | React 19 / Vite 8 |
| 节点画布 | React Flow(`@xyflow/react` v12) |
| 富文本编辑器 | TipTap 3 |
| 图片裁剪 | react-easy-crop |
| 样式 | Tailwind CSS v4 |
| 状态管理 | Zustand 5 |
| HTTP 客户端 | Axios |
| 导出渲染器 | ReportLab(PDF),python-docx(.docx) |
| 保存格式 | `.nnz`(包含 JSON 和资产的 ZIP 存档) |
---
## 许可证
NarrativeNode 在自定义许可证下**源代码可用**。它**不是** OSI 批准的开源许可证。完整条款见 [LICENCE.md](LICENCE.md)。简而言之:
- **个人使用免费。** 计划和撰写您的故事。您拥有使用它创建的所有内容;项目对您的叙事内容没有任何权利。
- **为自己修改它**,并以补丁或差异的形式分享您的更改。保留私有副本或私有分支是可以的。
- **不允许重新分发、重新托管、重新品牌或在另一个软件产品中重用代码。**
- **仅当项目同时用于商业目的且由已建立的赚取者(过去十二个月的毛收入超过 25 万加元)时,才需要商业许可证。** 该测试适用于您的主动使用,并且从不追溯,因此业余作品和新创作者的第一个商业作品无需支付任何费用。
详见 [LICENCE.md](LICENCE.md)。
---
## 致谢和开源库
NarrativeNode 建立在几个优秀的开源库之上。感谢他们的作者和贡献者。
| 库 | 许可证 | 备注 |
|---|---|---|
| [React](https://react.dev/) | MIT | UI 框架 |
| [Vite](https://vitejs.dev/) | MIT | 构建工具和开发服务器 |
| [React Flow / xyflow](https://reactflow.dev/) | MIT | 基于节点的画布 |
| [TipTap](https://tiptap.dev/) | MIT | 富文本编辑器 |
| [react-easy-crop](https://github.com/ValentinH/react-easy-crop) | MIT | 配置文件图像裁剪 |
| [Tailwind CSS](https://tailwindcss.com/) | MIT | 实用优先的 CSS 框架 |
| [Zustand](https://github.com/pmndrs/zustand) | MIT | 状态管理 |
| [Axios](https://axios-http.com/) | MIT | HTTP 客户端 |
| [Streamdown](https://github.com/vercel/streamdown) | Apache-2.0 | AI 聊天面板中的流感知 Markdown 渲染(块级记忆,流中语法修复;捆绑 remark-gfm + 统一管道) |
| [@streamdown/mermaid](https://github.com/vercel/streamdown) | Apache-2.0 | Streamdown 插件,检测 `language-mermaid` 代码块并将它们路由到 Mermaid 进行内联 SVG 渲染在聊天面板中 |
| [Mermaid](https://mermaid.js.org/) | MIT | AI 发出的角色 / 情节 / 场景流程可视化的内联图表渲染 |
| [marked](https://github.com/markedjs/marked) | MIT | Markdown 到 HTML 的转换(由 Apply to Editor Section 使用,将聊天消息 Markdown 转换为 TipTap 兼容的 HTML,然后写入 Section) |
| [DOMPurify](https://github.com/cure53/DOMPurify) | Apache-2.0(也可在 MPL-2.0 下使用;我们以 Apache-2.0 形式提供) | 用户提供的富文本内容的 HTML 净化;主要使用者是 Novelcrafter 散文导入(`novel.md` / `novel.html` / `novel.docx` → `SceneNode.main_content`),用作防御深度允许列表过滤器,在 HTML 到达 TipTap 之前 |
| [@uiw/react-color](https://github.com/uiwjs/react-color) | MIT | 颜色选择器组件(饱和度方块,色调滑块) |
| [FastAPI](https://fastapi.tiangolo.com/) | MIT | 后端 Web 框架 |
| [Pydantic](https://docs.pydantic.dev/) | MIT | 数据验证 |
| [uvicorn](https://uvicorn.dev/) | BSD | ASGI 服务器 |
| [aiofiles](https://github.com/Tinche/aiofiles) | Apache-2.0 | 后端异步文件 I/O |
| [python-multipart](https://github.com/Kludex/python-multipart) | Apache-2.0 | FastAPI 端点的多部分表单 / 文件上传解析 |
| [ReportLab](https://www.reportlab.com/) | BSD | PDF 导出 |
| [python-docx](https://python-docx.readthedocs.io/) | MIT | .docx 导出 |
| [keyring](https://github.com/jaraco/keyring) | MIT | 操作系统密钥链存储,用于 AI 提供商 API 密钥(Windows 凭证管理器 / macOS 密钥链 / Linux 秘密服务) |
| [markdown-it-py](https://github.com/executablebooks/markdown-it-py) | MIT | Markdown 到 HTML 用于自由导出文本字段(描述,属性值,注释等),因此作家在这些字段中输入的 Markdown 渲染在 PDF / DOCX / HTML 导出中;与 `marked` 相同的 CommonMark / GFM 家族。捆绑 mdurl(MIT) |
| [mcp](https://github.com/modelcontextprotocol/python-sdk) | MIT | 模型上下文协议 Python SDK;为 NarrativeNode 的 MCP 服务器提供支持,以便 MCP 兼容的 AI 客户端可以通过工具驱动应用 |
| [resvg-py](https://github.com/baseplate-admin/resvg-py) | MIT | SVG 到 PNG 栅格化用于导出图标;包装 resvg Rust 仓库(双 Apache-2.0 / MIT),所有捆绑的原生代码都是许可的 |
上述每个库的完整许可证文本都包含在 [THIRD_PARTY_LICENSES/](THIRD_PARTY_LICENSES/) 文件夹中。
---
## 关于该项目的创建
该项目使用 Claude Code 创建。 感谢 Anthropic! <3
如果这是一个无法接受的问题,请随意继续。
</div>
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器