ai-question-batch-generate
约 1249 字大约 4 分钟
2025-10-09
概述
batch-generate-questions 是一个基于 Deno 和 Supabase 的流式批量题目生成 API。它支持多种题型和难度的批量生成,并通过 Server-Sent Events (SSE) 实时返回生成进度和结果。
接口定义
BatchGenerateRequest 接口
批量生成请求的主体结构
interface BatchGenerateRequest {
knowledge_point_id: string; // 知识点ID
question_bank_id: string; // 题库ID
created_by: string; // 创建者标识
requests: BatchGenerationRule[]; // 生成规则数组
}BatchGenerationRule 接口
单条生成规则的详细定义
interface BatchGenerationRule {
type: 'single_choice' | 'multiple_choice' | 'true_false' | 'subjective';
difficulty: 'easy' | 'medium' | 'hard';
count: number; // 生成数量 (1-50)
}SingleGenerationTask 接口
单个生成任务的内部结构
interface SingleGenerationTask {
knowledge_point_id: string;
question_bank_id: string;
created_by: string;
type: string;
difficulty: string;
}核心函数详解
validateBatchGenerateRequest
功能: 验证批量生成请求的合法性
参数:
body: unknown- 待验证的请求体
返回值: BatchGenerateRequest - 验证通过的请求对象
验证规则:
- 必填字段检查:
knowledge_point_id,question_bank_id,created_by,requests - 请求数组非空检查
- 每条规则的字段完整性检查
- 题型有效性检查:
single_choice,multiple_choice,true_false,subjective - 难度有效性检查:
easy,medium,hard - 数量范围检查: 1-50之间的整数
抛出错误:
- 缺少必填字段时抛出详细错误信息
- 格式错误时提供具体的错误位置和原因
callAIQuestionGenerate
功能: 调用单个AI题目生成函数
参数:
supabase: any- Supabase 客户端实例task: SingleGenerationTask- 单个生成任务参数
返回值: Promise<any> - AI生成的结果
实现细节:
- 使用
supabase.functions.invoke调用ai-question-generate函数 - 处理调用错误并抛出详细错误信息
错误处理:
- 网络错误或函数调用失败时抛出
Error
chunkArray
功能: 将数组分块处理
参数:
array: T[]- 待分块的数组chunkSize: number- 每块的大小
返回值: T[][] - 分块后的二维数组
示例:
chunkArray([1,2,3,4,5], 2) // 返回 [[1,2], [3,4], [5]]streamBatchGenerateQuestions
功能: 流式批量生成题目的核心函数
参数:
supabase: any- Supabase 客户端实例knowledge_point_id: string- 知识点IDquestion_bank_id: string- 题库IDcreated_by: string- 创建者标识requests: BatchGenerationRule[]- 生成规则数组
返回值: Promise<Response> - SSE 流式响应
处理流程:
- 将请求规则展开为单个任务数组
- 按批次大小(10)分块处理
- 使用
Promise.allSettled并行处理每批任务 - 实时发送SSE事件报告进度
- 统计成功/失败数量并返回最终结果
SSE事件类型:
init: 初始化信息batch_start: 批次开始question_success: 单个题目生成成功question_error: 单个题目生成失败batch_complete: 批次完成complete: 全部完成
calculateTotalCount
功能: 计算总生成题目数量
参数:
requests: BatchGenerationRule[]- 生成规则数组
返回值: number - 总题目数量
主处理函数
Deno.serve
功能: 处理HTTP请求的主入口点
支持的HTTP方法: POST
处理流程:
- 处理CORS预检请求
- 验证请求方法
- 解析和验证请求体
- 检查批量生成数量限制(最大100道)
- 创建Supabase客户端
- 执行流式批量生成
使用示例
请求示例
curl -X POST https://your-domain.com/functions/v1/batch-generate-questions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_SUPABASE_TOKEN" \
-d '{
"knowledge_point_id": "kp-123",
"question_bank_id": "qb-456",
"created_by": "user-789",
"requests": [
{
"type": "single_choice",
"difficulty": "easy",
"count": 5
},
{
"type": "multiple_choice",
"difficulty": "medium",
"count": 3
}
]
}'响应示例 (SSE流)
event: init
data: {"totalTasks":8,"totalBatches":1,"batchSize":10,"message":"开始批量生成题目"}
event: batch_start
data: {"batchIndex":1,"totalBatches":1,"batchSize":8,"message":"开始处理第 1 批"}
event: question_success
data: {"questionIndex":1,"question":{...},"progress":{"processed":1,"total":8,"percentage":13}}
event: complete
data: {"finalResults":{"totalRequested":8,"successCount":7,"failureCount":1,"successRate":88},"message":"批量生成完成: 总计成功 7 道, 失败 1 道"}前端使用示例
// 前端处理SSE流的示例
const eventSource = new EventSource('/batch-generate-questions');
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('收到事件:', data);
};
eventSource.onerror = (error) => {
console.error('SSE连接错误:', error);
};
// 或者使用专门的SSE库
const sse = new SSE('/batch-generate-questions', {
headers: { 'Authorization': 'Bearer YOUR_TOKEN' }
});
sse.on('init', (data) => {
console.log('初始化:', data);
});
sse.on('question_success', (data) => {
console.log('题目生成成功:', data);
updateProgressBar(data.progress.percentage);
});错误处理
验证错误
- 返回400状态码和详细错误信息
- 包含缺失字段或无效值的具体说明
生成错误
- 单个题目生成失败不影响其他题目
- 错误信息通过SSE事件实时返回
- 最终统计成功率和失败详情
系统错误
- 使用
safeAsyncHandler包装,返回500状态码 - 包含详细的错误日志
限制和约束
- 单次请求最大数量: 100道题目
- 单规则最大数量: 50道题目
- 并发限制: 每批最多10个并发请求
- 题型限制: 仅支持4种预设题型
- 难度限制: 仅支持3种预设难度
性能考虑
- 分批处理: 避免一次性过多并发请求
- 延迟控制: 批次间100ms延迟,平衡性能和资源使用
- 错误隔离: 单个失败不影响整体流程
- 实时反馈: SSE提供实时进度更新
版权所有
版权归属:Evoliant
许可证:MIT