From cbb0ea7eb124b42985a9aa7904e821126c424600 Mon Sep 17 00:00:00 2001 From: maogeigei Date: Wed, 2 Sep 2026 18:53:22 +0800 Subject: [PATCH] =?UTF-8?q?refactor(workshop):=20=E5=88=A0=E9=9C=80?= =?UTF-8?q?=E6=B1=82=E5=AD=97=E6=AE=B5=E3=80=8E=E5=85=B1=E9=B8=A3/?= =?UTF-8?q?=E5=85=B1=E6=83=85=E3=80=8F8=E2=86=925=20=E8=A1=8C=EF=BC=8C?= =?UTF-8?q?=E5=85=B1=E9=B8=A3=E7=94=B1=20AI=20=E4=BE=9D=E7=97=9B=E7=82=B9?= =?UTF-8?q?=E7=88=BD=E7=82=B9=E5=8F=91=E6=8C=A5=20v20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - REQ_FIELDS 6→5:删 relate;idea→blow→pain→form→note - w 初值同步删 relate;空态/注释同步(共鸣与情节结尾由 AI 依痛点爽点发挥) - clarify 模板同步 5 行 + 提示共鸣/共情不收集由创作自然发挥 - 复盘评分维度「共鸣和共情」(1134/1232/1312)属复盘技能结构,不在需求表单,未动 --- .../V1.0/mcn-work-shop/public/data-pages.js | 11 ++++++----- project/短视频脚本创作/V1.0/mcn-work-shop/server.js | 6 +++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/project/短视频脚本创作/V1.0/mcn-work-shop/public/data-pages.js b/project/短视频脚本创作/V1.0/mcn-work-shop/public/data-pages.js index fd8b4ee..2489fd7 100644 --- a/project/短视频脚本创作/V1.0/mcn-work-shop/public/data-pages.js +++ b/project/短视频脚本创作/V1.0/mcn-work-shop/public/data-pages.js @@ -174,8 +174,9 @@ function bindBatchBar(container, opts) { // 09-02 v17:选题落点要素(痛点/爽点、共鸣/共情、爆点)加入需求框——创作流程需要但不是必填,空值由 AI 按账号设定与选题自决 // 09-02 v18:叙事形态→叙事结构;删核心情节/结尾落点(情节与结尾由 AI 创作阶段自决,无需用户填写) // 09-02 v19:爆点→创新/爆点,字段序调整至「一句话创意」之后 +// 09-02 v20:删共鸣/共情(由 AI 按痛点/爽点自然发挥,无需用户单独填写) const REQ_FIELDS = [ - ['idea', '一句话创意'], ['blow', '创新 / 爆点'], ['pain', '痛点/爽点'], ['relate', '共鸣/共情'], + ['idea', '一句话创意'], ['blow', '创新 / 爆点'], ['pain', '痛点/爽点'], ['form', '叙事结构'], ['note', '其他约束'], ]; // 需求 md 行 → 向导字段映射(parseReqSheet 用) @@ -216,11 +217,11 @@ function buildCreatePrompt(accountName, w, personaBlock, hasPersona, attachText) } /* AI创作 弹窗(09-02 v2:需求框 + 输入框 对话式打磨)—— - 顶部=创作需求(6 行选题字段:创意+创新爆点+落点要素(痛点爽点/共鸣,可空)+叙事结构/其他约束,随对话逐轮被 AI 更新,空值标「待完善」)+ 下方时长选项条 + 顶部=创作需求(5 行选题字段:创意/创新爆点/痛点爽点/叙事结构/其他约束,共鸣共情由 AI 按痛点爽点发挥,随对话逐轮被 AI 更新,空值标「待完善」)+ 下方时长选项条 中部=对话流(用户输入 vs AI 整理/追问),底部=输入框 + 提交创作 */ async function confirmAiScript(accountName, btn) { const accId = btn && btn.dataset.accId ? btn.dataset.accId : ''; - const w = { idea: '', pain: '', relate: '', blow: '', form: '', dur: '', note: '' }; + const w = { idea: '', pain: '', blow: '', form: '', dur: '', note: '' }; const convo = []; // 对话流 { role: 'u' | 'ai', text } let pHas = false, pContent = ''; let attach = { name: '', text: '' }; // 已上传需求附件(解析后的纯文本,打磨与创作共用) @@ -283,7 +284,7 @@ async function confirmAiScript(accountName, btn) { mask.querySelector('[data-x]').addEventListener('click', close); const q = (s) => mask.querySelector(s); - /* —— 需求框渲染:6 个选题字段(含落点要素可空;情节/结尾由 AI 创作自决),维度名作标题、内容在下方 —— */ + /* —— 需求框渲染:5 个选题字段(落点要素可空;共鸣/情节/结尾由 AI 按痛点爽点自决),维度名作标题、内容在下方 —— */ const renderSheet = () => { const rows = REQ_FIELDS.map(([k, label]) => { const v = String(w[k] || '').trim(); @@ -326,7 +327,7 @@ async function confirmAiScript(accountName, btn) { ? convo.map((c) => (c.role === 'u' ? `
${esc(c.text)}
` : `
${esc(c.text)}
`)).join('') - : `
在这里输入一个初步想法,AI 会引导你补齐创意 / 创新·爆点 / 痛点爽点 / 共鸣 / 叙事结构等需求(落点要素可留空,由 AI 按账号设定与选题补齐,情节与结尾由 AI 创作);每条输入都会即时更新上方的创作需求框。支持上传附件。Enter 发送,Shift+Enter 换行。
`; + : `
在这里输入一个初步想法,AI 会引导你补齐创意 / 创新·爆点 / 痛点爽点 / 叙事结构等需求(落点要素可留空,由 AI 按账号设定与选题补齐,共鸣与情节结尾由 AI 依痛点爽点发挥);每条输入都会即时更新上方的创作需求框。支持上传附件。Enter 发送,Shift+Enter 换行。
`; el.scrollTop = el.scrollHeight; }; const setBusy = (b) => { diff --git a/project/短视频脚本创作/V1.0/mcn-work-shop/server.js b/project/短视频脚本创作/V1.0/mcn-work-shop/server.js index 067141e..8776d1a 100644 --- a/project/短视频脚本创作/V1.0/mcn-work-shop/server.js +++ b/project/短视频脚本创作/V1.0/mcn-work-shop/server.js @@ -652,7 +652,7 @@ const server = http.createServer((req, res) => { } // ---------- AI 创作需求打磨(09-02 弹窗内对话:Dify chat-messages 同步、无状态多轮) ---------- - // body: { accountName, turn(本轮输入), reqMd(当前需求6行md), history(最近轮[{u,a}]) } → { answer } + // body: { accountName, turn(本轮输入), reqMd(当前需求5行md), history(最近轮[{u,a}]) } → { answer } if (p === '/api/ai/clarify' && req.method === 'POST') { let body = ''; req.on('data', (c) => { body += c; if (body.length > 1e6) req.destroy(); }); @@ -704,8 +704,8 @@ const server = http.createServer((req, res) => { + '3. 若信息已基本齐备:用一两句话总结并提示用户可点击「提交创作」。\n' + '4. 输出必须严格分两段:第一段是对用户说的话(120 字以内,含必要时的问题);\n' + '然后另起一行单独输出 ==REQ==;\n' - + '接着输出 6 行需求清单(仍未确定的项留空值,严禁编造;情节/结尾/时长不由本清单承载,由创作阶段按人设与选题自决),模板:\n' - + '- 一句话创意:\n- 创新 / 爆点:\n- 痛点/爽点:\n- 共鸣/共情:\n- 叙事结构:\n- 其他约束:\n' + + '接着输出 5 行需求清单(仍未确定的项留空值,严禁编造;情节/结尾/时长不由本清单承载,由创作阶段按人设与选题自决;共鸣/共情亦不收集,创作时由 AI 依痛点/爽点自然发挥),模板:\n' + + '- 一句话创意:\n- 创新 / 爆点:\n- 痛点/爽点:\n- 叙事结构:\n- 其他约束:\n' + '5. 需求框只收集本条视频的选题相关信息;账号级设定(情绪基调 / 目标受众 / 结构性符号 / 广告植入等)已由账号设定自动带入创作,不要向达人重复询问这些维度——仅当达人主动提出与账号设定不同的要求时,将其记入「其他约束」。'; // 4) Dify blocking 调用 const difyUrl = String(process.env.DIFY_URL || 'https://mydify.youmanvideo.com/v1').replace(/\/+$/, '');