鱼皮AI导航
鱼皮AI导航
  • 主页
  • 社区
  • AI工具
  • AI知识库
  • AI提示词
  • MCP
  • Skills
  • AI学习资源
  • AI资讯
  • GitHub开源
登录/注册
站长:程序员鱼皮 老鱼简历 商务合作 增值电信业务经营许可证
2026 鱼皮AI导航 | 沪ICP备19026706号-6
3
2
2

ParallelAgent 一期实现记:给多 AI 会话并行工作流加上编排层

鱼儿
鱼儿
2026-10-16 06:34
阅读 781
鱼儿
2026-10-16 06:34
阅读 781

ParallelAgent 一期实现记:给多 AI 会话并行工作流加上编排层

从写下第一行代码,到全端点联调通过——编排器插件实现与踩坑记录 开源地址:https://github.com/YorickFin/ParallelAgent (Apache 2.0)

背景

上一篇介绍了 ParallelAgent 的方案设计:一套"仲裁者 + 多轨会话 + 文件信箱"的多 AI 并行开发工作流,以及用编排层把"建会话、派活、收工判定"自动化的思路。方案冻结、仓库开源之后,下一步就是按实现路径把编排器插件和两个 Skill 做出来。

一期的定位是手动触发版——仲裁者 Skill 出建议、用户确认,编排器插件负责把脏活自动跑起来。这篇记录一期的实现过程。

技术选型:能薄则薄

开工前先把技术选型定死,原则就一条:能薄则薄。

项选择理由
CDP 客户端ws 直连 WebSocket不用现成的 chrome-remote-interface——它假设标准 Chrome,Electron 衍生版未必兼容,而 ws 直连已被探针验证
HTTP 网关Node 内置 http零依赖,手写极薄 body 解析
文件监听轮询 fs.stat 为主 + fs.watch 唤醒Windows 的 fs.watch 不稳定;轮询天然拿 mtime,恰好契合"回执文件出现 + mtime 稳定 = 完成"的协议设计
构建esbuild 打包 + tsc 类型检查微软官方推荐的 VS Code 扩展构建方式,ws 直接打进 dist,装扩展连 node_modules 都不用

最终交付:15 个 TypeScript 源文件,运行时第三方依赖只有 ws 一个。HTTP 网关六个端点(/health、/new、/ping、/dispatch、/watch、/delete),对应编排器的全部动作:查状态、建轨、切轨、派活、等回执、删轨。

架构上的铁律没变:控制面只传"轨号 + 轮次 + 文件指针",任务内容 100% 走文件信箱;每个动作前都做 sid 身份断言,断言失败立即 fail-stop 停机告警——宁可停,不盲发。

联调:真实 DOM 的连番毒打

代码写完只是上半场。真正的重头戏是联调——当 CDP 脚本第一次碰到真实运行的应用界面(第一个适配宿主是 Trae Work),教科书式的假设会一个接一个碎掉。记几个最有代表性的坑,其中大部分对任何"用 CDP 驱动 Electron 应用 UI"的场景都适用。

坑一:扩展装了就是不生效。 插件文件放进扩展目录,重启宿主,命令死活不出现。翻遍配置才发现扩展目录下有个 .obsolete 文件,里面赫然写着新扩展的条目——宿主的扩展生命周期管理把它标记成"待废弃"了。还得在 extensions.json 里正经注册一条记录才算数。教训:扩展的"安装"不只是把文件拷进去。

坑二:重启脚本把自己杀了。 实现"带调试端口重启宿主"命令时,脚本逻辑是:杀掉宿主进程 → 等 8 秒 → 带参拉起。结果脚本一杀宿主,自己也被连带终止——因为它是从宿主里启动的,和宿主在同一个 Windows Job Object 里,爹死了全家陪葬。换 Start-Process 也没用。最后用 WMI 的 Win32_Process.Create 拉起:父进程是 WmiPrvSE,彻底脱离宿主的进程树,这才活了下来。

坑三:"新建任务"按钮,点哪个有讲究。 任务面板顶部有个"新建任务"按钮,但它走的是繁琐路径:新建后还要搜索项目、选文件夹挂载。而每个项目分组行右侧还有一个小小的"新建任务"图标——一步创建,自动挂上该项目。轨道会话必须挂在项目下才能读到文件信箱,所以这个不起眼的分组行按钮才是正确入口。这种发现,坐在那里想方案是想不出来的,必须盯着真实界面看。

坑四:sid 去哪了? 点击新建按钮后,输入界面就绪了,但任务列表里没有新会话、也拿不到 sid。观察之后才理解了"草稿会话"机制:点击后先进入草稿态,首条消息真正发出后,会话才落库、sid 才存在。所以时序必须是"点击 → 等输入框聚焦 → 注入话术 → 发送 → 等新 sid 出现",顺序反了就永远拿不到 sid。

坑五:点不动的按钮,和会变脸的类名。 删除会话要走"更多菜单",但那个菜单按钮常态是 display:none,hover 才显示——CDP 按坐标点击,拿到的是 (0,0),点了个寂寞。反直觉的是:el.click() 这种合成点击,对 display:none 的元素照样能触发 React 的 onClick。于是整条删除链全部改用合成点击。另一个坑是确认弹窗:它的类名带构建哈希,今天的 dialog-Di866XR 明天可能就变了——最终全部改为按文本匹配("删除任务"菜单项、"确认删除"标题、弹窗内"删除"按钮),彻底不碰哈希类名。

验证:全端点跑通,多轨切换也没问题

坑填完之后,就是一条链一条链地验:

  • /health:CDP 连通性 + 轨道身份表 ✅
  • /new:分组行按钮建轨 → 草稿会话 → 首条话术注入发送 → sid 落库进表 ✅
  • /ping:切轨 + 读状态,来回切换任务名正确跟随 ✅
  • /dispatch:切轨 → 身份断言 → 注入转达话术 → 发送 ✅
  • /watch:轮询回执文件,收到格式完整的回执(裁决编号 + 自检字段)✅
  • /delete:菜单链 + 确认弹窗全自动点掉,轨道同步移出身份表 ✅

最后专门做了多轨切换测试:建两条轨道,交替 ping,两条会话的任务名随 sid 正确切换;在多轨状态下执行删除,身份表同步干净。收工后把联调期的 30 多个临时探针脚本、测试会话、信箱文件全部清理干净,正式探针只留两个,连同全部源码推上 GitHub。

至此,上一篇里那个"人肉邮差"的活——建轨、派活、等回执、删轨——这几段已经真的不用人干了。

一期的"手动触发版",手动指的是流程的起点和关键决策点,而不是让人手敲命令。实际体验是:在任意一个会话里说出"把这个任务拆开并行跑"之类的关键词,仲裁者 Skill 就被激活了。它会先判奠基阶段:契约没冻结、边界没定义、骨架没就位的,它自己动笔写奠基文档;奠基就绪的,直接按拆分判据输出决策建议。用户确认拆分方案后,仲裁者持笔写好转达单,然后自己去调编排器的 HTTP 接口:建轨、派发、监听回执,全程它自己完成。回执收齐,仲裁者独立实检、写快照、输出自检报告和收回评估。

整条"串行 → 并行 → 串行"的工作流走下来,人要做的只有决策:拆不拆(确认拆分建议)、收不收(确认收回决策)、出事了要不要接管(异常升级)。派活、盯梢、催收工这些体力活,一个都不用过手。

后续规划:先把链路跑可靠,再加智能

一期特意只做"手动触发版",这是定稿里明确的节奏——不要一期就做自动判定,先把 Skill + 插件 + 文件信箱这条链路跑可靠,再加智能。三期的演进路线:

期触发方式决策方式状态自检
一期(已跑通)手动仲裁者给建议 + 用户确认AI 自评报告
二期自动判定 + 建议式仲裁者自动评估,需用户确认插件采集指标
三期自动 + override仲裁者自动拆,用户可拦截同 + 自动交接

二期方向:拆分与收回的判定自动化——仲裁者自动评估拆分时机与收回时机,用户确认后执行;T-0 轨自动完成奠基任务;插件自动采集轨道健康指标。三期才是全自动,同时给用户留 override 拦截权。

另外两条顺路的演进:把首个宿主(Trae)的适配经验整理成适配层接口,未来平级扩展 Cursor 等其他宿主;DOM 锚点全部外置化,宿主大版本更新后重跑探针即可修复,不用动逻辑代码。

写在最后

从方案定稿到"编排器真的能自动建轨派活",整个一期实现的节奏比预想快了不少。回头看,联调那几场 DOM 毒打反而是最有价值的部分:所有假设都被真实界面修正了一遍,这些教训已经全部写进仓库的方案文档和锚点清单里——下一个适配其他宿主的人,不用再踩一遍。

这些坑大多不是某个产品特有的,而是"用 CDP 从外层驱动 Electron 应用 UI"这类工程的共性问题:进程树归属、草稿态时序、合成点击、哈希类名。希望这份记录对做类似事情的人有参考价值。

项目地址:https://github.com/YorickFin/ParallelAgent ,欢迎 Issue / PR 交流。

AI
AI编程
3
2
分享
操作
评论
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
🔥热门工具
朱雀AI检测朱雀AI检测
朱雀AI检测助手朱雀AI检测助手
LovartLovart
老鱼简历老鱼简历
WritePass官网WritePass官网
面多多面多多
CursorCursor
星月写作星月写作
零感AI零感AI
墨得问题墨得问题

目录

🔥 热门文章
1
离谱,DeepSeek 崩了 5 小时,大家却喊:梁圣恩情还不完??
450
2
B 站上 DeepSeek 闹鱼灾了,我发起《大肥鱼清除计划》!
410
3
DeepSeek 全新模型发布,性价比最高的一集!
410
4
自己学习ai,直接买cursor 的套餐,还是买gpt 或者claude 的套餐?
370
5
又一个国产版 Codex 神器,也来卷办公了!
340
6
Vibe Coding 实战:从零构建现代专业级 AI 搜索引擎
330
7
day3-如何写出一个高质量的 Skill(组内分享) 高质量 Skill 不是“一个调得很顺的巨型 Prompt”,而是一个可验证、可回归、可维护的能力包。 先定义“什么算好”,再实现“怎么做好”。评估体系先于 Skill 本身成型。 下面用“故障诊断 Markdown 转 YAML”作为例子,但方法是通用的。 --- 一、先想清楚:Skill 到底是什么 一个 Skill 至少包含四部分: 部分 作用 接口 输入什么、输出什么、边界在哪 流程 分几步做,每步的产物是什么 规则 硬约束、经验规则、失败模式 降级策略 不确定时怎么办,而不是硬编一个看似合理的结果 高质量 Skill 的共同点:职责单一、接口清晰、规则可定位、输出可验证。 反例:把几十条经验全塞进一个主 Prompt,改一条规则要重调整个 Prompt,评估时也不知道是哪条规则退化。 --- 二、核心方法:先建评估,再写 Skill 不要先写转换器再补测试。正确顺序是: 1. 定义输出契约:什么算合法、什么算合格; 2. 建金标准集:一小批人工认可“可放行”的样本; 3. 先写评估 Skill:让它在金标准集上跑出基线; 4. 再迭代生成 Skill:每次修改跑同一套评估,无退化且目标维度提升才算正向。 这就是评估驱动开发:评估是 Skill 的单元测试,金标准集是回归锚点。 --- 三、评估 Skill:三层门禁,逐层递进 前一层不过,后一层不跑。每层留可追溯证据。 第 1 层:确定性硬门禁 用解析器、Schema、校验器完成,不消耗模型成本。 · 输出可解析; · 必填字段齐全,类型/枚举合法; · 引用目标存在,无悬空引用、无不可达节点; · 关键路径至少有一条能到达预期出口。 不通过直接打回。 第 2 层:语义断言 用脚本 + 结构遍历检查“逻辑对不对”,仍然保持确定性。 通用检查项: · 覆盖率:源材料里的关键步骤、分支、条件,输出里是否都有对应? · 完整性:每个判断节点是否都有明确出口?有没有死胡同? · 可达性:每条路径是否都能到达预期终点?有没有无出口循环? · 顺序与依赖:有先后依赖的操作,是否保留了顺序?有没有被拍平成无序列表? 例子:故障诊断转换中,检查“每个判断项是否有是/否/异常出口”“每条路径是否能到根因”。 第 3 层:LLM-as-Judge 只处理解析器表达不了的维度:忠实度、完整性、可执行性。 但 Judge 会漂移,不能单独放行,必须建立在第 1、2 层之上。Judge 的 Prompt、rubric、模型版本都要版本化,换模型必须用金标准集重新校准。 通用 Judge 维度: 维度 问什么 忠实度 输出是否忠实源材料意图?有没有自行发明内容? 完整性 关键步骤、条件、证据是否保留?隐式知识有没有被压成空话? 收敛性 输出是否仍指向原目标,而不是发散? 可执行性 下游不依赖源材料能否直接使用? --- 四、金标准集:回归测试的锚点 不需要一开始就标注几百份。用已认可的样本当种子,扩到 15~30 份,覆盖失败模式而非随机抽样: · 完整正例:典型流程; · 边界/异常分支:异常路径、循环、前置失败回退; · 已知易错模式:实际踩过的坑; · 留出集:不参与调优,只用于最终验收,防过拟合。 金标准不需要完美,只需要当前标准下认可可放行。 回归指标:关键路径用 pass^k(k 次全过),稳定性用 pass@k。 --- 五、工程约束:让批量产出可重放 · 幂等:同输入 + 同 Skill 版本 + 同规则 → 输出一致,否则无法判断变好是 Skill 改了还是随机波动; · 隔离不阻断:单份失败进隔离队列,记录失败层和原因,不阻塞其余; · 版本绑定:规则、rubric、金标准集进 Git;每份报告绑定“源版本 + 生成 Skill 版本 + 评估 Skill 版本 + Judge 模型版本”; · 抽样人工复核:Judge 临界样本 + 易错模式,人工抽检结果反过来校准 rubric。 --- 六、Skill 本身怎么写 · SKILL.md 控制篇幅,写清:输入约定、输出契约、分步流程、硬规则、降级策略; · 经验规则放 references/ 或 rules/,按失败模式分类,不要全塞进主 Prompt; · 不确定时标 needs_review: true,不要硬编看似合理的结果; · 迭代由评估报告驱动:报告告诉你哪层挂了、哪类失败模式,你改对应规则文件,而不是漫无目的调 Prompt。 --- 七、落地顺序(不要反过来) 1. 固化输出契约:Schema + 结构约束; 2. 建金标准集:从已认可的 + 最易出错的样本开始; 3. 先写评估 Skill:跑出基线报告; 4. 再迭代生成 Skill:每次修改对比逐项通过率,无退化且目标提升才算正向; 5. 批量运行 + 隔离回放:失败进队列,结束后人工抽检; 6. 评估 Skill 自身版本化:换 Judge 模型必须重新校准。 --- 八、给组员的三条硬要求 1. 不许凭感觉说“变好了”:每次修改必须附评估报告对比,逐项通过率说话。 2. 不许跳过确定性门禁直接看 Judge 分数:前两层挂了,Judge 分数没有意义。 3. 不许把规则堆进主 Prompt:规则按失败模式分文件,评估报告要能定位到具体文件。 --- 一句话收尾 生成 Skill 决定“能不能做”,评估 Skill 决定“敢不敢用”。 先让评估体系站稳,再让生成器迭代。这样交付的不是一堆“看起来还行”的产出,而是一套可证明、可回归、可交接的 Skill 质量体系。
320
8
我的第一个出海产品!7 天 2 万
310
9
WorkBuddy 本地 API 桥 + dsh 插件:把你的 WorkBuddy 额度,变成手边随手可用的模型
310
10
什么是LLM
300