
Civitai Creator Tools Backlog 解读从安全加固到变现与可发现性的创作者工具路线图【免费下载链接】civitaiA repository of models, textual inversions, and more项目地址: https://gitcode.com/GitHub_Trending/ci/civitai本文围绕仓库中的 docs/creator-tools-backlog.md 展开系统梳理 Civitai 面向创作者的待办工作清单以 P0安全到 P4可发现性的优先级体系组织问题与预期结果并结合 commentv2.controller.ts、collection.service.ts、base.notifications.ts、model-version-monetization-defaults.store.ts 等源码以及 creator-studio/monetization/pricing-templates.md 的实现计划还原每一条目背后的真实代码逻辑。读完你可以理解该仓库如何用一份 backlog 文件同时承载安全问题收敛、变现状态可见性、跨域发布、模型管理摩擦与创作者触达等五类工作以及每一类工作在代码中的落点。一、这份 backlog 是什么结构、优先级与安全约束creator-tools-backlog.md是 Civitai 面向创作者的反馈汇总与工作清单条目按优先级从高到低排列每条独立陈述「问题是什么、期望结果是什么」因此任何条目都可以脱离上下文单独接手。文件把工作划分为五个层级层级主题代表性条目P0 — security屏蔽block机制的安全闭环被屏蔽用户仍可在防护未覆盖处写入P1 — monetization state变现状态可见性模型页不显示访问类型与价格P2 — cross-domain publishing跨域发布与合集SFW 展示元数据、合集封面图控制P3 — model management模型管理摩擦通知不感知屏蔽、上传设置不持久化P4 — discoverability可发现性与触达个性化 For You 信息流、刷新加权文件对「检查项」的语义做了严格约定[x]表示确认已完成若修复从未被确认则验证步骤保持未勾选状态。值得特别注意的是文件的安全编写约束由于仓库是公开的且历史不可变任何「未修复的弱点描述」都会成为攻击者的待办清单。因此每个条目的措辞只保留「被破坏的不变量」和「计划中的修复」绝不写攻击步骤未勾选的子项只允许是决策或验证项不允许是已知的入侵路径。二、P0 — 屏蔽写入护栏的完整闭环P0 的核心条目是「被屏蔽的用户仍可以在屏蔽护栏未覆盖的地方写入」。屏蔽Block机制在评论、反应reaction和评测review的写入路径上强制生效方式是解析被交互内容的归属者owner再检查写作者与归属者之间是否存在屏蔽关系。文档记录了修复过程中发现的四个覆盖缺口均已在源码中留下可验证的证据十五种评论实体类型中有两种解析不到归属者。其中第二种的根因是「可空归属者」而非「无归属者」——系统创建的行返回 null用户创建的行返回创建者。对应的归属解析逻辑见 commentv2.controller.ts 中的getCommentV2WithEntityOwner它根据entityType选择ownerFieldchallenge 用createdById其余用userId并特判comicChapter走comicChapter → project → userId的间接关系。回复reply的归属解析遗漏了线程的三列归属字段。顶层评论只检查父评论作者而回复所挂接的内容归属者未被检查这是一条独立于顶层场景的路径需要单独的修复。归属解析的 switch 未覆盖全部实体类型枚举。默认分支为「无归属者」这被读作「允许」而且一个测试把这个默认行为钉死为预期——正是它制造了上面两个缺口。修复后新增实体类型若未解析归属者将直接导致构建失败运行时兜底仍返回「无归属者」保证意外值不会让写入路径悄悄放行。评论编辑edit路径同样需要强制。一条在屏蔽之前写下的评论如果编辑不检查屏蔽就可以事后被改写成任何内容。测试文件 comment.controller.block-check.test.ts 用「仅存储评论所在模型的归属者屏蔽了作者」这一场景验证编辑时若信任请求体而非存储中的归属者测试就会失败——这正是「守卫被移除时测试必须失败」的验证哲学。两个设计决策值得单独强调拒绝写入返回 404 而非明示屏蔽。显式拒绝会向被屏蔽用户确认「你被屏蔽了」404 与既有行为一致不泄露屏蔽状态。读取故意不做屏蔽。被屏蔽用户通过直接 URL 访问评论线程、或看到 UI 本应隐藏的内容都是预期行为任何公开线程对未登录访客都可读读检查买不到什么——隐身窗口就能绕过——却要在热读路径上付出一次归属者查询的代价。现有的页面级隐藏只是 UI 便利不是安全控制不应升级为服务端检查。此外反应reaction与评论共用同一套归属解析器因此自动继承了上述所有缺口的修复。屏蔽对写入保持单向被屏蔽者不能在被屏蔽人的内容上写入但屏蔽者仍可在对方内容上写入是否对等回屏蔽由另一方自行决定。三、P1 — 变现状态在关键位置可见P1 的核心问题是「变现状态在关键位置不可见」。创作者在civitai.com/models/:modelId查看自己的模型时只有生成成本generation cost是清楚显示的付费访问paid access还是抢先体验early access、价格多少都要打开编辑表单才能看到。已修复下载动作上的价格可见性。根因是价格徽章只在「查看者必须付费」时渲染而创作者owner永远拥有下载权限导致创作者在自己模型页面上永远看不到自己的价格。修复方案是在下载按钮上同时携带信息性标价listed price源码 DownloadButton.tsx 中downloadPrice是「当前查看者必须支付的价格」listedPrice是「购买者支付的价格」const shownPrice downloadPrice ?? listedPrice当downloadPrice为空而listedPrice存在时就是isListedOnly场景——对创作者和版主展示信息性标价并用Buyers pay ${abbreviateNumber(listedPrice ?? 0)} Buzz的 Tooltip第 59 行明确提示这是买家付费金额避免被误读为对创作者本人收费。同一模式也应用在 GenerateButton.tsx注释明确写着「listedPrice是买家支付的、展示给已拥有访问权限的 owner/mod——绝不能被误读为向他们收费」。已确认修复付费销售在创作者分析中的分类。永久付费访问和限时抢先体验现在通过事务 id 前缀和描述前缀双重区分分析模块据此分类。历史行不做重写而是在读取时依据版本当前携带的门gate标记解析唯一仍然归类错误的场景是「某版本先跑抢先体验、后切换为永久访问」其较早收入会移入永久访问列——但该歧义窗口已经关闭且不会扩大。未完成模型页直接展示访问类型与价格。目标是在模型页本体至少对 owner显示访问类型与价格无需打开编辑表单。四、P2 — 跨域发布与合集SFW 元数据与封面图控制P2 是一组与「跨域发布」强相关的条目核心矛盾是只要模型包含任何 NSFW 内容今天就只能挂在.red域名下被挡在更大的.com受众和 Green Buzz 销售之外。[ ] 模型携带独立的 SFW 标题、描述与封面图。允许创作者定义 SFW 展示元数据让同一个模型能列在.com上同时其 NSFW 资源保持门控。构建前需要先决策哪些展示面feeds、卡片、搜索、活动合集读取 SFW 变体。[ ] 先成文记录展示指引。在能力上线前创作者没有任何关于「模型名称和封面图是否需要 SFW」的成文规则而这直接决定他们的模型是否有资格参与 SFW 活动。[ ] 合集增加封面图控件。合集无法指定「提交的模型用哪张图来代表」导致一个模型若第一张图的评级超过合集上限即便它拥有合格图片也会因展示理由被拒收——这正是「本可合格的 SFW 活动投稿被拒」的直接原因。[ ] 模型以 SFW 呈现、而图库允许成熟内容。构建在许可限制成熟使用的基础模型之上的创作者希望以 SFW 名义SFW 名称、封面、官方图片发布和推广模型而不被社区后续张贴到图库的成熟内容反驳。缺失两个能力一是「刻意 SFW 徽章」声明模型的呈现方式而非从其图片推断二是「抑制图库中成熟图片」的能力且后者只需作用于带提供者provider徽章的模型不必做成通用图库控件。条目末尾还单列了一个创作者侧问题优先回答发布受许可限制基础模型的成熟衍生品是否会让创作者自己的账户承险——这是政策答案、无需代码但当前正阻塞创作者开工。五、P3 — 模型管理摩擦通知屏蔽、设置持久化与销售工具5.1 评论通知不再无视屏蔽关系「评论通知忽略屏蔽关系」是已修复条目通知生成此前不过滤屏蔽导致一对已屏蔽的用户仍持续收到关于彼此的评论活动通知。这不是安全缺口——读取刻意开放通知并没有披露收件人本来够不到的内容——但它反复把一个人拉回屏蔽他的人身边与屏蔽的初衷相反。修复的核心是一段可复用的 SQL 片段notBlockedBetween(recipient, actor)定义在 base.notifications.ts它用NOT EXISTS检查UserEngagement表中双向是否存在 Block收件人一侧还计入 Hide因为 Hide 是单向的「不要让我看到这个人」。注释揭示了两个关键设计为什么需要它即使写入守卫已生效提及mention从屏蔽者从未触碰的内容抵达收件人没有写入守卫能看到它关注follow则先于屏蔽存在Follow 行比屏蔽活得久、持续投递。两者都需要通知层的过滤。为什么用一次双向 NOT EXISTS 而非拆成两个子句这是精确的UserEngagement主键查找拆成两个NOT EXISTS会慢 2.5 倍——优化器会为其中一侧选到二级索引每个候选行读约 47 行而非 1 行。过滤范围随后扩展到每个点名行为者的通知提及以及「你关注的人发布了新模型 / 新版本 / 新文章」类。其中提及最重要收件人从屏蔽者从未触碰的内容收到消息关注类次之关注先于屏蔽存在。反应通知则无需过滤——它们是里程碑式通知「你的评论达到 5 次反应」聚合时没有可对比的行为者。5.2 模型上传设置在不同模型之间持久化「发布设置块在每次新建模型时重置」是进行中条目[~]已拆成三部分[x] 变现半场已记忆最近一次真正产生收费的保存会按模型类型存入 localStoragezustand 的 persist 中间件在新版本启用变现时回填——只填表单永不自动收费。实现见 model-version-monetization-defaults.store.tsstore 以ModelType为键、值刻意以unknown读取浏览器里存的是「上次用的那个构建版本」写下的调用方需按当前结构解析持久化键名为model-version-monetization-defaultsversion 为 1。[ ] 命名模板真实诉求是创作者在 studio 中自建模板替代上面的按类型记忆。计划文档 creator-studio/monetization/pricing-templates.md 给出了完整的实现设计——单表PricingTemplateuserId、priority升序优先、enabled、modelTypes/baseModels/ecosystems三个空数组即「任意」的定位轴、licensingFee与licensingFeeType列、整段门配置存paidAccessJson匹配规则为「模板匹配 (modelType, baseModel) 当且仅当两个轴都命中」优先级采用显式排序、首个匹配胜出明确否决 CSS 式特异性评分因为有序列表是创作者能在屏幕上读懂并重排的规则——防火墙规则模式。模板「填表单永不收费」且与 localStorage 记忆的字段名刻意保持一致以便迁移或直接废弃。[ ] 块的其余部分只有变现被记忆训练词、描述、推荐资源和文件级设置仍会重置向导现有的「使用模板」流程复制整个模型的设置覆盖了其中一部分但它是否也该携带变现设置尚未决策。5.3 其余 P3 条目[x] 模型版本 tooltip 显示版本名Creator Studio 已修复——截断名称单元格的 tooltip 携带完整行标签含版本名这是按版本分组时区分同模型两行的唯一依据。[ ] 定时价格促销与创作者商定的规格为——预设开始日期、结束日期、折扣百分比、目标模型集合可选启动时通知关注者每位创作者每月促销次数上限防止通知沦为垃圾渠道可选「上架 N 天后自动按百分比降价」并配降价通知。[x] 只显示已赚取的 Buzz账户设置可隐藏头部非赚取余额只留赚取数字。该设置先于请求存在因此真正的诉求是「可发现性」问题——创作者为自己已有的开关写浏览器脚本。[ ] 今日销量计数器创作者手动追踪每日销量一个无需打开分析即可见、当日滚动的计数即可覆盖需求。[ ] 视频排行榜与全时排行榜视频创作者完全没有可上榜的榜单请求形态为按 SFW/成熟分拆的滚动 30 天视频榜以及视频模型创作者的同构分榜再按单个模型细分被认为过细。此外现有榜单全部是滚动 30 天没有任何全时榜单长尾目录创作者没有能反映其积累的地方全时榜单独立于视频、可单独上线。六、P4 — 可发现性与触达[ ] 个性化 For You 信息流模型和图片内容只有很短被发现窗口过期后无论质量如何都实际消失。方案是算法驱动的单条信息流——纵向、一次一个资源、短视频 feed 形态——给老内容反复曝光的机会。已有创作者用浏览器脚本做过原型交互模型已被验证。[ ] 已有模型的「刷新」加权允许给已有模型新增示例图的创作者把它顶回按时间排序的 feed每月至多一次而不必纯粹为了操纵排序发布版本更新。[ ] 面向受众分群发消息创作者想通知「既关注我又下载过某模型」的人文章articles是当前唯一选项但触达了错误人群。需要每条创作者的消息发送速率限制。[ ] 从外部主机导入模型文件接受源 URL 加访问令牌由平台服务端拉取文件替代浏览器上传。大型模型文件经过不可靠的家庭上行链路上传慢且易失败服务器到服务器传输更快且可重试。[ ] 创作者订阅档位让用户按循环费用订阅一位创作者换取其目录的显著折扣也让没有单模型可卖的图片创作者有东西可赚。[ ] 允许用户隐藏侧边菜单项主侧边导航长得足以让创作者想隐藏不用的条目。方案二选一设置中逐项可见性或更紧凑的布局。相关这些条目的颜色编码已不再映射任何有意义的东西应重新推导或删除。[ ] 头部余额悬停显示精确值余额组件已带「abbreviate」开关、tooltip 能列出各账户类型的精确数字用户菜单已同时使用两者。缺口仅是头部余额未传 tooltip悬停右上角数字无任何反馈——大额余额正是在那里被读成整百万的。注意这是真实改动而非加个 prop头部余额渲染在用户菜单的 popover 触发器内部加悬停层必须验证点击打开菜单的行为不被破坏。[ ] 通过 API 文档化并定价更重的训练程序化 LoRA 训练已可通过编排 API 完成但路径在面向创作者的文档中不可发现也没有面向更大任务如按溢价收费的 checkpoint 训练的报价。悬而未决的实际问题是训练数据集归档托管在何处平台才能抓取它。七、Done 区已确认落地的两件事[x] 批量模型更新创作者现在可以跨模型批量设置许可费、抢先体验、付费访问和使用控制也能批量移除许可费或付费访问。覆盖了反馈中的痛点粗糙边缘仍在后续反馈尚未收集。[x] 把活动合集模型保存进无关合集将属于活动合集的模型保存到另一个合集曾报错Collection is not accepting submissions at this time源于collection.saveItem。源码 collection.service.ts 展示了这条错误的触发条件当metadata.submissionStartDate晚于当前时间、或metadata.submissionEndDate早于当前时间时直接抛出该throwBadRequestError——即合集存在提交时间窗。这与 P2 的「合集封面图导致合格投稿被拒」共同说明活动合集的展示/提交规则是创作者侧反复踩坑的高频地带。条目由报告者确认已修复但根因从未确立——需要确认这是修复而非活动合集提交窗口的巧合变化以免下一个活动复发。八、从这份 backlog 能读到什么把文档与源码对照可以提炼出三条贯穿性的工程原则它们对阅读和接手 Civitai 代码库都有直接帮助不变量优先、修复措辞克制安全条目只写「被破坏的不变量」与「计划修复」配套的测试必须「守卫移除即失败」comment.controller.block-check.test.ts 就是范本保证枚举扩张以构建失败收口。读取开放、写入受控是显式决策屏蔽、通知过滤notBlockedBetween都以「双向主键查找保持廉价」为前提设计性能与语义的权衡都写在注释里后续改动不应悄悄升级为服务端读检查。创作者工具以「填表单、不收费」为安全线无论是已落地的价格可见性listedPrice的信息性展示还是计划中的定价模板pricing-templates.md 明确「模板填表单、永不收费」变现相关的一切预填都不得绕过创作者的显式保存动作。如需跟进条目的最新状态可直接阅读 docs/creator-tools-backlog.md 本体勾选状态即当前事实并结合 pricing-templates.md 这一份被引用为「计划」的姊妹文档以及 creator-studio-feedback-2026-08-03.md 中并列追踪的「命名价格组 / 价格标签」开放项。【免费下载链接】civitaiA repository of models, textual inversions, and more项目地址: https://gitcode.com/GitHub_Trending/ci/civitai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考