Files
openless/USAGE.md
T
TRIPandbaiqing ecf2b0f6c2 feat: style pack i18n + 差量缓存 + 内置三包升级到 v2 (#460)
* docs(windows): 记录独占全屏游戏下 capsule overlay / hotkey 的 OS 级限制 (#457)

- coordinator.rs: 在 show_capsule_window_no_activate (Windows 路径) 上方加注释,
  说明 SetWindowPos(HWND_TOPMOST) 在独占全屏 DirectX/OpenGL 应用之上失效,以及
  UIPI 阻挡 hotkey 的同源现象,避免后续维护者再次尝试用户空间 workaround。
- USAGE.md: 给最终用户加 FAQ —— Minecraft 等全屏游戏下应切换到 borderless
  windowed fullscreen,对齐管理员权限,预先打开游戏聊天框。

此次仅文档与注释改动,不修改运行时行为。修复独占全屏 overlay 需要 DirectX
overlay 注入(Discord / MSI Afterburner 路线),工程量与风险都不在 surgical
修复范围。

* feat: style pack i18n + 差量缓存 + 内置三包升级到 v2

i18n(5 个 locale 全覆盖)
- 新增 style.pack.* 命名空间(~70 keys)覆盖 Style 页面所有 UI 文案。
- 扩展 marketplace.* 命名空间(~50 keys,含 myPacks/upload/oauth/state/modal/derivativeBadge/sortLiked/likedEmpty 等)。
- ja.ts / ko.ts 原本完全缺失 marketplace.* —— JP/KR 用户进风格市场会 fallback 看见中文,本次补齐。
- Style.tsx 删除 100+ 行 `isEnglish ? '...' : '...'` 三元 copy 对象,全走 t()。
- Marketplace.tsx + MarketplaceModal.tsx 把硬编码 '我赞过的'/'我的发布'/'确定上传'/'已下架'/'撤回发布'
  /'审核中'/'已上架'/'未通过'/'未登录'/'衍生自' 等 30+ 处全走 t(),含 statusLabel(state, t) 重构。

差量缓存(src/lib/ipc.ts + Marketplace.tsx)
- list cache 从 sessionStorage 升到 localStorage,跨重启秒呈现,TTL 24h。
- 新增 detail cache:按 (id, version, updatedAt) 三元组缓存 marketplace_detail;
  三元组等价于内容版本签名,version/updatedAt 任一变化即失效重拉。命中 = 0 请求。
- 自动驱逐:写入 list cache 时根据当前三元组集合 prune 不在列表里的 detail 条目
  —— 满足「云端哈希被移除时本机也移除」的语义。
- 安全审计:
  - 包 ID 必须匹配 UUID v4 正则(防 key 注入)。
  - detail.id 必须等于请求 packId(防服务端返回错位内容)。
  - 单条 prompt 长度上限 200KB(防 OOM)。
  - detail 条目上限 64,LRU 淘汰(防 localStorage 配额耗尽)。
- openDetail 先查本机三元组缓存,命中即渲染 + 跳过网络;未命中再走 IPC + 校验回写。

内置 style pack 升级到 v2.0(types.rs + polish.rs tests)
- 「轻度润色」「清晰结构」「正式表达」三个 builtin pack 整体替换为社区维护的 PRO v2 prompt
  (含独立角色 + {{HOTWORDS}} + 七/八节中文序号骨架 + 高密度示例 + ASR 纠错词表)。
- default_style_system_prompt_for_mode 对这三个 mode 早返回各自的 BUILTIN_PROMPT,
  跳过标准 ROLE_BLOCK + COMMON_RULES + OUTPUT_BLOCK wrapper,避免与 v2 内同名段落重复。
- StylePack literal 同步:name 保留中文短名(去掉 PRO 后缀),version → 2.0.0,
  description/examples/tags 同步 manifest。
- 老用户磁盘已有的 builtin pack 不会被自动覆盖(persistence migration 只填空字段,
  保护用户对内置包的编辑);要应用 v2 需在「风格」页面点一次「重置」;新装用户直接拿 v2。
- polish.rs 的 4 处依赖旧 heading 的断言更新为 v2 实际锚点;
  common_rules_include_auto_correction_and_natural_organization 拆为
  Raw(走 wrapper)+ Light/Structured/Formal(走 v2 PRO 自带 ASR 纠错段)两组。

后端服务(apic.openless.top)这次没动。

* feat: 英文翻译注入 EN 专用指引 + 修「我的发布」加载/计数/驱逐

英文翻译加专用补丁
- translate_system_prompt 检测 target_language == English(含 '美式英文' / '英文' / 'english'
  / 'British English' 等别名)时,在基础 prompt 末尾拼一段 EN 专用指引:
    · ASR 纠错优先策略(高/中/低置信度分级)
    · 中→英技术词规范化表(令牌→Token / 密钥→Secret Key / 应用ID→App ID /
      鉴权失败→authentication failure / 调用接口→call the API …)
    · 模型名 / 产品名还原(克劳德→Claude、双子座→Gemini、卡布奇诺→Cappuccino …)
    · 自然英文要求(idiomatic、avoid Chinglish、code/URL/版本号原样保留)
- 其它语言行为不变。
- 来源:社区贡献的「重写为英文」prompt,精简后避免与 base 重复。
- 新增 translate_prompt_appends_en_extras_only_for_english 单测覆盖 happy path + 别名 + 非英文。

修「我的发布」三个 bug
1. 数据拉取态:新增 myPacksLoading / myPacksError 状态机。
   原行为:拉取中显示「你还没有发布过风格包」,失败只弹 toast;用户分不清"empty"和"loading"。
   现行为:四态优先级 loading → error → empty → list;loading 显示「正在拉取,请稍后…」;
   error 单独成块带「重试」按钮(inline 比 toast 更稳定可达)。
2. 计数错位:visibleMyPacks 立即过滤 withdrawn / superseded(移除原 5 分钟可见窗口)。
   原 bug:发布 1 个删 1 个后,刚下架的那个还在 5 分钟窗口内 → 计数显示 2,跟实际不符。
   下架的反馈走 actionMsg toast 即可,不需要在列表里继续占位。
3. 计数源切换:'已发布 N 个'里的 N 改用 visibleMyPacks.length(active 包),
   跟列表里实际看到的卡片数对得上。pending 计数同样基于 visible。
4. 顺手清理:刷新按钮在 myPacksLoading=true 时 disabled,避免并发请求;
   删掉只为旧 5 分钟窗口存在的 nowTick / setInterval 状态与 effect。

i18n(5 个 locale):marketplace.myPacks 新增 loadingTitle / loadingHint /
loadErrorTitle / loadErrorRetry 四个 key。

* refactor(translate): EN 目标整段切到专用 prompt(不再走 append)

上一版是「通用 base + 末尾追加 EN 专用补丁」,两段重复 / 注意力被稀释。这版改为:
- target_language 命中 English 时(含 '美式英文' / '英文' / 'english' / 'British English' 别名)
  → translate_system_prompt 直接 return 新增的 EN_TRANSLATE_SYSTEM_PROMPT 整段,不再拼通用 base。
- 其它语言行为不变(继续走原通用 # 任务(翻译输出) base)。

新 EN_TRANSLATE_SYSTEM_PROMPT 自包含、~60 行精简版(来源:社区「重写为英文」prompt):
  · 角色 + 输入是 ASR 不可靠 + 任务定义(先纠错再翻译,结果直插光标)
  · 工作流程 6 步(不可换顺序)
  · ASR 纠错按高/中/低置信度分级
  · 中→英技术术语规范化表(Token / Secret Key / App ID / Access Token / Endpoint /
    Webhook / authentication failure / call the API / quota / front-end / back-end /
    Claude / Gemini / Cappuccino / Coder / LongCat …)
  · 翻译要求:自然 idiomatic、不要 Chinglish、保持原语气、英语写法的日期数字
  · 原样保留:代码标识符 / 命令 / 路径 / env vars / 布尔值 / 完整版本号 /
    大写缩略语(API SDK JWT OAuth …)/ 人名地名品牌名
  · 边界 case + 5 条禁止 + 输出约束

替换 translate_prompt_appends_en_extras_only_for_english 单测为
translate_prompt_swaps_to_en_dedicated_when_target_is_english:断言
- 英文目标命中 EN 专用 prompt("# 任务(中文转写 → 英文翻译)"),不再含通用 base 标题
- 非英文目标仍走通用 base
- 别名 '美式英文' / '英文' / 'english' / 'British English' 都解析为英文

cargo test 269 / 0 / 0;tsc clean。

---------

Co-authored-by: baiqing <lbx12309@icloud.com>
2026-05-17 09:45:28 +08:00

5.1 KiB
Raw Blame History

OpenLess 使用指南

安装

macOS

  1. 从 Releases 下载 OpenLess_<版本>_aarch64.dmg。
  2. 打开 dmg,将 OpenLess.app 拖入「应用程序」文件夹。
  3. 双击启动。

Windows

  1. 从 Releases 下载 OpenLess_<版本>_x64-setup.exe。
  2. 运行安装程序,按提示完成安装。
  3. 从开始菜单启动 OpenLess。

首次配置

macOS 权限

首次启动后,在「系统设置 → 隐私与安全」中授予以下权限:

  1. 麦克风 — 允许 OpenLess 录音。
  2. 辅助功能 — 允许 OpenLess 读写当前焦点输入框。授权后须完全退出并重新启动 OpenLess,快捷键才会生效。

Windows 权限

  1. 按系统提示授予麦克风权限。
  2. 打开 OpenLess → 「设置 → 权限」,确认全局快捷键监听器状态显示为「已启动」。

填入凭据

不会配火山 ASR 的话,先看这篇图文引导:
OpenLess 火山 ASR 配置

打开 OpenLess → 设置,填入以下字段:

字段 说明
火山引擎 App ID 语音识别服务的应用 ID
火山引擎 Access Token 语音识别访问凭据
火山引擎 Resource ID 语音识别资源 ID
Ark API Key 文本润色服务的 API Key
Ark Model ID 使用的模型 ID(如 doubao-pro-32k)
Ark Endpoint 接口地址,默认 https://ark.cn-beijing.volces.com/api/v3/chat/completions

保存后设置立即生效,无需重启。


基本使用

开始录音

按下全局快捷键(默认 macOS 右 Option,Windows 右 Control)。
屏幕边缘会出现状态胶囊,显示「录音中」。

结束录音

再次按下同一快捷键。OpenLess 会:

  1. 停止录音并发送音频进行转写。
  2. 对转写结果按当前输出模式进行润色。
  3. 将润色后的文字插入当前焦点输入框(失败时自动复制到剪贴板)。

取消录音

录音过程中按 Esc,当前录音内容会被丢弃,不做任何插入。


输出模式

在 OpenLess 主窗口的胶囊或「设置」中切换模式:

模式 说明
原文 直接输出转写文字,不做任何修改
轻度润色 修正语气词、标点、明显错字,保留原意
清晰结构(AI prompt 模式) 把口语整理成有结构、有约束、有上下文的 prompt,适合直接喂给 ChatGPT / Claude / Cursor
正式表达 将口语转换为正式书面语

词典

词典用于提高特定词汇的识别准确率(产品名、人名、专有名词等)。

  1. 打开主窗口 → 词典。
  2. 点击「新建」,填入正确拼写、分类和备注。
  3. 启用后,词条会作为热词注入 ASR 识别阶段,并在润色阶段辅助语义判断。

历史记录

主窗口 → 历史,可查看所有录音记录,包括原始转写和润色结果。


更换快捷键

主窗口 → 设置 → 快捷键,选择触发键。
macOS 支持右侧修饰键(Option / Control / Command / Shift);Windows 支持右 Control。


常见问题

Q: 快捷键没反应?
macOS:确认已授予辅助功能权限,且授权后重启过 OpenLess。
Windows:在「设置 → 权限」中检查监听器状态。

Q: 识别结果为空或是占位文字?
检查火山引擎 ASR 凭据是否填写正确。填写正确后识别才能正常工作。

Q: 文字没有插入,只是复制到了剪贴板?
当目标输入框不支持辅助功能写入时(如某些安全限制的应用),OpenLess 会自动回退到剪贴板复制,手动粘贴即可。

Q: 在 Windows 玩 Minecraft 等全屏游戏时,OpenLess capsule 不弹出 / 字符无法输入?
这是 Windows 操作系统层面的限制,OpenLess 应用本身无法绕过(详见 issue #457):

  • 独占全屏(exclusive fullscreen):标准应用窗口(包括 OpenLess capsule)不会绘制在独占全屏 DirectX/OpenGL 应用之上。请把游戏切换到 无边框窗口化全屏(Borderless Windowed Fullscreen)。Minecraft:视频设置 → 全屏 关闭(保持窗口最大化即可)。
  • 管理员权限不一致(UIPI):若游戏以管理员身份运行而 OpenLess 不是,Windows 阻止 OpenLess 接收游戏前台的按键,hotkey 完全不触发。让两者权限对齐(要么都以管理员运行,要么都以普通用户运行)。
  • 游戏聊天框未打开:识别字符通过模拟键盘事件落字。Minecraft 中必须先按 T 打开聊天框,OpenLess 的输入才会落到聊天里。

macOS 不存在独占全屏(所有"全屏"都是带 Spaces 的无边框窗口),所以此限制不适用。

Q: 润色结果和预期不符?
尝试切换输出模式,或在词典中添加相关专有名词。


社区与支持

欢迎通过 QQ 加入用户群,反馈问题或交流使用体验:

QQ 群:1078960553