From 3be2ff152d51af49b9e3071447806eb5d0f95a5b Mon Sep 17 00:00:00 2001 From: maogeigei Date: Wed, 2 Sep 2026 18:22:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(workshop):=20AI=E5=88=9B=E4=BD=9C=E9=9C=80?= =?UTF-8?q?=E6=B1=82=E6=A1=86=E6=94=B6=E7=AA=84=E4=B8=BA=E9=80=89=E9=A2=98?= =?UTF-8?q?=E4=BE=A76=E5=AD=97=E6=AE=B5(=E5=88=A0=E6=83=85=E7=BB=AA/?= =?UTF-8?q?=E5=8F=97=E4=BC=97/=E7=BB=93=E6=9E=84=E6=80=A7=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7/=E5=B9=BF=E5=91=8A=E6=A4=8D=E5=85=A54=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E8=AE=BE=E5=AE=9A=E5=AD=97=E6=AE=B5,=E4=BA=BA?= =?UTF-8?q?=E8=AE=BE=E5=8D=A1=E5=B7=B2=E8=A6=86=E7=9B=96,=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E5=85=B6=E4=BB=96=E7=BA=A6=E6=9D=9F=E5=85=9C=E5=BA=95?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../V1.0/mcn-work-shop/public/data-pages.js | 19 ++++++++++--------- .../V1.0/mcn-work-shop/server.js | 7 ++++--- 2 files changed, 14 insertions(+), 12 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 ee3ef9c..6be3f70 100644 --- a/project/短视频脚本创作/V1.0/mcn-work-shop/public/data-pages.js +++ b/project/短视频脚本创作/V1.0/mcn-work-shop/public/data-pages.js @@ -168,10 +168,11 @@ function bindBatchBar(container, opts) { /* ============================================================ AI创作 需求打磨辅助(09-02 v2:弹窗内对话式——需求框 + 输入框,无跳会话/无文件回填/无选题按钮) ============================================================ */ -// 需求单字段顺序:弹窗需求框展示、AI 输出模板、创作 prompt 共用(值空 = 待 AI 按人设自决) +// 需求单字段顺序:弹窗需求框展示、AI 输出模板、创作 prompt 共用(值空 = 待 AI 按账号设定与选题自决) +// 09-02 v10:需求框定位=选题补充——只留本条视频选题侧字段 + 兜底「其他」;账号设定类(情绪基调/受众/结构性符号/广告植入)由人设卡提供,不在此重复收集 const REQ_FIELDS = [ - ['idea', '一句话创意与选题'], ['form', '叙事形态'], ['dur', '时长目标'], ['mood', '情绪基调'], ['aud', '受众'], - ['plot', '核心情节'], ['end', '结尾落点'], ['sym', '结构性符号'], ['ad', '广告植入'], ['note', '其他约束'], + ['idea', '一句话创意与选题'], ['form', '叙事形态'], ['dur', '时长目标'], + ['plot', '核心情节'], ['end', '结尾落点'], ['note', '其他约束'], ]; // 需求 md 行 → 向导字段映射(parseReqSheet 用) const REQ_LABEL_TO_KEY = Object.fromEntries(REQ_FIELDS.map(([k, label]) => [label, k])); @@ -187,7 +188,7 @@ function parseReqSheet(md) { } return out; } -// 状态 → 10 行完整需求清单(供 AI 每轮保持同模板输出;空字段留空值) +// 状态 → 6 行完整需求清单(供 AI 每轮保持同模板输出;空字段留空值) function reqMdOf(w) { return REQ_FIELDS.map(([k, label]) => `- ${label}:${String(w[k] || '').trim()}`).join('\n'); } @@ -208,11 +209,11 @@ function buildCreatePrompt(accountName, w, personaBlock, hasPersona, attachText) } /* AI创作 弹窗(09-02 v2:需求框 + 输入框 对话式打磨)—— - 顶部=创作需求(10 行字段,随对话逐轮被 AI 更新,空值标「待定·由 AI 按人设自决」) + 顶部=创作需求(6 行选题字段,随对话逐轮被 AI 更新,空值标「待定·由 AI 按账号设定与选题自决」) 中部=对话流(用户输入 vs AI 整理/追问),底部=输入框 + 提交创作 */ async function confirmAiScript(accountName, btn) { const accId = btn && btn.dataset.accId ? btn.dataset.accId : ''; - const w = { idea: '', form: '', dur: '', mood: '', aud: '', plot: '', end: '', sym: '', ad: '', note: '' }; + const w = { idea: '', form: '', dur: '', plot: '', end: '', note: '' }; const convo = []; // 对话流 { role: 'u' | 'ai', text } let pHas = false, pContent = ''; let attach = { name: '', text: '' }; // 已上传需求附件(解析后的纯文本,打磨与创作共用) @@ -261,11 +262,11 @@ async function confirmAiScript(accountName, btn) { mask.querySelector('[data-x]').addEventListener('click', close); const q = (s) => mask.querySelector(s); - /* —— 需求框渲染:10 个维度块,维度名作标题、内容在下方 —— */ + /* —— 需求框渲染:6 个选题字段,维度名作标题、内容在下方 —— */ const renderSheet = () => { const rows = REQ_FIELDS.map(([k, label]) => { const v = String(w[k] || '').trim(); - return `
${label}
${v ? esc(v) : '(待定 · 由 AI 按人设自决)'}
`; + return `
${label}
${v ? esc(v) : '(待定 · 由 AI 按账号设定与选题自决)'}
`; }).join(''); q('#reqSheet').innerHTML = rows; const filled = REQ_FIELDS.filter(([k]) => String(w[k] || '').trim()).length; @@ -289,7 +290,7 @@ async function confirmAiScript(accountName, btn) { ? convo.map((c) => (c.role === 'u' ? `
${esc(c.text)}
` : `
${esc(c.text)}
`)).join('') - : `
在这里输入一个初步想法,AI 会引导你补齐形态 / 时长 / 情绪 / 受众 / 情节 / 结尾 / 植入等需求;每条输入都会即时更新上方的创作需求框。也可点回形针上传需求文档(doc / docx / txt / pdf)。Enter 发送,Shift+Enter 换行。
`; + : `
在这里输入一个初步想法,AI 会引导你补齐创意 / 形态 / 时长 / 情节 / 结尾等选题需求;每条输入都会即时更新上方的创作需求框。账号级设定(情绪基调 / 受众 / 植入等)已由账号设定提供,无需重复填写。也可点回形针上传需求文档(doc / docx / txt / pdf)。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 79f6d61..5b1830e 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(当前需求10行md), history(最近轮[{u,a}]) } → { answer } + // body: { accountName, turn(本轮输入), reqMd(当前需求6行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,9 @@ const server = http.createServer((req, res) => { + '3. 若信息已基本齐备:用一两句话总结并提示用户可点击「提交创作」。\n' + '4. 输出必须严格分两段:第一段是对用户说的话(120 字以内,含必要时的问题);\n' + '然后另起一行单独输出 ==REQ==;\n' - + '接着输出 10 行需求清单(仍未确定的项留空值,严禁编造),模板:\n' - + '- 一句话创意与选题:\n- 叙事形态:\n- 时长目标:\n- 情绪基调:\n- 受众:\n- 核心情节:\n- 结尾落点:\n- 结构性符号:\n- 广告植入:\n- 其他约束:'; + + '接着输出 6 行需求清单(仍未确定的项留空值,严禁编造),模板:\n' + + '- 一句话创意与选题:\n- 叙事形态:\n- 时长目标:\n- 核心情节:\n- 结尾落点:\n- 其他约束:\n' + + '5. 需求框只收集本条视频的选题相关信息;账号级设定(情绪基调 / 目标受众 / 结构性符号 / 广告植入等)已由账号设定自动带入创作,不要向达人重复询问这些维度——仅当达人主动提出与账号设定不同的要求时,将其记入「其他约束」。'; // 4) Dify blocking 调用 const difyUrl = String(process.env.DIFY_URL || 'https://mydify.youmanvideo.com/v1').replace(/\/+$/, ''); const ctrl = new AbortController();