资讯动态

Civitai Creator Studio 的 /models 范围决策实录:早期访问配置全量对齐与发布/排期快跟进路线

发布时间:2026/9/17 20:40:05 来源:尧图企业网站定制
Civitai Creator Studio 的 /models 范围决策实录早期访问配置全量对齐与发布/排期快跟进路线【免费下载链接】civitaiA repository of models, textual inversions, and more项目地址: https://gitcode.com/GitHub_Trending/ci/civitai导读本文基于 Creator Studio 产品决策文档 questions-justin-models-scope.md完整还原/models页面收尾阶段仅存的两项范围决策Q1 —— 早期/付费访问Early/paid-access配置在 v1 暴露哪些字段最终拍板“全量对齐”即与主应用表单完全一致以及Q2 —— 版本发布/定时发布publish/schedule是进 v1 还是快速跟进fast-follow推荐默认值为 fast-follow。读完本文你将掌握earlyAccessConfig全部字段的语义与取值边界、主应用写路径POST /api/v1/model-versions/early-access的防护逻辑、Creator Studio 侧setPaidAccessConfig的调用链以及“按版本编辑抽屉drawer”这一唯一剩余 UI 的演进方向。文中所有实现细节均可在当前仓库源码中逐一验证。背景/models是什么以及这两问为什么“窄”Creator Studio 的/models页面规格 是创作者对自己模型版本做商业化的控制面设置/调整/清除许可费licensing fee会员专属、编辑早期/付费访问配置early/paid access以及对 Creator Program 成员而言让版本无限期售卖。该文档在决策时点已经完成了许可费相关的全部工作单条 批量设置费用、0.01 精度的分数定价、Creator Program 门控、非商业基础模型守卫、搜索/筛选/排序/分页。因此questions-justin-models-scope.md 处理的不是“要不要做”的问题——两项在原则层面都已承诺——而是两个窄范围裁决narrow scope calls避免 v1 过度或不足建设。另有第三项“无限期售卖”sell access indefinitely被单独阻塞在主应用后端 A4 上不在本文讨论范围对应决策见 pre-implementation-decisions.md 的 A4/B2。决策落定后其结论被回写进两份权威文档形成闭环implementation-checklist.md/models清单中已标记[x] Full early/paid-access config editor (B12, full parity)pre-implementation-decisions.mdB12 记为“Full parity2026-07-10……已构建并合并”B13 记为“OPEN——等待 Justin”。Q1 —— 早期/付费访问配置v1 字段取舍已答复全量对齐earlyAccessConfig是什么earlyAccessConfig驱动Early Access早期访问创作者发布一个新版本在付费和/或时间窗口之后才对所有人免费开放。它提供两个变现杠杆均由timeframe限定时间付费下载pay-to-download窗口期内下载文件需支付 Buzz付费生成pay-to-generate窗口期内在站内用该模型生成需支付 Buzz可被免费试用次数和/或社区捐赠目标“软化”。它与许可费持续性的按图收费本质不同——早期访问是创作者从新鲜发布中获利的方式。窗口到期后版本自动变为免费/公开。文档上下文补充随着永久付费访问permanent paid access的引入这一配置在代码中已被统称为“paid access”早期访问只是其中timeframe有限的一种形态。主应用 REST 端点/api/v1/model-versions/early-access虽然沿用旧名但现已同时处理两种形态见 apps/creator-studio/src/lib/monetization/paid-access.ts 的注释。已定项与开放项已决定源自 models.md 与更早的产品轮次完整的earlyAccessConfig编辑器位于 Studio而非仅一个状态徽章且对任何属主开放——早期访问不受会员资格门控。开放项本问第一版要发布哪些字段。决策全量对齐full parity——暴露全部字段与主应用 upsert 表单一致避免出现“为什么我在主应用能设 X 在这里不行”的落差。字段语义表v1 全量暴露字段作用timeframe早期访问持续天数之后版本转为公开/免费chargeForDownloaddownloadPrice窗口期内下载文件收取 Buzz100 ⚡chargeForGenerationgenerationPrice窗口期内在站内生成收取 Buzz50 ⚡generationTrialLimit收费前可免费试用的生成次数默认 10——先试后买donationGoalEnableddonationGoal版本上的社区众筹/打赏目标Buzz 最小/最大值freeGeneration下载收费的同时允许免费生成两个杠杆可混用originalPublishedAt记账字段——真实发布日期保证早期访问结束后公开时间线正确需要指出的是文档中这张表记录的是早期访问最初立项时的字段命名在仓库当前实现中编辑器表单与端点契约已演进为PaidAccessConfig形态accessPrice、generationPrice、freePreviewGenerations、freeGeneration、acceptsBlueBuzz、donationGoalEnabled、donationGoal、timeframe、permanent语义一一对应downloadPrice对应accessPrice购买即解锁下载生成捆绑、generationTrialLimit对应freePreviewGenerations、originalPublishedAt对应数据库锚点initialPublishedAt。写路径上的完整字段定义见 apps/creator-studio/src/lib/monetization/paid-access.ts 的PaidAccessConfig类型。答复✅ 全量对齐——暴露所有字段Justin2026-07-10。关键约束为什么写路径不是“普通列写入”文档明确记录了一个重要的后续决策访问配置的写入不像许可费那样是简单的列写入。主应用路径强制实施一系列发布后守卫post-publish guards发布后不能新增早期访问发布后不能提高价格或延长timeframe发布后不能修改捐赠目标必须保留buzzTransactionId等隐藏字段发布时会创建DonationGoal行。因此选定的方案(a)是Studio 调用主应用的一个窄 REST 端点POST /api/v1/model-versions/early-access并转发共享的.civitai.com会话 Cookie。该方案已合并到主应用spoke 的编辑器抽屉 setEarlyAccess动作调用它版本级守卫与配置合并逻辑在端点的 service 中按用户计数的早期访问上限per-user EA limits在路由中。源码级验证写路径上的每一道闸门1. 端点常量与配置映射Creator Studio 的写客户端位于 apps/creator-studio/src/lib/server/monetization/paid-access.ts硬编码了端点// Paid access is written through the MAIN APP, not kysely: the write has real // side effects (donation-goal rows, buzzTransactionId bookkeeping, publish-state // guards, cache/search invalidation) that only the main app owns. const ENDPOINT /api/v1/model-versions/early-access;setPaidAccessConfig把编辑器的PaidAccessConfig映射为端点的PaidAccess契约{ id, paidAccess, donationGoal }其中permanent形态不携带timeframe捐赠目标仅在“非永久 启用 有金额”时附带。一个值得注意的细节永久配置只接受共享的 webhook token所以普通用户调用会被直接拒绝——见path的拼接逻辑apps/creator-studio/src/lib/server/monetization/paid-access.tsconst path config?.permanent ? ${ENDPOINT}?token${encodeURIComponent(env.WEBHOOK_TOKEN ?? )} : ENDPOINT;2. 会话 Cookie 转发callMainApp请求经由 apps/creator-studio/src/lib/server/main-app.ts 的统一封装callMainApp发出原样转发调用者的Cookie头并同时读取端点可能返回的error或message字段避免把真实原因吞成“Request failed (400)”const res await fetch(${MAIN_APP_URL}${path}, { method: init?.method ?? GET, headers: { content-type: application/json, cookie }, body: init?.body undefined ? undefined : JSON.stringify(init.body), signal: init?.timeoutMs ? AbortSignal.timeout(init.timeoutMs) : undefined, });主应用地址来自CIVITAI_APP_URL环境变量缺省回退到https://civitai.comapps/creator-studio/src/lib/server/main-app.ts。3. 版本级守卫assertUserEarlyAccessLimits主应用侧的用户级早期访问上限在 src/server/services/model-version.service.ts 的assertUserEarlyAccessLimits中单点强制同时供 tRPC upsert 与 REST 端点调用注释明确说明只在一处实现、两处调用否则会留下第二个敞口。它做的事包括定时窗口不能在“曾经发布过”的版本上开启以initialPublishedAt为判据publishedAt会被“结束早期访问”任务改写Scheduled 版本携带未来锚点所以只有已过去的日期才算。若已发布且没有活跃的定时 gate抛出Early access cant be started on a version that has already been published.timeframeDays不得超过用户上限getMaxEarlyAccessDays({ userMeta, features })超限抛Early access days exceeds user limit并发定时 EA 版本数受限getUserEarlyAccessModelVersions统计PaidAccess中endsAt now()的版本永久 gate 的endsAt为 NULL 自然被排除超过getMaxEarlyAccessModels抛You have exceeded the maximum number of early access models you can have.。对已处于窗口中的版本重新定价属于“编辑”而非“开启”仍被允许——这正是 Q1 后续“can only loosen terms”约束的底层依据。4. 前台表单校验镜像而非最终裁判Studio 的表单 schemaapps/creator-studio/src/lib/server/monetization/paid-access-schema.ts只做轻量形态校验并明确注释主应用端点updateEarlyAccessConfigSchema才是价格、用户上限与副作用的事实来源source of truth。其 refine 规则包括permanent或timeframe 0至少满足其一Set an early access duration, or make it permanent.每个被门控的版本都必须有访问价格accessPrice 0gen-only 版本会把它写成生成价格生成价格不能高于访问价格genMode separate时必须显式给出生成价格否则“更便宜的生成档”会悄悄回落为下载价——批量场景下会一次错价所有选中版本这正是 bulk schema 单独存在的理由。5. 金额边界与评分解锁共享常量定义在 apps/creator-studio/src/lib/monetization/paid-access.tsexport const MIN_ACCESS_PRICE 100; export const MIN_GENERATION_PRICE 50; export const DEFAULT_GENERATION_TRIAL_LIMIT 10; export const MAX_GENERATION_TRIAL_LIMIT 1000;与文档表格中的“100 ⚡ 下载 / 50 ⚡ 生成 / 默认试用 10 次”完全对应。另外定时窗口的时长与并发数量由创作者评分creator score解锁阶梯表EARLY_ACCESS_SCORE_UNLOCK/EARLY_ACCESS_QUANTITY_UNLOCK同样位于该文件apps/creator-studio/src/lib/monetization/paid-access.ts例如评分达到 10000 解锁 3 天/1 个并发窗口达到 250000 解锁 15 天/20 个并发窗口。6. 捐赠目标create-once 语义DonationGoal行在发布时创建且一旦创建即不可更新或移除。批量写路径因此必须“绕开”已有目标的版本versionsWithDonationGoal否则会在主应用侧被拒。当前仓库中捐赠目标的后续演进记录在 donation-goals.md目标达成后模型免费 30 天而非永久且整个DonationGoal特性本身可能被移除Justin 2026-09-03 待定。Q2 —— 发布 / 定时发布v1 还是快速跟进问题由来在 Studio 中发布草稿版本或设置未来发布日期。这是/models唯一还没有明确答案的事项B7 原题叫“Publish/schedule bulk fee editor — v1 or fast-follow?”但 Justin 的答复只解决了费用编辑器那一半批量 v1发布/排期未被提及且 models.md 仍把它标记为“仅次于费用的第二优先级”。为什么这是个决策发布在主应用上已经可用模型版本页面发布属于管理便利而非变现——而变现是 Studio v1 的焦点。推荐默认值快速跟进fast-follow——除非你希望 Studio 在上线时就是一个完整的模型管理中枢那样才进 v1。答复文档中留空等待 Justin 拍板——对应 implementation-checklist.md 中的 B13以及 pre-implementation-decisions.md 中 B13 的“OPEN——等待 Justin2026-07-10”。为何“边际成本”很低共用编辑抽屉文档给出一个关键工程论据无论 Q1 如何访问配置编辑器Q1都确定要做它与若进 v1 的发布/排期一起都挂在按版本的编辑抽屉edit drawer后面——抽屉通过?version面板可链接。这个抽屉是/models上唯一剩余的 UI 新增未来 A4 落地后“无限期售卖”也住进这里。因此 Q2 发布/排期的边际成本只是“在本来就要建的抽屉里多一个表单”而不是一次返工。这一设计在仓库中有对应实现痕迹/models路由页以editing状态打开按版本抽屉openEditor并通过 URL 参数承载表状态?q搜索、?status/?fee/?access筛选、?modebulk批量模式、?version抽屉定位支持goto(?…, { keepFocus, noScroll })的浅路由跳转见 apps/creator-studio/src/routes/(app)/models/page.svelte/models/page.svelte) 与 models.md 的“Routing URL state”一节。批量费用编辑器同样通过?modebulk实现为/models的一种模式而非独立页面决策 C2详见 licensing.md。决策对构建的影响已落地部分实现清单中的证据implementation-checklist.md 的/models一节显示以下条目均已勾选完成分组表格模型 → 版本含草稿搜索 / 费用筛选 / 排序 / 分页URL 驱动设置 / 调整 / 清除许可费——单条 内联、0.01 分数精度、CP 门控状态 Off/Active/Paused批量费用编辑?modebulk——按版本 全选、确认对话框按类型套用默认值非商业基础模型守卫属主 CP 门控服务端复查完整早期/付费访问配置编辑器B12全量对齐——按版本抽屉 → 主应用端点状态空、筛选空、非成员提示、错误 toast。即Q1 的“全量对齐”已经完整实现并合并Q2 的发布/排期仍为开放项fast-follow 默认在清单中以“⏭ Access-config drawer URL-addressable (?versionshallow routing) —/modelspolish”作为后续打磨项保留。写路径全貌Q1 的工程闭环从编辑器到持久化的完整调用链如下用户在/models行内点击“访问”徽章打开按版本抽屉PaidAccessEditor.svelte 持有编辑状态按版本{#key version.id}重挂载提交表单 →/models的setPaidAccessform actionapps/creator-studio/src/routes/(app)/models/page.server.ts/models/page.server.ts#L436-L519)先 zod 解析、再assertPricingAllowed检查当月定价配额、必要时先落usageControl、最后调setPaidAccessConfigsetPaidAccessConfig组装PaidAccess契约 →callMainApp转发会话 Cookie → 主应用POST /api/v1/model-versions/early-access主应用侧assertUserEarlyAccessLimits施加发布状态守卫、时长上限、并发数量上限service 完成配置合并与DonationGoal等副作用成功后recordPricingSlots记账只在写入成功后才记录失败绝不消耗当月配额。批量路径的职责划分批量设置付费访问bulkSetPaidAccessapps/creator-studio/src/lib/server/monetization/paid-access.ts展示了“Studio 做预筛、主应用做裁决”的分工先按属主过滤版本WHERE m.userId userId防止 skipped/failed 计数泄露出他人版本信息定时窗口不能在已发布版本上开启于是批量路径预先跳过initialPublishedAt now或status Published的版本skippedPublished计数回报给创作者但已在窗口中的版本保留资格重新定价是编辑而非开启目标已有DonationGoal的版本被跳过不尝试覆盖create-once 语义逐版本串行mapWithConcurrency调用主应用端点任一失败不拖垮整批最终返回{ updated, failed, skippedPublished, updatedIds }。总结两份决策的当前状态速查问题决策状态当前仓库Q1 早期/付费访问配置字段范围全量对齐full parity暴露全部earlyAccessConfig字段Justin2026-07-10✅ 已构建并合并per-version 抽屉 → 主应用 REST 端点B12Q1 写路径方案Studio 调用窄端点POST /api/v1/model-versions/early-access转发.civitai.com会话 Cookie✅ 已合并版本级守卫与合并逻辑在端点 service按用户 EA 上限在路由Q2 发布/定时发布推荐 fast-follow除非 Studio 需在上线时成为完整管理中枢正式答复留空待 Justin 开放B13边际成本 共用?version抽屉中的一个表单对于希望深入源码的读者建议按以下顺序追踪先读 questions-justin-models-scope.md 与 pre-implementation-decisions.md 建立决策全貌再看 models.md 页面规格最后对照 paid-access.ts写客户端、model-version.service.tsassertUserEarlyAccessLimits守卫与 main-app.ts会话转发验证实现与决策的一致性。【免费下载链接】civitaiA repository of models, textual inversions, and more项目地址: https://gitcode.com/GitHub_Trending/ci/civitai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价