大家好我是小木头 今天聊一个 OpenAI 刚开源的 东西 Symphony 在开始前 我们先来看三个数字 第一个数字 15K Symphony 仓库开源到现在 GitHub 星星已经突破了 15K
第二个 500% OpenAI 自己披露内部用上 Symphony 的团队
第三个数字 0 我接下来录屏里 给我自己的网站做了一个小功能 在这个功能开发中 我自己敲键盘的次数是零 这三个数字摆在一起 基本就是 OpenAI 这次想讲的故事 不是又造了一个写代码的 agent 而是把管项目这件事重新设计了一遍 留给 agent 自己跑 Symphony 到底是什么呢
咱们来到官方代码仓库 官方的定义是 把项目工作变成一组互相隔离的、 自治的任务执行 注意三个词:隔离、自治、运行 这三个词 决定了 Symphony 不是一个写代码的工具 而是一个调度器 它的工作方式是这样的 Linear 看板上每一张 ticket Symphony 都会去看一眼 处于 to do
或 in progress 状态 又没有未关闭的 blocker 它就会派一个 agent 进去干 这个 agent 跑在自己专属的 workspace 代码本体跑的是 OpenAI 的 Codex App
Server Symphony 自己只负责调度谁该跑 跑多久、超时怎么重试 跑完怎么收尾 在官方代码仓库有这么一份文档 spec 这是 Symphony 的服务规范 我读了一遍 其中有几个关键点咱们拎出来 单独的聊一聊 第一个是轮询 也就是 polling 轮询默认 30 秒一次 Linear
看板上有新卡 状态变了 30 秒内 Symphony 就会注意到你的 每个 issue 有自己的工作区 也就是 workspace 不会互相打架 跑完一次还会保留下来 下次同一个 issue 再跑可以接着用 退避重试 不会一次失败就彻底挂掉 Symphony 它自己不写 ticket 只读
Linear 的状态 要不要在 Linear 上回复评论 修改状态 是 agent 自己用工具去做的 那这跟我们已经在用的 Codex CLI 或 Claude Code 有什么不一样呢 差别就一个 谁是入口
Codex CLI、Claude Code 这种入口是终端 我打开它 我跟它说帮我修改这个文件 它写我审 把入口换成了 Linear 看板 我只管在 Linear 上提 ticket agent 自己去捡 我从盯着 agent 写代码变成管项目 agent 自己开工 Symphony 把入口换成了
Linear 看板 我只管在列表上提 ticket agent 自己去捡 我从盯着 agent 写代码变成管项目 agent 自己开工 这一句听起来好像没什么 但你想想这意味着什么 不会写代码的人也能给项目派活 产品经理、设计师、运营 只要会在 Linear 上提 ticket 他们就在调度
agent 最后还有一件事得说清楚 Symphony 不是产品 OpenAI 自己说不会把它当产品维护 就是放出来给大家看 Codex App Server 接 workflow 工具能跑成什么样 在
Symphony 的代码仓库 还开源出来一个参考实现 这个实现是基于 Elixir 写的 Symphony 选择还是令我蛮意外的 至少我并不熟悉 Elixir 但这个参考实现 还是提供了非常完善的文档 帮助我快速地上手 听了一番我的 介绍恐怕还是蛮抽象的 那咱们来实际地安装操作一下
看看它的体验究竟是什么样的 咱们根据 Elixir 的 README 文档来完成操作 在这里 有一个非常简明的安装配置手册 也介绍了它是如何工作的 它会轮询 Linear 去寻找可以适合自己的工作 启动 Codex 做一番简单的介绍 发送提示词给 Codex 推动 Codex 不断地工作 直到
issue 成功被解决 在这里面呢 咱们就需要几样东西 首先呢是代码仓库 这是你要让 Symphony 工作的地方 就是 Linear 的 API key 在目前的这个实现中 用到了 Linear
作为一个任务的调度和管理的系统 在此之前 首先呢是需要完成一系列依赖的安装 因为 Elixir 所以呢 咱们需要用到一个叫 mise 的管理工具 在官方网站 这里有非常详细的安装方式 根据不同的操作系统 大家选择对应的安装方式 完成安装 比如在 macOS 咱们就用 brew install
mise 接下来参考文档的后续步骤 逐一地运行 可以通过 mise exec elixir --version 来查看安装版本 再克隆 Symphony 代码仓库 在 Elixir 目录中运行如下一系列命令 完成安装与配置 最后这条命令 mise exec mix symphony
workflow.md 就是运行 Symphony 的一条命令 我们先来看看 在我本地已经运行起来的 这么一个 Symphony 环境 配合 Linear 它是怎么工作的 我在当前的终端已经运行了 Symphony
它监听的或对接的项目呢 是 Linear 上的这个 verysmallwoods 项目 它会每隔 5 秒钟刷新扫描一次 它可以做的工作 在 Linear 这一侧 我创建了个项目叫 verysmallwoods 通过 URL 大家应该能看到 770B6E8 这个 ID 或者这个项目呢
正是目前咱们在终端这里监听的项目 它每隔 5 秒扫描一次 当咱们期望为每个 issue 创建工作区 通过 Symphony 来协调调度工作的执行 我们通过 issue 来追踪 那现在呢 就来创建一个 issue 来看看效果 当前管理的项目呢 是我的这个官方网站 我尝试 让它帮我完成一个简单的工作吧
在页脚这里有一个 Email 这是联系方式 但是呢不能点击 在网站上常见的电子邮件呈现方式呢 是可以通过点击自动打开 比如邮件的应用 快速地来编写邮件的 那我希望在这里做一番改进 我现在就回到 Linear
期望更新一下在页脚中的 Email 让它可以点击 我将它状态切换到 to do 优先级呢 切换到 high 我可以将它指派给我自己 创建 issue 这个 issue 创建后 我们赶紧回到终端这里 很快通过扫描 它发现到了这个新的 issue 目前处于 to do 状态 这是它可以进行处理的
那它现在就要开始处理这个 issue 我们给它些时间来完成操作 我们回到 Linear 点开这个 issue 能够看到这个 issue 底下呢 已经做了许多的更新 这个更新呢是一个 Codex 的工作计划版 包含了工作计划以及验收的标准 最后呢是如何验证另一个呢 它完成了这个任务的执行 那在这里呢
有一个 token 的进与出的统计数据 这个呢 大概就反映了在这个任务执行中 它的对话 它的提示词究竟的开销是什么样的 那我现在回到 Linear 这边 来看看 issue 的更新情况
那究竟这个是怎么工作的呢 我们来看看在本地它得到了一些什么 咱们现在回到另外一个终端 在 code 目录下有个 Symphony workspaces 这里面列出了所有 issue 对应的目录 刚才工作的应该是 8 号 实际上呢 它就是将 verysmallwoods 我这个个人的网站的项目
克隆到了 workspaces 底下 在这里面 它会做对应的代码修改 如果需要呢 我们可以来到这个目录 手动地在这里运行个人的站点 看看它的修改情况 再验证是否修改是我们期望的 那目前这个 issue 的执行呢 我们来看看最下方它的记录 这里面就有一系列它的处理情况 处理到最后呢 它有一个
confusion 的信息点 看起来在整个的执行中 git 的操作 有一些问题 我不确定 是不是我本地的这个环境的配置 或者当前的网络存在一些问题 这个呢在视频后我会来检查一下 看得出来 它主要的改动呢 就是添加了
mailto 这个前缀 或者这个协议的标识符 使得电子邮件可以点击 那这当然是一个正确的改进或者修复 这就是我们如何在本地运行 Symphony 并且基于 Linear 来做任务的协调 本地的执行呢 会用到 Codex 那大家可能好奇该怎么配置 那我们现在快速地就过一遍 安装与配置 首先大家在
Linear 完成注册与登录 在这里呢 我已经创建了一个项目 叫 verysmallwoods 在项目这里 大家可以点击加号 创建一个新的项目 比如我取名 experiment,这个项目呢 会有一个 ID 当我们点击这个项目的时候呢 在浏览器的地址栏就有这个 ID 这个 ID
是我们在后续配置中会用到的 另一方面 我们需要配置 Linear 的 API key 在个人账号这里 来到 Settings 应该有 Security and access 这个菜单 点击它 在下方创建一个自己的
personal API key 在 Linear 侧的配置就完成了 在咱们自己电脑上 我们现在做一些配置 安装配置过程呢 我们参考 Symphony 中 Elixir 的文档 接下来就是克隆 Symphony 这个代码仓库 再来到 Symphony Elixir 目录 我已经完成了克隆
后续的命令我也已经都执行过了 大家可以逐一地执行 最后这条命令 mise exec mix symphony 这个呢就是启动 Symphony 的命令 我回到刚才运行的这个终端 将它停掉 可以来看看整个的命令的情况 这表示运行 Symphony 但是呢需 要给它一个 workflow.md 文件
这个文件在哪里呢 我们马上介绍 在文档中 并没有添加我们后面提供的这个参数 那如果大家在运行同样命令时 出现错误呢 它会有提示 那么我遇到提示 就是将这个选项添加上 这表示我已经明白 这个运行呢会存在风险
它并没有通常需要的这种安全的防护 这样呢 就启动了在本地运行的 Elixir 实现 也就是说运行了 Symphony 那在这里面 会提供的 workflow.md 文件是什么呢 这就很关键了 我们依然回到 Elixir 的文档 这里要提供一个 workflow.md 文件
这个文件呢 是你想要它工作的项目中 配置的 workflow 文件 那我在这里提供的呢 就是 verysmallwoods 项目下的 workflow.md 在 Elixir 目录下会有 workflow.md 文件 这是一个类似于模板的文件 我们可以打开看看它的内容 在这里面
包含了一系列我们可以配置的参数 那作为初次使用或体验呢 我们只需要关注两个参数就好 一个是 project_log 一个呢是 hooks 这里的 git clone 命令 project_log 配置为刚才我们在 Linear app 中 创建的项目的 ID 也就是咱们刚才创建项目的 URL 中的
这部分 另一个呢 就是 hooks 这里的 after_create 要克隆一个目录 这个目录呢 就是大家的代码仓库的 URL 比如现在 如果我想要它帮助我来做 Session 这个项目的开发和管理呢 我就将这个 URL
交给它 它的工作原理是在每个 issue 处理中 会在 Symphony Workspace 克隆这个代码仓库 完成必要的操作 比如修改代码 编译确保一切正常 然后更新咱们在 Linear 上的 issue 现在我们就来看看 我在这里命令中提供的 workflow.md 文件 来到本地的 VS
Code 我打开的就是 workflow.md 这个 workflow.md 是我在 verysmallwoods 这个项目中 复制粘贴后做的修改 project_log 设置为了 这么一个字符串 我是从 Linear app 中复制粘贴过来的 另一个很重要的就是 after_create 这个后面
git clone 克隆的 就是这么一个代码仓库 在启动 Symphony 之前呢 我们还需要配置 Linear 的 API key 我现在在环境变量中 已经配置了 Linear API key
这个呢是在视频分享前 我已经创建并且添加到这里的 到此 我们就已经完成了必要的准备工作 通过 mise exec symphony 命令启动它就好 在这个命令中 我们给到了这个 workflow.md 文件 那现在 大家就可以在自己的 Linear 项目中 创建 issue 这里呢点击 Issues
可以创建一个新的 issue 这也是在项目中的第一个 可以根据自己的需要 来决定将状态切换成什么 比如切换到 to do 表示这个 issue 呢 已经可以开始工作了 自己本地运行的 Symphony 的 agent 就会将这个 issue 取下来 看看是否能做 再根据需要 将它切换到比如 in
progress 状态 进行工作 并随时地在底下做更新做笔记 好了这就是咱们今天分享主要内容 那大家觉得这套任务的调度编排体验 是否能够满足自己的工作 和学习的需要呢 大家是否已经开始使用
Symphony 也欢迎大家在评论区给我们留言 那今天的分享就到这里 我们下期再见吧