huangjianwu
|
58d992f28f
|
feat(transcriber): 可配置 whisper 模型 + 名称映射(自定义 HF repo / 本地路径)
此前 fast-whisper 把「size → Systran/faster-whisper-{size}」的约定隐式散落在
加载/下载/检测三处,用户想用命名不符该约定的模型(社区微调版、或自己下到本地
的模型)接不上。本功能把映射显式化 + 可配置(对齐已有的 MLX_MODEL_MAP 模式)。
后端:
- 新增 app/transcriber/whisper_models.py 注册表:内置映射 + 用户自定义
(config/whisper_models.json 持久化,Docker 下随 config 卷保留);resolve
优先级 自定义 > 内置 > 直通(含 / 的 repo_id / 已存在本地目录)。
- whisper.py / config.py 的加载、下载、完整性检测统一走 resolve;HF cache 目录从
任意 repo_id 推导(models--{org}--{name})不再写死 Systran;本地路径跳过下载,
_purge_cache 绝不删用户本地模型。
- 新增 /whisper_models 增删查 API;/transcriber_config 返回内置+自定义列表;
下载校验放开到「已登记/可解析」的模型。
前端:transcriber.tsx 新增「自定义模型」卡片(增删 + 下载状态),模型下拉自动含自定义。
Docker:自定义 HF 模型下到 /app/backend/models(v2.3.3 models 卷已持久化);本地模型
走挂载目录 + 配置路径,UI 已提示挂载。
测试:tests/test_whisper_models.py 13 个单测全过;并在 v2.3.3 镜像真实后端环境做了
import 链 + resolve + 真实模型检测的集成冒烟,均通过。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 15:09:06 +08:00 |
|
huangjianwu
|
717df2af7b
|
Merge branch 'release/2.3.3' into develop
回合并 v2.3.3 版本号。
|
2026-05-22 14:07:00 +08:00 |
|
huangjianwu
|
b431db545a
|
docs: v2.3.3 CHANGELOG + README + tauri 版本
Docker 镜像数据持久化修复版本。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 14:07:00 +08:00 |
|
huangjianwu
|
25face4b67
|
Merge branch 'fix/docker-data-persistence' into develop
v2.3.3:预构建镜像持久化数据库/笔记,修升级丢配置与历史。
|
2026-05-22 14:06:24 +08:00 |
|
huangjianwu
|
edfd6e4765
|
fix(docker): 预构建镜像持久化数据库/笔记,修升级丢配置与历史
README 的 docker run 只挂了 -v …:/app/backend/data(仅媒体缓存),但
SQLite 库在 /app/backend/bili_note.db、笔记在 /app/backend/note_results
都不在该卷下 → 用户删容器重建(如 docker pull 升级镜像)会丢失 LLM
供应商配置和全部笔记历史。
- Dockerfile.complete:DATABASE_URL 重定向到 /app/backend/data/bili_note.db、
NOTE_OUTPUT_DIR 改到 data/note_results,并预建 /app/backend/data 目录;
两条 supervisord environment 行同步(兜底默认值 + %(ENV_*)s 透传)。
- README:docker run 改挂 data(库+笔记)/ config(供应商·Cookie·转写配置)/
static(截图)/ models(模型缓存,可选)四个数据卷,并警告不要挂整个
/app/backend(命名卷会固化镜像内代码,导致 docker pull 升级不生效)。
- docker-build.yml:同步发布说明里 echo 的 run 命令。
截图仍留在 /app/backend/static(static_dir 硬编码服务,不能重定向),单独挂卷。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 13:30:42 +08:00 |
|
huangjianwu
|
b53cafda5a
|
Merge branch 'release/2.3.2' into develop
回合并 v2.3.2 版本号。
|
2026-05-22 11:41:17 +08:00 |
|
huangjianwu
|
3e28f1fe38
|
docs: v2.3.2 CHANGELOG + README + tauri 版本
docker 启动崩溃 / whisper 模型路径 / 桌面端版本号 修复版本。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 11:40:55 +08:00 |
|
huangjianwu
|
bffa285cd0
|
Merge branch 'fix/docker-startup-and-qr' into develop
v2.3.2 修复集:
- ctranslate2 4.5.0→4.6.0 修后端启动崩溃(可执行栈 / glibc 2.41)
- whisper 模型下载/加载统一 HF cache 布局
- 桌面端构建版本号从 tag 注入(修产物恒为 2.0.0)
|
2026-05-22 11:40:21 +08:00 |
|
huangjianwu
|
b740e70068
|
fix(desktop): 构建时从 tag 注入版本号,修产物版本恒为 2.0.0
桌面端构建产物(.dmg/.msi 文件名 + app 内部版本)一直是 2.0.0:
Tauri 取 tauri.conf.json 的静态 version 字段作为产物版本,而 Release
工作流只把 tag 名用作 Release 标题,没同步到 conf → 产物版本与 Release
版本错位。
在 pnpm tauri build 前新增 Sync version 步骤,从 github.ref_name(形如
v2.3.2,去掉前缀 v)注入版本到 tauri.conf.json。以后每次 tag 发版自动
对齐;workflow_dispatch 手动构建无 tag 时跳过,保留静态值不破坏。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 11:40:04 +08:00 |
|
huangjianwu
|
261c95cf12
|
fix(transcriber): whisper 模型下载/加载统一走 HF cache 布局
此前用 modelscope 下到自定义目录 whisper-{size}/ 再把该路径传给
WhisperModel。但 faster-whisper 1.1.1 只要 path 含 '/' 就当成 HF
repo_id 处理,没有「本地目录直接返回」分支 → 在线请求失败后 fallback
local_files_only,又因 modelscope 布局命不中 HF cache → LocalEntryNotFound,
误导用户以为是「离线模式」。
改为下载与加载路径对齐:
- 下载:huggingface_hub.snapshot_download(cache_dir=model_dir),落到 HF
cache 布局 models--Systran--faster-whisper-{size}/snapshots/<hash>/
- 加载:WhisperModel(model_size_or_path=size, download_root=model_dir),
让 faster-whisper 自己映射到 Systran/faster-whisper-* 并命中同一 cache
- 完整性检测 / 损坏自愈(_purge_cache) 同步按 HF cache 布局,并兼容老
modelscope 目录(向后兼容已下载的老用户)
HF_ENDPOINT 已在 Dockerfile 指向 hf-mirror.com,国内可用。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 11:27:03 +08:00 |
|
huangjianwu
|
1cc7f38e14
|
fix(backend): 升级 ctranslate2 4.5.0→4.6.0 修复后端启动崩溃
Docker 容器反复重启,启动即报:
ImportError: libctranslate2-*.so.4.5.0: cannot enable executable
stack as shared object requires: Invalid argument
根因:ctranslate2 4.5.0 预编译 wheel 把共享库标记为「需要可执行栈」,
新内核 / glibc 2.41+ 加载时拒绝并返回 EINVAL。faster-whisper 在
whisper.py 顶层 import,import 失败直接拖垮整个后端启动 → 重启死循环。
ctranslate2 4.6.0 加入 noexecstack 链接标志(OpenNMT/CTranslate2 #1852、
#1861)从 wheel 层根治。faster-whisper 1.1.1 依赖 ctranslate2<5,>=4.0,
4.6.0 兼容;同时覆盖 web / GPU / 桌面 三条构建链。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 11:26:49 +08:00 |
|
huangjianwu
|
7fffd6873b
|
Merge branch 'release/2.3.1' into develop
回合并 v2.3.1 版本号(CHANGELOG + README)。
|
2026-05-22 10:51:49 +08:00 |
|
huangjianwu
|
c42ceaaa32
|
docs: v2.3.1 CHANGELOG + README 版本
二维码热修补丁版本。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 10:51:30 +08:00 |
|
huangjianwu
|
177ee4ba3a
|
Merge branch 'fix/docker-startup-and-qr' into develop
更新微信交流群二维码(群 1-5,旧码即将失效)。
同步 master 上的二维码热修(README 二维码区块 + 5 张入群图)到 develop。
|
2026-05-22 10:51:05 +08:00 |
|
huangjianwu
|
aae17abf9a
|
docs: 更新微信交流群二维码(群 1-5,有效期至 5/29)
旧二维码即将失效,替换 README 中 5 个交流群的入群二维码。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 10:42:12 +08:00 |
|
huangjianwu
|
33d44e32d2
|
docs: 突出 BiliNote Pro 在线版 + 更新微信交流群二维码
- README 顶部新增 BiliNote Pro 在线版推广区块(www.bilinote.app),
项目简介后加引导提示,「在线使用」章节改为「在线使用(推荐)」
- 微信交流群二维码更新为 5 个群,doc/wechat-group-1~5.png
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-14 21:45:34 +08:00 |
|
Jianwu Huang
|
ce58cb9352
|
Merge pull request #369 from JefferyHcool/release/2.3.0
chore(release): merge release/2.3.0 back into develop
|
2026-05-14 21:09:55 +08:00 |
|
Jianwu Huang
|
2043d89288
|
Merge pull request #368 from JefferyHcool/release/2.3.0
chore(release): v2.3.0
v2.3.0
|
2026-05-14 21:09:30 +08:00 |
|
huangjianwu
|
56e075253a
|
docs: v2.3.0 CHANGELOG + README 版本
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-14 19:05:46 +08:00 |
|
huangjianwu
|
f1b091b846
|
chore(deploy): docker 镜像源/restart 策略 + .env 修正 + 文档
- 所有 Dockerfile 加 BASE_REGISTRY build-arg,国内拉不到 docker.io
时可换 daocloud 等镜像源;compose 透传该 arg
- docker-compose: restart 从 on-failure:3 改 unless-stopped(避免短暂
崩溃后永久打死);gpu compose 补齐 healthcheck/restart/mem_limit
- Dockerfile.complete: supervisord 用 %(ENV_*)s 透传环境变量给 backend
子进程(之前只白名单 2 个,docker run -e 配的变量后端看不到)
- .env.example: 修正 VITE_API_BASE_URL 端口(8000→8483)、
WHISPER_MODEL_SIZE medium→tiny(首次启动不被大模型下载卡住)、
补 Docker 部署说明注释
- README: 新增 Docker 部署常见问题 FAQ(镜像源/restart/数据持久化等)
- CLAUDE.md: 勘误(移除不存在的 messaging/i18n/worker_registry 描述,
修正 events 路径),补 pytest/typecheck 命令
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-14 19:01:55 +08:00 |
|
huangjianwu
|
37f7ee6e15
|
feat(desktop): 后端健康监控韧性 + onboarding 修复 + 全局代理 UI
- useCheckBackend 重写:60s 总超时取代 while(true) 死轮询,订阅 Tauri
backend-ready/terminated/startup-timeout 事件,裸 fetch 探测避免
启动期 toast 叠堆
- Tauri lib.rs:spawn 后 HTTP 探针轮询 /api/sys_check 拿 200 才算就绪
(之前 TCP connect 会被孤儿进程误判);RunEvent::Exit 钩子退出前
kill sidecar,修孤儿进程占端口;restart 前发 backend-restarting
让前端忽略主动 kill 引发的 terminated
- BackendInitDialog:失败态展示原因 + 最近 stderr + 重启/复制日志按钮
- StartupBanner:收到 restarted/ready 自动清「已退出」横幅
- BackendHealthIndicator:修 /api/api/sys_health 双前缀 404
- Onboarding:step1 后端连通改自动重试 + 事件触发 + 手动按钮;step2
撞预置供应商名时改为更新已存在供应商;errText 统一错误文案
- 全局代理 UI:下载配置页新增代理卡片(services/proxy.ts + ProxyConfig)
- request.ts 加 suppressToast 配置位,预期失败不弹全局红 toast
- NoteForm/taskStore:捕获就绪门禁错误,引导去音频转写配置页下载
- providerCard:整行可点切换(之前只有 icon 区域响应)
- Monitor 页 Whisper 卡显示模型本地下载状态
- tauri/api 升级对齐 2.11,修 vite build 版本不匹配
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-14 19:01:37 +08:00 |
|
huangjianwu
|
41f17592c2
|
fix(backend): 部署韧性——模型自愈/就绪门禁/全局代理/启动诊断
- whisper: model.bin 截断/损坏时删目录重下重试一次,修「Unable to
open file model.bin」死循环;mlx 同样按 config.json 判完整性
- /generate_note 加就绪门禁:本地转写引擎模型没下好直接拦截,返回
reason=transcriber_model_not_ready,不让任务静默卡在首次下载
- 全局代理:新增 ProxyConfigManager(JSON 配置 + HTTP_PROXY env 兜底)
+ build_openai_client,统一注入代理到 LLM/Groq 客户端;yt-dlp 与
youtube-transcript-api 也走代理
- build_openai_client 校验 api_key 非空,空 key 给「xxx 的 API Key
未配置」而不是天书般的 Illegal header value b'Bearer '
- universal_gpt: 模型拒绝自定义 temperature(o1/o3/gpt-5 系列)时
就地去掉参数重试,不消耗重试预算
- connect_test 改用真实 chat completion 而非 /v1/models 探测
- main.py: lifespan 拆 [startup 1/5..5/5] 分段日志 + 异常清晰定位
- /sys_health 重构为结构化返回 {backend,ffmpeg,db,whisper_model}
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-14 19:01:14 +08:00 |
|
Jianwu Huang
|
88d25f8cc1
|
Update README.md
|
2026-05-14 09:24:59 +08:00 |
|
huangjianwu
|
de630dadb3
|
chore(release): merge hotfix/tauri-api-dep into develop
|
2026-05-09 14:53:18 +08:00 |
|
huangjianwu
|
7b5e6099e8
|
chore(release): v2.2.3
补 P1/P2 用了 @tauri-apps/api 但没声明为直接依赖导致的 vite build CI 失败。
v2.2.3
|
2026-05-09 14:53:01 +08:00 |
|
huangjianwu
|
bb9a70eee2
|
fix(frontend): @tauri-apps/api 提升为直接依赖,修 vite build CI 失败
v2.2.0 加的 P1/P2 桌面端组件(StartupBanner / useBackendEvents)用了
'await import(\"@tauri-apps/api/event\")' 与 '@tauri-apps/api/core',但
@tauri-apps/api 只是 @tauri-apps/plugin-shell 的 transitive,没在
BillNote_frontend/package.json 直接声明。
本地开发能跑(pnpm 节点解析容忍 transitive),但 vite 6 的 production
rollup 静态分析时报:
Rollup failed to resolve import "@tauri-apps/api/event"
之前我只跑了 typecheck 没跑 build,所以这个问题先在 v2.2.0 / v2.2.1 / v2.2.2
的 CI 上才暴露出来。本地 DOCKER_BUILD=1 pnpm run build 已复现并修复验证。
修:BillNote_frontend/package.json 把 '@tauri-apps/api' 加为直接依赖
(^2.10.1,与 lockfile 中已存在的 transitive 版本对齐),lockfile 同步更新。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 14:52:56 +08:00 |
|
huangjianwu
|
e9d4740cc7
|
chore(release): merge hotfix/desktop-pnpm-version into develop
|
2026-05-09 14:49:53 +08:00 |
|
huangjianwu
|
c5900a9026
|
chore(release): v2.2.2
补 v2.2.1 漏掉的桌面端 Tauri 构建 pnpm 版本 pin。
v2.2.2
|
2026-05-09 14:49:39 +08:00 |
|
huangjianwu
|
63577aa1aa
|
fix(ci): pin pnpm 9.15.0 in main.yml,修 v2.2.0 桌面端 Tauri 构建失败
v2.2.1 hotfix 只 pin 了 Docker 那两个 Dockerfile 里的 pnpm,但 .github/workflows/main.yml
(Tauri 桌面端 macOS + Windows 构建)的 'pnpm/action-setup@v4 with: version: latest' 没改,
于是 v2.2.1 tag 触发的桌面端 build 仍然挂在 'Install frontend dependencies' 步:
ERR_UNKNOWN_BUILTIN_MODULE: No such built-in module: node:sqlite
Node.js v20.20.2
修:main.yml 的 pnpm version 'latest' → '9.15.0',与 Docker 侧 + extension workflow
保持一致(lockfile 是 pnpm 9 生成的)。
release-extension.yml 已经是 pinned 9,无需改。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 14:49:33 +08:00 |
|
huangjianwu
|
ec33ae35ed
|
chore(release): merge hotfix/docker-pnpm-version into develop
|
2026-05-09 14:47:25 +08:00 |
|
huangjianwu
|
2e69d1179b
|
chore(release): v2.2.1
补 v2.2.0 ghcr.io 镜像构建失败(pnpm 版本不兼容 Node 20)。
v2.2.1
|
2026-05-09 14:47:11 +08:00 |
|
huangjianwu
|
7e5be46cda
|
fix(docker): pin pnpm 到 9.15.0,修复 v2.2.0 ghcr.io 镜像构建失败
v2.2.0 tag 触发的 ghcr.io 推送挂在 frontend-builder 第 5/7 步
'pnpm install --frozen-lockfile',错误:
code: 'ERR_UNKNOWN_BUILTIN_MODULE'
Node.js v20.20.2
根因:'corepack prepare pnpm@latest' 拉到 pnpm 11.0.9,pnpm 11+ 要求 Node 22+,
跟我们 node:20-alpine 不兼容。lockfile 本身是 lockfileVersion '9.0' 由 pnpm 9
生成,理应跟 pnpm 9 配。
修:Dockerfile.complete + BillNote_frontend/Dockerfile 都 pin 到 pnpm@9.15.0;
不再用 @latest,避免上游再次升级悄悄破坏 CI。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 14:47:06 +08:00 |
|
huangjianwu
|
0742387235
|
chore(release): merge release/2.2.0 back into develop
|
2026-05-09 14:43:48 +08:00 |
|
huangjianwu
|
604cdefa15
|
chore(release): v2.2.0
主线:浏览器插件功能与 web 端 NoteForm 完整对齐;桌面客户端 UX 与错误恢复一波重炼。
详见 CHANGELOG.md。
v2.2.0
|
2026-05-09 14:43:38 +08:00 |
|
huangjianwu
|
ff91f74bef
|
docs: v2.2.0 CHANGELOG + README 版本
主线:浏览器插件功能与 web 端 NoteForm 完整对齐;桌面客户端 UX 与错误恢复一波重炼。
详见 CHANGELOG.md。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 14:43:25 +08:00 |
|
huangjianwu
|
9bbae2c0c4
|
fix(backend): 把 deploy-resilience 合入 release/2.2.0
P0 修:whisper 半成品目录死循环 + /deploy_status 硬依赖 torch。
原 PR fix/backend-deploy-resilience 未走 develop,直接随本次发版上 master,
回灌时 develop 也拿到。
|
2026-05-09 14:42:11 +08:00 |
|
Jianwu Huang
|
5b5bf802af
|
Merge pull request #363 from JefferyHcool/feat/desktop-onboarding
feat(desktop): 桌面端首启 4 步引导
|
2026-05-09 14:37:53 +08:00 |
|
Jianwu Huang
|
ecc2e56246
|
Merge pull request #362 from JefferyHcool/feat/desktop-backend-health
feat(desktop): Sidecar 健康度面板 + 重启后端能力
|
2026-05-09 14:36:50 +08:00 |
|
Jianwu Huang
|
d8470bacbc
|
Merge pull request #360 from JefferyHcool/feat/desktop-startup-diagnostics
feat(desktop): 启动期路径诊断 + 顶端横幅,主动暴露已知失败因素
|
2026-05-09 14:35:51 +08:00 |
|
Jianwu Huang
|
0af2efb4de
|
Merge pull request #359 from JefferyHcool/feat/desktop-transcriber-defaults
feat(transcriber): 默认 size 改 tiny + 切本地引擎前 confirm 模型下载
|
2026-05-09 14:35:08 +08:00 |
|
huangjianwu
|
721bda5280
|
feat(transcriber): 默认 size 改 tiny + 切本地引擎前 confirm 模型下载
桌面端用户首次跑视频时挂在 fast-whisper 模型下载(默认 medium ~1.5GB),
两处改动:
1. backend/app/services/transcriber_config_manager.py:
默认 whisper_model_size 从 'medium' (~1.5GB) → 'tiny' (~75MB)。
新装用户没主动设置时不再被首次下载卡住;想要更高精度的用户去配置页主动切。
2. BillNote_frontend/src/pages/SettingPage/transcriber.tsx:
handleSave 在保存前判断:选了 fast-whisper / mlx-whisper 且当前 size 在
modelStatuses 里既未下载也不在下载中 → window.confirm 弹一个体积提示,
推荐改用 Groq / 必剪 / 快手 等在线引擎;用户取消则不保存。
不改业务逻辑;零回归风险(已有用户 transcriber.json 里写了什么就还是什么)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 14:32:41 +08:00 |
|
huangjianwu
|
a928e0e38f
|
feat(desktop): 桌面端首启 4 步引导
桌面端用户安装后空白进 web 主页面,提示填模型但不知道从哪填、转写引擎从哪选、
为什么 fast-whisper 在下东西。新增首启 onboarding wizard,把四件事拉成一条线:
1. 后端连通性自检(启动后调 /api/get_all_providers,OK 才能进下一步)
2. LLM 供应商 + 模型:填 OpenAI 兼容 base_url + key + model_name,调
/add_provider 创建并 addModel 默认 model,附带 testConnection
3. 转写引擎:四选一,**默认推荐 Groq**(在线、免下载本地模型);
选 fast-whisper 时显式提示"将下载模型"
4. Cookie 同步说明:桌面端无 chrome.cookies API,引导手动配;并指向插件版
实现:
- 新页 src/pages/Onboarding/index.tsx,单文件 stateful wizard
- App.tsx 加 /onboarding 路由 + OnboardingGuard 路由守卫:
· 仅 Tauri 桌面端(__TAURI_INTERNALS__)拦截,纯 web 端透传,不打扰
· localStorage('bilinote-onboarded') 不为 '1' 时强制跳 /onboarding
- 完成第 4 步 markOnboarded() 写 localStorage 后 navigate('/')
回归风险:纯 web 用户无感知;旧桌面端用户的 localStorage 没这个 key,
首次升级到含此 PR 的版本时会跳一次 onboarding(建议在升级 release notes 里
说明,避免老用户疑惑)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 14:30:05 +08:00 |
|
huangjianwu
|
1329390f98
|
feat(desktop): Sidecar 健康度面板 + 重启后端能力
P1 已经把 backend-warning / backend-terminated 横幅做出来了;P2 把
lib.rs 那条 stdout/stderr/terminated 信息流真正落到一个常驻 UI 上:
- 右下角浮动状态点(绿/黄/红),轮询 /api/sys_health 决定颜色
- 点开抽屉看最近 200 行日志(ring buffer),含「重启后端」「复制日志」按钮
Rust:
- src-tauri/src/lib.rs:把 sidecar 启动抽出 spawn_backend_sidecar(),
CommandChild 存进 SidecarHandle(Mutex<Option<CommandChild>>) 这个 state
- 新增 #[tauri::command] restart_backend_sidecar:kill 旧 child + 重新 spawn +
emit 'backend-restarted' 给前端
- 监听任务 stdout/stderr emit 时不再用 format!("'{}'", ...) 包引号,原文直传;
前端 hook 同时兼容旧形式(兜底剥引号)
前端:
- components/BackendHealth/useBackendEvents.ts:listen 四个事件 +
ring buffer (MAX 200 行) + invoke restart + clipboard 复制日志
- BackendHealthIndicator.tsx:右下角浮动状态点,5s 轮询 /api/sys_health;
连续 3 次失败或 backend-terminated 触发 → 红
- BackendLogPanel.tsx:右侧抽屉,深色 monospace 日志区 + 操作按钮
- 纯 web 环境(无 __TAURI_INTERNALS__)下静默不挂载
P3 / P4 还在路上。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 14:27:02 +08:00 |
|
Jianwu Huang
|
b117ab9f71
|
Merge pull request #358 from JefferyHcool/revert-357-fix/backend-deploy-resilience
Revert "Fix/backend deploy resilience"
|
2026-05-09 14:25:49 +08:00 |
|
Jianwu Huang
|
c4abaf4e60
|
Revert "Fix/backend deploy resilience"
|
2026-05-09 14:25:37 +08:00 |
|
Jianwu Huang
|
50f0816dab
|
Merge pull request #357 from JefferyHcool/fix/backend-deploy-resilience
Fix/backend deploy resilience
|
2026-05-09 14:25:29 +08:00 |
|
huangjianwu
|
9a64a2da8e
|
feat(desktop): 启动期路径诊断 + 顶端横幅,主动暴露已知失败因素
桌面端历史痛点:PyInstaller sidecar 在含非 ASCII / 含空格 / 不可写的安装路径下
直接炸(README:36 仅文字警告"不要中文路径",无主动防御)。Sidecar 退出事件 lib.rs
已 emit 但前端没 listener 消化,用户看到的是空白主页。
- src-tauri/src/lib.rs:
· setup 中 env::current_exe() 之后做 InstallPathDiagnostics(is_ascii / 空格 /
父目录 write_probe),命中任一异常就 emit 'backend-warning' 给前端
· 用 std::thread::spawn + 1500ms sleep 等首屏 listener 挂上再 emit,避免事件丢失
· 新增 Tauri command get_install_path_diagnostics,前端可主动重查(用户卸载到
新目录后首次启动)
- BillNote_frontend/src/components/SystemDiagnostic/StartupBanner.tsx(新建):
· 监听 backend-warning(路径警告,可关闭)+ backend-terminated(致命,常驻)
· 纯 web 环境(无 __TAURI_INTERNALS__)下静默不挂载,对桌面端定向起效
· backend-error(stderr 噪音)暂不展示,留给后续 P2 日志面板
- App.tsx:StartupBanner 在 BackendInitDialog 之前就挂载,让"后端还在初始化时"
也能看见路径警告(正是该场景容易炸)
不改任何业务逻辑;纯桌面端 UX 加固。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 14:22:41 +08:00 |
|
huangjianwu
|
2bb69d1581
|
fix(backend): 部署友好性——whisper 半成品目录与 deploy_status 硬依赖 torch
两处部署反馈来的问题:
1. WhisperTranscriber 反复抛 'Unable to open file model.bin in
model whisper-base'
· 原因:__init__ 只看目录是否存在判定模型已下载(Path(model_path).exists()),
但首次下载若中断 / 网络异常会留下空 / 半成品目录,下次启动绕过下载分支直接
进 WhisperModel 加载,于是死循环报错
· 修:判定条件换成 'model.bin' 落盘存在;目录在但 model.bin 缺失时打 warn
并触发重新下载
· routers/config.py 的 _check_whisper_model_exists 同步改用 model.bin 判定,
避免「已下载」状态在监控页误报
2. /api/deploy_status 在没装 torch 的部署上 500
ModuleNotFoundError: No module named 'torch'
· 原因:endpoint 顶部直接 import torch,仅 fast-whisper 才用得到的依赖被强制为
全局必需。轻量部署 / 用户切到 Groq / 必剪 / 快手 在线引擎时无 torch 也合理
· 修:torch 改为 try/except,未装或 cuda 检测异常时返回
{available: false, torch_installed: false};同时把 transcriber 配置 +
ffmpeg 都包在 try 里,保证整个监控 endpoint 不会被任一子项打死
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 13:57:34 +08:00 |
|
Jianwu Huang
|
e89090bed0
|
Merge pull request #356 from JefferyHcool/feature/extension-video-understanding
feat(extension): 多模态视频理解开关 + 抽帧/拼图参数(对齐 web NoteForm)
|
2026-05-09 13:53:34 +08:00 |
|
Jianwu Huang
|
edf2083d71
|
Merge pull request #355 from JefferyHcool/feature/extension-form-parity
feat(extension): NoteForm 字段对齐 web 端(style 预设 + format 完整 + extras)
|
2026-05-09 13:53:11 +08:00 |
|