Skip to content

Releases: GUAPIXIA/qingyu

轻语v0.21.0

Choose a tag to compare

@GUAPIXIA GUAPIXIA released this 01 Nov 10:22

夸克网盘链接
https://pan.quark.cn/s/a9853284d260

更新日志

[0.21.0] - 2026-11-01

修复(输入续写:四档长度控制与用户视角)

  • 问题(单角色 100 轮实测暴露):①严格落档率仅 58%(短句 96% / 小段 76% / 展开 40% / 长篇 20%),展开与长篇系统性写不到下限;②11% 的回合因「长度修复后仍不合格」被放弃、只保留原输入;③16% 的续写替角色行动/说话(沉浸式下应只写用户侧)。
  • 提示词(shared/chat-core/aiInputHelper.ts):续写长度指令加入硬性下限(未达到下限前不得收尾)、分段配额(展开每段约 90–140 字、长篇每段约 110–160 字),并把「自然完成即收尾」改为「达到下限后才允许收尾」;长度修复指令给出缺口字数并要求至少写到下限。
  • 补足链路(src/components/chat/useChatInputState.ts):先接缝去重再补足,避免补足结果被接缝裁剪到下限以下;新增「近下限补足」——完整但低于下限时,用 assistant 预填 + 继续指令最多补写三次,超过上限时按句边界收束,必要时二次压缩;修复失败但原文可用时保留原文交给补足,补足后仍不完整才保留原输入并提示。
  • 用户视角守卫(shared/chat-core/aiInputHelper.ts + useChatInputState.ts):续写提示词显式加入「只写用户自己的动作、对白、观察和感受,不得以角色名或她/他为主语展开角色行为」;新增 detectCharacterVoiceViolation / buildVoiceRepairInstruction / stripCharacterVoiceSentences,沉浸式续写检测到越权时以低温最多重写两次,仍越权则按句删除角色侧叙述兜底。
  • 实测(修复后,同口径 100 回合 / deepseek-v4.1-flash):四档严格落档 100% / 100% / 100% / 100%(各 25/25,综合 100%),放弃 0 次、替角色行动 0 次、截断 0 次;修复前基线为 58%、11 次、16 次。补写共 32 次、视角重写 0 次;续写平均耗时 3.0 / 4.0 / 6.6 / 11.6 s(档位越高越慢,含补写调用)。
  • 验证:pnpm check、pnpm exec eslint(改动文件)、pnpm exec vitest run(aiInputHelper / useChatInputState 87 项、chat-core golden 34 项)全绿;chat-core golden fixture 已按新提示词/修复文案重新生成。

变更(PC/安卓解绑 · 第一批:工程外围)

  • 分支策略落定:新建 android-compat 分支冻结解绑前的完整安卓兼容状态(含跨端同步链路);main 开始移除对安卓端的兼容。第一批只处理工程外围(子模块/CI/版本线/公告服务/联验脚本/文档与矩阵),跨端同步链路(electron/bridge、配对与同步中心、relay-server)作为第二批单独提交;clientKind 等跨端契约类型位于 shared 子模块仓,另行处置。
  • 子模块解绑:移除 android 子模块与 .gitmodules 条目;本地 android/ 目录保留为 qingyu-android 独立仓工作区并加入 .gitignore(不再进入 git status)。
  • CI:删除 ci.yml 的 Android 作业(单测/lint/assembleDebug)与 release.yml 的 APK 发布作业;版本单源门禁改为只校验 PC package.json 与 CHANGELOG.md。
  • 版本线:scripts/version.mjs 收敛为 PC 单端(删除 Android TOML/README/CHANGELOG 读写、android 命令与 --sync-android),package.json 删除 version:android。
  • 公告服务:/api/version 与后台版本面板不再包含 androidVersion/androidChangelog/androidDownloadUrl,app_config 默认值不再写入 android_*(存量库历史行保留但不读写)。
  • 联验脚本:删除 MuMu/ADB 相关脚本(mumu-*.cjs、diag-lan-inject.cjs、lan-mumu-e2e.ts、lan-hold.ts)、parity 矩阵生成器(refresh-parity-matrix.mjs、_gen-parity-md.mjs)与已无清单文档的 s9-07-legacy-purge-check.mjs;regenerate-roleplay-fixture.ts 不再跨仓写 android 副本;g2-progress.ts 删除 --android-ok;clean.ps1 移除 Gradle 产物条目。
  • 文档:移除安卓独立客户端方案族(阶段 0–9 执行文档与 S9-* 清单)、13 份 Android独立客户端重构阶段* 报告、阶段 2–9 验收报告、能力矩阵三件套、ADR-001/002/007、规范/模拟器环境-备忘录.md 与 2 份 compose 阶段收口(phase0/phase3);仓库拓扑文档重写为「PC + shared」双仓,同步修正文档索引与失效链接。历史归档、报告/LAN联调取证-* 与降级为历史参考的安卓重构总方案保留。

变更(PC/安卓解绑 · 第二批:跨端同步链路)

  • 桥接层移除:删除 electron/bridge/(安卓伴侣端 REST/WS 桥接、/sync/v1 路由、配对与 mDNS 服务身份);主进程不再注册 bridge/syncLan/syncCenter IPC,preload 不再暴露 bridge/syncLan/syncCenter,设置页「同步中心」分区(QR 配对、授权窗、冲突与设备管理)整体退场。
  • 同步链路模块:删除 electron/ipc/{syncCenter,syncLan}.ts、electron/domain/{syncLanAuth,firstSyncPlan,serverTransport,syncSummary,upgradePrecheck}.ts 及其单测;设置变更总线删除 android:<deviceId> 来源标记(原为桥接层防回环),只保留 PC 本地保存来源。
  • relay-server 退场:删除 relay-server/ 整包(HTTPS/WSS 中转、Postgres 迁移与 RLS 跨租户门禁)及其 pnpm workspace 条目、CI relay-lint-and-unit 作业与锁文件条目。
  • 依赖收敛:移除仅桥接层使用的 bonjour-service/express/express-rate-limit/qrcode/ws 与对应 @types/*(pnpm-lock.yaml 同步刷新)。
  • 文档:ADR-005/006/009/010 与 报告/LAN联调取证-*、报告/MuMu真机LAN联调取证-* 退场;ADR 索引(现行 4 条:003/004/008/011)、文档索引、推送/更新/门禁规范与仓库结构表同步。
  • 边界说明:shared 子模块内的跨端契约(ExposedAPI.bridge/syncLan/syncCenter、sync-core/sync-crypto、clientKind)与 tools/gen-sync-crypto-fixtures.ts 属 shared 独立仓范围,本次未改动;PC 内核写路径(syncDomainService/syncMeta/syncHealth/deviceIdentity)与 /sync/v1 之外的本地同步域行为保持不变。

验证:pnpm check / lint(0 error)/ test(含覆盖率门禁)/ check:gates / check:contracts / check:docs-index / check:pc-agent 全绿;公告服务测试通过;pnpm install --frozen-lockfile 与 CI 工作流 YAML 解析通过

变更(PC 端移除费用提醒)

  • 移除设置「生成规划」的「费用提醒」开关卡片与 WalletCards 图标;固定区保留思考强度/连续性保护/自动补全结尾。
  • 移除快捷设置「回复长度」中的预算提醒分支(原「本轮回复预算较充足…」文案);硬上限安全校验 riskMessage 与默认篇幅文案保持不变。
  • 移除 settings 迁移中的 costReminderEnabled 归一化及对应测试断言,PC 代码不再读写该字段。
  • 边界:costReminderEnabled 仍声明于 shared/types.ts 并在 shared/defaults.ts 默认为 true(shared 子模块属独立仓,本次未改动),新建设置文件中仍会带该键但已无读取方;如需彻底清理需在 shared 仓提交并 bump 子模块指针。
  • 文档:PC 生成入口冻结清单 同步(费用提醒条目退场)。

验证:pnpm check / lint(0 error)/ test(296 文件 3780 用例,0 失败)/ check:gates / check:contracts / check:docs-index / check:pc-agent 全绿

修复(依赖安全:CI 审计门禁转绿 + spatial-board CI 修复)

  • 修复前 pnpm audit --registry=https://registry.npmjs.org:4 critical / 56 high / 31 moderate / 3 low(94 项);修复后:0 critical / 1 high(登记豁免)/ 2 moderate。
  • 直接依赖:electron ^43.4.0 → ^43.8.0(沙箱不继承、协议处理器跨源读、preload 代码缓存投毒 3 条 high);adm-zip ^0.6.0 → ^0.6.1(解压炸弹绕过、保留 SUID/SGID 提权等 4 条 high,备份导入入口);vitest/@vitest/coverage-v8 ^3.2.7 → ^4.1.12(vitest 4 不再依赖 tinypool,消除 2 条 critical RCE)。
  • 传递依赖(pnpm-workspace.yaml overrides 统一抬升,全部同大版本内):sharp 0.35.5、js-yaml 4.3.2、proxy-addr 2.0.8、shell-quote 1.11.0、fast-uri 3.1.8、@xmldom/xmldom 0.8.15/0.9.12、axios 1.20.0、undici 6.28.1、joi 17.13.8、browserslist 4.28.7、source-map-js 1.2.2、http-cache-semantics 4.3.0、brace-expansion 1.1.21/2.1.7/5.0.12、ejs 3.1.10、qs 6.16.0、ip-address 10.7.1、postcss 8.5.23。
  • 登记豁免/保留:braces<=3.0.3(GHSA-vfj7-8cjw-p6xm)写入 auditConfig.ignoreGhsas——npm 官方最新仅 3.0.3(公告要求的 3.0.4 未发布),仅 dev 构建链 tailwindcss > chokidar 使用、无运行时暴露面,上游发版后应移除;sprintf-js、postcss-selector-parser(需跨大版本 6→7)保留为 moderate。
  • spatial-board CI 修复:该工作流 npm test 在 Linux CI 必然失败(TS2307 node:fs/TS2304 __dirname)——根因是 spatial-board 未声明 @types/node,本地靠父目录 node_modules/@types 兜住、CI 只在该目录 npm ci 故缺失;已补 @types/node 并刷新其 package-lock.json。
  • 测试框架适配:electron/ipc/__tests__/tts.test.ts 的用例内 vi.unmock 提升到文件级(vitest 4 告警、vitest 5 起报错)。
  • 验证:pnpm check/lint(0 error)/test:coverage(296 文件 3780 用例,vitest 4)/build/electron-build/各门禁/公告服务测试全绿;pnpm install --frozen-lockfile 通过;本地复现 CI 两条审计命令(critical 与 high)均 exit 0。

变更(清理:一次性排障脚本 / 无引用依赖 / 文档对齐)

  • 删除 11 个一次性排障文件:tools/debug-{aad,b64,cross,cross2,entity,gcm,gcm2,gcm3,gcm4,gcm-tag}.ts 与 tools/gcm-vector.json。它们是 2026-09 跨端同步加密(AES-256-GCM/ECDH/AAD/Base64 差异)的排障材料,只打印诊断信息、无测试与构建消费者,且其排障对象已随 2026-10-14「移除安卓端兼容」第二批整体退场;处置依据与取回方式见 tools/README.md(归档方案 C03 登记的「登记用途 → 验证消费者 → 归档或清理」,本次按清理执行,跨端契约样本仍在 shared 仓,文件可从 git 历史取回)。
  • 移除 2 个无引用依赖:rehype-raw(原始 HTML 渲染已按 XSS 修复刻意移除,README 却仍宣称启用)、@testing-library/user-event(全仓 0 引用)。
  • 纠正审计启发式的两处误判(经核证保留,未删):@xyflow/react 是根 vite 多入口构建 spatial-board/index.html 的必需依赖(CI 的 build-windows 作业在无 board node_modules 的情况下正是靠它构建成功);babel-plugin-react-dev-locator 由 vite.config.ts 以 Babel 插件名 'react-dev-locator' 字符串引用(QINGYU_DEV_LOCATOR=1 时启用),源码里搜不到包名并非未使用。
  • 文档对齐:README 技术栈的 Markdown 行不再宣称 rehype-raw,并注明原始 HTML 不渲染;目录树删除已退场的 electron/bridge/,domain/ 描述改为「逐域写入口、事务、恢复与写路径收口」;server/.env.example 补登记 4 个此前只出现在代码里的变量(DB_DATA_DIR/DB_PATH/UPDATES_DIR/TRUST_PROXY)及其默认值。
  • 去悬挂 TODO:electron/chat/compaction.ts 中自 0.12.1 挂到 0.20.0 的 TODO(0.12.1) 改写为显式「已知限制」说明(终态任务记录可能先于引用它的消息被保留期清理;若要收口需先为 messages 建 generationTaskId 索引)。

验证:pnpm check / lint(0 error)/ test(296 文件 3780 用例,0 失败)/ build / electron-build / check:gates / contracts / docs-index / pc-agent 全绿;pnpm install --frozen-lockfile 通过

轻语v0.20.0

Choose a tag to compare

@GUAPIXIA GUAPIXIA released this 05 Oct 13:27

夸克网盘链接
https://pan.quark.cn/s/a9853284d260

更新日志

[0.20.0] - 2026-10-05

新增

  • 外部 Agent 调用/测试工具包(tools/pc-agent):让终端 CLI 与外部 MCP 都能真实驱动、测试轻语 PC 功能。动作目录以 shared/ipc-api.ts 为单一真源(254 个契约成员登记齐全、unregistered=0),Session Host 常驻持有 Playwright/Electron 句柄并经 Windows 命名管道服务,CLI 与 MCP 共用同一执行路径(双入口逐项等价)。内置 19 条测试旅程(单聊/角色/群聊/世界书/预设/用量/日志/正则/快捷回复/画板 iframe/真实本地向量模型与取消路径/环境探测等),配套 pnpm check:pc-agent 契约漂移门禁(CI 独立步骤)与生成式能力矩阵。
  • 真实模型与真实生图/语音验证:本地向量模型(推理、异步索引、语义检索与取消索引)、小米 MiMo mimo-v2.6-pro 真实生成(终态/用量/消息归属/事件分页/取消生成)、ComfyUI 真实出图、edge TTS 真实合成,均已跑通并留证。
  • 导出/导入支持显式路径(免系统对话框):角色卡(JSON/PNG/封面/批量)、世界书、预设、快捷回复、备份(zip/json)的导出与导入新增可选路径参数(导出 targetPath、导入 sourcePath);传入路径时不弹系统对话框,直接读写该路径,供外部 Agent / 自动化端到端调用。不传路径时行为完全不变(仍弹对话框,保持原有交互)。exportCover 与 preset/quickReply 导出现在同样回传 path。file.selectImage 与 font.select 故意不提供路径参数——它们是「仅允许读取对话框选择过的路径」的白名单闸门,加参数会打开任意文件读取面。
  • TTS 新增小米 MiMo 提供商:设置 → API → TTS 新增「小米 MiMo TTS」提供商,可直接用小米 MiMo 语音合成朗读。与既有 OpenAI 兼容 TTS 不同,小米走 POST {baseUrl}/chat/completions(文本在 messages[role=assistant].content,音频参数在 audio:{format,voice},音频数据在响应 choices[0].message.audio.data),因此实现为独立适配器而不是复用 /audio/speech。内置 9 个官方音色(mimo_default、冰糖、茉莉、苏打、白桦、Mia、Chloe、Milo、Dean),默认端点 https://api.xiaomimimo.com/v1、默认模型 mimo-v2.5-tts;「测试连接」改为真实合成一句短语音(同时验证 Key、端点与音色)。消息朗读、试听、音色下拉与配置列表标签均已接入该提供商。参考小米 MiMo TTS 接口文档。

修复

  • 外部 IPC 写入的设置不再被渲染层旧值覆盖(F1):应用退出前无条件 flushSettings(),会把渲染层内存里的旧设置整份写回磁盘,覆盖由外部 Agent 经 IPC 写入的更新(实测 theme=light 在重启后被改回 dark)。现引入本地脏标记 _dirty:只有用户操作产生的改动才在退出前写盘,落盘成功后清除。
  • 外部 IPC 写入的数据不再要求重启才能看到(F3):主进程侧的写入(外部 Agent / 导入)此前不触发任何界面刷新。现新增 character:changed / settings:changed 广播(与既有 session:updated 同一套机制),并在会话新建/改名/删除后广播;渲染层订阅后重新拉取角色、会话与设置(设置在本地有未保存改动时不重载,避免与 F1 竞争)。
  • 消息缺字段不再击穿整页(F4):不完整消息(缺 timestamp/images/isEditing)会让 date-fns.format(undefined) 抛 RangeError: Invalid time value,触发整页「页面渲染异常」。现双层加固:写入边界补齐三个字段,格式化入口(formatTime/formatDateTime/formatRelativeTime 与书签调试面板)对无效时间戳一律降级为空串。
  • 重命名不存在的会话不再静默成功(F2):renameSession 此前 if (session) 无 else,外部调用方会拿到“成功”却什么都没发生。现与 updateSession 一致地抛「会话不存在」,并对非字符串标题报参数错误。
  • 会话切换器下拉项可被可靠定位与点击(F5):下拉项与触发器同为 button 且名称都可能是当前会话标题,无障碍与自动化都无法区分;且条目名称带 (N条) 后缀,按标题精确匹配必然失败(实测真实鼠标序列下点击超时)。现面板加 role="menu" + 名称、条目改 role="menuitem" 并用 aria-label 提供干净标题(条数后缀标记 aria-hidden),当前项带 aria-current。
  • Edge TTS 配置不再被静默改写成系统语音:loadSettings 每次加载都会把已有 TTS 模型的 provider: 'edge' 无条件改写为 'system',而 edge 在 3.2-A 之后已是正式提供商(设置界面可选、edgeSpeak 有实现与测试、消息朗读按 edge 分支播放),因此用户配好的 Edge TTS 会在下次启动后被改写、并随任意一次保存落盘。现改为只在旧单字段 ttsProvider: 'edge'(3.2-A 时代 edge 仅作系统引擎占位值)时迁移为 system,已有模型数组不再改写;历史数据的一次性迁移仍由主进程版本化迁移链负责。

轻语v0.18.0

Choose a tag to compare

@GUAPIXIA GUAPIXIA released this 20 Sep 07:28

夸克网盘链接
https://pan.quark.cn/s/a9853284d260

本次涉及安卓端重构,所有此版本不提供给安卓安装包,请待后续版本更新

更新日志

[0.18.0] - 2026-09-20

新增

  • PC 界面动效体系统一:新增 --motion-fast / --motion-base / --motion-slow 三档时长与标准、出场、弹性三组缓动曲线,按钮、弹层、侧栏、页签与本地模型任务中心改用 GPU 友好的过渡属性(只过渡颜色、背景、边框、透明度与位移),短反馈更快、面板稍缓,减少界面切换的生硬感。

  • 世界书语义索引收口:世界书条目按「标题 + 别名 + 摘要 + 正文」构造稳定检索文档并分块向量化,禁用条目、常驻条目与仅关键词模式不进入索引;条目保存后自动比对语义字段变化、统一失效旧向量并调度重建(不再以远程索引是否存在作为是否失效的前置条件)。语义阈值判定(自动 / 手动)下沉为两端共享的纯逻辑(shared/chat-core/embeddingPolicy),桌面设置页与 Android 使用同一套阈值决策。

  • 发送前语义预取并行化:单聊发送前的世界书语义命中与记忆事实检索改为并行发起(两者互不依赖),不再把两次嵌入往返串行压在主请求之前。

  • 跨端共享导出与候选语义:会话导出(Markdown / JSON)与消息候选(swipe)语义提取为 shared/chat-core 纯逻辑,PC 与 Android 以同一份生产实现作为黄金 fixture 的 oracle,避免两端导出文件内容与消息数量、顺序出现差异。

  • PC 动态上下文 W10 设置、预设迁移与诊断:默认回复长度移入对话快捷设置;设置中心“生成规划”保留思考强度、连续性保护、自动补全结尾与费用提醒,高级区提供按连接启用的输入/输出能力覆盖、能力来源/置信度、门控探测重置、分类用量及最后一轮 reasoning/body 计划与实际对照。快捷设置删除重复的只读采样区、最大 Token 档位/输入框及完整端点展示,输出硬上限集中到预设高级参数;行为设置对正常数据不再显示“新版管线”说明,只在检测到 legacy 数据时提供一次性恢复入口。诊断 IPC 不暴露 API Key、完整端点、requestId、正文或磁盘路径。settings 唯一迁移链升至 v4:maxTokens=0 保持自动,用户正数硬上限完整保留,只有内置旧快捷值映射篇幅偏好,旧 maxContext 默认只能收紧、显式启用能力覆盖后才可放大,旧世界书比例仅留迁移记录;legacy 与 8192 通用安全阀继续保留。详见 W10 实施报告。

  • 生成链路重构前遗留清理·C 线(提示词与观测基线):① 主对话「本轮回应范围」补连续性约束——不得与最近对话的既有事实、已完成动作或已说过的信息矛盾或重复(buildMainChatOutputPrompt,对应 S10 单聊连续性 3/11 问题);② 群聊点名/轮询人称表述澄清——对白必须是该角色自己的第一人称、动作/神态可用第三人称叙述(shared/groupChatPrompt 与 buildGroupNarrativeModePrompt 群聊叙事边界),评测 focus 与结构化判据同步,消除「全篇第一人称」歧义;③ thought 评测口径与 thoughtContract.ts 强契约对齐——每轮缺失或多组 <thought> 由 warn 改为 fail,LLM 评审 thought_ok 同步「缺失视为 false」;④ 基线口径冻结:shared/generationBaseline.ts 固化 G2「500 次有效生成」分母(主对话 + 供应商有响应,排除 aux/后台任务/error),scripts/generation-baseline.ts 扩展 terminationCause/attempts/token 分位与 provider×model×task 分组报告。真实模型复测(C1 三用例 / C3 出现率)待模型额度后执行。

  • 方案文档:推理门控与降级闭环(对话输出弹性约束·阶段8,待实施):针对真实使用中残留的「推理已占满模型输出硬上限」失败模式,新增阶段8方案——把现行"猜测式推理余量"改为四个机制:① 统一 ReasoningGate 档位(off/low/standard/full)翻译为各供应商的推理控制参数(thinking:disabled / reasoning_effort / budget_tokens / thinkingConfig),让推理上限由服务端强制执行;② (provider+model) 级运行时能力探测与持久化(参数 400 降级表、聚合端静默忽略 disable 的流级标记、未知模型出现 reasoning 即自动建档);③ 流式提前中止——正文未出现且推理越过观测线即止损,不再等满输出上限;④ 空正文降档重试闭环——仅在可见正文为空时自动降一档重试至多一次,有正文的 length 仍走既有收尾器。同时修复现状缺口:recentReasoningTokens P90 估计从未接线(contextBuilder 未传参)、Gemini 未下发任何 thinkingConfig、o 系硬编码 'medium'、Claude maxTok/3 比例猜测。本期仅方案与索引落档,未改动代码。

  • 统一异常终止链路与跨端收口(对话输出弹性约束·阶段7.1–7.3):① 新增应用层终止原因 GenerationTerminationCause 与统一终止结果(shared/types.ts / shared/generationTermination.ts),与供应商 finishReason 分离、互不覆盖;finalizeGenerationTerminalResult 成为所有异常终止的唯一收口入口——桌面单聊空闲超时与普通 ai:error、群聊点名/轮询/自由发言错误、Bridge partial error 的半截正文一律先经统一最终处理管线(稳定边界收束)才允许保存,错误与超时提示只写 generationError/generationNotice(⚠️ 文案写进正文的旧行为全面移除),无可用正文一律不创建空 AI 消息;新增 requestId + terminalState 一次性终止状态机(含 claimUserStop / claimGroupUserStop):迟到 chunk/done/error 全部忽略、同一 requestId 最多落盘一次,用户停止保留已显示正文,停止字符串命中不再误标“已停止生成”。② thought 角色第一人称心理语义固化为唯一共享来源 shared/thoughtContract.ts(单聊与群聊上下文共同消费,禁止模型推理/规则分析/上下文复述);新增 PC/Android 共享语义分块契约 shared/fixtures/roleplay-blocks.json(31 样本)与 Kotlin 等价移植 RoleplayBlocks.kt,两端测试读取同一 fixture 逐条比对;Android 单聊与群聊气泡正式按 contentRenderMode='blocks' 渲染语义分块(@提及高亮保留),旧消息安全回退 Markdown。③ 后台结构化生成接入 BackgroundGenerationProfile(memory / compression / title / direction):压缩与标题触顶或结构残缺时丢弃结果且不破坏原数据、方向保持一次“只补结构”短修复、长记忆摘要与事实提案分别判断完整性;观测记录新增 taskType 与 terminationCause(默认不落正文与提示词);自动补尾只对 provider_length 开放且每条消息至多一次,补尾期间用户停止立即取消并保留稳定前缀,同一模型连续失败两次本次会话关闭自动补尾。详见阶段7实施报告。

  • S10 真实模型复测(thought 修复后):评测脚本新增 group(点名 / 轮询 / 自由发言)与 stream(流式推理隔离)批次、S10 检查项(thought 第一人称与无计划/规则复述、供应商推理隔离、全局叙事第三人称)、按模型名选择适配器并适配阶段3 AICompletion 契约;按复测清单用 deepseek/deepseek-v4-pro 实测单聊 5+5、群聊 3×5、流式 2、续写 4×2 与 14 项确定性检查——四项新增检查全部通过(thought 出现即合规 3/3、推理在 chunk/正文/TTS/记忆上下文 0 泄漏、旁白第三人称 5/5、群聊结构 15/15)。同时发现:低用户硬上限 + 推理共享模型会整轮空响应(riskNotice 已计算但无界面消费)、thought 出现率降至 3/28、单聊连续性 3/11 与续写 2/8 属模型质量问题。详见 S10 真实模型复测报告。

  • 用户篇幅意图与场景系数接入(S5):新增 detectUserLengthIntent(只识别“简短回答 / 一句话 / 详细说说 / 展开讲”等明确词组,普通叙述不误触发)与 resolveSceneFactor(首轮开场 1.15、明确转场 1.25、短问句 0.85,其余 1),接入 resolveChatRequestPlan——本轮软区间与请求预算随用户意图/场景同步变化(“一句话回答”优先于会话的“展开”设置),ResponsePolicy.source 新增 user;识别结果写入阶段0观测(responseIntent / sceneFactor)便于核对误判。

  • Android 消费结构化收尾状态(S6):移动端 Message / GroupMessage DTO 新增 generationNotice / generationError / contentRenderMode(缺省 null,兼容旧 PC 返回与旧缓存),Room 缓存升到 v7(仅 ALTER cached_messages 三列,outbox 与 task_cursors 不动);单聊与群聊气泡下方按 PC 同义文案展示“⚠️ 生成中断:… / ℹ️ …”,超时与收尾状态在两端语义一致;Bridge 落盘时同步写入收尾提示字段。语义分块在移动端明确降级为 Markdown 兼容渲染(渲染文本一致,仅样式差异),字段先落库保证跨端协议一致。

  • 群聊语义分块支持 @提及高亮(S7):把提及识别抽成 splitMentionSegments 纯文本分段(长名优先,正则特殊字符按字面量处理),Markdown AST 插件与 blocks 渲染路径共用同一规则,新消息与旧消息的提及显示一致,且不恢复原始 HTML 注入。

  • 灰度开关与契约清理(对话输出弹性约束·阶段六):设置页新增「生成管线」开关(Settings.generationPipeline,默认 unified)——legacy 一键回退旧链路:预设 maxTokens 直用、注入旧【正文排版协议】、跳过收尾器与补尾、新消息不标记语义分块并恢复说话人前缀补齐;回退不删除任何新设置与会话数据。旧链路的固定 8192 特判与旧格式协议已在前序阶段删除,本阶段移除失效的 ChatParams.allowTruncatedOutput 字段(length 不再抛错后无消费方)及其全部调用点;评测脚本新增 v-pipeline-flag 用例(unified/legacy 预算与标记断言),文档索引新增实施报告。

  • 群聊与 Bridge 收尾对齐(对话输出弹性约束·阶段四):群聊三条生成链路(点名/轮询/自由发言)与 Bridge 单聊生成全部接入与桌面单聊相同的结构化完成事件与 shared 收尾器——结束原因随完成事件透传,残缺正文回退稳定句界、必要时至多一次短补尾;错误分支与单聊 R2 对齐(正文保留在 content、失败原因记 generationError,不再把 ⚠️ 拼进正文;超时保留稳定前缀);收尾提示走中性 generationNotice 展示。所有入口的结束状态与收尾行为一致,正文后处理不再有各端复制的实现。

  • 语义分块渲染(对话输出弹性约束·阶段五):新增 src/utils/roleplayBlocks.ts 确定性分块——纯引号行为对白(可带说话人前缀,单字角色名不误判)、整段 *动作* 剥离星号归叙述、引号与叙述混写行归 mixed 保持原文、<thought> 归思考;气泡按语义块以 CSS 呈现样式(叙述沿用动作段斜体弱化样式),不再依赖模型手写星号与说话人前缀。新落盘消息标记 contentRenderMode: 'blocks',旧消息缺省继续走 Markdown 渲染,不做批量迁移;单聊、群聊与 Bridge 的新正文停止调用 normalizeRoleplayDialoguePrefixes(该函数保留为旧内容兼容工具);Message.content 继续保存可复制的原始正文,分块仅在渲染时即时计算。

  • 结构化完成事件与统一收尾(对话输出弹性约束·阶段三):适配器契约升级为返回 AICompletion(正文 + finishReason + usage),finish_reason=length 不再抛错而是作为完成状态下发——ai:done 事件携带结构化元数据(新增 onComplete 回调,旧 onDone 兼容保留),桌面单聊所有结束路径(正常/触顶/网络中断保留正文)统一进入 shared/assistantOutputFinalizer 收尾器:stop 且结构完整直接接受;length 恰好完整不提示;尾部残缺回退到最后稳定句界并剥离未闭合引号/星号/<thought>;稳定正文过短或无边界时自动发起一次短补尾(仅末段上下文,复用重叠去重合并后复检,失败则保留稳定前缀)。网络中断但已有正文时主进程降级为 network_error 完成结果,正文不再整条丢失。收尾状态区分展示:中性提示(已在完整句处收束/已自动补全结尾/已停止生成)走新增的 generationNotice,失败提示(生成中断,已保留完整部分)继续走 generationError。

  • 语义回合约束取代机械排版协议(对话输出弹性约束·阶段二):主对话提示词以「本轮回应范围」+「正文结构」两段语义规则,取代旧「正文排版协议」的固定 2–6 段、每轮必有对白、动作必加星号、对白必带角色名等机械要求——只完成一个自然互动回合(最多推进一个主要事件,展开档最多两个),推进到需要用户回应的位置即停止,接近篇幅上限时停止引入新信息并完成当前句;篇幅数字由阶段一的 ResponsePolicy 按模式/会话节奏动态给出(软目标,不为凑字数重复),短回应可以只有一个段落。展示样式不再要求模型手写,为阶段五语义块渲染铺路。

  • 生成基线观测(对话输出弹性约束·阶段0):每次 AI 请求在主进程落一条 JSONL 观测记录(data/diagnostics/generation-observations.jsonl,超 5MB 自动轮转),包含模型、来源(单聊/群聊/桥接/辅助)、篇幅模式与硬保护线、正文可见字符、completion/reasoning token、结束原因、尝试次数与格式闭合诊断(引号/星号/<thought>),正文只落尾部采样不落全文;取不到 reasoning token 的上游记 unknown 不填 0。四家适配器在完成或抛错前透出归一化结束原因(OpenAI finish_reason、Claude stop_reason、Gemini finishReason、Ollama done_reason),OpenAI/Gemini 同时解析 reasoning token 计数;chatWithRetry 汇总为完成/触顶/用户停止/错误四类终局,取消请求携带原因(用户停止/看门狗超时/停止字符串)供区分。新增基线分析脚本 scripts/generation-baseline.ts:输出 P50/P90 正文长度、触顶率及"正文过长 vs 推理占满"细分、未闭合格式率、用户手动继续率与观测完整性。阶段0记录为离线观测,不改变任何请求行为与界面表现。

  • 回复篇幅与请求预算解耦(对话输出弹性约束·阶段一):新增 ResponseLengthMode(自动/简短/适中/展开)与 ResponsePolicy(字符软区间 + 硬保护线),预设增加 responseLengthHint、会话预留 responseLengthMode 字段;新增模型能力档案(shared/modelOutputProfile),正文预算与推理余量分别估算后合并为请求上限,移除 DeepSeek V4 固定 8192 下限——"适中"回合在该模型上通常请求约 4000–5000 Token 而非固定上限,短/适中/展开正文目标不同但推理余量保持充足;上下文输出预留与实际请求 max_tokens 改为同一次计算结果(单聊、Bridge、预设测试生成共用),用户在高级设置中的输出硬上限始终生效,低于推理所需时在预算明细中给出风险提示;内置预设全部迁移到篇幅提示,maxTokens 语义改为"模型输出硬上限",预设编辑器新增"回复篇幅"选择。

  • 下一步方向跟随叙事模式与待办状态:方向视角改为跟随当前会话模式(点选后以该模式发送),切换模式后只为最新一条已有方向的消息重新生成,旧方向在新结果到达前保持可见;用户发送消息后自动清空上一轮方向(含持久化与在途请求取消),避免旧方向既不再是“下一步”又污染新一轮输入。

  • 下一步方向(阶段 C:群聊与跨端):群聊仅在自动接力结束、轮到用户时生成 3 个方向,中间轮次不产生无效请求;群聊消息气泡下方展示方向卡片,点选回填群聊输入框,草稿非空时先确认,仅最新一条可换一批。桥接端新增方向生成服务与 POST /sessions/:sid/messages/:mid/directions 接口,回复落盘后按会话开关异步补齐方向;Android 端新增方向卡片(点选回填、覆盖确认、换一批、失败提示)并读取会话开关。

  • 续写长度稳定化(阶段 B):续写长度改为“本次新增内容”语义,四档给出可验收的字数区间(短句 20–60 字 / 小段 80–180 / 展开 220–420 / 长篇 500–900)与结构目标,输出预算同步调整为 128 / 384 / 768 / 1536 token;生成后做长度校验,截断或明显偏短时补足、明显超长时压缩,越界修复最多一次,修复失败保留原输入并给出反馈。剧情变化温度收窄为 0.45–0.75,档位文案改为「延续 / 波澜 / 转折 / 剧变」,长度档位改为「短句 / 小段 / 展开 / 长篇」;续写设置面板移除隐形滑块,只保留分段按钮。

  • 下一步方向(阶段 A):以会话级「下一步方向」取代「游戏主持格式」。AI 回复完成后由独立轻量请求生成 3 个方向(稳妥 / 探索 / 冒险),以气泡外的卡片展示;点选只回填输入框,不自动发送,草稿非空时先内联确认;支持「换一批」。方向随消息持久化,重生成、Swipe、编辑正文或删除消息时失效,会话切换与消息删除会取消在途请求。开关位于对话快捷设置(单聊与群聊共用入口),主回复提示词不再注入「【判定】」与「【可选行动】」;旧会话的 gameMasterMode 在兼容期内映射为新字段。

  • 生图构图与角色入镜控制:重做 /imagine 生图选项,新增「剧情瞬间 / 对方近景 / 对方全身 / 互动构图 / 环境空镜」画面重点,以及「不出现 / 仅轮廓 / 半透明 / 第一人称」我方入镜方式;生成提示词会优先描述对方角色的神态、视线、姿势、动作、手部、穿着状态与材质,并结合镜头、光线和最近剧情组织画面。

  • 角色封面导出图片:角色卡「更多 → 导出」菜单新增「封面图片」,按封面真实格式(PNG/JPG/WebP 等)弹出保存对话框导出为独立图片文件。

修复

  • 低输出硬上限导致推理模型整轮空响应:预设 maxTokens=0 改为“自动预算”,内置与新建预设默认不再施加用户硬上限;单聊、群聊与 Bridge 共用“正文预算 + 推理余量”请求上限。保留用户正数硬上限的严格语义,但当其低于推理余量加最小可用正文空间时,在设置界面警告并在发送前拦截,不再用盲目重试浪费请求;若上游仍返回 length + reasoning≈completion + 空正文,显示可操作的“推理已占满模型输出硬上限”错误并单独记录观测分类。
  • 统一收尾顺序(S1):新增共享管线 runGeneratedReplyPipeline(供应商推理清理 → output 正则 → 停止字符串 → shared 收尾器 → 至多一次短补尾),桌面单聊、群聊三模式、消息续写与 Bridge 的 sendMessage / regenerate 全部走同一入口,正则每条消息只执行一次;Bridge regenerate 此前完全跳过正则与停止字符串、用户停止(cancelled)可能被收尾器改写正文,两者均已对齐;无稳定边界时按收尾器契约补尾,失败不保存半句。同时恢复 streamGroupAI(点名 / 轮询)丢失的 AI 请求派发——该回归会让群聊除自由发言外完全不发起生成。
  • 群聊超时统一收尾(S2):初始超时与收到 chunk 后的续期超时、点名 / 轮询 / 自由发言三种模式全部走 handleGroupStreamTimeout——部分正文经统一管线收尾后停在稳定句界,错误原因只写 generationError(不再把“⚠️ 请求超时”拼进正文,也不会进入复制 / TTS / 上下文 / 记忆摘要);无稳定边界时不落盘半句;手动停止改用 generationNotice: '已停止生成'。
  • 长记忆输出预算动态化(S3):单聊与群聊长记忆不再固定 6144 / 2048(取代 R1 中的固定值说明),改为按模型能力档案计算请求上限(正文约 2500 字 + 推理余量),非推理模型不再无条件请求 8192;finishReason=length 且事实提案被截断时明确记录“摘要已保存、事实未更新”,不再静默当作完...
Read more

轻语0.17.0

Choose a tag to compare

@github-actions github-actions released this 01 Sep 11:50

夸克网盘链接
https://pan.quark.cn/s/a9853284d260

更新日志

[Unreleased]

[0.17.0] - 2026-09-01

新增

  • 局域网 / Relay 双通道:PC 可在不开放入站端口的情况下通过 HTTPS/WSS Relay 连接 Android,与原 LAN Bridge 独立启停。
  • Relay 服务 0.1.0:新增 Ed25519 Access Token、轮换 Refresh Token、一次性配对票据、租户 RLS、设备吊销、在线 RPC 网关和 Docker 部署骨架。

变更

  • Bridge 生成业务改为共享 MobileFacade / BridgeRuntime,LAN 与 Relay 复用同一业务实现和取消注册表。
  • PC 设置页将局域网连接与服务器连接整合为统一的“双通道连接”面板,并为服务器地址预填 https://cjbtj.xyz。
  • Android 连接页同时提供“局域网连接”和“服务器连接”,服务器地址默认使用 https://cjbtj.xyz,旧连接记录自动按 LAN 读取。
  • README 将更新日志前移至项目简介下方,并把仓库结构调整到界面截图之后。

修复

  • 修复创建 Relay 配对码时无请求体的 JSON POST 未发送 Content-Type,导致服务器返回 400 的问题。
  • Android 翻译结果现在直接替代消息正文,并在翻译期间显示明确的处理中状态。

[0.16.8] - 2026-08-31

新增

  • Windows 防火墙排查指引:PC“设置 → 手机连接”移除自动修改防火墙的按钮,改为提示前往“设置 → 隐私与安全性 → 防火墙与网络保护”手动检查专用/公用网络防火墙,并明确提醒关闭防火墙的安全风险。

变更

  • 桌面与 Android 独立版本:PC 版本定为 0.16.8,Android 版本独立为 0.2.0;版本门禁分别校验 Android Gradle、README 与 Android 更新日志,不再强制两端版本号相同。

修复

  • Android 局域网连接探测:兼容性探测移至 IO 线程,修复手机浏览器能访问 PC 接口、但 Android App 在进入配对前即连接失败的问题
  • 真机连接可靠性:Android 扫描含多个局域网地址的二维码时逐个探测并自动选择可达端点,不再因第一个网卡地址不可用而直接失败。
  • 连接错误提示:Android 配对失败会区分断网、超时、端口不可达、DNS、TLS、服务不匹配、配对码失效、审批超时与请求过频,并给出对应处理建议。

Android 0.2.0 摘要

  • 修复发送消息在对方回复后暂时消失、重新打开对话才恢复的问题。
  • 对话页时间与操作栏合并为一排,“回到最新”改为淡色半透明;收紧顶栏、消息操作区和输入区,为正文留出更多空间。
  • 增加状态栏安全区,修复真机系统图标与应用顶栏重叠;聊天底栏明确消费 IME inset,使输入框在 edge-to-edge 真机窗口中随软键盘上移。
  • 全局会话名称改为“角色名-对话名”,并移除摘要中重复显示的角色名。

[0.16.6] - 2026-08-29

本版本为安卓端(伴侣端 App)优化专项,对齐实施文档阶段 A–D;PC 端配套变更集中在移动桥接层(设置同步快照端点、WS 广播、配对二维码 v2、mDNS 发现字段)。

新增

  • 安卓已配对启动直达:冷启动先经本地快照启动决策——已配对用户直达会话区,不再闪现配对页;活跃 PC 丢失时进入设备选择页(不自动代选),配对令牌损坏时标记“需要修复连接”且不删除数据;通知点击回会话(deep link)仅在启动决策完成后消费,未配对时不会被误跳。
  • 安卓连接协调与诊断(阶段 B):连接状态机统一由协调器收敛——指数退避自动重连(0–30s ±20% 抖动)、断网监听去抖后自动探测恢复、候选端点并发探测并优先上次成功地址、最近 100 次连接尝试环形指标(JSON-lines 私有目录);设置页新增“连接诊断”卡片。REST/WS/图片/朗读共享同一网络栈,WS 按 generation+deviceId 隔离并发连接,A/B PC 快切不串台。新增 47 项单测。
  • PC 设置同步 v2(阶段 C):PC 新增 GET/PATCH /api/v1/settings/snapshot(移动端 15 字段白名单、revision 乐观锁、409 冲突返回 PC 当前值、applied/rejectedFields)与 settings:updated WS 广播(本机来源防回环);安卓侧快照/补丁仓库(v2/legacy 能力协商、按 deviceId 隔离缓存、断线失败不排队、切机清内存)、逐行四态同步 UI(保存中/已同步/失败重试/冲突对比)、滑块合并与“仅本机”分组;安卓容器已接线共享仓库与 WS 事件分发。
  • 配对二维码 v2(阶段 D):二维码载荷升级 version:2(serverId、能力集、一次性配对码与 5 分钟过期、多端点),PC UI 默认 v2 并保留“旧版兼容”输出;安卓扫码接入双格式纯解析(逐项校验,失败收敛 Invalid);mDNS TXT 增补 serverId/apiVersion 等发现字段。

变更

  • 版本单源门禁:scripts/version.mjs 扩展 status/android/release,以 PC package.json 为唯一权威同步 Android versionName/versionCode(严格单调递增)与 README/CHANGELOG 版本行,CI 挂一致性校验(当前 0.16.6 / build 7)。
  • 安卓端点规范化与明文策略:IPv4 私网/CGNAT/localhost、IPv6 回环/ULA/link-local(zone id 编码)与 .local 端点统一规范化(IPv6 URL 自动加方括号),公网地址拒绝明文 HTTP 构造;重定向拦截器拒绝跨安全级跳转并剥离跨主机 Bearer。
  • 安卓通知权限延迟申请:移除启动即申请 POST_NOTIFICATIONS;改为在设置页开启“任务通知”时先用途说明再申请,永久拒绝提供“前往系统设置”入口,首次后台生成给一次性非阻塞提示;系统权限与 App 内开关统一门控投递。

修复

  • 安卓主题选择:主题/字体/间距切换改用统一的底部选择面板,选择立即生效并持久化,冷启动后保持(此前选择项失效不生效)。

轻语v0.15.1

Choose a tag to compare

@GUAPIXIA GUAPIXIA released this 25 Aug 15:55

夸克网盘链接
https://pan.quark.cn/s/a9853284d260

更新日志

[Unreleased]

[0.15.1] - 2026-08-25

新增

  • 在线更新:集成 electron-updater 双通道更新(自托管镜像源优先、GitHub Releases 兜底),设置页将「软件更新」置顶,支持检查、下载进度、重启安装、镜像源配置,并提供服务器、GitHub 与夸克网盘三种手动下载入口;NSIS 开启增量更新(blockMap);推送 v* 标签自动构建并发版到 GitHub Releases;公告服务端新增 /update 静态托管目录用于镜像分发。

修复

  • 在线更新可靠性与安全性:区分“无更新”和检查失败,开发模式不再误报最新;版本判断改用 electron-updater 标准 SemVer 结果;正式版默认使用官方 HTTPS 镜像并强制安全协议,镜像保存失败显示原因;发布工作流新增版本一致性、类型、Lint 与全量测试门禁。

[0.14.0] - 2026-08-25

新增

  • ComfyUI 文生图兼容:生图模型新增 ComfyUI 后端,支持本地 8188 服务、远程代理鉴权、内置基础文生图工作流和自定义 API 工作流 JSON;可自动映射提示词、负面提示词、尺寸、随机种子、步数、CFG、采样器、调度器与 Checkpoint,并通过队列、历史和图片接口完成生成结果回收。
  • 新对话默认长记忆:设置页“显示与行为”新增“新建对话默认开启长记忆”,开启后新建单聊与群聊默认使用自动模式,每 10 条消息总结一次;已有会话不受影响,角色卡自身的长记忆配置仍优先。
  • 关键事实手动维护:长记忆面板允许添加纯文本事实,并支持行内编辑纯文本或“主体 / 属性 / 内容”结构化事实;结构化事实编辑时保留 ID、重要性、置信度与来源记录,单聊和群聊均可持久化。

变更

  • 长记忆面板重构:面板改为分区式记忆控制台,直接展示启用状态、手动/自动模式、6/10/20/30 条快捷间隔、对话统计、当前摘要、关键事实和历史归档;增加窗口内滚动、空状态、回复中禁用提示、Esc 关闭与无障碍状态属性。
  • 快捷设置图标统一:关闭、刷新模型、连接测试、搜索清除、世界书增删和说明按钮统一尺寸、边框、悬停、危险色与焦点样式,并补齐 aria-label / title。
  • 预设列表扁平化:取消预设分组、折叠状态和编辑页分组字段,所有预设直接在统一网格中展示。
  • 用户身份语义简化:移除身份页“当前 vs 默认”提示及“当前”状态,身份卡点击直接进入编辑,仅保留对新会话有明确作用的“默认”标记。
  • 角色卡主操作精简:“开始对话”改为仅显示图标,保留悬停标题与无障碍名称。
  • 对话分支命名调整:新分支继承原会话标题并追加“· 分支”,不再截取消息正文作为分支名称。

修复

  • 手动事实的语义检索一致性:添加或编辑关键事实后递增记忆版本、清除旧事实向量和语义命中缓存;向量版本不一致时安全回退完整事实注入,避免继续检索到修改前的内容。
  • 长记忆并发与检索正确性:单聊、群聊的摘要提交、手动事实编辑和消息派生记忆失效改为主进程版本条件写入,过期结果不再覆盖新数据;群聊等待落盘后才更新界面,保存失败会明确提示。
  • 长记忆事实维护:事实达到 30 条后按重要性、置信度与更新时间淘汰,保留新事实;历史归档限制为最近 200 条,兼容旧数据缺失作用域及“本会话/本群聊”等模型表述,并把事实来源关联到实际证据消息。
  • 长记忆预算与漂移:摘要输入预算根据模型上下文、提示词开销和输出预留动态计算;超长单条消息保留首尾后安全推进游标;时间线改为最多 8 条稳定事件,降低反复递归摘要造成的信息漂移。
  • 事实语义分数透传:向量检索返回真实相似度并贯穿单聊、群聊排序和上下文预算,不再为所有命中项写死相同分数;置信度正式参与事实保留与注入排序。

[0.13.0] - 2026-08-25

新增

  • Backup V2 全量备份:zip 容器 + manifest.json(版本/应用版本/时间/数量/哈希/未包含项)+ sha256 逐文件校验 + safeId 路径遍历防护 + 原子写入与快照回滚;覆盖 settings/characters(含头像/封面)/lorebooks/presets/personas/regex/quickReplies/mcp/usage/chats/groups 全量,敏感 apiKey 默认剥离并在结果页明示;兼容 V1 JSON 导入;新增 scripts/verify-backup.mjs(--self-test 导出→清空→导入哈希比对)。
  • 群聊默认选中:进入群聊页自动恢复上次选中,无则选中第一个,消除空状态多余点击;localStorage:group-last-selected 持久化。
  • 身份搜索与导入导出:身份页新增搜索(名称/描述/性格)、导入/导出 JSON(合并去重)、当前 vs 默认 区分说明。
  • 世界书搜索:左栏书级搜索(名称/描述)、右栏条目搜索(关键词/内容)+ 无匹配提示。
  • 公告未读与刷新:未读蓝点(localStorage:announcement-read)、手动刷新、最后更新时间、离线缓存徽章(WifiOff)。
  • 独立预览模式:window.api 缺失时注入 typed mock(src/lib/preview.ts),?preview=1 顶部横幅,避免 Vite 直开白屏,支撑前端独立预览与视觉回归。

修复

  • F-02/F-03 导入反馈:settings:exportBackup/importBackup 返回 {status:'canceled'|'success'} 结构化结果,取消不再误报成功;导入后全量重载 settings/character/persona/group Store。
  • F-04 MCP SSE:表单禁用 SSE 选项并标注“暂未支持”。
  • 角色卡导入兼容性(tags 脏格式):部分社区卡 tags 为字符串导致 visibleTags.map is not a function 白屏,现已在导入归一化、落盘自愈、前端三层兜底,已入库脏数据自动修复。
  • 弹窗可访问性:Modal 补 role=dialog/aria-modal/aria-labelledby、焦点圈定、初始焦点、焦点恢复、body overflow 锁定。
  • 用量与备份文案:用量页明确“字符统计(精确 Token 开发中)”,备份说明与 README 同步为 V2 全量口径。
  • 页面返回一致性:用量页移除同级返回箭头(BarChart3 标题)。

变更

  • F-05/MCP/备份文案与导流:H0 先改文案止损,S1 再落地代码,避免误导。
  • 角色卡导入改为严格校验:tags/alternate_greetings/group_only_greetings 必须为 string[],description 等必须为字符串,否则拒绝导入并提示字段;历史脏数据仍由 normalizeStoredTags 兜底。
  • 侧栏分组:14 个平级入口重构为核心/资源/服务/系统四分组,默认仅核心展开,保证 900×600 下核心入口无需滚动;localStorage:sidebar-groups-collapsed 记忆。
  • 聊天页收敛:顶部收敛为 Token + 更多 下拉(上下文/快捷设置/背景/生图历史/导出/清空),正文限宽 780px 提升阅读舒适度。
  • 角色卡常驻主操作:网格卡常驻“开始对话”胶囊按钮,其余收进 ⋯ 菜单,删除危险色分隔。
  • 设置页分区:左侧目录(API/外观/行为/手机连接/语义/网络/数据管理)+ 滚动高亮 + 顶栏保存状态(保存中/已保存)。
  • Tooltip:group-hover 升级为 group-hover + group-focus-within,补 role=tooltip 与 focus-visible。

轻语 v0.12.1

Choose a tag to compare

@GUAPIXIA GUAPIXIA released this 20 Aug 10:18

夸克网盘链接
https://pan.quark.cn/s/a9853284d260

轻语 QingYu v0.12.1

本次更新

  • 修复新对话链路双写导致的消息重影和 beta 流式显示异常。
  • 完成长记忆分层预算、历史归档、游标感知检查点重算与群聊检查点同步。
  • 语义触发改为复用已有 AI 连接档案,避免重复配置。
  • Android 伴侣端更新至 0.1.5(build 6),补充通知、草稿、错误处理、搜索和安全存储等能力。

安装包

  • Windows x64:QingYu-PC-v0.12.1-x64-Setup.exe
  • Android 8.0+:QingYu-Android-v0.1.5-build6.apk

Windows 安装包未配置商业代码签名证书,系统首次运行时可能显示安全提示。
Android APK 使用开发密钥签名,可直接安装;它不适合作为应用商店正式签名包。

SHA-256

ADDCB83741A83B6A8C1A6EE9AD608FDAEAC9C67DD8D8EC1FA72BBC1DF3C309C1  QingYu-PC-v0.12.1-x64-Setup.exe
846CB7D0E6506C87AE9813A3D7892C2FAC673D102DDE126578B65AE450B476A6  QingYu-Android-v0.1.5-build6.apk

验证

  • TypeScript 检查通过
  • ESLint 通过
  • PC:141 个测试文件、1232 项测试全部通过
  • Android:单元测试、Lint、APK 构建通过

轻语v0.11.27

Choose a tag to compare

@GUAPIXIA GUAPIXIA released this 18 Aug 10:29

夸克网盘链接
https://pan.quark.cn/s/a9853284d260

🍶 轻语 QingYu v0.11.27

🐛 Bug 修复(12 项)

编号 问题 修复
H-1/H-2/H-3 写操作 fire-and-forget safeSave/safeFire 错误处理
H-4 懒加载页面无 ErrorBoundary 双层 ErrorBoundary(路由+消息级)
H-5 Promise.all 无 try-catch 改用 Promise.allSettled 容错
M-1 WS 心跳无 pong 检测 双向心跳 + 超时断开 + 连接上限
M-3 角色列表 N+1 查询 existsSync 文件存在性检查
M-4 replaceVariables 跨层导入 移至 electron/utils/
M-5 CSP connect-src 过于宽松 去除 http:/ws:
M-6 setTimeout 未清理 5 处 cleanup 修复
M-9 退出流程无日志 MCP 超时 warn 日志
L-6 版本号硬编码 app.getVersion() 动态读取
L-7 Claude API 版本号 提取为常量
L-8 正则每次重新编译 模块级预编译

🏗️ 仓库管理

  • 清理 android/ 和 server/ 路径追踪(独立仓库)
  • README 更新仓库结构说明

🧪 测试覆盖

  • 新增 19 个测试文件,53 个测试用例
  • 覆盖率:34.49% → 39.06%(+4.57%)
  • 新增模块:electron/ipc、src/hooks、src/pages、streamController 深度测试

📦 依赖

  • Electron 43.4.0
  • React 18.3.1
  • TypeScript 5.8.3

轻语v0.11.25

Choose a tag to compare

@GUAPIXIA GUAPIXIA released this 17 Aug 06:50

夸克网盘链接
https://pan.quark.cn/s/a9853284d260

[0.11.25] - 2026-08-17

依赖升级 + 代码质量修复

依赖升级

  • Electron 32.0.0 → 43.4.0(修复 EOL 版本安全问题,Chromium 152 + Node.js 24)

TypeScript 编译修复

  • bridge/ttsHandler.ts: 添加缺失的 restoreSecrets 导入(H-5 补完)
  • bridge/routes.ts: pairingCode 类型安全处理(string | undefined → string)

ESLint 修复(17 项 → 0 项)

  • 清理未使用的导入:ipcMain、readRules、QuickReply、ContextSettingsSnapshot、Preset 等
  • remark-audio.ts: 添加 AudioNode 接口替代 any 类型
  • ESLint 配置: 测试文件添加 argsIgnorePattern、vitest.config.js 解析修复

公告服务端

  • 安装缺失的 jsonwebtoken 依赖

轻语v0.11.23

Choose a tag to compare

@GUAPIXIA GUAPIXIA released this 13 Aug 14:30
  1. 新功能
  • 世界书(Lorebook)增强:at_depth 深度注入(v0.9.1)、语义触发向量 RAG(v0.9.4,嵌入服务 + 向量索引 + 余弦检索)、导入时智能推荐绑定(v0.11.11,CJK 感知匹配算法重写)
  • 上下文与记忆:上下文模板 10 种内置(v0.9.3)、作者注释两级配置(v0.9.2)、长记忆升级为摘要+关键事实双段(v0.9.4)、上下文溢出 AI 压缩 + 记忆事实向量检索注入(v0.11.3)、上下文上限预警条(v0.11.4)
  • 正则系统:触发器、停止字符串、text/markdown 双阶段、分组管理、引擎纯函数化(v0.9.5)
  • 预设管理三批优化:导出/复制/分组(v0.11.5)→ 参数模板/Token 预算预览(v0.11.6)→ AI 生成预设 + 预设测试器(v0.11.7)
  • TTS 双引擎扩展:OpenAI 兼容 TTS(v0.11.8)+ Edge TTS 免费 14 音色(v0.11.9)
  • 快捷回复 + 宏系统:全局/角色级快捷回复、10 个内置宏、宏注册表(v0.11.2)
  • 制作角色卡向导:三步流程(概念 → 封面 → 预览)、AI 一句话扩展、单字段帮我写、备选开场白、草稿持久化(v0.11.12)
  • API 提供商扩展:OpenRouter/vLLM/LM Studio/TabbyAPI + 适配器注册表(v0.11.0);协议精简为 4 个真协议 + OpenCode Go 订阅接入(24 模型逐一实测,18 个兼容)(v0.11.10)
  • 对话体验:单聊引用回复、会话标题自动生成(v0.11.4);用户人设注入规则可配置、群聊自由发言视角切换(v0.10.2)

2. 安全加固

  • 纵深防御(v0.11.11):页面导航防护、生产 CSP 注入、公告 HTML 消毒、危险协议链接降级、日志 API Key 脱敏
  • 26 项审查修复(v0.11.15):IPv4-mapped IPv6 SSRF 绕过、MCP 命令执行白名单、公告下载重定向校验、会话删除竞态等
  • 凭据加密(v0.11.16):API Key 不再明文落盘,safeStorage 加密凭据库,备份自动剥离/迁移;服务端弱密码拒绝启动
  • 依赖审计(v0.11.14):vitest 2→3、electron 31→32、electron-builder 24→26,63 漏洞降至 29,CI 新增审计门禁
  • 早期基线(v0.8.2,区间前):JWT 密钥/管理员密码强制环境变量、登录限流、IPC safeId、SSRF 防护

3. 性能优化

  • 流式渲染热路径拆分选择性订阅、字符统计增量缓存(v0.11.16)
  • 群聊批量保存 IPC、GroupChatPage 23 个选择性订阅(v0.11.18)
  • 路由懒加载 14 页、生产去 sourcemap(v0.11.17)
  • 消息读取 LRU 缓存、流式 chunk 累积器节流(v0.11.23)

4. 架构与工程治理

  • 大文件拆分:useChatStore(v0.11.20)→ MessageBubble 操作栏(v0.11.21)→ 五个超大文件按职责拆分,净删约 2100 行(v0.11.23)
  • IPC 契约收口:事件通道常量化、注册器清单化、死代码清理(v0.11.17/v0.11.19)
  • 测试基建:server 纳入 workspace 真实执行测试(v0.11.18)、角色卡模块覆盖率 95%+(v0.11.13)、CI 覆盖率门禁生效(v0.11.16)
  • 文档治理:功能状态审计修正 README 失实宣称(v0.9.0)、路线图校准(v0.11.14)、帮助页新手指引完善(v0.11.22)

轻语v0.8.9

Choose a tag to compare

@GUAPIXIA GUAPIXIA released this 28 Jul 19:29

夸克网盘链接
https://pan.quark.cn/s/a9853284d260

更新日志

[0.8.9] - 2026-07-29

新功能

  • 字体自定义功能:
    • 新增对话字体选择功能,支持 6 种内置字体(系统默认、Arial、微软雅黑、宋体、黑体、楷体),每种字体均带预览效果
    • 支持用户上传自定义字体文件(TTF/OTF 格式),字体文件存储在本地用户数据目录,上传时校验文件格式(magic number)和大小限制(10MB)
    • 字体变更通过 CSS font-display: swap 异步加载,避免页面卡顿;切换后所有对话历史记录实时生效
    • 设置页新增字体管理区域:上传、预览、应用、删除自定义字体
  • 群聊引用回复:
    • 群聊消息支持引用回复,hover 消息显示回复按钮,点击后输入框显示引用预览条
    • 发送消息时引用块显示在气泡顶部,含被引用消息的角色名和内容预览
  • 群聊 @提及高亮:
    • 用户消息中 @角色名 自动检测并以高亮样式显示(accent 色背景 + 圆角)
    • 基于群成员名动态匹配,避免误匹配邮箱/URL 中的 @ 符号
  • 群聊用户消息发送状态:
    • 用户消息发送时显示「发送中」旋转图标,AI 回复完成后变为「已发送」勾选图标
  • 群聊消息气泡不透明度调节:
    • 群聊设置面板新增「气泡不透明度」滑块(0%-100%),支持拖动实时预览、松手保存
    • 角色气泡通过 color-mix 动态混合背景色与透明度,配合聊天背景使用效果更佳
    • 用户气泡保持固定样式不受影响
  • 单元测试框架:
    • 引入 Vitest + @testing-library/react + jsdom 测试框架
    • 编写 128 个单元测试,覆盖核心工具函数(对话解析器、消息后处理、默认值)、设置 Store、群聊 Store 和群聊消息组件

改进功能

  • 群聊消息 UI 全面对齐单聊:
    • 布局重构:新增 mx-auto 居中容器,使用 settings.messageWidth 限制最大宽度,消息不再紧贴左边缘
    • 头像升级:添加渐变背景(bg-gradient-to-br)和环形光效(ring-2),与单聊 MessageBubble 风格统一
    • 名称行升级:字号从 text-[10px] 提升至 text-xs,名称使用 font-medium text-tavern-text-soft,时间和发送状态移至头部行
    • 气泡升级:内边距从 px-4 py-2.5 增大为 px-5 py-3.5,添加阴影,支持 settings.bubbleStyle 圆角设置
    • 用户气泡使用与单聊相同的暖色渐变(from-amber-100 to-orange-50),角色气泡保留彩色左边框 + shadow-sm
    • 消息间距改用 settings.messageSpacing 内联样式
    • 新增 .mention-highlight 和 .reply-quote CSS 样式类
  • 群聊背景层 z-index 修复:
    • 背景层添加 z-0,顶栏/消息区/输入区/成员栏添加 relative z-10,修复聊天背景遮盖菜单栏的问题
  • 角色卡页面性能优化:
    • CharacterCard 包裹 React.memo,配合 useCallback 稳定回调引用,避免父组件重渲染时所有卡片跟着重渲染
    • 搜索输入使用 useDeferredValue 防抖,输入时不再逐字符触发全量过滤
    • 封面图片添加 loading="lazy" 懒加载,视口外图片延迟加载减少初始解码压力
    • CharacterCard 的 store 订阅从全量解构改为 4 个独立选择器,避免导入进度等无关状态变更触发卡片重渲染
    • 尺寸配置对象 SIZE_CONFIG 从组件内部提取为模块级常量,减少每次渲染的对象创建
  • 群聊默认预设:
    • 新建群聊默认应用「默认通用」内置预设,无需手动在设置面板中选择
  • 群聊上下文与世界书引用优化:
    • 世界书扫描文本加入角色名前缀(【角色名】内容),以角色名为关键词的世界书条目现在可被正确触发
    • 后历史指令(postHistoryInstructions)纳入 token 预算裁剪计算,避免裁剪后注入导致实际上下文超出 maxContext

已知问题

  • 自定义字体仅当前设备可用,不随角色卡导出(与现有纯本地存储策略一致)
  • 内置字体(SimSun/SimHei/KaiTi)依赖系统已安装,若用户系统未安装则浏览器自动 fallback

[0.8.8] - 2026-07-28

改进功能

  • 预设上下文长度跟随模型:所有内置预设的 maxContext 改为 0(跟随模型默认),不再硬编码 8192/16384 限制模型实际能力。用户选 GPT-4o 即可用 128K 上下文,选 Claude 即可用 200K,预设不再拖模型后腿
  • 越狱预设输出长度提升:越狱-温和/标准/强力的 maxTokens 从 1024 提升到 2048,修复 Claude 思考模型(thinking budget = max(1024, maxTokens/3))下思考预算吃满全部输出额度导致实际回复为空的问题
  • 快捷设置自定义 Token 输入:快捷设置面板的最大 Token 除 4 个固定档位按钮外,新增自定义数字输入框,支持输入任意值
  • 快捷设置字体放大:快捷设置面板内所有文字字号统一调大(原 9px/10px/11px 提升至 11px/12px),改善可读性
  • 角色卡页面全面优化:
    • 卡片尺寸可调:搜索栏新增小/中/大三档尺寸切换,小卡 1:1 方形紧凑排列(一屏 ~20 张),中卡 3:4 竖卡(一屏 ~12 张),大卡 2:3 宽卡展示更多信息;尺寸偏好自动记忆
    • 卡片信息增强:新增性格特征碎片标签(柔和圆角色彩)、场景设定预览(斜体一行)、创作者名称(@作者名);卡片信息密度翻倍,所有字段随尺寸自适应显示
    • 角色详情面板:点击卡片任意位置打开右侧滑出只读详情面板,分区展示角色全部设定(基本信息/标签/角色设定/对话设定/高级设定/绑定设置),无需进入编辑模式即可浏览
    • 首条消息预览:卡片信息区展示首条消息原文/翻译(替代原先难以辨认的角色描述),中/大卡显示 2 行,悬浮封面也可预览
    • 排序功能:搜索栏新增排序下拉,支持按最近更新/创建时间/名称排序
    • 首条消息一键翻译:卡片左下角新增翻译按钮,无需打开编辑器即可翻译首条消息;支持多张卡片同时翻译,互不阻塞

Bug 修复

  • 继续续写功能无效:修复"继续续写"按钮未向 AI 传达续写意图的问题。原先仅创建新气泡走普通生成流程,AI 无法感知续写需求导致内容不连贯。现新增续写指令注入上下文末尾,并将原消息内容作为 preContent 传入流式输出,新气泡完整显示"原内容 + 续写内容"
  • 预设 maxContext 被强制覆盖:修复 getActiveProfile() 中 profile.maxContext || 8192 导致预设的 maxContext 永远不生效的问题(profile 始终返回 >= 8192 覆盖了预设值),现已改为 || 0 让 0 表示"跟随模型"
  • Token 用量显示不准确:修复 ChatHeader 和 ChatInput 中 maxContext 为 0 时显示硬编码 8192 的问题,改为根据当前模型动态推断默认上下文长度
  • 侧边栏无法滚动:修复字体设置过大时侧边栏导航项溢出但无法滚动的问题,导航区域添加 overflow-y-auto
  • 对话解析器正则全面重构 (B-07/B-08):
    • 粗体文本误渲染为黑点:修复 AI 输出 **粗体** 时解析器误将 *粗体* 匹配为动作、残留外层两个 *在 CJK 字体下显示为黑色实心点的问题。新增 **...**、***...***、__...__、___...___、~~...~~ markdown 语法保护
    • 反引号破坏行内代码:移除反引号\...``→双引号的强制转换,该转换会将 markdown 行内代码误转为"对话"样式;改为直接保护行内代码
    • 动作内容支持内含 *:动作正则从 [^*]+ 改为 [\s\S]+? 非贪婪匹配,*does *this* too*可正确整体解析为动作
    • 说话人名 Unicode 扩展:支持带重音拉丁字母(José)、西里尔字母(俄语)、数字(Player1)、连字符(AI-chan)等角色名
    • 新增单引号对话支持:Speaker: 'text'和Speaker:'text'可正确识别为对话
    • 英文缩写保护:don't、can't、it's 等不再被单引号对话正则误匹配
    • 中文引号全面覆盖:新增 CJK 双引号〝〞(U+301D/E)、直角引号变体﹁﹃﹂﹄(U+FE41-44)归一化;修复中文弯引号""(U+201C/D)此前未生效的问题
    • 多 thought 块提取:GroupChatMessage 改用 while+exec 循环提取全部思考块,与 MessageBubble 行为一致
    • 冗余 thought 剥离:MessageBubble 非翻译场景不再对已剥离文本重复执行 thought 标签处理
    • 占位符健壮性:占位符标记从空字节\x00改为 Unicode 私用区字符,避免渲染管道破坏;restore 改为循环替换以处理嵌套保护
    • 快速预检优化:新增预检正则,不含任何对话/动作标记字符时直接返回纯文本,跳过后续 10+ 步保护与解析