本 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": "请求参数缺失:[参数名]"
}
接口地址: POST /v1/solve-question/
接口用途: 智能解答单道题目,支持图片识别和文本分析,返回结构化解析。
鉴权: 根据配置决定
| 参数名 | 类型 | 是否必填 | 说明 | 示例 |
|---|---|---|---|---|
| question | File | 否 | 题目图片文件,与 url 二选一 |
question.jpg |
| url | String | 否 | 题目图片地址,需保证可访问 | https://example.com/question.jpg |
| subject | String | 是 | 科目名称 | 数学 |
| grade | String | 是 | 年级信息 | 三年级 |
| mode | String | 否 | 求解模式,可选 speed、accuracy、auto,默认 speed |
accuracy |
{
"success": true,
"message": "解题完成",
"data": {
"analysis": "先将方程两侧同时乘以 2,化简后得到 ..."
}
}
| 字段名 | 类型 | 描述 |
|---|---|---|
| analysis | String | AI 生成的解题答案和详细解析 |
接口地址: 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 | 否 | 批改模式,可选 speed、accuracy、auto,默认 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 | 扩展字段,用于返回额外信息 |
接口地址: 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 | 否 | 批改模式,可选 speed、accuracy、auto,默认 auto |
speed |
{
"success": true,
"message": "作业批改完成",
"data": {
"corrections": "答案思路清晰,最终结论正确",
"score": 8,
"totalScore": 10,
"answer": "学生书写的答案文本"
}
}
| 字段名 | 类型 | 描述 |
|---|---|---|
| corrections | String | 批改结果与得分 |
| score | Integer | 学生得分 |
| totalScore | Integer | 题目总分 |
| answer | String | 学生的作答内容 |
接口地址: 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 | 否 | 批改模式,可选 speed、accuracy、auto,默认 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 | 答案是否正确 |
接口地址: 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 | 试题题目内容(不含题号、来源、分数) |
接口地址: 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 | 否 | 批改模式,可选 speed、accuracy、auto,默认 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 | 扩展字段 |
接口地址: 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服务处理异常 |
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 -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"
success=false 时会在 message 字段提供可读的错误信息1001,多个值用逗号分隔如 1001,1002,1003