AI Teacher 智能作业批改系统 API 文档

一、概述

本 API 文档描述了 AI Teacher 产品后台服务提供的智能作业批改接口,用于自动识别、批改学生作业并提供详细的分析结果。

版本: v1

总览

项目 说明
API 风格 RESTful API
数据格式 JSON
版本控制 URL Path Versioning (例如: /v1)
路径结构 /v1/ - 公开API接口(根据配置决定是否需要鉴权)
身份验证 JWT (JSON Web Token),token 中包含用户身份信息
传递方式 HTTP 请求 Header 中 Authorization 字段,值为 Bearer <token>
错误处理 统一响应格式,业务码前三位对应 HTTP 状态码

统一响应格式

{
  "success": true,
  "message": "操作成功",
  "data": {}
}
字段名 类型 描述
success Boolean 操作是否成功
message String 提示信息
data Object 响应数据(可选)

错误响应示例

{
  "success": false,
  "message": "请求参数缺失:[参数名]"
}

模块划分

  1. 题目解题模块 - 单道题目智能解题
  2. 作业批改模块 - 完整作业智能批改
  3. 课堂练习模块 - 课堂练习快速批改
  4. 页面评分模块 - 页面批量评分
  5. 结构化提取模块 - 题目结构化信息提取
  6. 整页作业批改模块 - 整页作业自动切题并批改
  7. 试卷切题模块 - 试卷题目位置提取

二、API 接口

1. 单题解题接口

接口地址: POST /v1/solve-question/

接口用途: 智能解答单道题目,支持图片识别和文本分析,返回结构化解析。

鉴权: 根据配置决定

请求参数

参数名 类型 是否必填 说明 示例
question File 题目图片文件,与 url 二选一 question.jpg
url String 题目图片地址,需保证可访问 https://example.com/question.jpg
subject String 科目名称 数学
grade String 年级信息 三年级
mode String 求解模式,可选 speedaccuracyauto,默认 speed accuracy

响应示例

{
  "success": true,
  "message": "解题完成",
  "data": {
    "analysis": "先将方程两侧同时乘以 2,化简后得到 ..."
  }
}

响应字段说明

字段名 类型 描述
analysis String AI 生成的解题答案和详细解析

2. 作业批改接口

接口地址: POST /v1/homework/

接口用途: 对学生提交的作业图片进行解析、批改与得分计算。

鉴权: 根据配置决定

请求参数

参数名 类型 是否必填 说明 示例
file File 作业图片文件,与 image_url 至少提供一个 homework.jpg
image_url String 作业图片的可访问 URL https://example.com/homework.jpg
subject String 科目名称 数学
grade String 年级名称 三年级
semester String 学期信息 上册
book_id String 教材编号,支持单个或逗号分隔的多个,默认 0 1001 或 1001,1002,1003
mode String 批改模式,可选 speedaccuracyauto,默认 auto accuracy

响应示例

{
  "success": true,
  "message": "作业批改完成",
  "data": {
    "type": "解答题",
    "question_text": "请计算 3x + 5 = 20 的解。",
    "answer": "x = 5",
    "analysis": "将等式移项得到 3x = 15,解得 x = 5。",
    "corrections": "答案正确,得分 10 / 10",
    "totalScore": 10,
    "score": 10,
    "points": [
      {"pointNo": ["MATH-EQ-001", "MATH-EQ-002"], "reason": ["掌握一次方程解法", "理解移项规则"]}
    ],
    "externals": {
      "boxes": []
    }
  }
}

响应字段说明

字段名 类型 描述
type String 题目类型(选择题、填空题、计算题、解答题等)
question_text String 题目内容描述,包含学生作答情况
answer String 学生的作答内容
analysis String AI 生成的解题过程及答案
corrections String 批改结果与得分
totalScore Integer 题目总分
score Integer 学生得分
points Array 知识点信息列表
points[].pointNo String/Array 知识点编号,单个为字符串,多个为数组
points[].reason String/Array 知识点匹配理由,单个为字符串,多个为数组
externals Object 扩展字段,用于返回额外信息

3. 课堂练习批改接口

接口地址: POST /v1/classwork/

接口用途: 结合题目与学生答案(图片或文字),给出课堂练习批改结果,适合课堂即时反馈场景。

鉴权: 根据配置决定

请求参数

参数名 类型 是否必填 说明 示例
subject String 科目名称 数学
grade String 年级信息 三年级
semester String 学期,默认空字符串 上册
book_id String 教材ID,支持单个或逗号分隔的多个,默认 0 1001 或 1001,1002,1003
question String 题目图片内容(base64 或 URL),需保证可解析 data:image/png;base64,...
answer String 学生作答图片内容(base64 或 URL) data:image/png;base64,...
answer_text String 学生作答文本(OCR 结果),若未提供 answer 建议提供该字段 解题过程:先化简...
totalScore Integer 题目的总分值,默认为 10 10
mode String 批改模式,可选 speedaccuracyauto,默认 auto speed

响应示例

{
  "success": true,
  "message": "作业批改完成",
  "data": {
    "corrections": "答案思路清晰,最终结论正确",
    "score": 8,
    "totalScore": 10,
    "answer": "学生书写的答案文本"
  }
}

响应字段说明

字段名 类型 描述
corrections String 批改结果与得分
score Integer 学生得分
totalScore Integer 题目总分
answer String 学生的作答内容

4. 页面批量评分接口

接口地址: POST /v1/page/grading/

接口用途: 批量评分多个页面,自动识别题目并批改。

鉴权: 根据配置决定

请求参数

参数名 类型 是否必填 说明 示例
files File[] 页面图片文件列表,与 urls 至少提供一个 page1.jpg, page2.jpg
urls String[] 图片URL地址列表,多个URL用逗号分隔 https://example.com/page1.jpg
subject String 科目,默认"通用" 数学
grade String 年级,默认"通用" 三年级
mode String 批改模式,可选 speedaccuracyauto,默认 auto accuracy

响应示例

{
  "success": true,
  "message": "页面批改完成",
  "data": {
    "questions": [
      {
        "question_id": "1",
        "question_type": "选择题",
        "question_content": "下列哪个是质数?\\n\\nA. 4\\nB. 6\\nC. 7\\nD. 9",
        "page_number": 1,
        "student_answer": "C",
        "detailed_feedback": "答案正确。质数是指只能被1和自身整除的大于1的自然数。7是质数。",
        "bbox": [100, 200, 300, 250],
        "is_empty": false,
        "is_correct": true
      }
    ]
  }
}

响应字段说明

字段名 类型 描述
questions Array 题目结果数组
questions[].question_id String 题目编号(如'1'、'2'、'三'等)
questions[].question_type String 题型分类(选择题/填空题/解答题等)
questions[].question_content String 题目内容(Markdown格式,公式使用Latex)
questions[].page_number Integer 答案在第几张图片中,1表示第一页
questions[].student_answer String 识别的学生答案内容
questions[].detailed_feedback String 详细反馈,包含优缺点分析
questions[].bbox Integer[] 手写作答区域边界框坐标 [x1, y1, x2, y2]
questions[].is_empty Boolean 是否为空白作答
questions[].is_correct Boolean 答案是否正确

5. 结构化提取接口

接口地址: POST /v1/page/structured/

接口用途: 提取题目的结构化信息,用于题库录入或题目分析。

鉴权: 根据配置决定

请求参数

参数名 类型 是否必填 说明 示例
file File 题目图片文件,与 image_url 至少提供一个 question.jpg
image_url String 图片URL地址 https://example.com/question.jpg

响应示例

{
  "success": true,
  "message": "结构化提取完成",
  "data": {
    "type": "选择题",
    "question_text": "下列哪个是质数?\n\nA. 4\nB. 6\nC. 7\nD. 9"
  }
}

响应字段说明

字段名 类型 描述
type String 题目类型
question_text String 试题题目内容(不含题号、来源、分数)

6. 整页作业批改接口

接口地址: POST /v1/page/homework/

接口用途: 对整页作业图片进行自动切题并批改,支持多页图片。

鉴权: 根据配置决定

请求参数

参数名 类型 是否必填 说明 示例
files File[] 页面图片文件列表,与 urls 至少提供一个 page1.jpg, page2.jpg
urls String[] 图片URL地址列表,多个URL用逗号分隔 https://example.com/page1.jpg
subject String 科目,默认"通用" 数学
grade String 年级,默认"通用" 三年级
mode String 批改模式,可选 speedaccuracyauto,默认 auto accuracy

响应示例

{
  "success": true,
  "message": "页面评分完成",
  "data": {
    "results": [
      {
        "type": "选择题",
        "question_text": "下列哪个是质数?\\n\\nA. 4\\nB. 6\\nC. 7\\nD. 9",
        "answer": "C",
        "analysis": "质数是指只能被1和自身整除的大于1的自然数。7是质数。",
        "corrections": "答案正确",
        "totalScore": 5,
        "score": 5,
        "points": [],
        "externals": {"boxes": []}
      }
    ]
  }
}

响应字段说明

字段名 类型 描述
results Array 批改结果数组,每个元素为一道题的批改结果
results[].type String 题目类型
results[].question_text String 题目内容描述
results[].answer String 学生的作答内容
results[].analysis String AI 生成的解题过程及答案
results[].corrections String 批改结果与得分
results[].totalScore Integer 题目总分
results[].score Integer 学生得分
results[].points Array 知识点信息列表
results[].externals Object 扩展字段

注意事项


7. 试卷切题接口

接口地址: POST /v1/page/split/

接口用途: 从多页试卷图片中提取题目位置信息,不包含批改功能。

鉴权: 根据配置决定

请求参数

参数名 类型 是否必填 说明 示例
files File[] 页面图片文件列表,与 urls 至少提供一个 page1.jpg, page2.jpg
urls String[] 图片URL地址列表,多个URL用逗号分隔 https://example.com/page1.jpg

响应示例

{
  "success": true,
  "message": "试卷切题完成",
  "data": {
    "questions": [
      {
        "question_id": "1",
        "image_bbox": [
          {
            "page": 1,
            "position": "left",
            "location": [100, 200, 300, 400]
          },
          {
            "page": 1,
            "position": "right",
            "location": [500, 200, 700, 350]
          }
        ]
      },
      {
        "question_id": "2",
        "image_bbox": [
          {
            "page": 1,
            "position": "left",
            "location": [100, 450, 300, 650]
          }
        ]
      }
    ]
  }
}

响应字段说明

字段名 类型 描述
questions Array 题目位置信息数组
questions[].question_id String 题目编号(从1开始)
questions[].image_bbox Array 题目关联的图片边界框列表
questions[].image_bbox[].page Integer 页码(从1开始)
questions[].image_bbox[].position String 位置,"left" 或 "right"
questions[].image_bbox[].location Integer[] 边界框坐标 (x1, y1, x2, y2)

注意事项


三、错误码说明

错误码 HTTP状态码 描述
400000 400 请求参数错误
400001 400 必需参数缺失
500000 500 服务器内部错误
500001 500 AI服务处理异常

四、使用示例

Python 调用示例

import requests

# /v1/homework/ 批改示例
homework_url = "http://localhost:8080/v1/homework/"
with open("homework.jpg", "rb") as fp:
    files = {"file": ("homework.jpg", fp, "image/jpeg")}
    data = {
        "subject": "数学",
        "grade": "三年级",
        "semester": "上册",
        "book_id": "1001",
        "mode": "accuracy",
    }
    response = requests.post(homework_url, files=files, data=data, timeout=30)
    response.raise_for_status()
    payload = response.json()
    if payload.get("success"):
        print("批改得分:", payload["data"]["score"])
    else:
        raise RuntimeError(payload.get("error", "批改失败"))

# /v1/solve-question/ 求解示例
solve_url = "http://localhost:8080/v1/solve-question/"
solve_data = {
    "subject": "数学",
    "grade": "三年级",
    "mode": "speed",
    "url": "https://example.com/question.jpg",
}
solve_resp = requests.post(solve_url, data=solve_data, timeout=30)
solve_resp.raise_for_status()
print("题目解析:", solve_resp.json().get("data", {}).get("analysis"))

# /v1/classwork/ 课堂练习示例
classwork_url = "http://localhost:8080/v1/classwork/"
classwork_data = {
    "subject": "英语",
    "grade": "三年级",
    "question": "data:image/png;base64,...",
    "answer_text": "I am a student"
}
classwork_resp = requests.post(classwork_url, data=classwork_data, timeout=30)
print("课堂练习得分:", classwork_resp.json().get("data", {}).get("score"))

cURL 示例

# 单题解题
curl -X POST "http://localhost:8080/v1/solve-question/" \
  -F "url=https://example.com/question.jpg" \
  -F "subject=数学" \
  -F "grade=三年级" \
  -F "mode=speed"

# 作业批改
curl -X POST "http://localhost:8080/v1/homework/" \
  -F "file=@homework.jpg" \
  -F "subject=数学" \
  -F "grade=三年级" \
  -F "semester=上册" \
  -F "book_id=1001" \
  -F "mode=accuracy"

# 课堂练习
curl -X POST "http://localhost:8080/v1/classwork/" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "subject=英语&grade=三年级&question=data:image/jpeg;base64,...&answer_text=I am a student"

# 页面批量评分
curl -X POST "http://localhost:8080/v1/page/grading/" \
  -F "files=@page1.jpg" \
  -F "files=@page2.jpg" \
  -F "subject=数学" \
  -F "grade=三年级" \
  -F "mode=auto"

# 结构化提取
curl -X POST "http://localhost:8080/v1/page/structured/" \
  -F "file=@question.jpg"

# 整页作业批改
curl -X POST "http://localhost:8080/v1/page/homework/" \
  -F "files=@page1.jpg" \
  -F "files=@page2.jpg" \
  -F "subject=数学" \
  -F "grade=三年级" \
  -F "mode=auto"

# 试卷切题
curl -X POST "http://localhost:8080/v1/page/split/" \
  -F "files=@page1.jpg" \
  -F "files=@page2.jpg"

五、支持的科目与年级

支持的科目

支持的年级


六、注意事项

  1. 图片质量要求: 建议上传清晰图片,分辨率不低于 1024×768,文件大小控制在 10MB 以内
  2. 网络可达性: 使用 URL 方式时需确保图片链接可直接访问
  3. 超时设置: 建议调用端设置不低于 30 秒的请求超时
  4. 错误处理: 接口返回 success=false 时会在 message 字段提供可读的错误信息
  5. book_id 参数: 支持字符串格式,单个值如 1001,多个值用逗号分隔如 1001,1002,1003