Electron 安全(CRITICAL)
shell.openExternal仅允许https:/http:协议,防止协议注入 RCE。- Electron 构建配置移除
.env文件,防止密钥随应用分发。
XSS 防护(CRITICAL)
- 引入
DOMPurify对所有 KaTeX 渲毒输出进行消毒(FormulaWorkspace+ComputePanel)。 - MathML 导出路径添加
_sanitize_latex_for_compile过滤。
文件上传安全(CRITICAL)
- PDF 上传改为分块读取
file.read(8192),防止大文件 OOM DoS。
认证安全(CRITICAL)
- 管理员 Token 改用
secrets.token_urlsafe(32)随机生成,不再确定性可伪造。
Electron 环境安全(HIGH)
- 后端子进程仅传递
PATH、HOME、APP_DEVICE,不继承完整父进程环境变量。 - 后端 venv 路径根据
process.platform动态选择Scripts/或bin/。
网络安全(HIGH)
- CORS 仅在 origin 允许时发送
Allow-Origin、Allow-Methods等头。 - 添加安全响应头:
X-Content-Type-Options: nosniff、X-Frame-Options: DENY、Referrer-Policy。 - Launcher 脚本绑定
127.0.0.1替代0.0.0.0。 - Pandoc 路径通过
shutil.which()验证可执行文件合法性。 - MathML 导出路径添加
_sanitize_latex_for_compile过滤。
资源管理(HIGH)
- 三个 OCR 引擎的
_predict_sync移除gc.collect()(仅保留 OOM 恢复时调用),减少推理延迟 10-100ms。 - Object URL 在
handleFile创建新 URL 前 revoke 旧 URL。 - SSE 重连定时器通过 ref 追踪,cleanup 时正确清除。
db.get_session()添加try/except rollback防止事务泄漏。
输入验证(HIGH)
compute.py请求体使用 PydanticComputeRequest模型替代dict。pdf.py的page/dpi参数添加isinstance类型校验。- 删除 pdf.py 中重复的 DPI 校验。
ocr.py和history.py的session_id添加正则格式校验 + 128 字符截断。
错误处理
copyLatex添加try/catch。export.py的 Pandoc 错误消息脱敏(记录日志,返回通用消息)。ocr.py历史保存异常添加logging.warning。
并发与线程安全
.env文件写入添加threading.Lock保护。_progress_callback添加threading.Lock保护多字段更新。broadcast()迭代_subscribers使用list()创建副本。
代码质量
BaseOCREngine改为ABC+@abstractmethod。ocr.py的import re移至模块级,正则预编译。ocr.py魔法数字提取为命名常量。db.py的__import__('sqlalchemy')改为from sqlalchemy import text。db.py的datetime.utcnow()改为datetime.now(timezone.utc)。db.py的get_session类型标注修正为AsyncGenerator。formula_preprocessor._deskew修复坐标顺序(row,col) → (x,y)。ModelSelectorDropdown内部变量selected重命名为isSelected消除遮蔽。formula_preprocessor.py的__main__演示代码移至scripts/demo_preprocessor.py。model_manager.predict()保持原有锁顺序避免死锁(单用户本地应用风险可接受)。
前端
main.tsx的getElementById非空断言改为 null 检查。FormulaWorkspace的mathfieldinline style 移至 CSS 类。FormulaWorkspace的katexLinter使用 ref 避免重建。FormulaWorkspace的handleChange存入 ref 保持闭包最新。ModelSelectorDropdown变量遮蔽修复。MathLive事件监听器改为addEventListener+removeEventListener正确清理。showToast和SettingsPanel.showMessage使用 ref 追踪 setTimeout 防止卸载后更新。- PDF 渲染添加 generation 计数器防止竞态覆盖。
handleFile添加loading守卫和 Object URL revoke。- SSE 重连添加手动
setTimeout+ ref 追踪。 - Docker 前端添加
depends_on+service_healthy条件。 get_settings()的os.environ副作用提取为apply_settings_env(),仅在 lifespan 调用。settings.py的.env值写入添加_sanitize_env_value()防止换行注入。
formula_preprocessor.py的__main__演示代码移至scripts/demo_preprocessor.py。
- 新增
dompurify+@types/dompurify前端 XSS 防护库。
输入验证与边界控制
- 新增
validate_image_magic():通过文件头 magic bytes 验证真实图片类型(JPG/PNG/WebP),防止伪造 content-type 上传畸形文件。 - 新增
MAX_IMAGE_PIXELS = 16MP:read_image()校验图片像素总数,防御解压炸弹(1×1 PNG 解压为 50000×50000)。 - 新增
MAX_PROCESS_LONG_EDGE = 2048:FormulaPreprocessor.process()和enhance_formula_image()处理前自动缩放大图,防止fastNlMeansDenoising在超大图上卡死。 - 新增 PDF 页数限制
MAX_PAGES = 50、DPI 上限MAX_DPI = 600,防止畸形 PDF 和超高 DPI 导致内存爆炸。 - 新增 LaTeX 输入长度限制
MAX_LATEX_LENGTH = 2000,防止 SymPy 正则回溯。 read_image()捕获PIL.UnidentifiedImageError,返回 400 而非 500。read_image()的 EXIF 旋转单独 try/except,畸形 EXIF 不影响主流程。
异步安全与事件循环
compute.py:SymPy 计算改为run_in_executor+asyncio.wait_for(timeout=10),防止sympy.integrate等无限阻塞事件循环。ocr.py:preprocess_image、enhance_formula_image、FormulaPreprocessor.process、make_thumbnail_data_url全部改为run_in_executor异步执行。pdf.py:fitz.open/get_pixmap改为run_in_executor+wait_for(timeout=30),防止 PDF 渲染阻塞。- OCR 历史写入包裹
try/except,DB 失败不影响识别结果返回。
GPU OOM 捕获与恢复
- 三个引擎(Pix2Text、LaTeX_OCR、Uni-Equation)的
_predict_sync新增torch.cuda.OutOfMemoryError捕获。 - OOM 触发
_handle_oom():标记模型为 error 状态、释放模型引用、gc.collect()+torch.cuda.empty_cache(),防止后续请求持续 OOM。 - 新增
_clear_cuda_cache()公共方法,消除 3 处重复的 CUDA 清理代码。 - UniEquation
_predict_sync的finally中显式del inputs, output_ids,确保 Tensor 在 GC 前释放。 - UniEquation
unload()清理self.processor和self.tokenizer。
资源与内存优化
preprocessed_image_base64默认不再发送(return_preprocessed_image默认改为False),减少每次 OCR 响应的无用 base64 传输。preprocess_image和make_thumbnail_data_url支持predecoded参数,复用已解码的 PIL Image,消除同一图片的 3 次重复解码。- PNG 导出从
canvas.toDataURL()改为canvas.toBlob()+URL.createObjectURL(),内存占用降低约 33%。 pdf.py的fitz.open()使用try/finally确保doc.close()。
前端防御性增强
api.ts所有fetch请求添加AbortController+ 超时(通用 30s、OCR 120s、PDF 60s、渲染 30s)。api.ts校验响应body.data存在性,防止后端返回畸形 JSON 导致undefined类型传递。- 模型切换添加
switchingRef防抖守卫,防止连点触发多次并发activateModel。 handleFile添加loading守卫,防止识别进行中重复提交。- PDF 上传和渲染改用
api.ts的getPdfInfo()+renderPdfPage()统一函数(带超时和 session header)。
- 新增
electron/main.ts:Electron 主进程,启动 FastAPI 后端并等待端口就绪后创建窗口。 - 新增
electron/preload.ts:预加载脚本,暴露window.electron对象。 - 新增
electron/electron-builder.yml:NSIS 安装包配置。 - 新增
backend/build.spec:PyInstaller 将 FastAPI 后端打包为单文件.exe。 - 新增根目录
package.json:Electron 脚本(dev:electron、build:electron)和依赖。 - 前端 API 层自动检测 Electron 模式,直接连接
127.0.0.1:8000。 - Vite 配置添加
base: './'支持file://协议。
npm run dev:electron:同时启动前端、后端、Electron 窗口(开发模式)。npm run build:electron:构建前端 + PyInstaller 打包后端 + electron-builder 生成安装包。
- 上传区域新增「手写输入」标签页,提供 Canvas 画布供手写数学公式。
- 画笔/橡皮擦切换,粗细可调(1-8px)。
- 支持撤销(操作历史栈)和清空。
- 原生触摸事件(
addEventListener+{ passive: false }),移动端绘制时页面不跟随滚动。 quadraticCurveTo平滑线条,减少锯齿。- 一键识别:Canvas 内容转 Blob 调用现有
/api/ocr,结果插入编辑器。 - 标签页切换后手写内容保留(CSS hidden 而非条件渲染)。
- 手写工具栏响应式:「粗细」文字移动端隐藏,按钮间距缩小。
- 画布
minHeight: 200px保证小屏可用。
- 项目预览截图扩充至 8 张:主界面、公式工作区、源码模式、数学计算、手写输入、PDF 提取、设置面板、移动端。
- 修复
hmac.new()→hmac.HMAC()导致管理员登录时AttributeError的问题。 - 修复 PDF 路由未检查
enable_pdf_recognition配置的问题。 - 修复 PDF 渲染 DPI 硬编码为 200,改为使用
pdf_dpi配置值(默认 300)。 - 修复
export.py中_convert_to_mathml引用不存在的 Pythonkatex包,改为纯 pandoc 转换。
- 删除
stores/sessionStore.ts(从未被任何文件导入)。 - 删除
hooks/useModelStatusPoll.ts(已被 SSE 替代,从未使用)。
- 删除
common.py:get_ocr_engine()(get_model_manager的无用包装)。 - 删除
preprocess.py:deskew()和trim_whitespace()(已被FormulaPreprocessor替代)。 - 删除
appStore.ts:insertLatex()(从未被调用)。 - 删除
api.ts:createHistory()和getModelStatus()(从未被调用)。 - 删除
config.py:pix2tex_weights_url(定义但从未读取)。
- 提取
ModelSelector和ModelSelectorDropdown共享的fallbackCopy+displayModel()到modelData.ts。 - 移除
ImageCropper.tsx中未使用的centerCrop、makeAspectCrop导入。
- 移除未使用的 npm 包:
@codemirror/commands、@codemirror/lang-html、html2canvas。 - 补充缺失的 Python 依赖:
sympy>=1.12、munch、requests。
- 源码模式 CodeMirror 编辑器集成
@codemirror/lint,错误位置显示红色波浪线。 - 错误面板显示具体位置(第 X 行,第 Y 列)和 KaTeX 原始错误消息。
- 新增「一键修复」按钮,自动修正常见拼写错误(
\pii→\pi、\sqr→\sqrt)和未闭合括号。
- 新增 SymPy 符号计算引擎集成,支持 8 种操作:展开、因式分解、化简、求解、求导、积分、极限、级数。
- 自定义 LaTeX 解析器,支持
\frac、\sqrt、三角函数、隐式乘法、方程(=号)。 - 前端
ComputePanel组件:8 个操作按钮网格,计算结果 KaTeX 渲染,可插入编辑器或复制 LaTeX。 - 新增
enable_computation环境变量(默认开启)。
- 上传区域新增「图片识别 | PDF 公式提取」标签页切换。
- PDF 查看器:上传 PDF 后按页渲染,在页面上框选公式区域进行识别。
- 支持缩放(25%~400%)、翻页、拖拽上传 PDF。
- 框选区域自动裁剪并发送到现有 OCR 引擎,识别结果实时显示在右侧面板。
- 新增
POST /api/pdf/info和POST /api/pdf/render后端路由。
- 管理员登录区域始终显示:未设密码时提示配置,已设密码时显示登录表单,已登录时显示退出按钮。
- 新增「历史记录条数」设置(默认 50),用户可自定义历史记录上限。
history_limit作为用户级设置,所有用户可修改。
- 修复缩放后框选矩形不可见的问题,overlay 坐标正确乘以 zoom 因子。
- 修复 PDF 识别后历史记录不实时更新的问题。
- PDF 识别提示与图片识别一致(显示推理时间和模型名称)。
- 新增
\i→i、\j→j、\varepsilon→\epsilon等 KaTeX 兼容映射。
- 下标变量
ω₀正确解析为 SymPy 符号omega_0。 - 三角函数幂次
\sin²θ正确转换为sin(theta)**2。 - 函数参数
ω₀(t)自动去除后缀。 - 方程
x+4=6正确解析为Eq(x+4, 6)并求解。 - 未知变量名自动注册为 SymPy Symbol。
- 新增
sympy>=1.12符号计算库。 - 新增
PyMuPDF>=1.24.0PDF 渲染库。
- 将
LatexEditor、PreviewPane、SymbolPanel三个独立组件合并为统一的FormulaWorkspace组件。 - 可视化模式:MathLive 编辑器全宽显示,所见即所得,无需额外预览面板。
- 源码模式:CodeMirror 左侧编辑 + KaTeX 右侧预览,保留语法错误检查。
- 新增「公式模板快捷栏」:7 个常用结构化模板(分数、根号、上标、下标、求和、积分、矩阵),点击一键插入。
- 导出功能整合到统一工具栏:下拉菜单包含 4 组 13 种格式(PNG/SVG、LaTeX、Markdown、文档)。
- 工具栏单行布局,不再换行挤压。
- 删除
LatexEditor.tsx、PreviewPane.tsx、SymbolPanel.tsx三个冗余组件。
- 修复 MathLive 特有命令(
\exponentialE、\imaginaryI、\differentialD等)导致 KaTeX 预览报语法错误的问题。 - 新增
normalizeMathliveLatex()标准化函数,MathLive 输出自动转换为标准 LaTeX。 - 修复切换到源码模式再切回可视化模式时编辑器内容被清空的问题,改用
requestAnimationFrame等待元素就绪后同步值。
- PNG/SVG 导出合并到导出下拉菜单,工具栏更简洁。
- Pandoc 相关格式导出失败时显示友好提示,不再暴露后端技术信息。
- 管理员设置面板新增「启用 Pandoc」开关。
- 项目预览截图更新为公式工作区统一布局。
LatexEditor新增 MathLive 可视化编辑模式,支持虚拟数学键盘输入。- 新增「可视化 / 源码」模式切换按钮,CodeMirror 保留为源码编辑模式。
- MathLive 与 Zustand store 双向绑定:
onInput事件更新 store,外部 value 变化同步到 MathLive。 - TypeScript 新增
math-fieldJSX IntrinsicElements 声明。
- 新增
POST /api/export/{format}后端路由,支持 12 种导出格式。 - 文本格式(LaTeX inline/display/equation、Markdown inline/block、Plain Text)前端直接转换并复制到剪贴板。
- MathML 格式通过 Pandoc 转换。
- 文件格式(Word
.docx、PDF、HTML)通过 Pandoc 后端转换并下载,PDF 使用 XeLaTeX 引擎。 - 新增
ENABLE_PANDOC、PANDOC_PATH、XELATEX_PATH环境变量,管理员可在设置面板配置。 - 前端 PreviewPane 导出区域新增下拉菜单,按分组展示所有导出格式。
- 新增
exportFormulaText和exportFormulaFileAPI 函数。
- 新增
mathlive前端数学编辑库。
.env路径统一:config.py和settings.py统一使用绝对路径_ENV_FILE定位.env,修复因 CWD 不同导致 pydantic 读不到设置、settings router 写入无效文件的严重问题。- 字段别名映射:
return_preprocessed_image新增alias="preprocess",前端发送的preprocesskey 与后端字段正确映射,修复extra="forbidden"导致的 ValidationError。 - CORS 动态化:替换 Starlette
CORSMiddleware为DynamicCORSMiddleware,每次请求动态读取 CORS origins,设置面板修改后立即生效。 - HF_ENDPOINT 热更新:
os.environ.setdefault改为直接赋值,hf_endpoint修改后无需重启。 - Token 主动清理:新增
_purge_expired_tokens(),在管理员登录和设置保存时主动清理过期 token,防止字典无限增长。 - 未知 .env key 容错:
SettingsConfigDict新增extra="ignore",旧版残留的环境变量不再导致启动崩溃。 - CORS 空 origins 安全修复:空
cors_origins不再放行所有跨域请求,仅允许同源请求通过。 - 移除
settings.py中未使用的_KEY_ALIASES和_FIELD_TO_FRONTEND死代码。
- 新增
FormulaPreprocessor类,提供工业级数学公式图片预处理流水线。 - 处理步骤:深色背景自动反转(边缘亮度检测)、自适应二值化、非局部均值去噪、倾斜校正(±15°)、自动裁剪白边 + padding、最小尺寸保障(LANCZOS4 放大)。
- 每个步骤可通过
FormulaPreprocessConfigdataclass 独立开关和调参。 - 新增
ENABLE_FORMULA_PREPROCESSING环境变量,默认关闭,用户可在设置面板手动开启。 - 设置面板「通用设置」新增「高级预处理」开关,与「轻度预处理」并列。
PUT /api/settings保存后自动清除get_settings()的lru_cache,所有设置(包括高级预处理开关)保存后立即生效,无需重启后端。
- 符号面板改为标签页分类:希腊字母、数学运算、集合逻辑、箭头、定界符、积分、其他符号。
- 每个分类带彩色背景区分,内含子分组(如希腊字母分小写/大写)。
- 符号数量从 30+ 扩充至 100+,覆盖常用数学符号。
- 点击符号自动插入对应 LaTeX 命令(Unicode → LaTeX 映射)。
- 面板支持折叠/展开,节省页面空间。
- 移动端标签栏水平滚动,按钮自动换行。
- 新增右侧滑入式设置面板,点击 Header ⚙️ 按钮打开。
- 用户设置:默认模型(下拉选择)、轻度预处理开关。
- 管理员设置:模型启用/禁用、预加载模型、最大加载数、下载超时、P2T 模型版本、HF 镜像地址。
- 运行模式只读展示(auto/cpu/cuda)。
- 设置保存到
backend/.env,部分设置需重启后端生效。 - 管理员密码通过
ADMIN_PASSWORD环境变量配置,未设置时管理员设置不显示。
- Header 新增 GitHub 图标按钮,点击跳转项目仓库。
init_db()启动时自动检查session_id列是否存在,不存在则ALTER TABLE添加,解决旧数据库升级问题。
- 修复
PUT /api/settings的isinstance(bool(val))语法错误(应为isinstance(val, bool))。
- 未设置
ADMIN_PASSWORD时,_verify_admin()返回false,管理员设置不再默认显示。
- SettingsPanel 从 Header 内部移至 App 顶层渲染,解决
sticky与fixed定位冲突。 - 预处理开关从 UploadZone 移至设置面板。
- Header 主题按钮(🎨)与设置按钮(⚙️)分离。
- README 预览截图改为独立小节,新增设置面板截图。
- P2T 引擎改用
LatexOCR.recognize()直接调用,移除TextFormulaOCR包装,消除text_ocr must not be None警告。 - GPU 模式下自动检测
CUDAExecutionProvider是否可用,不可用时回退 CPU 并提示。
weights_exist()改为检查具体模型文件(pytorch_model.bin、model.safetensors等),不再仅检查目录是否存在。download_sync()发现目录存在但权重不完整时,先删除残留目录再重新下载。- 默认仓库更新为
wanderkid/unimernet。
applyModelPayload移除selectedModelId依赖,SSE 连接不再因模型切换而重建。handleSelectModel移除setLoading,切换模型不再影响上传按钮状态。handleCroppedFile识别前检查模型是否就绪,未就绪时自动降级到基础版。- 404 错误回退重试,503 错误提示等待,不再误触发回退。
- 下拉菜单选项和触发按钮新增下载进度条。
- 选中模型正在下载/加载时,在下拉按钮下方显示进度卡片。
HF_ENDPOINT新增为合法配置项,从.env读取后自动设置到环境变量。
- 全面响应式布局适配,手机端可正常使用全部核心功能。
- Header:Logo 缩小,副标题小屏隐藏,状态栏始终可见(精简显示状态点和文字)。
- 模型选择器:卡片式单列 → 双列 → 三列自适应。
- LaTeX 编辑器:高度从 360px 降至 240px,最小高度自适应。
- 实时预览:工具栏自动换行防溢出,最小高度自适应。
- 图片裁剪:按钮自适应宽度,标题和操作栏小屏垂直堆叠。
- 符号面板:内边距和间距缩小适配小屏。
- 主间距和标题字号全面使用
sm:断点渐进增强。
- README 新增移动端预览截图。
- 技术栈表格化,所有依赖项目添加 GitHub 仓库链接。
- README 目录结构新增
preview-mobile.png。
- 新增主题状态管理
themeStore,支持模型选择器样式和配色方案切换。 - 新增下拉菜单式模型选择器
ModelSelectorDropdown,可与经典卡片式自由切换。 - 新增 8 种预设主题配色(蓝色、靛蓝、紫色、玫瑰、琥珀、翡翠、青色、石墨)。
- Header 新增 ⚙️ 设置按钮,支持一键切换模型选择器样式和配色方案。
- 主题设置持久化到
localStorage,刷新页面不丢失。 - CSS 变量化主配色(
--color-primary),Tailwind 通过var()引用,支持动态切换。
- Pix2Text:
<2GB→<1GB(ONNX 推理无需 PyTorch,显存占用极低)。 - LaTeX_OCR:
4GB - 6GB→2GB+(pix2tex LatexOCR 模型约 200MB,PyTorch 推理约 2GB)。 - Uni-Equation:
>8GB→6GB+(Uni-MER 模型约 2-4GB,推理峰值约 6GB)。
- "KaTeX 默认" 重命名为 "KaTeX 内置",避免与默认字体 Times New Roman 混淆。
- LaTeX_OCR 现在只需
ENABLE_LATEX_OCR=true即可启用,使用 pix2tex 包内置权重,无需额外配置LATEX_OCR_CHECKPOINT或LATEX_OCR_REPO_ID。 - Uni-Equation 设置默认模型
anonymous945/Uni-MER,只需ENABLE_UNI_EQUATION=true即可启用,首次启动自动下载。 - 移除模型注册时的配置检查限制,
enable_*标志即为唯一启用条件。
- 重构三个引擎(Pix2Text、LaTeX_OCR、Uni-Equation)的下载逻辑,统一为「检查已下载 → 下载 → 加载」三阶段流程。
- 已下载的模型自动跳过下载步骤,直接进入加载阶段。
- 下载阶段通过 SSE 实时推送进度到前端,前端模型卡片可显示下载百分比。
- Pix2Text 引擎的下载与加载完全分离,下载阶段使用
snapshot_download+ 进度回调,加载阶段仅从本地读取。
- 新增
_hf_download_with_mirror()共用函数,统一三个引擎的 HuggingFace 下载行为。 - 下载时先尝试 HuggingFace 官方渠道,连接失败后自动回退
hf-mirror.com国内镜像。 - 用户可通过
HF_ENDPOINT环境变量自定义 HuggingFace 端点。 LatexOCREngine和UniEquationEngine的download_sync同步接入镜像回退策略。
HF_ENDPOINT:新增环境变量,可指定 HuggingFace 镜像地址(如https://hf-mirror.com)。
- 新增图片裁剪组件
ImageCropper,基于react-image-crop实现。 - 用户上传图片后默认进入裁剪模式,默认选区覆盖整张图片,可拖拽缩小至纯公式区域。
- 裁剪区域覆盖半透明遮罩,选区内显示"请框选纯公式区域"提示文字。
- 提供"确认框选"与"取消"按钮,确认后通过 Canvas API 将选区裁剪为新图片再发送 OCR。
- 粘贴图片同样自动进入裁剪流程。
- OCR 接口返回新增
confidence字段(0~1),前端读取后在编辑器上方显示置信度警告。 - 当
confidence < 0.8时,显示醒目黄色警告条:"识别置信度较低,可能存在错误,请人工核对"。 - 当
confidence >= 0.8时不显示提示。 - 向后兼容:旧版后端未返回
confidence字段时,默认视为高置信度处理,不报错。
- 基础版 OCR 引擎由
pix2tex替换为Pix2Text (P2T),使用 ONNX 后端,CPU 友好。 - P2T 使用 MFR 1.5 模型,公式识别精度提升。
LatexOCREngine改为直接继承BaseOCREngine,仍使用 pix2tex 包的LatexOCR类。- 新增
P2T_MFR_MODEL环境变量,可配置 P2T 公式识别模型版本(默认mfr-1.5)。 - 前端模型选择器显示名称由"基础版 (Pix2Tex)"更新为"基础版 (Pix2Text)"。
- 新增
react-image-crop前端裁剪库。 - 新增
pix2text>=1.1.4,替代pix2tex作为基础版 OCR 引擎。
LocalMathOCR 2.0.0 是一次正式的大版本更新,重点完成多模型 OCR 架构、模型生命周期管理、前后端状态同步、导出字体体验与项目文档展示升级。
- 新增
ModelManager模型生命周期管理器,统一管理模型注册、权重检查、自动下载、懒加载、热切换与卸载。 - 新增 Pix2Tex、LaTeX_OCR、Uni-Equation 三种模型配置入口。
- 新增模型元数据定义,包含显示名称、特点说明、显存需求与擅长场景。
- 新增
GET /api/models,用于返回模型列表、状态、进度和当前激活模型。 - 新增
GET /api/models/events,通过 SSE 实时推送模型状态。 - 新增
POST /api/models/{model_id}/activate,支持前端主动切换当前模型。 - 新增
POST /api/ocr,支持通过model_id指定单次推理模型。
- 支持
PRELOAD_MODELS配置启动时需要初始化的模型列表。 - 支持缺失权重时自动下载模型文件。
- 支持通过 Hugging Face 仓库或本地 checkpoint 配置 LaTeX_OCR。
- 支持通过 Hugging Face 仓库、模型名或本地目录配置 Uni-Equation。
- 未配置独立权重的 LaTeX_OCR 不再复用 Pix2Tex 权重,避免误判模型已切换。
- 新增模型选择卡片 UI,展示 Pix2Tex、LaTeX_OCR、Uni-Equation 的状态、描述、显存需求和适用场景。
ready状态可点击切换,downloading状态显示下载/加载进度,unavailable状态置灰并提示配置缺失。- 前端点击模型时会调用后端激活接口,确保 UI 选择与实际推理模型一致。
- 新增公式导出字体选择能力。
- 默认字体改为
Times New Roman。 - 支持 Cambria Math、STIX Two Math、Latin Modern Math、Georgia、Arial 等字体选项。
- PNG / SVG 导出时同步覆盖 KaTeX 内部字体,保证预览和导出一致。
- 更新 README 项目预览区。
- 新增/优化主界面 SVG 截图。
- 新增/优化导出与字体选择 SVG 截图。
- 优化模型选择与状态同步 SVG 排版。
- 优化模型生命周期管理 SVG 排版,修复底部文字重叠问题。
- 新增正式版 GitHub Release 文案文件。
- 修复前端切换模型后,后端实际推理仍使用旧模型的问题。
- 修复模型加载/卸载过程中缺少并发锁导致的状态漂移风险。
- 修复 LaTeX_OCR 未配置独立权重时误显示为可用的问题。
- 修复公式预览与导出默认字体看似设置为 Times New Roman、实际仍被 KaTeX 字体覆盖的问题。
- 修复文档 SVG 图底部文字重叠、排版拥挤的问题。
- 默认仅预热轻量 Pix2Tex,降低启动显存压力。
- 切换模型后自动卸载旧模型并触发显存清理。
- 模型状态通过 SSE 推送,减少前端轮询和状态不同步问题。
- README 补充 LaTeX_OCR 与 Uni-Equation 的真实启用方式和验证方法。
新增或完善以下环境变量:
PRELOAD_MODELSENABLE_PIX2TEXENABLE_LATEX_OCRENABLE_UNI_EQUATIONLATEX_OCR_CHECKPOINTLATEX_OCR_REPO_IDUNI_EQUATION_REPO_IDUNI_EQUATION_MODEL_NAMEUNI_EQUATION_CHECKPOINTMAX_LOADED_MODELSMODEL_DOWNLOAD_TIMEOUT_SEC
- 新增
transformers>=4.45.0 - 新增
accelerate>=0.34.0 - 新增
huggingface_hub>=0.26.0
- 新增公式图片增强预处理管道
enhance_formula_image。 - 支持灰度化、自适应二值化、非局部均值去噪、卷积锐化和 2 倍高清放大。
- OCR 推理前新增
enhanced图像识别分支,用于提升浅色背景、PPT 截图、模糊 PDF 截图等低质量图片的识别稳定性。
/api/recognize路由在原始识别结果可疑时,会同时尝试原有预处理图和增强预处理图,并选择评分最高的 LaTeX 结果。- 增强预处理失败时自动回退原图,避免服务因图片处理异常崩溃。
- 前端默认字体调整为
Times New Roman。
- 项目已包含
opencv-python-headless、numpy、Pillow,本版本无需新增额外依赖。
- 版本号由
1.0.0升级至1.1.0。
- 初始版本。