The project's README from github.com/margrop/wrong-notebook. As one markdown file: README.md.
简体中文 | English
一个基于 AI 的智能错题管理系统:拍照或输入题目后,由 AI 识别、解答、打知识点标签并评定难度,支持错题本管理、举一反三练习、组卷打印和掌握程度跟踪。
⬇️ 下载安装包:https://blog.margrop.net/wrong-notebook-github-pages/download/(自动识别系统与架构,列出 Windows、macOS、Linux、安卓、飞牛OS 全部安装包)
🌐 项目介绍页:https://blog.margrop.net/wrong-notebook-github-pages/
📝 介绍文章:别让错题本变成抄题本:我给孩子用的 AI 错题本开源了 · 不用先配 API Key:接上 MiniMax 免费账号
🚀 在线演示:https://wrong-notebook-demo.vercel.app(账号 demo@localhost,密码 demo123456)
演示站点为共享账号,数据对所有访客可见,请勿录入个人信息。
📦 多平台安装:Docker 镜像(amd64 / arm64)· npm(npm i -g wrong-notebook)· Windows · macOS · Linux · 飞牛OS · 安卓手机 / 平板(单机版内置服务端,或连接服务器的客户端),安装包见 Releases,安装方式见快速开始。
🆓 免费的 MiniMax 账号就能用:选择「MiniMax Code OAuth」渠道,用 MiniMax Code 账号网页登录即可调用 MiniMax-M3.1-Flash,不需要购买 API Key。应用每天自动签到领取积分,识题、讲解等 AI 功能消耗的是账号的免费积分额度,详见 MiniMax Code OAuth。
本仓库 fork 自 wttwins/wrong-notebook,在其基础上增加了较多功能(见下文)。
使用中遇到问题、想分享用法或提建议,欢迎加入 QQ 群 964325781,或用 QQ 扫描下方二维码。Bug 和功能需求仍建议提交到 Issues,方便跟踪处理;在群里发截图前请隐去孩子姓名、学校、账号和访问地址。
以下截图采集自实际运行的应用(2026-10-20),展示已有题目、讲解和试卷。用户名已遮挡,可点击图片查看大图。
错题管理:在同一页面查看题目摘要、难度星级和知识点,按年级、学期、掌握情况及 A/B 卷筛选,也可通过题目 ID 定位、比较相似度或批量打印。
列表按需加载卡片数据,原图、答案和解析在详情或打印预览时读取,减少翻页时的数据传输。

首页提供拍照上传、手动输入和直接录入入口,支持拖拽图片与剪贴板粘贴。

通用设置可调整导入前人工确认、SVG 动画讲解、GeoGebra 动态演示、题目判重相似度阈值和已掌握阈值。

一道错题集中展示题干、知识点、年级学期与试卷等级,可核对原题图片,并从详情页进入举一反三。

下图为已有六边形染色题的动画讲解,展示区域关系与递推计数过程;播放器支持暂停、拖动进度、重播和全屏。

原题下汇总举一反三和试卷作答结果,展开记录可回看变式题与答案。AI 根据实际作答历史评估掌握概率,辅助安排后续复习。

生成的试卷保留来源题目 ID,并展示各次作答结果,方便回到原题跟踪复习效果。

打印预览可选择包含答案页,支持下载 HTML、打印或通过浏览器保存为 PDF。

标准标签库按教学层级组织知识点。知识点已并入「统计」栏目:「知识点管理」页签可浏览标准标签库、增删自定义标签,「知识点统计」页签显示使用频率。

错题统计展示累计错题、已掌握数量、掌握率、科目分布和月度趋势。

练习统计单独展示累计练习、正确率和活跃月份,并按学科、难度观察练习分布与趋势。

$…$、$$…$$、\(…\)、\[…\];编辑时可在「源代码 / 预览」之间切换。检测到公式语法错误时,详情页出现「修复 LaTeX」按钮,由 AI 只修复公式写法。POST /api/openclaw/batch-upload 批量上传题目图片,配置见下文环境变量。屏幕截图依赖浏览器的安全上下文 (HTTPS)。在 Docker 或局域网环境中使用时,请参考 HTTPS 配置指南 启用内置 HTTPS 支持。
本项目支持 PWA,可将应用添加到手机或平板主屏幕,全屏运行、点击图标直接打开,平板可横屏使用。
通过 HTTPS(或 localhost)访问时会启用 Service Worker:缓存页面脚本、样式和图标以加快打开速度,断网时显示离线提示页。题目、统计等数据始终从服务器读取,不做离线缓存。
环境准备:Node.js 22 及以上(推荐 24)和 npm。
克隆并安装依赖:
git clone https://github.com/margrop/wrong-notebook.git
cd wrong-notebook
npm ci
配置环境变量:复制 .env.example 为 .env,按下文「环境变量」一节填写。
cp .env.example .env
初始化数据库:创建表结构和管理员账户,再导入系统知识点(与 Docker 构建时相同):
npx prisma migrate dev
npx prisma db seed
npx ts-node --compiler-options '{"module":"CommonJS"}' scripts/rebuild-system-tags.ts
启动开发服务器:
npm run dev
访问 http://localhost:3000,使用默认管理员账户登录:邮箱 admin@localhost,密码 123456。首次登录会进入安装向导:先修改默认密码(必须),再配置 AI 渠道、创建第一个错题本。
AI 的 API Key 等也可以在登录后通过网页设置填写,见下文「AI 模型配置」一节。
每次发版都会把镜像发布到 GitHub Container Registry:ghcr.io/margrop/wrong-notebook,支持 linux/amd64 和 linux/arm64,可直接拉取,不需要源码。
| 镜像标签 | 说明 |
|---|---|
2026.10.20 等精确版本 |
推荐,升级时可控 |
2026.10 |
当月最新版本 |
latest |
最新正式版本 |
可用版本见 Releases。
准备目录和密钥:
mkdir -p wrong-notebook/data wrong-notebook/config
cd wrong-notebook
openssl rand -base64 32 # 生成的字符串用作 NEXTAUTH_SECRET
启动容器(任选一种):
使用 docker run:
docker run -d --name wrong-notebook \
--restart always \
-e NEXTAUTH_SECRET="上一步生成的密钥" \
-e NEXTAUTH_URL="http://你的IP或域名:3000" \
-p 3000:3000 \
-v "$(pwd)/data:/app/data" \
-v "$(pwd)/config:/app/config" \
ghcr.io/margrop/wrong-notebook:latest
使用 Docker Compose:下载仓库中的 docker-compose.yml 放到当前目录,修改 NEXTAUTH_SECRET(及 NEXTAUTH_URL)后执行:
docker compose up -d
登录:访问 http://你的IP或域名:3000,使用默认管理员账户登录:邮箱 admin@localhost,密码 123456。首次登录会进入安装向导:先修改默认密码(必须),再配置 AI 渠道、创建第一个错题本。
升级:拉取新镜像并重建容器,数据保留在挂载目录中,启动时只执行数据库迁移。
docker compose pull && docker compose up -d
# 使用 docker run 时:docker pull 新镜像后 docker rm -f wrong-notebook,再执行上面的 docker run
升级前建议先备份 data/ 目录。
数据保存在挂载的 data/(SQLite 数据库)和 config/(网页中保存的 AI 配置等)目录。设置页「关于」和 /api/health 显示当前运行的版本。HTTPS 部署见 HTTPS 配置指南 和 docker-compose.https.yml。
上游项目的镜像
ghcr.io/wttwins/wrong-notebook不包含本仓库新增的功能,请使用ghcr.io/margrop/wrong-notebook。
需要修改代码或使用未发布的改动时,可以自行构建。构建过程中会在镜像内运行全部测试,并完成生产构建:
docker build -t wrong-notebook:local .
docker run -d --name wrong-notebook \
-e NEXTAUTH_SECRET="your_secret_key" \
-p 3000:3000 \
-v "$(pwd)/data:/app/data" \
-v "$(pwd)/config:/app/config" \
wrong-notebook:local
使用 docker-compose.yml 时,把其中的 image 改为 wrong-notebook:local 即可。
不想使用 Docker 时,可以从 Releases 下载桌面版或飞牛OS 安装包,也可以通过 npm 安装:
npm install -g wrong-notebook
wrong-notebook --port 3000
| 平台 | 安装包 |
|---|---|
| Windows | WrongNotebook-Win-Setup-<版本>-x64.exe(安装版)、WrongNotebook-Win-Portable-<版本>-x64.exe(免安装) |
| macOS | WrongNotebook-Mac-<版本>-arm64.dmg(Apple 芯片)、WrongNotebook-Mac-<版本>-x64.dmg(Intel) |
| Linux | WrongNotebook-Linux-<版本>-<架构>.AppImage、.deb |
| 飞牛OS | WrongNotebook-FnOS-<版本>-x86.fpk、WrongNotebook-FnOS-<版本>-arm.fpk |
| 安卓手机 / 平板(单机版) | WrongNotebook-Android-Phone-<版本>.apk(竖屏)、WrongNotebook-Android-Tablet-<版本>.apk(横竖屏自动旋转) |
| 安卓手机 / 平板(客户端) | WrongNotebook-Android-Client-Phone-<版本>.apk、WrongNotebook-Android-Client-Tablet-<版本>.apk |
安卓单机版内置服务端,安装后直接使用,数据保存在本机(卸载 App 会删除数据;数据含 API Key,不参与系统备份,卸载或换机前请在设置中导出备份),首次以默认管理员 admin@localhost / 123456 登录并按提示修改密码;需要 Android 8.0 及以上的 64 位 ARM 设备。客户端版不内置服务端,首次打开时填写已部署的服务器地址(如 http://192.168.1.10:3000),可在「设置 → 关于」中更换服务器,需要 Android 7.0 及以上。两种 App 都支持拍照上传、导出文件和系统打印,可以同时安装。
数据目录、默认账号、本地构建方法见 INSTALL_PACKAGES.md。
基础配置
| 环境变量 | 描述 | 默认值 | 说明 |
|---|---|---|---|
DATABASE_URL |
数据库连接地址 | 源码 file:./dev.db;Docker file:/app/data/dev.db |
SQLite 数据库路径 |
NEXTAUTH_SECRET |
Auth 密钥 | 无 | 用于加密 Session,生产环境必须设置,可用 openssl rand -base64 32 生成 |
NEXTAUTH_URL |
访问地址 | 无 | 部署后的访问地址,如 http://your-domain:3000 |
AUTH_TRUST_HOST |
信任主机头 | Docker 镜像中为 true |
为 true 时根据请求自动推断访问地址,适合 Docker/反向代理 |
LOG_LEVEL |
日志级别 | 开发 debug / 生产 info |
可选 trace、debug、info、warn、error、fatal,详见 日志指南 |
DEBUG_DB |
SQL 日志 | false |
为 true 时输出数据库查询日志 |
HTTP_PROXY / HTTPS_PROXY |
代理 | 无 | 访问 AI 服务时使用的代理 |
ALLOW_REGISTRATION |
允许注册 | false |
为 true 时默认开放注册;管理员在「设置 → 用户管理」中保存的开关优先 |
AI_DAILY_LIMIT |
每人每日 AI 次数 | 0(不限制) |
普通用户每天可发起的 AI 操作次数,管理员不受限制;「设置 → 用户管理」中保存的值优先 |
TTS_MODE |
动画语音讲解的朗读方式 | browser |
browser 为浏览器本地语音;minimax、qwen 为云端语音,复用对应渠道的 API Key。「设置 → AI 设置 → 语音讲解」中保存的值优先 |
AI 配置(网页中保存的配置优先于环境变量)
| 环境变量 | 描述 | 默认值 | 说明 |
|---|---|---|---|
AI_PROVIDER |
AI 提供商 | minimax |
可选 minimax、minimax-code、glm、deepseek、kimi、qwen、anthropic、azure、openai、gemini |
MINIMAX_API_KEY / MINIMAX_BASE_URL / MINIMAX_MODEL |
MiniMax | 地址 https://api.minimax.cn/v1,模型 MiniMax-M3.1-Flash |
地址和模型可留空 |
MINIMAX_CODE_MODEL |
MiniMax Code 模型 | MiniMax-M3.1-Flash |
账号在网页设置中登录,无需 API Key |
MINIMAX_CODE_AUTO_CHECKIN |
MiniMax Code 每日自动签到 | true |
设为 false 关闭 |
GLM_API_KEY / GLM_BASE_URL / GLM_MODEL |
智谱 GLM | 地址 https://open.bigmodel.cn/api/paas/v4,模型 glm-5.3-flash |
地址和模型可留空 |
DEEPSEEK_API_KEY / DEEPSEEK_BASE_URL / DEEPSEEK_MODEL |
DeepSeek | 地址 https://api.deepseek.com,模型 deepseek-flash |
地址和模型可留空 |
KIMI_API_KEY / KIMI_BASE_URL / KIMI_MODEL |
Kimi | 地址 https://api.moonshot.cn/v1,模型 kimi-k3 |
地址和模型可留空 |
QWEN_API_KEY / QWEN_BASE_URL / QWEN_MODEL |
千问 Qwen | 地址 https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1(百炼 Token Plan),模型 qwen3.8-max |
按量付费的 Key 改填 https://dashscope.aliyuncs.com/compatible-mode/v1 |
ANTHROPIC_API_KEY |
Anthropic API Key | 无 | 从 Claude Console 获取 |
ANTHROPIC_BASE_URL |
API 地址 | https://api.anthropic.com |
兼容服务填写不含 /v1 的地址 |
ANTHROPIC_MODEL |
模型 | claude-sonnet-5-5 |
如 claude-opus-5-5、claude-haiku-5-5 |
AZURE_OPENAI_API_KEY |
Azure API Key | 无 | 从 Azure 门户获取 |
AZURE_OPENAI_ENDPOINT |
Azure Endpoint | 无 | 如 https://xxx.openai.azure.com |
AZURE_OPENAI_DEPLOYMENT |
部署名称 | 无 | Azure 中配置的部署名称 |
AZURE_OPENAI_API_VERSION |
API 版本 | 2024-02-15-preview |
|
AZURE_OPENAI_MODEL |
模型名称 | gpt-4o |
仅用于显示 |
OPENAI_API_KEY |
OpenAI API Key | 无 | 从 OpenAI Platform 获取 |
OPENAI_BASE_URL |
OpenAI API 地址 | https://api.openai.com/v1 |
使用兼容服务时填写其地址 |
OPENAI_MODEL |
OpenAI 模型 | gpt-6.1-sol |
兼容服务填写对应平台的模型 ID |
GOOGLE_API_KEY |
Gemini API Key | 无 | 从 Google AI Studio 获取 |
GEMINI_BASE_URL |
Gemini API 地址 | 官方地址 | 通常无需修改 |
GEMINI_MODEL |
Gemini 模型 | gemini-2.5-flash |
推荐 gemini-3.8-flash |
Openclaw 集成(可选)
| 环境变量 | 描述 | 默认值 | 说明 |
|---|---|---|---|
OPENCLAW_API_URL |
Openclaw agent 地址 | 无 | 本地部署的 Openclaw agent 服务地址 |
OPENCLAW_API_KEY |
Openclaw API 密钥 | 无 | 调用 Openclaw agent 时使用 |
OPENCLAW_TIMEOUT |
超时(毫秒) | 30000 |
|
OPENCLAW_AUTH_MODE |
认证方式 | credentials |
credentials(用户名密码)或 apikey |
OPENCLAW_INTEGRATION_API_KEY |
本系统 API 密钥 | 无 | 仅 apikey 模式需要,供 Openclaw 调用本系统,可用 openssl rand -hex 32 生成 |
新增环境变量时需同步更新 .env.example。
AI 配置可在网页中动态修改,无需重启服务器。
config/app-config.json,优先级高于 .env。「提示词」页可自定义识别和举一反三的提示词模板。
所选模型需要满足以下条件,否则部分功能无法使用或效果较差:
| 要求 | 用到的功能 | 说明 |
|---|---|---|
| 支持图片输入(多模态) | 拍照/截图识别题目、AI 重新生成配图、有原图时的重新生成解答 | 纯文本模型只能使用文字录入,识别图片会失败 |
| 能写准确的 SVG 代码 | 题目配图、举一反三和试卷新题的配图、SVG 动画讲解 | 这些「图片」都由模型输出 SVG 代码生成,不调用图片生成模型,也不需要模型具备出图能力;模型的几何作图和 SVG 动画(SMIL)能力决定配图与动画的质量 |
| 较长的单次输出 | SVG 动画讲解(上限 16384 token)、识别题目(含配图,上限 8192 token) | 输出被截断时会用 32768 token 重试一次,模型的最大输出不足 16K 时,动画讲解容易生成失败 |
| 严格遵循输出格式 | 所有 AI 功能 | 结果按 <answer_text>、<svg_animation> 等标签或 JSON 解析,格式不符会提示「AI 返回格式异常,可能模型不兼容」 |
| 规范的 LaTeX | 题目、答案、解析 | 公式须能被 KaTeX 显示;出现语法错误时可用详情页的「修复 LaTeX」修正 |
| 较强的数学推理 | 解答、错因分析、难度星级、掌握概率评估 | 推理(思考)模型可以使用,思考内容会被自动忽略;思考耗时较长时,管理员可在「设置 → 通用」中调大「AI 分析超时时间」 |
推荐使用各提供商当前的多模态旗舰或快速模型,例如 MiniMax-M3.1-Flash、glm-5.3-flash、deepseek-flash、kimi-k3、qwen3.8-max、claude-sonnet-5-5、gpt-6.1-sol、gemini-3.8-flash。使用兼容接口的第三方模型时,请先确认它支持图片输入。
以下渠道通过各家官方的 OpenAI 兼容接口调用,只需填写 API Key;Base URL 和模型留空时使用下表默认值(中国大陆官方地址和当前最新的多模态模型)。使用国际站时把 Base URL 改为国际站地址即可。
| 渠道 | API Key 获取 | 默认 Base URL | 默认模型 |
|---|---|---|---|
| MiniMax | MiniMax 开放平台 | https://api.minimax.cn/v1(国际站 https://api.minimax.io/v1) |
MiniMax-M3.1-Flash |
| 智谱 GLM | 智谱开放平台 | https://open.bigmodel.cn/api/paas/v4(国际站 https://api.z.ai/api/paas/v4) |
glm-5.3-flash |
| DeepSeek | DeepSeek 开放平台 | https://api.deepseek.com |
deepseek-flash |
| Kimi | Kimi 开放平台 | https://api.moonshot.cn/v1(国际站 https://api.moonshot.ai/v1) |
kimi-k3 |
| 千问 Qwen | 阿里云百炼(推荐 Token Plan) | https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1(按量付费 https://dashscope.aliyuncs.com/compatible-mode/v1) |
qwen3.8-max |
支持免费版 MiniMax 账号:用 MiniMax Code 账号网页登录,不需要 API Key,也不需要开通付费套餐。
MiniMax-M3.1-Flash:已实测可用,支持图片识别;也可选 MiniMax-M3、MiniMax-M2.7 等。使用方法:在“设置 → AI 设置”中选择 MiniMax Code OAuth,点击“网页登录”,在打开的 MiniMax 页面完成授权即可;设置页会显示登录状态、剩余积分和今天是否已自动签到。
登录凭据保存在服务端配置目录的 minimax-code.json(与 app-config.json 同目录,不随数据备份导出),Access Token 到期前自动续期。登录后服务每小时检查一次,当天(北京时间)还没签到时自动领取 MiniMax Code 的签到积分,也可以在设置页关闭自动签到或手动立即签到。该渠道使用 MiniMax Code 桌面客户端的登录方式(OAuth 设备码授权),不是官方开放接口,MiniMax 可能随时调整或限制;请遵守 MiniMax 的服务条款。
| 参数 | 获取方式 |
|---|---|
| API Key | Claude Console → API Keys |
| Base URL | 默认 https://api.anthropic.com,通常无需修改 |
| 模型 | claude-sonnet-5-5(推荐)、claude-opus-5-5、claude-haiku-5-5 等 |
兼容模式:Anthropic 提供商同样可以接入兼容 Anthropic Messages API 的第三方服务。Base URL 填写服务商提供的地址(不含
/v1,程序会自动拼接/v1/messages),模型名称填写对应平台的模型 ID。推理模型返回的思考内容会被自动忽略。
| 参数 | 获取方式 |
|---|---|
| API Key | Azure 门户 → 你的 OpenAI 资源 → 密钥和终结点 |
| Endpoint | Azure 门户 → 你的 OpenAI 资源 → 终结点,如 https://xxx.openai.azure.com |
| 部署名称 | Azure 中配置的模型部署名称,如 gpt-4o |
| API 版本 | 默认 2024-02-15-preview |
| 参数 | 获取方式 |
|---|---|
| API Key | OpenAI Platform → Create new secret key |
| Base URL | 默认 https://api.openai.com/v1 |
| 模型 | gpt-6.1-sol(推荐)等 |
兼容模式:OpenAI 提供商兼容所有支持 OpenAI API 格式的第三方服务。将 Base URL 改为对应服务地址,即可使用硅基流动、通义千问 DashScope 等平台的模型,模型名称填写对应平台的完整模型 ID。
| 参数 | 获取方式 |
|---|---|
| API Key | Google AI Studio → 创建 API Key |
| Base URL | 默认 https://generativelanguage.googleapis.com,通常无需修改 |
| 模型 | gemini-3.8-flash(推荐)等 |
权限:AI 设置、提示词、连接测试和模型列表只对管理员开放;普通用户在「设置 → 通用」中只能修改自己的偏好(导入前人工确认、SVG 动画讲解、GeoGebra 动态演示、判重阈值、已掌握阈值)。应用时区由管理员设置。
npm run lint # ESLint(出现警告即失败)
npm run test:unit # 单元测试
npm run test:integration # 集成测试
npm test # 全部 Vitest 测试
npm run test:coverage # 测试覆盖率(低于最低要求时失败)
npm run test:e2e # Playwright E2E(先运行 node scripts/prepare-e2e.js 准备测试账号)
bash scripts/ci.sh # 完整 CI(Node.js 22+、Python 3,含生产构建)
修改 prisma/schema.prisma 后使用 npx prisma migrate dev --name <名称> 生成正式迁移并提交;迁移须兼容已有数据。更多开发约定见 AGENTS.md。
使用、部署和常见问题见 Wiki(另有 English 版)。专项文档:
| 文档 | 内容 |
|---|---|
| INSTALL_PACKAGES.md | npm、桌面版、飞牛OS、安卓安装包与构建 |
| HTTPS_SETUP.md | HTTPS 配置(屏幕截图需要) |
| TIME_ZONE.md | 应用时区 |
| LOGGING_GUIDE.md | 日志 |
| MARKDOWN_GUIDE.md | Markdown 与公式 |
| TABLE_RECOGNITION.md | 表格识别 |
| PROJECT_OVERVIEW.md、operational_flow.md | 项目结构与操作流程(部分内容早于本仓库新增功能) |
| release-guide.md | 版本发布 |
| BRANCH_WORKFLOW.md | 公开主线与上传前检查 |
| setup-wsl-network.md | WSL 网络配置 |
scripts/ 目录下提供维护和调试脚本,例如:
node scripts/reset-password.js <邮箱> <新密码>node scripts/seed-admin.js(默认 admin@localhost / 123456)npx ts-node --compiler-options '{"module":"CommonJS"}' scripts/rebuild-system-tags.ts(保留自定义标签和题目关联;生产环境操作前请先备份)node scripts/check-db-users.js、node scripts/check-db-data.js欢迎提交 Issue 和 Pull Request,请先阅读贡献指南和行为准则。提问和反馈方式见获取帮助,安全漏洞请按安全策略私下报告。各正式版的改动见更新日志。
© 2026 margrop。本项目基于 wttwins/wrong-notebook 扩展,原项目代码版权归原作者所有。