用本地 ledger 记录每次评估分数;默认阈值 80 分(与常见 Academy 徽章说明一致,仍以官网为准)。可查询 pathway 是否齐套。
先看清成品
- 79 分未过、80 分通过;缺课 status 显示 missing。
- 2 项 pytest 通过。
合规提醒:OpenAI Academy 课程与徽章侧重产品使用学习,不是职业资格认证;评估通过线以 Help Center / 课程页为准(常见表述为评分 ≥80%)。学习账号遵守 OpenAI 使用政策;勿把课程作业变成未授权自动化刷分。课程目录会更新,本教程附带的 JSON 是离线快照,上线前请回官网核对。
运行说明:Academy 无公开「课程列表 REST API」。三篇均本地:A 用 curated catalog 生成周计划;B 笔记转闪卡;C 本地 ledger 追踪及格阈值。未登录 academy.openai.com。2026-10-23(Asia/Shanghai)pytest 通过。
做完之后你会得到什么?
| 成果 | 说明 |
|---|---|
badge_tracker.py |
进度账本 |
test_103c.py |
测试 |
需要准备哪些环境?
| 项目 | 说明 |
|---|---|
| Python | 3.10+ |
关键事实
| 事实 | 来源 |
|---|---|
| 徽章/结业证明≠职业资格认证 | Academy 常见说明 |
| 通过线以课程/Help 为准;本仓库默认 80 | 教程约定 |
| ledger 仅存本地,不与 OpenAI 服务器同步 | 重要 |
文件结构
103-openai-academy-C-src/
├── badge_tracker.py
└── test_103c.py
第 1 步:账本脚本
#!/usr/bin/env python3
"""Track OpenAI Academy course completion toward pathway badges (local JSON ledger)."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
PASS = 80 # Help Center: badge when assessment score >= 80%
def load(path: Path) -> dict:
if path.exists():
return json.loads(path.read_text(encoding="utf-8"))
return {"attempts": [], "note": "Badges are not professional certifications."}
def record(ledger: dict, course_id: str, score: int) -> dict:
if not (0 <= score <= 100):
raise ValueError("score 0..100")
passed = score >= PASS
ledger.setdefault("attempts", []).append({"course_id": course_id, "score": score, "passed": passed})
return {"course_id": course_id, "score": score, "passed": passed, "threshold": PASS}
def summary(ledger: dict, required: list[str]) -> dict:
best = {}
for a in ledger.get("attempts") or []:
cid = a["course_id"]
best[cid] = max(best.get(cid, -1), a["score"])
done = [c for c in required if best.get(c, -1) >= PASS]
missing = [c for c in required if c not in done]
return {"passed": done, "missing": missing, "ready_for_pathway_certificate": not missing and bool(required)}
def main(argv=None) -> int:
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("--ledger", default="academy_ledger.json")
sub = ap.add_subparsers(dest="cmd", required=True)
r = sub.add_parser("record")
r.add_argument("course_id")
r.add_argument("score", type=int)
s = sub.add_parser("status")
s.add_argument("--required", nargs="+", default=["ai-foundations", "applied-ai-foundations"])
args = ap.parse_args(argv)
path = Path(args.ledger)
ledger = load(path)
if args.cmd == "record":
info = record(ledger, args.course_id, args.score)
path.write_text(json.dumps(ledger, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
print(json.dumps(info, ensure_ascii=False))
return 0
print(json.dumps(summary(ledger, args.required), ensure_ascii=False, indent=2))
return 0
if __name__ == "__main__":
raise SystemExit(main())
第 2 步:测试
from pathlib import Path
import json, subprocess, sys
from badge_tracker import record, summary, PASS
HERE = Path(__file__).resolve().parent
def test_threshold(tmp_path):
led = {"attempts": []}
assert record(led, "ai-foundations", 79)["passed"] is False
assert record(led, "ai-foundations", 80)["passed"] is True
st = summary(led, ["ai-foundations", "applied-ai-foundations"])
assert st["missing"] == ["applied-ai-foundations"]
def test_cli(tmp_path):
led = tmp_path / "l.json"
subprocess.run([sys.executable, str(HERE/"badge_tracker.py"), "--ledger", str(led), "record", "ai-foundations", "90"], check=True)
r = subprocess.run([sys.executable, str(HERE/"badge_tracker.py"), "--ledger", str(led), "status", "--required", "ai-foundations"], capture_output=True, text=True, check=True)
assert "ai-foundations" in r.stdout
第 3 步:运行
$ badge_tracker record/status
{"course_id": "ai-foundations", "score": 90, "passed": true, "threshold": 80}
{"course_id": "applied-ai-foundations", "score": 75, "passed": false, "threshold": 80}
{
"passed": [
"ai-foundations"
],
"missing": [
"applied-ai-foundations"
],
"ready_for_pathway_certificate": false
}
$ pytest -q
.. [100%]
2 passed in 0.06s
怎么检查结果?
- record 打印 passed true/false。
- status 列出 missing 课程。
调试示例
以为网页徽章会写回这个 JSON。 不会。这是你自己的学习账本;官网进度以登录后的 Academy 为准。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 改阈值 | 改源码 PASS | 或叉开分支 |
| 多 pathway | 多次 status | 换 --required |
| 作弊刷分 | 不要 | 违反政策且无意义 |
模板规则
- 诚实记录分数。
- 徽章不作就业承诺。
- 以官网进度为准。
项目资源
| 用途 | 地址 |
|---|---|
| OpenAI Academy | https://academy.openai.com/ |
| Academy Home | https://academy.openai.com/home |
| OpenAI Status | https://status.openai.com/ |
进度可见,才知道下一门该补哪课。