Files
homework-template/PRD_SCRIPT.md
2026-04-08 13:55:17 +08:00

3.1 KiB
Raw Blame History

请在 ./scripts/ 文件夹下写一个 img2typ.py 脚本,达成下面的要求。

流程

遍历当前所在目录下的文件(不深入到子目录)。

找到所有的 \S\s?[\d\.]+ 的文件名的图片。且最开头的 \S 不能是 或者 A 或者 a

  • 这里只是大概的描述,你可能需要调整正则,或者不使用正则
  • 例如,问 13.png Q3.1.jpg R1.1.5.PNG 等等的文件名都是合法的

检测有没有对应的 .typ 文件。即,看有没有后缀名改成 typ 的文件。

如果没有,则用 ./scripts/img2typ.prompt.txt 为提示词,调用一个支持图片的 OpenAI 兼容 API。这个提示词文件在未来会改动请在程序执行时动态读取它。API 的 API 端点和 API Key 应该使用一个 .env 文件定义,这个文件将会置放在 ./scripts/ 文件夹下。

对输出结果,如果有 Markdown 代码块包裹,则去除(可能需要你写正则或者其他任何机制)

接着,保存为对应的 .typ 文件。

最后,整理所有符合条件的 .typ 文件(包括生成失败的),整理成一个列表后,在当前根目录写入(可覆盖)questions.json,是一个 JSON 列表,列表的每一个项目都是一个 JSON Object。形如

[
    {
        "question": "Q3.1",
        "format": "typst",
        "target": "Q3.1.typ"
    },
    {
        "question": "R1.1.5",
        "format": "typst",
        "target": "R1.1.5.typ"
    }
]

细节

调用 API 时,如果失败,则重试。最多重试 3 次(或者可定义),真的失败了不能 panic只是在 stderr 中汇报。

规范

代码应该是人类可维护的。你可以(而且最好)使用 python 的比较常用的现代语法,例如直接的类型注解(使用 list 而不是 typing.List),以及尽量使用 pathlib.Path 而不是字符串。

这个应用是面向过程的。你应该首先对流程做拆解,然后以子函数的形式声明整个函数。每个函数都应该有 docstring。对于 AI 等一些比较重要的东西,你再使用面向对象的方式去应对。

你可以给我要求,让我依赖一些更多的外置库。当前环境有 requestsdotenvrichtqdm 可用。

程序往 stderr 的输出应该是可审计的。应该汇报:

  • 将要处理的文件清单。
  • 调用了什么 API调用情况如何输入输出多少 tokens。
  • 写入了什么文件。

程序往 stderr 的输出应该是良好可视化的,就是说,有颜色区分,但是不要加 emoji。或者说你应该使用自带的日志库 + 一定的格式化。

额外功能添补

这个脚本应该可以作为 cli 调用,支持以下参数:

  • --file-f 后接文件名,可重复这个参数。当存在这个参数,则解析对应的图片,而不是扫描当前目录
  • --dry-run 不调用 AI也不写入文件
  • --verbose 在基础上反馈 AI 调用的输出,相当于 log level 是 DEBUG
  • --retry 接数字,重试次数,默认为 3
  • -n 接数字,并发数量,默认为 3