OpenCreator 深度拆解:以 Codex 为执行内核的本地优先开源 AI 工作台

发布时间:2026/11/5 1:45:46
OpenCreator 深度拆解:以 Codex 为执行内核的本地优先开源 AI 工作台

OpenCreator 深度拆解:以 Codex 为执行内核的本地优先开源 AI 工作台

【免费下载链接】OpenCreatorFormerly KrillinAI, VideoTranslation and Dubbing Tool for 120+ Languages. Open-source AI workspace for creators, powered by Codex. Video downloader, video translation, create videos, images, audios, and edits with Agents in one place. For your Social Media like YouTube, TikTok, Instagram, etc.项目地址: https://gitcode.com/GitHub_Trending/kr/OpenCreator

OpenCreator(原 KrillinAI)是一个本地优先的开源 AI 创作工作台:视频翻译、媒体下载、图像/视频生成与 Agent 对话共用同一套状态机,执行内核直接复用 Codex CLI。本文以源码为证据,核实它的分层架构、安全边界与本地跑通方式。

它做的那一个决定

OpenCreator 不重写 Agent loop。模型访问、推理、工具调用、会话、Skills 与 MCP 全部交给 Codex CLI 进程,apps/daemon只负责在其上做编排、持久化、审批与事件标准化——即"不再维护第二套执行引擎"。

这个决定的代价是硬依赖:apps/daemon/src/main.ts启动时先对 Codex CLI 做版本探测,超时 3 秒,失败即输出CODEX_VERSION_CHECK_FAILED并置process.exitCode = 1,daemon 拒绝启动。它锁定的收益同样明确:MCP 管理直接读写$CODEX_HOME(apps/daemon/src/codex/mcp/manager.ts),技能市场安装指向同一目录,OpenCreator 与用户已有的 Codex 配置完全同构,没有翻译层。

与 Codex 的通信走常驻 app-server:main.ts中persistentAppServerEnabled: process.env.OPENCREATOR_PERSISTENT_APP_SERVER !== '0'——即默认常驻,显式设0才回退到一次性进程。客户端在apps/daemon/src/codex/app-server-client.ts,能力探测缓存写入${dataDir}/codex-capabilities.json并按二进制指纹失效。

三条用户能感知到的线

开源 AI 工作台的能力不必按九个功能罗列,收敛后是三条用户意图线:

  • 创作内容:视频翻译、视频下载、封面生成、图像生成、智能配音、Seedance 视频生成六个工作区,每个背后是一个 Executor(执行器)。典型场景:导入一段 46 分钟本地视频 → Whisper 转写 → LLM 断句对齐与翻译 → 双语字幕 + 配音 → 横竖屏合成导出 SRT/音频/成片,全程无手工字幕调整。
  • 让 Agent 替你干活:按项目组织会话,Run 在后台持续执行,可排队追加或立即打断;计划任务(cron)各拥有一个长期专属会话,触发、手动运行、追问复用同一会话。典型场景:定时任务夜间自动产出,第二天在任务中心统一查看。
  • 管好本地数据:数据库、Run 日志、附件、托管工作区默认留在本机;审批门控敏感操作,Run 日志与诊断导出前脱敏,每次修正生成新版本而非覆盖。

工作台与对话共享同一状态机:apps/web是唯一前端,服务端状态机在apps/daemon/src/creator/,两侧向同一组状态发事件,从结构上杜绝两份互相冲突的任务状态。

从你敲下的那条命令开始

git clone https://gitcode.com/GitHub_Trending/kr/OpenCreator cd OpenCreator corepack enable pnpm install pnpm web:dev

pnpm web:dev展开为pnpm --filter @opencreator/web dev,即vite --host 127.0.0.1(见apps/web/package.json)。开发服务器按需拉起 daemon,终端打印连接地址与临时 token,同源代理注入后即可在输入框直接对话,无需手工复制连接信息。

你看到的每个行为都有明确驱动代码:

  • 每次启动生成一次性凭据:apps/daemon/src/security/token.ts的createRuntimeToken()用randomBytes(32)生成 base64url 字符串,main.ts最后将其与监听地址一起打印到 stdout。
  • daemon 只监听回环:main.ts中server.listen({ host: '127.0.0.1', port: 0 })——即端口由系统随机分配,局域网不可达。
  • 首个任务提交后进入 Run 生命周期:状态机、并发控制与终态判定都在apps/daemon/src/runs/manager.ts;事件经apps/daemon/src/events/normalizer.ts标准化后通过 Runtime API + SSE 推到 Web。

只调试 daemon 时用pnpm daemon:dev。

拆开来看:谁在哪个层干活

+------------------------------------------------------+ | 桌面宿主 apps/desktop | | Electron:窗口/托盘/原生通知/真实路径(Preload 桥) | +------------------------------------------------------+ | 创作体验 apps/web | | React + Vite,唯一前端实现,Web/Desktop 同一构建 | +------------------------------------------------------+ | 协作核心 | | 共享工作流状态机:步骤/进度/结果/版本历史 | +------------------------------------------------------+ | 本地 Agent Runtime apps/daemon | | Fastify + SSE:项目/Run/审批/计划任务/记忆/通知 | +------+------------------+---------------------------+ | 本地数据 | Codex 引擎 | 媒体工具链 | | SQLite | CLI/app-server| yt-dlp/FFmpeg/Whisper | | 文件存储 | Skills/MCP | AI 服务 | +------+------------------+---------------------------+
层职责关键入口文件一句话实现要点
桌面宿主操作系统能力apps/desktop/src/preload/index.tsPreload 桥只做系统能力透传,不复制通用业务逻辑
创作体验全部 UIapps/web/src/唯一 React 前端,与 Desktop 共用构建产物
协作核心状态同步与版本apps/daemon/src/creator/工作台与对话是同一状态机的两个投影
本地 Runtime编排与生命周期apps/daemon/src/api/server.tsFastify 服务,所有创作 Executor 在此注册
Codex 引擎Agent 执行真相源apps/daemon/src/codex/app-server-client.ts常驻 app-server,事件标准化后外发
媒体工具链下载/转写/合成apps/daemon/src/creator/yt-dlp/runtime.ts、runtime/krillinai/yt-dlp + 多 Whisper 后端 + FFmpeg
本地数据持久化与路径packages/config/src/index.tsresolveOpenCreatorPaths统一解析全部路径

核心不变量:

  • 前端不直接启动 Codex,也不依赖其原始 JSONL 事件格式;所有事件经apps/daemon/src/events/normalizer.ts标准化后才推送。
  • Codex 是 Agent loop、Skills 与 MCP 的唯一执行真相源,OpenCreator 不持有第二套。
  • daemon 独占进程生命周期、持久化、审批、计划任务与通知 outbox。
  • Browser 与 Desktop 桥不分别实现通用业务逻辑,两端共享同一 Web 构建。
  • 跨端一致性有测试兜底:apps/web/e2e/gateway-web-desktop-parity.spec.ts、apps/desktop/e2e/desktop.spec.ts等 Parity/E2E 用例。

能力清单:什么能跑、什么还在路上

功能状态具体能力对应 Executor / 模块
视频翻译✅转写、断句对齐、术语处理、双语字幕、配音、横竖屏合成、SRT/音频/成片导出creator/templates/video-translation-actions.ts(createVideoTranslationWorkflow)
视频下载✅解析 YouTube/Bilibili 等公开链接,比较清晰度与格式,下载视频/音频creator/download/executor.ts(createDownloadExecutor)
封面生成✅主题 + 链接 + 参考图生成多版封面并对比选择creator/templates/cover-actions.ts(createCoverWorkflow)
图像生成✅GPT Image,设置画幅与数量,预览下载creator/image/executor.ts(createImageExecutor)
视频生成✅Seedance 文生视频/图生视频,多版本重生成与下载creator/video/executor.ts(createVideoExecutor)
智能配音✅脚本转配音,调整音色、节奏与情绪creator/smart-dubbing/executor.ts(createSmartDubbingExecutor)
火柴人动画✅角色、分镜、配音、Timeline 与 Remotion 渲染全链creator/stickman/(createStickmanContentExecutor等)+packages/stickman-remotion
自动剪辑🔧长视频分析、高光识别、短视频再剪辑api/server.ts注册的createClipExecutor(依赖本地 FFmpeg/ffprobe)
数字人口播📋文案 + 声音 + 数字人形象组合尚无对应 Executor

能力边界由三者共同决定:本地 Codex 环境(语言模型目录见apps/daemon/src/codex/model-catalog-2026-08-05.ts)、设置 → AI 服务中的服务配置(apps/daemon/src/creator-services/config-store.ts)、以及本机媒体组件(FFmpeg、yt-dlp、Whisper 后端按runtime/krillinai/pkg/下的 whisper、whisper.cpp、faster-whisper、WhisperKit 选择)。

文档没说的,代码说了

  • 文档说 yt-dlp"每 7 天检查更新、失败保留当前版本" →apps/daemon/src/creator/yt-dlp/update-manager.ts中CHECK_INTERVAL_MS = 7 * 24 * 60 * 60 * 1_000,即 604,800,000 ms;同文件还有TRUSTED_REDIRECT_HOSTS(仅允许 api.github.com 等主机)与 64 位SHA256校验正则 → 确认周期无误,且更新下载有主机白名单 + 哈希双校验,失败不切换版本。
  • 文档说数据目录默认.runtime→api/server.ts中dataDir ?? '.runtime'只是buildServer的兜底参数;生产路径实际走packages/config/src/index.ts的resolveOpenCreatorPaths,默认根目录为~/.opencreator(development channel 为~/.opencreator/development)→ 备份与迁移应以~/.opencreator为基准,而非仓库下的.runtime。
  • 文档表格标注火柴人动画"即将接入" →apps/daemon/src/api/server.ts生产模式默认注册整链执行器:createStickmanContentExecutor、createStickmanImageExecutor、createStickmanAudioExecutor、createStickmanTimelineExecutor、createStickmanRemotionExecutor、createStickmanDeliveryExecutor,packages/stickman-remotion渲染包也在 → 代码领先于文档,火柴人管线已具备完整执行链,文档状态滞后。
  • 文档未提托管项目根默认位置 →api/server.ts中join(input.defaultProjectRoot ?? join(homedir(), 'Documents'), 'OpenCreator')→ 未配置时托管工作区落在~/Documents/OpenCreator/,而不是仓库目录。
  • 文档未提 Codex 进程模型 →main.ts显示 app-server 常驻是默认值(OPENCREATOR_PERSISTENT_APP_SERVER !== '0')→ 长期会话复用同一 Codex 进程,thread 轮换阈值由apps/daemon/src/runs/manager.ts的DEFAULT_CODEX_THREAD_ROTATION_RUN_THRESHOLD = 50控制,可用OPENCREATOR_CODEX_THREAD_ROTATION_RUN_THRESHOLD覆盖,设0关闭主动轮换。

旋钮、边界与数据归属一览

环境变量(解析集中在apps/daemon/src/startup.ts的resolveProductionServerEnvironment):

变量默认值影响范围
OPENCREATOR_DATA_DIR~/.opencreator/data数据库、Run、附件、能力缓存根目录
OPENCREATOR_CODEX_BINcodexCodex CLI 可执行文件路径
CODEX_HOME~/.opencreator/runtime/codex(隔离 Home)Codex 会话、配置、Skills、MCP 真相源
OPENCREATOR_DEFAULT_CWD当前工作目录daemon 默认执行目录
OPENCREATOR_DEFAULT_PROJECT_ROOT~/Documents托管项目根目录,实际使用其下OpenCreator/子目录
OPENCREATOR_CODEX_THREAD_ROTATION_RUN_THRESHOLD50长期计划任务底层 Codex thread 的终态 Run 轮换阈值
OPENCREATOR_PERSISTENT_APP_SERVER启用(设0关闭)Codex app-server 是否常驻

数据落盘:

路径存了什么备份注意
~/.opencreator/config.toml、credentials.json、data/、runtime/、logs/产品数据根,可整体迁移
~/.opencreator/data/项目库、Run 数据、附件、codex-capabilities.json与 Codex 自身数据分开备份
~/.opencreator/runtime/codex隔离 Codex Home(会话/技能/MCP)即该实例的$CODEX_HOME
~/Documents/OpenCreator/托管项目工作区与Exports/独立于数据根,迁移需单独处理
用户已有$CODEX_HOME(如~/.codex)Codex 全局配置与历史共享实例,修改技能/MCP 前确认影响范围

安全边界:

  • daemon 只监听127.0.0.1,端口系统分配,局域网不可达。
  • 健康检查以外的 API 全部经apps/daemon/src/api/auth.ts的requireAuth校验Bearer <token>,token 每次启动随机生成。
  • Run 日志与诊断导出前脱敏(apps/daemon/src/diagnostics/redactor.ts、apps/daemon/src/security/redaction.ts)。
  • 托管父进程守护:main.ts的installManagedParentWatch监听OPENCREATOR_MANAGED_PARENT_PID,Electron 宿主退出时 daemon 自动关闭,不留孤儿进程。

想改它 / 想集成它

最短路径是 daemon + protocol:packages/protocol/是 Web、daemon、Desktop 三方共享的 Runtime 契约,apps/harness/提供 Runtime 命令行验证工具。

命令用途
pnpm web:dev启动 Web,按需拉起 daemon
pnpm daemon:dev只启动 daemon
pnpm desktop:devElectron 开发模式
pnpm test全工作区单元与集成测试
pnpm typecheck全仓 TypeScript 类型检查
pnpm build构建全部 workspace(prebuild先编译runtime/krillinaiGo 运行时)
pnpm e2eWeb Playwright E2E
pnpm smoke:cifake Codex Runtime smoke(apps/daemon/test/unit/codex-smoke.test.ts)
pnpm perf:check对照已记录的性能基线

提交前至少跑pnpm test、pnpm typecheck、pnpm build。涉及 Host Bridge、Runtime 代理或通用前端流程的改动,必须追加 Web/Desktop 一致性 E2E(apps/web/e2e/下的 parity 用例)与实际打包 App 验证——只通过 Web 单测不能证明 Desktop 可发布,Desktop 打包会重新构建 Web 并校验apps/web/dist与内嵌资源哈希,不一致直接失败。真实 Codex smoke 默认不运行,需显式开启(见apps/daemon/test/smoke/)。依赖安全方面,根package.json用 pnpmoverrides锁定了undici、tar、ws等一批存在已知漏洞区间的传递依赖。

Codex 是唯一执行内核这一点划定了项目边界:OpenCreator 不是第二个 Agent 框架,也不是云端 SaaS——它是 Codex 之上可持久化、可审批、可编排的本地创作层。技能、MCP 与会话的真相源仍在$CODEX_HOME,删掉 daemon 你丢的是编排与状态机;删掉 Codex,它什么都不是。这正是"不维护第二套执行引擎"这句架构承诺的全部含义。

【免费下载链接】OpenCreatorFormerly KrillinAI, VideoTranslation and Dubbing Tool for 120+ Languages. Open-source AI workspace for creators, powered by Codex. Video downloader, video translation, create videos, images, audios, and edits with Agents in one place. For your Social Media like YouTube, TikTok, Instagram, etc.项目地址: https://gitcode.com/GitHub_Trending/kr/OpenCreator

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考