前言¶
DeepSeek Harness (DSH) 的核心理念是“一切皆插件”。在开发或使用 DSH 进行自动化任务时,往往需要编写脚本调用外部接口。对于头歌(EduCoder)这类作业平台,通常的自动化方案需要浏览器自动化、截图识别或 OCR,这会增加复杂度并消耗资源。
dsh-educoder 是一个直接针对 EduCoder 平台 JSON 接口开发的 DSH 插件。它通过全量扫描账号未完成的作业并一次性解决,实现了“零 token”扫描和“零 token”选择题。本插件不依赖浏览器,仅使用平台公开接口,适合需要在 DSH 流程中自动处理 EduCoder 作业的场景。
插件概况¶
- 名称:
dsh-educoder - 所有者:isheng-eqi
- 类别:工作流
- 许可证:MIT
核心价值:
1. 全量扫描:一键扫描账号下所有未完成的作业。
2. 低 token 设计:扫描过程零 token,选择题零 token(通过平台响应回吐答案键),仅代码题调用模型。
3. 真实提交:自动执行真实的提交和评测流程,消耗评测次数。
安装与启用¶
插件包名为 dsh-educoder,bundle 行 id 为 educoder。推荐使用预构建的 npm 包,避免本地构建授权问题。
在 DSH 的插件管理中,执行以下命令之一:
# npm 安装(推荐)
# target: dsh-educoder
# 从 GitHub 安装
# target: github:isheng-eqi/dsh-educoder
安装后,在 ~/.dsh/profiles/<profile>/cordis.patch.yml 文件中会出现 educoder 配置项。配置支持热应用,修改后无需重启 DSH。
配置项¶
在 DSH 的插件设置界面或配置文件中填写以下参数:
| 键 | 默认 | 说明 |
|---|---|---|
login / password |
空 | 头歌账号。首次登录后复用会话 cookie,密码不直接显示在对话中。 |
sessionFile |
~/.educoder/session.json |
会话缓存路径,与 educoder-lab CLI 共享。 |
provider / model |
空 | 生成答案用的模型;留空则使用当前会话模型。 |
maxAttempts |
3 | 每道代码题最多重试次数。 |
maxTokens |
8000 | 单次生成上限。 |
gradeTimeoutSec |
180 | 单次评测最长等待时间。 |
pollIntervalSec |
3 | 轮询评测结果的间隔。 |
challengeLimit |
0 | 单份作业中 0 表示一次做完所有未通过关卡。 |
homeworkLimit |
0 | 单次全量扫描最多处理几份作业;0 表示不限。 |
toolTimeoutMinutes |
45 | 工具整体超时时间。 |
典型用法¶
1. 账号检测与课程列表¶
在提交任何作业前,先检查账号连接状态。只列出课程不能证明会话有效(/courses.json 不需要登录),必须读取一次关卡数据。
educoder_account url: <你的作业链接>
2. 扫描未完成作业¶
零 token 扫描账号(或指定一门课)的所有作业,仅读取数据,不提交。
educoder_sweep mode=scan
3. 一次性解决所有作业¶
执行真正的解决流程。选择题自动从平台响应获取答案键,无需模型;代码题调用模型生成并提交评测。
educoder_sweep mode=solve
4. 单份作业处理¶
针对特定作业进行巡检或解决。
# 巡检模式,只读不提交
educoder_homework url: <作业链接> mode=survey
# 解决模式,默认
educoder_homework url: <作业链接> mode=solve
关键实现要点¶
插件基于对 EduCoder 平台接口的实测实现,核心逻辑如下:
- 签名机制:每个请求携带
X-EDU-Type/Timestamp/Signature。签名算法为md5(base64("method=<M>&ak=<AK>&sk=<SK>&time=<epoch-ms>"))。AK/SK为平台前端 bundle 中的公开常量。 - 关卡遍历:平台无“获取第 N 关”接口。插件先通过
prev_game回退到未通过关卡的起点,再向前遍历。通过一关后需重新读取该关卡,因为next_game在通过前为 null。 - 一次评测:一个关卡的多个文件整体评测。上传时设置
evaluate: 0,待所有文件传完再触发一次game_build.json,避免多次触发导致半成品评测浪费配额。 - 评测判定:等待
game.evaluate_count真正上涨,确认新一轮评测开始;随后等待两次轮询结果一致。game.status == 2直接判定通过。 - 占位符处理:平台填空题的占位符是
—(U+2014),非合法代码。如果答案中保留该字符,插件会直接本地重试,不浪费评测次数。 - 失败反馈:不截断两边输出,而是定位第一处差异(行/列 + 上下文),以便模型快速修正。
- 会话失效检测:平台返回 401 时 HTTP 状态码为 200。插件检测到 body 中的
{"status":401}会自动触发重登,并在任何写入操作前执行。 - 会话验证:
/courses.json不需要登录也返回数据,因此不能用来验证凭据。插件将会话校验放在第一次关卡读取上。
适用场景与注意¶
- 真实提交:
mode=solve会真实提交到平台并消耗评测次数。不确定时请先用mode=survey。 - 账号安全:驱动的是配置中填写的账号,请勿指向他人账号。
- 权限与缓存:会话缓存文件以
0600权限写入,仅本机可读。 - 公开密钥:
AK/SK为平台公开常量,插件不涉及第三方密钥。 - 非官方客户端:这是一个非官方自动化客户端,请在头歌平台条款允许的范围内使用。
- 代码修改:如果修改了
index.js或lib/*.js,必须重启 DSH(dsh web)。DSH 按包名缓存模块,同一进程内不会重新加载同名包。
总结¶
dsh-educoder 通过精准的 API 操作和低 token 策略,将 EduCoder 作业自动化集成到了 DSH 生态中。它适合需要在 DSH 流程中自动处理大量作业、追求成本控制和操作效率的开发者。