架构技术评论

Alma 拆解笔记:一个 AI 桌面应用都装了些什么

Image
本文基于 0.0.170 版本拆解分析,可能存在错误,仅供参考

Alma 是什么?

Alma 是一款桌面端的 AI Provider 编排与管理应用。最近在网上广受好评,作者也是非常活跃。开发节奏也十分快,发版如雨。我最近也在各种玩耍这个软件,深感作者技术功底深厚。

在官网(https://alma.now/)上,它给自己的定位非常直接:

Elegant AI ProviderOrchestration

换句话说,Alma 并不打算只做一个“聊天窗口”,而是希望成为一个统一调度、组合和运行多种 AI 能力的桌面工作台。

从官网介绍和实际代码结构来看,Alma 重点覆盖了这些方向:

  • 多 AI Provider 的统一管理(OpenAI、Anthropic、Google Gemini、DeepSeek 以及自定义 API)
  • 以对话为核心的 UI,支持 Markdown、代码高亮、流式输出
  • Memory 与上下文管理,并在 UI 中可视化
  • WebFetch / WebSearch 等基于浏览器的能力
  • Prompt Apps 与 Skills 的组合式扩展
  • 大量本地能力的直接集成,而不是“全靠云”

整体感觉更像一个 “AI 能力编排层 + 桌面 IDE 式体验”: 既负责模型、凭证和协议,也负责在本地真正把工具跑起来。

Image

作者与项目来源

Alma 由 yetone 开发并维护,项目为闭源软件,似乎源码托管在 GitHub(单纯从配置文件中猜测):https://github.com/yetone/alma.git 作者的GitHub地址 https://github.com/yetone ,有多个高星项目,可见作者技术热情浓厚,非常值得广大开发者学习。

回到Alma。从代码规模、工程组织和持续版本演进来看,这并不是一个一次性 Demo,而是一个长期演进的桌面 AI 工程。 作者在以下方面体现出非常扎实的工程取向:

  • Electron / macOS 桌面应用架构
  • Node.js / TypeScript 工程化
  • 多 AI Provider 的统一抽象
  • 本地工具集成(PTY、Playwright、Whisper)
  • MCP / ACP 等新兴模型协议
  • OAuth / PKCE 的完整授权生命周期

1. 外壳与发布信息

  • Info.plist 显示 Bundle ID 为 com.yetone.alma,版本 0.0.170,最低系统 macOS 12.0,主类为 AtomApplication,明确属于 Electron / Atom 系壳。
  • 启用了 NSAllowsArbitraryLoads 以及本地网络访问豁免,说明应用需要与多种模型服务、代理或本地服务自由通信。
  • 自动更新配置位于 Resources/app-update.yml,更新源指向自建 feed:https://updates.alma.now/,意味着官方维护了完整的更新发布后台。
  • 核心逻辑封装在 app.asar 中,解包后是典型的 Electron 结构:out/、node_modules/、package.json。

2. 项目结构与依赖

package.json 将 Alma 定义为 “AI Provider Management Desktop App”,使用 pnpm 管理依赖,并对 Electron 原生模块启用了 onlyBuiltDependencies。 同时通过 overrides 固定了 node-abi 版本,以匹配内置的 node-pty beta。

依赖大体可以分为四类:

2.1 AI Provider SDK

  • @ai-sdk/*(openai / anthropic / azure / google / deepseek / openrouter)
  • @ai-sdk/provider
  • @mcpc-tech/acp-ai-provider
  • @aihubmix/ai-sdk-provider

用于统一抽象不同模型的生成、流式输出与工具调用。

Image

2.2 桌面本地能力(重点)

  • better-sqlite3、sqlite-vec
  • [email protected]
  • playwright@^1.57.0
  • chromium-bidi
  • @fugood/whisper.node

这一组依赖非常关键,它清楚地表明:Alma 不是“假装桌面”,而是真的把工具跑在本地。

2.3 文档与内容预览

PDF、Excel、Word、分词、图片尺寸、Emoji 等处理能力,用于多格式内容展示。

2.4 UI 与监控

Radix、framer-motion、sonner、PostHog、Sentry,构成现代 React 桌面 UI 与观测体系。



Image

3. 主进程(out/main/index.js)深入解析

主进程是 Alma 的“控制塔”,把系统能力、本地服务、数据库和 AI Provider 全部集中在一起。

3.1 环境准备与依赖注入

  • Electron 核心模块加载
  • 使用 fix-path 修复 macOS 下 CLI 环境
  • 启动本地 Express API + WebSocket server
  • 使用 zod 做接口 Schema 校验
  • 初始化 Sentry 与 AI Tool middleware

3.2 数据库层(Drizzle + SQLite)

  • 覆盖 Prompt、Workspace、Chat、Provider、Skill、MCP、Theme 等核心表
  • 0.0.170 中 Provider 表新增订阅类型(如 claude-subscription)及配置字段
  • 使用 Drizzle relations 显式表达复杂 UI 关系

3.3 AI Provider / 工具体系

  • 使用 ai 包统一不同模型的文本与流式输出
  • 集成 ACP 工具体系,支持 UI tool stream
  • 内建 Proxy + Retry + Timeout,支持 HTTP / SOCKS5

3.4 本地 API + MCP / OAuth

  • 本地 REST API + WebSocket 推送
  • 完整 MCP OAuth 生命周期(授权、刷新、撤销)
  • Claude Subscription 授权流程内置在 IPC 中

3.5 Playwright:不是“顺带”,而是明确的基础设施

Playwright 在 Alma 中是明确存在、明确使用、明确管理生命周期的,而不是一个未来预留选项。

首先是依赖层面:

  • package.json 中直接声明了 "playwright": "^1.57.0"
  • 与 node-pty、chromium-bidi 放在同一组“桌面自动化依赖”中
  • 这意味着 打包阶段就已经把 Playwright 安装进应用(而不是运行时 npm install)

其次是主进程中的安装与状态管理逻辑:

  • 主进程维护了一套完整的 Playwright 安装检测流程:

    • 检查 ~/Library/Caches/ms-playwright/(macOS)或 %LOCALAPPDATA%/ms-playwright
    • 判断是否已存在 chromium-* 目录
  • 如果未安装:

    • 通过 playwright-core/cli.js install chromium 拉取浏览器内核
    • 安装状态记录在 ta = { installed, installing, progress }
  • 通过 IPC 暴露完整控制面:

    • playwright-get-status
    • playwright-install
    • playwright-install-status(实时进度事件)

这套机制的目的非常清晰:

为 Alma 的 WebFetch / WebSearch / 自动化抓取能力 提供一个可控、稳定、版本固定的 Chromium 内核。

因此:

  • 应用启动阶段会调用 ra() 尝试静默安装
  • UI 中允许用户查看安装状态,或手动再次触发
  • 只有 Playwright 浏览器准备好,后台的网页抓取、脚本执行能力才会真正启用

这也解释了为什么 Alma 必须是桌面应用: 这些能力在纯 Web 环境里几乎无法可靠实现。

Image


3.6 系统能力与 IPC 接口

IPC 覆盖几乎所有桌面能力:

  • 多窗口管理
  • 全局与动态快捷键
  • Clipboard 与文件系统
  • 麦克风、Whisper、Playwright 状态
  • 自动更新
  • Copilot / Claude token 管理
  • MCP OAuth
  • WebFetch / WebSearch 调试窗口

4. 渲染层(React + Vite)

  • React + Vite + SWR + jotai
  • 一个聚合式 Context 作为 UI 逻辑总线
  • 聊天、工具管理、多窗口控制
  • 全格式内容预览
  • Radix UI + 动画
  • PostHog / Sentry 监控

所有能力统一通过 preload 注入的 IPC 调用主进程。


5. 开发与调试方式

  • 支持 Vite DevServer 热更新
  • TypeScript + pnpm workspaces
  • 官方 GitHub 源码比 bundle 更适合阅读与二次开发

6. 安全、隐私与系统权限

  • 请求麦克风、蓝牙、摄像头权限
  • 支持代理配置
  • 遥测(Sentry / PostHog)需按部署场景评估
  • MCP OAuth 使用 PKCE,支持 token revoke / refresh

7. 总结

Alma 0.0.170 展现的是一种非常“实在”的桌面 AI 应用形态:

  • 上层:多窗口、对话驱动的 UI
  • 中层:Provider、Prompt、Skill、MCP 的统一编排
  • 底层:真实存在的本地基础设施——数据库、终端、Playwright Chromium、语音模型

结合官网定位与实际工程实现来看,Alma 更像一个AI 能力的调度与执行平台,而不仅是一个聊天工具。 在“AI 桌面应用”这个方向上,它给出了一个结构完整、工程扎实、而且明显还能继续生长的实现样本。