Skip to content

About

本地优先的中英混合智能输入法:Standalone 后端、PWA、Android IME 与 Rime 集成

Topics

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

LIME AI IME

本地优先的中英混合智能输入系统:Standalone 后端、移动 PWA、Android 系统输入法与 Rime 集成。

English · 最新发布 · 完整文档

Release License: GPL-3.0 Deno 2.9.3 Android API 26+

当前版本: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
Loading

输入模式与界面语言

输入模式 行为
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 历史。

直接交付包(PowerShell)

正式 Standalone 交付仍是一套可离线运行的独立 EXE 完整系统。接收方解压并 完成归档校验后,唯一受支持的启动顺序是:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\start.ps1

setup.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。完整验收与 解压前校验流程见交付文档。

源码开发快速开始(PowerShell)

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'

本机 API 示例

不要把密钥放进 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 文档。

LAN 模式

推荐让同机 HTTPS 反向代理访问回环服务;确实需要后端监听 LAN 时,必须完成 以下全部步骤:

  1. 已运行 key.ts,客户端使用 bearer 或 HiAE 认证。
  2. HTTPS 反向代理使用受客户端信任的证书;HiAE 不能替代 TLS。
  3. 显式允许 PWA 的精确 HTTPS origin,不使用 *。
  4. 同时显式打开非回环监听和 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

复制 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 文档。

移动 PWA

打开 /mobile.html 后可使用触控 QWERTY、三种输入模式和双语界面,并可在 满足浏览器安全条件时安装到主屏幕。PWA 是一个移动输入页面,不是 Android 或 iOS 的系统全局键盘。手机接入、安全存储和构建验证见 PWA 文档。

Android 系统输入法

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 文档和测试记录为准。

认证与 HiAE

  • 所有候选、提交和会话写接口默认要求认证。
  • bearer 兼容旧客户端,但只能在 localhost 或 HTTPS 下使用。
  • Rime 默认使用 hiae-v1 加密请求与响应;服务端规范化 Base64URL nonce 后做 有界重放防护,等价编码不能绕过缓存。
  • HiAE 使用共享密钥保护正文,但不隐藏网络元数据、不提供证书式服务器身份, 且兼容版本使用空 AAD,因此仍必须优先使用 HTTPS。
  • 新 PWA 只把凭据放在内存或本标签页 sessionStorage,并绑定规范化服务 URL;切换服务地址不会复用旧 bearer。兼容的 passwd query 会在读取后从 地址栏移除。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 与 复用台账。

上游与贡献

打包器只接受上述两个精确 remote,防止误把同一工作区中的参考仓库打包。 问题与改进建议请通过 Issues 提交;涉及协议、 安全边界或第三方数据时,请同时更新对应文档和测试。

About

本地优先的中英混合智能输入法:Standalone 后端、PWA、Android IME 与 Rime 集成

Topics

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages