技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

一个 UI 吞下十二种 AI 能力:Dooy/chatgpt-web-midjourney-proxy 架构拆解

项目背景与痛点

AI 能力的爆发期呈现出一种尴尬的“碎片化”:文生图在 Midjourney 的 Discord 里,视频在 Luma 和 Runway 的网页里,音乐在 Suno 里,对话在 ChatGPT 里。对个人开发者而言,这意味着十几个书签、十几套密钥、十几种交互心智模型;对企业而言,这意味着密钥散落在浏览器端、数据流向无法审计、模型供应商一换就得重做前端。

早期的 chatgpt-web 类项目(包括本项目最初的血缘)解决的是“把 ChatGPT 私有化部署到自己的服务器上”。但当模型从单一走向多元、从同步走向异步时,那套只面向 chat completion 的架构就撑不住了。这个项目的核心命题由此变得清晰:用一套 UI 抽象、一个消息流模型,把对话、绘图、视频、音乐、实时语音这五类截然不同的交互范式收敛到同一个会话界面里,并且同时覆盖 Web / PWA / 桌面三端。

它要解决的不是“能不能调用某个模型”,而是“调用模型这件事能不能被统一建模”。

核心技术揭秘

从代码组织方式看,前端是 Vue 3 + Vite + TypeScript 的现代组合式架构,状态用 Pinia 切分(会话、配置、任务、密钥),消息渲染走组件化的“按类型分发”。后端则是一个轻量的 Node 代理层,承担三件事:密钥托管、跨域收敛、协议转发。桌面端与 PWA 复用同一份 Web 构建产物,只是换了壳层与存储适配。

真正的技术难点不在前端框架,而在统一抽象层。项目把一切能力建模为“会话 — 消息 — 任务”三元结构:

  • 对话类(ChatGPT / GPTs / Realtime)是同步流式,走 SSE,边生成边追加;
  • 生成类(MJ / Suno / Luma / Flux / Ideogram / Pika)是异步长任务,提交后拿到 taskId,靠轮询或 WebSocket 回推进度;
  • 两类结果最终写入同一个 Message 模型,靠 contentType 字段(text / image / video / audio / progress)决定渲染组件。

这意味着前端必须内建一个任务调度器:带退避的轮询、并发上限、刷新后的任务恢复(把 taskId 持久化到 IndexedDB,重新挂载时续查)。这是很多同类项目偷懒跳过的部分,也是它体验差异的来源。

graph TD A[用户输入(模型选择 + 提示词)] --> B{"能力类型判定"} B -->|"对话 / GPTs / Realtime"| C[OpenAI 兼容接口] B -->|"绘图 / Midjourney"| D[MJ Proxy 服务] B -->|"视频 / 音乐生成"| E[各家任务提交接口] C --> F[SSE 流式增量] D --> G[WebSocket 进度回推] E --> H[taskId 轮询与退避] F --> I[统一消息渲染层] G --> I H --> I[统一消息渲染层] I --> J[IndexedDB 会话持久化] J --> K[Web / PWA / 桌面壳]

另一处设计取舍值得注意:Midjourney 并不直连,而是走 midjourney-proxy 这类中间服务,再由它桥接 Discord。这是被动选择也是明智选择——Discord 的交互协议不稳定、账号风控严苛,把脏活隔离在代理层,主项目只消费标准化的 /mj/submit、/mj/task/:id/fetch 接口,前端就永远不用知道 Discord 的存在。同理,Suno、Luma 各家 API 也被包装成“提交—查询”的两段式,用同一套适配器模式收敛。

功能亮点与差异

第一,UI 一致性本身就是产品力。 LobeChat 走插件生态、NextChat 走极简对话,而这个项目选择了“内置适配”的重路线:用户不需要理解 MJ 是轮询、Realtime 是 WebSocket、Suno 是任务队列,界面始终是那个输入框 + 消息流。这种“抹平协议差异”的体验,代价是适配器维护成本极高。

第二,多端同构。 PWA 负责移动端装应用,桌面壳负责本地文件与系统托盘,Web 负责开箱即用,一份代码三处落地,对私有化部署场景很实用。

第三,密钥与路由解耦。 后端代理层让 API Key 永不落到浏览器,同时支持通过 baseURL + 模型映射 切换上游(配合 one-api / new-api 网关可做多供应商分流与额度控制)。

应用场景与落地建议

适合:个人或小团队的 AI 聚合工作台、企业内部工具门户、面向客户的演示 Demo、需要隐藏密钥的私有化部署。不适合:直接拿来做多租户 SaaS——它缺少配额、审计、租户隔离,这些应该交给网关层。

上生产前务必注意几点:反向代理要关掉 SSE 缓冲(Nginx proxy_buffering off,并放开 X-Accel-Buffering),否则流式会变成“一次性吐出”;WebSocket 需要正确升级;MJ 依赖第三方代理服务,稳定性和合规性是外部风险,要有降级预案;长任务务必做前端恢复与去重,避免刷新后任务“失联”;模型更新节奏极快,建议锁定版本并保持与上游的同步观察。

综合评价

优点:抽象层次设计到位,把异构能力收敛为同构消息流;多端覆盖完整;密钥治理思路正确;对异步任务的处理比多数同类项目认真。

缺点:适配器是重资产,模型一多,维护成本呈线性上涨;前端状态机在长任务并发时容易变复杂;对第三方代理服务的强依赖削弱了自主可控性;代码层面的工程规范与测试覆盖,相较 LobeChat 这类社区项目仍有差距。

一句话总结:它不是最强的单点工具,而是把“多模型”这件麻烦事做成了一个界面——如果你的痛点是“切换”,它值得一试;如果你的痛点是“规模化治理”,请再叠一层网关。

关于

GitHub 原始描述(英文)

One UI is all done with chatgpt web, midjourney, gpts,suno,luma,runway,viggle,flux,ideogram,realtime,pika,udio; Simultaneous support Web / PWA / Linux / Win / MacOS platform

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
10036
价值分
4560
活跃状态
活跃

语言占比

Batchfile
CSS
Dockerfile
HTML
JavaScript
Less
Rust
Shell
TypeScript
Vue

Release