跳转至

教材接口

教材接口提供基于 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_typeslength_config 控制模块与长度

请求示例

{
  "topic": "量子力学基础"
}

generation_config 说明

单教材创建接口和批量接口中的 items[].generation_config 使用同一套规则。下文“创建批量任务”部分提供了可直接复用的 generation_config 模板,包括禁用视频、自主探究、跨科融合、三阶测练等场景。

generation_config 常见配置

字段 类型 说明
allowed_types array 模块白名单。只会生成这里声明的模块;如果想禁用某个模块,直接不要写进去
length_config.mode string 长度模式,支持 shortmediumlongextra_longcustom

示例 1:禁用视频模块

如果你只是不想要视频模块,那么在 allowed_types 中不要传 VID 即可。

{
  "topic": "牛顿三定律",
  "generation_config": {
    "allowed_types": [
      { "type": "MD" },
      {
        "type": "IMG",
        "sub_types": ["PLOT", "MINDMAP", "ILLUSTRATION"]
      },
      { "type": "BOX" },
      { "type": "QUIZ" }
    ]
  }
}

示例 2:自主探究 / 自学内容

自主探究内容通常是“除视频外其他模块都保留”,并建议使用 mediumlong 长度。

{
  "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 个)。当处于 pendingplanninggenerating 状态的教材数达到上限时,将返回 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 秒轮询一次
  • 当教材 statuscompletedfailed 时停止轮询
  • 如需减少数据传输量,推荐使用增量更新接口

错误码

错误码 HTTP 状态码 说明
NotFound 404 教材不存在

获取增量更新

获取教材自指定版本以来的增量更新,仅返回有变化的 Block,减少数据传输量。

请求

地址GET https://api.upath.cn/api/curriculum/{id}/updates/

请求头

参数 必填 说明
X-API-Key API 密钥

查询参数

参数 类型 必填 说明
since_version integer 上次获取的版本号,默认 0

推荐使用方式

  1. 首次调用教材详情接口获取完整数据,记录 version
  2. 后续轮询使用增量更新接口,传入上次的 version
  3. 根据返回的 updated_blocks 局部更新前端数据
  4. 更新本地记录的 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 不存在

批量教材生成

批量生成接口适用于一次提交多条主题、异步生成多本教材,并由调用方将结果批量写入自有数据库的场景。

推荐调用流程

  1. 调用 POST /api/curriculum-batch/ 创建批量任务
  2. 轮询 GET /api/curriculum-batch/{id}/ 获取整体进度和每项摘要
  3. 调用 GET /api/curriculum-batch/{id}/results/ 分页拉取完整教材详情
  4. batch_indexcurriculum_id 将结果写入你的业务数据库
  5. 如果批量任务中有个别教材失败,可根据返回的 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 长度模式,支持 shortmediumlongextra_longcustom

关于禁用视频模块

generation_config 没有单独的“禁用列表”字段。如果你想禁用视频模块,只需要在 allowed_types 中不传 VID

常见业务模板

场景 推荐模块 推荐长度 说明
禁用视频模块 MD + IMG + BOX + QUIZ 按需 只是不生成视频,保留其他常规模块
自主探究 / 自学内容 MD + IMG + BOX + QUIZ mediumlong 本质上也是“无视频”,但更推荐中等或较长篇幅
跨科融合 / 阅读内容 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_atupdated_atcompleted_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 会有值,且 statusfailed
  • 你可以直接拿这个 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
  • 当任务详情中 statuscompletedfailed 时,可停止轮询任务详情
  • 对于 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:纯文本,直接渲染 Markdown
  • url:媒体文件 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 个教材
  • 处于 pendingplanninggenerating 状态的教材计入并发数
  • 超过限制时创建接口返回 HTTP 429

自动重试

  • Block 生成失败时系统会自动重试,最多 2 次
  • 重试采用指数退避策略(10 秒、20 秒)
  • 重试耗尽后 Block 标记为 failed,不影响其他 Block 生成
  • 失败的 Block 可通过重新生成接口手动重试