内容
<p align="center">
<img src="assets/banner.jpg" width="80%" alt="Oh My Cassette banner" />
</p>
<h1 align="center">
我的 <a href="https://trycassette.online/">Cassette</a>: 袖珍AI视频编辑辅助工具
</h1>
<p align="center">
<a href="https://github.com/Cassette-Editor/oh-my-cassette/releases">
<img src="https://img.shields.io/github/v/release/Cassette-Editor/oh-my-cassette?style=flat-square&color=blue" alt="版本">
</a>
<a href="https://github.com/Cassette-Editor/oh-my-cassette/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/Cassette-Editor/oh-my-cassette?style=flat-square" alt="许可证">
</a>
<a href="https://github.com/Cassette-Editor/oh-my-cassette/stargazers">
<img src="https://img.shields.io/github/stars/Cassette-Editor/oh-my-cassette?style=flat-square&logo=github" alt="星标">
</a>
<a href="https://github.com/Cassette-Editor/oh-my-cassette/fork">
<img src="https://img.shields.io/github/forks/Cassette-Editor/oh-my-cassette?style=flat-square&logo=github" alt="复刻">
</a>
<img src="https://img.shields.io/badge/Python-3.11--3.13-purple.svg" alt="Python">
<a href="https://github.com/Cassette-Editor/oh-my-cassette/actions/workflows/ci.yml">
<img src="https://img.shields.io/github/actions/workflow/status/Cassette-Editor/oh-my-cassette/ci.yml?branch=main&style=flat-square&label=CI" alt="CI">
</a>
<a href="https://trycassette.online">
<img src="https://img.shields.io/badge/Cassette-Compatible-1f6feb?style=flat-square&logo=data%3Aimage%2Fwebp%3Bbase64%2CUklGRhgHAABXRUJQVlA4WAoAAAAQAAAANwAANwAAQUxQSMkCAAABkIVt29lI75hr27Yx9tq2bdu2bdu2bdt23e4kfQ86TZN%2FeRgRE4DfcIX9Oyr%2BCuE7ZFJeX0a0oK0SE7SsKyNSmTU2KjQvKypKsTVWumhcVkSEIsuNVNG4KJ9WOabqqPK3yVm1yDnjCzX8OCWLWhknfabG7yZkUiPz5HcU8HWvVK5kGPuegj4blEqJV%2B9XFPhpZ09nmU0UWi7gLKteLHtRBTqx5CIKvotl%2B%2F2tNfgd7%2FC6%2BHpgCwTv4r2YVQGJJhn2meRPo3PCoU5lhhE%2BT41F1wsssoswo%2FphaFiycVGrfQLC0Dl0ssNqugSMq0uAQ0LrbQlJLlkXVUSGgdttjnISr6T8TuCIGDQVom0FVa0PxSCRu2Ltwcp2pdOFLe2P1nKWX6LXnc7nRhR53mvuaezEpyU58d0AdwaRG1mX18oDOcQLH%2FqizEjUmpSZidHrXuarXmggmAOQ9IYb78HnK1BwVVm2%2BTUG%2BON31IryGgZCwBh8bzqBZ9EqhSNvkauB7Zwb2ko9Dh8PnFMfowmdVkDDjzq5eVS7lm25S1aSKuBHS%2Fdsk%2FP4QylDA%2BstxOfJO2xOWWZ892VpR3zlXvyIqO0Btj2bZnZmFMBYh9xS7YfJEcmM02rLVeFl7uTNPlXkFc8gBwOW8g1BaE4WViShiS5F4tf5ti%2FK%2/PpU9UdkvR4t7pZ45dn4GTV%2FvJwPebx7J3S67Sprjyr07oz7ewA78b3ebI8cO%2B8g7weSOUBNVO4YxS7HYq6%2BiBxNBvOMmYJ4svGALzvO%2BSUxkLDXN9HfRuX4vMMr9t7MusGhHFwxtLOAuL8tUDRwgPs01%2Fe8i6v31u%2FehTfG5c6XIKIAQvJo42XNbWuRhylDVkA7yfbhQBippUKY%2BVKrBbOCShbAx5VUgsCwHvvp1HSjDCumsnVEDvzKXJSOCmtyC4YfFpOyRhnnF8Mv2TaYviLBABWUDggKAQAAPAYAJ0BKjgAOAA%2TSCLRCKiIRgN%2FgAoBMS0htgATIB%2/Rvwg8Cf6r%2BM37Vdtj559kc4Z9Yvtn5Gfkzzg7Sf%2BC%2FKTgCePfx3%2/VfmBzAfTz%2B7epP%2BKf2X8wvYDuAPUA%2/Rv9E%2F2P3O%2FDz%2FeeSD8v%2/UHsB%2Fxz%2Bef6r%2B7fu%2Fxm36xJmyyFkngkpmRPYsV6xmH5QF4lb%2/Rl9hSgk5D3PqHNQLXrlv7NrItI%2FEHrxBF2jRuhKjEBVmBB10mJvHzkR2Q2arL3GqP10RyllNZGUghwhZxRilAA%2Fuw6mSpSUmz%2BC9%2BKh7D7qK39xAKDdKGxdWNME94DsfqLZMWOWeIeTypqgNWds0IPEbdim9%2FrYj%2BEd8AhWw%2F%2Bzi%2FwdIkNi7bJQyZ55GARC1%2FHJxJRDbUPxx7XEJNOqXwK2TTvcPfg%2FB1Sxtu3%2F%2BqXZV7Ea27hgAqAwjmpzYt%2FUnFY%2BC0oW45G3Loc8bVetEXzeXitUxCUpACSaawCSSfLqRe1eG3zUIXqEc82GnC78rFUxGMUSd%2FG9fuFsdPGi96Lm3KIZEKgeEYxznL%2BMFlhtO40ZN%2FW3ejoFZfedwy4KUpiGElmS9DdaNzh40f3qq2ox2aJonnJDtPET3GC8%2FxLitJKLpjNVH%2/s2f5UmAx%2B5LKDbHdllFCDWoI3Pp%2/VHmOId6JL4jNCWVVHcq5vtCed3YAxjpLyN7Mu2NYOtVFR9IFyf7Vd5AztRBIGFD79z80kLXz%2F%2F%2BfO3t2lkek5ydWcB0weeaYMf%2Fwaie0%2Bighho%2Bx1LSEM4hwlpukY3yztN8wyYCF8fSe9AWia9TSnFp57nMo5YifIm9RF6TM%2/vo6yBT0Pi%2FGt%2F%2F6mnejWgvH1%2F%2F%2BhS5iYOwLt%2BHG5ouw5J01Fd%2F1WfcWXdBL9MEwe3fGBYZUYUOiM3FvKWH0ikirZAvG0xfpgf%2/gnXTZaTTeyzpnuvF289BWGVcYoRTe2gBbGUT00tzQ4XuCIo9OV7ysRBBK4PTfYTi%2/ntO%2FGJkP7JHWEAf7RfyPpf2z%2F3gmxcwD3IXTbEB9aXF%2+VQYVzi8x%2/Wj1eluYh3G6xEWj5aKxK09fn3AaJy6LKTQjgk8209Tv7brUzGKt26W4a5uQVRnc6cAzlXdvZB3nrAUJ4SsTWRbCM9m6TDQ7A0dctlIEQzv%2/UTvpPTnyuaOqiVP5PsHXhi9x0791xIp4e1U8sUVgkxVIgE2QYZjQXnY9Kuv0ciSsqTTzWZ6it0Z1Y9qOMi%2/BDwjsHCI%2/TwjcrXfrv2jVjya%2/h3h%2/RzBb7Mszb6Pr54Dpg%2B6OQeVLDvWMOcd9P7x1uSSp%2/rzOS7zB9i5HJvNTeTjIi%2Be5Xf9eSzCoym6aKUC6i6Gkf7O96HwkdmR9TOx3ZuNOJY%2F%2BdF%2F%2F%2FnRxgu4Mj%2F29%2/T%2FJ34nP%2/6r9U3fQV%2+jAyqrfV23tQAAA&logoColor=white" alt="Cassette Compatible">
</a>
<a href="https://github.com/nousresearch/hermes-agent">
<img src="https://img.shields.io/badge/Hermes%20Agent-Compatible-7c3aed?style=flat-square&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI%2BPHBhdGggZD0iTTUgNGgzdjZoOFY0aDN2MTZoLTN2LTdIOHY3SDV6IiBmaWxsPSJ3aGl0ZSIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjIiIGZpbGw9IiMxMTEiLz48L3N2Zz4%3D&logoColor=white" alt="Hermes Agent Compatible">
</a>
<a href="https://github.com/openai/codex">
<img src="https://img.shields.io/badge/Codex-Compatible-000000?style=flat-square&logo=openai&logoColor=white" alt="Codex Compatible">
</a>
<a href="https://claude.com/claude-code">
<img src="https://img.shields.io/badge/Claude%20Code-Compatible-d97757?style=flat-square&logo=anthropic&logoColor=white" alt="Claude Code Compatible">
</a>
<a href="https://opencode.ai">
<img src="https://img.shields.io/badge/OpenCode-Compatible-0b0b0b?style=flat-square&logo=opencode&logoColor=white" alt="OpenCode Compatible">
</a>
</p>
<p align="center">
<a href="./README.zh-cn.md">简体中文</a> | <b>English</b>
</p>
<table align="center" width="82%">
<tr>
<td>
<video src="https://github.com/user-attachments/assets/efcfda75-f09b-4bde-8a69-e84410f28e10" controls width="100%"></video>
</td>
</tr>
</table>
<h3 align="center">
<em>
将Claude Code、Codex或<a href="https://github.com/nousresearch/hermes-agent">Hermes</a>与 <a href="https://trycassette.online">Cassette</a>的视频编辑能力结合。<br />
添加朋友,通过聊天将您的视频整理成形。
</em>
</h3>
# 🎥 概述
**Oh My Cassette**是一款开源的AI视频编辑插件和本地MCP服务器,用于 [Claude Code](https://claude.com/claude-code), [Codex](https://github.com/openai/codex), [Hermes Agent](https://github.com/nousresearch/hermes-agent), and [OpenCode](https://opencode.ai). 它将自然语言聊天转化为成品蒙太奇视频,在 [Cassette](https://trycassette.online)上 - 拍打同步剪辑,自动匹配音乐,字幕,过渡和画中画 - 最小化Token开销。
只需发送您的视频或音频文件并与您的代理从手机的视频聊天,您的代理将与Cassette合作,以理解您的意图,组织您的媒体,规划编辑,并将您的材料转化为可分享的视频,具有强大的蒙太奇功能。
我们相信每个人都有一部自己的电影。 **Oh My Cassette**帮助您捕捉灵感火花,将零散的时刻塑造成故事,并将原始片段变成蒙太奇视频,而无需纠结于时间线或编辑工具。
成为你自己故事的导演,轻松自如。
<table>
<tr>
<td align="center" width="33%">
<h3>📱 随时随地捕捉</h3>
<p>随时随地向您的AI编辑朋友发送片段,音频和想法。</p>
</td>
<td align="center" width="33%">
<h3>💬 聊天即编辑</h3>
<p>用自然语言描述您想要的视频,而不是纠结于时间线。</p>
</td>
<td align="center" width="33%">
<h3>🎵 智能音乐匹配</h3>
<p>自动将音乐与您的视频情绪,节奏和故事相匹配。</p>
</td>
</tr>
<tr>
<td align="center" width="33%">
<h3>🌌 蒙太奇叙事</h3>
<p>将零散的时刻组织成有节奏,情感丰富的视频故事。</p>
</td>
<td align="center" width="33%">
<h3>✨ 高级编辑能力</h3>
<p>支持标题字幕,画中画,拍打同步,硬切,转换,动态图形和样式化编辑。</p>
</td>
<td align="center" width="33%">
<h3>✅ 随时分享</h3>
<p>预览,完善和导出精致的视频,准备好发布到社交平台。</p>
</td>
</tr>
</table>
## 🎬 案例视频
以下每个案例都是由Oh My Cassette通过端到端编辑完成的 - 从显示的精确提示,实际处理时间和输出是代理交付的内容。
<table width="100%">
<tr>
<td width="33%" valign="top">
<video src="https://github.com/user-attachments/assets/ff19c37d-1eb4-4702-a2e1-eac704bdbae8" controls width="100%"></video>
<h3>日常时刻Vlog</h3>
<p>
<sub>🎞️ 输入:15个视频片段 · 1个音频文件</sub><br />
<sub>⏱️ 处理时间:10分钟</sub>
</p>
<p><b>提示</b><br />
编辑成提供的音频,带有拍打同步的剪辑。选择最好的镜头从所有视频材料,并将它们与歌词和节奏相匹配。改变镜头时歌词发生变化,保持旅行风格和日常情感进展,添加居中歌词字幕到每个匹配的镜头,使整个编辑节奏同步。</p>
<p><code>治愈</code> <code>日常</code> <code>感觉良好</code> <code>生活方式</code></p>
</td>
<td width="33%" valign="top">
<video src="https://github.com/user-attachments/assets/b85285a9-30ed-4f9b-b314-538bfd9dbdd6" controls width="100%"></video>
<h3>旅行Vlog</h3>
<p>
<sub>🎞️ 输入:13个视频片段 · 1个音频文件</sub><br />
<sub>⏱️ 处理时间:15分钟</sub>
</p>
<p><b>提示</b><br />
使用所有素材编辑一个30秒的旅行Vlog,具有清晰的观看流程。在开头和结尾添加标题字幕“KOTA KINABALU”。将角色视频叠加到类似风景的画面中作为画中画效果,保持轻快和难忘的节奏,使用硬切和音乐拍打同步,呈现清新度假的感觉。</p>
<p><code>旅行</code> <code>Vlog</code> <code>拍打同步</code> <code>画中画</code></p>
</td>
<td width="33%" valign="top">
<video src="https://github.com/user-attachments/assets/73059786-246e-4808-b7cf-4deb35994ebc" controls width="100%"></video>
<h3>电影氛围短片</h3>
<p>
<sub>🎞️ 输入:15个视频片段 · 1个音频文件</sub><br />
<sub>⏱️ 处理时间:17分钟</sub>
</p>
<p><b>提示</b><br />
使用我的素材编辑一个基于歌词的情感短片,大约40秒。开始时使用空旷的风景镜头来营造氛围,然后穿插孤独的角色时刻,记忆和情感的特写。交替使用角色镜头和大气镜头,在节拍上添加歌词字幕,排列字幕文字为不同的大小,最后以安静的暂停镜头结束。</p>
<p><code>音乐</code> <code>MV</code> <code>电影</code></p>
</td>
</tr>
<tr>
<td width="33%" valign="top">
<video src="https://github.com/user-attachments/assets/97fdfe3a-f420-4135-8c62-494bbb7ea436" controls width="100%"></video>
<h3>烹饪教程</h3>
<p>
<sub>🎞️ 输入:12个视频片段 · 1个音频文件</sub><br />
<sub>⏱️ 处理时间:8分钟</sub>
</p>
<p><b>提示</b><br />
使用这些素材编辑一份烹饪视频,讲解绿椒炒肉。保持步骤流畅,保留烹饪声音,并添加简单的字幕。字幕可以根据视觉效果自动生成,帮助观众理解每个步骤。保持风格干净自然,不要遮挡食材。</p>
<p><code>食物</code> <code>教程</code> <code>解说</code></p>
</td>
<td width="33%" valign="top">
<video src="https://github.com/user-attachments/assets/8da38e40-7876-4743-a32d-5fd95265f37e" controls width="100%"></video>
<h3>商业广告</h3>
<p>
<sub>🎞️ 输入:15个视频片段 · 15个音效 · 1个音频文件</sub><br />
<sub>⏱️ 处理时间:13分钟</sub>
</p>
<p><b>提示</b><br />
使用这些素材编辑一个15秒的产品广告。开始时打开瓶盖,添加气泡,水花,冰块和产品细节,最后以完整的产品和品牌结束。保持清爽,解渴和类似广告的感觉。</p>
<p><code>产品</code> <code>短片</code> <code>广告</code></p>
</td>
<td width="33%" valign="top">
<video src="https://github.com/user-attachments/assets/9374de93-c0ff-4bf2-b1ed-fe393579f0c2" controls width="100%"></video>
<h3>游戏精彩集锦</h3>
<p>
<sub>🎞️ 输入:5个视频片段 · 1个音频文件</sub><br />
<sub>⏱️ 处理时间:5分钟</sub>
</p>
<p><b>提示</b><br />
使用我的游戏画面编辑一个20-30秒的武术战斗短片。赋予它一种水墨画的视觉风格和紧张,严肃的气氛。创造进入战场的电影感觉,并通过包围圈战斗。</p>
<p><code>游戏</code> <code>精彩集锦</code> <code>拍打同步</code></p>
</td>
</tr>
</table>
<p align="center">
<strong>★ 更多案例正在陆续推出。敬请关注项目,以便持续跟进。</strong>
</p>
# 🏄 无需安装即可试用
我们提供了一个公开的网络演示,您可以在桌面或移动浏览器上试用 Oh My Cassette 工作流,无需在本地安装 Codex、Claude 或 Hermes:
<a href="http://43.134.224.156:8080/">立即试用!</a>
> [!WARNING]
> 公共演示仅用于演示和评估。它故意未进行身份验证,因此请勿上传敏感、私人、机密、非法、受版权保护、受监管或以其他方式受限制的内容。
>
> 上传的文件、提示、生成的输出、作业状态和故障排除元数据可能会被此演示服务器、Cassette、DeepSeek 和 BGM 流使用的第三方音乐/搜索提供商处理。请将您上传的任何内容视为对演示操作员和涉及的工作流的外部服务可见。
>
> 演示可能会被重置、限制速率、不可用或随时更改。我们不保证数据保留、删除时间、机密性、生产可用性、输出质量、生成/编辑结果的版权合规性或不中断的服务。您负责上传的内容和查看任何生成的输出后在共享之前。
>
> 浏览器刷新、标签关闭或从网络演示导航离开会启动新的网络会话,并尽力清理上一个网络会话的临时上传、聊天历史和已完成作业文件。
>
> 默认情况下,演示在可用时使用服务器端 DeepSeek 配置。您可以在网络 UI 中打开 **设置**并提供您自己的 DeepSeek API 密钥进行测试。您的密钥仅在与此演示服务器的请求中发送,不会通过网络应用程序写入此存储库或服务器端磁盘,但它仍然会经过公共演示服务器;请使用您可以轮换和监视的密钥。
<details>
<summary>在本地部署 Web 演示</summary>
Web 演示是一个单一的 FastAPI 服务,它保留现有的 Cassette 网关流,但用浏览器 UI 替换聊天界面。它在 `CASSETTE_ASSET_ROOT` 下存储运行时上传、作业、导出、截图和外箱数据,而不是存储库。
1. 克隆存储库并创建专用的 Web 环境:
```bash
git clone https://github.com/Cassette-Editor/oh-my-cassette.git
cd oh-my-cassette
python3 -m venv .venv-web
. .venv-web/bin/activate
pip install -U pip
pip install -r requirements-web.txt
python -m playwright install chromium
```
2. 配置 Cassette 和 DeepSeek 运行时设置作为进程环境变量。Web 演示不需要 Hermes 代理或 `~/.hermes/.env`。
```bash
cp deploy/oh-my-cassette-web.env.example ./oh-my-cassette-web.env
$EDITOR ./oh-my-cassette-web.env
```
至少设置:
```dotenv
CASSETTE_URL=https://sg.trycassette.online/agent
CASSETTE_AUTH_EMAIL=you@example.com
CASSETTE_AUTH_PASSWORD='your-cassette-password'
CASSETTE_ASSET_ROOT=$HOME/.oh-my-cassette/cassette
CASSETTE_BROWSER_TIMEOUT_SEC=1800
DEEPSEEK_API_KEY='your_deepseek_api_key'
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-v4-flash
OMC_WEB_HOST=0.0.0.0
OMC_WEB_PORT=8080
OMC_WEB_LOG_DIR=./web_demo/logs
```
如果您加载具有 `. ./oh-my-cassette-web.env` 的文件,请引用包含 shell 特殊字符、空格或 `#` 的任何值。systemd `EnvironmentFile` 格式也接受引用的值。
Cassette 上传/分析等待默认继承 `CASSETTE_BROWSER_TIMEOUT_SEC`。仅当您需要不同的上传超时时设置 `CASSETTE_UPLOAD_TIMEOUT_SEC`;`0` 表示永远等待。
在启动服务之前加载变量:
```bash
set -a
. ./oh-my-cassette-web.env
set +a
```
如果您不想在服务器上放置 DeepSeek 密钥,请将 `DEEPSEEK_API_KEY` 留空,并在 Web UI 的 **设置**面板中输入临时密钥。该浏览器提供的密钥附加到该会话的 API 请求中,不会被 Web 应用程序持久化。
Web 演示服务日志与 Hermes 代理 / OhMyCassette 插件日志分开。默认情况下,它们写入服务工作目录下的 `./web_demo/logs/web_demo.log`,或当设置 `OMC_WEB_LOG_DIR` 时写入 `$OMC_WEB_LOG_DIR/web_demo.log`。
Web 演示的 Cassette 作业记录也是分开的,当设置 `CASSETTE_ASSET_ROOT` 时:原始作业 JSON 位于 `$CASSETTE_ASSET_ROOT/jobs/cassette_*.json`,Web UI 为当前浏览器会话拥有的作业公开一个作业日志链接。
3. 构建浏览器 UI(Vite + React → `web_demo/frontend/dist`)。仅在构建时需要 Node.js + npm:
```bash
./web_demo/build_frontend.sh
```
4. 启动 Web 演示:
```bash
. .venv-web/bin/activate
python -m web_demo.server
```
> 服务器提供已构建的 `web_demo/frontend/dist`。如果它尚未构建, `/` 将返回一个明确的 503 错误,提示您运行构建。在 `web_demo/frontend` 下拉取更改后,请重新运行 `web_demo/build_frontend.sh`。
在本地测试时打开 `http://127.0.0.1:8080/`,或从另一台设备打开 `http://<server-ip>:8080/`,前提是主机防火墙/安全组允许传入 TCP `8080`。
4. 可选的 systemd 部署:
```bash
sudo cp deploy/oh-my-cassette-web.service.example /etc/systemd/system/oh-my-cassette-web.service
sudo cp deploy/oh-my-cassette-web.env.example /etc/oh-my-cassette-web.env
sudo $EDITOR /etc/oh-my-cassette-web.env
sudo systemctl daemon-reload
sudo systemctl enable --now oh-my-cassette-web
sudo systemctl status oh-my-cassette-web
journalctl -u oh-my-cassette-web -f
```
在启用服务之前,请编辑 `/etc/systemd/system/oh-my-cassette-web.service`,如果您的存储库或虚拟环境路径与示例不同。
`journalctl` 显示 uvicorn 标准输出/访问日志;Web 演示业务日志仍会记录到 `$OMC_WEB_LOG_DIR/web_demo.log`。
5. 烟雾测试:
```bash
curl -fsS http://127.0.0.1:8080/ -o /dev/null
python3 -m compileall -q web_demo tools.py notifier.py browser.py
tail -f ./web_demo/logs/web_demo.log
```
然后打开浏览器 UI,上传一个小视频,发送编辑请求,并观察作业卡/事件,直到导出下载出现。
</details>
# 🚀 快速开始
## 开始前 🎬
Oh My Cassette 将 Codex、Claude 或 Hermes 连接到 <a href="https://trycassette.online/agent">Cassette 代理</a>。您需要:
* Codex、Claude Code 或一个可用的 Hermes 代理安装。
* 一个 Cassette 帐户。
* 仅对于 Hermes,需要配置的网关,例如 QQ 或 Telegram。
> [!TIP]
> **在此处申请 Cassette 帐户:** [**Cassette 注册**](https://trycassette.online/signup/)
如果您计划使用 Hermes 并且尚未安装:
```bash
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
```
如果 Hermes 代理网关尚未配置:
```bash
hermes gateway setup
```
Oh My Cassette 目前支持 QQ 和 Telegram 网关。
## 要求
- 用于本地 MCP 插件(Codex、Claude Code 或 OpenCode)的 macOS、Linux 或 Windows。Hermes 代理网关路径仅适用于 macOS/Linux。
- 用于本地 MCP 插件的 Codex、Claude Code 或 OpenCode,或配置了 Hermes 代理及其网关。
- Python 3.11–3.13。
- `ffmpeg`,用于 Hermes 网关规范化和可选的 API 导出缩略图。
安装系统工具:
```bash
# macOS
brew install uv ffmpeg
```
```bash
# Debian/Ubuntu Linux
sudo apt-get update
sudo apt-get install -y ffmpeg
curl -LsSf https://astral.sh/uv/install.sh | sh
```
```powershell
# Windows (PowerShell)
winget install Python.Python.3.13
winget install Gyan.FFmpeg
```
## 安装
### Codex
```bash
codex plugin marketplace add https://github.com/Cassette-Editor/oh-my-cassette.git
codex plugin add oh-my-cassette@cassette-editor
```
安装后启动新的 Codex 任务,以便插件发现再次运行。插件贡献了主机中立的 `cassette-video-edit` 技能和一个名为 `cassette` 的本地 MCP 进程。
### Claude Code
```bash
claude plugin marketplace add Cassette-Editor/oh-my-cassette
claude plugin install oh-my-cassette@cassette-editor
```
安装后重启 Claude Code。您可以通过以下命令验证安装:
```bash
claude plugin details oh-my-cassette@cassette-editor
```
### OpenCode
OpenCode 没有用于 MCP 服务器的插件市场,因此请从检出中添加服务器和技能。克隆存储库,然后在项目的 `opencode.json` 中指向启动器(存储库根目录中提交了一个副本):
```jsonc
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cassette": {
"type": "local",
"command": ["python3", "/absolute/path/to/oh-my-cassette/scripts/run_local_mcp.py"],
"enabled": true,
"environment": { "CASSETTE_MCP_HOST": "opencode" }
}
}
}
```
OpenCode 从存储库的 `.agents/skills/` 目录中发现主机中立的 `cassette-video-edit` 技能,或者复制到 `~/.config/opencode/skills/cassette-video-edit/` 以全局使用。在 Windows 上,在 `command` 中使用 `"python"` 而不是 `"python3"`。
### 任意其他 MCP 主机
运行时是主机中立的,因此任何启动本地 stdio MCP 服务器的客户端都可以使用它。请客户端指向 `scripts/run_local_mcp.py`(使用 `python3` 或 Windows 上的 `python`),并设置 `CASSETTE_RUNTIME_ADAPTER=mcp`。服务器在 MCP `instructions` 中提供完整的 workflow 指导,并且每个工具都返回一个键入的 `phase`/`next_action`,因此没有打包技能的主机仍然可以驱动流程。为了获得最佳体验,还请安装 `cassette-video-edit` 技能(或等效系统),以便遵循引导选择和审查步骤。
### Hermes
通过 Hermes 插件管理器安装(推荐):
```bash
hermes plugins install Cassette-Editor/oh-my-cassette
```
Hermes 安装程序提示输入您的 Cassette 帐户电子邮件和密码,并将它们保存到 `~/.hermes/.env`。然后运行设置完成器 - 它安装 Playwright Chromium 到 Hermes Python 环境中,检测 `ffmpeg`/`ffprobe`,并让您选择 Cassette 区域 - 并启用插件:
```bash
python3 ~/.hermes/plugins/cassette/scripts/install_plugin.py --setup-only
hermes plugins enable cassette
hermes gateway restart
```
您可以随时从诊断部分检查安装状态。
<details>
<summary>替代:git 检出中的引导安装程序(用于开发)</summary>
```bash
git clone https://github.com/Cassette-Editor/oh-my-cassette.git
cd oh-my-cassette
python3 scripts/install_plugin.py
```
运行安装程序并按照提示使用您的 Cassette 帐户设置 Oh My Cassette。
安装程序:
- 默认情况下将插件安装到 `~/.hermes/plugins/cassette` 作为符号链接。
- 询问是否使用 `hermes plugins enable cassette` 启用插件。
- 询问要使用的 Cassette URL:
- `https://sg.trycassette.online/agent`(亚洲,默认)
- `https://trycassette.online/agent`(美国)
- 可选地将 Cassette 登录和 Jamendo 凭证保存到 `~/.hermes/.env`。
- 检测 `ffmpeg` 和 `ffprobe` 路径的服务环境。
- 在 Hermes Python 环境中安装 Python Playwright 和 Chromium。
- 重启 Hermes 网关服务。
要复制文件而不是创建符号链接:
```bash
python3 scripts/install_plugin.py --copy --force
```
对于非交互式安装:
```bash
python3 scripts/install_plugin.py \
--skip-plugin-enable \
--skip-cassette-url \
--skip-cassette-auth \
--skip-jamendo-auth
```
</details>
## 与 Codex 或 Claude 在本地 MCP 上使用
Codex 和 Claude 使用相同的独立运行时。在本 README 中,**MCP 服务器** 指的是通过 stdin/stdout 连接的本地子进程:它不打开端口,不依赖于 FastAPI web-demo 服务。单独的 Cassette 后端仍然是编辑引擎,并继续处理身份验证、媒体处理、代理运行、项目状态和渲染。
Web 演示故意不同。浏览器仍然需要保留的 FastAPI 服务器用于上传、聊天会话和前端端点;该行为不会被本地 MCP 插件删除。
### 首次运行身份验证
缺少凭证不会阻止 MCP 进程启动。需要 Cassette 的第一个工具返回 `auth_required` 和确切的私有终端设置命令。在代理对话之外运行该命令;它提示输入密码,使用 `getpass` 验证帐户,然后在写入任何内容之前存储凭证。
从 git 检出,相当于:
```bash
python3 scripts/setup_local_mcp.py --email you@example.com
```
凭证也可以来自进程环境变量。环境值优先于受保护的本地配置。导入现有的 Hermes `.env` 是显式且可选的:
```bash
python3 scripts/setup_local_mcp.py --import-hermes
```
设置命令创建具有模式 `0700` 的配置目录和具有模式 `0600` 的凭证文件,拒绝符号链接和允许的文件,并永远不会持久化访问或刷新令牌。如果帐户没有完全的 API 访问权限,设置报告可选的浏览器路径而不是静默更改传输。
### 引导编辑流程
1. 要求 Codex 或 Claude 编辑当前项目中的一个或多个媒体文件。
2. 插件仅限于摄取活动项目内的媒体。规范化路径并拒绝遍历和符号链接逃逸。
3. 描述编辑,回答任何引导选择,然后启动作业。默认情况下,MCP 作业在后台运行。
4. 主机使用有界 30 秒长的轮询检查状态。在长轮询期间,运行时发出 MCP 进度通知(可见于请求它们的宿主),因此等待显示实时阶段更新而不是空块。技能监视最多 25 分钟,然后返回仍运行的作业 ID,以便您可以继续而无需紧密轮询。
5. 如果 Cassette 需要真正的用户决策,请使用返回的作业 ID 回答它。在支持 MCP 引发的宿主上,`cassette_job_status` 在线收集答案并返回已经恢复的状态;其他宿主使用 `cassette_answer_question` 往返。API 作业在其私有继续元数据跨主机重启后保持不变。
6. 编辑完成后,请查看结果。渲染仅在明确的 `export` 决策后开始。
7. 结果包含验证的绝对路径、文件 URI、MIME 类型、大小和每个导出工件的 MCP 资源链接。对于大型媒体字节,从不将它们嵌入工具响应中。
当后台作业达到终端状态(完成、需要输入、失败或取消)时,MCP 运行时会发布尽力而为的本地桌面通知 - macOS 上的 `osascript`,Linux 上的 `notify-send` - 以便您知道长渲染完成,即使监视预算将作业交回。设置 `CASSETTE_MCP_NOTIFY=0` 以禁用它。
会话由加密随机会话 ID 隔离。Codex 和 Claude 共享主机中立存储,因此您可以故意将会话或作业 ID 从一个主机传递给另一个;没有任何内容被隐式共享。
可以使用以下命令注册其他受信任的媒体目录:
```bash
python3 scripts/setup_local_mcp.py --allowed-root /absolute/path/to/media
```
导出保留在共享的 Oh My Cassette 数据目录的 `cassette/exports/<job_id>/` 下。只有该作业特定目录中的文件可以被返回。
### API 和可选的浏览器传输
API 传输是默认的。它直接连接到单独的 Cassette 后端,一次重试身份验证后重试,并仅在内存中保留访问令牌。因为 API 继续元数据是持久的,因此暂停的 API 作业可以在 Codex 或 Claude 重启后继续。
浏览器传输是明确的浏览器访问权限不足和对等方诊断的备用安装程序。仅当需要时安装固定的 Playwright 和 Chromium:
```bash
python3 scripts/setup_local_mcp.py --with-browser```
浏览器作业可以在相同的 MCP 进程保持活动时继续运行。主机重启后,它们返回 `browser_session_lost`,因为无法保留实时浏览器对象。
### MCP 工具
本地 MCP 运行时公开与 Hermes 相同的 14 个工具名称:
| 工具 | 目的 |
|---|---|
| `cassette_ingest_media` | 安全地将受信任的项目媒体摄入隔离会话 |
| `cassette_list_assets` | 读取会话的媒体清单 |
| `cassette_make_prompt` | (旧版,浏览器传输)构建完整的编辑简报 |
| `cassette_match_bgm` | 匹配免费使用背景音乐 |
| `cassette_match_exact_bgm` | 匹配特定的标题和艺术家 |
| `jamendo_music_matcher` | 匹配结构化的 Jamendo 首选项 |
| `cassette_answer_question` | 回答引导问题或恢复暂停的作业 |
| `cassette_run_job` | 运行一个对话回合(`message` = 用户的逐字单词);`export=true` 渲染 |
| `cassette_job_status` | 读取状态或等待更改 |
| `cassette_review_completion` | 审查完成并明确批准导出 |
| `cassette_cancel_job` | 请求合作取消 |
| `cassette_timeline` | 读取实时项目时间线为有界文本摘要(+可选的联系表) |
| `cassette_edit` | 外科手术无LLM编辑/撤销通过手动命令通道(`CASSETTE_DIRECT_EDIT=1`) |
| `cassette_config` | 获取/设置会话的模型+思考级别(静态产品列表,适用于下一次回合) |
每个工具都返回一个结构化的信封,包含 `ok`,类型化的 `data` 或 `error`,`session_id`,`job_id`,当前的阶段和运行时导出的 `next_action`。
### 直播编辑器深度链接和计划审查
每次API传输会话都携带一个稳定的`editor_url`——一个`…/try?projectSessionId=<id>&chatSessionId=<uuid>`链接,打开会话实时对话中的真正的Cassette编辑器:时间线在编辑生效时重新绘制,预览在无需服务器渲染的情况下播放,计划审查卡是交互式的。该链接在会话的每次转换中保持不变(作业是单个持久代理线程上的对话转换,具有内存)。任何拥有该链接的人都可以查看和编辑该项目(与Cassette公共试用页面的功能权限URL相同),因此请像共享链接一样对待它。
两个值得了解的并发语义:插件转换永远不会取消从打开的编辑器标签启动的运行(它失败并被标记为`thread_busy` - 等待并重试),而在标签中输入新消息确实会取消正在进行的插件转换(标签接管;现有的产品行为)。
**行为变更(0.4.1):** 代理现在接收用户的`message`原样(无简短包装),会话是单个线程上的多轮对话,一个轮次在编辑提交但**无渲染**时结束 - 信封携带`timeline_delta`、`quality.timeline_ctl`和联系表预览;传递`export=true`在用户要求完成时(浏览器传输保持其每作业渲染行为)。模型/思考是会话首选项通过`cassette_config` - 永远不会主动询问,默认值与网络编辑器匹配。
**行为变更(0.4.0):** 在MCP主机上,`edit_plan_review`现在默认显示为一个真正的问题(`CASSETTE_PLAN_REVIEW=user`)而不是被静默自动批准 - 用`approve`、`revise <feedback>`或`reject`回答,在聊天或打开的编辑器标签中(第一个答案赢)。设置`CASSETTE_UNATTENDED=1`以恢复以前的完全无头行为。状态信封还携带`timeline_delta`(更改了什么)和`plan_progress`,由运行的SSE事件流(`CASSETTE_API_STREAM=0`禁用)提供。
## 准备与赫尔墨斯一起使用
**现在你可以拿起手机给代理发消息!别忘了保持代理活跃和网络连接。**
在QQ或Telegram中:
1. 发送一个或多个视频、图像或音频文件。
2. 等待保存材料确认。
3. 在同一对话中发送编辑指令,或以`/edit`前缀。您的文字直接传递给Cassette代理 - 无需模型/优化/BGM问卷。使用`/refine`、`/music`或`/cassette_model`时需要这些。
4. 每个轮次以编辑保存(时间线增量 + 联系表预览 + 直播链接,无渲染)结束。在同一对话中继续编辑 - 代理记住。说“export”时您想要视频,插件在支持时通过网关渲染并交付。
| 命令 | 说明 |
|---|---|
| `/new` 或 `/reset` | 清除您的资产并开始与赫尔墨斯的新对话。 |
| `/edit <instruction>` | 根据您的指令编辑当前视频。 |
| `/refine <instruction>` | 完善您的编辑指令并开始编辑。 |
| `/music <BGM request>` | 根据您的请求匹配并添加BGM到您的资产中。 |
| `/cut` | 停止当前的Cassette编辑。 |
| `/check_assets` | 检查上传的资产及其状态。 |
| `/cassette_model` | 选择当前的Cassette模型和思考级别。 |
| `/cassette language zh` | 将Cassette的响应语言设置为中文。 |
| `/cassette language en` | 将Cassette的响应语言设置为英文。 |
| `/cassette status <job_id>` | 检查特定作业的状态。 |
| `/cassette cancel <job_id>` | 取消特定作业。 |
* 资产和视频状态在同一对话会话中保留。您可以在同一会话中发送额外消息以进一步修改编辑后的视频结果。
* 使用`/new`或`/reset`开始新的赫尔墨斯会话并清除实时Cassette浏览器会话和该对话的资产。
* QQ默认为中文,Telegram默认为英文,您可以通过`/cassette language zh/en`命令手动设置语言。
## 更新
对于Codex:
```bash
codex plugin marketplace upgrade cassette-editor
codex plugin add oh-my-cassette@cassette-editor
```
对于Claude Code:
```bash
claude plugin marketplace update cassette-editor
claude plugin update oh-my-cassette@cassette-editor
```
本地启动器在其下一次启动时会自动更新其锁定的、由插件管理的虚拟环境。浏览器二进制文件仅在请求时安装。
如果通过赫尔墨斯插件管理器安装:
```bash
hermes plugins update cassette
hermes gateway restart
```
如果从git检出(符号链接安装)安装,请更新检出:
```bash
git pull --ff-only
hermes gateway restart
```
如果插件使用--copy安装,请在拉取后重新安装复制的插件:
```bash
git pull --ff-only
python3 scripts/install_plugin.py --copy --force
hermes gateway restart
```
参见[CHANGELOG.md](./CHANGELOG.md)了解每个版本中更改的内容。
<details>
<summary>从符号链接安装迁移到赫尔墨斯插件管理器(可选)</summary>
现有的符号链接安装继续有效 - 迁移是可选的。要切换:
```bash
rm ~/.hermes/plugins/cassette # 仅删除符号链接,而不是您的检出
hermes plugins install Cassette-Editor/oh-my-cassette
hermes gateway restart
```
您的`~/.hermes/.env`中的凭证和插件的启用状态会转移;
已经设置的数值不会再次提示。不要在符号链接上运行
`hermes plugins install --force`,它会失败并显示一个令人困惑的错误,而不是替换它。
</details>
# ❓ 常见问题
### Oh My Cassette支持哪些AI代理?
Claude Code、Codex、OpenCode和赫尔墨斯代理均开箱即用,任何其他MCP主机都可以连接到本地`cassette` MCP服务器。会话存在于主机无关的数据目录中,因此您可以在一个主机上开始编辑,在另一个主机上继续。
### 它是本地编辑视频还是在云中编辑?
插件在您的代理旁边运行,并处理媒体摄入、编辑计划和作业监督。实际的编辑和渲染发生在[Cassette](https://trycassette.online)上,因此您不需要安装GPU或任何编辑软件。
### 我需要一个Cassette账户吗?
是的。安装程序在运行时会询问您的Cassette账户电子邮件和密码,并将其存储在本地;插件代表您向Cassette进行身份验证。
### 它可以制作哪些视频?
蒙太奇和故事编辑 - 视频博客、旅行视频、音乐驱动的短片、烹饪教程、产品商业广告和游戏亮点 - 带有节拍同步剪辑、字幕、画中画、过渡和自动匹配的背景音乐。有关带有提示和处理时间的真实示例,请参见[案例视频](#-案例视频)。
### 我可以在编辑过程中看到代理正在执行什么操作吗?
是的。在每次编辑轮次后,您都会获得一个时间线联系表、每个轮次的预览和一个指向Cassette时间线的实时编辑器深层链接; 在编辑运行之前,代理会将计划显示为一个故事板表格(每个计划节拍一个源帧)供您审查。
### 我可以在不安装任何东西的情况下试用它吗?
是的 - [公共网络演示](http://43.134.224.156:8080/)在您的浏览器中运行完整的工作流程。它是未经身份验证的,仅用于评估,因此请不要上传敏感内容。
### Oh My Cassette是否免费和开源?
该插件在MIT许可证下开源。Cassette本身是一个单独的托管服务,具有自己的账户和条款。
# 🔨 开发与故障排除
> [!TIP]
> 加入我们的Discord社区,与贡献者和`oh-my-cassette`用户建立联系。
>
> [](https://discord.gg/qd9NY4k8d7)
## 常见问答
### 1. 为什么我的赫尔墨斯代理在QQ或Telegram上无法响应?
请检查您的赫尔墨斯代理模型设置、网络连接性和API连接性。您还可以重启网关:
```bash
hermes gateway stop
hermes gateway restart
```
### 2. 连接到Cassette时为什么会出现网络问题?
请检查您是否可以访问https://sg.trycassette.online/agent或https://trycassette.online/agent。如果不能,请检查您的网络设置以打开Cassette。
### 3. 为什么运行时速度慢?
编辑过程取决于赫尔墨斯代理API延迟和Cassette服务负载。编辑任务可能需要大约5-20分钟,具体取决于任务的复杂性、选择的模型和思考级别。
如果赫尔墨斯或Cassette卡住,首先发送`/cut`停止当前的Cassette编辑,然后发送`/stop`停止赫尔墨斯。之后,请在同一会话中重试。
## 诊断
对于Codex和Claude本地MCP插件,运行:
```bash
python3 scripts/diagnose_local_mcp.py
```
它报告运行时引导、受保护的配置、传输、项目/媒体根目录和主机中立的数据路径,而不打印凭证。常见的MCP错误是可行的:`auth_required`包括私有设置命令,`source_path_not_allowed`标识受信任的根目录问题,`browser_session_lost`解释了当浏览器作业无法在重启中生存时。
对于赫尔墨斯,运行:
```bash
python3 scripts/diagnose_install.py
```
诊断检查:
- 插件安装路径(符号链接安装和`hermes plugins install`git克隆均被识别);
- 插件是否在赫尔墨斯中启用;
- `~/.hermes/.env`值,机密被删除;
- `ffmpeg`和`ffprobe`;
- 赫尔墨斯Python环境中的Playwright;
- Cassette URL可达性;
- 通过在Chromium中打开代理页面验证Cassette登录凭证;
- 赫尔墨斯网关状态。
如果传入媒体失败并出现`transcoder_missing`,请再次运行安装程序,以便它记录明确的`CASSETTE_FFMPEG_BIN`和`CASSETTE_FFPROBE_BIN`路径:
```bash
python3 scripts/install_plugin.py \
--skip-plugin-enable \
--skip-cassette-url \
--skip-cassette-auth \
--skip-jamendo-auth \
--skip-playwright-install
```
## 配置
Codex和Claude共享平台标准的Oh My Cassette配置和数据目录。它们的凭证和作业状态与赫尔墨斯分开。活动主机项目被自动信任;使用`setup_local_mcp.py --allowed-root`显式添加其他媒体目录。网络演示仅读取其进程环境,不使用任一插件存储的凭证。
安装程序将正常运行时设置写入`~/.hermes/.env`。您也可以手动编辑该文件。
<details>
<summary>点击此处展开配置详细信息</summary>
最小有用值:
```bash
CASSETTE_URL=https://sg.trycassette.online/agent
CASSETTE_AUTH_EMAIL=you@example.com
CASSETTE_AUTH_PASSWORD=your-generated-cassette-password
CASSETTE_ASSET_ROOT=$HOME/.hermes/cassette
CASSETTE_HEADLESS=true
CASSETTE_FORCE_H264=true
```
默认媒体源根目录:
```text
~/.hermes/qqbot
~/.hermes/telegram
~/.hermes/weixin
~/.hermes/cache
~/.hermes/tmp
```
如果您的网关将媒体存储在其他位置:
```bash
CASSETTE_ALLOWED_SOURCE_ROOTS="$HOME/.hermes/qqbot:$HOME/.hermes/telegram:$HOME/.hermes/cache:$HOME/.hermes/tmp:/path/to/media"
```
可选的Jamendo智能BGM配置:
```bash
JAMENDO_CLIENT_ID=your_client_id
JAMENDO_CLIENT_SECRET=your_client_secret
```
`JAMENDO_CLIENT_SECRET`保留用于未来使用。它不会发送到Jamendo,也不会写入作业元数据。
透明度和直接编辑标志(API传输):
| 标志 | 默认值 | 效果 |
|---|---|---|
| `CASSETTE_API_STREAM` | 开启 | SSE运行事件监听器馈送`timeline_delta`/`plan_progress`; `0` = 纯粹的轮询 |
| `CASSETTE_PLAN_REVIEW` | `user`在MCP上,`auto`在网关上 | 显示`edit_plan_review`作为问题与自动批准 |
| `CASSETTE_UNATTENDED` | 关闭 | `1`恢复完全无头自动批准语义 |
| `CASSETTE_DIRECT_EDIT` | 关闭 | 启用`cassette_edit`外科手术无LLM通道 |
| `CASSETTE_AUTH_TOKEN` | 未设置 | 预先发布的承载者,跳过`/api/agent-auth/verify`(本地开发/CI) |
| `CASSETTE_WEB_URL` | `CASSETTE_URL`的来源 | 用于`editor_url`深层链接的Web来源 |
</details>
## 开发
<details>
<summary>点击此处展开开发详情</summary>
创建本地测试环境:
```bash
uv venv .venv
uv pip install --python .venv/bin/python pytest playwright
.venv/bin/python -m playwright install chromium
```
运行检查:
```bash
python3 -m compileall -q .
.venv/bin/python -m pytest -q
```
在开发环境中运行真正的stdio MCP进程:
```bash
CASSETTE_MCP_SKIP_BOOTSTRAP=1 \
CASSETTE_MCP_PYTHON="$PWD/.venv/bin/python" \
.venv/bin/python scripts/run_local_mcp.py
```
确定性测试套件涵盖核心对等性、所有11种工具、真正的stdio协议调用、长轮询、重启/恢复行为、状态转换、资源链接、身份验证和文件系统安全、两个插件清单、现有的赫尔墨斯/网络套件和前端构建。维护者触发的实时E2E使用存储库机密通过临时环境变量;PR CI保持无凭证。
运行本地Cassette E2E测试:
```bash
.venv/bin/python scripts/e2e_local_cassette.py \
--media tests/fixtures/sample.mp4 \
--instruction "Make a short captioned video under 10 seconds."
```
#### Cassette传输
插件可以通过`CASSETTE_TRANSPORT`选择的两种方式到达Cassette,并且**两者都完全支持** - 选择适合您部署的任意一种:
- **`api`(默认)** - 直接调用Cassette服务器API(身份验证 → 媒体上传 → LangGraph代理运行 → 从存储项目导出渲染),无需浏览器。 这是默认设置,因为它避免了DOM刮擦的可靠性弱点,并且不需要Playwright/Chromium。 它重用现有的`CASSETTE_AUTH_EMAIL`/`CASSETTE_AUTH_PASSWORD`; API源默认为部署的Cassette(仅当自托管时覆盖`CASSETTE_API_URL`)。 **要求:** 帐户必须具有完全的API访问权限(对于`/api/projects`和`/api/export`) - 传输报告的`403`/`forbidden`错误指示它不这样做,在这种情况下设置`CASSETTE_TRANSPORT=browser`。
- **`browser`** - 使用Playwright驱动Cassette Web UI(原始的、经过实战测试的路径)。设置`CASSETTE_TRANSPORT=browser`使用它。 需要安装Playwright/Chromium。 行为与传输缝隙插件的字节标识相同。
切换是一个环境变量,下游没有任何变化:两种传输返回相同的作业结果字典,因此通知、交付和报告相同。
上传的媒体链接到代理运行会话ID(上传的`x-session-id`等于运行的`mediaSessionId`),并且运行携带与编辑器发送的相同完整的会话/项目/运行上下文。在启动运行之前,传输等待上传的媒体被完全处理 - 分析证据/嵌入(代理读取)和渲染源派生项(导出需要)- 因此它永远不会提交空编辑或遇到“渲染源丢失”导出(可通过`CASSETTE_API_MEDIA_READY_TIMEOUT_SEC`调整)。取消(`/cut`)在运行中被尊重,代理超时报告`timed_out`,队列未启动的运行快速失败为`agent_run_not_started`(可通过`CASSETTE_API_RUN_START_TIMEOUT_SEC`调整)而不是无限期挂起。传输要求Cassette后端LangGraph运行队列排空运行及其媒体渲染源管道健康。
API路径旨在与浏览器路径保持行为一致:它尊重用户的模型选择(将UI标签映射到模型ID,并在`CASSETTE_REQUIRE_MODEL_SELECTION`下失败时大声失败)并发送模型选择通知;记录实时阶段进度(`current_stage`、`stage_timings`、`progress_events`)并提供定期**文本**进度心跳(没有浏览器截图);对例行问题进行分类,以便例行问题自动继续,而真正的选择/缺少资产返回`needs_user`;跨重用会话合并上传;像浏览器路径一样,通过Hermes监督完成审查(`cassette_review_completion`)后,将已完成的编辑通过导出路由到导出 - 设置`CASSETTE_API_AUTO_EXPORT=1`直接在代理成功时导出,而不是。唯一不可减少的差异是`final_screenshot`:没有浏览器,传输用导出的mp4中的静态帧替换它(`CASSETTE_API_EXPORT_THUMBNAIL`)。
相同的E2E流程可以在任一传输上运行,并且对等性测试套件会差异化两个结果(终端状态、可交付输出计数、错误代码集):
```bash
# 单个传输
.venv/bin/python scripts/e2e_local_cassette.py --transport api \
--media tests/fixtures/sample.mp4 --instruction "Make a short captioned video."
# 浏览器-vs-api对等性(需要全访问帐户;渲染-from-project导出端点
必须在Cassette服务器上启用)
.venv/bin/python scripts/e2e_transport_parity.py \
--media tests/fixtures/sample.mp4 --instruction "Make a short captioned video."
```
运行Web演示服务:
```bash
uv venv .venv-web
uv pip install --python .venv-web/bin/python -r requirements-web.txt
.venv-web/bin/python -m playwright install chromium
```
# 构建浏览器UI(Vite/React -> web_demo/frontend/dist);需要 Node.js + npm。
./web_demo/build_frontend.sh
set -a
. ./oh-my-cassette-web.env
set +a
.venv-web/bin/python -m web_demo.server
浏览器UI是一个位于 `web_demo/frontend` 下的Vite + React + TypeScript应用;`web_demo/build_frontend.sh`将其编译到 `web_demo/frontend/dist`,服务器在 `/static` 下提供服务。构建输出不会被提交,因此每次部署时都需要构建(在拉取前端更改后重新运行)。对于前端实时迭代,`cd web_demo/frontend && npm run dev` 运行Vite,将 `/api` 代理到 `http://127.0.0.1:8088`,因此需要与FastAPI服务器一起运行。
Web演示从进程环境变量中读取 `CASSETTE_*`、`DEEPSEEK_*` 和 `OMC_WEB_*`。用户还可以在浏览器设置中输入临时的DeepSeek API密钥;该密钥仅随请求发送到此服务器,不会写入存储库或服务器磁盘。systemd模板位于 `deploy/oh-my-cassette-web.service.example`,环境模板位于 `deploy/oh-my-cassette-web.env.example`。
真实网关E2E测试仅在选择加入时运行,默认情况下会被跳过:
```bash
RUN_CASSETTE_E2E=1 .venv/bin/python -m pytest -q -m e2e
```
## 公共存储库安全
请勿提交:
- `.env` 或 `.env.e2e`;
- 真实的网关令牌、账户ID、聊天ID或原始 `wxid` 值;
- Cassette凭证;
- Jamendo凭证;
- 下载的媒体、导出、作业状态、浏览器跟踪或本地运行时缓存。
Hermes运行时状态属于 `~/.hermes/cassette`;Codex和Claude运行时状态属于平台标准的Oh My Cassette数据目录。两者都不属于此存储库。
## 许可证
MIT。参见 [LICENSE](LICENSE)。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器