commit 77ad0e528f1cee3737c14ecde82265f905586c53 Author: sdaduanbilei Date: Tue Mar 3 17:59:27 2026 +0800 init: add workflow and script draft assets diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/.DS_Store differ diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..288f198 --- /dev/null +++ b/.env.template @@ -0,0 +1,10 @@ +# Dify 配置 +DIFY_API_KEY=your_dify_api_key_here +DIFY_BASE_URL=https://dify.wutongshucloud.com + +# DeepSeek 配置 +DEEPSEEK_API_KEY=your_deepseek_api_key_here + +# 工作流配置 +WORKFLOW_NAME=漫画生成验证工作流 +MODEL_NAME=deepseek-r1 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3583dcf --- /dev/null +++ b/README.md @@ -0,0 +1,109 @@ +# Komga Creater + +小说文本到漫画分镜提示词的工作流项目。 + +这个仓库既可作为对外展示的项目说明,也可直接作为团队内部的实施手册使用。 + +## 项目简介 + +Komga Creater 基于 Dify + DeepSeek,将小说段落转换为结构化漫画分镜(Markdown),用于后续图片生成。 + +核心价值: +- 快速验证从文本到分镜提示词的可行性 +- 降低分镜设计门槛,提升创作效率 +- 提供标准化测试用例与质量评估体系 + +## 适用场景 + +- 小说可视化与漫画改编前期 +- AIGC 分镜提示词批量生产 +- 团队内部提示词工程验证 + +## 功能概览 + +- 单路径验证版工作流:编辑 -> 分镜 +- 双模式工作流: + - 传统漫画分镜(静态叙事) + - 时间线漫画分镜(连续动作) +- 配套文档:导入、配置、手动搭建、测试与评分 + +## 仓库结构 + +```text +. +├── workflow/ +│ ├── manga-generator-dify-dsl.json # 早期 JSON DSL(参考) +│ ├── 漫画生成验证工作流.yml # 单路径验证版(MVP) +│ └── 漫画生成工作流-v2.yml # 双模式增强版 +├── docs/ +│ ├── dify-import-guide.md # DSL 导入指南 +│ ├── dify-setup-guide.md # Dify + DeepSeek 配置说明 +│ ├── dify-manual-setup-guide.md # 手动搭建步骤 +│ └── workflow-v2-readme.md # v2 详细说明 +├── tests/ +│ ├── test-inputs.md # 测试输入样例 +│ └── quality-assessment.md # 质量评分标准 +└── .env.template # 环境变量模板 +``` + +## 快速开始(外部用户) + +1. 登录 Dify:`https://dify.wutongshucloud.com` +2. 创建应用并导入 DSL: + - `workflow/漫画生成验证工作流.yml`(快速验证) + - `workflow/漫画生成工作流-v2.yml`(推荐) +3. 在 Dify 中配置 DeepSeek 模型 +4. 运行测试输入,查看分镜输出 + +详细导入说明见:[docs/dify-import-guide.md](docs/dify-import-guide.md) + +## 实施手册(内部团队) + +### 1. 环境准备 + +```bash +cp .env.template .env +``` + +填写以下变量: +- `DIFY_API_KEY` +- `DIFY_BASE_URL` +- `DEEPSEEK_API_KEY` +- `WORKFLOW_NAME` +- `MODEL_NAME` + +### 2. 工作流选择建议 + +- 需求是“先打通流程”:使用 `漫画生成验证工作流.yml` +- 需求是“覆盖更多输入类型”:使用 `漫画生成工作流-v2.yml` + +### 3. 测试执行 + +1. 使用测试集:`tests/test-inputs.md` +2. 按评分标准评估:`tests/quality-assessment.md` +3. 记录每个用例总分与主要问题 + +### 4. 验收标准 + +- 流程完整跑通(输入 -> 编辑 -> 分镜 -> 输出) +- 输出结构符合 Markdown 规范 +- 分镜描述可视化明确,提示词可直接用于图片生成 +- 综合评分达到团队设定阈值(建议 >= 28/40) + +## 常用文档入口 + +- 配置指南:[docs/dify-setup-guide.md](docs/dify-setup-guide.md) +- 导入指南:[docs/dify-import-guide.md](docs/dify-import-guide.md) +- 手动搭建:[docs/dify-manual-setup-guide.md](docs/dify-manual-setup-guide.md) +- v2 说明:[docs/workflow-v2-readme.md](docs/workflow-v2-readme.md) + +## 路线建议 + +1. 先用验证版确认质量下限 +2. 切换到 v2 处理复杂动作场景 +3. 通过测试评分持续迭代提示词 +4. 验证稳定后再接入图片生成 API 与服务化部署 + +## 备注 + +本仓库当前聚焦“工作流验证与提示词工程”,不包含完整前后端应用代码。 diff --git a/docs/dify-import-guide.md b/docs/dify-import-guide.md new file mode 100644 index 0000000..8870f64 --- /dev/null +++ b/docs/dify-import-guide.md @@ -0,0 +1,71 @@ +# Dify DSL 导入指南 + +## 导入步骤 + +### 1. 进入 Dify 控制台 +- 访问你的Dify地址:https://dify.wutongshucloud.com +- 登录账户 + +### 2. 导入 DSL 文件 +1. 点击左侧菜单的 **"应用"** 或 **"Apps"** +2. 点击右上角的 **"创建应用"** 或 **"Create App"** +3. 选择 **"导入 DSL"** 或 **"Import DSL"** +4. 选择文件:`workflow/漫画生成验证工作流.yml` +5. 点击 **"创建"** 或 **"Create"** + +### 3. 验证工作流 +导入后,你应该能看到: +- **开始节点**:包含输入变量 `input_novel`(小说原文) +- **小说编辑AI节点**:第一个LLM节点,使用deepseek-r1模型 +- **分镜AI节点**:第二个LLM节点,使用deepseek-r1模型 +- **分镜提示词输出节点**:最终输出节点 + +### 4. 测试工作流 +1. 点击 **"运行"** 或 **"Run"** +2. 输入测试文本: + ``` + 李阳推开厚重的木门,月光透过窗户洒在地板上。他看到父亲坐在书桌前,手里拿着一封信。房间里弥漫着淡淡的墨香,父亲的背影显得格外孤独。 + ``` +3. 查看输出是否符合Markdown格式 + +### 5. 如果导入失败 +如果导入时遇到问题,可以尝试: +1. 检查Dify版本是否支持该DSL格式(建议0.8.0+) +2. 确保DeepSeek模型提供商已配置 +3. 手动创建工作流(参考 `docs/dify-manual-setup-guide.md`) + +## 预期输出示例 + +```markdown +# 分镜分析 + +## 场景概览 +深夜的书房,月光与墨香交织,李阳发现父亲独自面对一封神秘书信,空气中弥漫着沉默的张力。 + +## 分镜详情 + +### 分镜1:推门而入 +**场景描述:** 厚重的木门缓缓推开,月光如水银泻地般洒在地板上,形成明暗对比强烈的光影效果。 +**角色动作:** 李阳的手停留在门把上,身体微微前倾,表情兼具紧张与期待。 +**情感氛围:** 神秘、期待、微微的紧张。 +**图片提示词:** 深夜室内,一扇古老的木门半开,月光从窗户斜射入房间,在木质地板上形成清晰的光影条纹,构图采用低角度仰视,强调门框的高大和压迫感,黑色剪影风格的男性人物站在门口,动漫风格,电影级光影,细节丰富。 + +### 分镜2:父亲的背影 +**场景描述:** 书桌前,父亲佝偻的背影沐浴在月光中,桌上一封信在微弱光线下泛着淡淡的光泽。 +**角色动作:** 父亲低头凝视手中的信,肩膀微微下沉,姿态显露出疲惫与沉思。 +**情感氛围:** 孤独、沉重、忧郁。 +**图片提示词:** 书房内景,昏暗的灯光,一个中年男性的背影坐在书桌前,手中拿着一封信,窗外月光照射进来,整体色调偏冷蓝,氛围感强烈,写实插画风格,参考新海诚的光影处理,强调孤独感。 + +### 分镜3:墨香的氛围 +**场景描述:** 特写镜头,空气中似乎能看见弥漫的墨香,书房的细节在月光下若隐若现。 +**角色动作:** 无具体人物动作,重点展现环境氛围。 +**情感氛围:** 宁静、诗意、若有若无的忧伤。 +**图片提示词:** 书房环境特写,古老的文房四宝,毛笔悬挂,墨水瓶半开,空气中弥漫着淡淡的烟雾般的墨香,月光穿透窗帘,整体氛围宁静而诗意,中国水墨画风格与现代插画结合,淡雅色调。 + +## 风格建议 +推荐使用写实插画风或动漫风格,参考新海诚、宫崎骏等导演的光影处理手法,强调情感氛围的渲染。建议色调以冷暖对比为主,突出孤独与神秘的氛围。 +``` + +## 下一步 + +导入成功后,请使用 `tests/test-inputs.md` 中的测试用例进行测试,并填写 `tests/quality-assessment.md` 中的评估表格。 diff --git a/docs/dify-manual-setup-guide.md b/docs/dify-manual-setup-guide.md new file mode 100644 index 0000000..39997ad --- /dev/null +++ b/docs/dify-manual-setup-guide.md @@ -0,0 +1,192 @@ +# Dify 工作流手动配置指南 + +## 概述 + +由于Dify的DSL导入需要特定格式,本指南提供手动创建工作流的步骤。 + +## 第一步:创建新工作流 + +1. 登录 https://dify.wutongshucloud.com/apps +2. 点击 "创建应用" +3. 选择 "工作流"(Workflow) +4. 命名为:`漫画生成验证工作流` + +## 第二步:添加开始节点(输入变量) + +1. 点击 "开始" 节点 +2. 添加输入变量: + - 变量名:`input_novel` + - 变量类型:文本(Paragraph) + - 标签:小说原文 + - 是否必填:是 + - 默认值:(留空) + - 描述:用户输入的小说短段落(300-1000字) + +## 第三步:添加编辑节点(第一个LLM节点) + +1. 点击 "+" 添加节点 +2. 选择 "LLM"(大语言模型) +3. 配置如下: + +**基本信息:** +- 节点名称:小说编辑AI + +**模型配置:** +- 模型:deepseek-r1 +- 温度:0.7 +- 最大Token:2000 + +**系统提示词:** +``` +你是一个专业的小说编辑。你的任务是将用户提供的小说段落进行润色和增强,使其更适合转换为视觉分镜。 + +要求: +1. 保持原有情节和人物设定不变 +2. 增强场景描述、角色动作和情感表达 +3. 让文本更具画面感和戏剧张力 +4. 输出保持中文,长度控制在原文本的1.2-1.5倍 +``` + +**用户提示词:** +``` +请润色以下小说段落,使其更适合视觉化: + +{{input_novel}} +``` + +**输出变量:** +- 变量名:edited_text +- 描述:编辑后的文本 + +## 第四步:添加分镜节点(第二个LLM节点) + +1. 点击编辑节点后的 "+" 添加节点 +2. 选择 "LLM"(大语言模型) +3. 配置如下: + +**基本信息:** +- 节点名称:分镜AI + +**模型配置:** +- 模型:deepseek-r1 +- 温度:0.6 +- 最大Token:3000 + +**系统提示词:** +``` +你是一个专业的漫画分镜师。请将叙述文本转换为3-5个分镜描述,每个分镜包含视觉元素和图片生成提示词。 + +输出格式要求(Markdown): +# 分镜分析 + +## 场景概览 +[简要描述整体场景] + +## 分镜详情 + +### 分镜1:[标题] +**场景描述:** [详细视觉描述] +**角色动作:** [主要角色动作] +**情感氛围:** [情感色彩] +**图片提示词:** [用于图片生成的提示词,包含风格、构图等] + +### 分镜2:[标题] +... + +## 风格建议 +[推荐的图片生成风格,如:动漫风格、写实插画、水彩等] + +注意:图片提示词要具体、详细,包含构图、灯光、风格等要素。 +``` + +**用户提示词:** +``` +请将以下文本转换为漫画分镜提示词: + +{{edited_text}} +``` + +**输出变量:** +- 变量名:storyboard_markdown +- 描述:分镜提示词 + +## 第五步:添加结束节点(输出变量) + +1. 点击分镜节点后的 "+" 添加节点 +2. 选择 "结束"(End) +3. 添加输出变量: + - 变量名:storyboard_markdown + - 值来源:分镜AI节点的输出 + - 描述:最终生成的Markdown格式分镜提示词 + +## 第六步:验证连接 + +确保节点连接顺序为: +``` +开始(input_novel)→ 小说编辑AI(edited_text)→ 分镜AI(storyboard_markdown)→ 结束 +``` + +## 第七步:保存并发布 + +1. 点击右上角 "保存" +2. 点击 "发布" +3. 选择 "运行" 模式 + +## 第八步:测试 + +1. 点击 "运行" 按钮 +2. 输入测试文本: +``` +李阳推开厚重的木门,月光透过窗户洒在地板上。他看到父亲坐在书桌前,手里拿着一封信。房间里弥漫着淡淡的墨香,父亲的背影显得格外孤独。 +``` +3. 查看输出是否符合Markdown格式要求 + +## 预期输出示例 + +```markdown +# 分镜分析 + +## 场景概览 +深夜的书房,月光与墨香交织,李阳发现父亲独自面对一封神秘书信,空气中弥漫着沉默的张力。 + +## 分镜详情 + +### 分镜1:推门而入 +**场景描述:** 厚重的木门缓缓推开,月光如水银泻地般洒在地板上,形成明暗对比强烈的光影效果。 +**角色动作:** 李阳的手停留在门把上,身体微微前倾,表情兼具紧张与期待。 +**情感氛围:** 神秘、期待、微微的紧张。 +**图片提示词:** 深夜室内,一扇古老的木门半开,月光从窗户斜射入房间,在木质地板上形成清晰的光影条纹,构图采用低角度仰视,强调门框的高大和压迫感,黑色剪影风格的男性人物站在门口,动漫风格,电影级光影,细节丰富。 + +### 分镜2:父亲的背影 +**场景描述:** 书桌前,父亲佝偻的背影沐浴在月光中,桌上一封信在微弱光线下泛着淡淡的光泽。 +**角色动作:** 父亲低头凝视手中的信,肩膀微微下沉,姿态显露出疲惫与沉思。 +**情感氛围:** 孤独、沉重、忧郁。 +**图片提示词:** 书房内景,昏暗的灯光,一个中年男性的背影坐在书桌前,手中拿着一封信,窗外月光照射进来,整体色调偏冷蓝,氛围感强烈,写实插画风格,参考新海诚的光影处理,强调孤独感。 + +### 分镜3:墨香的氛围 +**场景描述:** 特写镜头,空气中似乎能看见弥漫的墨香,书房的细节在月光下若隐若现。 +**角色动作:** 无具体人物动作,重点展现环境氛围。 +**情感氛围:** 宁静、诗意、若有若无的忧伤。 +**图片提示词:** 书房环境特写,古老的文房四宝,毛笔悬挂,墨水瓶半开,空气中弥漫着淡淡的烟雾般的墨香,月光穿透窗帘,整体氛围宁静而诗意,中国水墨画风格与现代插画结合,淡雅色调。 + +## 风格建议 +推荐使用写实插画风或动漫风格,参考新海诚、宫崎骏等导演的光影处理手法,强调情感氛围的渲染。建议色调以冷暖对比为主,突出孤独与神秘的氛围。 +``` + +## 常见问题 + +### Q1: 找不到deepseek-r1模型? +- 确认已在 "模型提供商" 中正确配置DeepSeek +- 检查模型名称是否正确 + +### Q2: 变量引用错误? +- 确保使用 `{{变量名}}` 格式 +- 检查变量名是否与前面节点定义的一致 + +### Q3: 输出格式不符合预期? +- 可以在系统提示词中添加更多格式说明 +- 可以在用户提示词中添加输出示例 + +## 下一步 + +创建工作流后,使用 `tests/test-inputs.md` 中的测试用例逐一测试,并记录结果。 diff --git a/docs/dify-setup-guide.md b/docs/dify-setup-guide.md new file mode 100644 index 0000000..4c7898e --- /dev/null +++ b/docs/dify-setup-guide.md @@ -0,0 +1,68 @@ +# Dify 配置指南 + +## 两种配置方式 + +### 方式一:API自动化(推荐) +通过API密钥,我可以用脚本自动化配置工作流。 + +#### 步骤1:获取Dify API密钥 +1. 登录 https://dify.wutongshucloud.com +2. 点击右上角用户头像 → "设置" +3. 进入 "API密钥" 或 "开发者设置" +4. 点击 "创建API密钥" +5. 复制生成的密钥(格式如:`app-xxx`) + +#### 步骤2:获取DeepSeek API密钥 +1. 访问 https://platform.deepseek.com +2. 注册/登录账户 +3. 进入 "API密钥" 部分 +4. 创建新密钥并复制 + +#### 步骤3:配置环境变量 +```bash +# 复制模板文件 +cp .env.template .env + +# 编辑.env文件,填写你的密钥 +nano .env +``` + +然后我可以通过脚本自动化完成所有配置。 + +### 方式二:手动操作 +你手动完成Dify界面操作,我提供配置文件。 + +#### 步骤1:配置DeepSeek模型提供商 +1. 登录Dify控制台 +2. 进入 "模型提供商" → "添加提供商" +3. 选择 "DeepSeek" +4. 填写: + - 提供商名称:DeepSeek + - API密钥:你的DeepSeek API密钥 + - 端点:https://api.deepseek.com + +#### 步骤2:创建DeepSeek-R1模型 +1. 进入 "模型" → "添加模型" +2. 配置: + - 模型名称:deepseek-r1 + - 提供商:DeepSeek + - 模型ID:deepseek-r1 + - 模式:聊天 + - 最大令牌:4096 + - 温度:0.7 + +#### 步骤3:导入工作流 +1. 进入 "工作流" → "创建工作流" +2. 选择 "导入" +3. 上传 `workflow/manga-generator-dify-dsl.json` +4. 保存为 "漫画生成验证工作流" + +## 建议选择 + +**推荐方式一(API自动化)**:更快、更可靠,我可以自动化测试。 + +**方式二(手动操作)**:更安全,不需要暴露API密钥给脚本。 + +## 下一步 + +请告诉我你选择哪种方式,我会相应调整实施计划。 \ No newline at end of file diff --git a/docs/plans/2026-02-28-manga-generator-validation-design.md b/docs/plans/2026-02-28-manga-generator-validation-design.md new file mode 100644 index 0000000..48c2a0b --- /dev/null +++ b/docs/plans/2026-02-28-manga-generator-validation-design.md @@ -0,0 +1,210 @@ +# 漫画生成工具可行性验证设计 + +## 项目概述 + +### 目标 +验证从小说文本到漫画分镜图片提示词的端到端AI处理流程可行性。 + +### 核心问题 +1. 整个流程(输入→AI编辑→AI分镜→输出)能否顺畅执行? +2. AI生成的内容质量是否足够用于图片生成? + +## 验证方案选择 + +### 方案:纯Dify工作流(选择此方案) + +**理由**: +- 最快实现验证(30分钟内可搭建完成) +- 完全利用现有工具(Dify + DeepSeek API) +- 无需编码,专注于核心AI能力测试 + +## 详细设计 + +### 系统架构 +``` +用户输入(短段落小说文本) + ↓ +[Dify工作流] + ├── [编辑节点] DeepSeek-R1 + │ └── 润色增强叙述文本 + └── [分镜节点] DeepSeek-R1 + └── 生成Markdown格式分镜提示词 + ↓ +用户复制提示词到图片生成平台 +``` + +### 组件说明 + +#### 1. 输入处理 +- **格式**:短段落小说文本(300-1000字) +- **来源**:用户从七猫小说等平台复制粘贴 +- **预处理**:无,直接交给AI编辑节点 + +#### 2. AI编辑节点 +- **模型**:DeepSeek-R1 +- **温度**:0.7 +- **任务**:润色和增强小说文本描述 +- **输出要求**: + - 保持原有情节和人物设定 + - 增强场景描述、角色动作和情感表达 + - 让文本更具画面感和戏剧张力 + - 长度控制在原文本的1.2-1.5倍 + +#### 3. AI分镜节点 +- **模型**:DeepSeek-R1 +- **温度**:0.6 +- **任务**:将叙述文本转换为分镜提示词 +- **输出格式**:Markdown结构 + ``` + # 分镜分析 + + ## 场景概览 + [整体场景描述] + + ## 分镜详情 + + ### 分镜1:[标题] + **场景描述:** [详细视觉描述] + **角色动作:** [主要角色动作] + **情感氛围:** [情感色彩] + **图片提示词:** [用于图片生成的提示词] + + ### 分镜2:[标题] + ... + + ## 风格建议 + [推荐图片生成风格] + ``` + +### Dify工作流配置 + +#### 技术栈 +- **平台**:Dify(本地自部署) +- **AI模型**:DeepSeek-R1 +- **格式**:JSON DSL + +#### 关键配置 +1. **编辑节点提示词**: + ``` + 你是一个专业的小说编辑。你的任务是将用户提供的小说段落进行润色和增强,使其更适合转换为视觉分镜。 + + 要求: + 1. 保持原有情节和人物设定不变 + 2. 增强场景描述、角色动作和情感表达 + 3. 让文本更具画面感和戏剧张力 + 4. 输出保持中文,长度控制在原文本的1.2-1.5倍 + ``` + +2. **分镜节点提示词**: + ``` + 你是一个专业的漫画分镜师。请将叙述文本转换为3-5个分镜描述,每个分镜包含视觉元素和图片生成提示词。 + + 输出格式要求(Markdown): + [格式规范见上文] + + 注意:图片提示词要具体、详细,包含构图、灯光、风格等要素。 + ``` + +## 验证方法 + +### 成功标准 +1. ✅ **流程顺畅**:输入→编辑→分镜→输出能完整执行 +2. ✅ **输出质量**: + - 编辑节点输出增强画面感 + - 分镜节点输出符合Markdown格式 + - 图片提示词具体、可生成 + +### 测试用例 + +#### 测试用例1:基础场景 +```text +输入: +李阳推开厚重的木门,月光透过窗户洒在地板上。他看到父亲坐在书桌前,手里拿着一封信。房间里弥漫着淡淡的墨香,父亲的背影显得格外孤独。 + +预期验证: +1. 编辑节点输出更丰富的视觉描述 +2. 分镜节点生成3-5个分镜 +3. 图片提示词包含具体构图和风格 +``` + +#### 测试用例2:动作场景 +```text +输入: +王雪快速穿过拥挤的街道,雨水打湿了她的头发。她回头看了一眼,追赶者的影子在路灯下拉长。心跳加速,她躲进了小巷的阴影中。 + +预期验证: +1. 编辑节点增强动作节奏感 +2. 分镜节点体现动态构图 +3. 提示词包含光影和氛围描述 +``` + +### 验证步骤 +1. **环境准备**: + - 确保Dify本地部署正常 + - 配置DeepSeek-R1模型访问 + - 导入提供的JSON DSL工作流 + +2. **功能测试**: + - 使用测试用例1运行工作流 + - 检查各节点输出格式 + - 验证Markdown结构完整性 + +3. **质量评估**: + - 人工评估编辑文本质量(是否增强画面感) + - 检查分镜合理性(场景转换是否自然) + - 评估图片提示词可用性(是否足够具体) + +4. **性能测试**: + - 记录流程执行时间 + - 测试并发处理能力(可选) + +## 风险与缓解 + +### 技术风险 +1. **模型输出不稳定** + - 缓解:调整温度参数,优化提示词 + +2. **Dify工作流配置复杂** + - 缓解:使用提供的DSL模板,分步测试 + +3. **Markdown格式不规范** + - 缓解:在提示词中明确格式要求,添加示例 + +### 业务风险 +1. **输出质量不足** + - 缓解:准备多个测试用例,调整提示词迭代 + +2. **流程时间过长** + - 缓解:设定时间阈值(如3分钟内完成) + +## 后续计划 + +### 验证成功后的扩展 +1. **添加预处理**:文本分段、清理功能 +2. **增加后处理**:提示词格式美化、批量导出 +3. **集成图片生成**:直接调用Stable Diffusion等API +4. **用户界面**:开发简单Web界面 + +### 验证失败的处理 +1. **分析瓶颈**:识别是AI能力问题还是流程设计问题 +2. **调整方案**:考虑混合方案(Dify+自定义代码) +3. **简化目标**:先验证单一步骤(如仅分镜生成) + +## 决策记录 + +### 关键决策 +1. **选择纯Dify方案**:快速验证优先 +2. **使用Markdown输出**:便于用户复制使用 +3. **聚焦短段落输入**:降低验证复杂度 +4. **使用DeepSeek-R1**:推理优化适合多步骤分析 + +### 约束条件 +1. **工具限制**:必须使用Dify + DeepSeek API +2. **时间目标**:快速验证(1-2天内完成) +3. **输出要求**:生成可用的图片提示词,而非实际图片 + +--- + +**创建时间**:2026-02-28 +**更新记录**: +- 2026-02-28:初始设计创建 \ No newline at end of file diff --git a/docs/plans/2026-02-28-manga-generator-validation-implementation.md b/docs/plans/2026-02-28-manga-generator-validation-implementation.md new file mode 100644 index 0000000..717c089 --- /dev/null +++ b/docs/plans/2026-02-28-manga-generator-validation-implementation.md @@ -0,0 +1,530 @@ +# 漫画生成工具可行性验证实施计划 + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**目标:** 验证从小说文本到漫画分镜图片提示词的端到端AI处理流程可行性 + +**架构:** 使用Dify工作流串联两个DeepSeek-R1模型节点,第一个节点润色小说文本,第二个节点生成Markdown格式的分镜提示词 + +**技术栈:** Dify(本地自部署)、DeepSeek-R1 API、JSON DSL工作流配置 + +--- + +## 准备工作 + +### 任务1:验证Dify环境就绪 + +**步骤1:检查Dify服务状态** + +```bash +# 检查Dify服务是否运行 +curl -s http://localhost:3000/api/status || echo "Dify服务未运行" +``` + +**预期输出:** JSON格式的状态信息或错误信息 + +**步骤2:确认API访问权限** + +```bash +# 测试Dify API端点 +curl -X GET "http://localhost:3000/api/console/api-keys" \ + -H "Authorization: Bearer YOUR_API_KEY" +``` + +**预期输出:** 返回API密钥列表或认证错误 + +**步骤3:检查模型提供商配置** + +1. 登录Dify管理界面 +2. 导航到 "模型提供商" → "DeepSeek" +3. 确认已配置有效的API密钥 +4. 测试模型连接性 + +**验证标准:** 所有基础服务正常运行 + +--- + +### 任务2:准备DeepSeek-R1模型配置 + +**文件:** Dify管理界面配置 + +**步骤1:添加DeepSeek模型提供商** + +1. 在Dify中进入 "模型提供商" +2. 添加DeepSeek提供商 +3. 配置: + - 提供商名称:DeepSeek + - API密钥:你的DeepSeek API密钥 + - 端点:https://api.deepseek.com + +**步骤2:创建DeepSeek-R1模型配置** + +1. 进入 "模型" +2. 添加新模型: + - 模型名称:deepseek-r1 + - 提供商:DeepSeek + - 模型ID:deepseek-r1 + - 模式:聊天 + - 最大令牌:4096 + - 温度:0.7(默认) + +**步骤3:测试模型响应** + +```bash +# 使用Dify API测试模型 +curl -X POST "http://localhost:3000/v1/chat-messages" \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "inputs": {}, + "query": "测试消息", + "response_mode": "blocking", + "conversation_id": "", + "user": "test-user", + "model": "deepseek-r1" + }' +``` + +**预期输出:** 成功的模型响应 + +**验证标准:** DeepSeek-R1模型可通过Dify正常调用 + +--- + +### 任务3:导入工作流DSL + +**文件:** `workflow/manga-generator-dify-dsl.json`(需要创建) + +**步骤1:创建工作流DSL文件** + +```bash +# 创建工作流目录 +mkdir -p workflow + +# 创建DSL文件 +cat > workflow/manga-generator-dify-dsl.json << 'EOF' +{ + "version": "1.0", + "name": "漫画生成工作流验证", + "description": "验证小说到漫画分镜提示词的AI处理流程", + "variables": [ + { + "variable": "input_novel", + "value_type": "string", + "required": true, + "label": "小说原文", + "description": "用户输入的小说短段落(300-1000字)" + }, + { + "variable": "edited_text", + "value_type": "string", + "required": false, + "label": "编辑后文本", + "description": "AI编辑润色后的叙述文本" + }, + { + "variable": "storyboard_markdown", + "value_type": "string", + "required": false, + "label": "分镜提示词", + "description": "Markdown格式的分镜描述和图片提示词" + } + ], + "nodes": [ + { + "id": "editor_node", + "type": "llm", + "name": "小说编辑AI", + "description": "润色和增强小说文本描述", + "config": { + "model": { + "provider": "deepseek", + "name": "deepseek-r1", + "mode": "chat", + "temperature": 0.7, + "max_tokens": 2000 + }, + "prompt": { + "system": "你是一个专业的小说编辑。你的任务是将用户提供的小说段落进行润色和增强,使其更适合转换为视觉分镜。\\n\\n要求:\\n1. 保持原有情节和人物设定不变\\n2. 增强场景描述、角色动作和情感表达\\n3. 让文本更具画面感和戏剧张力\\n4. 输出保持中文,长度控制在原文本的1.2-1.5倍", + "user": "请润色以下小说段落,使其更适合视觉化:\\n\\n{{input_novel}}" + }, + "outputs": { + "edited_text": "{{llm_response}}" + } + } + }, + { + "id": "storyboard_node", + "type": "llm", + "name": "分镜AI", + "description": "将叙述文本转换为分镜提示词", + "config": { + "model": { + "provider": "deepseek", + "name": "deepseek-r1", + "mode": "chat", + "temperature": 0.6, + "max_tokens": 3000 + }, + "prompt": { + "system": "你是一个专业的漫画分镜师。请将叙述文本转换为3-5个分镜描述,每个分镜包含视觉元素和图片生成提示词。\\n\\n输出格式要求(Markdown):\\n# 分镜分析\\n\\n## 场景概览\\n[简要描述整体场景]\\n\\n## 分镜详情\\n\\n### 分镜1:[标题]\\n**场景描述:** [详细视觉描述]\\n**角色动作:** [主要角色动作]\\n**情感氛围:** [情感色彩]\\n**图片提示词:** [用于图片生成的提示词,包含风格、构图等]\\n\\n### 分镜2:[标题]\\n...\\n\\n## 风格建议\\n[推荐的图片生成风格,如:动漫风格、写实插画、水彩等]\\n\\n注意:图片提示词要具体、详细,包含构图、灯光、风格等要素。", + "user": "请将以下文本转换为漫画分镜提示词:\\n\\n{{edited_text}}" + }, + "outputs": { + "storyboard_markdown": "{{llm_response}}" + } + } + } + ], + "edges": [ + { + "source": "input_novel", + "sourceHandle": "output", + "target": "editor_node", + "targetHandle": "input" + }, + { + "source": "editor_node", + "sourceHandle": "edited_text", + "target": "storyboard_node", + "targetHandle": "edited_text" + }, + { + "source": "storyboard_node", + "sourceHandle": "storyboard_markdown", + "target": "output", + "targetHandle": "input" + } + ], + "outputs": [ + { + "variable": "storyboard_markdown", + "label": "分镜提示词", + "description": "最终生成的Markdown格式分镜提示词" + } + ] +} +EOF +``` + +**步骤2:验证DSL文件格式** + +```bash +# 检查JSON格式 +python3 -m json.tool workflow/manga-generator-dify-dsl.json > /dev/null && echo "JSON格式正确" || echo "JSON格式错误" +``` + +**步骤3:通过Dify界面导入工作流** + +1. 登录Dify控制台 +2. 进入 "工作流" → "创建工作流" +3. 选择 "导入" +4. 上传或粘贴DSL内容 +5. 保存工作流为 "漫画生成验证工作流" + +**验证标准:** 工作流成功导入,两个LLM节点可见 + +--- + +### 任务4:配置工作流节点参数 + +**步骤1:调整编辑节点参数** + +1. 在Dify工作流编辑器中打开导入的工作流 +2. 点击 "小说编辑AI" 节点 +3. 确认配置: + - 模型:deepseek-r1 + - 温度:0.7 + - 最大令牌:2000 + - 系统提示词:已正确设置 + - 用户提示词模板:包含 `{{input_novel}}` 变量 + +**步骤2:调整分镜节点参数** + +1. 点击 "分镜AI" 节点 +2. 确认配置: + - 模型:deepseek-r1 + - 温度:0.6 + - 最大令牌:3000 + - 系统提示词:包含完整的Markdown格式要求 + - 用户提示词模板:包含 `{{edited_text}}` 变量 + +**步骤3:验证变量连接** + +1. 检查所有边(edges)连接正确: + - `input_novel` → `editor_node` + - `editor_node.edited_text` → `storyboard_node.edited_text` + - `storyboard_node.storyboard_markdown` → `output` + +**步骤4:保存工作流配置** + +1. 点击 "保存" +2. 发布工作流版本 + +**验证标准:** 工作流配置完整,所有节点连接正确 + +--- + +### 任务5:测试工作流执行 + +**测试用例文件:** `tests/test-inputs.md` + +**步骤1:创建测试输入** + +```bash +# 创建测试用例目录 +mkdir -p tests + +# 创建测试输入文件 +cat > tests/test-inputs.md << 'EOF' +## 测试用例1:基础场景 + +输入文本: +李阳推开厚重的木门,月光透过窗户洒在地板上。他看到父亲坐在书桌前,手里拿着一封信。房间里弥漫着淡淡的墨香,父亲的背影显得格外孤独。 + +预期输出: +1. 编辑节点:润色后的叙述文本(更丰富的视觉和情感描述) +2. 分镜节点:3-5个分镜的Markdown描述 + +## 测试用例2:动作场景 + +输入文本: +王雪快速穿过拥挤的街道,雨水打湿了她的头发。她回头看了一眼,追赶者的影子在路灯下拉长。心跳加速,她躲进了小巷的阴影中。 + +预期输出: +1. 编辑节点:增强动作节奏感 +2. 分镜节点:动态构图的分镜描述 +EOF +``` + +**步骤2:执行测试用例1** + +```bash +# 使用Dify API调用工作流 +curl -X POST "http://localhost:3000/v1/workflows/run" \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "inputs": { + "input_novel": "李阳推开厚重的木门,月光透过窗户洒在地板上。他看到父亲坐在书桌前,手里拿着一封信。房间里弥漫着淡淡的墨香,父亲的背影显得格外孤独。" + }, + "response_mode": "blocking", + "user": "test-user-1" + }' +``` + +**预期输出:** JSON响应包含 `storyboard_markdown` 字段 + +**步骤3:验证输出格式** + +检查响应中的 `storyboard_markdown` 字段: +1. 是否包含 "# 分镜分析" 标题 +2. 是否包含 "## 场景概览" 部分 +3. 是否包含 "### 分镜1:" 结构 +4. 是否包含 "**图片提示词:**" 字段 + +**步骤4:执行测试用例2** + +重复步骤2-3,使用测试用例2的输入文本 + +**验证标准:** 两个测试用例都能成功执行,输出符合Markdown格式要求 + +--- + +### 任务6:质量评估 + +**评估文件:** `tests/quality-assessment.md` + +**步骤1:创建质量评估标准** + +```bash +cat > tests/quality-assessment.md << 'EOF' +## 质量评估标准 + +### 编辑节点质量(1-5分) +1. **画面感增强**:是否增强了视觉描述? +2. **情感表达**:是否增强了情感氛围? +3. **文本流畅性**:润色后是否更流畅自然? +4. **长度控制**:是否控制在1.2-1.5倍原长度? + +### 分镜节点质量(1-5分) +1. **分镜数量**:是否生成3-5个合理分镜? +2. **描述具体性**:场景描述是否具体可视觉化? +3. **提示词质量**:图片提示词是否包含构图、灯光、风格? +4. **格式规范性**:是否严格遵循Markdown格式? + +### 总体评分 +- 优秀:15-20分 +- 良好:10-14分 +- 一般:5-9分 +- 需要改进:0-4分 +EOF +``` + +**步骤2:人工评估输出质量** + +1. 将任务5的输出保存到文件: + ```bash + # 保存测试用例1输出 + echo '测试用例1输出内容...' > tests/output-test1.md + + # 保存测试用例2输出 + echo '测试用例2输出内容...' > tests/output-test2.md + ``` + +2. 根据质量评估标准对每个输出打分 +3. 记录评分结果 + +**步骤3:识别改进点** + +1. 分析低分项目原因 +2. 提出提示词优化建议 +3. 记录需要调整的参数 + +**验证标准:** 完成质量评估,识别至少3个改进点 + +--- + +### 任务7:性能测试 + +**步骤1:测试响应时间** + +```bash +# 记录工作流执行时间 +time curl -X POST "http://localhost:3000/v1/workflows/run" \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "inputs": { + "input_novel": "测试文本,约100字长度。用于性能测试。需要包含足够的细节让AI能够处理,但不要太长以免影响测试速度。" + }, + "response_mode": "blocking", + "user": "performance-test" + }' +``` + +**预期:** 总时间 < 30秒(包括两个LLM调用) + +**步骤2:测试并发能力(可选)** + +```bash +# 同时发送3个请求 +for i in {1..3}; do + curl -X POST "http://localhost:3000/v1/workflows/run" \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d "{ + \"inputs\": { + \"input_novel\": \"并发测试文本 ${i}\" + }, + \"response_mode\": \"blocking\", + \"user\": \"concurrent-test-${i}\" + }" & +done +wait +``` + +**步骤3:记录性能指标** + +1. 平均响应时间 +2. 成功率 +3. 错误率(如果有) + +**验证标准:** 单个请求响应时间 < 30秒,成功率 > 90% + +--- + +### 任务8:验证结论与报告 + +**报告文件:** `docs/validation-report.md` + +**步骤1:汇总验证结果** + +```bash +cat > docs/validation-report.md << 'EOF' +# 漫画生成工具可行性验证报告 + +## 验证概述 +- **验证时间**:2026-02-28 +- **验证目标**:测试小说→编辑→分镜→提示词的端到端流程 +- **技术栈**:Dify + DeepSeek-R1 + +## 验证结果 + +### 流程顺畅性 ✅/❌ +[描述工作流是否能完整执行] + +### 输出质量评估 +**编辑节点评分**:[X]/20 +- 画面感增强:[X]/5 +- 情感表达:[X]/5 +- 文本流畅性:[X]/5 +- 长度控制:[X]/5 + +**分镜节点评分**:[Y]/20 +- 分镜数量:[Y]/5 +- 描述具体性:[Y]/5 +- 提示词质量:[Y]/5 +- 格式规范性:[Y]/5 + +**总体评分**:[总分]/40 + +### 性能表现 +- 平均响应时间:[Z]秒 +- 成功率:[A]% +- 并发处理:[B] + +## 关键发现 + +### 成功点 +1. [发现的成功点1] +2. [发现的成功点2] + +### 问题与改进点 +1. [问题1及改进建议] +2. [问题2及改进建议] + +## 可行性结论 + +**结论**:[可行/部分可行/不可行] + +**理由**: +1. [理由1] +2. [理由2] +3. [理由3] + +## 下一步建议 + +### 短期改进(如果继续验证) +1. [建议1] +2. [建议2] + +### 长期规划(如果验证成功) +1. [规划1] +2. [规划2] +EOF +``` + +**步骤2:填写验证结果** + +根据实际测试结果填写报告中的各项评分和数据 + +**步骤3:生成最终结论** + +基于验证结果,给出明确的可行性结论 + +**验证标准:** 完成完整的验证报告,包含数据支持和明确结论 + +--- + +## 执行选项 + +**计划已完成并保存至 `docs/plans/2026-02-28-manga-generator-validation-implementation.md`** + +**两种执行方式:** + +**1. 子代理驱动(本次会话)** - 我分派新的子代理执行每个任务,任务间进行代码审查,快速迭代 + +**2. 并行会话(独立)** - 在新工作区开启新会话使用 executing-plans,批量执行并设置检查点 + +**选择哪种方式?** \ No newline at end of file diff --git a/docs/workflow-v2-readme.md b/docs/workflow-v2-readme.md new file mode 100644 index 0000000..8955f57 --- /dev/null +++ b/docs/workflow-v2-readme.md @@ -0,0 +1,143 @@ +# 漫画生成工作流 v2 更新说明 + +## 新增功能 + +### 1. 双模式支持 +工作流现在支持两种输出模式: + +#### 模式A:传统漫画分镜 +- **适用场景**:小说段落、静态场景描述 +- **输出**:3-5个分镜,不强调时间轴 +- **示例输入**: + ``` + 李阳推开厚重的木门,月光透过窗户洒在地板上。他看到父亲坐在书桌前... + ``` + +#### 模式B:时间线漫画分镜 +- **适用场景**:连续动作描述、动态场景(如15秒画面描述) +- **输出**:带时间标记的分镜(如"0-3秒"、"3-6秒"),分镜数量由AI根据动作节奏自动决定 +- **示例输入**: + ``` + 冰凉的夜雨如密集的银针般倾泻,王雪的长发湿漉漉地黏在惨白的脸颊... + ``` +- **示例输出**: + ```markdown + ### 分镜1:[0-3秒] 雨中疾奔 + **时间点:** 0-3秒 + **场景描述:** 王雪在雨中奔跑,长发湿漉漉贴在脸上... + **图片提示词:** ... + + ### 分镜2:[3-6秒] 惊惶回眸 + **时间点:** 3-6秒 + ... + ``` + +### 2. 智能关键帧提取 +- **时间线分析AI**:自动识别动作转折点 +- **时间标记**:AI自由决定时间点(如"0-3秒"、"3-5秒",不一定是固定间隔) +- **动态分镜数**:根据动作节奏自动决定分镜数量(3-8个) + +## 使用步骤 + +### 1. 导入DSL +1. 访问 https://dify.wutongshucloud.com +2. 应用 → 创建应用 → 导入DSL +3. 选择 `workflow/漫画生成工作流-v2.yml` + +### 2. 运行工作流 +1. **输入文本**:粘贴你的描述 +2. **选择模式**: + - 传统漫画分镜:适合小说段落 + - 时间线漫画分镜:适合连续动作描述 +3. **查看输出**:根据选择的模式生成对应格式的分镜 + +### 3. 测试用例 + +#### 测试用例1:传统模式 +**输入**: +``` +李阳推开厚重的木门,月光透过窗户洒在地板上。他看到父亲坐在书桌前,手里拿着一封信。房间里弥漫着淡淡的墨香,父亲的背影显得格外孤独。 +``` +**模式**:传统漫画分镜 +**预期**:3-5个分镜,不标注时间 + +#### 测试用例2:时间线模式 +**输入**: +``` +冰凉的夜雨如密集的银针般倾泻,将整条街道浸泡在闪烁的霓虹与破碎的水光里。王雪的长发湿漉漉地黏在惨白的脸颊,她逆着稀疏而模糊的人影,在湿滑反光的柏油路上踉跄疾奔,每一次仓促的呼吸都在冰凉的空气中扯出白雾。惊惶回眸——那道追赶者的漆黑剪影,被身后惨白的路灯无限拉长、扭曲变形,紧贴地面疾速蔓延,仿佛噩梦具现的触角。 + +心脏在胸腔里疯狂擂动,震耳欲聋。就在窒息般的恐惧攥紧喉咙的瞬间,她眼角瞥见右前方一道极其狭窄的缝隙:那是两栋旧楼之间一道被遗忘的巷口,幽深,黑暗,像大地的一道伤口。求生的本能压倒一切,她猛地拧身折向,如离弦之箭般将自己彻底投进那片浓稠的、仿佛能吸收一切光线与声响的阴影之中。 + +巷内弥漫着潮湿的霉味与杂物堆积的腐朽气息。王雪的背脊紧紧抵住冰冷湿滑的砖墙,尖锐的碎石硌着皮肉。她用尽全部力气捂住自己的口鼻,将几乎冲喉而出的剧烈喘息与战栗死死压回身体深处,只剩下瞪大的双眼,死死盯向巷口那一方被雨幕朦胧的、危险的光亮。 +``` +**模式**:时间线漫画分镜 +**预期**:带时间标记的分镜(如"0-3秒"、"3-6秒"等) + +## 节点说明 + +### 开始节点 +- **输入文本**:小说段落或连续动作描述 +- **输出模式**: + - 传统漫画分镜 + - 时间线漫画分镜 + +### 模式选择器 +根据"输出模式"变量选择处理路径: +- 传统漫画分镜 → 小说编辑AI → 传统分镜AI +- 时间线漫画分镜 → 时间线分析AI → 时间线分镜AI + +### 传统路径 +1. **小说编辑AI**:润色文本,增强画面感 +2. **传统分镜AI**:生成3-5个传统漫画分镜 + +### 时间线路径 +1. **时间线分析AI**: + - 分析连续动作描述 + - 识别关键动作转折点 + - 标注时间点(AI自由决定) + - 提取每个时间点的画面描述 + +2. **时间线分镜AI**: + - 将时间线分析转换为带时间标记的分镜 + - 每个分镜包含:时间点、场景描述、图片提示词 + - 增加"叙事节奏建议"部分 + +### 输出节点 +合并两个路径的输出(根据选择的模式只显示对应结果) + +## 技术细节 + +### 条件分支实现 +使用 **question-classifier** 节点实现模式选择: +- query_variable_selector: `开始.output_mode` +- classes: + - 传统漫画分镜 + - 时间线漫画分镜 + +### 变量传递 +- 传统路径:`开始.input_text` → `小说编辑AI` → `传统分镜AI` → `输出` +- 时间线路径:`开始.input_text` → `时间线分析AI` → `时间线分镜AI` → `输出` + +### 输出合并 +输出节点使用:`{{#1740748800002.text#}}{{#1740748800006.text#}}` +由于只有一条路径会执行,所以只显示对应模式的输出 + +## 注意事项 + +1. **模式选择很重要**: + - 静态场景描述 → 选择"传统漫画分镜" + - 连续动作描述 → 选择"时间线漫画分镜" + +2. **时间标记是估算值**: + - AI会根据动作节奏自由决定时间范围 + - 不是精确的时间码,而是帮助理解叙事节奏的参考 + +3. **分镜数量**: + - 传统模式:固定3-5个 + - 时间线模式:AI根据动作复杂度自动决定(通常3-8个) + +## 后续优化建议 + +1. **增加示例提示**:在开始节点增加示例文本,帮助用户选择正确的模式 +2. **自动模式识别**:训练AI自动判断输入适合哪种模式 +3. **细化时间粒度**:允许用户指定时间精度(如"每2秒一个分镜") diff --git a/docs/我在五代搞基建-可读版小剧本1.0.md b/docs/我在五代搞基建-可读版小剧本1.0.md new file mode 100644 index 0000000..1ee729c --- /dev/null +++ b/docs/我在五代搞基建-可读版小剧本1.0.md @@ -0,0 +1,354 @@ +# 《我在五代搞基建》可读版小剧本 1.0 + +## 一句话定位 +现代土木工程师穿越五代乱世,靠工程技术从“活下来”走到“改秩序”,在权谋、战争与人性里做选择。 + +--- + +## 第一章 坠落 + +河北,某隧道工地。 + +警报响了三次,林远还盯着平板上的地层模型。 + +“林工,撤!” + +喊声刚落,顶板像被巨手掀开,钢筋与混凝土一起塌下来。灯光熄灭,世界只剩轰鸣与粉尘。 + +林远抱头扑倒,耳边最后一个声音,是金属断裂时那种刺耳的尖啸。 + +再睁眼时,他在一条冰冷的山溪里。 + +他咳出两口水,撑着石头爬起来。四周只有湿冷的林子和不知名的鸟叫。没有施工便道,没有吊车,没有人。 + +只有口袋里那部碎屏手机。 + +他按亮屏幕:15%电,0格信号。 + +相册没了,聊天记录没了,唯独离线资料还在: + +- 《中国古代建筑防震手册》 +- 《黑火药提纯与配比》 +- 《农作物轮作技术指南》 + +林远盯着那几行文件名,忽然觉得荒诞得像一个恶意玩笑。 + +远处,狼嚎响起。 + +他抬头,第一次感到真正的恐惧。 + +--- + +## 第二章 官道 + +第二天午后,官道上尘土飞扬。 + +林远刚躲进灌木,就看见一队披甲溃兵在抢难民。有人跪地求饶,被一脚踹翻。一个骑兵提刀,冲向抱着幼弟的小女孩。 + +林远没有时间思考。 + +他捡起石块,朝骑兵后背砸去。石头砸在铁甲上,发出沉闷一响。骑兵愣了一下,转头看见他,怒吼着拨马冲来。 + +林远转身就跑,冲到路边破茶棚前,抄起翻倒木桌,把折断的自拍杆卡进缝隙,尖端朝上。 + +战马冲到近前,前蹄踩空,整匹马猛地上扬,骑兵被甩出去。林远扑上去,安全帽当锤,连砸两下。 + +对方挣扎,林远咬牙,工兵铲横着顶住对方喉咙。 + +“再动就死。” + +骑兵眼神凶狠,却终于停住。 + +林远喘得胸口生疼,回头去找那两个孩子。 + +女孩浑身发抖,手却死死护着弟弟。 + +“叫什么名字?” + +“我……我叫小翠。” + +“他呢?” + +“小石头。” + +林远点头:“跟我走。现在。” + +身后传来追兵叫骂。三个人钻进林子,像三只被猎犬追赶的小兽。 + +--- + +## 第三章 破庙夜话 + +夜里,破庙漏风。 + +林远把压缩饼干掰成三份,最大的一块塞给小石头。男孩狼吞虎咽,呛得咳嗽。小翠一边拍弟弟背,一边悄悄看林远手里的“亮纸”包装。 + +“你们家乡的纸,都这么亮吗?” + +林远苦笑:“嗯,很贵。” + +他不敢说那叫复合膜,也不敢说工地宿舍楼下超市里随便买。 + +火堆快熄了。手机只剩7%。 + +林远打开离线地图缓存,看见模糊的北方轮廓,手指在泥地上画了一遍:太行、太原、幽州。 + +小翠蹲在旁边看,突然问:“大哥哥,你会写字吗?” + +林远一怔,点头。 + +小翠低声说:“那你以后能不能教我?会写字的人,不容易饿死。” + +这句话让林远沉默很久。 + +他看着两个孩子蜷在火光里,心里第一次有了方向。 + +“先活下去。”他说,“活下去,再说别的。” + +手机电量跳到1%。 + +黑屏前最后一秒,时间停在他熟悉的现代日期。 + +下一秒,彻底熄灭。 + +--- + +## 第四章 太原城下 + +三天后,太原城门。 + +难民排成一条灰色长蛇。城墙高而旧,脚手架歪斜,吊绳磨损,工匠在上面像踩着命在干活。 + +林远只看了两眼,就知道那套滑轮组装反了。 + +“这样吊,迟早断。”他低声说。 + +旁边工头听见,嗤笑:“你懂?” + +林远没解释,走上前:“给我两根绳,一根横梁。我让你们两个人顶四个人。” + +工头冷脸:“做不到,滚出城。” + +“做到了呢?” + +“做到了,给你饭吃。” + +半个时辰后,围观的人越来越多。 + +林远重新穿绳、改受力点、加一道交叉固定。两名工匠试着拉,原本卡死的石料竟平稳抬起。 + +人群先静,后炸开。 + +工头瞪着那块离地的石头,脸上写满不信。 + +“这……什么邪术?” + +林远擦掉手上的灰,淡淡道:“不是邪术。是省力。” + +他本想说“机械优势”,想了想,改口:“格物。” + +这两个字像石子落水,传进了城里更多人的耳朵。 + +--- + +## 第五章 节度使府 + +当晚,林远被带进节度使府。 + +偏厅灯火不亮,墙上挂着地图和兵器。刘知远坐在案后,不怒自威。 + +“你叫林远?” + +“是。” + +“哪里人?” + +“幽州。” + +“会什么?” + +林远停了一瞬:“筑城、治水、炼铁、农具改造。” + +厅中几名亲兵都笑了。刘知远没笑,只盯着他。 + +“你可知,夸口在军中是什么罪?” + +“知。” + +“那你还敢说?” + +林远抬眼,语气平稳:“将军要的是能用的人,不是会低头的人。” + +厅里瞬间安静。 + +刘知远忽然起身,走到地图前。 + +“太原若被围,最先断什么?” + +“水。”林远没看地图,直接答,“若敌军截上游,城内先乱。要提前凿井、修蓄水池、分级配水,先保军营再保民区。” + +刘知远眼神微动。 + +“明日去军器监。” + +“是。” + +“林远。” + +“在。” + +“别让我失望。” + +--- + +## 第六章 军器监 + +军器监里终日火星四溅。 + +林远站在炉前看了一圈:炉温不稳,皮囊鼓风忽强忽弱,铁里夹渣严重。老铁匠不服他,冷着脸扔来一句:“会说不算,会打才算。” + +林远点头,卷起袖子。 + +他拆了皮囊,改成活塞风箱。第一轮拉动时,火焰猛地窜高,炉膛亮得发白。 + +老铁匠先骂,骂到一半停住。 + +第二炉铁出来,锭面更细,杂质更少。围观工匠一下全围了上来。 + +“这法子能教吗?”老铁匠声音发颤。 + +“能。” + +“要钱吗?” + +“不要。” + +“那你图什么?” + +林远看着炉火,轻声说:“图你们以后少死几个人。” + +这句话比任何技术都快,在工匠间传开。 + +几日后,林远又在汾水边架起水轮,做出水排。鼓风从人力改成水力,炉火昼夜不断。 + +刘知远再次召见他,这次厅里多了一个人。 + +郭威,目光沉静,话不多。 + +“听说你还懂农具?”郭威问。 + +林远拿起笔,在麻纸上画了曲辕犁结构。犁评、犁箭、犁壁,一笔一笔讲受力与调深。 + +郭威看完,点头:“这不是匠气,这是章法。” + +刘知远拍案:“试制。” + +城外试田,老农扶着新犁走过第一垄地,回头时眼里含泪。 + +“省牛,也省命。” + +--- + +## 第七章 燕云与火 + +夜宴只有三人:刘知远、郭威、林远。 + +地图摊开,话题落在燕云十六州。 + +“石敬瑭若引契丹南下,中原会怎样?”郭威问。 + +林远指着关隘线,几乎本能地说出地理链路:幽州、云州、山口、平原、行军日程。 + +他说完,屋里很久没人接话。 + +刘知远端着杯,低声道:“你像提前见过这一切。” + +林远没有回答。 + +那晚之后,他被正式留在幕府,身份从“会干活的外乡人”变成“可议事的幕僚”。 + +但他知道,这一步并不安全。 + +他在山谷里设了隐蔽工坊,开始试验最原始的火药配比。硝石提纯、硫磺研磨、木炭筛粉,每一步都像在刀尖上跳舞。 + +点火那刻,所有人退到坡后。 + +引线燃尽,轰的一声,地面炸出黑坑。 + +工匠们跪了一片,喊“天雷”。 + +林远站在烟尘里,心一点点往下沉。 + +他比任何人都清楚,自己放出来的不是奇迹,是一头会反噬主人的兽。 + +--- + +## 第八章 书房里的选择(试读终点) + +黄昏,节度使书房。 + +林远把一小包黑色粉末放在案上。 + +刘知远盯着它,问: + +“这是什么?” + +“人造的雷。” + +“能守城?” + +“能。” + +“能攻城?” + +“也能。” + +刘知远沉默片刻,突然换了问题: + +“你要什么?” + +林远没立刻答。 + +窗外风过汾水,远处更鼓三响。 + +“我要军器监和工坊的人事权,三个月。我要先修军械、再修水利、再修粮路。” + +“你知道你在要什么吗?” + +“知道。” + +“你也知道,旧派会要你的命。” + +“知道。” + +刘知远盯着他,慢慢笑了,笑意却冷。 + +“好。我给你三个月。” + +“谢将军。” + +“林远。” + +“在。” + +“做不成,你自己挑个死法。” + +林远拱手,声音很稳: + +“若做成呢?” + +“若做成,”刘知远起身,走到地图前,“河东由你先画图。” + +林远抬头,看见烛光映在那张北方地图上,像一条尚未成形的路。 + +他知道,真正的战争才刚开始。 + +--- + +## 读后判断点(给你快速判断是否“上头”) + +- 你是否想继续看“林远怎么在三个月内交差”? +- 你是否关心“小翠从被救者成长为关键角色”的线? +- 你是否期待“技术理性 vs 乱世权谋”的正面对撞? + +如果这三条里有两条打中你,这个项目就值得继续扩写成完整剧集版。 diff --git a/tests/quality-assessment.md b/tests/quality-assessment.md new file mode 100644 index 0000000..1b2edb2 --- /dev/null +++ b/tests/quality-assessment.md @@ -0,0 +1,173 @@ +## 质量评估标准 + +### 编辑节点质量(每项1-5分,共20分) + +#### 1. 画面感增强(1-5分) +- **5分**:显著增强,添加了丰富的视觉细节(光影、色彩、空间感) +- **4分**:明显增强,有较多视觉描述 +- **3分**:适度增强,有一些视觉细节 +- **2分**:略有增强,视觉描述不明显 +- **1分**:几乎无增强,缺乏画面感 + +#### 2. 情感表达(1-5分) +- **5分**:情感细腻,氛围渲染到位,读者能深刻感受 +- **4分**:情感表达清晰,有一定的氛围渲染 +- **3分**:情感表达基本到位 +- **2分**:情感表达较弱 +- **1分**:缺乏情感色彩 + +#### 3. 文本流畅性(1-5分) +- **5分**:行文流畅,节奏把控好,语言精炼 +- **4分**:较流畅,节奏比较自然 +- **3分**:基本流畅,偶有生硬处 +- **2分**:不够流畅,有多处生硬 +- **1分**:流畅性差 + +#### 4. 长度控制(1-5分) +- **5分**:长度控制在原文本的1.2-1.5倍,恰到好处 +- **4分**:长度接近理想范围(1.1-1.6倍) +- **3分**:长度略有偏差(1.0-1.7倍) +- **2分**:长度偏差较大 +- **1分**:过长或过短 + +--- + +### 分镜节点质量(每项1-5分,共20分) + +#### 1. 分镜数量(1-5分) +- **5分**:3-5个分镜,数量适中,节奏合理 +- **4分**:分镜数量接近理想(2-6个) +- **3分**:分镜数量略有偏差 +- **2分**:分镜数量不合理(过少或过多) +- **1分**:分镜数量严重偏离要求 + +#### 2. 描述具体性(1-5分) +- **5分**:场景描述非常具体,包含完整的视觉元素 +- **4分**:场景描述较具体,大部分视觉元素清晰 +- **3分**:场景描述基本清晰 +- **2分**:场景描述不够具体 +- **1分**:场景描述模糊,无法视觉化 + +#### 3. 提示词质量(1-5分) +- **5分**:提示词详细完整,包含构图、灯光、风格等要素,可直接用于图片生成 +- **4分**:提示词较详细,包含多个要素 +- **3分**:提示词基本可用,缺少部分要素 +- **2分**:提示词不够详细,难以直接使用 +- **1分**:提示词质量差,无法使用 + +#### 4. 格式规范性(1-5分) +- **5分**:严格遵循Markdown格式,结构清晰完整 +- **4分**:格式较规范,有轻微偏差 +- **3分**:格式基本正确 +- **2分**:格式有多处错误 +- **1分**:格式混乱 + +--- + +### 总体评分标准 + +**总分(满分40分):** +- **优秀(36-40分)**:输出质量高,可直接用于图片生成 +- **良好(28-35分)**:输出质量不错,稍作调整即可使用 +- **一般(20-27分)**:输出质量一般,需要较多调整 +- **需要改进(<20分)**:输出质量不足,需要优化提示词 + +--- + +### 评估记录表格 + +#### 测试用例1评分表 + +| 评估项目 | 得分 | 备注 | +|---------|-----|------| +| **编辑节点(/20)** | | | +| 画面感增强 | /5 | | +| 情感表达 | /5 | | +| 文本流畅性 | /5 | | +| 长度控制 | /5 | | +| **分镜节点(/20)** | | | +| 分镜数量 | /5 | | +| 描述具体性 | /5 | | +| 提示词质量 | /5 | | +| 格式规范性 | /5 | | +| **总分** | **/40** | | + +#### 测试用例2评分表 + +| 评估项目 | 得分 | 备注 | +|---------|-----|------| +| **编辑节点(/20)** | | | +| 画面感增强 | /5 | | +| 情感表达 | /5 | | +| 文本流畅性 | /5 | | +| 长度控制 | /5 | | +| **分镜节点(/20)** | | | +| 分镜数量 | /5 | | +| 描述具体性 | /5 | | +| 提示词质量 | /5 | | +| 格式规范性 | /5 | | +| **总分** | **/40** | | + +#### 测试用例3评分表 + +| 评估项目 | 得分 | 备注 | +|---------|-----|------| +| **编辑节点(/20)** | | | +| 画面感增强 | /5 | | +| 情感表达 | /5 | | +| 文本流畅性 | /5 | | +| 长度控制 | /5 | | +| **分镜节点(/20)** | | | +| 分镜数量 | /5 | | +| 描述具体性 | /5 | | +| 提示词质量 | /5 | | +| 格式规范性 | /5 | | +| **总分** | **/40** | | + +#### 测试用例4评分表 + +| 评估项目 | 得分 | 备注 | +|---------|-----|------| +| **编辑节点(/20)** | | | +| 画面感增强 | /5 | | +| 情感表达 | /5 | | +| 文本流畅性 | /5 | | +| 长度控制 | /5 | | +| **分镜节点(/20)** | | | +| 分镜数量 | /5 | | +| 描述具体性 | /5 | | +| 提示词质量 | /5 | | +| 格式规范性 | /5 | | +| **总分** | **/40** | | + +--- + +### 综合评估总结 + +#### 平均得分:____ / 40 + +#### 总体评级: +- [ ] 优秀(36-40分) +- [ ] 良好(28-35分) +- [ ] 一般(20-27分) +- [ ] 需要改进(<20分) + +#### 主要优点: +1. +2. +3. + +#### 主要问题: +1. +2. +3. + +#### 改进建议: +1. +2. +3. + +#### 可行性判断: +- [ ] **可行**:输出质量达标,流程顺畅,可以继续优化 +- [ ] **部分可行**:需要调整提示词或参数后再次测试 +- [ ] **不可行**:输出质量不足,需要重新设计方案 diff --git a/tests/test-inputs.md b/tests/test-inputs.md new file mode 100644 index 0000000..fdc05a0 --- /dev/null +++ b/tests/test-inputs.md @@ -0,0 +1,49 @@ +## 测试用例1:基础场景 + +输入文本: +``` +李阳推开厚重的木门,月光透过窗户洒在地板上。他看到父亲坐在书桌前,手里拿着一封信。房间里弥漫着淡淡的墨香,父亲的背影显得格外孤独。 +``` + +预期输出: +1. 编辑节点:润色后的叙述文本(更丰富的视觉和情感描述) +2. 分镜节点:3-5个分镜的Markdown描述 + +--- + +## 测试用例2:动作场景 + +输入文本: +``` +王雪快速穿过拥挤的街道,雨水打湿了她的头发。她回头看了一眼,追赶者的影子在路灯下拉长。心跳加速,她躲进了小巷的阴影中。 +``` + +预期输出: +1. 编辑节点:增强动作节奏感 +2. 分镜节点:动态构图的分镜描述 + +--- + +## 测试用例3:对话场景 + +输入文本: +``` +"你为什么要这么做?"林夏的声音在颤抖,她紧紧攥着手中的照片。张明沉默了片刻,望向窗外灰暗的天空:"有些事情,你现在还不会明白。" +``` + +预期输出: +1. 编辑节点:增强对话张力和人物情绪 +2. 分镜节点:包含人物表情和对话的分镜 + +--- + +## 测试用例4:奇幻场景 + +输入文本: +``` +龙翼展开,遮蔽了半边天空。骑士拔出长剑,剑身泛着蓝色的魔法光芒。巨龙俯下头颅,金色的竖瞳凝视着这个渺小的人类。空气在燃烧,大地在颤抖。 +``` + +预期输出: +1. 编辑节点:增强奇幻氛围和史诗感 +2. 分镜节点:包含特效和动作的分镜 diff --git a/workflow/manga-generator-dify-dsl.json b/workflow/manga-generator-dify-dsl.json new file mode 100644 index 0000000..5a5de6c --- /dev/null +++ b/workflow/manga-generator-dify-dsl.json @@ -0,0 +1,101 @@ +{ + "version": "1.0", + "name": "漫画生成工作流验证", + "description": "验证小说到漫画分镜提示词的AI处理流程", + "variables": [ + { + "variable": "input_novel", + "value_type": "string", + "required": true, + "label": "小说原文", + "description": "用户输入的小说短段落(300-1000字)" + }, + { + "variable": "edited_text", + "value_type": "string", + "required": false, + "label": "编辑后文本", + "description": "AI编辑润色后的叙述文本" + }, + { + "variable": "storyboard_markdown", + "value_type": "string", + "required": false, + "label": "分镜提示词", + "description": "Markdown格式的分镜描述和图片提示词" + } + ], + "nodes": [ + { + "id": "editor_node", + "type": "llm", + "name": "小说编辑AI", + "description": "润色和增强小说文本描述", + "config": { + "model": { + "provider": "deepseek", + "name": "deepseek-r1", + "mode": "chat", + "temperature": 0.7, + "max_tokens": 2000 + }, + "prompt": { + "system": "你是一个专业的小说编辑。你的任务是将用户提供的小说段落进行润色和增强,使其更适合转换为视觉分镜。\n\n要求:\n1. 保持原有情节和人物设定不变\n2. 增强场景描述、角色动作和情感表达\n3. 让文本更具画面感和戏剧张力\n4. 输出保持中文,长度控制在原文本的1.2-1.5倍", + "user": "请润色以下小说段落,使其更适合视觉化:\n\n{{input_novel}}" + }, + "outputs": { + "edited_text": "{{llm_response}}" + } + } + }, + { + "id": "storyboard_node", + "type": "llm", + "name": "分镜AI", + "description": "将叙述文本转换为分镜提示词", + "config": { + "model": { + "provider": "deepseek", + "name": "deepseek-r1", + "mode": "chat", + "temperature": 0.6, + "max_tokens": 3000 + }, + "prompt": { + "system": "你是一个专业的漫画分镜师。请将叙述文本转换为3-5个分镜描述,每个分镜包含视觉元素和图片生成提示词。\n\n输出格式要求(Markdown):\n# 分镜分析\n\n## 场景概览\n[简要描述整体场景]\n\n## 分镜详情\n\n### 分镜1:[标题]\n**场景描述:** [详细视觉描述]\n**角色动作:** [主要角色动作]\n**情感氛围:** [情感色彩]\n**图片提示词:** [用于图片生成的提示词,包含风格、构图等]\n\n### 分镜2:[标题]\n...\n\n## 风格建议\n[推荐的图片生成风格,如:动漫风格、写实插画、水彩等]\n\n注意:图片提示词要具体、详细,包含构图、灯光、风格等要素。", + "user": "请将以下文本转换为漫画分镜提示词:\n\n{{edited_text}}" + }, + "outputs": { + "storyboard_markdown": "{{llm_response}}" + } + } + } + ], + "edges": [ + { + "source": "input_novel", + "sourceHandle": "output", + "target": "editor_node", + "targetHandle": "input" + }, + { + "source": "editor_node", + "sourceHandle": "edited_text", + "target": "storyboard_node", + "targetHandle": "edited_text" + }, + { + "source": "storyboard_node", + "sourceHandle": "storyboard_markdown", + "target": "output", + "targetHandle": "input" + } + ], + "outputs": [ + { + "variable": "storyboard_markdown", + "label": "分镜提示词", + "description": "最终生成的Markdown格式分镜提示词" + } + ] +} diff --git a/workflow/剧本创作通用工作流-v1.yml b/workflow/剧本创作通用工作流-v1.yml new file mode 100644 index 0000000..0480d59 --- /dev/null +++ b/workflow/剧本创作通用工作流-v1.yml @@ -0,0 +1,481 @@ +app: + description: 通用剧本创作工作流 - 一套流程覆盖大纲、写作、拆解三种模式 + icon: 🎞️ + icon_background: '#E8F5E9' + mode: workflow + name: 剧本创作通用工作流-v1 + use_icon_as_answer_icon: false +kind: app +version: 0.1.2 +workflow: + conversation_variables: [] + environment_variables: [] + features: + file_upload: + enabled: false + opening_statement: '输入项目设定并选择模式:大纲模式 / 写作模式 / 拆解模式。' + retriever_resource: + enabled: false + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + graph: + edges: + - data: + isInIteration: false + sourceType: start + targetType: if-else + id: 1940748800000-source-1940748800004-target + source: '1940748800000' + sourceHandle: source + target: '1940748800004' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: if-else + targetType: llm + id: 1940748800004-true-1940748800001-target + source: '1940748800004' + sourceHandle: 'true' + target: '1940748800001' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: if-else + targetType: if-else + id: 1940748800004-false-1940748800008-target + source: '1940748800004' + sourceHandle: 'false' + target: '1940748800008' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: answer + id: 1940748800001-source-1940748800005-target + source: '1940748800001' + sourceHandle: source + target: '1940748800005' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: if-else + targetType: llm + id: 1940748800008-true-1940748800002-target + source: '1940748800008' + sourceHandle: 'true' + target: '1940748800002' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: if-else + targetType: llm + id: 1940748800008-false-1940748800003-target + source: '1940748800008' + sourceHandle: 'false' + target: '1940748800003' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: answer + id: 1940748800002-source-1940748800006-target + source: '1940748800002' + sourceHandle: source + target: '1940748800006' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: answer + id: 1940748800003-source-1940748800007-target + source: '1940748800003' + sourceHandle: source + target: '1940748800007' + targetHandle: target + type: custom + zIndex: 0 + nodes: + - data: + desc: '' + selected: false + title: 开始 + type: start + variables: + - label: 项目名 + max_length: 120 + options: [] + required: true + type: text-input + variable: project_name + - label: 核心一句话 + max_length: 500 + options: [] + required: true + type: paragraph + variable: core_idea + - label: 时代与世界观 + max_length: 1200 + options: [] + required: true + type: paragraph + variable: world_setting + - label: 角色设定 + max_length: 2000 + options: [] + required: true + type: paragraph + variable: character_setup + - label: 风格参考 + max_length: 1200 + options: [] + required: false + type: paragraph + variable: style_reference + - label: 当前任务目标 + max_length: 1200 + options: [] + required: false + type: paragraph + variable: task_goal + - label: 已有文本(拆解时必填) + max_length: 8000 + options: [] + required: false + type: paragraph + variable: existing_text + - label: 输出模式 + max_length: 24 + options: + - 大纲模式 + - 写作模式 + - 拆解模式 + required: true + type: select + variable: output_mode + height: 220 + id: '1940748800000' + position: + x: 80 + y: 280 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 260 + - data: + cases: + - case_id: 'true' + conditions: + - comparison_operator: contains + id: condition-001 + value: 大纲模式 + varType: string + variable_selector: + - '1940748800000' + - output_mode + id: 'true' + logical_operator: and + - case_id: 'false' + conditions: + - comparison_operator: not contains + id: condition-002 + value: 大纲模式 + varType: string + variable_selector: + - '1940748800000' + - output_mode + id: 'false' + logical_operator: and + desc: 先判断是否走大纲模式 + selected: false + title: 模式判断A + type: if-else + height: 140 + id: '1940748800004' + position: + x: 390 + y: 280 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + cases: + - case_id: 'true' + conditions: + - comparison_operator: contains + id: condition-003 + value: 写作模式 + varType: string + variable_selector: + - '1940748800000' + - output_mode + id: 'true' + logical_operator: and + - case_id: 'false' + conditions: + - comparison_operator: not contains + id: condition-004 + value: 写作模式 + varType: string + variable_selector: + - '1940748800000' + - output_mode + id: 'false' + logical_operator: and + desc: 非大纲后,区分写作与拆解 + selected: false + title: 模式判断B + type: if-else + height: 140 + id: '1940748800008' + position: + x: 700 + y: 420 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 生成可执行的剧本全局规划 + model: + completion_params: + max_tokens: 3600 + temperature: 0.7 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是资深剧集编剧统筹,擅长长剧结构设计。 + 任务:基于输入生成“可持续连载”的剧本大纲,不空泛。 + + 输出格式(Markdown): + # 项目总纲 + ## 1) 核心卖点(3条) + ## 2) 世界观规则(5条) + ## 3) 主角成长弧(起点-转折-代价-终局) + ## 4) 关键配角弧(至少3人) + ## 5) 三幕式结构(每幕目标、冲突、爆点) + ## 6) 20集分集卡点(每集2-3句,含结尾钩子) + ## 7) 风险与修正建议(至少5条) + + 约束: + - 每集必须有“目标-阻碍-变化” + - 不要模板化鸡汤句 + - 允许爽点,但必须包含代价 + - id: user-001 + role: user + text: | + 项目名:{{#1940748800000.project_name#}} + 核心一句话:{{#1940748800000.core_idea#}} + 时代与世界观:{{#1940748800000.world_setting#}} + 角色设定:{{#1940748800000.character_setup#}} + 风格参考:{{#1940748800000.style_reference#}} + 当前任务目标:{{#1940748800000.task_goal#}} + selected: false + title: 大纲统筹AI + type: llm + variables: [] + height: 98 + id: '1940748800001' + position: + x: 700 + y: 120 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 生成单集可拍剧本草稿 + model: + completion_params: + max_tokens: 3800 + temperature: 0.72 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是影视剧本执笔编剧。 + 任务:根据项目设定与当前任务,输出一集可拍的场景剧本草稿。 + + 输出格式(Markdown): + # 单集剧本草稿 + ## 集标题 + ## 本集主题与冲突 + ## 场景列表(8-12场) + 每场按以下格式: + - 场次编号 + - 时空标记(内/外 + 日/夜 + 地点) + - 画面动作 + - 关键对白(2-6句) + - 场尾钩子 + + ## 节奏检查 + - 前10%钩子是否成立 + - 中段是否升级 + - 结尾是否有不可逆变化 + + 约束: + - 避免百科式解释 + - 角色对白要有身份区分 + - 保留类型爽点,同时写出代价 + - id: user-001 + role: user + text: | + 项目名:{{#1940748800000.project_name#}} + 核心一句话:{{#1940748800000.core_idea#}} + 时代与世界观:{{#1940748800000.world_setting#}} + 角色设定:{{#1940748800000.character_setup#}} + 风格参考:{{#1940748800000.style_reference#}} + 当前任务目标:{{#1940748800000.task_goal#}} + selected: false + title: 剧本写作AI + type: llm + variables: [] + height: 98 + id: '1940748800002' + position: + x: 1020 + y: 350 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 将已有剧本拆解为生产资料(分镜/口播/发布文案) + model: + completion_params: + max_tokens: 3800 + temperature: 0.65 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是内容拆解与改编总监。 + 任务:把输入的剧本文本拆解为短视频与图文生产资料。 + + 输出格式(Markdown): + # 剧本拆解包 + ## 1) 剧情主线摘要(150字内) + ## 2) 关键角色卡(主角+2配角) + ## 3) 分镜提纲(6-10镜头) + 每条含:镜头目的 / 画面 / 台词要点 / 情绪 + ## 4) 60秒口播稿 + ## 5) 小红书笔记版文案(220-320字) + ## 6) 标题10条(悬念/反差/结论各至少3条) + ## 7) 封面文案3组(主+副) + + 约束: + - 不改变原剧情核心事件 + - 可优化节奏与表达,但不凭空新增关键设定 + - id: user-001 + role: user + text: | + 项目名:{{#1940748800000.project_name#}} + 风格参考:{{#1940748800000.style_reference#}} + 当前任务目标:{{#1940748800000.task_goal#}} + 已有文本:{{#1940748800000.existing_text#}} + selected: false + title: 剧本拆解AI + type: llm + variables: [] + height: 98 + id: '1940748800003' + position: + x: 1020 + y: 520 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + answer: '{{#1940748800001.text#}}' + desc: 输出项目总纲与分集卡点 + selected: false + title: 大纲模式输出 + type: answer + variables: [] + height: 102 + id: '1940748800005' + position: + x: 1330 + y: 120 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + answer: '{{#1940748800002.text#}}' + desc: 输出单集可拍剧本草稿 + selected: false + title: 写作模式输出 + type: answer + variables: [] + height: 102 + id: '1940748800006' + position: + x: 1330 + y: 350 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + answer: '{{#1940748800003.text#}}' + desc: 输出剧本拆解资料包 + selected: false + title: 拆解模式输出 + type: answer + variables: [] + height: 102 + id: '1940748800007' + position: + x: 1330 + y: 520 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 diff --git a/workflow/剧本创作通用工作流-v2.yml b/workflow/剧本创作通用工作流-v2.yml new file mode 100644 index 0000000..4e109b4 --- /dev/null +++ b/workflow/剧本创作通用工作流-v2.yml @@ -0,0 +1,589 @@ +app: + description: 通用剧本创作工作流 - 同时生成大纲、写作、拆解并导出DOCX + icon: 🎞️ + icon_background: '#E8F5E9' + mode: workflow + name: 剧本创作通用工作流-v2 + use_icon_as_answer_icon: false +dependencies: +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: bowenliang123/md_exporter:2.2.0@9f39c2c2c1cd09180e2cc053090adc9886019483f502727467f136712b8b9639 + version: null +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: langgenius/deepseek:0.0.11@35bcd3f233f99d07bdadef8b326945df3bda5e8f773330144bc90d84800336b9 + version: null +kind: app +version: 0.5.0 +workflow: + conversation_variables: [] + environment_variables: [] + features: + file_upload: + enabled: false + opening_statement: '输入项目设定后,将自动同时生成:项目大纲、单集草稿、拆解素材,并导出为DOCX。' + retriever_resource: + enabled: false + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions: [] + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + language: '' + voice: '' + graph: + edges: + - data: + isInIteration: false + isInLoop: false + sourceType: start + targetType: llm + id: 2040748800000-source-2040748800001-target + source: '2040748800000' + sourceHandle: source + target: '2040748800001' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: llm + id: 2040748800001-source-2040748800002-target + source: '2040748800001' + sourceHandle: source + target: '2040748800002' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: start + targetType: llm + id: 2040748800000-source-2040748800003-target + source: '2040748800000' + sourceHandle: source + target: '2040748800003' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: code + id: 2040748800001-source-2040748800004-target + source: '2040748800001' + sourceHandle: source + target: '2040748800004' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: code + id: 2040748800002-source-2040748800004-target + source: '2040748800002' + sourceHandle: source + target: '2040748800004' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: code + id: 2040748800003-source-2040748800004-target + source: '2040748800003' + sourceHandle: source + target: '2040748800004' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: code + targetType: tool + id: 2040748800004-source-2040748800005-target + source: '2040748800004' + sourceHandle: source + target: '2040748800005' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: tool + targetType: end + id: 2040748800005-source-2040748800006-target + source: '2040748800005' + sourceHandle: source + target: '2040748800006' + targetHandle: target + type: custom + zIndex: 0 + nodes: + - data: + selected: false + title: 开始 + type: start + variables: + - default: '' + hint: '' + label: 项目名 + max_length: 120 + options: [] + placeholder: '' + required: true + type: text-input + variable: project_name + - default: '' + hint: '' + label: 核心一句话 + max_length: 500 + options: [] + placeholder: '' + required: true + type: paragraph + variable: core_idea + - default: '' + hint: '' + label: 时代与世界观 + max_length: 1200 + options: [] + placeholder: '' + required: true + type: paragraph + variable: world_setting + - default: '' + hint: '' + label: 角色设定 + max_length: 2500 + options: [] + placeholder: '' + required: true + type: paragraph + variable: character_setup + - default: '' + hint: '' + label: 风格参考 + max_length: 1200 + options: [] + placeholder: '' + required: false + type: paragraph + variable: style_reference + - default: '' + hint: '' + label: 当前任务目标 + max_length: 1200 + options: [] + placeholder: '' + required: false + type: paragraph + variable: task_goal + - default: 第1集 + hint: '' + label: 目标集数(用于单集生成) + max_length: 32 + options: [] + placeholder: 例如:第1集 / 第10集 + required: true + type: text-input + variable: target_episode + - default: '' + hint: '' + label: 已有文本(用于拆解) + max_length: 8000 + options: [] + placeholder: '' + required: false + type: paragraph + variable: existing_text + height: 250 + id: '2040748800000' + position: + x: 80 + y: 260 + positionAbsolute: + x: 80 + y: 260 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 260 + - data: + context: + enabled: false + variable_selector: [] + desc: 生成项目总纲和分集卡点 + model: + completion_params: + temperature: 0.7 + max_tokens: 3200 + mode: chat + name: deepseek-chat + provider: langgenius/deepseek/deepseek + prompt_template: + - id: sys-001 + role: system + text: | + 你是资深剧集编剧统筹。输出务必具体、可执行。 + + 输出格式(Markdown): + # A. 项目总纲 + ## 核心卖点(3条) + ## 世界观规则(5条) + ## 主角成长弧(起点-转折-代价-终局) + ## 关键配角弧(至少3人) + ## 三幕式结构(每幕目标、冲突、爆点) + ## 20集分集卡点(每集2-3句,含结尾钩子) + ## 风险与修正建议(至少5条) + - id: usr-001 + role: user + text: | + 项目名:{{#2040748800000.project_name#}} + 核心一句话:{{#2040748800000.core_idea#}} + 时代与世界观:{{#2040748800000.world_setting#}} + 角色设定:{{#2040748800000.character_setup#}} + 风格参考:{{#2040748800000.style_reference#}} + 当前任务目标:{{#2040748800000.task_goal#}} + selected: false + title: 大纲统筹AI + type: llm + variables: [] + height: 98 + id: '2040748800001' + position: + x: 420 + y: 80 + positionAbsolute: + x: 420 + y: 80 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 260 + - data: + context: + enabled: false + variable_selector: [] + desc: 基于A总纲生成指定集数的单集草稿 + model: + completion_params: + temperature: 0.72 + max_tokens: 3200 + mode: chat + name: deepseek-chat + provider: langgenius/deepseek/deepseek + prompt_template: + - id: sys-002 + role: system + text: | + 你是影视剧本执笔编剧。你的唯一依据是输入的“A.项目总纲”,必须严格对齐,不得偏离。 + + 输出格式(Markdown): + # B. 单集剧本草稿 + ## 对齐检查(先输出) + - 目标集数: + - 对应总纲卡点原文: + - 本集承接上集/推进主线说明: + ## 集标题 + ## 本集主题与冲突 + ## 场景列表(8-12场) + 每场格式:场次编号 / 时空标记 / 画面动作 / 关键对白 / 场尾钩子 + ## 节奏检查 + - 前10%钩子 + - 中段升级 + - 结尾不可逆变化 + + 硬性约束: + 1. 仅生成“目标集数”对应内容 + 2. 不得新增会破坏总纲主线的关键设定 + 3. 角色关系与能力边界必须与总纲一致 + 4. 信息不足时,只做最小补全并显式标注“补全假设” + - id: usr-002 + role: user + text: | + A.项目总纲全文: + {{#2040748800001.text#}} + + 项目名:{{#2040748800000.project_name#}} + 目标集数:{{#2040748800000.target_episode#}} + 核心一句话:{{#2040748800000.core_idea#}} + 时代与世界观:{{#2040748800000.world_setting#}} + 角色设定:{{#2040748800000.character_setup#}} + 风格参考:{{#2040748800000.style_reference#}} + 当前任务目标:{{#2040748800000.task_goal#}} + selected: false + title: 剧本写作AI + type: llm + variables: [] + height: 98 + id: '2040748800002' + position: + x: 420 + y: 280 + positionAbsolute: + x: 420 + y: 280 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 260 + - data: + context: + enabled: false + variable_selector: [] + desc: 将已有剧本拆解为短视频与图文素材 + model: + completion_params: + temperature: 0.65 + max_tokens: 3200 + mode: chat + name: deepseek-chat + provider: langgenius/deepseek/deepseek + prompt_template: + - id: sys-003 + role: system + text: | + 你是内容拆解与改编总监。 + + 输出格式(Markdown): + # C. 剧本拆解包 + ## 剧情主线摘要(150字内) + ## 关键角色卡(主角+2配角) + ## 分镜提纲(6-10镜头) + ## 60秒口播稿 + ## 小红书笔记版文案(220-320字) + ## 标题10条(悬念/反差/结论) + ## 封面文案3组(主+副) + + 约束:不改变原剧情核心事件,不凭空新增关键设定。 + - id: usr-003 + role: user + text: | + 项目名:{{#2040748800000.project_name#}} + 风格参考:{{#2040748800000.style_reference#}} + 当前任务目标:{{#2040748800000.task_goal#}} + 已有文本:{{#2040748800000.existing_text#}} + selected: false + title: 剧本拆解AI + type: llm + variables: [] + height: 98 + id: '2040748800003' + position: + x: 420 + y: 480 + positionAbsolute: + x: 420 + y: 480 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 260 + - data: + code: | + function main({project_name, outline_text, writing_text, breakdown_text}) { + const md = `# ${project_name} - 剧本创作输出包\n\n${outline_text}\n\n---\n\n${writing_text}\n\n---\n\n${breakdown_text}`; + return { + merged_markdown: md, + output_name: `${project_name}-剧本创作输出包` + }; + } + code_language: javascript + outputs: + merged_markdown: + children: null + type: string + output_name: + children: null + type: string + selected: false + title: 合并Markdown + type: code + variables: + - value_selector: + - '2040748800000' + - project_name + value_type: string + variable: project_name + - value_selector: + - '2040748800001' + - text + value_type: string + variable: outline_text + - value_selector: + - '2040748800002' + - text + value_type: string + variable: writing_text + - value_selector: + - '2040748800003' + - text + value_type: string + variable: breakdown_text + height: 52 + id: '2040748800004' + position: + x: 780 + y: 280 + positionAbsolute: + x: 780 + y: 280 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 260 + - data: + is_team_authorization: true + paramSchemas: + - auto_generate: null + default: null + form: llm + human_description: + en_US: Markdown text + zh_Hans: Markdown格式文本 + label: + en_US: Markdown text + zh_Hans: Markdown格式文本 + llm_description: '' + max: null + min: null + name: md_text + options: [] + placeholder: null + precision: null + required: true + scope: null + template: null + type: string + - auto_generate: null + default: null + form: llm + human_description: + en_US: Optional docx template file for styling + zh_Hans: 可选的docx模板文件,用于样式控制 + label: + en_US: DOCX Template File + zh_Hans: DOCX 模板文件 + llm_description: '' + max: null + min: null + name: docx_template_file + options: [] + placeholder: null + precision: null + required: false + scope: null + template: null + type: file + - auto_generate: null + default: null + form: llm + human_description: + en_US: Optional custom output file name + zh_Hans: 可选的自定义输出文件名 + label: + en_US: Output Filename + zh_Hans: 输出文件名 + llm_description: '' + max: null + min: null + name: output_filename + options: [] + placeholder: null + precision: null + required: false + scope: null + template: null + type: string + params: + docx_template_file: '' + md_text: '' + output_filename: '' + plugin_id: bowenliang123/md_exporter + plugin_unique_identifier: bowenliang123/md_exporter:2.2.0@9f39c2c2c1cd09180e2cc053090adc9886019483f502727467f136712b8b9639 + provider_icon: /console/api/workspaces/current/plugin/icon + provider_id: bowenliang123/md_exporter/md_exporter + provider_name: bowenliang123/md_exporter/md_exporter + provider_type: builtin + selected: false + title: Markdown 转 DOCX 文件 + tool_configurations: {} + tool_description: 将 Markdown 转换为 DOCX 文件的工具 + tool_label: Markdown 转 DOCX 文件 + tool_name: md_to_docx + tool_node_version: '2' + tool_parameters: + docx_template_file: + type: constant + value: null + md_text: + type: mixed + value: '{{#2040748800004.merged_markdown#}}' + output_filename: + type: mixed + value: '{{#2040748800004.output_name#}}' + type: tool + height: 52 + id: '2040748800005' + position: + x: 1140 + y: 280 + positionAbsolute: + x: 1140 + y: 280 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 260 + - data: + outputs: + - value_selector: + - '2040748800004' + - merged_markdown + value_type: string + variable: merged_markdown + - value_selector: + - '2040748800005' + - files + value_type: array[file] + variable: docx_files + selected: false + title: 输出 + type: end + height: 114 + id: '2040748800006' + position: + x: 1460 + y: 280 + positionAbsolute: + x: 1460 + y: 280 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 260 diff --git a/workflow/历史账号Dify工作流-v1.yml b/workflow/历史账号Dify工作流-v1.yml new file mode 100644 index 0000000..673a029 --- /dev/null +++ b/workflow/历史账号Dify工作流-v1.yml @@ -0,0 +1,479 @@ +app: + description: 历史内容账号增长工作流 - 支持选题标题模式和全链路发布模式 + icon: 🎬 + icon_background: '#FFF3E0' + mode: workflow + name: 历史账号Dify工作流-v1 + use_icon_as_answer_icon: false +kind: app +version: 0.1.2 +workflow: + conversation_variables: [] + environment_variables: [] + features: + file_upload: + enabled: false + opening_statement: '请输入账号定位与主题方向,选择输出模式生成小红书历史内容发布方案。' + retriever_resource: + enabled: false + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + graph: + edges: + - data: + isInIteration: false + sourceType: start + targetType: if-else + id: 1840748800000-source-1840748800004-target + source: '1840748800000' + sourceHandle: source + target: '1840748800004' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: if-else + targetType: llm + id: 1840748800004-true-1840748800001-target + source: '1840748800004' + sourceHandle: 'true' + target: '1840748800001' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: if-else + targetType: llm + id: 1840748800004-false-1840748800005-target + source: '1840748800004' + sourceHandle: 'false' + target: '1840748800005' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: llm + id: 1840748800001-source-1840748800002-target + source: '1840748800001' + sourceHandle: source + target: '1840748800002' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: llm + id: 1840748800005-source-1840748800006-target + source: '1840748800005' + sourceHandle: source + target: '1840748800006' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: answer + id: 1840748800002-source-1840748800003-target + source: '1840748800002' + sourceHandle: source + target: '1840748800003' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: answer + id: 1840748800006-source-1840748800007-target + source: '1840748800006' + sourceHandle: source + target: '1840748800007' + targetHandle: target + type: custom + zIndex: 0 + nodes: + - data: + desc: '' + selected: false + title: 开始 + type: start + variables: + - label: 账号定位 + max_length: 800 + options: [] + required: true + type: paragraph + variable: account_positioning + - label: 受众画像 + max_length: 500 + options: [] + required: true + type: paragraph + variable: audience_profile + - label: 主题方向 + max_length: 300 + options: [] + required: true + type: paragraph + variable: topic_direction + - label: 参考风格描述 + max_length: 800 + options: [] + required: false + type: paragraph + variable: reference_style + - label: 输出模式 + max_length: 48 + options: + - 选题标题模式 + - 全链路发布模式 + required: true + type: select + variable: output_mode + height: 167 + id: '1840748800000' + position: + x: 92 + y: 292 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + cases: + - case_id: 'true' + conditions: + - comparison_operator: contains + id: condition-001 + value: 选题标题模式 + varType: string + variable_selector: + - '1840748800000' + - output_mode + id: 'true' + logical_operator: and + - case_id: 'false' + conditions: + - comparison_operator: contains + id: condition-002 + value: 全链路发布模式 + varType: string + variable_selector: + - '1840748800000' + - output_mode + id: 'false' + logical_operator: and + desc: 根据输出模式选择处理路径 + selected: false + title: 模式选择器 + type: if-else + height: 140 + id: '1840748800004' + position: + x: 384 + y: 292 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 生成高传播潜力历史选题池 + model: + completion_params: + max_tokens: 2600 + temperature: 0.7 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是“小红书历史内容增长策划”。 + 任务:基于账号定位与受众,生成可发布的历史内容选题池。 + + 风格要求: + 1. 学习“电影化叙事 + 冲突驱动 + 史料锚点”的表达方式 + 2. 只学习方法,不抄袭任何已有标题或原句 + 3. 标题必须有冲突、代价、反转中的至少两个元素 + 4. 选题优先“人物命运拐点、权力博弈、战争决策复盘” + + 输出格式(Markdown): + # 选题池(10条) + + | 序号 | 选题标题 | 冲突钩子 | 史料锚点 | 爆款概率(1-10) | 风险提示 | + |---|---|---|---|---|---| + | 1 | ... | ... | ... | ... | ... | + + ## Top3推荐 + 1. [标题] - 推荐理由(受众匹配 + 传播潜力) + 2. [标题] - 推荐理由 + 3. [标题] - 推荐理由 + + ## 账号差异化建议 + - 至少给3条,避免同质化。 + - id: user-001 + role: user + text: | + 账号定位:{{#1840748800000.account_positioning#}} + 受众画像:{{#1840748800000.audience_profile#}} + 主题方向:{{#1840748800000.topic_direction#}} + 参考风格描述:{{#1840748800000.reference_style#}} + selected: false + title: 选题策划AI + type: llm + variables: [] + height: 98 + id: '1840748800001' + position: + x: 676 + y: 150 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 生成完整发布包(脚本+封面+正文+标签+互动) + model: + completion_params: + max_tokens: 3600 + temperature: 0.65 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是“小红书历史内容总编导”。 + 任务:输出一条可直接发布的完整内容包。 + + 方法要求: + 1. 采用电影化叙事节奏:开场钩子 -> 冲突升级 -> 反转结论 -> 价值落点 + 2. 观点必须可回溯到史料线索,避免绝对化断言 + 3. 只借鉴风格,不复用其他创作者的标题与句子 + 4. 语言要克制、硬核、可口播 + + 输出格式(Markdown): + # 全链路发布包 + + ## 1) 主标题(5条) + - 标题A + - 标题B + - 标题C + - 标题D + - 标题E + + ## 2) 封面文案(3组) + - 组1:主文案 + 副文案(8-14字主文案) + - 组2:... + - 组3:... + + ## 3) 60-90秒口播脚本 + - 开场钩子(1-2句) + - 第一段:背景与冲突 + - 第二段:关键转折与证据 + - 第三段:结论与现实映射 + - 收束金句(1句) + + ## 4) 笔记正文(300-450字) + - 结构化排版,适合小红书阅读 + + ## 5) 评论区引导(3条) + - 争议型问题1 + - 站队型问题2 + - 延展型问题3 + + ## 6) 话题标签(12个) + - 4个泛历史标签 + - 4个细分题材标签 + - 4个互动增长标签 + + ## 7) 史实校验清单 + - 列出3-5条关键事实与可查线索(史记/汉书等) + - 哪些是“推断”,哪些是“史实记载”,必须标注 + - id: user-001 + role: user + text: | + 账号定位:{{#1840748800000.account_positioning#}} + 受众画像:{{#1840748800000.audience_profile#}} + 主题方向:{{#1840748800000.topic_direction#}} + 参考风格描述:{{#1840748800000.reference_style#}} + selected: false + title: 全链路策划AI + type: llm + variables: [] + height: 98 + id: '1840748800005' + position: + x: 676 + y: 380 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 生成标题与封面策略并给出A/B测试计划 + model: + completion_params: + max_tokens: 3000 + temperature: 0.6 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是“小红书标题与封面实验官”。 + 任务:基于选题池输出可执行的标题方案与实验计划。 + + 输出格式(Markdown): + # 标题与封面实验方案 + + ## 1) Top5选题深挖 + 对每个选题输出: + - 标题版本A(悬念型) + - 标题版本B(结论型) + - 标题版本C(反差型) + - 封面主文案(8-14字) + - 封面副文案(10-18字) + - 首句口播(15秒内) + + ## 2) A/B测试建议 + - 测试批次:首发48小时 + - 指标:点击率、3秒留存、完播率、收藏率 + - 给出每个选题的主推版本与备选版本 + + ## 3) 发布节奏 + - 给出7天排期(每天1条) + - 标明每条内容的目标(拉新/互动/收藏) + + 约束: + - 不得重复输入中的原句 + - 不得制造未经证据支持的历史细节 + - id: user-001 + role: user + text: '{{#1840748800001.text#}}' + selected: false + title: 标题封面AI + type: llm + variables: [] + height: 98 + id: '1840748800002' + position: + x: 968 + y: 150 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 给全链路内容做二次压缩与发布前检查 + model: + completion_params: + max_tokens: 3000 + temperature: 0.55 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是“小红书发布前审校AI”。 + 任务:对内容包做实战化改写,提升发布可执行性。 + + 输出格式(Markdown): + # 发布前最终稿 + + ## 最终主标题(1条) + ## 备选标题(2条) + ## 最终封面文案(主+副) + ## 口播精简版(45-70秒) + ## 笔记精简版(220-320字) + ## 标签最终版(10个) + ## 风险检查 + - 可能争议点 + - 建议保守表述 + - 审核风险词替换建议 + + 要求: + - 可直接复制发布 + - 保留硬核感,但避免绝对化措辞 + - id: user-001 + role: user + text: '{{#1840748800005.text#}}' + selected: false + title: 发布审校AI + type: llm + variables: [] + height: 98 + id: '1840748800006' + position: + x: 968 + y: 380 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + answer: '{{#1840748800002.text#}}' + desc: 输出选题标题实验方案 + selected: false + title: 选题标题输出 + type: answer + variables: [] + height: 102 + id: '1840748800003' + position: + x: 1260 + y: 150 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + answer: '{{#1840748800006.text#}}' + desc: 输出全链路发布最终稿 + selected: false + title: 全链路发布输出 + type: answer + variables: [] + height: 102 + id: '1840748800007' + position: + x: 1260 + y: 380 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 diff --git a/workflow/合同助手.yml b/workflow/合同助手.yml new file mode 100644 index 0000000..459b34e --- /dev/null +++ b/workflow/合同助手.yml @@ -0,0 +1,646 @@ +app: + description: '' + icon: 🤖 + icon_background: '#FFEAD5' + mode: workflow + name: 合同助手 + use_icon_as_answer_icon: false +dependencies: +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: langgenius/siliconflow:0.0.39@24cca06d03099357488b00b84ba59d39e76373478cb8b2cabd3a0a2aa1fe975b + version: null +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: bowenliang123/md_exporter:2.2.0@9f39c2c2c1cd09180e2cc053090adc9886019483f502727467f136712b8b9639 + version: null +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: langgenius/deepseek:0.0.11@35bcd3f233f99d07bdadef8b326945df3bda5e8f773330144bc90d84800336b9 + version: null +kind: app +version: 0.5.0 +workflow: + conversation_variables: [] + environment_variables: [] + features: + file_upload: + allowed_file_extensions: + - .JPG + - .JPEG + - .PNG + - .GIF + - .WEBP + - .SVG + allowed_file_types: + - image + allowed_file_upload_methods: + - local_file + - remote_url + enabled: false + fileUploadConfig: + audio_file_size_limit: 50 + batch_count_limit: 5 + file_size_limit: 15 + image_file_batch_limit: 10 + image_file_size_limit: 10 + single_chunk_attachment_limit: 10 + video_file_size_limit: 100 + workflow_file_upload_limit: 10 + image: + enabled: false + number_limits: 3 + transfer_methods: + - local_file + - remote_url + number_limits: 3 + opening_statement: '' + retriever_resource: + enabled: true + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions: [] + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + language: '' + voice: '' + graph: + edges: + - data: + isInIteration: false + isInLoop: false + sourceType: knowledge-retrieval + targetType: llm + id: 1770108318162-source-1770108337053-target + source: '1770108318162' + sourceHandle: source + target: '1770108337053' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInLoop: false + sourceType: llm + targetType: tool + id: 1770108337053-source-1770108739786-target + source: '1770108337053' + sourceHandle: source + target: '1770108739786' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: tool + targetType: code + id: 1770108739786-source-1770109395677-target + selected: false + source: '1770108739786' + sourceHandle: source + target: '1770109395677' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: code + targetType: http-request + id: 1770109395677-source-1770170304071-target + source: '1770109395677' + sourceHandle: source + target: '1770170304071' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: http-request + targetType: code + id: 1770170304071-source-1770171334605-target + source: '1770170304071' + sourceHandle: source + target: '1770171334605' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: code + targetType: end + id: 1770171334605-source-1770108424229-target + source: '1770171334605' + sourceHandle: source + target: '1770108424229' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: start + targetType: llm + id: 1770106628924-source-1770187316880-target + source: '1770106628924' + sourceHandle: source + target: '1770187316880' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: knowledge-retrieval + id: 1770187316880-source-1770108318162-target + source: '1770187316880' + sourceHandle: source + target: '1770108318162' + targetHandle: target + type: custom + zIndex: 0 + nodes: + - data: + selected: false + title: 用户输入 + type: start + variables: + - default: '' + hint: '' + label: 合同名称 + max_length: 256 + options: [] + placeholder: '' + required: true + type: text-input + variable: name + - default: '' + hint: '' + label: 合同编号 + max_length: 256 + options: [] + placeholder: '' + required: true + type: text-input + variable: number + - default: '' + hint: '' + label: 合同类型 + max_length: 48 + options: [] + placeholder: '' + required: true + type: text-input + variable: type + - default: '' + hint: '' + label: 项目名称 + max_length: 2048 + options: [] + placeholder: '' + required: true + type: paragraph + variable: project_name_list + - default: '' + hint: '' + label: 乙方全称 + max_length: 256 + options: [] + placeholder: '' + required: true + type: text-input + variable: customer_name + - default: '' + hint: '' + label: 甲方全程 + max_length: 256 + options: [] + placeholder: '' + required: true + type: text-input + variable: org_name + - default: '' + hint: '' + label: 合同金额 + max_length: 48 + options: [] + placeholder: '' + required: true + type: text-input + variable: amount + - default: '' + hint: '' + label: 付款说明及比例 + max_length: 512 + options: [] + placeholder: '' + required: true + type: paragraph + variable: remark + height: 291 + id: '1770106628924' + position: + x: 80 + y: 282 + positionAbsolute: + x: 80 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + dataset_ids: + - 6uACYcOQ1t0C3/KHbn3tqeCHvEd4w2QFhEq/9948NnDQ6A/VUSeqwzivZhbajG2b + multiple_retrieval_config: + reranking_enable: true + reranking_mode: reranking_model + reranking_model: + model: netease-youdao/bce-reranker-base_v1 + provider: langgenius/siliconflow/siliconflow + top_k: 4 + query_attachment_selector: [] + query_variable_selector: + - '1770187316880' + - text + retrieval_mode: multiple + selected: false + title: 知识检索 + type: knowledge-retrieval + height: 90 + id: '1770108318162' + position: + x: 682 + y: 282 + positionAbsolute: + x: 682 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + context: + enabled: true + variable_selector: + - '1770108318162' + - result + model: + completion_params: + temperature: 0.7 + mode: chat + name: deepseek-chat + provider: langgenius/deepseek/deepseek + prompt_template: + - id: 54faae96-2f1e-4a0c-b0a7-a6bf59d2a61b + role: system + text: "# Role\n你是一位拥有 10 年经验的中国资深法务专家,精通《中华人民共和国民法典》。你的专长是根据用户提供的核心要素,结合公司内部的标准合同范本,起草严谨、规范的法律合同。\n\ + \n# Task\n请根据下方的 [Input Data] 和 [Retrieved Context](知识库检索到的合同范本),撰写一份完整的合同草案。\n\ + \n# Input Data\n- 合同名称: {{#1770106628924.name#}}\n- 合同编号: {{#1770106628924.number#}}\n\ + - 甲方信息: {{#1770106628924.org_name#}}\n- 乙方信息: {{#1770106628924.customer_name#}}\n\ + - 项目列表: {{#1770106628924.project_name_list#}}\n- 合同总额: {{#1770106628924.amount#}}\ + \ (请自动转换为大写金额)\n- 备注/特殊条款: {{#1770106628924.remark#}}(包含付款方式、分期比例、特殊交付要求等)\n\ + \n# Context (Reference Templates)\n{{#context#}}\n*(注意:这是 Dify 检索到的知识库内容,请以此为骨架)*\n\ + \n# Drafting Rules (必须严格遵守)\n\n1. **结构规范**:\n - 必须包含:合同封面、首部(双方信息)、引言(法律依据)、正文(条款)、尾部(签字盖章页)。\n\ + \ - 法律依据必须引用《中华人民共和国民法典》。\n\n2. **类型自适应**:\n - **情形 A(政府/咨询类)**:如果合同名称包含“风险评估”、“咨询”、“专项债”,请参照《风险评估咨询技术服务合同》风格。\n\ + \ - 强调“依据国家、省、市政策”。\n - 包含“不可预见情况”的变更条款。\n - **情形 B(设计/合作类)**:如果合同名称包含“设计”、“合作”、“外包”,请参照《设计合作协议》风格。\n\ + \ - 必须明确交付物格式:Word、PDF 及 CAD。\n - 必须包含“禁止擅自转包/分包”条款。\n\n3. **核心条款强制要求**:\n\ + \ - **违约责任**:必须包含赔偿范围,具体表述为:“包括但不限于直接经济损失、预期可期待利益、诉讼费、律师费、保全费、差旅费等”。\n\ + \ - **保密例外**:必须包含“市场拓展宣传权”条款,即:“为了进行市场拓展,乙方可以披露曾为甲方工作的事实及一般性质,但不得泄露核心机密。”\n\ + \ - **争议解决**:管辖法院统一设定为 **甲方所在地** 人民法院。\n\n4. **数据填充逻辑**:\n - 将 {{#1770106628924.amount#}}\ + \ 填充至“费用与支付”条款,并根据 中的分期描{{#1770106628924.remark#}}述(如“30%首付”)自动生成分期付款明细。\n\ + \ - 将 {{#1770106628924.project_name_list#}} 填充至“鉴于”或“项目背景”部分。\n\n5.\ + \ **格式输出**:\n - 使用清晰的 Markdown 格式(# 标题, ## 条款)。\n - 不要输出任何“好的,我来为您生成”之类的废话,直接输出合同正文。\n\ + \n# Output Example Structure\n## [合同名称]\n**合同编号**:[编号]\n\n**甲方**:[甲方全称]\n\ + ...\n**乙方**:[乙方全称]\n...\n\n### 第一条 法律依据\n...\n### 第二条 业务范围与工作内容\n...\n\ + (根据备注生成的支付条款)\n...\n### [最后] 签字页" + selected: true + title: 合同 + type: llm + vision: + enabled: false + height: 88 + id: '1770108337053' + position: + x: 984 + y: 282 + positionAbsolute: + x: 984 + y: 282 + selected: true + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + outputs: + - value_selector: + - '1770171334605' + - fileId + value_type: string + variable: file_id + selected: false + title: 输出 + type: end + height: 88 + id: '1770108424229' + position: + x: 3005.6255273523284 + y: 282 + positionAbsolute: + x: 3005.6255273523284 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + is_team_authorization: true + paramSchemas: + - auto_generate: null + default: null + form: llm + human_description: + en_US: Markdown text + ja_JP: Markdown text + pt_BR: Markdown text + zh_Hans: Markdown格式文本 + label: + en_US: Markdown text + ja_JP: Markdown text + pt_BR: Markdown text + zh_Hans: Markdown格式文本 + llm_description: '' + max: null + min: null + name: md_text + options: [] + placeholder: null + precision: null + required: true + scope: null + template: null + type: string + - auto_generate: null + default: null + form: llm + human_description: + en_US: Optional docx template file for styling。Use "Home"-"Styles Pane" + in Microsoft Word to edit styles of the docx file. + ja_JP: Optional docx template file for styling。Use "Home"-"Styles Pane" + in Microsoft Word to edit styles of the docx file. + pt_BR: Optional docx template file for styling。Use "Home"-"Styles Pane" + in Microsoft Word to edit styles of the docx file. + zh_Hans: 可选的docx模板文件,用于样式控制。使用Microsoft Word中“开始”-“样式窗格”对docx文件的样式进行编辑。 + label: + en_US: DOCX Template File + ja_JP: DOCX Template File + pt_BR: DOCX Template File + zh_Hans: DOCX 模板文件 + llm_description: An optional .pptx file that serves as a template for the + generated presentation + max: null + min: null + name: docx_template_file + options: [] + placeholder: null + precision: null + required: false + scope: null + template: null + type: file + - auto_generate: null + default: null + form: llm + human_description: + en_US: Optional custom output file name, and the filename suffix is not + required. + ja_JP: Optional custom output file name, and the filename suffix is not + required. + pt_BR: Optional custom output file name, and the filename suffix is not + required. + zh_Hans: 可选的自定义输出文件名,后缀名无需指定 + label: + en_US: Output Filename + ja_JP: Output Filename + pt_BR: Output Filename + zh_Hans: 输出文件名 + llm_description: '' + max: null + min: null + name: output_filename + options: [] + placeholder: null + precision: null + required: false + scope: null + template: null + type: string + params: + docx_template_file: '' + md_text: '' + output_filename: '' + plugin_id: bowenliang123/md_exporter + plugin_unique_identifier: bowenliang123/md_exporter:2.2.0@9f39c2c2c1cd09180e2cc053090adc9886019483f502727467f136712b8b9639 + provider_icon: /console/api/workspaces/current/plugin/icon?tenant_id=bc2d392f-7f32-4b7e-aaa8-fa5e13acb772&filename=f0bad95cda1671b4e49f0e05df6122ef9ec5d554e138f128795d11d3806c00ef.svg + provider_id: bowenliang123/md_exporter/md_exporter + provider_name: bowenliang123/md_exporter/md_exporter + provider_type: builtin + selected: false + title: Markdown 转 DOCX 文件 + tool_configurations: {} + tool_description: 将 Markdown 转换为 DOCX 文件的工具 + tool_label: Markdown 转 DOCX 文件 + tool_name: md_to_docx + tool_node_version: '2' + tool_parameters: + docx_template_file: + type: constant + value: null + md_text: + type: mixed + value: '{{#1770108337053.text#}}' + output_filename: + type: mixed + value: '{{#1770106628924.name#}}' + type: tool + height: 52 + id: '1770108739786' + position: + x: 1419 + y: 282 + positionAbsolute: + x: 1419 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + code: "\nfunction main({files}) {\n const file = files[0]\n\n return\ + \ {\n url: file.url,\n filename: file.filename\n }\n}\n" + code_language: javascript + outputs: + filename: + children: null + type: string + url: + children: null + type: string + selected: false + title: 提取 file + type: code + variables: + - value_selector: + - '1770108739786' + - files + value_type: array[file] + variable: files + height: 52 + id: '1770109395677' + position: + x: 1824 + y: 282 + positionAbsolute: + x: 1824 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + authorization: + config: null + type: no-auth + body: + data: + - id: key-value-117 + key: '' + type: text + value: "{\n \"url\":\"{{#1770109395677.url#}}\"\n \"fileName\":\"\ + {{#1770109395677.filename#}}\"\n}" + type: json + headers: '' + method: post + params: '' + retry_config: + max_retries: 3 + retry_enabled: true + retry_interval: 100 + selected: false + ssl_verify: true + timeout: + max_connect_timeout: 0 + max_read_timeout: 0 + max_write_timeout: 0 + title: HTTP 请求 + type: http-request + url: http://129.28.93.36:3123/file/upload-url + variables: [] + height: 137 + id: '1770170304071' + position: + x: 2200.6280674679188 + y: 282 + positionAbsolute: + x: 2200.6280674679188 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + code: "\nfunction main({arg1, id}) {\n const res = JSON.parse(arg1)\n \ + \ if (res.code === 200){\n const fileId = res.data.id\n \ + \ return {\n fileId: fileId\n }\n }\n return {\n\ + \ error: \"文件上传失败\"\n }\n}\n" + code_language: javascript + outputs: + fileId: + children: null + type: string + selected: false + title: 提取文件 id 和 项目 id + type: code + variables: + - value_selector: + - '1770170304071' + - body + value_type: string + variable: arg1 + height: 52 + id: '1770171334605' + position: + x: 2567.126350783164 + y: 282 + positionAbsolute: + x: 2567.126350783164 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + context: + enabled: false + variable_selector: [] + desc: '' + model: + completion_params: + temperature: 0.7 + mode: chat + name: deepseek-chat + provider: langgenius/deepseek/deepseek + prompt_template: + - id: 008dcdb9-e4f6-43a3-bca2-227512323bba + role: system + text: "# Role\n你是一名资深的法务助理,专门负责在公司的合同数据库中检索最匹配的合同范本和条款。\n\n# Task\n根据用户提供的合同元数据,分析其业务实质,并将其转换为一段“用于检索向量数据库”的精准关键词或描述性语句。\n\ + \n# Input Data\n- 合同类型 (Type): {{#1770106628924.type#}}\n- 项目名称 (Project\ + \ List): {{#1770106628924.project_name_list#}}\n- 备注要求 (Remark): {{#1770106628924.remark#}}\n\ + - 乙方名称 (Customer Name): {{#1770106628924.customer_name#}}\n- 甲方名称: {{#1770106628924.org_name#}}\n\ + - 合同总金额:{{#1770106628924.amount#}}\n- 合同名称:{{#1770106628924.name#}}\n\n\ + # Rules for Query Generation\n1. **识别核心范本**:\n - 如果 Input 暗示是政府、公家单位、发债、评估,关键词必须包含“专项债券项目风险评估咨询技术服务合同”。\n\ + \ - 如果 Input 暗示是设计院、个人合作、画图,关键词必须包含“设计合作协议”。\n2. **提取特殊条款需求**:\n -\ + \ 从 `remark` 中提取关键约束(如:分期付款、保密期、违约金比例、知识产权归属)。\n3. **输出格式**:\n - 仅输出一段纯文本,包含:核心合同范本名称\ + \ + 关键业务场景 + 特殊条款关键词。\n - 不要输出任何解释性文字。\n\n# Example Output\n专项债券项目风险评估咨询技术服务合同\ + \ 政府对公业务 分期付款 违约责任 知识产权归属" + selected: false + title: 查询重写 + type: llm + vision: + enabled: false + height: 88 + id: '1770187316880' + position: + x: 382 + y: 282 + positionAbsolute: + x: 382 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + viewport: + x: -304.92567306294177 + y: 270.1161833988058 + zoom: 1.1371907472107188 + rag_pipeline_variables: [] diff --git a/workflow/漫画生成工作流-v2.yml b/workflow/漫画生成工作流-v2.yml new file mode 100644 index 0000000..10b125d --- /dev/null +++ b/workflow/漫画生成工作流-v2.yml @@ -0,0 +1,407 @@ +app: + description: 漫画生成工具 - 支持传统小说和连续动作描述两种输入模式 + icon: 🎨 + icon_background: '#E3F2FD' + mode: workflow + name: 漫画生成工作流-v2 + use_icon_as_answer_icon: false +kind: app +version: 0.1.2 +workflow: + conversation_variables: [] + environment_variables: [] + features: + file_upload: + enabled: false + opening_statement: '请输入小说段落或连续动作描述,选择输出模式生成漫画分镜提示词。' + retriever_resource: + enabled: false + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + graph: + edges: + - data: + isInIteration: false + sourceType: start + targetType: if-else + id: 1740748800000-source-1740748800004-target + source: '1740748800000' + sourceHandle: source + target: '1740748800004' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: if-else + targetType: llm + id: 1740748800004-true-1740748800001-target + source: '1740748800004' + sourceHandle: 'true' + target: '1740748800001' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: if-else + targetType: llm + id: 1740748800004-false-1740748800005-target + source: '1740748800004' + sourceHandle: 'false' + target: '1740748800005' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: llm + id: 1740748800001-source-1740748800002-target + source: '1740748800001' + sourceHandle: source + target: '1740748800002' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: llm + id: 1740748800005-source-1740748800006-target + source: '1740748800005' + sourceHandle: source + target: '1740748800006' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: answer + id: 1740748800002-source-1740748800003-target + source: '1740748800002' + sourceHandle: source + target: '1740748800003' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: answer + id: 1740748800006-source-1740748800007-target + source: '1740748800006' + sourceHandle: source + target: '1740748800007' + targetHandle: target + type: custom + zIndex: 0 + nodes: + - data: + desc: '' + selected: false + title: 开始 + type: start + variables: + - label: 输入文本 + max_length: 3000 + options: [] + required: true + type: paragraph + variable: input_text + - label: 输出模式 + max_length: 48 + options: + - 传统漫画分镜 + - 时间线漫画分镜 + required: true + type: select + variable: output_mode + height: 115 + id: '1740748800000' + position: + x: 92 + y: 292 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + cases: + - case_id: 'true' + conditions: + - comparison_operator: contains + id: condition-001 + value: 传统漫画分镜 + varType: string + variable_selector: + - '1740748800000' + - output_mode + id: 'true' + logical_operator: and + - case_id: 'false' + conditions: + - comparison_operator: contains + id: condition-002 + value: 时间线漫画分镜 + varType: string + variable_selector: + - '1740748800000' + - output_mode + id: 'false' + logical_operator: and + desc: 根据输出模式选择处理路径 + selected: false + title: 模式选择器 + type: if-else + height: 140 + id: '1740748800004' + position: + x: 384 + y: 292 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 润色小说文本,增强画面感 + model: + completion_params: + max_tokens: 2000 + temperature: 0.7 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是一个专业的小说编辑。你的任务是将用户提供的小说段落进行润色和增强,使其更适合转换为视觉分镜。 + + 要求: + 1. 保持原有情节和人物设定不变 + 2. 增强场景描述、角色动作和情感表达 + 3. 让文本更具画面感和戏剧张力 + 4. 输出保持中文,长度控制在原文本的1.2-1.5倍 + - id: user-001 + role: user + text: '{{#1740748800000.input_text#}}' + selected: false + title: 小说编辑AI + type: llm + variables: [] + height: 98 + id: '1740748800001' + position: + x: 676 + y: 150 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 处理连续动作描述,提取时间节奏 + model: + completion_params: + max_tokens: 2000 + temperature: 0.7 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是一个专业的动作描述分析师。你的任务是分析用户提供的连续动作描述(如15秒画面描述),提取关键的时间节点和视觉转折点。 + + 要求: + 1. 识别描述中的关键动作转折点(如从A动作转为B动作的瞬间) + 2. 标注每个关键动作的大致时间点(如"0-3秒"、"3-6秒"等,自由决定时间范围) + 3. 为每个时间点提取最具代表性的画面描述 + 4. 保持动作的连贯性和叙事逻辑 + 5. 输出格式:时间标记 + 画面描述,例如: + [0-3秒] 王雪在雨中奔跑,长发湿漉漉贴在脸上 + [3-6秒] 惊惶回眸,看到追赶者的剪影 + 6. 分镜数量由AI根据动作节奏自动决定(一般3-8个) + - id: user-001 + role: user + text: '{{#1740748800000.input_text#}}' + selected: false + title: 时间线分析AI + type: llm + variables: [] + height: 98 + id: '1740748800005' + position: + x: 676 + y: 380 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 将小说文本转换为传统漫画分镜 + model: + completion_params: + max_tokens: 3000 + temperature: 0.6 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是一个专业的漫画分镜师。请将叙述文本转换为3-5个分镜描述,每个分镜包含视觉元素和图片生成提示词。 + + 输出格式要求(Markdown): + # 分镜分析 + + ## 场景概览 + [简要描述整体场景] + + ## 分镜详情 + + ### 分镜1:[标题] + **场景描述:** [详细视觉描述] + **角色动作:** [主要角色动作] + **情感氛围:** [情感色彩] + **图片提示词:** [用于图片生成的提示词,包含风格、构图等] + + ### 分镜2:[标题] + ... + + ## 风格建议 + [推荐的图片生成风格,如:动漫风格、写实插画、水彩等] + + 注意:图片提示词要具体、详细,包含构图、灯光、风格等要素。 + - id: user-001 + role: user + text: '{{#1740748800001.text#}}' + selected: false + title: 传统分镜AI + type: llm + variables: [] + height: 98 + id: '1740748800002' + position: + x: 968 + y: 150 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 将时间线分析转换为带时间标记的漫画分镜 + model: + completion_params: + max_tokens: 3000 + temperature: 0.6 + mode: chat + name: deepseek-reasoner + provider: langgenius/deepseek/deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是一个专业的漫画分镜师。请将时间线分析转换为带时间标记的漫画分镜,每个分镜包含视觉元素和图片生成提示词。 + + 输出格式要求(Markdown): + # 时间线漫画分镜分析 + + ## 场景概览 + [简要描述整体场景和时间跨度] + + ## 时间线分镜详情 + + ### 分镜1:[时间标记] [标题] + **时间点:** [如:0-3秒] + **场景描述:** [详细视觉描述] + **角色动作:** [主要角色动作] + **情感氛围:** [情感色彩] + **图片提示词:** [用于图片生成的提示词,包含风格、构图等] + + ### 分镜2:[时间标记] [标题] + ... + + ## 叙事节奏建议 + [关于分镜之间的时间感和节奏的建议] + + ## 风格建议 + [推荐的图片生成风格] + + 注意: + 1. 每个分镜必须标注时间点(如"0-3秒"、"3-6秒"等) + 2. 时间标记应该保持连贯,覆盖整个动作过程 + 3. 图片提示词要具体、详细,可直接用于AI绘图 + - id: user-001 + role: user + text: '{{#1740748800005.text#}}' + selected: false + title: 时间线分镜AI + type: llm + variables: [] + height: 98 + id: '1740748800006' + position: + x: 968 + y: 380 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + answer: '{{#1740748800002.text#}}' + desc: 输出传统漫画分镜提示词 + selected: false + title: 传统分镜输出 + type: answer + variables: [] + height: 102 + id: '1740748800003' + position: + x: 1260 + y: 150 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + answer: '{{#1740748800006.text#}}' + desc: 输出时间线漫画分镜提示词 + selected: false + title: 时间线分镜输出 + type: answer + variables: [] + height: 102 + id: '1740748800007' + position: + x: 1260 + y: 380 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 diff --git a/workflow/漫画生成验证工作流.yml b/workflow/漫画生成验证工作流.yml new file mode 100644 index 0000000..ecc3e3a --- /dev/null +++ b/workflow/漫画生成验证工作流.yml @@ -0,0 +1,195 @@ +app: + description: 漫画生成工具验证 - 从小说文本到分镜图片提示词 + icon: 🎨 + icon_background: '#E3F2FD' + mode: workflow + name: 漫画生成验证工作流 + use_icon_as_answer_icon: false +kind: app +version: 0.1.2 +workflow: + conversation_variables: [] + environment_variables: [] + features: + file_upload: + enabled: false + opening_statement: '请输入小说段落,我会帮你生成漫画分镜提示词。' + retriever_resource: + enabled: false + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + graph: + edges: + - data: + isInIteration: false + sourceType: start + targetType: llm + id: 1740748800000-source-1740748800001-target + source: '1740748800000' + sourceHandle: source + target: '1740748800001' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: llm + id: 1740748800001-source-1740748800002-target + source: '1740748800001' + sourceHandle: source + target: '1740748800002' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + sourceType: llm + targetType: answer + id: 1740748800002-source-1740748800003-target + source: '1740748800002' + sourceHandle: source + target: '1740748800003' + targetHandle: target + type: custom + zIndex: 0 + nodes: + - data: + desc: '' + selected: false + title: 开始 + type: start + variables: + - label: 小说原文 + max_length: 2000 + options: [] + required: true + type: paragraph + variable: input_novel + height: 89 + id: '1740748800000' + position: + x: 92 + y: 292 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 润色和增强小说文本描述 + model: + completion_params: + max_tokens: 2000 + temperature: 0.7 + mode: chat + name: deepseek-r1 + provider: deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是一个专业的小说编辑。你的任务是将用户提供的小说段落进行润色和增强,使其更适合转换为视觉分镜。 + + 要求: + 1. 保持原有情节和人物设定不变 + 2. 增强场景描述、角色动作和情感表达 + 3. 让文本更具画面感和戏剧张力 + 4. 输出保持中文,长度控制在原文本的1.2-1.5倍 + - id: user-001 + role: user + text: '{{#1740748800000.input_novel#}}' + selected: false + title: 小说编辑AI + type: llm + variables: [] + height: 98 + id: '1740748800001' + position: + x: 384 + y: 292 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + context: + enabled: false + desc: 将叙述文本转换为分镜提示词 + model: + completion_params: + max_tokens: 3000 + temperature: 0.6 + mode: chat + name: deepseek-r1 + provider: deepseek + prompt_template: + - id: system-001 + role: system + text: | + 你是一个专业的漫画分镜师。请将叙述文本转换为3-5个分镜描述,每个分镜包含视觉元素和图片生成提示词。 + + 输出格式要求(Markdown): + # 分镜分析 + + ## 场景概览 + [简要描述整体场景] + + ## 分镜详情 + + ### 分镜1:[标题] + **场景描述:** [详细视觉描述] + **角色动作:** [主要角色动作] + **情感氛围:** [情感色彩] + **图片提示词:** [用于图片生成的提示词,包含风格、构图等] + + ### 分镜2:[标题] + ... + + ## 风格建议 + [推荐的图片生成风格,如:动漫风格、写实插画、水彩等] + + 注意:图片提示词要具体、详细,包含构图、灯光、风格等要素。 + - id: user-001 + role: user + text: '{{#1740748800001.text#}}' + selected: false + title: 分镜AI + type: llm + variables: [] + height: 98 + id: '1740748800002' + position: + x: 676 + y: 292 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 + - data: + answer: '{{#1740748800002.text#}}' + desc: 输出分镜提示词 + selected: false + title: 分镜提示词输出 + type: answer + variables: [] + height: 102 + id: '1740748800003' + position: + x: 968 + y: 292 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 244 diff --git a/我在五代搞基建-剧本创作输出包.docx b/我在五代搞基建-剧本创作输出包.docx new file mode 100644 index 0000000..f759486 Binary files /dev/null and b/我在五代搞基建-剧本创作输出包.docx differ diff --git a/我在五代搞基建.docx b/我在五代搞基建.docx new file mode 100644 index 0000000..4d67480 Binary files /dev/null and b/我在五代搞基建.docx differ