Spaces:
Sleeping
Sleeping
File size: 7,306 Bytes
a91db77 8f7c172 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 | # AI Quiz API 接口文档
用于与前端/其他网页进行 AI Quiz 互动的统一接口规范。所有响应均包含 `meta` 用于模型追踪与排查;题目使用 `question_id` 与 `correct_answers` 便于后端存档与追溯。
---
## 1. 通用:所有响应增加 meta
用于排查模型问题与结果追溯,**所有成功响应**均需包含:
```json
"meta": {
"model": "gpt-4.1-mini",
"model_version": "2024-07",
"prompt_version": "quiz_v2",
"temperature": 0.4,
"tokens_used": 842,
"latency_ms": 1280
}
```
| 字段 | 类型 | 说明 |
|------|------|------|
| `model` | string | 模型标识 |
| `model_version` | string | 模型版本(可选) |
| `prompt_version` | string | 当前 prompt 版本,便于回溯 |
| `temperature` | number | 采样温度 |
| `tokens_used` | number | 本次请求消耗 token 数 |
| `latency_ms` | number | 请求耗时(毫秒) |
---
## 2. Generate Quiz:题目与答案结构
### 2.1 删除字段
- **禁止**使用 `options[].is_correct` 表示正确答案。
### 2.2 新增 / 修改结构
每题必须包含唯一 `question_id`,答案通过 **`correct_answers`** 数组表示,便于后端校验与存档。
**题目项示例:**
```json
{
"question_id": "ai_q_001",
"type": "SINGLE_CHOICE",
"question_text": "What is responsible AI?",
"options": [
{ "key": "A", "text": "AI that only runs on servers" },
{ "key": "B", "text": "AI designed to be accountable and fair" },
{ "key": "C", "text": "AI that uses no data" }
],
"correct_answers": ["B"]
}
```
**答案规则(后端需校验,不合法可重试):**
| 题型 | correct_answers 规则 | 备注 |
|------|----------------------|------|
| `SINGLE_CHOICE` | 必须 **恰好 1 个** 答案 | 如 `["B"]` |
| `MULTIPLE_CHOICE` | **≥ 1** 个答案 | 如 `["A","C"]` |
| `TRUE_FALSE` | 必须 **2 个选项**(True/False) | 答案为其中之一 |
| `SHORT_ANSWER` | 不适用选项;必须返回 **`explanation`** | 用于评分与反馈 |
**SHORT_ANSWER 示例:**
```json
{
"question_id": "ai_q_002",
"type": "SHORT_ANSWER",
"question_text": "Explain one risk of generative AI in education.",
"explanation": "Reference answer: e.g. over-reliance may reduce critical thinking."
}
```
---
## 3. 标准错误返回
当 AI 输出不合法、超时或服务失败时,统一使用以下结构(**非 2xx**):
```json
{
"code": 422,
"error": {
"type": "INVALID_GENERATION",
"reason": "multiple_correct_answers"
}
}
```
### 3.1 错误码与 type
| HTTP code | error.type | 说明 |
|-----------|------------|------|
| **422** | `INVALID_GENERATION` | AI 输出不合法(如单选多答、缺少必填字段等),`reason` 可细化 |
| **429** | `RATE_LIMIT` | 请求频率超限 |
| **500** | `MODEL_ERROR` | 模型/上游服务错误 |
| **504** | `TIMEOUT` | 请求超时 |
### 3.2 reason 示例(422)
- `multiple_correct_answers`:单选题返回了多个正确答案
- `missing_question_id`:缺少 `question_id`
- `missing_correct_answers`:缺少 `correct_answers` 或不符合题型规则
- `invalid_short_answer`:SHORT_ANSWER 缺少 `explanation`
---
## 4. Grade Quiz:每题解释
批改接口响应中,**新增** `per_question_feedback`,对每题给出分数与简要理由:
```json
{
"overall_score": 75,
"per_question_feedback": [
{
"question_id": "ai_q_001",
"score": 10,
"reasoning": "Correct choice; full marks."
},
{
"question_id": "ai_q_002",
"score": 7,
"reasoning": "Concept correct but example missing."
}
],
"meta": {
"model": "gpt-4.1-mini",
"model_version": "2024-07",
"prompt_version": "grade_v1",
"temperature": 0.2,
"tokens_used": 520,
"latency_ms": 890
}
}
```
| 字段 | 类型 | 说明 |
|------|------|------|
| `question_id` | string | 对应题目 ID,与 Generate 阶段一致 |
| `score` | number | 该题得分 |
| `reasoning` | string | 简短批改理由 |
---
## 5. 课程信息(参考)
- **Course**: IST345(来自 syllabus)
- **Instructor**: Yan Li — Yan.Li@cgu.edu
- **TA**: Kaijie Yu — Kaijie.Yu@cgu.edu
- **TA**: Yongjia Sun — Yongjia.Sun@cgu.edu
前端展示 Instructor 与多位 TA 时,可依此配置。
---
## 6. 外部网站调用方式(Generate Quiz)
其他网站/前端可通过 HTTP 调用 Clare 后端的 **生成 Quiz** 接口,无需登录、无会话依赖。
### 6.1 接口地址
- **方法**: `POST`
- **URL**: `https://你的Clare后端域名/api/quiz/generate`
例如部署在 Hugging Face Space 则为:`https://xxx.huggingface.co/api/quiz/generate`
### 6.2 CORS
后端已配置 `allow_origins=["*"]`,任意域名的网页均可通过浏览器 `fetch` 直接请求该接口(跨域可行)。
### 6.3 请求体(JSON)
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `topic` | string | 是 | 测验主题,如 "Responsible AI"、"IST345 Module 10" |
| `num_questions` | int | 否 | 题目数量,默认 3,范围 1–10 |
| `language` | string | 否 | 题目语言:`en`(英语)或 `zh`(中文),默认 `en` |
### 6.4 请求头(可选)
若你在后端环境变量中设置了 **`QUIZ_API_KEY`**,则请求必须在 Header 中带上:
- **Header 名**: `X-API-Key`
- **值**: 与 `QUIZ_API_KEY` 一致
未设置 `QUIZ_API_KEY` 时,无需该 Header。
### 6.5 成功响应(200)
```json
{
"questions": [
{
"question_id": "ai_q_001",
"type": "SINGLE_CHOICE",
"question_text": "What is responsible AI?",
"options": [
{ "key": "A", "text": "..." },
{ "key": "B", "text": "AI designed to be accountable and fair" }
],
"correct_answers": ["B"]
}
],
"meta": {
"model": "gpt-4.1-mini",
"prompt_version": "quiz_generate_v1",
"temperature": 0.4,
"tokens_used": 842,
"latency_ms": 1280
}
}
```
### 6.6 错误响应
- **422**:主题为空或 AI 输出不合法,body 含 `code`、`error.type`、`error.reason`
- **429**:未带或错误的 `X-API-Key`(当已设置 `QUIZ_API_KEY` 时)
- **500**:模型/服务异常
### 6.7 前端调用示例(fetch)
```javascript
// 将 BASE 换成你的 Clare 后端地址,例如 https://your-space.hf.space
const BASE = "https://your-clare-api.com";
async function generateQuiz(topic, numQuestions = 3, language = "en") {
const res = await fetch(`${BASE}/api/quiz/generate`, {
method: "POST",
headers: { "Content-Type": "application/json" },
// 若设置了 QUIZ_API_KEY,加上: "X-API-Key": "你的密钥"
body: JSON.stringify({ topic, num_questions: numQuestions, language }),
});
if (!res.ok) {
const err = await res.json().catch(() => ({}));
throw new Error(err?.error?.reason || res.statusText);
}
return res.json(); // { questions, meta }
}
// 使用
generateQuiz("Responsible AI", 3, "en").then((data) => {
console.log(data.questions);
console.log(data.meta.latency_ms);
});
```
### 6.8 部署时建议
- 若只允许自家站点调用,可在后端设置 **`QUIZ_API_KEY`**,并在调用方请求头中携带 `X-API-Key`。
- 若需限流,可在后端对 ` /api/quiz/generate` 做频率限制(或依赖 HF/网关的限流)。
|