← 资讯与洞察

把 91MB 装进客户电脑:我们的端应用为什么这样长

它看起来只是一个"装完就能聊天的窗口",实际上客户的 Windows 机器上多了一个 Node 运行时、一个智能体核心、一层本地反向代理和一套授权体系。这篇把设计取舍摊开——包括我们踩过的坑,和明确做不到的事。

先说清楚它是什么:一莲AI OpenClaw 是我们的端应用,定位是「本地智能体网关」——模型推理走云端,编排对话、读写文件、跑工具这些事留在客户自己的机器上。下面这些数字、机制和坑,全部来自我们自己的工程记录,没有一处是包装出来的形容词。

01它到底装了什么

下载下来是一个 91.2MB 的单文件 exe,没有别的安装依赖。点开之后,它在这台机器上落下的东西大致是这些:

组成形态为什么必须在本地
控制台界面pywebview + WebView2复用系统自带浏览器内核,界面能像网页一样迭代,但不需要用户装浏览器
Node 运行时内嵌 v22客户机器上装没装 Node、装的是第几版,我们控制不了,干脆自带
OpenClaw 核心Node 进程真正干活的智能体:读文件、调工具、维持多轮上下文
本地反向代理Python 进程统一出口,顺带做模型路径判定和配额闸门
授权与计费配置文件 + 云端校验一机一授权,凭设备指纹换 License
技能缓存本地 JSON已装技能离线可见,装完不用每次重新拉

装完占用的磁盘空间约 200MB,最低要求是 Windows 10 64 位、4GB 内存——推荐 8GB,因为 Node 进程加上界面壳并不轻。

一莲AI OpenClaw 控制台对话界面实拍:左侧为版本信息与对话/技能导航,中间为助手入口与四个建议问题,底部为模型选择与上下文占用
控制台实拍(v3.5.3 测试机)。左侧常驻 App / OpenClaw / Node 三个版本号,中间是对话入口,底部显示当前模型与上下文占用。截图未做美化,就是客户装完后看到的样子。

02为什么不干脆做个网页,非要塞到本地

这是我们被问得最多的问题,答案不是"本地更安全"这种口号,而是四条具体的、在真实客户场景里反复出现的原因。

  • 要碰客户自己的文件和工具。一个只会聊天的窗口,网页做得更好;但客户要的是"帮我把这个 Excel 里的重复行清掉""把这批发票按日期归到文件夹"。浏览器给不了这个权限,本地进程可以。
  • 不能假设网络一直好。网关、配置、技能缓存都在本地,网络抖动时界面不白屏、历史对话还在、装好的技能还能看见。
  • Key 和对话不该默认上云。对话历史存在本机安装目录里,API Key 用 Windows DPAPI 加密,只有本机账户能解。这不是营销话术,是把"能不上传就不上传"写成了默认行为。
  • 它得一直在。关掉窗口后最小化到系统托盘,网关继续跑;客户在手机上远程连回自己电脑时,靠的就是这个常驻进程。

代价也很直接:一个网页更新是推一次代码,一个端应用更新是每个客户都得升级一次。这就是为什么后面的版本与升级机制占了我们大量精力。

云端(我们托管) 网关转发 · 模型通道 Token 计费 · 配额 DeepSeek 推理服务 客户 Windows 机器 控制台界面 pywebview + WebView2 · 对话 / 技能 / 体检 / 计费 / 远程 JS 桥 · 93 个方法 ShellApi 界面能做的每件事,都要在这里有对应的方法 本地反向代理 proxy_server · 模型路径判定 · 配额闸 · SSE 64KB 分块透传 OpenClaw 核心 Node v22 内嵌 · 读文件 / 调工具 / 多轮上下文 HTTPS · 带 Token 本机磁盘 config(含加密的 Key)· logs · state · 技能缓存 · 对话历史——卸载即删,不上传
分层架构。界面本身不联网,所有请求都从本地反向代理出去并发;这条链路同时也是配额闸门的位置——Token 够不够、走哪个模型,在离开这台机器之前就判完了。

03一次安装,其实分两段

很多"一键安装"是把所有活都堆给一个安装器,出了错只能报一句"安装失败"。我们把它拆成两段:安装器只负责放文件,业务初始化交给程序自己。

安装器是 Inno Setup 的标准五步——协议、安装位置、准备、安装、完成,用户熟悉这套流程;EULA 和路径都在这一层收口。第一次启动控制台时,才进入真正的初始化:

01

选接入方式

云网关转发,或填自己的 DeepSeek Key。两个卡片,选完就定了后面的计费路径。

02

装配网关

按需拉取 Node 与 OpenClaw 核心,写配置、起进程、绑端口。

03

健康检查

探一次 /health,不通就重试并给出具体是哪一步没过。

04

打开对话

通过后直接进对话页,用户不需要再点任何东西。

之所以敢这么拆,是因为下载环节做了多源断点续传:Node 走 nodejs.org 与 npmmirror 双源,OpenClaw 走 npmjs 与 npmmirror 双源,先 HEAD 诊断哪个源通,失败自动切换,文件大小不对判为异常重下。安装界面上有 5 阶段指示器、实时速度和剩余时间,以及一行"当前在干什么"的子任务状态——客户看到的不是转圈,而是"正在从镜像源校验包"。

安装体验的分水岭不在成功路径,而在失败路径:客户断网、镜像挂了、包下到一半——这三种情况我们都要让界面说清楚"卡在哪一步、下一步会自己重试"。

端应用安装流程的设计原则

04双模式:省事和便宜,选一个

接入方式只有两种,差别不在功能,在钱和数据的路径:

项目云网关托管自备 Key
谁出推理我们的云端网关转发到 DeepSeek你的机器直连 DeepSeek 官方
怎么计费按 Token 用量扣平台余额,输入/输出分别计倍率按 DeepSeek 官方价直接结算,不经过我们
数据路径对话经我们的网关转发对话只经过 DeepSeek
适合谁不想管 Key、量不大、要一张账单的人已有 Key、调用量大、对路径敏感的人
切换成本两种模式可以在控制台里随时切换,切换后网关自动重启生效,已装技能和历史对话不受影响

托管模式下的"配额闸"放在本地反向代理这一层:请求还没离开这台机器,就先判断余额够不够、这个授权允许走哪个模型。余额不足时返回的是一句明确的"算力 Token 不足",而不是一个 500 或者一段莫名其妙的截断。

托管模式 你的端应用 平台网关 DeepSeek 推理 对话经平台转发,按 Token 扣余额 自备 Key 模式 你的端应用 DeepSeek 官方 对话直连官方,按官方价结算,不消耗平台 Token 平台只负责授权与版本,不进数据路径
两条数据路径。同一套界面、同一套技能,切换的只是请求从哪儿出去。托管模式的好处是账单只有一张,代价是多一跳;自备 Key 少一跳,代价是自己管 Key 和额度。

05三个真正吃掉时间的工程问题

功能列表写出来是一页纸,但下面这三件事各花掉我们不止一个版本的时间,而且都是"用户不说就发现不了"的类型。

长回复看起来卡死

症状是客户问一个需要长回答的问题,界面停在半空,等十几秒才一次性吐出来一大段。根因有两层:一是本地代理拿了全量响应再回吐,二是 LLM 请求的默认超时只有 30 秒,长回答直接被掐断。做法是把超时提到 900 秒,并把 SSE 改成边收边发、64KB 分块透传——流是流,不是攒完再放。非 LLM 的小接口维持原来的 30 秒,不让整条链路一起变慢。

每次安装都在重装核心

OpenClaw 的版本号输出带前缀和构建后缀(形如 OpenClaw 2026.7.1-2 (0790d9f)),和官方源里的纯版本号永远不相等——于是每次启动都判定"版本不一致",重新装一遍核心,客户看到的就是装得慢、流量还大。修法是加一个版本规范化函数,剥掉前缀后缀再比较,同版本就正确跳过。

重装一次,就被当成新设备

一机一授权最怕误判。早期指纹里掺了 CPU 序列号和磁盘序列号,这两项通过 PowerShell 的 WMI 查询拿,偏偏在权限受限或超时的机器上会失败——同一台机器每次读到的值不一样,重装后被判成新设备,客户就得再买一份。现在只保留三个跨卸载重装稳定的因子:MAC、主机名、MachineGuid,再额外用 MAC 与 MachineGuid 的组合生成一个"机器锚点"上报,服务端据此把重装后的新指纹并回原授权。

设备指纹这个设计,出发点不该是"尽量多抓特征",而是"抓到的特征必须每次都一样"。抓到会漂移的特征,等于给自己制造售后。

一次因为指纹漂移导致的重复购买投诉之后

06加固做到什么程度,边界在哪里

端应用会被拆、会被看源码,这是默认前提。所以我们做的是提高成本,不是承诺不可破解:Python 侧的核心逻辑做混淆,产出 .obf 与 secure_info.json 随包分发;构建流水线里这一步和打包绑定,绕过它打出来的包会直接起不来。这挡得住随手改两行代码的人,挡不住愿意花几周的人。

另外三件与数据有关的事实,写在这里方便核对:

  • 对话与日志默认只在本机。日志不自动上传,除非客户主动点"提交诊断报告";卸载时本地数据一并删除。
  • API Key 用 Windows DPAPI 加密。只有本机对应的账户能解密,配置文件被拷走也解不出明文。
  • 升级不清数据。覆盖安装保留 config、logs、state 三处,客户的授权、历史对话和已装技能不会被一次升级抹掉。

能给的 / 不能给的

  • 能给的:一个 exe 装完就能对话的本地环境,含运行时、核心、界面、授权与计费一整套。
  • 能给的:可查的安装过程——5 阶段指示、速度与剩余时间、失败自动换源重试。
  • 能给的:双模式随时切换,以及把 Key 与对话留在本机的默认行为。
  • 不能给的:模型能力本身。我们不自研模型,推理能力取决于接进来的 DeepSeek 系列。
  • 不能给的:完全离线的安装。首次安装要联网拉运行时与核心,断网装不了;装完之后本地界面与已装技能可离线查看。
  • 不能给的:跨平台。目前只有 Windows 10 64 位及以上,macOS 与 Linux 没有对应版本。
  • 不能给的:回答正确性的保证。它能帮你把活干完,但不能替你判断内容对不对。

07版本这件事,我们做得很死板

端应用发布有个反复踩过的坑:同一个版本号发两次,客户的升级检测就乱了。现在的规则是每次打包自动递增,版本号只有一个真源,打包脚本先 bump 再走后续五步(生成裁剪版、生成版本资源、混淆、PyInstaller、Inno 打包),任何一步绕过都会导致状态不同步。

发布节奏上,控制台顶部出现新版本提示时可以一键升级;也可以不管它,托盘里的后台流程会挑空闲时更新。升级失败不会把原来的版本弄坏——旧版本的目录留在原地,下次启动仍然可用。

想先看看它长什么样

下载页有 Windows 版安装包与系统要求,定价页写清了安装费与 Token 的计费方式,文档中心有安装教程与常见问题。装之前建议先看一眼系统要求,别在 4GB 内存的老机器上折腾。

前往下载页

定价与计费说明 | 文档中心 | 产品总览

事实来源

产品事实与工程细节:端应用工程 README(版本基线 3.5.8)、CHANGELOG(3.2.9 / 2.1.0 / 1.17.4 三项变更记录)、官网文本同步包 v3.0.0。

控制台截图:取自我们自己的 v3.5.3 测试机实拍,当前发布版为 3.6.8;截图仅裁边,未做美化与内容修改。

安装包体积:05_Output 目录下 3.6.4–3.6.8 各版本产物实测,均为 91.2MB。

讨论

加载中…

匿名即可发言,昵称留空会显示为“匿名访客”。评论按楼层顺序排列,每条都可以回复;站长会把有结论的回复标为「已采纳」。不支持链接与推广内容。在微信里打开本文可选用微信身份,显示你的头像与昵称。

0 / 400 字 · 每 IP 每小时 4 条

正在读取评论…