简体中文 | English
在线演示:solvnote.n29.net(公开演示实例,数据与服务稳定性不作保证。) 建议仅使用不含隐私的题目测试,不要在演示站配置自己的AI密钥或保存敏感资料。
不止拍照出答案,更要讲清怎么想到、为什么成立、下次怎样自己做。
基于wttwins/wrong-notebook继续开发,保留账户、学科错题本、裁剪上传、知识点、练习和打印,重点增强图文解析、多轮追问、几何辅助线与AI配置互通。
解析特色 · 快速上手 · 部署 · 常见问题 · 技术文档
这里的重点不是在聊天框里再给一次答案,而是把可核对的题设、可理解的讲解、可追问的过程和可复习的错题记录放在一起。
| 你关心的事 | 本项目的做法 |
|---|---|
| 为什么想到这一步? | 先讲思路,再用有标题的步骤推导,交代依据,最后检验与总结;不只罗列计算式。 |
| 能不能用更容易理解的方法? | 年级是讲解起点,不是知识上限。优先最低必要知识;能用初等几何严谨解决时,不默认改用坐标计算。确需升阶,再解释新概念。 |
| 题图有没有读错? | 保留原图供核对;支持图片的解题模型会同时收到原图。图像疑点优先补读,真缺条件再问人,人工修订优先。 |
| 看不懂、不同意,怎么办? | 围绕同一道题继续追问、补图或纠错。默认10轮,管理员可调整默认值,并在到限提醒后确认追加。 |
| 下次怎样不再错? | 区分不会做、做错了、未判断;记录错误解答原文,编辑错因与知识点。没有作答证据时,不编造个人错因。 |
**题目内容、参考答案、解题思路分区显示,默认预览Markdown与数学公式,标记源码按需展开。**结果可以直接编辑、添加到错题本,不必在聊天窗口和另一个编辑器之间来回搬运。
上面的两张图是功能与讲解结构示意;界面截图使用合成示例。讲解规则不是正确率保证,题设、推导和图形仍需人工核对。
| 几何辅助线:不只说怎么画 | AI设置:一个连接,多个模型 |
|---|---|
![]() |
![]() |
| 逐步看新增点与辅助线,对照原图理解构造。 | 网站/API地址+一把Key为一个连接,模型放在连接下。 |
- 辅助线与演示:解题后点击生成分步辅助线方案,AI生成方案,浏览器绘制底图与辅助线,支持圆、弧、扇形边界、下载SVG及按需打开GeoGebra。看图、切步骤、下载不再调用AI。需在原图副本上加线时,可另行启用受支持的Gemini图片编辑模型;原图不覆盖,结果需核对。
- 模型自由搭配:分别设置识图/补读顺序和解题/问答顺序,文字模型也能负责解题。连接弹窗、悬浮保存、连通性测试、重复配置检测,以及与ScanDex互通的加密导入/编辑都由管理员管理。当前源码仍提供管理员加密导出接口;“默认关闭、仅在部署环境变量明确开启时放行”的导出安全策略已经确定,但尚未在运行代码中生效,必须等后续实现并完成本地验收后才按该策略执行。导入与无密钥格式模板以实施计划为准,升级完成前不要把文档当作运行时安全开关。
- 过程可见、任务可取回:显示每一步实际使用的模型、所属连接、是否带图和耗时,不展示内部思维链。后台受理后可离开页面;短任务(含辅助线)可在我的AI任务中用弹窗取回,不必重复付费生成。
- 准备AI:管理员进入
/admin/ai,手动添加连接和模型,或导入ScanDex的加密配置。按实际能力勾选读图,并把模型加入相应调用顺序,点击保存。连通性测试只验证一次短文字通信,可能收费,不代表已验证识图质量。 - 提交题目:从首页或学科错题本添加页上传、裁剪题图,也可只输文字或补充要求。默认先识图再解题;纯文字跳过识图,也保留直接图文解题入口。
- 核对与追问:先检查题干、角名和条件;有错可人工修订。看不懂某一步就继续问,也可补充自己的作答。需要几何演示时,手动生成辅助线方案。
- 整理与保存:直接修改题目、答案、解析,选择作答状态,填写错误解答、错因和知识点,再保存到错题本。之后按学科整理、练习或打印复习。
默认图文流程:视觉模型转录 → 按解题顺序选模型(支持读图就附原图)→ 有疑点先补读 → 真缺条件请你补充 → 完成解析。文字模型会把具体疑问交给视觉模型,多模态解题者可自行核图,不是把所有AI同时调用一遍。
解题记录与统计:首页的解题记录入口按受理时间展示会话和旧式直接解题,支持状态筛选、分页与及时刷新;同题追问仍计一条,是否存入错题本另行决定。统计中心分别展示解题、错题收录和复习练习。已完成不等于答对;AI调用只统计当前保留的调用日志,不代表费用或历史总量。现存旧记录保留,已清理的历史任务不能恢复。
公告管理:管理员通过/admin/announcements管理草稿、发布、暂时隐藏、归档、独立置顶排序和可选有效期,面向所有已登录且启用的账号。用户显式确认已阅后,普通公告进入历史,读后隐藏仅对该用户消失,常驻公告仍保留但不再计入未读。打开列表不自动标已阅,编辑或重新发布不清空已阅状态;需要再次通知所有人时新建公告。列表提供置顶/取消置顶、隐藏/恢复发布快捷操作;永久删除需确认并清除该公告的已阅记录,不能撤销,需保留时用隐藏或归档。正文为纯文本,支持可选英文和站内链接,不发送邮件、浏览器系统或第三方推送。
公告升级边界:2.0.0-yus.2需要增量迁移Announcement和AnnouncementRead两张表,并一次性转入原三条内置公告。程序、schema和生成的Prisma客户端必须配套升级,不要原地重新生成运行实例共用的依赖。升级前停止写入并配对备份数据库、配置及原秘密变量。错题本JSON不包含公告和已阅状态,详见公告管理说明。
注册与账户策略(已记录设计,运行代码尚未启用):新注册用户默认获得7天试用期;管理员可以在7天、30天或永久之间选择注册默认期限;管理员后台手动创建的用户默认永久。到期账号禁止访问站点,过期满30天后才会由幂等清理任务永久删除;已有账号不会被自动套用新期限。当前源码仍是旧注册接口:allowRegistration默认配置为允许注册,尚未实现Cloudflare Turnstile、邀请码、期限、过期拦截等完整策略,因此部署到公网前应在配置中显式关闭注册,直到后续实现并完成本地验收。后续启用时可要求Cloudflare Turnstile和邀请码。注册码的设计默认有效30天,管理员可以在后台续期/调整有效期,并可以选择是否在注册码框中自动显示;这些功能尚未进入当前运行代码,邀请码的生成、使用次数、失效和展示状态由后续后台控制,明文注册码不应长期保存。
备份注意:设置里的错题本JSON导出不含解题会话、AI任务和AI凭据。AI配置导出的“默认关闭”是已确定的后续安全策略,当前源码尚未实现该环境变量开关,管理员导出接口在完成实现前仍可能可用;不要把README当作已生效的权限控制。完整备份需停止写入,配对保存数据库、配置和原秘密变量(含主钥),见下方升级说明。本轮版本说明见CHANGELOG,运行站内也可从关于打开版本说明;源码版本不等于镜像已发布。
保存边界:同题会话、直接解题和重新解答长期保留;绘图、举一反三等临时任务结果保留24小时。编辑器里的人工草稿不会因离开页面自动保存,长期保留辅助线也需保存到错题或下载。AI处理会把提交的题图、文字和必要上下文发给你配置的供应商,请勿夹带无关个人信息。
本分支镜像(支持AMD64/ARM64):
ghcr.io/yumumao/solvnote:latest
-
新建容器服务,使用上面的镜像,服务端口设为
3000;绑定域名并启用HTTPS。采用单副本、持续运行,不要按请求休眠。 -
添加两个持久卷,名称可自定,挂载目录必须正确:
建议卷名 挂载目录 保存内容 solvnote-config/app/config配置文件、AI加密主钥 solvnote-data/app/data数据库、账户、错题、AI配置与任务 -
在服务的环境变量中逐项添加以下设置。先替换示例域名、邮箱和尖括号占位符,不要原样部署。
NEXTAUTH_URL=https://solvnote.n29.net NEXTAUTH_SECRET=<替换为新生成的随机值> INITIAL_ADMIN_EMAIL=you@example.com INITIAL_ADMIN_PASSWORD=<替换为至少12字符的独立口令> DATABASE_URL=file:/app/data/dev.db
生成
NEXTAUTH_SECRET:在装有Node.js的本机终端运行以下命令,把输出填入平台秘密变量,不发给AI或提交Git。也可在有OpenSSL的终端运行openssl rand -hex 32。node -e "console.log(require('node:crypto').randomBytes(32).toString('hex'))" -
部署后打开
https://solvnote.n29.net/login(或你的实际域名),使用上面设置的邮箱与初始口令登录;进入/admin/ai配置模型,再用一道不含隐私的题目测试。
NEXTAUTH_URL必须与浏览器使用的协议、主机、端口一致,不填ScanDex地址、容器地址或/login路径。默认无需设置AI_CONFIG_MASTER_KEY,主钥会自动保存到/app/config/ai-master.key;不要设置AI_WORKER_DISABLED=1或照搬本机代理到Zeabur。
自托管:用Docker Compose启动本分支
新安装请准备Docker与Compose,在一个新目录中建立.env.solvnote,填入上面的环境变量。本地试用时把NEXTAUTH_URL改为http://localhost:3000,浏览器也固定用这个地址;公网使用需另外配置HTTPS反向代理。
在同目录新建compose.solvnote.yml,内容如下。仓库提供的docker-compose.yml已使用SolvNote镜像;也可以按下方示例另建配置。
services:
solvnote:
image: ghcr.io/yumumao/solvnote:latest
restart: unless-stopped
ports:
- "3000:3000"
env_file:
- .env.solvnote
environment:
DATABASE_URL: file:/app/data/dev.db
volumes:
- ./config:/app/config
- ./data:/app/data在该目录执行:
docker compose -f compose.solvnote.yml pull
docker compose -f compose.solvnote.yml up -d
docker compose -f compose.solvnote.yml logs --tail=100打开http://localhost:3000/login登录。.env.solvnote、config、data都是私有部署文件,请自行安全备份,不要上传公共仓库。
- 先停止应用写入,配对备份
/app/config和/app/data,记录旧镜像摘要与环境变量;只备份数据库不足以恢复加密内容。 - 在镜像发布记录确认目标版本已发布,再让平台拉取新镜像重新部署。**沿用原卷、原数据库路径、原秘密变量,不重建数据库或更换主钥。**只更新README不需要换镜像。
- 启动时会自动迁移;已有管理员不会被初始化变量重置。升级后从正式地址登录,检查AI设置、图文解题和任务取回。
回滚时先停应用,再恢复旧镜像+两个卷的配对备份+原环境变量,不要让旧代码继续写入已升级的数据。详细排障见部署与构建说明。
| 问题 | 先这样处理 |
|---|---|
导入提示IMPORT_ORIGIN_REJECTED |
检查错题本/admin/ai中的站点地址诊断,让NEXTAUTH_URL匹配浏览器地址;重新部署并重新登录。ScanDex可以是另一地址,重输文件口令不能修复同源问题。 |
| 启动提示管理员初始化失败 | 看该提示之前的第一条错误。新库需至少12字符的初始口令;旧站先检查/app/data挂载与数据库路径,不删卷、不盲目重置账号。 |
模型立即报AI_ENDPOINT_REJECTED |
云端只接受公共HTTPS接口,检查地址及DNS。不要把本机代理/内网地址当作云端AI地址,也不要关闭安全校验。 |
| 分析很久,或提示受理状态未知 | 先到我的AI任务查看阶段与错误;unknown不会自动重发,以免重复计费。先核对供应商记录,别连续提交。识图+解题+必要补读不等于一次普通聊天,不能保证更快。 |
| 辅助线没显示或离开后找不到 | 24小时内到我的AI任务取回短任务,在弹窗内查看;显示问题不要直接重新生成。SVG是重建示意图,不是原图像素叠线,复杂阴影仍以原图为准。 |
| 想备份或迁移AI设置 | 管理员先保存配置,再导出加密文件;导入时先预览再确认。独立口令至少12字符,文件与口令分开保管。文件包含供应商凭据,不包含题目、账户或部署设置。 |
技术栈为Next.js、React、TypeScript、Prisma和SQLite;后台任务依赖持续运行的Node进程,不适用于纯无服务器函数或跨主机共享SQLite多副本。部署主线为main,本仓库暂不提供桌面安装器。
感谢上游:wttwins/wrong-notebook及原作者、贡献者。本仓库是继续开发版本,本文新增特性不代表上游也有。上游README曾声明MIT,但本次核对的上游与当前快照未发现独立LICENSE文件;本分支不擅自新增许可证或作再授权承诺,再分发或商用前请核实上游许可。


