Alma 拆解笔记:一个 AI 桌面应用都装了些什么
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 式体验”: 既负责模型、凭证和协议,也负责在本地真正把工具跑起来。
作者与项目来源
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
用于统一抽象不同模型的生成、流式输出与工具调用。
2.2 桌面本地能力(重点)
better-sqlite3、sqlite-vec[email protected]playwright@^1.57.0chromium-bidi@fugood/whisper.node
这一组依赖非常关键,它清楚地表明:Alma 不是“假装桌面”,而是真的把工具跑在本地。
2.3 文档与内容预览
PDF、Excel、Word、分词、图片尺寸、Emoji 等处理能力,用于多格式内容展示。
2.4 UI 与监控
Radix、framer-motion、sonner、PostHog、Sentry,构成现代 React 桌面 UI 与观测体系。
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-statusplaywright-installplaywright-install-status(实时进度事件)
这套机制的目的非常清晰:
为 Alma 的 WebFetch / WebSearch / 自动化抓取能力 提供一个可控、稳定、版本固定的 Chromium 内核。
因此:
应用启动阶段会调用 ra()尝试静默安装UI 中允许用户查看安装状态,或手动再次触发 只有 Playwright 浏览器准备好,后台的网页抓取、脚本执行能力才会真正启用
这也解释了为什么 Alma 必须是桌面应用: 这些能力在纯 Web 环境里几乎无法可靠实现。
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 桌面应用”这个方向上,它给出了一个结构完整、工程扎实、而且明显还能继续生长的实现样本。