Skip to content

Releases: hellobs/ai-debater

v1.6.0 — 自动辩论 · 错题本 · 稿件导出

Choose a tag to compare

@hellobs hellobs released this 26 Oct 16:37

v1.6.0 — 自动辩论 · 演练错题本 · 稿件导出

新增

  • 自动辩论(教学向):输入辩题,AI 按标准华语辩论赛制代表双方打完整场——立论×2 → 驳论×2 → 质询小结×2 → 自由辩论 N轮×2 → 结辩×2(反方四辩先于正方),SSE 逐发言流式呈现。每个环节的字数/结构要求("立论:①定义②判准③三论点,280–340 字"等)编码进提示词——把"怎么打辩论"的领域知识变成工程资产。教学示范而非互搏评估:不做胜负判定、不做评分;整场 10–16 次上游调用,开始前界面明示;停止后当前发言完成即止(如实告知不装作立即免费停止)。
  • 演练错题本:攻防演练自评「被打穿」的题记入本机(localStorage),后续抽题 50% 概率优先重练;评「妙极」自动出库——演练从随机变针对性。
  • 稿件导出:稿件生成的成稿支持 Markdown(前端 Blob)与 Word(后端 python-docx 直出)下载;中文标题走 RFC 5987 编码。

修复

  • 自由辩论环节带「·第N轮」后缀导致 PER_STAGE 查表 KeyError → SSE 在自由辩论段整体断流。查表回退基础环节名,测试锁住。

质量底线

  • 后端 334 passed(净增 5:流程计数/顺序/环节提示词/docx)+ 前端 vitest 74 passed,全程 0 API 消耗。
  • 浏览器 E2E:自动辩论整场 14 张发言卡渲染完成(mock)、成本提示("整场 12 条发言 = 12 次上游调用")开始前可见、错题本与素材送入稿件实测。

成本红线:自动辩论是全项目单次消耗最大的功能(10–16 次调用),这正是它必须带醒目成本标注的原因;其余新功能均为纯本地计算。

v1.5.1 — 快反模式 + 素材送入稿件

Choose a tag to compare

@hellobs hellobs released this 26 Oct 15:37

v1.5.1 — 快反模式 · 素材送入稿件

新增

  • 快反模式(现场模式开关):自由辩论短兵相接时,勾选后只跑反驳+风险两路、预算压 8 秒——省 3 次调用、10 秒内接住对方短句。后端 /api/analyze 与 SSE 支持 advisors 过滤(显式空列表 = 跑零路,不静默改回)。
  • 素材送入稿件:素材库的人物例证与金句新增「送入稿件」按钮,经 localStorage 交接自动填进稿件生成的例证栏(取走即清)。

质量

  • 后端 331 + 前端 74 测试全绿(含 advisors 过滤透传/空列表语义 2 条新测试)。

v1.5.0 — 备赛模式:拆题 · 成稿 · 演练 · 素材

Choose a tag to compare

@hellobs hellobs released this 25 Oct 13:57

v1.5.0 — 备赛模式:拆题台 · 稿件生成 · 攻防演练 · 素材库

产品定义修订:从「现场实时参谋」升级为「备赛 + 现场一体」。辩手 90% 的时间在备赛——
本版补上这块业务面;现场参谋台保留为"现场模式",顶层一键切换(选择记本机)。

新增:备赛模式四板块

  • 拆题台:输入任意辩题,本地引擎秒出题型判定(价值/事实/政策)、正反主张、定义与判准建议、论点骨架、价值落点;「AI 深拆」一键云端深挖。
  • 稿件生成:结构化表单(定义/判准/三论点/金句/价值落点)→ 本地引擎自动供料 → 精修 → 成稿预览(字数/朗读时长计量)→ 复制;AI 供料(查漏补缺回填)与 AI 成稿走 /api/prep/ai(各 1 次上游调用)。
  • 攻防演练:真实交锋质询题库(10 题,含归谬反击要点),抽题 → 自想 → 看要点 → 自评(妙极/稳住/险胜/被打穿)。
  • 素材库:辩题库 18 部实录级攻防 / 主题例证 12 类 / 人物例证 77 条(全部正反双向,含使用提示)/ 金句 55 条,搜索 + 一键复制。

实现说明

  • 本地引擎放前端(src/prep/engine.ts,从辩论教练面板逐函数移植为 TS):离线秒出、纯静态可用;AI 是增强不是依赖。数据层经 node vm 沙箱程序化提取为 JSON(src/data/prep/)。
  • POST /api/prep/ai:拆题/AI 供料/AI 成稿三任务,一次调用 = 1 次上游调用;反幻觉纪律(严禁编造案例/判例/法条,不确定用「有报道称」口径)写进提示词;CSRF 防线覆盖。
  • 界面减字:22 处文字标注删除或收进悬停提示(动作进按钮、状态进形制、说明进 title),整页文字量 −35%;密钥安全披露保留。

修复

  • 引擎移植过程中被测试咬出并修正:parseTopic 斜杠式模态配对、偏好对相似度不作质量门槛(中文大改笔 ratio 轻易低于 0.5)、样本去重保留最新提交。

质量底线

  • 后端 329 passed(净增 5)+ 前端 vitest 74 passed(引擎移植 13 条单测钉住语义)+ tsc/build 全过,全程 0 API 消耗。
  • 浏览器 E2E:拆题/供料/成稿/素材搜索/演练要点全链路实测。

成本红线不变:备赛本地引擎 0 消耗;AI 深拆/供料/成稿各 1 次上游调用(界面明示);参谋 5 次不变。

v1.4.2 — 第一次真实云端端到端 · 连引核验修复

Choose a tag to compare

@hellobs hellobs released this 04 Oct 09:58

v1.4.2 — 第一次真实云端端到端 · 连引核验修复

一句话:这是项目第一次在真实云端模型上跑通完整热路径(此前所有验证都是本地模型或零消耗
替身)。真跑逮到两个只有实战才暴露的缺陷,都已修复。


为什么有这一版

v1.4.1 之后堆了 21 个提交,其中两处是安全修复。本版的核心不是"加功能",而是把那个唯一
用零消耗手段补不上的洞补上
:协议桥转译、json_schema 约束、并发模型、超时层次——这些
在 mock 与本地模型下都成立,但只有真接云端网关才能确认。

真跑经用户明确授权,共消耗 6 次上游调用(1 次单路探 + 5 次五路),单次约 ¥0.001 量级。

实测结果

单路探(1 次调用,只开「逻辑审计员」)

用 ADVISORS_YAML 临时名册只开一路、其余 enabled: false,1 次调用同时验三件事:

观察点 结果
协议桥转译(/bridge/v1 → Anthropic 协议 → 网关) 通
response_format=json_schema 被遵守 是
顶层 res 字段(_parse_output 强取) 正常
单次延迟 1.4–1.7s

max_tokens 未被吃掉——输出 97–534 字符。这条验证了一个已知陷阱:给 mavis 传合法的
max_tokens 反而会导致 0 次调用(未知 kwargs 静默空转),所以 mavis_bridge.py 干脆不传,
由桥侧 DEFAULT_MAX_TOKENS 兜底。

五路并行(5 次调用,LLM_CONCURRENCY=5)

观察点 结果
五路状态 全 ok
墙钟耗时 2.88s(最慢一路 2.85s)
真并发 确认——5 个请求在 37ms 窗口内发出
prompt_pack 传了 domain 时落 legal(法学包),产出明显更强

结论:现场用云端时,五路并行的延迟余量充足,不需要为速度牺牲路数。


修掉的两个缺陷

① 连引稀释内容核验(后端,误判)

真实模型产出了一句连引:

作品需具有独创性并能以一定形式表现,**《著作权法实施条例》**未要求创作须脱离工具独立完成

_claimed_after() 原来只在第一个句末符处截断,不知道下一部法从这里开始 ⇒ 下一条引用
标记被算进本条的分母。最长公共子串占声称长度的比例从 0.452 掉到 0.326,刚好跨过
MATCH_LOW=0.45 判错
——一条真引用被判存疑。

修法是剔除下一条引用标记本身(连同它前面的连接词"及/和/以及"),不是截断:
截断会让第一条什么都不剩,等于把真引用漏掉核验。

实测:同一条引用 match 回到 0.452,content_ok 恢复 True。整体 content_suspect
从 1 降到 0。新增 2 条回归,测试数据就是那句真实模型产出。

MATCH_LOW 一个字没动 —— 按既定口径,算法不改,只修实现 bug。

② 零引用与自由输入的界面口径(前端,说不清)

真跑同时暴露了一个真实的路子被堵死的情况:

  • 手打辩题时前端不带 domain,后端按「绝不猜」落 general 包。这本身是正确行为,
    但界面上既不说明、也不给出路,用户只看到法学语料一条都没引用。
  • 通用辩题本就无引用,界面却显示成"本轮没有《…》第…条式引用",读起来像出错。

改动(后端逻辑一字未动):

  • 新增 frontend/src/citeBar.ts:total === 0 时显示「引用 本轮无(通用辩题不引法条)」,
    且 warn: false——零引用也出现在状态条上,不再静默消失。
  • packNote():无 domain 时明说「提示词包 X · 自由输入,未选领域」,并提示从下拉选预设
    即可切过去;有 domain 时只报包名,不说教。
  • CitationPanel 的零引用文案与状态条统一口径。

新增 10 条前端用例覆盖这两处。


回归数据(发版前最后一轮)

项 结果
后端 pytest 316 passed(v1.4.1 是 314,+2 连引回归)
前端 npm test 59 passed(v1.4.1 是 49,+10 界面口径)
tsc --noEmit 0 错误
vite build 通过
桥探针 scripts/bridge_probe.py 10/10
npm audit --omit=dev 0 漏洞

两次交互之间的等待都设得大于单轮最坏耗时,并断言了「进行中」中间态;变异检验做了 4 次
(SettingsPanel 2 条、citations 1 条、citeBar 2 条),全部精准命中单点——全绿通常意味着
在测快照而不在测测行为
。


本版没有做的(以及为什么)

  • 没动 MATCH_LOW:内容核验的已知盲区(合理意译会判存疑,偏保守;半挪用/只截 1/4 原文
    都放行,拦不住拼凑截取)是算法层面的取舍,按既定口径不改,只修实现 bug。
  • 没给会话表加 domain 字段:会让复盘无法回溯当轮用了哪个提示词包,是一个已知取舍,
    不是漏项。要加得配套设计复盘视图,不适合塞进一个补丁版。
  • 没清 dev 依赖的 4 条 audit 告警:都在 vitest/vite 链上,清零得整条升到 6/7,
    会牵动 plugin-react 与 vitest,属独立任务。
  • 没重抓 npc.gov.cn 语料:仍是死穴(SPA 空壳 + TLS 握手失败)。加新法走 gov.cn
    子域镜像手工取。

升级提示

无破坏性变更,直接 git pull 即可。若你之前手打过辩题,现在起建议从预设辩题下拉里选,
否则提示词包会落在通用包上——这不是 bug,但法学场景下你会拿不到法学措辞。

复现入口

cd backend && API_PORT=8020 LLM_CONCURRENCY=5 ADVISOR_BUDGET_S=120 LLM_TIMEOUT_S=110 \
  "../.venv/Scripts/python.exe" -m app.main
# POST /api/analyze(body 里带 domain)→ POST /api/session/{id}/verify-citations

三条坑记在 HANDOVER.md §13续八:端点是 verify-citations 不是 citations/verify;
package-lock.json 里 4 处版本号只改前 2 处;手打辩题要传 domain。

v1.4.1 — 协议桥加固 · 台账可删 · 前端有了第一层测试

Choose a tag to compare

@hellobs hellobs released this 04 Oct 09:29

v1.4.1 — 协议桥加固 · 台账可删 · 前端有了第一层自动化测试

v1.4.0 之后的第四轮体检结清。两个安全修复 + 一个数据治理功能 + 前端从零到有的测试层。

⚠️ 安全修复(建议尽快升级)

协议桥跨站可烧额度

/bridge 整条豁免在 CSRF 中间件之外(mavis 是服务端进程,发不出 UI 头),原先指望
"只监听本机 + 凭据不落盘"兜底。实测这条兜底不成立:桥转发前不看任何来源,而浏览器
text/plain POST 是 CORS 简单请求(不发预检、也发不出自定义头),跨站 POST 能带着
x-api-key 打到上游 —— 即跨站成本放大。

修法:桥内自己再判一层来源。纵深防御口径 —— 豁免前缀不该等于零校验。

  • 无来源(Origin / Referer 都没有)放行:mavis 用 httpx 调桥本就不带 Origin,这是它的自然形态
  • 带了但非本机 / 非 dev 源 → 403,且在碰上游之前就拒
  • 白名单:127.0.0.1 / localhost / ::1 + 本地 dev 源

回归手段(0 消耗,可直接重跑):scripts/bridge_probe.py、tests/test_bridge_origin.py。

桥在非 anthropic 形态下拒不服务(第三道门)

上一条修完后还剩一个残余面:形态不是 anthropic 时 mavis 走直连、根本不经过桥,但本机脚本
仍可以拿桥当跳板去烧额度
。现在桥自己先看一眼"我是不是生效中的那条上游路径",
不是就 503 拒不受理。

判据用 upstream.current().kind == "anthropic" —— 与 mavis_base_url() 同一条件,
所以不会误伤正常流程(mavis 只在 anthropic 形态下才指向 /bridge/v1)。
/bridge/healthz 新增 serving 字段,可以直接看桥在不在路径上。

回归:tests/test_bridge_serving.py(5 例,含"切回 anthropic 立刻恢复 200"这条防修复过头的)。

🗑 台账会话可删

以前只能增不能删 —— 打过的记录会一直躺在本地 SQLite 里。现在服务状态页有「⑦ 本机台账会话」
列表(最近 20 条:辩题 · 立场 · 时间)+ 逐条删除。

  • 后端 DELETE /api/session/{id},store.delete_session 一个事务级联清
    turns / cards / suggestions / feedback / citation_reports
  • 删的正好是当前会话时,前端状态一并清(sessionId / ledger / conflicts / autoCite)——
    否则界面挂着一个后端已不存在的 id,导出与两道检测全打 404
  • 删除态锁住整张表(防并发二次删除),分析进行中不许删

🔑 密钥默认不存本机

明文密钥躺进浏览器 localStorage 该由一次显式决定触发,不该由"顺手点了保存"带来。
现在默认不存,勾「记住密钥到本机」才存。三条规则:不传 = 不存 / 勾了没重填 = 沿用 /
传了以传的为准。

顺带咬出一个真 bug:toPatch() 原先无条件带 api_key: saved.api_key,一份"没记住密钥"
的配置照旧送去 = 传空串 = 清空后端内存里那把(api_key=None 才是"不动")。
症状是刚点完应用就显示「密钥未设置」。现在空密钥整个字段不提交。

🧪 前端第一次有自动化测试

  • 纯函数层29 例:upstreamStore / liveStateStore / adopt.cardFor(vitest 3.2.4——
    5.x 的 peer 要 vite 6+,与本仓库 vite 5 冲突)
  • 组件级 20 例(jsdom + testing-library):会话列表 / 删除态 / 密钥勾选字节级断言 /
    「点一次 = N 次上游调用」文案 / 「应用」时空密钥不带字段

写完做了变异检验:改坏实现看用例会不会红 —— 两条都精准命中单点
(去掉 rememberKey 判断 → 只有「不勾就保存」红;去掉删除锁 → 只有「删除中…锁全表」红)。
做法写进了 CONTRIBUTING §3。

🧾 界面把代价和限制说在按钮旁边

  • ⑤ 顶部:「上游只驻留后端内存,重启后会回到 .env 的初值 —— 用前请先确认一次」
  • 提交按钮下方:「点一次 = N 路并行 = N 次上游调用,超时的那几路照样计费;探测与核验不计费」
  • README 新增「第一次开机:五步」(中英双语)

✅ 回归

后端 pytest 314 passed(非沙箱前台)· 前端 vitest run 49 passed · tsc --noEmit 0 错 ·
vite build 通过 · bridge_probe.py 10/10 PASS · npm audit --omit=dev 0 漏洞
(全量 4 条告警全在 dev 工具链,vite 已是 5.x 终点 5.4.21,清零要整条升 6/7)。

⚠️ 本版仍未覆盖的(不藏着)

真实云端端到端一次都没跑过。 全部验证都打在假上游或本机模型上,真实网关 + 真实模型的
协议桥转译、五路真并发延迟分布、真实错误形态仍是空白。已知这是唯一用零消耗手段补不上的洞,
下一个版本处理。

引用核验的 MATCH_LOW=0.45 阈值也只在本地语料 + 手工构造的声称上验过,真实模型引述的
误报率未知(同上个原因:本地模型几乎不引法条,触发不了比对)。口径见决策日志 §16 续六。


本文档不含任何凭据。所有密钥只从环境变量读取。

v1.4.0 — 反馈闭环 · 证据落库 · 通用知识库

Choose a tag to compare

@hellobs hellobs released this 04 Oct 03:32

v1.4.0 — 反馈闭环 · 证据落库 · 通用知识库 · 界面减字

新增

  • 反馈→数据闭环:每路参谋产出可评分(1–5 星)并勾选「收录为训练样本」(POST /api/feedback,按会话+参谋 upsert);scripts/export_feedback.py 导出两类 JSONL——双门槛模仿样本(人工勾选 + 评分≥4,带辩题/立场/对方发言完整上下文,内容去重且保留最新提交)与偏好对(用户采纳时改过笔的卡片 vs 参谋原文,DPO 类训练原料——本项目独有的信号)。借鉴 gemma4-learning-agent 的数据闭环思路并修正其无去重/丢上下文/无统计三处短板。
  • 证据随会话落库:引用核验报告持久化到会话(citation_reports 表)+ GET /api/session/{id}/citations/latest;前端刷新后自动回读最近一次报告——此前自动核验结果刷新即丢、复盘无法回溯的问题就此解决。
  • 通用参考知识库(非法条专用):任意 .txt/.md 素材经「模型与上游」页上传,上传即生效(段落优先切块 + char-bigram TF-IDF,纯 Python 零新依赖);检索 top-3 自动注入参谋上下文【参考知识】段(带来源与相关度标注)——通用辩题从此有真实的知识面支撑。检索失败不出声、索引不持久化(规避损坏/版本坑)、空库零打扰。
  • 反馈/知识库端点自动纳入 CSRF 防线。

变更

  • 参谋布局固定每行 3 个(5 路呈 3+2 排布):auto-fit 在部分宽度会挤成 4+1,视觉重心失衡(用户实测反馈)。
  • 界面文案 22 处瘦身:长句压短、解释收进悬停提示,默认视图提示从约 15 处降至 2 处;安全披露(密钥明文存本机等)保留。

修复(开发过程中被测试咬出)

  • 样本去重保留最新提交——原实现同内容旧会话永久占住去重键,新会话样本被静默丢弃。
  • 偏好对配对不以 0.5 相似度为门槛:用户真实改笔往往是大改,相似度仅随 meta 记录。
  • knowledge.delete 与 save 的扩展名处理对称化;_prepare 同步函数误用 await(收集期才炸)等两处实现期笔误。

质量底线

  • 全量测试 302 passed(净增 21),全程 0 API 消耗;CI 随 push 自动回归。
  • 浏览器 E2E 实证:评分/收录 → 导出 JSONL、知识上传 → 检索命中、核验报告 → 刷新恢复、3+2 布局。

成本红线不变:反馈、核验、知识库均为纯本地计算;点一次「生成参谋建议」仍是 5 次上游调用。

v1.3.1 — CSRF 防线 · 语料 16 部 · mavis 二轮检验

Choose a tag to compare

@hellobs hellobs released this 03 Oct 03:28

v1.3.1 — CSRF 防线 · 语料 16 部 · 回归纠偏 · mavis 二轮检验

新增

  • CSRF 防线(局域网/热点场景就绪):计费与写盘端点强制自定义头 X-Debater-UI: 1(浏览器无法在跨站简单请求里携带自定义头——它会强制 CORS 预检),恶意网页从此无法借用户浏览器触发 5 次真实计费或向语料库写入编造内容。WebSocket 受浏览器限制无法带自定义头,/api/asr/stream 改用 Origin 校验(同源放行、跨站拒绝);协议桥 /bridge/* 豁免(调用方是 mavis 进程)。前端全部变更调用带头,附 8 项专项测试。
  • 语料 13 → 16 部(2897 条):新增《生成式人工智能服务管理暂行办法》(gov.cn)、《互联网信息服务深度合成管理规定》(网信办)、《道路交通安全法》(北京交通委)——三部新语料引用实测全部「已核验」,直接覆盖 20 条辩题中的生成式 AI 平台责任、深度合成、自动驾驶三个题域。出口管制法 / 劳动合同法 / 医师法因官方站可达性放弃(宁缺毋滥,不凭记忆录入)。
  • mavis 二轮检验(探针 11 → 18,18/18 复现):新增 5 缺口——G8 上游状态码未检查(错误页进 JSON 解析器)、G9 max_tokens 不可配置且错误 kwargs 退化为静默重试、G10 无流式支持、G11 provider 工厂封闭、G12 框架 logger 直写宿主 stdout;2 注意——N5 temperature 可透传但契约未记载、N6 计数递增在并发闸外(3×6400 次实测零丢失,理论性风险)。

修复

  • benchmark 回归系统性偏差:run_live 此前不传 domain,法学回归用例全部跑在 general 提示词包上。现由 analyze_payload() 统一透传,4 个用例显式声明 AI + 法学——回归指标从此测的才是法学措辞。
  • 测试基建两位数编号 bug:gap-report 测试的 ID 提取正则 [GN]\d 写死单位数,缺口扩到 G10 后两位数永远匹配不到,报告与探针"看似一致实则漏比"。已修为 \d{1,2}。

文档

  • docs/mavis-gap-report.md 扩至 12 缺口 / 6 注意(二轮章节 §3.3b / §3.4b),严重度表与探针经测试对齐;HANDOVER、双语 README 同步。

质量底线

  • 全量测试 281 passed(净增 12),全程 0 API 消耗;CSRF 拦截、语料核验、探针复现均经真实运行环境二次验证。

成本红线不变:点一次「生成参谋建议」仍是 5 次上游调用。

v1.3.0 — 引用核验自动化 · 流式语音 · 辩题扩充 · CI

Choose a tag to compare

@hellobs hellobs released this 01 Oct 03:57

v1.3.0 — 引用核验自动化 · 流式语音二期 · 法学辩题扩充 · CI

新增

  • 引用核验自动化(UX-2):分析返回后自动跑一次引用核验(纯本地 0 消耗),报告自动填入引用面板;主面板新增常驻状态条「引用 已核验 N · 存疑 M · 未核验 K」,有「引述待查」时转警示色。手动核验按钮保留。
  • 流式语音转写(UX-3 二期):WebSocket /api/asr/stream + 流式 Zipformer bilingual int8 —— 边说边出字、端点检测自动分段(停顿 ~2.4s 切段)、结束后全文一键填入,现场收音从五步压到两步。批式 SenseVoice 端点保留:流式管延迟、批式管质量(实测取舍,转写结果仍由人校对)。
  • 预设辩题 10 → 20 条(全部 AI+法学):生成式 AI 平台审核责任、深度合成入刑、自动驾驶刑责、AI 误诊、逝者数据数字人、爬虫训练大模型、AI 虚构引注的律所责任、算法解雇骑手、AI 免责条款效力、开源大模型出口管制。
  • CI:GitHub Actions 两个 job(后端 pytest 钉 mavis@511dea0 + 前端 tsc/build)。全部测试 0 API 消耗,每次 push 自动回归。

修复

  • 模型/tokens 跨目录混配:批式引擎按"先子目录后根目录"定位文件,用户下载流式模型后,其子目录的同名 tokens.txt 会抢走批式模型的配对,decode 在 C++ 层抛 unordered_map 错误(且只在下载了流式模型后复现)。改为同目录成对匹配、绝不跨目录混取,附两条文件系统回归测试。
  • WS 解码加锁:流式识别器跨连接共享,两个标签页/队友同时收音会在共享识别器上并发解码。解码现持专用锁串行化(单帧毫秒级,不影响实时性)。

变更

  • fetch_asr_model.sh 一次下载两套模型(批式 + 流式,共约 420MB,hf-mirror 直连)。
  • /api/health.asr 新增 stream 布尔(流式就绪状态);vite dev 代理补 ws: true。
  • fetch_asr_model.sh 保留法条抓取辅助 scripts/fetch_law.py(并行会话贡献)。

质量底线

  • 全量测试 271 passed(净增 8 条:流式 WebSocket 真链路 ×3、模型定位回归 ×2、其余契约),全程 0 API 消耗。
  • 验收留档(mock 上游 0 成本):浏览器全链路分析 5 路 0.12s、UX-2 状态条与真实语料核验联动(已核验 1)、流式收音完整流程、20 条辩题下拉、三分区菜单。

成本红线不变:语音与核验均为本地计算;点一次「生成参谋建议」仍是 5 次上游调用。

v1.2.1 — 体检修复 · POST-SSE · 零成本验证工具

Choose a tag to compare

@hellobs hellobs released this 30 Sep 13:45

v1.2.1 — 两轮体检修复 · 分析端点 POST 形态 · 零成本验证工具

修复

  • 「不限」预算档语义断裂:前端曾把 budget_s=0 省略不发送,后端落到默认 30s——界面选「不限」实际是 30s。现在预算总是显式发送,0 = 不限(仅受单次调用上限封顶)。
  • 并发闸默认 4 < 参谋 5 路:云端模式下第 5 路排队,总耗时≈2×单路。默认改为 5(本地 Ollama 由 run_local.sh 预设 2,不受影响)。
  • 桥超时与 LLM_TIMEOUT_S 脱钩:桥若先超时会返回空体、触发 mavis 重试(真烧钱)。生效值现在取 max(LLM_BRIDGE_TIMEOUT, LLM_TIMEOUT_S),约束由代码保证。
  • 录音电平渲染抖动:worklet 回调逐帧 setState(~125 次/秒)导致设置面板高频重渲染,节流到 10Hz。
  • 持久化空快照缺陷:空辩题的现场状态会抑制「默认选第一条辩题」的引导,导致辩题框卡死为空、提交永久禁用。

变更

  • 分析端点新增 POST 形态(POST /api/analyze/stream,前端已切换):消除 GET query 的 ~3500 字 URL 上限(语音转写长发言的安全隐患),对方发言不再进访问日志。GET 保留给脚本与旧客户端,事件序列完全一致。
  • .env.example 注释与代码默认值同步。

新增

  • scripts/mock_upstream.py:按 response_format 的 schema 名返回合规假数据的本地 mock 上游。切换上游即可零成本跑通整条参谋热路径(SSE / 落库 / 渲染 / 一致性检测),不花一次真实 API 调用。
  • 新增 7 条回归测试(预算契约 ×3、POST 形态、语料导入 ×6 等);全量 263 passed,全程 0 API 消耗。

验收留档(全部通过,0 次真实 API 调用)

浏览器真实点击全链路(5 路 0.13s)|三格式导出(MD / Word / PDF 打印页)|真实语料引用核验(《著作权法》第三条 verified,重合 89%)|辩题库保存/覆盖/删除|80.7s 语音转写(RTF 0.03)|持久化刷新恢复。

v1.2.0 — 语音输入 · 语料导入 · 现场持久化 · Menu 分区

Choose a tag to compare

@hellobs hellobs released this 30 Sep 12:43

v1.2.0 — 语音输入 · 语料导入 · 现场持久化 · Menu 分区

新增

  • 语音输入对方发言(ASR 一期 · 批式):🎙 手动分闸收音(对方开口点开始、说完点结束)→ 本地 SenseVoice 转写 → 文本填入可编辑输入框,人工核对后再提交——刻意不自动触发分析。纯本地推理,0 API 消耗、离线可用。实测:9.45s 音频 1.4s 转写、一字不差。
    • 模型不入仓:bash scripts/fetch_asr_model.sh 一次性下载(约 228MB,hf-mirror 国内直连);不下也不影响其余功能,界面会如实提示。
  • 语料界面导入:引用核验面板「导入语料」——粘贴或选文件,法名可留空(从正文首行《XX法》识别),导入即热重载,引用核验立刻生效。与 CLI(scripts/import_corpus.py)共用同一套解析。
  • 现场状态持久化:辩题 / 立场 / 对方发言 / 时间预算 / 会话自动存本机,刷新或误关标签页后原样恢复并接回台账与导出——对方发言不再说第二遍。
  • 左栏 Menu 三分区:现场输入(默认)/ 模型与上游 / 服务状态。现场高频操作不再被低频配置顶出首屏。

变更

  • 入仓真实法条语料 8 部(专利法、民法典、刑法等官方公开文本,约 1.6MB):克隆即得引用「已核验」能力。
  • requirements 新增 sherpa-onnx(本地 ASR 引擎:自包含 wheel、无 torch;Python 3.13 / Windows / macOS / Linux 轮子已核实)。
  • vite 代理目标可用 VITE_API_TARGET 覆盖(一台机器并行跑两套实例不必改文件)。

修复

  • 语料解析器 guess_law_name 剥书名号:此前《XX法》标题识别不出法名,界面导入会被它拦下。

质量底线

  • 全量测试 259 passed(0 API 消耗);ASR 真模型端到端、语料导入→核验翻转、现场状态恢复均有测试守着。
  • ASR 引擎与模型经真实语音(TTS 样例 + 浏览器真实麦克风)端到端验证。

成本红线不变:语音转写与语料导入均为纯本地计算;点一次「生成参谋建议」仍是 5 次上游调用。