数学错题本

{{ bannerText(runningTaskBanner) }} ({{ runningTaskBanner.ok_count + runningTaskBanner.failed_count }}/{{ runningTaskBanner.total }}) 查看进度 →
本次已入库 {{ sessionSavedCount }} 道
  1. 1选图
  2. 2确认图片
  3. 3框题入库

录入错题

拍照或导入试卷,接下来手动框题、由 AI 读题干

截图已复制? 在页面任意处按 CtrlV 直接粘贴

{{ pdfError }}

PDF 逐页录入 第 {{ pdfActiveIndex + 1 }} / {{ pdfPages.length }} 页

{{ pdfSessionMsg }}

{{ p.page_index }} {{ p.done ? '已录入' : '待处理' }}

点缩略图切换页码,当前页会进入人工框题

图片横置或倒置的话,先转正再框题

{{ recognizeError }}

{{ frameModeHint }}
{{ i+1 }}
  • 画框图上任意处按住拖动(整题框内也可)
  • 移动整题框拖数字标签 · 题干 / 配图拖框身
  • 缩放拖右下角圆点

{{ frameMsg }}

↩ 调整 第 {{ adjustIndex + 1 }} 题 · 改完点「✓ 完成调整」
已框 {{ frameQuestions.length }} 道题
  • 题{{ i+1 }} ✓ 已入库 ✓ 完成 进行中 题干框 配图×{{ (q.figureBoxes || []).length }}

在左侧图片上按住拖动,框出第一道题的整题范围

每题自动按 整题→题干→配图 推进;点已完成的题可回改,全部完成后统一入库

已入库 {{ afterSaveCount }}

题干正在后台读取(AI 稍慢 / OCR 秒级),可先去处理别的;完成后到题库「待确认题干」核对并填写错误答案。

{{ bankStats.total }}全部题目
{{ bankStats.review }}待确认
{{ bankStats.unmastered }}未掌握
{{ bankStats.noanswer }}待补答案
{{ bankStats.derived }}衍生题
{{ bankStats.model }}模型题

加载中…

  • {{ q.display_no || ('#' + q.id) }} {{ typeTagLabel(q.question_type, q.bank_kind) }} {{ masteryLabel(q.mastery_status) }} {{ statusLabel(q.process_status) }} 待补答案
    错题回顾 错答:{{ q.wrong_answer }} {{ q.error_reason }}
    题目剖析
    {{ k.name }} {{ k.role === 'prereq' ? '前置' : '核心' }}

    原理{{ k.principle }}

    易错{{ k.pitfalls }}

    解答思路
    1. {{ s }}
    {{ k }} +{{ kpChips(q).length - 2 }} {{ srcText(q) }} {{ shortDate(q.created_at) }}

{{ bankEmptyHint }}

第 {{ pageNo }} / {{ pageCount }} 页 · 共 {{ total }} 题
来自 模{{ genFromKp.map_no }} {{ genFromKp.name }} 按这个思维模型出题

{{ ctxError }}

正在载入出题方案与衍生题…

还没有出题记录,去「出题」页给原题或思维模型生成衍生题吧

  • {{ p.title }} {{ p.question_count }} 题 · {{ (p.updated_at||'').slice(0,10) }}

还没有考卷,点「+ 新建考卷」开始组卷

{{ paperTitle.trim() || '数学练习卷' }} {{ currentSavedPaper.question_count }} 题 · 更新于 {{ (currentSavedPaper.updated_at||'').slice(0,10) }} 未保存的草稿 有未保存的改动

正在载入考卷…

点击上方任意考卷,即可在这里预览它的试卷与答案

只读预览 · 点击列表中的其它考卷即可切换 · 需要修改点「打开编辑」

正在读取思维树…
{{ kmError }}
{{ kmOverlay.domain }} {{ kmOverlay.family }} {{ kmOverlay.model.name }}

{{ kmOverlay.model.name }}

{{ (kmOverlay.model.wrong_count || kmOverlay.model.generated_count) ? '已点亮' : '未走过' }}

{{ kmOverlay.model.def }}

锚点题
{{ e.kind === 'anchor' ? '正例' : '判别反例' }}
出处

{{ kmOverlay.model.origin === '照' ? '照抄原文' : (kmOverlay.model.origin === '改' ? '改编(改名 / 合并 / 调颗粒度)' : '自创(课标与教材均无)') }}

{{ detail.question.display_no || ('#' + detail.question.id) }} {{ detail.question.question_type === 'derived' ? (detail.question.bank_kind === 'model' ? '模型题' : '衍生题') : '练习题' }} {{ tierLabel(detail.question.derive_tier) }} {{ statusLabel(detail.question.process_status) }}
{{ masteryLabel(detail.question.mastery_status) }}
{{ detail.question.process_status === 'text_reading' ? '题干正在后台读取,稍等片刻…' : '题干已读取,请核对并填写错误答案' }}
图文对应待核对

AI 没把握把题干引用的图号与配图对上,请看图填写图上印刷的标签(如 图1 / ① / 甲)

{{ f.label }} {{ f.position }} 待核
错题回顾
孩子错答 {{ detail.question.wrong_answer }}
错因分析 {{ detail.question.error_reason }} {{ detail.question.error_type }}
题目剖析
考察 {{ analysisCoreText }}
{{ k.name }} {{ k.role === 'core' ? '核心' : '前置' }}

原理{{ k.principle }}

易错{{ k.pitfalls }}

{{ analyzing ? 'AI 正在剖析这道题…' : '还没有剖析,点「生成剖析」让 AI 拆解这道题考什么' }}

{{ analysisError }}

解答
答案 待补答案
  1. {{ s }}
题目信息
知识点 未打标签
来源 {{ srcText(detail.question) || '未填写' }}
掌握状态
录入时间 {{ detail.question.created_at }}
练习记录
  • {{ row.paper_title }} {{ row.result === 'correct' ? '✓ 对' : (row.result === 'wrong' ? '✗ 错' : '未判') }} {{ row.date }} {{ row.note }}

这道题还没出进任何试卷,出卷后即可记录练习

{{ busyAiMsg }}

编辑题目信息
编辑标签
{{ suggestKpError }}
{{ manualKpError }}
暂无可选思维族,无法新建模型(模型必须有归属,否则不会出现在知识地图)。

AI 识别配置

我的账号

{{ isAdmin ? '管理员' : '普通账号' }}
{{ myDisplayName }} @{{ me.username }}

密钥、题库、AI 用量都只属于你自己,换账号登录互不影响。

修改密码

{{ pwdMsg }}

改完密码,其它设备上的登录会失效,需要重新登录。

账号管理

{{ adminUsers.length }} 个账号

给别人开账号。你只能管账号本身(建号、停用、重置密码), 看不到别人的题库和用量 —— 每个人的数据互相隔离。

  • {{ u.display_name || u.username }} @{{ u.username }} 管理员 已停用 待改初始密码 最近登录:{{ fmtAcctTime(u.last_login_at) }}

{{ adminMsg }}

新建的账号用初始密码登录后,会被要求先改成自己的密码才能用。

多服务商并存

当前:{{ activeGroupLabel }}

可以同时保存多家服务商的密钥(DeepSeek、火山方舟、某个中转……),各家独立管理、互不混用。 同一时刻只有一个「当前服务商」,AI 功能用它家的密钥 + 它家的模型。点「设为当前」切换; 换走再换回,密钥和模型都还在,不用重新填。

  • {{ g.name || (g.provider && g.provider.name) || g.base_url }} 当前 {{ g.base_url }} {{ g.key_count ? '密钥 ' + g.enabled_count + ' / ' + g.key_count + ' 个生效' : '还没配密钥' }}

服务商与端点

{{ keyStatus.provider.name || '自定义' }}

{{ providerNote }}

下拉里没有的服务商,选「自定义(OpenAI 兼容)」把地址填进去即可 —— 任何 OpenAI 兼容的服务都能接。

① 密钥

{{ keyStatus.key_count ? '生效 ' + keyStatus.active_key_count + ' / ' + keyStatus.key_count + ' 个' : '未配置' }}

一个密钥都没有,录题、题目剖析、出题这些 AI 功能会直接报错。 点右上角的「+ 添加新密钥」标签,粘一个进来即可。

{{ keyStatus.key_count }} 个密钥全被停用了 —— AI 功能同样跑不起来。点最左边的开关启用至少一个。

有 {{ keyProblemCount }} 个密钥格式不对(最常见的是示例里的占位符没换成真 Key)—— 它们调不通 AI,建议删掉后重新粘贴。

  • {{ keyResultFor(k.index).ok ? '可用' : keyResultFor(k.index).message }} 余额 {{ keyResultFor(k.index).balance }} {{ k.problem }} {{ k.hint }} 未检测 不可删

其中 {{ envKeyCount }} 个来自系统环境变量(DEEPSEEK_API_KEY / WRONGBOOK_API_KEYS),这里不能删除、也不能停用。

下面这些密钥都发往当前服务商({{ activeGroupLabel }})那个端点。 换服务商请用上方「多服务商并存」里的「设为当前」—— 各家密钥独立,不会混在一起。

{{ checkSummary }}

粘一个新密钥进来。「添加」会先真实调一次接口确认能用,OK 了才写入配置 —— 不会偷偷把一个坏的存进去。加完自动切回「管理已有密钥」,能在列表里看到它。

只用于列表里显示,方便自己认。不填也行 —— 列表会回落成「服务商 · 模型名」。 同一个端点下有几把密钥时,强烈建议起个名字,否则几行长得一模一样。

这个密钥不可用({{ draftResult.message }}),没有保存。

格式各家不同(DeepSeek 形如 sk-…,智谱形如 id.secret, 中转 / 代理平台更随意),照原样粘贴即可,本软件不按前缀卡人。

批量添加多个密钥(每行一个,供并发轮询用)

② AI 模型

{{ keyStatus.vision_model || '未设置' }}

当前服务商配一个模型,所有 AI 功能都用它 —— 录题读题、AI 解题、错因分析、题目剖析、 AI 出题、阶段诊断报告。换服务商时(上方「设为当前」)会自动带出那家自己配的模型。 因为录题必须让它「看图」,所以它得是支持图像输入的型号 (候选列表里带 🖼 的那些)。「识图」是它的门槛,不是它的职责范围。

还没设模型 —— 所有 AI 功能都会报错。在下方「模型名称」里键入一个,点「应用」保存即可。

点「应用」立即保存。直接键入即可生效,不需要先拉列表 —— 服务商没开放 /models 时,跳过下面的候选列表照样能填。

候选列表(可选)—— 从当前端点拉一份清单来挑

候选列表是从服务商接口 /models 实时拉来的。点哪个模型就把它填到上面的「模型名称」里, 再点「应用」保存。带 🖼 标记的是「疑似支持图像输入」,录题必须选这种。 服务商会下线旧模型,以拉到结果为准。

并发处理

同时 {{ concurrencyInput }} 道

批量录题时同时处理几道题。越大越快,也越容易撞接口限流,建议 3~5。

AI 用量统计(本机记录)

共 {{ usageStats.total.calls }} 次调用(失败 {{ usageStats.total.failed_calls }}) · 输入 {{ fmtTokens(usageStats.total.prompt_tokens) }} tokens · 输出 {{ fmtTokens(usageStats.total.completion_tokens) }} tokens · 缓存命中 {{ fmtTokens(usageStats.total.cached_tokens) }}

用途次数失败输入输出
{{ u.purpose }} {{ u.calls }} {{ u.failed_calls || '0' }} {{ fmtTokens(u.prompt_tokens) }} {{ fmtTokens(u.completion_tokens) }}
{{ keyMsg }} 改动即刻生效,无需手动保存

{{ paperTitle.trim() || '数学练习卷' }}

{{ todayStr() }} · 共 {{ paperQuestions.length }} 题

{{ paperHeader.name || '姓名' }}:________ {{ paperHeader.klass || '班级' }}:________ {{ paperHeader.score || '得分' }}:________
{{ i + 1 }}.

{{ paperTitle.trim() || '数学练习卷' }} · 参考答案

{{ i + 1 }}. {{ q.question.answer || '(未填)' }} {{ st }}

{{ toastMsg }}