From 77ad0e528f1cee3737c14ecde82265f905586c53 Mon Sep 17 00:00:00 2001 From: sdaduanbilei Date: Tue, 3 Mar 2026 17:59:27 +0800 Subject: [PATCH] init: add workflow and script draft assets --- .DS_Store | Bin 0 -> 6148 bytes .env.template | 10 + README.md | 109 +++ docs/dify-import-guide.md | 71 ++ docs/dify-manual-setup-guide.md | 192 ++++++ docs/dify-setup-guide.md | 68 ++ ...02-28-manga-generator-validation-design.md | 210 ++++++ ...nga-generator-validation-implementation.md | 530 ++++++++++++++ docs/workflow-v2-readme.md | 143 ++++ docs/我在五代搞基建-可读版小剧本1.0.md | 354 ++++++++++ tests/quality-assessment.md | 173 +++++ tests/test-inputs.md | 49 ++ workflow/manga-generator-dify-dsl.json | 101 +++ workflow/剧本创作通用工作流-v1.yml | 481 +++++++++++++ workflow/剧本创作通用工作流-v2.yml | 589 ++++++++++++++++ workflow/历史账号Dify工作流-v1.yml | 479 +++++++++++++ workflow/合同助手.yml | 646 ++++++++++++++++++ workflow/漫画生成工作流-v2.yml | 407 +++++++++++ workflow/漫画生成验证工作流.yml | 195 ++++++ 我在五代搞基建-剧本创作输出包.docx | Bin 0 -> 30448 bytes 我在五代搞基建.docx | Bin 0 -> 40351 bytes 21 files changed, 4807 insertions(+) create mode 100644 .DS_Store create mode 100644 .env.template create mode 100644 README.md create mode 100644 docs/dify-import-guide.md create mode 100644 docs/dify-manual-setup-guide.md create mode 100644 docs/dify-setup-guide.md create mode 100644 docs/plans/2026-02-28-manga-generator-validation-design.md create mode 100644 docs/plans/2026-02-28-manga-generator-validation-implementation.md create mode 100644 docs/workflow-v2-readme.md create mode 100644 docs/我在五代搞基建-可读版小剧本1.0.md create mode 100644 tests/quality-assessment.md create mode 100644 tests/test-inputs.md create mode 100644 workflow/manga-generator-dify-dsl.json create mode 100644 workflow/剧本创作通用工作流-v1.yml create mode 100644 workflow/剧本创作通用工作流-v2.yml create mode 100644 workflow/历史账号Dify工作流-v1.yml create mode 100644 workflow/合同助手.yml create mode 100644 workflow/漫画生成工作流-v2.yml create mode 100644 workflow/漫画生成验证工作流.yml create mode 100644 我在五代搞基建-剧本创作输出包.docx create mode 100644 我在五代搞基建.docx diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 分镜 +- 双模式工作流: + - 传统漫画分镜(静态叙事) + - 时间线漫画分镜(连续动作) +- 配套文档:导入、配置、手动搭建、测试与评分 + +## 仓库结构 + +```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 0000000000000000000000000000000000000000..f759486437b85c3ca410f2f76ee81fa90d916ada GIT binary patch literal 30448 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 MfWxj}$6r_f50hImvH$=8 literal 0 HcmV?d00001 diff --git a/我在五代搞基建.docx b/我在五代搞基建.docx new file mode 100644 index 0000000000000000000000000000000000000000..4d674801c3614ceed85057b07ebccfc904226707 GIT binary patch literal 40351 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ℜyu&k7-ve{TFb4_wX~UL>6lrb9B}5R^)KIFE7*~&n0ojeF35Nz34B) zxlH;%5f&Xfv0IfZIVJ3ina%y)e+!G5ezNF_fEVrf)`I{c|7)sX<7{nc;s5}~zw?Am z04|FAj9$M2xrc^aejnmY9C@G>kANkILI-vU(5|#@-@wF!mADY1e>Ay)a1`c^(}FD-?&9vnlI-)t!C!qWuy0FLa!&A!R9cxgywSqp=ZR<`{VpzXLl`i z>fpeOMN`i!eVXD_?{Ed9a^J(f`T5?EgMhBKriP)U&~{>JU!0uS{L`sXQ&)P$Qm-_N zwnujP`-TI?R<7!~1MBm_)=$*M!bpb1CDWJp?{M~ZNX+A+$Af}Q1#zEn#ct}7c-rGJ z8LB*#MTIcWsyt=JJJfJ*4s10EUg~4RDvAg+#rDbgPNmO-@I77W^lyo36H8tV*S>e73ee*TJ^rnWu6qji*xxdd&5mOo^w%xkz+3mnSrnOZ)w3Kh1i&vH)p-YQ}GN z*Ul~Md%Qmx-d{6Ia$PUCK907&X7gA#`Z%tcy?8Tg*}7cn@Q`(0obT=rpL=zzHkC)K zE~L-cx2yZM_Z)u@b+=;u+)LGougwSQnf~6n;@ycPhieflW4&wh?Tz*+>A?1J(`&hz zTU&utZZ%UT`~y$UeBj;sLX+u{=jkw{u%I2K#%*V>k%o`}wGLx}0-x4}b>2F9Zg^&H zbFtlLr*3`e_(4+X@a22mPPpT5AEOJ@wl1EsAmvUM7QT$ut@7rcpV~egRX=SAqB9<4 z*%BENo%zfwrkew(aZx+ltXqCr%GY4cc$-^CMXU{9)m#X0o;gus7R*T%sz1h|^pGGgv zoUgm1Q%;W=4|5u~W{(w9Z>BAt^eb#~#yT!DlRa#5+OGti*3H&y-Re%YH-`=PUA|Wf z=T>Z+cbA`o1V3El-fsy$SNJ|IF*?P*FI1jS*nT)JwTwd6zqflvZw1NizL_4o7A8vE z-ptKl=rUw%^_DO2oPOSzG(7#x38Crqyl;82crDbWXFDao2jua;EcgBV`q`A#Y&+$h z_lV!7`!tZcP#KO;V|o1I>q2*mv#^ZU+`Hl9wDUYi7mJuR%bBG8>Ll&7f8*lJqvQRw zakr8E_CVlm6V_1Pa9v9L;dO9&N16WtkkT_qz4*uxJEGZ}lYIH}q1J}7y$9vweKZHB z+@mqR#GG;d;J6j5+@~`BB}_2BMXq;Bd`c@?x$<{>nfHsesKu5=5jiw|!FuVIY0<@$ z=t)3m=>wpF`HLz^GpC!IMXnD`e9T3Afx8$Y-VQAUo+^goVvFV6_R*|4nGC1wtImQe z@GLNANFgX*-tLe10C+$_msSz*%@28G#^z0cH>I(>ePmamtn$slXjVaUmqM!E`*V{X zh?9TR&M6Pn376w9^=PCB%%3(ucvB^pg@qhs?6`OuI#3D+I+5^Vp|r)-jTWB8do~zA zczH(boB;kYxKse*yxn19a6AATzZlbn$GJJ&UU)IFbdzw$If7bhk#ZC*zdsWFKA&&r(+5P;eC5ugpbL(yN(7?G$> zfB9s{Y>A06GYjVxE)(O3=^g*DN{;!$tLtp+gzJ6hhlmIw$PWbtOhgD4go{W8IFJ(+ zUx-E!3#*aRXm@#4fU=jQC|-Q8Iqn34+8+O(hClXZ=fs|>h2gtD7~WJdndZ#(uOR^B zu&)pofIK=P0mmy96LUcij3FMgQng*#1Zb>4+&MW_rPuQ1f7I_I`WGurpEk~M;ZE(b z8i~-#L3EXb)c`5HGEnC{_(gwCdB_uXl_EgtE*_9_NM39ad*3jNbbMIvlyaoG+IpaR z|G%Xq-Z#|7C_yi=R2-VeGs%u*+N#*MA>hX=16U2f8DO;&KmlMik-xnGtmb)QHVqB0 zCZ=*QlCsf_RPQ3DxmG{kk~`b60SOQUGX~x{FNQ=c;*V5r_2LSUe;5?5-Q{o=q)?@5 zN~xso{uzT&l|_0+#XI=LBkZ8`*V`7s;bEsk1|`3@=z6~k7 zrr@5r_45$gA2I$zU$SU_M&(^pwu`oi)U4P(36q~Nx!`Z+5PIXnf+L4Afw|^Z(AB*Y`Q)Xjb$(!_;Slv}RH^JqTT2fdJ|r zoXdw_wBP&3#~9H6x+nvBmZM4i-Uny!WY&;-zFt$$xy~9}C4Oi2%G)jDYII z4cu9{TF0hnN?N7kZ(tobU+i6QHC#LZ0~-8K{?$AYouJuCe42q;pA*{L&Q~_^k0$c~ zPz2CB0E+&oCk6mT|AZ(2iqt|a{zUOlc8rpr6+}BIs>f|i&W~Sy0_?ksb;AB~_1E$L zWdROCML;;@)WnrFPs(J33#(mkRaqv}Sr1dxv_1R{`M-k!KqNrY7jcDAnlcg#x?52^ zw(7!K?z3mtREL0SW`k!v#o(dDL zx$!e9asHs;PXIo)D|04RUHS{kiyKz~Yze@d{|wqoMIr^uOs#lq%Z8`UxkzePBi{I7 zZ^HlWC1d}^OW0Zq=!G?`m+aa&=YNt5mX-lLijtIG6(9y+H2;ADd2z1g00m4}PmXfZ z6!d~h#YQ&#aJ&EoXzITqovD_n5XSfeXX}R=Ip`(Ruigufz^DThb^oI^XR6VHs}qjo z^p~3BR20Or6qzq||Md=*ZEii|-65Zb%wU-%;bqf=RYQS*>~MK!J9 zkLPZQ=@hYj>-dZ8MB1jFW@2sR2D zgop^~C)0?@_R-1;9eN>^4H2}*O4D>nE7M|VRJcW}RPnW1bEZSB6EBEJHC(5Tjzd>*q3 z(b6bLX5YjM)Ntzi%%V_J%mCMVa1sX|yp%Nx9jDDMG7pGY->7J;$#QWE;}RH zl{BYFQt-zk7gF-W#MNL@U}EOoz+?7(-W18cH#?_WK^Bvm;E^%TW z@QMWOCSjx&!ns{3@(bo43*I(;LN_oK&g)Rl18`uAaiK{PIs#sLchYvAgT~{9n zI*D-?iuE0|(H{oSc<%~Gs#ucQ_X;MfBPb@+!OctK7*a4HgTEnvO$#oDfv=anJPBU< zSAID^9DJ?m0o!ug?6p)#jGl#?SNfvlhIE8KK91G-?%j=4b;8D};AHO+F34(84S7j{ zPr<|28yCwYTDLJiMtPCeXY^NM8^>4Z`crh+#Q*$D3Z7oih>kRk#U+TD3thXConJd!(65%)bH z8V^^i;km&!G5BMDU$<^^=3?N=_7maXE!N5lv&wlQ0s-Nd0099A{#mSbbaJ;c`FmUX zOlQ+(uLZ4#Vb&G#prYIE?D=|CcL>_*vZM3I#mJajre(~~HD$_BdC|3;ZXPAfT?t*r zL;;2f!^SAKteo`j{@93{xVh z7|(Zv2M>H1FZ7_XCHu>%{pV?enF)skFj7Nko{Pf?FzK^-kR=I{Z-h%W|;Dj@Y zGlIth_a3)~&dg^=?8GzBmOSWB`;qyyy*EpbW}L)3kM`ATjV?lWcDO>u-YvYd^Jq^P za_hhW)5h6Sx%A#B^8~5a%_LFWc(OHaZDX=^Yn&#n6o|;AXO;=K(%rJYNQpFM#&;y3 z2q8Wbtjv9atLZXy2}+w^TZy?lX5e+PpqM~@^>UYXn4vI6sahxO27ZHBYU~Di+pDai zpin84Vf}Shp-&`}tW~r>0y*Go_RQ2)6S5{H*!0A*MA(PoL)5|4hu$pl5_hs%^nibj z1`MwH-t15tP^F9FhKm)Cf=(p%?f6c|K9TUvbG7TVi2zcQ?0`P5i)nWN-{#I^X^6U$ z_mp6izf|;$@g35RF<(AFkG(N=?VayKMhp489a2c3KRhuc89z&)BfpP+x5#|*rgy1o zzH8Lp@WO^LuvNpo%P4{Vd=9bOLWq!AQ(Fr0Y2TM_s$6BGZV@4Er*54yKAaM^-Lk)| ze4bvjtT!J=aQ;bhJiRB3c~NnJ?#oI+TVXq_i@-gS2q(vrNDO+TcYH>6m;sTP^=bEW z10{3^XRE7CTqxy+*7YYBry>po3w&;<06&WLs4+goT_lIhFJl&U>(4W7h=ldujV1$p z2nZty!<1igHlLk{Zty=@i3aj(g9S(*bVDiwrEc|-^v7eH9~>oxZysL|h>UL)5J3&% z&AY2dwRw*^e|~Y!+irnpSzq>lXm!rJZh?2Is|LlhIps$_u*Rp92FV%S|F~iVaz=>} zh&ICwT%Bcypv$+1RTS98O!6D~3dV^&ia2V9E0jiT=Wvi&AphkdpJ+YP{#!1|nccTs z5M=pDej;zAoPA+NG1Ze@~vmoIpuYVkmXpoD(0Y zHx@aAkjuI=J1I(p*N>PiksZpO^CIrGjX|VRe7$w2hxrye)urLqEN#BrzRl8}kEA6Z z3kE#u2$eSPm5$AAh_XPHJ(onz>x{K}!C%OjuiFq+3UBBrP?KdaM{0N0gFGjpSO$_o zd)tmEaYR^Vv{PE;xqxY(LZBO>;i?CXcCvWT>7`HhIYzGDRfxx~|)(4a%@&w)Xn z{lT~h%v5|SY6eLt6^ob;&CWvd7NF4kr=VoE`R;;s5HEfGQdYR-b8$gyXb4y6$VI-b zBKQQ9_j)WkmF|H-N~T7oG0F3_QX8T25z8}63H_&MD*d!MT0*6LH*7rfuTw@17uO@~ z3>teCx0pSZZ4PAh;1wOi+9yU0*x8)U^6%sm=DIYR;fs<@D1hu*z}BwK@m-!l)nIn` zCF#sqi-VkDzgG;|X^x!YpH-{Re$}C=x@z!DO3G%I65=%}(z49;9)uDjpo;(G(0{jn$mD(8lj^^@!5JiPFj2-*dm zlYI~WF3=@@e#av&i&HQw&P@T96W1*Aa9AtH7dI+| z^w*38c7!{TT0w^sNQn%NDc}{+i0kSpG4br37wVT5aY zrI1Ly@SL3xE8UHjb~T)y=<&2)qNU1~-D*0tcG@p&A9v)o>%)p0P4=e!$?}*HQv9a1 ze-xNx8Pj{xUgNr`188aom_Khij{)Lo<= zo9S=XE>ZR2!U3}|s@Wgh-Cdd`i-9_#eMg>D$&vv4MBcAGymnPC_MMp*%EdKej!a77ahi~vX(g(h;e%b~|%3t;2YY}3hy^C6>_(Xt;=0r81g#mzO7h%z9r zS-*mICSxQrZrqlZPzWz41e_`-pVt!5ZXYba$e!Dtc=SWcN{DuAW*NK&S2oicJs6!j z8HJc-yG|ljqr_nqsE{*d6e=cQ6+7E72{p+onnF3X1bhbrJUI5yW(9t3-GC-sKc~ zlZMWck7 z8B$sBjNDAd<<;CA7q64V<`<$BY2c@_YO*vXEY{#I8|a8G1*M|X6#YdGi}9WgGIqF_ zjD(s+6L$p|K0M&v5|%=&N4Nu-HBIJFdYkdN45B+bCDUct{J_kcdegSc@V&QLkKW?k zk)``$pnNJ^)*w)3K_zv;nsF!C;JFkQW$+v8V6;n!{Sg*GMsln{4JFuufEpB%6pJvw;&on*Or)wZ2*w9xAxg^%q9nYfE9H=4 zY-0WL5GeHuuAI2&|D(#zF7!XEhyu`-fJSmGpiE={ObfA<$IL2-K>jktCRSH~(?2T@ zkzZC8DkHDhrya*$q6}em{7ERyJd_>BDx~eO3`@S z@lQ`<(*LFMZ%=<({;m8g#$7~a5IjCGYq&&)=S2?2W0vu4mXk00b|z^tR-}#D@AmT( zDP;y%+ZA13vbz0Bpyv;c$8Z8}47IVAie$}a zcZIH)Gd9@O>NamK69w}E!8@tmpNuBY+N=s0=M^M2W=2aDyk`Hay)*xZ>fht|$R5(j z9%3w!U3ODKmQ42STVp582t^qCP?0stk}QpNtXZ;_eHUZM)*xido;BR5+kGhCd;f!b z&QE9N@q9nd<1_E`KJU-@yk2v#i=IXs+Io$LYq@J_Kc3T?URbAX`K|$icWU@yd-d59 z8+daUCp5}La`r19N{-^>r1`dWpH-ne){`!2(&=pz*XwjzESaFxcDb^4 zf$RmhRc(n7x;~Fb-eoHt1NSak5UAEWdl9GX_V1pplIX(nPd3kC7U|&i?F6Zt~zqeM2B`?Av_$wTR5lYJK?-@C+Ts2m1zpEEg zK(Q`Js^LE_XRx8jvZ39lu$)~|+N_wU`?#KtvgT)5^FpwR>gq+HHTVEyQi`Ewa{)i>V#j zwoZrv<-pFSmq->X{eR5*A8(Zp@6_*&U8+A=N?VH4lF=&E+I49cpBrC4eq6a7LKP80 zRUDE#eHeDzDC|~IMF>@72vtc)u6Nlb5vVy&$|#Mb7>#5j4Qj4n^j!Vu=FTU3pV9qC zxcMc&f+B24zt7@Qf}Wtup{(S-XTz#%$QT z8&2@~^#1fPqp-X?-=8%fub6q+cuWC@LObsZUg>ctxK>LOFtSyRALCl8gc&NCOkG@^KoQb;ynC69P^y1dwP49Wbt?LaN0 zY;20Nx&i~a2^S2pvSX&#W5cbmS6{%w?(G@)@&~EJwNDvUs0ba<;bw%)^)}>Ek<&4o zBD@WU`%*Z>A*^d0JV6^CrCEUNrekcWeq_Zi&&*c*?GLPCEl8IoM~p|n9`_C{$_poG6(lO(f#>Zcsz>9TgzH}kxT7BEnDeTd zw^(e91*fv{T5^S(OcX_Z+>8FY+Hlm@fZ*5e3Vc_uajx|{6~e$TPIVA6=Tu&DmLS>j zSif2CMo);3$U8;k-s^iWQ=* z9na@|H5lG)Acz;y(f;Q-#Y0;wy+1T`DVPb@Ms`}j!&7}DpBtOUeb!k9jBLI6^6 z4bYg&eI}d0%u`D~2aENxeyDfu8FH0=}CQu|kP@wVC~ea+gc@8tEYCF&VJ&o2Tky^;Tt+Po$` zY2;fWGklP4^S9x2Ck7=q?P22q4G7MP6pg{G`!EVrfhhPRr{8F!d@^U>#}NiT%AQJ|t>H9T8m zZx@)r^Ipg#`=X1%326Q3M)YmGpq*J7(X`i$B8TE4+FTri6BnBAagW72t3dieVPujTT}2@c&cwzjTy%w0{NwNTvjwNO|mFt{!)wR?fCRr93mw zCtNWiv;nIzUSYgDrii2p<8s&0YW<{;2MSUj(878!C6*9$F+i>!D!KT2;0j3Q5_`ZkuluHay*%R!$R zaTWY_*l0BSvaltKFe$mcx{1iE4uVMJgS2QieyK zj+w!Ka*G|qoZT;P$-&RHl`F3%jD5LJ4kHwy`(Fgv}VAr88(3#iMUC8c|5`^(q~dW zbwIJJl`7rHWZ28GZjQDDZQ`-FHGXcMY;r4|&Usk(2gY46V={^HU5Ly<;+OTf7~su) z=uWNe%)F|~lQfHt5nOwCAMpo8xe;h4HOaHH{G%#&ZGtx#pSsA>ls2xPW3YE&Q1}X~ z@**rEJ9LVdOMom{-<{q`fTSX>#(Y)WHWqsIGMb{>4tA?tQyW#tVbZrZbu`hGEvzqw z&RD-o{^9ME39G4oXq`*mM>99hTlTWl$F({Vsc`X?s8;(vZtuFZI~ss&C^jBcU}%$& z#|oL3FJ1rk<)A1{-kJXed3v089m5Y(Wo3GVyZ#U%Nmg+NDxrwF z%7e&d0yr^S8=xtkxzWa_SP}tsc%Y%K(43v(P&f~2a9x77o9bG+uPCPC?z~=226COs zlz=sKib@dh@@~5Wx3owqNJjna=UYkWo_hoz_-3>N6jd{!H?;(U1jk2^)f>SATx^sn z%41fltEtQHO9jGat5gnu0R7VB>xK+j)%3kv0<#`ZimG>WXw36%#f%{k1Z{RT5Z`V= zkwM8+h-*29iKNe%M}`POT7fdn*gz15>6%W}Y6@?@0JNdS=PlpLys4a8NRdf7xZKMX ze$Zq|dPI_MK_O>+_*^{iv5>~IRw<<*vRbH{HO$oeqC8m0j*B%kGg(1;`yTLf>u{zt zrF@=@&*9|{)6(yc>5BHBpl?{~A7fCs|6177TLLU&rBoUIeaIVR(<+)ZWuMo( zn~S|+8rw(?C;Q<&58W9ilZE(-@3Q^^MOyUU^l`=NjP`D+mqg|+B7BKzCc(%oQM;Sa zFS0P*4gS^)=VCfHMQcc0XQ%;}lTweFzT;y<&H4(53(0gXDN{a*`P!+wfg-C+hOmW( ztj-QiOW!NhuXd&5KRx24**I{;+>VC`788UHa6{E6Kxsg*c<}`ZmFw3?hYZ)2gFutZ zKWL3Cn<{_`?Khb=TAbZToQdAQ*-?SS@LC|UZQ=d;d_KE_DV{{{TU7&mmv!n%QqR=_ zBweQrOk+hX&n)rlGTdYhfvNSE#!0^|PHdb^5Sx510t`F^6nml>639lhfm0CQtv5A` z)4L{nRL^{`FAXl&MQ1_1Ma?5vqg0A7)6y9;icCtsx134F3rSKr9AkXopYRH^czIg`dCAUz@2C zzB93P^{~9-4YzeS|Cz_ykiP@4#V}W{;vr3Z-c$Sqr{N3tziqL-5# O;`g7eMR?NBqkjRDI^_8P literal 0 HcmV?d00001