目标与背景
平时拿大模型辅助测试校内 OJ(HUEL OJ)题目时,每次都要在网页端复制题面、整理输入输出格式、贴进对话窗口,拿到代码后再切回网页提交并查看判题报错,来回切窗口非常繁琐。
于是我用 Rust 写了这个命令行小工具:把“拉取题面 → 请求大模型生成代码 → 自动提交判题 → 根据报错反馈重试”串成一条能在终端里直接观察的自动化流水线,同时也借这个项目练手 Rust 的异步网络请求与配置管理。
我的工作
我独立完成了整个命令行工具的设计与开发,包括校内 OJ 的登录态维护与接口封装、题目 HTML/JSON 数据解析、OpenAI 兼容接口调用、返回代码块提取清洗、判题结果轮询,以及终端交互菜单与本地 oj-auto.toml 配置管理。
实现内容
- 单题与区间批量处理:自动读取指定题号(或题号区间)的题目描述、输入输出要求与样例,拼装成结构化提示词发给模型;从模型回复中剥离 Markdown 代码围栏,按 OJ 提交接口格式编码并上传。批量运行时若单题网络异常会打印错误并继续处理下一题,不会直接中断整批任务。
- 带判题反馈的多轮修正:当提交未通过(如编译错误、答案错误或超时)时,工具会自动拉取历史提交记录与 OJ 返回的具体报错信息,连同上一轮代码一起喂回给大模型要求针对性修正,单题最多自动重试三轮,并在终端实时打印每一步状态。
- 多模型配置切换:模型接口地址、API Key、模型名称(如
deepseek-chat等)及温度参数统一保存在oj-auto.toml中,支持在命令行菜单里直接新增、编辑或一键切换当前使用的模型。
方案与取舍
底层使用 Rust 配合 Tokio 异步运行时与 reqwest 处理网络通信,用 Serde 完成接口响应与 TOML 配置文件的序列化解析。交互层没有做复杂的图形界面,而是直接采用轻量直观的终端菜单与彩色日志输出——对于这种调试性质很强的工具来说,能一眼看清“当前发了什么请求、模型回了什么代码、OJ 判了什么状态”比花哨的界面实用得多。
大模型侧统一对接标准的 OpenAI Chat Completions 兼容接口,这样无论是切到 DeepSeek 还是其他兼容服务,都不需要改动核心题面处理逻辑。
局限与复盘
目前工具的提示词模板和提交流程主要针对 C 语言编程题编写。实际跑下来也能明显感觉到,“能自动生成并提交”不等于包过所有题目:遇到题面表述隐晦、边界条件刁钻的算法题,即便带上三轮判题反馈重试,模型依然可能在同一个逻辑坑里打转。
此外,工具直接依赖校内 OJ 现有的网页接口结构,一旦后端改版就需要同步调整解析层。不过折腾完这一趟,最大的收获还是把思路从“单次让 AI 写段代码”拉到了完整的闭环工程上:异常兜底、请求限速、错误上下文提取以及最大重试次数限制,哪一步没处理好都没法稳定跑起来。

