我如何在不支付一分钱 API 费用的情况下并行运行 6 个 LLM(Electron + DOM 注入)
Source: Dev.to
引言
说实话:现在仅凭单个 LLM 来解决复杂问题基本上就是一次掷硬币。我对日常工作流感到极度疲惫:
- 向 ChatGPT 提问 → 得到自信的答案。
- 把同样的问题粘贴到 Claude 进行事实核查 → 得到相矛盾的答案。
- 再让 Perplexity 来平衡。
我成了手动的 API 路由器,这让人筋疲力尽。
我想要一个 “同行评审” 系统,让 AI 之间相互校对,但出现了两个巨大的障碍:
- 成本 – 通过官方 API(GPT‑4o、Claude 3.5、DeepSeek 等)对每个查询运行 6 模型交叉验证循环,费用会迅速飙升。
- 延迟(瀑布效应) – 顺序串联这些调用意味着要等上几分钟才能得到答案。
于是我构建了 AI Council —— 一个本地桌面应用,完全绕过 API,利用它们的免费网页 UI 并行运行六个 AI。
架构:Electron 与 6 个 BrowserView
整个“API”其实就是 DOM 注入:解析 HTML,定位文本框,模拟键盘输入,并点击 Send 按钮。
绕过瀑布效应:Fan‑Out / Fan‑In
初稿生成
你提出一个问题。主 AI(例如 ChatGPT)生成第一稿。
Fan‑Out(并行评审)
应用将该稿件同时广播给另外五个 AI 面板,在所有六个 BrowserView 上同步点击 Submit 按钮。
Fan‑In(汇总)
应用监控所有窗口的 DOM。当它们全部停止生成内容后,提取文本,汇总反馈,并将结果送回主 AI。
最终输出
主 AI 根据同行评审的意见重写答案。
整个编排本质上就是一个巨大的 Promise.allSettled:
// Conceptual Fan‑out logic
async function runParallelReview(draft) {
const reviewers = [
claudeView,
geminiView,
deepseekView,
grokView,
perplexityView
];
// Fire them all at once
const reviewPromises = reviewers.map(view =>
injectPromptAndWaitForCompletion(view, `Review this draft: ${draft}`)
);
// Wait for all models to finish physically typing
const reviews = await Promise.allSettled(reviewPromises);
return compileReviews(reviews);
}真正的头疼事:管理 Web UI 状态
当没有干净的 API 响应时,如何判断 AI 是否“完成”输入?解决方案是监听 DOM 变动,检测输入指示器何时消失。
结果
如果你对 DOM 注入脚本或 Electron 多视图架构感兴趣,整个项目都是开源的。
前往仓库查看 → https://github.com/MinkyuTheBuilder/ai-council
欢迎 Fork、加星,或提交 issue 反馈 DOM 抓取逻辑。