教材接口¶
教材接口提供基于 AI 的全媒体教材生成能力,支持多种内容类型(文本、图片、视频、交互组件),采用异步生成架构,支持实时进度轮询。
认证方式
所有教材接口需要使用 API Key 认证,请在请求头中添加 X-API-Key。
接口列表¶
| 接口 | 方法 | 说明 |
|---|---|---|
| /api/curriculum/ | POST | 创建教材(异步生成) |
| /api/curriculum/ | GET | 获取教材列表 |
| /api/curriculum/{id}/ | GET | 获取教材详情(轮询接口) |
| /api/curriculum/{id}/updates/ | GET | 获取增量更新 |
| /api/curriculum/{id}/cancel/ | POST | 取消生成 |
| /api/curriculum/{id}/retry/ | POST | 重试整本教材生成 |
| /api/curriculum/{id}/blocks/{block_id}/regenerate/ | POST | 重新生成 Block |
| /api/curriculum-batch/ | POST | 创建批量教材生成任务 |
| /api/curriculum-batch/ | GET | 获取批量任务列表 |
| /api/curriculum-batch/{id}/ | GET | 获取批量任务详情 |
| /api/curriculum-batch/{id}/results/ | GET | 分页获取批量结果 |
创建教材¶
创建一个新的 AI 教材生成任务。系统将异步调用 AI 工作流生成教材大纲和内容块。
请求¶
地址:POST https://api.upath.cn/api/curriculum/
请求头:
| 参数 | 必填 | 说明 |
|---|---|---|
| X-API-Key | 是 | API 密钥 |
| Content-Type | 是 | application/json |
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| topic | string | 是 | 教材主题,2-500 字符 |
| generation_config | object | 否 | 生成配置,支持通过 allowed_types 和 length_config 控制模块与长度 |
请求示例:
{
"topic": "量子力学基础"
}
generation_config 说明
单教材创建接口和批量接口中的 items[].generation_config 使用同一套规则。下文“创建批量任务”部分提供了可直接复用的 generation_config 模板,包括禁用视频、自主探究、跨科融合、三阶测练等场景。
generation_config 常见配置¶
| 字段 | 类型 | 说明 |
|---|---|---|
| allowed_types | array | 模块白名单。只会生成这里声明的模块;如果想禁用某个模块,直接不要写进去 |
| length_config.mode | string | 长度模式,支持 short、medium、long、extra_long、custom |
示例 1:禁用视频模块¶
如果你只是不想要视频模块,那么在 allowed_types 中不要传 VID 即可。
{
"topic": "牛顿三定律",
"generation_config": {
"allowed_types": [
{ "type": "MD" },
{
"type": "IMG",
"sub_types": ["PLOT", "MINDMAP", "ILLUSTRATION"]
},
{ "type": "BOX" },
{ "type": "QUIZ" }
]
}
}
示例 2:自主探究 / 自学内容¶
自主探究内容通常是“除视频外其他模块都保留”,并建议使用 medium 或 long 长度。
{
"topic": "牛顿第一定律自主探究",
"generation_config": {
"allowed_types": [
{ "type": "MD" },
{
"type": "IMG",
"sub_types": ["PLOT", "MINDMAP", "ILLUSTRATION"]
},
{ "type": "BOX" },
{ "type": "QUIZ" }
],
"length_config": {
"mode": "medium"
}
}
}
示例 3:跨科融合 / 阅读内容¶
跨科融合内容通常只保留插图和交互组件两个模块。
{
"topic": "丝绸之路与几何图案的跨科融合阅读",
"generation_config": {
"allowed_types": [
{
"type": "IMG",
"sub_types": ["ILLUSTRATION"]
},
{ "type": "BOX" }
],
"length_config": {
"mode": "medium"
}
}
}
示例 4:三阶测练 / 纯测验题¶
这是一个特殊场景:allowed_types 中只有 QUIZ,即纯测验题模式。
{
"topic": "一次函数三阶测练",
"generation_config": {
"allowed_types": [
{ "type": "QUIZ" }
],
"length_config": {
"mode": "medium"
}
}
}
响应¶
成功响应(HTTP 201):
| 字段 | 类型 | 说明 |
|---|---|---|
| id | integer | 教材 ID |
| topic | string | 用户输入的主题 |
| title | string | AI 生成的标题(创建时为空) |
| difficulty | string | 难度等级(创建时为空) |
| difficulty_display | string | 难度中文显示 |
| estimated_time | string | 预计学习时长(创建时为空) |
| tags | array | 标签列表(创建时为空) |
| status | string | 状态,固定为 pending |
| status_display | string | 状态中文显示 |
| total_blocks | integer | Block 总数(创建时为 0) |
| completed_blocks | integer | 已完成 Block 数(创建时为 0) |
| progress | float | 完成百分比(创建时为 0) |
| version | integer | 版本号(创建时为 0) |
| blocks | array | Block 列表(创建时为空) |
| created_at | string | 创建时间 |
| updated_at | string | 更新时间 |
并发限制
每个客户同时生成中的教材数量有上限(默认 3 个)。当处于 pending、planning、generating 状态的教材数达到上限时,将返回 HTTP 429 错误。请等待现有教材生成完成后再创建新的教材。
错误码¶
| 错误码 | HTTP 状态码 | 说明 |
|---|---|---|
| InvalidParameter | 400 | topic 参数为空或超过 500 字符 |
| Unauthorized | 401 | API Key 无效 |
| TooManyRequests | 429 | 超过并发生成数限制 |
获取教材列表¶
获取当前客户的教材列表,支持筛选、搜索和排序。
请求¶
地址:GET https://api.upath.cn/api/curriculum/
请求头:
| 参数 | 必填 | 说明 |
|---|---|---|
| X-API-Key | 是 | API 密钥 |
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | string | 否 | 状态筛选(pending/planning/generating/completed/failed) |
| difficulty | string | 否 | 难度筛选(beginner/intermediate/advanced) |
| created_at__gte | datetime | 否 | 创建时间起始 |
| created_at__lte | datetime | 否 | 创建时间截止 |
| created_at__date | date | 否 | 创建日期精确匹配 |
| search | string | 否 | 搜索关键词(匹配 topic 和 title) |
| ordering | string | 否 | 排序字段,如 -created_at(默认按创建时间倒序) |
| page | integer | 否 | 页码,默认 1 |
| page_size | integer | 否 | 每页数量,默认 20 |
响应¶
成功响应(HTTP 200):
| 字段 | 类型 | 说明 |
|---|---|---|
| count | integer | 总记录数 |
| next | string | 下一页 URL |
| previous | string | 上一页 URL |
| results | array | 教材列表 |
results 中每个教材包含与创建接口相同的字段,但不包含 blocks 详情。
获取教材详情¶
获取教材的完整信息,包含所有 Block 内容。此接口可用于轮询教材生成进度。
请求¶
地址:GET https://api.upath.cn/api/curriculum/{id}/
请求头:
| 参数 | 必填 | 说明 |
|---|---|---|
| X-API-Key | 是 | API 密钥 |
响应¶
成功响应(HTTP 200):
返回教材完整信息,包含 blocks 数组。每个 Block 的字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | integer | Block ID |
| order | integer | 顺序(从 0 开始) |
| block_type | string | Block 类型(MD/IMG/VID/BOX/QUIZ) |
| block_type_display | string | 类型中文显示 |
| sub_type | string | 子类型 |
| sub_type_display | string | 子类型中文显示 |
| status | string | 状态(pending/processing/completed/failed) |
| status_display | string | 状态中文显示 |
| content | string | 章节文字内容 |
| media_content | string | 媒体内容(URL/Mermaid 代码/HTML) |
| media_desc | string | 媒体描述 |
| content_type | string | 内容类型(text/url/mermaid/html) |
| metadata | object | 元数据 |
| error_message | string | 错误信息 |
| created_at | string | 创建时间 |
| started_at | string | 开始生成时间 |
| completed_at | string | 完成时间 |
轮询建议
- 建议每 2-5 秒轮询一次
- 当教材
status为completed或failed时停止轮询 - 如需减少数据传输量,推荐使用增量更新接口
错误码¶
| 错误码 | HTTP 状态码 | 说明 |
|---|---|---|
| NotFound | 404 | 教材不存在 |
获取增量更新¶
获取教材自指定版本以来的增量更新,仅返回有变化的 Block,减少数据传输量。
请求¶
地址:GET https://api.upath.cn/api/curriculum/{id}/updates/
请求头:
| 参数 | 必填 | 说明 |
|---|---|---|
| X-API-Key | 是 | API 密钥 |
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| since_version | integer | 否 | 上次获取的版本号,默认 0 |
推荐使用方式
- 首次调用教材详情接口获取完整数据,记录
version值 - 后续轮询使用增量更新接口,传入上次的
version - 根据返回的
updated_blocks局部更新前端数据 - 更新本地记录的
version值
响应¶
成功响应(HTTP 200):
| 字段 | 类型 | 说明 |
|---|---|---|
| version | integer | 当前版本号 |
| status | string | 教材状态 |
| status_display | string | 状态中文显示 |
| completed_blocks | integer | 已完成 Block 数 |
| updated_blocks | array | 有更新的 Block 列表 |
当 since_version 等于当前版本时,updated_blocks 为空数组。
错误码¶
| 错误码 | HTTP 状态码 | 说明 |
|---|---|---|
| NotFound | 404 | 教材不存在 |
取消生成¶
取消正在生成中的教材。已完成或已失败的教材无法取消。
请求¶
地址:POST https://api.upath.cn/api/curriculum/{id}/cancel/
请求头:
| 参数 | 必填 | 说明 |
|---|---|---|
| X-API-Key | 是 | API 密钥 |
请求体:无
响应¶
成功响应(HTTP 200):
| 字段 | 类型 | 说明 |
|---|---|---|
| id | integer | 教材 ID |
| status | string | 状态,固定为 failed |
| message | string | 固定为 已取消生成 |
错误码¶
| 错误码 | HTTP 状态码 | 说明 |
|---|---|---|
| InvalidOperation | 400 | 教材已完成或已失败,无法取消 |
| NotFound | 404 | 教材不存在 |
重试教材¶
当整本教材生成失败时,可以通过该接口按教材 ID 重新发起一次完整生成。该接口会清空当前教材下已生成的所有 Block,并重新从大纲规划开始执行。
请求¶
地址:POST https://api.upath.cn/api/curriculum/{id}/retry/
请求头:
| 参数 | 必填 | 说明 |
|---|---|---|
| X-API-Key | 是 | API 密钥 |
请求体:无
响应¶
成功响应(HTTP 200):
| 字段 | 类型 | 说明 |
|---|---|---|
| id | integer | 教材 ID |
| status | string | 状态,固定为 pending |
| message | string | 固定为 已重新开始生成 |
响应示例:
{
"id": 101,
"status": "pending",
"message": "已重新开始生成"
}
错误码¶
| 错误码 | HTTP 状态码 | 说明 |
|---|---|---|
| InvalidOperation | 400 | 只有失败的教材才能重试 |
| INSUFFICIENT_BALANCE | 400 | 余额不足,无法重试 |
| NotFound | 404 | 教材不存在 |
重试行为说明
- 该接口是整本教材重试,不是局部补算
- 调用后会删除该教材当前已有的所有 Block,并重新生成
- 如果你只想重试某一个失败的媒体 Block,请使用 重新生成 Block
重新生成 Block¶
重新生成教材中的某个 Block。正在生成中的 Block 无法重新生成。
请求¶
地址:POST https://api.upath.cn/api/curriculum/{id}/blocks/{block_id}/regenerate/
请求头:
| 参数 | 必填 | 说明 |
|---|---|---|
| X-API-Key | 是 | API 密钥 |
请求体:无
响应¶
成功响应(HTTP 200):
| 字段 | 类型 | 说明 |
|---|---|---|
| id | integer | Block ID |
| status | string | 状态,固定为 pending |
| message | string | 固定为 已加入重新生成队列 |
错误码¶
| 错误码 | HTTP 状态码 | 说明 |
|---|---|---|
| InvalidOperation | 400 | Block 正在生成中,请稍后再试 |
| NotFound | 404 | Block 不存在 |
批量教材生成¶
批量生成接口适用于一次提交多条主题、异步生成多本教材,并由调用方将结果批量写入自有数据库的场景。
推荐调用流程
- 调用
POST /api/curriculum-batch/创建批量任务 - 轮询
GET /api/curriculum-batch/{id}/获取整体进度和每项摘要 - 调用
GET /api/curriculum-batch/{id}/results/分页拉取完整教材详情 - 按
batch_index或curriculum_id将结果写入你的业务数据库 - 如果批量任务中有个别教材失败,可根据返回的
curriculum_id调用 重试教材 接口单独重试
创建批量任务¶
创建一个批量教材异步任务。创建成功后,系统会按客户允许的最大并发数自动分发生成,不需要调用方额外指定并发参数。
地址:POST https://api.upath.cn/api/curriculum-batch/
请求头:
| 参数 | 必填 | 说明 |
|---|---|---|
| X-API-Key | 是 | API 密钥 |
| Content-Type | 是 | application/json |
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| items | array | 是 | 批量生成列表,单次最多 50 项 |
| items[].topic | string | 是 | 教材主题,2-500 字符 |
| items[].generation_config | object | 否 | 单项生成配置,规则与单教材创建接口一致 |
请求示例:
{
"items": [
{
"topic": "牛顿三定律"
},
{
"topic": "电磁感应",
"generation_config": {
"length_config": {
"mode": "short"
}
}
}
]
}
generation_config 字段说明¶
| 字段 | 类型 | 说明 |
|---|---|---|
| allowed_types | array | 可选的模块白名单。只会生成这里声明的模块;如果想禁用某个模块,直接不要写进去 |
| length_config.mode | string | 长度模式,支持 short、medium、long、extra_long、custom |
关于禁用视频模块
generation_config 没有单独的“禁用列表”字段。如果你想禁用视频模块,只需要在 allowed_types 中不传 VID。
常见业务模板¶
| 场景 | 推荐模块 | 推荐长度 | 说明 |
|---|---|---|---|
| 禁用视频模块 | MD + IMG + BOX + QUIZ |
按需 | 只是不生成视频,保留其他常规模块 |
| 自主探究 / 自学内容 | MD + IMG + BOX + QUIZ |
medium 或 long |
本质上也是“无视频”,但更推荐中等或较长篇幅 |
| 跨科融合 / 阅读内容 | IMG(ILLUSTRATION) + BOX |
medium |
只保留插图与交互组件,适合阅读型内容 |
| 三阶测练 / 习题 | QUIZ |
medium |
纯测验题模式,属于特殊配置 |
示例 1:通用禁用视频模块¶
{
"generation_config": {
"allowed_types": [
{ "type": "MD" },
{
"type": "IMG",
"sub_types": ["PLOT", "MINDMAP", "ILLUSTRATION"]
},
{ "type": "BOX" },
{ "type": "QUIZ" }
]
}
}
示例 2:自主探究 / 自学内容¶
推荐使用中等或较长长度。下面示例使用 medium;如果希望内容更完整,可以改成 long。
{
"generation_config": {
"allowed_types": [
{ "type": "MD" },
{
"type": "IMG",
"sub_types": ["PLOT", "MINDMAP", "ILLUSTRATION"]
},
{ "type": "BOX" },
{ "type": "QUIZ" }
],
"length_config": {
"mode": "medium"
}
}
}
示例 3:跨科融合 / 阅读内容¶
该模式只保留插图和交互组件两个模块。
{
"generation_config": {
"allowed_types": [
{
"type": "IMG",
"sub_types": ["ILLUSTRATION"]
},
{ "type": "BOX" }
],
"length_config": {
"mode": "medium"
}
}
}
示例 4:三阶测练 / 纯测验题¶
这是一个比较特殊的场景:allowed_types 中只有 QUIZ,最终会生成纯测验题内容。
{
"generation_config": {
"allowed_types": [
{ "type": "QUIZ" }
],
"length_config": {
"mode": "medium"
}
}
}
批量任务业务示例¶
下面的批量请求示例同时演示了“自主探究”“跨科融合”“三阶测练”三种常见业务类型:
{
"items": [
{
"topic": "牛顿第一定律自主探究",
"generation_config": {
"allowed_types": [
{ "type": "MD" },
{
"type": "IMG",
"sub_types": ["PLOT", "MINDMAP", "ILLUSTRATION"]
},
{ "type": "BOX" },
{ "type": "QUIZ" }
],
"length_config": {
"mode": "medium"
}
}
},
{
"topic": "丝绸之路与几何图案的跨科融合阅读",
"generation_config": {
"allowed_types": [
{
"type": "IMG",
"sub_types": ["ILLUSTRATION"]
},
{ "type": "BOX" }
],
"length_config": {
"mode": "medium"
}
}
},
{
"topic": "一次函数三阶测练",
"generation_config": {
"allowed_types": [
{ "type": "QUIZ" }
],
"length_config": {
"mode": "medium"
}
}
}
]
}
成功响应(HTTP 201):
{
"id": 12,
"status": "pending",
"status_display": "待处理",
"total_count": 2,
"created_count": 0,
"current_index": 0,
"completed_count": 0,
"failed_count": 0,
"processing_count": 0,
"pending_count": 2,
"error_message": "",
"results_endpoint": "https://api.upath.cn/api/curriculum-batch/12/results/",
"items": [
{
"index": 0,
"topic": "牛顿三定律",
"curriculum_id": null,
"status": "pending_dispatch",
"status_display": "待投递",
"title": "",
"progress": 0,
"error_message": ""
},
{
"index": 1,
"topic": "电磁感应",
"curriculum_id": null,
"status": "pending_dispatch",
"status_display": "待投递",
"title": "",
"progress": 0,
"error_message": ""
}
],
"created_at": "2026-04-15 15:30:00",
"updated_at": "2026-04-15 15:30:00",
"completed_at": null
}
默认调度策略
批量接口不会暴露调度参数。系统默认采用高并发分发策略,实际并发度由客户配置的最大并发教材数决定。
获取批量任务列表¶
获取当前客户名下的批量任务列表。
地址:GET https://api.upath.cn/api/curriculum-batch/
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | string | 否 | 状态筛选(pending/processing/paused/completed/failed) |
| created_at__gte | datetime | 否 | 创建时间起始 |
| created_at__lte | datetime | 否 | 创建时间截止 |
| created_at__date | date | 否 | 创建日期精确匹配 |
| ordering | string | 否 | 排序字段,支持 created_at、updated_at、completed_at |
| page | integer | 否 | 页码,默认 1 |
| page_size | integer | 否 | 每页数量,默认 20 |
成功响应(HTTP 200):
返回分页结构,results 中每项字段与创建接口响应一致,但不包含完整教材内容。
获取批量任务详情¶
获取批量任务的整体进度,以及每个输入项当前对应的教材摘要。
地址:GET https://api.upath.cn/api/curriculum-batch/{id}/
成功响应(HTTP 200)主要字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | integer | 批量任务 ID |
| status | string | 批量任务状态 |
| total_count | integer | 输入总数 |
| created_count | integer | 已创建教材记录数 |
| current_index | integer | 当前已处理到的输入索引 |
| completed_count | integer | 已完成教材数 |
| failed_count | integer | 失败项数量 |
| processing_count | integer | 正在生成中的教材数 |
| pending_count | integer | 尚未投递的输入项数量 |
| results_endpoint | string | 结果分页接口地址 |
| items | array | 每项摘要列表,按输入顺序返回 |
items 中每项包含:
| 字段 | 类型 | 说明 |
|---|---|---|
| index | integer | 原始输入顺序,从 0 开始 |
| topic | string | 原始主题 |
| curriculum_id | integer/null | 已创建教材时返回教材 ID |
| status | string | 当前项状态 |
| status_display | string | 状态中文显示 |
| title | string | 已生成教材标题 |
| progress | float | 该教材当前进度百分比 |
| error_message | string | 当前项错误信息 |
status 可能的值:
| 状态 | 说明 |
|---|---|
pending_dispatch |
尚未创建教材记录,等待投递 |
pending / planning / generating |
已创建教材,正在处理 |
completed |
该项教材已完成 |
failed |
该项失败,可能是教材生成失败或创建教材记录失败 |
批量任务中的个别失败处理
批量任务运行过程中,可能出现“多数教材成功、少数教材失败”的情况。这种情况下:
- 批量任务详情中的
failed_count会大于 0 - 对于已经创建成功但生成失败的教材,
items[].curriculum_id会有值,且status为failed - 你可以直接拿这个
curriculum_id调用 重试教材 接口,对失败教材逐本重试 - 如果某一项在创建教材记录阶段就失败,没有生成
curriculum_id,则无法调用单本重试接口,只能结合任务详情里的error_message做业务侧补偿
分页获取批量结果¶
分页返回该批量任务下已经创建的教材完整详情,适合调用方按页写入自有数据库。
地址:GET https://api.upath.cn/api/curriculum-batch/{id}/results/
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | integer | 否 | 页码,默认 1 |
| page_size | integer | 否 | 每页数量,默认 20 |
成功响应(HTTP 200):
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"id": 101,
"curriculum_id": 101,
"batch_index": 0,
"source_topic": "牛顿三定律",
"topic": "牛顿三定律",
"generation_config": {},
"title": "牛顿三定律入门",
"difficulty": "beginner",
"difficulty_display": "入门",
"estimated_time": "15分钟",
"tags": ["物理", "力学"],
"status": "completed",
"status_display": "已完成",
"total_blocks": 4,
"completed_blocks": 4,
"progress": 100.0,
"version": 6,
"error_message": "",
"blocks": [
{
"id": 1001,
"order": 0,
"block_type": "MD",
"status": "completed",
"content": "内容示例"
}
],
"created_at": "2026-04-15 15:31:20",
"updated_at": "2026-04-15 15:32:10"
}
]
}
落库建议
- 使用
batch_index对应原始输入顺序 - 使用
curriculum_id作为平台侧唯一教材 ID - 当任务详情中
status为completed或failed时,可停止轮询任务详情 - 对于
results/接口,建议结合分页游标按页增量拉取并入库 - 若发现某本教材
status=failed,可直接使用该条结果里的curriculum_id调用 重试教材
批量任务状态¶
| 状态 | 说明 |
|---|---|
pending |
任务已创建,等待调度启动 |
processing |
任务正在分发或等待关联教材完成 |
paused |
任务已暂停,常见原因是余额不足 |
completed |
任务处理结束,可能包含成功和失败的混合结果 |
failed |
任务整体失败 |
批量接口错误码¶
| 错误码 | HTTP 状态码 | 说明 |
|---|---|---|
| InvalidParameter | 400 | items 为空、超过 50 项、或某项参数非法 |
| INSUFFICIENT_BALANCE | 400 | 账户余额不足,无法创建批量任务 |
| NotFound | 404 | 批量任务不存在 |
Block 类型说明¶
教材由多个 Block 组成,每个 Block 代表一个内容单元。
主类型¶
| block_type | 说明 | media_content 内容 |
|---|---|---|
| MD | Markdown 文本 | 无(内容在 content 字段) |
| IMG | 静态图像 | 图片 URL 或 Mermaid 代码 |
| VID | 数学动画 | 视频 URL |
| BOX | 交互沙盒 | HTML 代码 |
| QUIZ | 互动测验 | JSON(选项/答案/解析) |
IMG 子类型¶
IMG 类型的 Block 根据 sub_type 有不同的生成方式:
| sub_type | 说明 | media_content 格式 | content_type |
|---|---|---|---|
| PLOT | 数据绘图 | 图片 URL | url |
| MINDMAP | 思维导图 | Mermaid 代码 | mermaid |
| ILLUSTRATION | 叙事插画 | 图片 URL | url |
| DEFAULT | 默认图片 | 图片 URL | url |
content_type 字段
通过 Block 的 content_type 字段(位于 metadata 或顶层)判断 media_content 的渲染方式:
text:纯文本,直接渲染 Markdownurl:媒体文件 URL,使用<img>或<video>标签渲染mermaid:Mermaid 图表代码,使用 Mermaid.js 渲染html:HTML 代码,使用<iframe>沙盒渲染json:JSON 结构化数据(如 QUIZ 测验题)
QUIZ 数据格式¶
QUIZ 类型的 media_content 为 JSON 字符串,结构如下:
| 字段 | 类型 | 说明 |
|---|---|---|
| options | string[] | 选项列表(如 ["选项A", "选项B", "选项C"]) |
| correct_index | integer | 正确答案索引(从 0 开始) |
| explanation | string | 答案解析(支持 Markdown) |
示例:
{
"options": ["光合作用", "呼吸作用", "蒸腾作用"],
"correct_index": 0,
"explanation": "光合作用是植物利用光能将 $CO_2$ 和 $H_2O$ 转化为有机物的过程。"
}
QUIZ 生成方式
QUIZ 类型由 Planner 直接输出完整数据,不走 Dify 工作流,因此不支持重新生成。
状态流转¶
教材状态¶
stateDiagram-v2
[*] --> pending: 创建教材
pending --> planning: 开始规划
planning --> generating: 大纲生成完成
generating --> completed: 所有 Block 完成
generating --> failed: 生成失败
planning --> failed: 规划失败
pending --> failed: 用户取消
planning --> failed: 用户取消
generating --> failed: 用户取消
| 状态 | 说明 |
|---|---|
pending |
待处理,等待异步任务启动 |
planning |
规划中,AI 正在生成教材大纲 |
generating |
生成中,各 Block 正在并发生成 |
completed |
已完成,所有 Block 生成结束 |
failed |
失败,生成出错或用户取消 |
Block 状态¶
| 状态 | 说明 |
|---|---|
pending |
待处理,等待生成 |
processing |
处理中,AI 正在生成内容 |
completed |
已完成 |
failed |
失败(可通过重新生成接口重试) |
使用注意事项¶
轮询策略¶
推荐使用增量更新接口进行轮询:
| 阶段 | 建议间隔 | 说明 |
|---|---|---|
| planning | 2 秒 | 大纲生成通常较快 |
| generating | 3-5 秒 | Block 生成耗时较长 |
| completed/failed | 停止轮询 | 生成已结束 |
并发限制¶
- 每个客户默认最多同时生成 3 个教材
- 处于
pending、planning、generating状态的教材计入并发数 - 超过限制时创建接口返回 HTTP 429
自动重试¶
- Block 生成失败时系统会自动重试,最多 2 次
- 重试采用指数退避策略(10 秒、20 秒)
- 重试耗尽后 Block 标记为
failed,不影响其他 Block 生成 - 失败的 Block 可通过重新生成接口手动重试