梁山泊轻量级习题批改后台

左侧上传单张作业图并选择年级、科目、城市后开始批改,右侧显示豆包 API 返回的结构化批改结果。

上传作业

等待上传图片或输入 taskId。
处理进度
0%
等待上传图片或输入 taskId 并开始批改。
批量实验室 compare-lab
打开批量 / 模型对比实验室
服务状态 检查中
正在读取服务运行状态。
Qwen 结构化识别 Doubao API 视觉区域路由

批改结果

服务端会轮询任务状态,完成后展示汇总、逐题反馈和原始返回数据。

尚未开始
总题数-
正确-
错误-
需复核-
默认显示全部对错,可切换到只看错题或只看原图,便于和右侧结构化结果联动查看。
批改完成后,这里显示处理后的图片结果。
上传并开始批改后,这里展示逐题结果。
{}
这里展示当前结构化链路的预处理与解析结果。Qwen 链路会展示题干和学生作答;有定位框时可在左侧高亮。
结构化处理完成后,这里显示预处理后的文档视图。
等待结构化解析。
结构化处理完成后,这里展示文本和题块列表。
结构化处理完成后,这里显示 Markdown 或 Qwen 文本说明。
{}
这里汇总本次批改识别出的错题题干、错题类型、知识点和正确答案,便于后续整理错题集。
有错题时,这里会展示错题题干、错因类型、知识点和正确答案。
处理队列
这里查看当前并发处理中的任务、等待队列中的任务,以及本机并发上限。
未加载
最大并发-
处理中-
队列等待-
更新时间-
处理中任务
当前已经拿到执行槽位、正在跑 Qwen 结构化识别或豆包批改的任务。
暂无处理中任务。
等待队列
当前排队等待执行槽位的任务。
当前没有排队任务。
最近批改记录
这里展示最近完成或失败的 lab / OpenAPI 批改任务,并显示各阶段耗时、Token 和批改成本。
还没有最近批改记录。
这里查看对外开放的作业批改接口、查询接口、回调格式和签名说明。
开放接口说明
本机当前默认通过 `https://pigai.cpolar.cn` 对外提供服务。
OpenAPI v1

提交批改

POST https://pigai.cpolar.cn/api/v1/homework/correct

请求头:

  • Content-Type: multipart/form-data
  • Authorization: Bearer <token>(当服务端配置了 OPENAPI_AUTH_TOKEN 时必填)

表单参数:

  • image:选填,作业图片文件,支持 jpg/png/jpeg/webp
  • image_url:选填,网络图片地址,支持 http/https;未传 image 时可直接使用
  • callback_url:必填,批改完成后的回调地址
  • grade_level:选填,默认 primary_4
  • subject:选填,默认 math,可选 math/chinese/english
  • city:选填,例如 上海 / 江苏
  • ocr_mode:选填,默认 api,可选 api/local
  • assignment_id:选填,业务作业单号
curl -X POST "https://pigai.cpolar.cn/api/v1/homework/correct" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -F "image=@/path/to/homework.jpg" \
  -F "callback_url=https://your-domain.com/api/homework/callback" \
  -F "grade_level=primary_5" \
  -F "subject=math" \
  -F "city=上海" \
  -F "ocr_mode=api" \
  -F "assignment_id=homework_20260327_001"
curl -X POST "https://pigai.cpolar.cn/api/v1/homework/correct" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -F "image_url=https://your-domain.com/homework.jpg" \
  -F "callback_url=https://your-domain.com/api/homework/callback" \
  -F "grade_level=primary_5" \
  -F "subject=math" \
  -F "city=上海" \
  -F "ocr_mode=api"

提交响应

{
  "code": 200,
  "msg": "任务提交成功",
  "data": {
    "task_id": "8f3e2d1c-7b6a-4e5f-9d8c-76543210abcd",
    "ocr_mode": "api"
  }
}

任务查询

GET https://pigai.cpolar.cn/api/v1/homework/tasks/:taskId

{
  "code": 200,
  "msg": "查询成功",
  "data": {
    "task_id": "8f3e2d1c-7b6a-4e5f-9d8c-76543210abcd",
    "task_status": "finished",
    "result_status": 1,
    "ocr_mode": "api",
    "ocr_mode_actual": "api",
    "callback_status": "success",
    "callback_attempts": 1,
    "callback_last_error": "",
    "received_at": "2026-03-27T10:00:00.000Z",
    "started_at": "2026-03-27T10:00:02.000Z",
    "completed_at": "2026-03-27T10:01:30.000Z",
    "result": {
      "score": 95,
      "correct_detail": "共20题,正确18题,错误2题,需复核0题",
      "result_image_url": "https://pigai.cpolar.cn/results/8f3e2d1c-7b6a-4e5f-9d8c-76543210abcd.png",
      "wrong_questions": [
        {
          "question_id": "3.1",
          "question_image_url": "https://pigai.cpolar.cn/results/8f3e2d1c-7b6a-4e5f-9d8c-76543210abcd-wrong-1.png"
        }
      ]
    }
  }
}

回调说明

批改完成后,服务端会向 callback_url 发起 POST

  • Content-Type: multipart/form-data
  • 回调 body 是表单字段,不是 JSON body
  • 会附带 X-OpenClaw-TimestampX-OpenClaw-Signature
  • 回调失败时,默认最多重试 3 次(含首次请求)

表单字段如下:

task_id=8f3e2d1c-7b6a-4e5f-9d8c-76543210abcd
status=1
result={"score":95,"correct_detail":"共20题,正确18题,错误2题,需复核0题","correct_time":"2026-03-27 18:01:30","result_image_url":"https://pigai.cpolar.cn/results/8f3e2d1c-7b6a-4e5f-9d8c-76543210abcd.png","wrong_questions":[{"question_id":"3.1","question_image_url":"https://pigai.cpolar.cn/results/8f3e2d1c-7b6a-4e5f-9d8c-76543210abcd-wrong-1.png"}]}
Content-Type: multipart/form-data; boundary=----OpenClawBoundary
X-OpenClaw-Timestamp: 1743056400000
X-OpenClaw-Signature: <sha256-signature>

说明:传统服务端渲染链路会通过 result_image_url 返回整张批改结果图;Qwen+豆包链路使用 result_image_render_mode=frontend_overlay,由前端根据 m 打标点渲染勾叉。

接收方应返回:

{
  "code": 200,
  "msg": "回调接收成功",
  "data": null
}

回调签名

  • X-OpenClaw-Timestamp:毫秒时间戳
  • X-OpenClaw-Signature:HMAC-SHA256 签名
  • 签名规则:hex(hmac_sha256(secret, timestamp + "." + body))
  • 这里的 body 指服务端用于构造回调内容的标准 JSON 字符串

回调重试

  • 默认最大回调次数:3 次(含首次请求)
  • 查询接口可通过 callback_attempts 查看当前已尝试次数

并发说明

当前服务带本机队列控制,默认最大并发为 2,超出后自动排队。

Qwen 结构化抽取提示词
这里直接维护 Qwen 看图抽题时使用的 Prompt。保存后,新的任务会按最新内容抽取题干、学生作答、题型和图形文字描述。
未加载
标准 Qwen Prompt
普通 Qwen 图片结构化抽取链路使用。
已锁定
总提示词与变量
总提示词是豆包基础批改 Prompt 的入口。只有点击“编辑”后,当前框才会解锁。链路只保留总提示词、单年级覆盖和题型规则。
未加载
最近一次实际发送给豆包
这里展示最近一次任务真正发给豆包的文本、题型路由和是否附带图片。图片本体不在这里展开,只显示是否触发带图分支。
还没有可展示的实际请求 Prompt。先跑一张卷子,再回到这里查看。
题型路由规则
这里展示并编辑 Qwen 题型命中后追加给豆包的提示词;不再配置本地匹配规则。
未加载
正在加载题型路由规则。
单年级稀疏覆盖
这里只放无法被学段层覆盖的少量例外。命中题型后,精简基础批改 Prompt 只会保留总提示词和这一层。
工作日报
上方手动记录今天完成的优化,下方按瀑布流展示历史日报。
未加载

还没有日报记录。

批改日志

记录每次批改的时间、Agent、模型、耗时和 token 消耗。

暂无批改日志。