# 14 个参考源码与 cc-switch:证据、取舍和许可 ## 1. 调研方法与可信边界 - 本地参考仓库位于 `example/`,提交身份见 [projects.json](../example/projects.json)。 - 本次阅读的是关键调用、适配、任务、配置、计费与阶段持久化文件,并结合仓库文档;不是完整安全审计,也没有运行参考产品或付费测试它们的全部功能。 - 下文“观察”是静态源码事实,“采用”是新平台的设计建议,两者不能混为一谈。 - Star 和最近推送只用于初筛,不是质量、合规或商业可用性证明。 - BigBanana 的公开仓库没有应用源码,不在本次 14 个源码分析中。 - 不复制参考项目的私有数据、品牌、UI 素材和凭据;代码复用需独立许可审查。本轮文档不是授权意见。 ## 2. 固定的参考版本 | 项目 | 本地提交前缀 | 本次优先考察 | | --- | --- | --- | | MoneyPrinterTurbo | `c3634de097ea` | 异步视频调用、结果下载与付费请求重试 | | OpenMontage | `e45f5b12bd46` | 阶段清单、人工检查点、产物契约 | | Open-Generative-AI | `0668c210ebfe` | 多媒体能力、输入模式和前后端接入边界 | | Pixelle-Video | `848b054e4fae` | 远程媒体服务、能力与实际适配能力区分 | | Toonflow-app | `d2e94aca7b59` | 四模态供应商、配置初始化、可扩展创作界面 | | huobao-drama | `26de7df59806` | TS 图片/视频适配器与协议差异 | | waoowaoo | `dfec20e32298` | 提交身份、报价、账本与平台模式 | | ViMax | `fd4b72e7731b` | 故事到镜头、多 Agent 和远程视频任务 | | Jellyfish | `a9678194ddf2` | 准备状态、生成任务、API 契约 | | dramaclaw | `a627206b3919` | 服务端计费度量、画布与远程网关 | | ArcReel | `cf051893d9d1` | 提交恢复、取消语义、容量与产物版本 | | open-higgsfield | `b16a0efe4d7e` | 轻量模型参数界面和集中服务端调用 | | ai_story | `e859bf39eb1e` | 图生视频节点、输入归一和提供商选择 | | ai-fusion-video | `a71143ede8c9` | New API 图片协议和并发队列边界 | cc-switch 是额外的定向参考,通过 GitHub API 阅读,**没有混入 14 个业务源码仓库**。本次固定提交:`daf442e5d71078b41677a34518f63159fc7393cf`,来源 [farion1231/cc-switch](https://github.com/farion1231/cc-switch)。 ## 3. 逐项目发现 ### 3.1 MoneyPrinterTurbo:付费生成与素材下载是不同失败域 证据:[MuAPI 客户端](../example/MoneyPrinterTurbo/app/services/muapi.py),尤其文件头、`MuAPIUnconfirmedTaskError`、`MuAPIDownloadError` 与 Base URL 解析。 **观察**:调用模块将提交/轮询协议与素材业务分开;明确指出受理后的任务可能收费,模糊提交不能重试;同时区分“无法确认任务”与“结果下载失败”。源码还存在默认上游地址与环境变量凭据读取。 **采用**:任务 ID 持久化、纯查询可重试、转存失败不重新生成。**不沿用**:默认地址、环境变量自动兜底、以应用级配置替代管理员数据库渠道。 ### 3.2 OpenMontage:阶段产物和人工关口优于一次性黑盒 证据:[cinematic 阶段清单](../example/OpenMontage/pipeline_defs/cinematic.yaml)、[checkpoint 持久化](../example/OpenMontage/lib/checkpoint.py)。 **观察**:阶段声明输入产物、输出产物、人工检查点和成功标准;checkpoint 根据 schema 验证阶段产物,而不是仅保存一个“已完成”标志。 **采用**:阶段冻结、产物契约、低成本试拍与预算批准。**不沿用**:文件目录作为公众 SaaS 的主数据库、无边界由 Agent 决定付费与系统操作。该项目的片段渲染/工具并不等于已经具备本平台的用户、支付与隔离体系。 ### 3.3 Open-Generative-AI:先区分工作流,再给参数 证据:[videoWorkflows.js](../example/Open-Generative-AI/packages/studio/src/videoWorkflows.js)、[muapi.js](../example/Open-Generative-AI/packages/studio/src/muapi.js)。 **观察**:首帧、首尾帧、多参考、编辑、延展和动作迁移有不同必需输入;能力与请求序列化分别组织。模块区分 Web 代理与桌面直连,也存在固定上游地址。 **采用**:以模式驱动表单,明确素材角色,缺少能力不显示不支持参数。**不沿用**:普通用户持有平台 key、固定域名、多入口各自提交付费请求。 ### 3.4 Pixelle-Video:厂商宣称能力不等于当前适配器支持 证据:[APIProviderMediaService](../example/Pixelle-Video/pixelle_video/services/api_media.py)。 **观察**:能力描述中同时出现 `ability_types`、`adapter_ability_types`、`input_modalities`、`adapter_input_modalities` 和 `contract_issues`;源码明确记录部分厂商能力没有进入当前调用路径。 **采用**:产品能力以“协议适配器实际实现 + 真实验证 + 管理员启用”交集为准;记录已知限制。**不沿用**:照抄源码模型清单与官方宣传能力就上架,或把本地 ComfyUI 作为必须项。 ### 3.5 Toonflow-app:四模态管理值得借鉴,默认配置不能照搬 证据:[媒体供应商解析与工具](../example/Toonflow-app/apps/server/src/utils/media/provider.ts)、[配置初始化](../example/Toonflow-app/apps/server/src/utils/conf/index.ts)。 **观察**:供应商模型类型明确包含 text/image/video/audio;支持自定义 TS 供应商解析、元信息、错误脱敏等。配置使用本地 `settings.json`;初始化会自动安装默认文本供应商并包含地址,只是 key 为空。 **采用**:能力分组、统一配置体验、错误脱敏与节点可复用思想。**不沿用**:初始化预填地址、文件级全局配置、向公众后台开放任意供应商 TS 执行。即使存在 VM 上下文,也不能未经专门隔离审查当成安全沙箱。 ### 3.6 huobao-drama:图片同步/异步与视频协议需要显式契约 证据:[适配器类型](../example/huobao-drama/backend/src/services/adapters/types.ts)、[注册表](../example/huobao-drama/backend/src/services/adapters/registry.ts)。 **观察**:图像适配器分别处理请求构建、提交响应、轮询、URL 与 Base64;视频有独立契约。输入明确包括首帧、尾帧、多种参考媒体和生成音频。 **采用**:小而明确的协议接口、同步/异步归一、媒体角色显式化。**不沿用**:大面积 `any`、业务与传输字段混合、以厂商名称硬编码业务。其非商业许可证不适合未经授权直接作为收费 SaaS 基座。 ### 3.7 waoowaoo:资金事实与调用身份必须比“重试按钮”更可靠 证据:[provider-invocation.ts](../example/waoowaoo/src/lib/task/provider-invocation.ts)、[ledger.ts](../example/waoowaoo/src/lib/billing/ledger.ts)、[计费设计说明](../example/waoowaoo/docs/architecture/modules/billing-approval.md)、[网关设计说明](../example/waoowaoo/docs/architecture/modules/provider-gateway.md)。 **观察**:存在调用 hash、checkpoint、`outcome_unknown`、外部身份以及预受理等状态;账本提供冻结的幂等查找与结果类型。文档强调价格唯一来源、计划快照、平台凭据只写不读。部分路由类型和架构文档对故障转移的表述有演进差异,不能把某一份文档当成所有实际运行分支的证明。 **采用**:请求身份、计划与报价快照、独立账本、幂等冻结和失败事实。**主动取舍**:本平台 P0 使用有上限的 LLM 预留而非直接照抄其后付模式,避免公众用户超额消耗。**禁止直接套用为托管服务**:当前根许可证为 ELv2,需另行授权评估。 ### 3.8 ViMax:故事编排与具体视频工具解耦 证据:[远程视频生成器](../example/ViMax/tools/video_generator_openrouter_api.py)、[项目说明与 Idea2Video/Script2Video/Novel2Video](../example/ViMax/readme.md)。 **观察**:视频工具明确完成 submit、读取 job/poll URL、查询终态和下载;首帧/尾帧有映射。产品层强调人物、剧本、镜头和多阶段生成。 **采用**:剧本与镜头的逐步推进、工具边界。**不沿用**:让 Agent 自己承担持久执行身份和财务授权;工具中存于内存的远程 ID 需升级为数据库检查点,默认地址不能保留。 ### 3.9 Jellyfish:镜头信息准备和运行时生成不是一个状态 证据:[视频 Task](../example/Jellyfish/backend/app/core/tasks/video_generation_tasks.py)、[视频输入契约](../example/Jellyfish/backend/app/core/contracts/video_generation.py)、[项目 Guide](../example/Jellyfish/AGENTS.md)。 **观察**:HTTP 协议适配与 Task 的轮询封装分离;项目将镜头提取确认、视频生成准备度和任务运行状态分别定义。部分视频适配路径含默认上游地址。 **采用**:三类状态分离、准备页与生成工作室分工、通用任务中心不塞全部业务细节。**不沿用**:只把 provider ID 放对象内存、无配置时自动官方地址兜底;需要执行期限与持久恢复。 ### 3.10 dramaclaw:计费度量必须由服务端探测 证据:[video_billing.py](../example/dramaclaw/src/novelvideo/video_billing.py)、[远程网关部署说明](../example/dramaclaw/README.md)。 **观察**:参考视频真实时长使用 FFprobe 读取,明确不能信任浏览器传入的时长。产品提供丰富画布与素材处理,网关与主应用存在独立部署边界。 **采用**:媒体输入计价基准来自受控探测;不能信任客户端的时长、字符数量或输出数量。**不沿用**:把复杂画布、运行任意 Agent 环境和网关部署一并压入首版。复用前需细查 `LICENSES/`、组件许可与商业版边界,不能因 API 元数据 `NOASSERTION` 视为宽松开源。 ### 3.11 ArcReel:重启恢复不等于重新提交 证据:[GenerationWorker](../example/ArcReel/lib/generation/generation_worker.py)、[取消决策](../example/ArcReel/docs/adr/0006-cancel-only-queued-tasks.md)、[孤儿任务与恢复](../example/ArcReel/docs/adr/0007-orphan-tasks-not-requeued-on-restart.md)。 **观察**:按供应商与媒体类型分容量;明确受支持部署是单 uvicorn 进程。排队可取消,执行中继续收取付费产物。重启后的已提交视频依原 job ID 恢复轮询,不重新触发生成;恢复还需执行快照。 **采用**:排队与上游已受理分界、持久外部 ID、恢复同一身份、产物版本。**不沿用**:单进程/SQLite 的孤儿判定直接扩成多实例;公众 SaaS 需要数据库 lease/fencing,不能把另一台仍活着的 Worker 当成孤儿。 ### 3.12 open-higgsfield:生成表单可以很轻,但 SaaS 权限不能省 证据:[actions.ts](../example/open-higgsfield/src/generation/actions.ts)、[catalog](../example/open-higgsfield/src/generation/catalog/)。 **观察**:服务端 action 解析模型参数、提交任务并集中查询多个状态;示例采用 cookie 凭据和环境 Base URL。 **采用**:模型驱动参数表单、集中批量查状态、轻量创作交互。**不沿用**:cookie 平台凭据或环境地址作为核心管理模型;当前根目录未见明确 LICENSE,不能自行假定可直接复制商业使用。 ### 3.13 ai_story:责任链与节点输出应当结构化 证据:[视频生成节点](../example/ai_story/backend/apps/workflows/node_executors/execute_video_generation.py)、[项目功能与许可说明](../example/ai_story/README.md)。 **观察**:节点规范化多个图片输入、选择 provider、调用视频客户端并归一输出;同时存在多个同义输入字段和默认时长。 **采用**:节点输入/输出契约、前置输入校验。**不沿用**:自由同义字段穿透全系统,或在计价后补默认参数;最终 canonical 字段只能由同一解释器产生。README 声明非商业许可,需商业授权后才考虑代码复用。 ### 3.14 ai-fusion-video:New API 兼容也有具体协议差别 证据:[NewApiImageProtocolAdapter](../example/ai-fusion-video/ai-fusion-video/src/main/java/com/stonewu/fusion/service/generation/image/strategy/newapi/NewApiImageProtocolAdapter.java)、[RedisTaskQueue](../example/ai-fusion-video/ai-fusion-video/src/main/java/com/stonewu/fusion/infrastructure/queue/RedisTaskQueue.java)。 **观察**:New API 图片的 generations/edits 选择考虑异步模式、参考图和兼容选项;队列显式处理并发计数与入队/取出。 **采用**:为 New API 定义经过验证的协议 profile;把同一模态的兼容差异收在适配器内。**不沿用**:认为若干 Redis 原子操作自然等于整个业务流程事务;计数租约、崩溃窗口与重投仍需数据库身份配合。 ## 4. cc-switch:借鉴的到底是什么 固定提交下的证据: - [ProviderRouter](https://github.com/farion1231/cc-switch/blob/daf442e5d71078b41677a34518f63159fc7393cf/src-tauri/src/proxy/provider_router.rs):有序供应商候选、故障转移开关、未配置错误、熔断筛选。 - [CircuitBreaker](https://github.com/farion1231/cc-switch/blob/daf442e5d71078b41677a34518f63159fc7393cf/src-tauri/src/proxy/circuit_breaker.rs):closed/open/half_open,探测许可释放。 - [Providers DAO](https://github.com/farion1231/cc-switch/blob/daf442e5d71078b41677a34518f63159fc7393cf/src-tauri/src/database/dao/providers.rs):数据库读写、排序与事务。 - [空状态组件](https://github.com/farion1231/cc-switch/blob/daf442e5d71078b41677a34518f63159fc7393cf/src/components/providers/ProviderEmptyState.tsx)。 | 可借鉴 | 本平台的变化 | | --- | --- | | 供应商卡片与新增/编辑/切换 | 只有管理员操作,发布后写数据库,普通用户不见密钥 | | 明确的当前选择与有序候选 | 新计划解析产品模型绑定,已经提交的任务锁定原版本 | | 熔断与恢复探测 | 针对渠道与能力,使用 Redis/数据库协调多 Worker;探测不得偷偷付费 | | 未配置的明确错误 | 首次数据库真正零地址、零凭据,禁止默认域名与自动 seed | | 协议适配 | 不局限文本;图片、音频、视频有独立能力与提交语义 | | 自动故障转移思想 | 不能用于超时后重新创建付费媒体任务;P0 媒体默认不自动换路 | cc-switch 是桌面工具,不是公众多租户、支付账本或短剧平台的现成服务端。它的本地文件同步、应用配置写回和桌面权限模型不应被直接移植。 ## 5. 许可审查摘要 | 项目 | 在本地看到的许可信息 | 对商业 SaaS 的建议 | | --- | --- | --- | | MoneyPrinterTurbo / Open-Generative-AI / Toonflow / ViMax / ai-fusion-video | 根 LICENSE 为 MIT | 可评估复用,仍需归属声明、第三方依赖与素材许可审查 | | Pixelle-Video / Jellyfish | 根 LICENSE 为 Apache-2.0 | 保留许可/NOTICE,审查专利与依赖义务 | | OpenMontage / ArcReel | 根 LICENSE 为 AGPL-3.0 | 网络服务和衍生作品义务需专业评估,不直接合入闭源产品 | | huobao-drama | 根 LICENSE 为 CC BY-NC-SA 4.0 | 有非商业限制,收费 SaaS 不直接复用,必要时取得商业授权 | | waoowaoo | 根 LICENSE 为 Elastic License 2.0 | 有 hosted/managed service 限制,不能直接当作收费托管基座 | | ai_story | 根 README 声明 CC BY-NC-SA 4.0,未见根 LICENSE | 先确认明确授权文本,不自行扩大使用权限 | | dramaclaw | 未见根 LICENSE,存在组件许可/商业版边界资料 | 必须逐组件核实,不以 GitHub 显示公开作为授权 | | open-higgsfield | 未见根 LICENSE | 授权不明确,先联系作者或只做概念研究 | | cc-switch | 本次读取的 LICENSE 为 MIT | 借鉴其配置管理设计,独立实现 SaaS 边界 | 以上仅为工程风险提示。文件名、版本、第三方依赖和许可证可能继续变化,正式复用必须以固定提交与法律审查为准。 ## 6. 最终推荐 **独立实现一个干净的 TS 产品,不 fork 一个大项目后继续堆功能,也不拼装 14 个项目。** 以 Toonflow / huobao / ArcReel / ViMax 的创作流程作为交互参考,以 Jellyfish 的领域分工、waoowaoo 的资金与调用身份、cc-switch 的渠道管理为设计输入。可优先评估宽松许可证的小型通用组件,但来源、授权和修改记录必须可追踪。