Skip to content

Bai-009/mcn-script-agent

Repository files navigation

轻醒 × MCN 商单脚本 Agent

输入一句品牌 brief,自动完成 选博主 → 学博主 → 写出该博主本人愿意拍的脚本 → 合规质检 → 写入飞书文档,并把"对每个博主的理解"沉淀成可复用、会过期刷新的档案。

方案报告(怎么找博主/参考内容/设计脚本分镜):report.md 飞书最终文档:https://fcnzx8bplws5.feishu.cn/docx/C97tdzN7doCMCbxYIKNcaBKcn2b 飞书写入证据(截图):feishu/feishu-doc.png — 脚本由 Agent 自动写入飞书后的文档内容 运行时架构图(动态):用浏览器打开 architecture.html


一、它解决什么

MCN 商单脚本的难点不是"写得好看",而是同时满足三件事:贴合这个博主的表达(不像本人会说的话,博主会拒拍、发出去数据也差)、规模化产出踩不得广告法红线。通用文案工具解决不了第一件,模板解决不了,人工又慢。

这个 Agent 的产物验收标准为:博主本人看完会不会说"这就是我会拍的"。脚本、分镜、飞书文档都是它的载体。


二、怎么跑

# 1. 依赖(uv 管理)
uv sync                # 或 pip install -r requirements.txt

# 2. 配置 .env(见下)
cp .env.example .env   # 然后填入 key

# 3. 运行(默认用内置的轻醒 brief)
uv run python main.py
# 也可传入自定义 brief 文件:
uv run python main.py path/to/brief.txt

.env 需要的变量:

DEEPSEEK_API_KEY=sk-...        # 运行时 LLM(OpenAI 兼容协议)
OPENAI_BASE_URL=https://api.deepseek.com
OPENAI_MODEL=deepseek-chat
# 飞书(配了才会真实写入,否则返回 blocks 预览)
FEISHU_APP_ID=cli_...
FEISHU_APP_SECRET=...
FEISHU_DOCUMENT_ID=...         # 见「飞书接入」

运行后产物落在 output/(脚本/分镜/合规结果)、creators/(博主档案),并写入飞书。


三、流程(7 步管线)

以 Context Window 为中心:每一步把前面所有产出一起注入,模糊判断交给 LLM,确定性操作交给工具。

判断 = 多个可被自主发现的 Skill。 skills/ 下有 4 个独立小 Skill(brief-decoder / creator-study / script-writer / compliance-checker),每个带 description。运行时 agent/skill.py 把所有 skill 的 description 交给模型,模型按当前环节自主选出匹配的那一个(代码校验、有默认兜底),再把它的正文载入上下文system prompt 只放 Agent 的运作协议(怎么干、如何选用 skill),不含领域判断;agent/prompts.py 只剩"做什么 + 输出什么 JSON"的薄任务模板。改判断 = 改对应 skill 的 markdown,跑动的 Agent 立刻随之变——判断是可被发现、可加载的资产,不是硬编码,也不是塞死在 system prompt 里。

做什么 由谁 产物
1 解析 brief 为结构化数据 LLM Brief
2 推导达人筛选标准 LLM ScreeningCriteria
3 召回候选 + 选定 1 位 工具召回 + LLM 判断 Creator
4 抽取博主档案 LLM(命中缓存则跳过) CreatorContract
5 生成脚本 + 分镜 LLM Script
6 合规质检 规则引擎 + LLM 改写(≤3 轮) 合规 Script
7 写入飞书文档 飞书 API 文档链接

第 4 步抽的是博主的判断(她替受众解决什么、什么会让她掉粉、会接/拒什么植入),不是"开场/语气/节奏"这类表面特征——后者换一个她没拍过的产品就套不上去。档案里内置一个自检:给一个陌生产品,能否凭档案推出她会怎么开场/收尾。推不出就判定抽得太浅、打回重抽。 档案带内容指纹与时间戳,存为 creators/<id>.contract.md;下次运行若博主内容没变就复用缓存、变了才重抽(缓存失效)。

动态架构图见 architecture.html(可自动播放,逐步展示每一步什么进入 Context、什么沉淀进 Memory、Loop 如何回流)。


四、飞书接入

企业自建应用 + tenant_access_token,调 docx/v1 接口写文档块。

配置步骤:

  1. 飞书开放平台 → 创建企业自建应用 → 拿 App ID / App Secret
  2. 权限管理开通 docx:document(读写)+ drive:drive创建版本并发布(改权限必须重新发版才生效)
  3. 新建一篇飞书文档,地址 …/docx/XXXX 中的 XXXXdocument_id;在文档「分享」里把本应用加为可编辑
  4. 填入 .envFEISHU_APP_ID / FEISHU_APP_SECRET / FEISHU_DOCUMENT_ID

写入是幂等的:write_script_to_doc(replace=True) 会先清空文档根块的已有子块再写,同一文档跑 N 次结果恒等于一份(实测连写 3 次块数稳定不翻倍),不会重复追加。

连通性自检(不跑整条 Agent,逐层定位问题):

uv run python -m feishu.test_connection
# [1/3] 拿 token  [2/3] 读文档  [3/3] 写测试块

排查记录(题目要求:遇到权限/API 限制如何排查)——真实踩坑顺序:

现象 原因 解决
拿 token 失败 App 未发布 / 凭证错 发版、核对 App ID/Secret
读 OK、写 1770032 forbidden 文档只分享了「可阅读」 改为「可编辑」
1770001 invalid param 文档块 block_type 与字段名不匹配(heading2 应为 4、bullet 应为 12,原代码写成 3/15) 修正 feishu/client.py 的块类型
code:0 成功写入 18 块

五、用到的 AI 工具

  • Claude Code — 搭建/重构 Agent 主体(管线、契约抽取、缓存、合规、飞书修复)
  • Codex — 初版脚手架
  • DeepSeek(deepseek-chat) — 运行时 LLM,OpenAI 兼容协议接入

六、目录结构

repo/
├── README.md                   # 本文件:说明/运行/飞书接入/边界
├── report.md                   # 方案报告:怎么找博主/参考内容/设计脚本分镜
├── main.py                     # 入口
├── agent/
│   ├── core.py                 # 7 步编排 + 校验/重试/合规循环
│   ├── skill.py                # Skill 注册表:扫描 skills/、按 description 供模型选用、载入正文
│   ├── prompts.py              # 薄任务模板(只剩"做什么+输出什么 JSON",判断不在这里)
│   ├── schemas.py              # 结构化数据定义(含 CreatorContract)
│   ├── validation.py           # 结构化校验 + 失败回灌
│   ├── contract_store.py       # 博主档案落盘 + 缓存失效(新鲜度检查)
│   ├── tools.py                # 确定性工具:召回/取内容/合规/写飞书
│   └── memory.py               # AgentState 累积 + Context 注入
├── feishu/
│   ├── client.py               # 飞书 docx/v1 客户端
│   └── test_connection.py      # 飞书连通性自检
├── config/compliance_rules.json  # 合规词表(外置,业务可改,无需动代码)
├── skills/                     # 4 个独立小 Skill = 判断源,按 description 自主发现、按需载入
│   ├── brief-decoder/SKILL.md       # 拆 brief、推筛选标准、选博主
│   ├── creator-study/SKILL.md       # 学博主、提炼内容逻辑(判断非特征)
│   ├── script-writer/SKILL.md       # 写"博主会拍的"脚本+分镜
│   └── compliance-checker/SKILL.md  # 合规判断与按口吻改写
├── creators/                   # 博主档案(运行时生成,含 .md 可读版)
├── output/                     # 脚本 / 分镜 / 合规结果
├── architecture.html           # 动态运行时架构图
└── prompts/ · references/      # Prompt 迭代记录 · 调研材料(接入位见下)

七、已知边界与取舍(诚实说明)

  • 博主数据是 stub。 候选库与内容样本目前是内置示例,收在 search_creators() / get_creator_content() 两个工具背后。真实小红书接入就是替换这两个工具的实现(爬虫 / MCP / 人工录入),管线、Prompt、Skill 均不变——这是刻意留出的数据接缝。
  • 合规修复:LLM 按博主口吻重写,不做机械替换。 命中红线后让 LLM 在博主口吻内重写(≤3 轮);多轮仍触线则阻止交付、待人工介入——不靠无上下文的字符串替换产出生硬/误替换的稿(如 第一步很适合步)。
  • 合规词表外置config/compliance_rules.json,业务方新增违禁词/调阈值只改配置、无需动代码或重新部署;文件缺失会回退到代码内默认值。规则的「campaign 级动态化」(直接由 Brief.red_lines 驱动)是下一层——红线是自然语言、需先做术语抽取,当前仍以全局词表 + 生成时 prose 约束的方式落地。
  • 管线是确定性编排,非模型自主调度。 步骤顺序由代码固定(更可控、可复现),而非交由模型自由决定工具调用——这是面向可靠交付的取舍。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages