本地优先的中英混合智能输入系统:Standalone 后端、移动 PWA、Android 系统输入法与 Rime 集成。
当前版本:v0.1.0(master 含未发布修复)。 当前 master 通过 216 项 Deno/PWA 自动化测试与 92 项 Android 单元测试,并由 GitHub Actions CI 持续验证;v0.1.0 发布时的冻结验收基线(172 + 55)与交付状态
READY_WITH_LIMITATIONS见验收报告, 之后的变更见 CHANGELOG。
LIME 是一个本地优先的多模式输入服务:它保留原有大模型辅助中文拼音, 并提供不依赖云服务的英文候选和中英混合候选。客户端通过统一 API 使用服务, 目前包括桌面 Rime、移动 PWA 和 Android 系统输入法工程;iOS 原生键盘仍是 条件交付方案。
本仓库基于 xushengfeng/lime 的
fb1ebdbe0744766a7a7395f218d1305d2e920664 基线继续开发,并保留上游 Git
历史。主要扩展包括英文/混输、移动 PWA、Android IME、会话隔离、安全加固和
可复核的 Standalone 交付。
项目不会自动下载 GGUF,也不会把按键发送到云端。仓库当前没有 GGUF, 因此英文功能可完整使用,中文会在本地模型不可用时降级到随项目已有的拼音字典。
Important
服务默认只监听 127.0.0.1。要让手机通过局域网访问,必须同时显式设置
LIME_HOST 和 LIME_ALLOW_LAN=true,配置认证、CORS allowlist,并用 HTTPS
反向代理提供可信传输。不要把服务直接暴露到公网。
| 组件 | 当前能力 | 状态 |
|---|---|---|
| Standalone 后端 | 中英词典候选、混输、会话隔离、认证、PWA 静态服务 | 可直接交付 |
| 移动 PWA | 触控 QWERTY、中英界面、三种模式、Service Worker | 已构建并通过 Chrome 验收 |
| Android IME | 原生 InputMethodService、候选栏、设置与敏感字段保护 |
debug APK 可安装验收 |
| Rime | zh / en / mixed Schema 与 HiAE bridge |
静态及固定向量验证通过 |
| 本地 GGUF | 可选中文与英文模型 adapter | 仓库不附模型,未纳入默认交付 |
| iOS Keyboard Extension | 设计与验收计划 | 尚未实现 |
flowchart LR
R["Rime"] --> API["LIME HTTP API"]
P["移动 PWA"] --> API
A["Android IME"] --> API
API --> S["认证、Session、限流与推理调度"]
S --> Z["中文拼音词典 / 可选 GGUF"]
S --> E["英文 Hunspell / 纠错 / 下一词"]
Z --> M["中英混合候选排序"]
E --> M
| 输入模式 | 行为 |
|---|---|
zh |
中文拼音;优先本地 GGUF,缺失时使用字典降级 |
en |
英文原文、排序前缀补全、拼写纠错、会话内下一词预测 |
mixed |
合并中文与英文来源,跨来源去重并稳定排序 |
输入模式与界面语言是两套独立状态。PWA 的界面语言支持 zh-CN 和
en-US:中文界面可以选择 en,英文界面也可以选择 zh。旧 API 请求省略 mode
时始终按 zh 处理。
英文引擎默认使用本地 Hunspell stems,不需要 GGUF。本地 LIME/GGUF adapter
已经通过 EnglishCompletionSource 接入默认链路,但只有显式设置
LIME_ENABLE_ENGLISH_LLM=true 才会懒加载模型;默认关闭。确定性 mock 覆盖
无模型测试。/capabilities 中的 englishCompletionEnabled 指词典前缀补全,
localLlmEnglishRequested 表示本进程是否显式请求本地 LLM 英文候选,
localLlmEnglishEnabled 还要求中文运行时已经成功加载本地模型。
无需自行编译时,请从 GitHub Releases 下载:
lime-delivery.zip:完整 Windows Standalone 系统,包含 EXE、PWA、Rime helper、英文词典、Android debug APK 和验收文档;lime-delivery.zip.sha256:ZIP 的独立 SHA-256 sidecar;LimeAndroidIme-0.1.0-debug.apk:便于 Android 受控安装验收的独立副本。
每个 Release 的精确 SHA-256 以同版本 sidecar 和发布说明为准。执行任何脚本
前先核对 sidecar。源码仓库刻意忽略 release/、APK、模型、密钥和构建缓存;
可执行交付物通过 GitHub Release 分发,不进入 Git 历史。
正式 Standalone 交付仍是一套可离线运行的独立 EXE 完整系统。接收方解压并
完成归档校验后,唯一受支持的启动顺序是:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\start.ps1setup.ps1 生成或复核受 ACL 保护的 key.txt;start.ps1 在每次启动前核对
外置英文词典 assets/english/en_US.dic 的普通文件属性、大小与 SHA-256,再 启动
server/lime-server.exe。中文拼音词典仍嵌入 EXE。把英文词典作为随包
文件不会改变独立交付方案:它和 EXE、PWA、Android APK 一起受 manifest.json 与
SHA256SUMS.txt 保护,也不需要联网下载。
不要双击或直接执行 server/lime-server.exe。正式入口负责设置密钥、词典路径
和回环监听等运行环境;绕过入口不属于已验收用法。随包 Deno 2.9.3 仅供 Rime HiAE
helper 使用,主服务不依赖目标机安装 Deno、Node.js 或 pnpm。完整验收与
解压前校验流程见交付文档。
Vite 7 要求 Node.js ^20.19.0 或 >=22.12.0;以下命令通过 npx 精确锁定
Deno 2.9.3,避免最新版漂移。PWA 构建另用 pnpm,本机验证版本为
11.9.0。在已有 checkout 中执行:
git clone https://github.com/VictorMaxWang/lime-ai-ime.git
Set-Location -LiteralPath '.\lime-ai-ime'
git remote add upstream https://github.com/xushengfeng/lime.git
$repo = Resolve-Path -LiteralPath '.'
Set-Location -LiteralPath $repo
npx --yes deno@2.9.3 install --frozen生成认证密钥。命令只显示一次明文密钥;key.txt 保存其 SHA-256 值,但该值 同时是
HiAE 的密钥材料,也必须当作敏感文件保护:
npx --yes deno@2.9.3 run -A key.ts如需使用 PWA,先构建静态资源:
Push-Location -LiteralPath '.\interface'
try {
pnpm install --frozen-lockfile
pnpm run typecheck:pwa
pnpm run build
} finally {
Pop-Location
}启动服务:
npx --yes deno@2.9.3 run -A server.ts默认地址为 http://127.0.0.1:5000。健康和能力端点分别是 /health 与
/capabilities;构建 PWA 后移动页面是 http://127.0.0.1:5000/mobile.html。
英文、API 测试和字典中文降级都不要求模型。若要启用原有大模型辅助中文,
请自行取得与授权相符的 Qwen3-0.6B-IQ4_XS.gguf,默认放置为仓库同级路径:
..\Qwen3-0.6B-GGUF\Qwen3-0.6B-IQ4_XS.gguf
也可在启动前设置路径,或复制 config.ts 为 user_config.ts 并通过
initLIME({ modelPath }) 指定;显式函数参数优先于环境变量:
$env:LIME_MODEL_PATH = 'D:\Models\Qwen3-0.6B-IQ4_XS.gguf'不要把大型模型提交进 Git;本任务没有下载、加载或实测 GGUF。 如需让同一个本地模型同时尝试英文候选,在模型路径配置完成后、启动前显式设置:
$env:LIME_ENABLE_ENGLISH_LLM = 'true'不要把密钥放进 URL。下面仅适用于本机可信 HTTP 调试:
$headers = @{
Authorization = 'Bearer <刚生成的密钥>'
'Content-Type' = 'application/json'
}
$body = @{
keys = 'hel'
mode = 'en'
clientId = 'powershell-client'
sessionId = 'powershell-session'
requestId = 'request-1'
maxCandidates = 8
} | ConvertTo-Json
Invoke-RestMethod `
-Method Post `
-Uri 'http://127.0.0.1:5000/api/candidates' `
-Headers $headers `
-Body $body选词后向 /api/commit 提交 commitText。完整 DTO、旧端点、错误码、会话语义 和
HiAE 格式见 API 文档。
推荐让同机 HTTPS 反向代理访问回环服务;确实需要后端监听 LAN 时,必须完成 以下全部步骤:
- 已运行
key.ts,客户端使用 bearer 或 HiAE 认证。 - HTTPS 反向代理使用受客户端信任的证书;HiAE 不能替代 TLS。
- 显式允许 PWA 的精确 HTTPS origin,不使用
*。 - 同时显式打开非回环监听和 LAN 开关。
$env:LIME_HOST = '0.0.0.0'
$env:LIME_ALLOW_LAN = 'true'
$env:LIME_ALLOWED_ORIGINS = 'https://lime.example.lan'
$env:LIME_PORT = '5000'
npx --yes deno@2.9.3 run -A server.ts服务不会自动修改 Windows 防火墙、配置证书或建立公网映射。关闭终端即可撤销 本进程环境变量;持久化配置前先阅读安全文档。
复制 rime/ 下的 Schema 和 lua/ 文件到用户 Rime 配置目录,并在
default.custom.yaml 中加入需要的方案:
patch:
schema_list/+:
- schema: llm
- schema: llm_en
- schema: llm_mixed三个方案分别固定发送 zh、en、mixed。Rime 进程通过环境变量读取
LIME_SERVER_URL、LIME_API_KEY 和 LIME_HIAE_PAYLOAD,配置文件内不再
硬编码密钥或绝对路径。部署、HiAE、外部 curl/Deno 依赖和失败降级见
Rime 文档。
打开 /mobile.html 后可使用触控 QWERTY、三种输入模式和双语界面,并可在
满足浏览器安全条件时安装到主屏幕。PWA 是一个移动输入页面,不是 Android 或 iOS
的系统全局键盘。手机接入、安全存储和构建验证见
PWA 文档。
Android 客户端是独立的 Kotlin InputMethodService,不在手机中运行 GGUF,
也不依赖系统 curl。当前 checkout 已包含 Gradle Wrapper;本机使用 Microsoft
OpenJDK 17、Gradle 8.9、Android SDK/Build-Tools 35 和 API 35
模拟器完成构建与安装验收:
Set-Location -LiteralPath '.\android'
.\gradlew.bat testDebugUnitTest
.\gradlew.bat lintDebug
.\gradlew.bat assembleDebug
adb install -r '.\app\build\outputs\apk\debug\app-debug.apk'当前 master 的 Gradle 单元测试为 92 项(26 个 suite)全部通过、lint 为
0 issues,由 CI 与本机 JDK 17 双重验证(v0.1.0 验收基线为 55/55)。
v0.1.0 的 debug APK SHA-256 为
E3265FA084436C4DCC1E451974074BA0B75154BE091E01663F28BA041B2B29D0,已在 API
35 x86_64 模拟器上真实安装,并通过输入法列出、启用、设为默认及
输入服务绑定检查;master 上的后续改动尚未重新打包验收 APK。该 APK 使用 Android debug 证书,适合验收和受控安装;
app-release-unsigned.apk 仍未生产签名,不能当作商店发布包。
工程设置、安全策略及完整证据以
Android 文档和测试记录为准。
- 所有候选、提交和会话写接口默认要求认证。
- bearer 兼容旧客户端,但只能在 localhost 或 HTTPS 下使用。
- Rime 默认使用
hiae-v1加密请求与响应;服务端规范化 Base64URL nonce 后做 有界重放防护,等价编码不能绕过缓存。 - HiAE 使用共享密钥保护正文,但不隐藏网络元数据、不提供证书式服务器身份, 且兼容版本使用空 AAD,因此仍必须优先使用 HTTPS。
- 新 PWA 只把凭据放在内存或本标签页
sessionStorage,并绑定规范化服务 URL;切换服务地址不会复用旧 bearer。兼容的passwdquery 会在读取后从 地址栏移除。URL 中的?server=参数不再静默接管服务地址:PWA 会打开 服务设置对话框等待显式确认,旧页面需要通过 confirm 确认;确认之前不向 该地址发送任何请求。既有 demo/statistics 页面也复用同一迁移边界和 LAN endpoint policy;即使服务 URL 无效、被拒绝或连接失败,也会先清 query secret。它们 仍是旧界面,不具备移动输入状态机或 PWA 安装能力。
详见安全文档。
四条验证命令已收敛为 deno task(定义见 deno.json,与旧的完整命令等价):
npx --yes deno@2.9.3 task test
npx --yes deno@2.9.3 task check
npx --yes deno@2.9.3 task lint
npx --yes deno@2.9.3 task bench真实命令结果、mock/真实模型边界和未执行平台见 测试记录与性能记录。
仓库已配置 GitHub Actions CI(.github/workflows/ci.yml):每次 push 与
pull request 会在干净 runner 上重跑 Deno lint/check/test、PWA
typecheck/build 和 Android testDebugUnitTest/lintDebug 三组 job,持续
验证代替一次性本机快照。两个 ignored 的 Deno 测试仍要求真实 GGUF,属预期。
- 仓库中没有 GGUF,未执行真实模型 smoke test;中文当前可字典降级。
- 本地英文 LLM adapter 默认关闭;真实 GGUF 路径没有实测,词典也没有伪造词频。
- PWA 在页面中保留完整正文,但发给服务端的权威 replace 快照只取不切断 UTF-16 代理对的末尾 8,192 code units,以符合 API 上限并同步自身删除/撤销; 服务默认也只保留这一安全尾部。每次 PWA reload 会使用新 session,旧 session 为避免误伤复制标签页而留给 TTL/LRU 回收。Rime、旧客户端以及宿主应用外部 发生的光标跳转、替换或切换不会自动重建上下文,仍应重置 session。
- Rime 桌面集成依赖外部
curl。Standalone 的 HiAE helper 通过LIME_DENO_EXE使用随包 Deno 的绝对路径,不依赖子进程PATH;源码模式仍 需自行提供可验证的 Deno。这套桌面外部进程流程不能原样用于 Android 沙箱。 - PWA 不是系统输入法;Android debug APK 已在 API 35 模拟器验收,但尚未使用 生产发布密钥签名,也未做实体真机、多厂商 ROM 或商店合规验收。
- Windows 上没有生成 Swift,也没有执行 Xcode、iOS 模拟器或真机测试。
- Rime Schema/Lua 静态测试已通过,但本机没有 Rime 宿主,未做真实部署与逐键 输入验收。
- 全源码锁文件仍因可选
node-llama-cpp@3.14.5的传递依赖报告 45 项漏洞; 正式交付的纯字典 EXE 依赖图不包含node-llama-cpp。详见 验收报告。
完整清单见已知限制。
项目代码按 GPL-3.0 发布。随项目分发的英文词典来自
wooorm/dictionaries 的固定 commit,并附带独立的 SCOWL/Ispell/BSD/MIT
许可。完整来源、SHA-256、既有拼音数据的来源缺口和 运行时依赖见
THIRD_PARTY_NOTICES.md 与
复用台账。
- 原始上游:
xushengfeng/lime - 当前公开维护仓库:
VictorMaxWang/lime-ai-ime - 发布分支:
master
打包器只接受上述两个精确 remote,防止误把同一工作区中的参考仓库打包。 问题与改进建议请通过 Issues 提交;涉及协议、 安全边界或第三方数据时,请同时更新对应文档和测试。