OBS Studio 场景集编辑的命令行化实践:解读 CLI-Anything 中基于 JSON 场景集的 OBS CLI Harness
导读
本文以 CLI-Anything 仓库中 OBS Studio 的 agent-harness 文档(obs_studio/README.md)为核心,介绍一套**无需安装 OBS Studio 即可离线编辑场景集(scene collection)**的"有状态"命令行接口:它把 OBS 的推流/录播工程抽象成一份 JSON 工程文件,通过 project / scene / source / filter / audio / transition / output / session 八组命令完成从建工程、加摄像头、挂绿幕滤镜、排版画面到配置 Twitch 推流的全流程。读完本文,你将掌握:这套 CLI 的安装与双模式(一次性命令 / 交互式 REPL)用法、JSON 场景集文件结构与校验规则、全部资源类型与滤镜参数表,以及其"会话快照 + 撤销/重做"机制在源码中的实现方式,可直接迁移到 Agent 自动化或脚本化 OBS 场景编排场景。
OBS Harness 定位:把"场景集"变成可编程的 JSON 文档
在传统工作流中,搭建一个直播画面需要人工在 OBS 图形界面中逐一添加场景、来源与滤镜。而 CLI-Anything 中 OBS Studio 模块的做法是:将整个场景集(scenes、sources、filters、audio、transitions、streaming/recording 配置)序列化为一份 JSON 工程文件,用命令行对这份文档做增删改查,遵循与 Blender CLI harness 相同的设计模式,且编辑过程不需要本机安装 OBS Studio(README 首段)。测试文件也明确注明 "All tests run without OBS Studio installed",全链路可在无 OBS 环境中验证。
从源码结构看,主入口 obs_studio_cli.py 是一个 Click 命令组(cli group),真正的业务逻辑被拆到 core/ 下的 project / scenes / sources / filters / audio / transitions / output / session 八个模块中,命令层只负责参数解析与调用 core 层函数,这种分层让同一套逻辑既可被 CLI 调用,也可被上层技能(skills/SKILL.md)或 Agent 直接复用。
关键概念
- Scene Collection(场景集):一个包含全部场景、来源与设置的工程文件(
.json),即本 CLI 中project的操作对象; - Scene(场景):若干来源的组合,推流时可在场景间切换;
- Source(来源):放在场景中的视频/音频/图像元素,如摄像头、显示器捕获、浏览器源;
- Filter(滤镜):作用在某个来源上的视频或音频处理效果(如色度键抠像、降噪);
- Transition(转场):场景切换时的视觉效果;
- Audio Source(全局音频源):独立于场景的全局音频输入/输出,支持音量、静音与监听控制。
安装与运行方式
依赖与安装
仓库为独立打包的 cli-anything-obs-studio 包,配置见 setup.py:Python 要求 >=3.10,运行时依赖 click>=8.0.0 与 prompt-toolkit>=3.0.0,dev 依赖包含 pytest>=7.0.0。README 给出的最小安装命令为:
pip install click prompt_toolkit
按包方式安装(skills/SKILL.md 亦采用该方式):
pip install -e . # 在 obs-studio/agent-harness 目录下,可编辑安装
# 或安装发布包
pip install cli-anything-obs-studio
入口点差异说明
README 中的示例命令写作 python3 -m cli.obs_cli,这是 CLI-Anything 各 harness 的统一历史调用名。按当前仓库实际结构,模块真实入口位于 obs_studio_cli.py,同时 setup.py 注册了控制台脚本 cli-anything-obs-studio。因此实际运行时可选用:
# 在仓库 obs-studio/agent-harness 目录下,以模块方式运行(等价于 README 的 -m cli.obs_cli)
python3 -m cli_anything.obs_studio.obs_studio_cli --help
# 安装后使用 console script
cli-anything-obs-studio --help
# 不带子命令时直接进入 REPL
cli-anything-obs-studio
下文示例沿用文档中的 python3 -m cli.obs_cli 写法以保持与文档一致,你在本仓库运行时可替换为上面对应命令。全局帮助可用 cli-anything-obs-studio --help,REPL 内输入 help 可查看全部命令组速查表(_repl_help 定义于 obs_studio_cli.py)。
快速开始:十分钟搭好一套"主场景 + 摄像头 + 绿幕"工程
新建工程并添加来源与滤镜
以下是文档给出的完整引导命令,可逐条照抄运行(除首条外均通过 --project 指定工程文件,形成"改完即存"的链式编辑):
# Create a new project
python3 -m cli.obs_cli project new --name "my_stream" -o project.json
# Add sources
python3 -m cli.obs_cli --project project.json source add video_capture --name "Camera"
python3 -m cli.obs_cli --project project.json source add display_capture --name "Game"
# Add filters
python3 -m cli.obs_cli --project project.json filter add chroma_key -S 0 -p similarity=400
# Add scenes
python3 -m cli.obs_cli --project project.json scene add --name "BRB"
# Configure streaming
python3 -m cli.obs_cli --project project.json output streaming --service twitch --key "your_key"
# Save
python3 -m cli.obs_cli --project project.json project save
值得注意的细节:
project new支持--width/--height/--fps/--encoder,默认分别为1920×1080 / 30 / x264;底层 project.py 的 create_project 会对分辨率(须为正数)、码率(video ≥100、audio ≥32)与编码器(白名单x264, x265, nvenc, qsv, amd, svt-av1)做校验;source add的-S实际指--setting(key=value形式),而filter add的-S指--source(来源下标)、-p指--param。两者含义不同,使用时注意区分;filter add的-S 0表示把滤镜挂到场景中下标为 0 的来源上;-p similarity=400的取值会自动做类型推断(含小数点转 float,否则转 int),随后由 filters.py 的 _validate_filter_params 校验并填充默认参数。
如果工程尚未指定文件,最后一条 project save 会由 Session.save_session() 写回磁盘;若此前每条命令都带了 --project,则命令退出时由 cli 组的 result_callback(auto_save_on_exit)自动保存被修改过的状态(详见下文"有状态会话"一节)。
在场景中摆放画面:transform 与 set
source set 可修改来源属性,source transform 可做几何变换,参数为位置/尺寸/裁剪四元组(见 obs_studio_cli.py):
# 设置属性:name / visible / locked / opacity / rotation
python3 -m cli.obs_cli --project project.json source set 0 visible false
python3 -m cli.obs_cli --project project.json source set 0 opacity 0.8
# 几何变换:位置 x,y;尺寸 宽x高;裁剪 top,bottom,left,right;旋转(度)
python3 -m cli.obs_cli --project project.json source transform 0 -p 100,200 --size 1280x720 --crop 0,0,10,10 -r 15
# 也可带来源类型专属参数添加,例如图片来源的 file 设置
python3 -m cli.obs_cli --project project.json source add image --name "Overlay" -S file=/path/to/overlay.png
对应的 core 层 sources.py 中:set_source_property 只接受上述五个白名单属性,其中 opacity 经 validate_range 限定在 0.0~1.0;transform_source 与 validate_position / validate_size / validate_crop(定义于 utils/obs_utils.py)联动,对位置的非有限值(NaN/Inf)与尺寸、裁剪的负值直接抛错——仓库为此还单独准备了 test_validate_geometry_nan.py 与 test_validate_range_nan.py 对非有限数值做回归保护。
JSON 输出模式与三个全局选项
所有命令默认输出人眼友好的缩进文本(嵌套 dict/list 由 _print_dict/_print_list 渲染);加全局 --json 标志后,统一输出结构化 JSON,便于 Agent 解析:
python3 -m cli.obs_cli --json project new -o project.json
python3 -m cli.obs_cli --json --project project.json source list
除 --json 外,入口还支持另外两个全局选项(obs_studio_cli.py):
| 全局选项 | 作用 |
|---|---|
--project <path> |
打开既有 JSON 场景集文件作为当前工程(对应 project open) |
--json |
以 JSON 输出结构化结果 |
--dry-run |
只执行不改写磁盘:auto_save_on_exit 会跳过自动保存 |
错误处理也遵循同样的双通道约定:handle_error 装饰器捕获 FileNotFoundError / ValueError / IndexError / RuntimeError / FileExistsError,JSON 模式下输出 {"error": ..., "type": ...},普通模式输出到 stderr;一次性命令失败会 sys.exit(1),REPL 内则仅打印错误不退出。skills/SKILL.md 对 Agent 调用给出的最佳实践是:始终携带 --json、检查返回码、从 stderr 读错误、文件操作用绝对路径。
交互式 REPL:带历史记录的"OBS 控制台"
不带子命令运行(或显式 repl 子命令)即进入交互式 REPL,可预加载工程:
python3 -m cli.obs_cli repl
python3 -m cli.obs_cli repl --project project.json
REPL 实现位于 obs_studio_cli.py 的 repl 命令:通过 prompt-toolkit 提供输入提示(提示符会实时显示当前工程名,来自 _get_project_name),内部用 shlex.split 切词后把每一行原样交给 Click 命令组执行。支持 help 查看命令速查、quit/exit/q 退出,Ctrl+C/Ctrl+D 安全离开。由于每个 REPL 命令天然共享同一个 Session 单例,你可以在一个会话里连续执行"加来源 → 挂滤镜 → 撤销 → 重做",实时观察状态变化——这正是"有状态 CLI"与逐条跑一次性命令的核心差异。
命令组速查与逐组详解
以下为完整命令矩阵(与文档一致),随后按组展开参数与校验细节。
Project Management(工程管理)
project new - Create a new scene collection
project open - Open an existing project file
project save - Save the current project
project info - Show project information
project json - Print raw project JSON
project new [-n name] [-w width] [-h height] [--fps N] [--encoder E] [-o path]:底层create_project校验参数后返回默认结构;-o指定保存路径;project open <path>:open_project要求文件存在且含version与scenes字段,否则抛错;project info:get_project_info汇总分辨率、帧率、编码器、场景/来源/转场/音频源计数、当前活动场景与推流/录播配置——这是 Agent 了解工程概貌的首选入口;project json:原样打印整个工程字典(indent=2)。
Scene Management(场景管理)
scene add - Add a new scene
scene remove - Remove a scene by index
scene duplicate - Duplicate a scene
scene set-active - Set the active scene
scene list - List all scenes
场景模型很简单(scenes.py):{id, name, sources[]}。三个值得记录的约束:
- 不允许删除最后一个场景(
remove_scene会抛ValueError),且删除后会自动修正active_scene下标; - 重名场景会被
unique_name自动追加序号(如BRB.001)——该去重工具在来源、滤镜、音频源、转场中通用,实现见 utils/obs_utils.py 的 unique_name; scene duplicate深拷贝整场景,并为副本内每个来源重新分配 ID,保证两份场景的来源相互独立。
Source Management(来源管理)
source add - Add a source (video_capture, display_capture, image, text, browser, etc.)
source remove - Remove a source by index
source duplicate - Duplicate a source
source set - Set a source property (name, visible, locked, opacity, rotation)
source transform - Transform a source (position, size, crop, rotation)
source list - List all sources in a scene
source add 的子命令位置参数是来源类型,由 Click Choice 限定在 sources.py 的 SOURCE_TYPES 注册表内;--scene/-s 指定来源落到哪个场景(默认下标 0)。每个来源默认携带完整骨架:visible/locked/position/size/crop/rotation/opacity(1.0)/filters[]/settings,其中 settings 会被来源类型默认值预填(详见下文"Source Types")。不支持的来源类型、越界下标、非法 opacity 均会得到明确报错。
Filter Management(滤镜管理)
filter add - Add a filter to a source
filter remove - Remove a filter
filter set - Set a filter parameter
filter list - List filters on a source
filter list-available - List all available filter types
filter add <type> -S <source_index> -s <scene_index> [-n name] -p key=value。滤镜参数由 filters.py 的 FILTER_TYPES 注册表定义 schema(类型 + 默认值 + 范围/枚举),_validate_filter_params 会:拒绝未知参数、把 float/int/bool 型参数换算并做范围校验、把 str 型参数与枚举 values 比对、对未提供的参数自动补默认值。filter set 单参数更新同样走这套校验。filter list-available -c video|audio 可按类别过滤,返回每类滤镜的名称与参数清单。
Audio Management(音频管理)
audio add - Add a global audio source
audio remove - Remove an audio source
audio volume - Set volume (0.0-3.0)
audio mute - Mute an audio source
audio unmute - Unmute an audio source
audio monitor - Set audio monitoring type
audio list - List all audio sources
音频源是全局级的(挂在工程顶层 audio_sources[],不属于某个场景),数据结构在 audio.py 中为 {id, name, type(input|output), device, volume, muted, monitor, balance, sync_offset, filters[]}。文档强调的音量范围 0.0-3.0(1.0 即 100%)由 validate_range 强制;monitor 三态为 none / monitor_only / monitor_and_output。core 层还预留了 balance(-1.0~1.0 立体声平衡)与 sync_offset(毫秒)两个未暴露到 CLI 的能力位,说明该模型可向后扩展。
Transition Management(转场管理)
transition add - Add a transition
transition remove - Remove a transition
transition set-active - Set the active transition
transition duration - Set transition duration
transition list - List all transitions
转场类型注册表(transitions.py)共 7 种,add 不带 -d 时会采用类型默认时长:
| 类型 | 默认时长(ms) | 类型 | 默认时长(ms) |
|---|---|---|---|
cut |
0 | stinger |
1000 |
fade |
300 | fade_to_color |
300 |
swipe |
500 | luma_wipe |
500 |
slide |
500 |
与场景一致,转场也不允许删除最后一个,且时长必须为非负。活动转场记录在工程的 active_transition 下标中。
Output Configuration(输出配置)
output streaming - Configure streaming settings
output recording - Configure recording settings
output settings - Configure encoder/resolution/bitrate
output info - Show current output configuration
output presets - List available encoding presets
output.py 维护三块配置,均带白名单校验:
output streaming --service {twitch,youtube,facebook,custom} [--server] [--key],service 非法即报错;output recording --path --format {mkv,mp4,mov,flv,ts} --quality {low,medium,high,lossless};output settings直接覆盖分辨率/fps/双码率/编码器,或通过--preset一键套用预置。
内置 8 个编码预置(ENCODING_PRESETS,可用 output presets 查看):
| preset | encoder | video bitrate | audio bitrate |
|---|---|---|---|
ultrafast |
x264 | 2500 | 128 |
fast |
x264 | 4500 | 160 |
balanced |
x264 | 6000 | 160 |
quality |
x264 | 8000 | 192 |
high_quality |
x264 | 12000 | 320 |
nvenc_fast |
nvenc | 6000 | 160 |
nvenc_quality |
nvenc | 10000 | 192 |
recording_high |
x264 | 20000 | 320 |
注意 output settings --preset 会一次性写入 encoder + 双码率;若随后再单独给 --video-bitrate 等,则单值覆盖保留 preset 的其余字段(E2E 测试 "Apply preset then override single setting" 验证了该行为)。
Session(会话状态管理)
session status - Show session status
session undo - Undo the last operation
session redo - Redo the last undone operation
session history - Show undo history
session status 输出 {has_project, project_path, modified, undo_count, redo_count, project_name};session history 列出撤销栈中每条操作的描述与时间戳。详见下文"有状态会话与撤销/重做"一节。
JSON 场景集文件格式:一份完整样例与字段说明
文档给出的 JSON 场景集是 CLI 操作的本质对象。结合 project.py 的 _default_project 与 save_session 的写入逻辑(后者以 sort_keys=True、独占文件锁 fcntl.flock 原子写盘),一份典型的 project.json 结构如下:
{
"version": "1.0",
"name": "my_stream",
"settings": {
"output_width": 1920,
"output_height": 1080,
"fps": 30,
"video_bitrate": 6000,
"audio_bitrate": 160,
"encoder": "x264"
},
"scenes": [
{
"id": 0,
"name": "Main Scene",
"sources": [
{
"id": 0, "name": "Camera", "type": "video_capture",
"visible": true, "locked": false,
"position": {"x": 0, "y": 0},
"size": {"width": 1920, "height": 1080},
"crop": {"top": 0, "bottom": 0, "left": 0, "right": 0},
"rotation": 0, "opacity": 1.0,
"filters": [], "settings": {}
}
]
}
],
"transitions": [
{"name": "Cut", "type": "cut", "duration": 0},
{"name": "Fade", "type": "fade", "duration": 300}
],
"active_scene": 0,
"audio_sources": [],
"streaming": {"service": "twitch", "server": "auto", "key": ""},
"recording": {"path": "./recordings/", "format": "mkv", "quality": "high"}
}
顶层各键对应关系一目了然:settings ↔ output settings;scenes[].sources[] ↔ 场景内来源(含滤镜内嵌);transitions[] + active_transition ↔ 转场;active_scene ↔ scene set-active;audio_sources[] ↔ 全局音频;streaming/recording ↔ 推流与录播配置。保存时 save_project/save_session 还会刷新 metadata.modified 时间戳,project new 写入 metadata.created/software 便于溯源。由于全格式均为合法 JSON,你可以手工编辑这份文件后直接 project open 加载,或先改文件再配合 CLI 增补内容,二者天然互通。
有状态会话与撤销/重做机制:源码视角
"有状态"是本 CLI 的灵魂,全部由 core/session.py 的 Session 类承担:
- 快照(snapshot):每个变更型命令执行前都会先调用
sess.snapshot(描述),把当前工程的深拷贝连同描述与 ISO 时间戳压入_undo_stack,同时清空 redo 栈并把_modified置位; - 撤销/重做:
undo()将当前状态存入 redo 栈后弹出 undo 栈顶部恢复工程;redo()方向相反。两者互为镜像,保证撤销后可完整重做; - 上限:
MAX_UNDO = 50,超限时最老的快照被丢弃(list_history/E2E 测试均覆盖); - 自动保存:一次性命令模式下,
obs_studio_cli.py的auto_save_on_exit(cli.result_callback)在命令返回后检查has_project() and _modified and project_path,命中即静默落盘;--dry-run或 REPL 内不触发该自动保存,REPL 中需手动project save; - 原子写盘:
_locked_save_json用fcntl.flock(LOCK_EX)加排它锁后 seek/truncate/写入,避免并发进程互相覆盖,非 Linux 平台自动降级为普通写。
配合场景/来源/滤镜/音频各模块"变更前先 snapshot"的约定,一条 session undo 就能回滚最近一次"加来源""改音量""挂滤镜"等操作,这让长流程的 Agent 任务具备了可逆性。
Source Types 与 Filter Types:两张完整注册表
来源类型(sources.py 的 SOURCE_TYPES)
文档列出的 12 种来源及各自默认 settings:
| 来源类型 | 类别 | 默认设置 |
|---|---|---|
video_capture |
video | device="", resolution="1920x1080", fps=30 |
display_capture |
video | display=0, capture_cursor=True |
window_capture |
video | window="", capture_cursor=True |
image |
media | file="", unload_when_hidden=True |
media |
media | local_file="", looping=False, restart_on_activate=True |
browser |
web | url="", width=800, height=600, css="" |
text |
text | text="", font="Sans Serif", size=36, color="#FFFFFF" |
color |
utility | color="#000000", width=1920, height=1080 |
audio_input |
audio | device="" |
audio_output |
audio | device="" |
group |
utility | items=[] |
scene |
utility | scene_name="" |
添加时若省略 --name,将自动取该类型的 label(如 Video Capture Device)并经 unique_name 去重;重复同名会得到 xxx.001 后缀。
滤镜类型(filters.py 的 FILTER_TYPES)
文档列出的 13 种滤镜中,7 个为视频类、5 个为音频类,各参数的范围/默认值如下(这正是 filter set 与 _validate_filter_params 的校验依据):
| 滤镜 | 类别 | 可用参数(默认 / 范围) |
|---|---|---|
color_correction |
video | gamma 0.0 [-3,3];contrast 0.0 [-4,4];brightness 0.0 [-1,1];saturation 0.0 [-1,5];hue_shift 0.0 [-180,180];opacity 1.0 [0,1] |
chroma_key |
video | key_color_type ∈ {green,blue,magenta,custom};similarity 400 [1,1000];smoothness 80 [1,1000];spill 100 [1,1000] |
color_key |
video | key_color "#00FF00";similarity 400 [1,1000];smoothness 80 [1,1000] |
lut |
video | path "";amount 1.0 [0,1] |
image_mask |
video | path "";type ∈ {alpha, blend} |
crop_pad |
video | top/bottom/left/right 0 [0,8192] |
scroll |
video | speed_x 0.0 [-5000,5000];speed_y 0.0 [-5000,5000];loop True |
sharpen |
video | sharpness 0.08 [0,1] |
noise_suppress |
audio | method ∈ {rnnoise, speex, nvafx};suppress_level -30 [-60,0] |
gain |
audio | db 0.0 [-30,30] |
compressor |
audio | ratio 10.0 [1,32];threshold -18.0 [-60,0];attack 6ms [1,500];release 60ms [1,1000];output_gain 0.0 [-30,30] |
noise_gate |
audio | open_threshold -26.0 [-96,0];close_threshold -32.0 [-96,0];attack 25 [1,500];hold 200 [1,1000];release 150 [1,1000] |
limiter |
audio | threshold -6.0 [-60,0];release 60 [1,1000] |
典型组合示例(来自 E2E 工作流):直播摄像头通常挂 chroma_key(绿幕)+ color_correction;人声轨则按 noise_suppress → noise_gate → compressor → gain → limiter 的 5 级链式顺序叠加,滤镜顺序即处理顺序,filter list/E2E 测试均验证了"从链中间删除滤镜会保持其余顺序不变"。
架构总览与测试体系
分层目录
文档给出的架构(结合仓库实际包路径):
obs-studio/agent-harness/
├── setup.py # 打包:cli-anything-obs-studio,入口 console script
├── OBS.md # 标准操作流程 (SOP) 文档
└── cli_anything/obs_studio/
├── obs_studio_cli.py # 主 CLI 入口(Click 命令组 + REPL)
├── core/
│ ├── project.py # 工程 create/open/save/info + 默认 JSON 结构
│ ├── scenes.py # 场景管理(含 active_scene 维护)
│ ├── sources.py # 来源管理 + SOURCE_TYPES 注册表
│ ├── filters.py # 滤镜管理 + FILTER_TYPES 注册表 + 参数校验
│ ├── audio.py # 全局音频管理(volume/mute/monitor)
│ ├── transitions.py # 转场管理 + TRANSITION_TYPES 注册表
│ ├── output.py # 推流/录播/编码配置 + ENCODING_PRESETS
│ └── session.py # Session:快照、undo/redo、原子保存
├── utils/
│ ├── obs_utils.py # generate_id/unique_name/validate_* 等工具
│ └── repl_skin.py # REPL 外观(banner/提示/帮助渲染)
├── skills/SKILL.md # 面向 Agent/LLM 的技能描述
└── tests/
├── test_core.py # 单测:project/scenes/sources/filters/audio/transitions/output/session
├── test_full_e2e.py # E2E:完整推流工作流 + 撤销/重做 + 边界用例
├── test_validate_geometry_nan.py # 位置/尺寸/裁剪的非有限数值回归
└── test_validate_range_nan.py # 范围校验的非有限数值回归
命令层 → core 层 → utils 层的单向依赖非常清晰:core 模块不依赖 Click,因而可被独立单测;utils 提供 ID 分配、去重、索引越界检查(get_item 会精确报出 "index out of range (0-N)")与各类数值校验。
运行测试
文档给出的运行方式为(在 agent-harness 目录下执行;仓库实际包路径见下):
# 全部测试(含单测 + E2E + NaN 回归)
python3 -m pytest cli_anything/obs_studio/tests/ -v
# 仅核心单测
python3 -m pytest cli_anything/obs_studio/tests/test_core.py -v
# 仅端到端测试
python3 -m pytest cli_anything/obs_studio/tests/test_full_e2e.py -v
测试规模与覆盖要点:
- test_core.py 覆盖八个模块的单元级约束(如拒绝负分辨率/越界 opacity/非法编码器、禁止删除最后一个场景、opacity 上限、撤销栈上限),tests/TEST.md 的实测记录为
153 passed in 0.19s(117 + 36分别来自两个主测试文件); - test_full_e2e.py 按完整工作流组织:4 场景 + 摄像头/显示器捕获/覆盖层 + Twitch 推流 + balanced 预置的"全套直播工程"、摄像头绿幕链路、音频调音台、4 层来源叠加、滤镜链、20 场景大工程、保存/加载往返等;
- 另两个测试文件专门保障几何与范围校验对 NaN/Infinity 的防御,呼应 utils/obs_utils.py 中
_finite_number/_finite_int的"拒绝非有限值"设计。
所有测试均运行在纯内存的合成工程数据上,README 与 TEST.md 都强调:完整测试不需要安装 OBS Studio。
结语:把 OBS 工程变成 Agent 可编排的文档
回到本文主题:CLI-Anything 中这个 OBS Studio harness 的核心贡献,是把"OBS 图形化布景"压缩成一张结构清晰、可校验、可版本化的 JSON 场景集,再以 8 组命令 + 双输出模式 + 50 步撤销栈把它变成任何脚本或 Agent 都能安全驱动的一等公民。无论你想做推流前的自动化布景、直播工程的 Git 化管理,还是把"建场景 → 加摄像头 → 挂绿幕 → 配推流"固化为可复现流程,都可以直接参照本文的命令序列与参数表,并借助仓库内 core/ 的源码与 tests/ 的测试来验证自己的编排逻辑——而这一切都无需本机安装 OBS。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0631
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00