DeepSeek Harness 插件

cc1104666/dsh-plugins#dsh-grok-online

Star 数 ★ 0 分类 模型与账号接入 收录于 2026-11-02

在本机跑一个 OpenAI 兼容反代,把 DSH 的对话请求转给 grok.online,无需 API key 即可在模型选择器里用它的两个对话模型。

安装

# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)

dsh plugin --profile web add github:cc1104666/dsh-plugins#path:/packages/dsh-grok-online

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。

README

把 grok.online 的免费对话额度接进 DSH 的模型选择器。

不需要 API Key、不需要登录、不花钱。 代价是它的免费额度很小:每个出口 IP 每天 4 条, 用完还能领 5 条奖励,合计 9 条,UTC 零点(北京时间 08:00)重置。

它做了什么

DSH 模型选择器 ──OpenAI──▶ 本机反代 127.0.0.1:43690/v1
                              │  翻译:messages → {model, role, messages}
                              ▼
                       grok.online POST /api/chat  (SSE)
                              │  OpenRouter → x-ai/grok-4.20 / grok-4.3
                              ▼
                       反代把上游 chunk 重新包装成标准 OpenAI chunk

为什么必须反代(和 dsh-lightvela 相反):LightVela 的网关本身就是 OpenAI 兼容的, 填个 baseURL 就行;grok.online 只有一个自定义接口,请求体、响应流都是它自己的一套。

模型

id 上游 说明
grok-4-20 x-ai/grok-4.20 快,日常对话
grok-4-3 x-ai/grok-4.3 带 reasoning,慢一点
grok-4-7 x-ai/grok-4.7 不注册:站点菜单里有,但网页 API 一律 403 model_locked

模型名写法宽容:x-ai/grok-4.20、grok-4.20、Grok 4.20 都会被收成 grok-4-20。

额度

项 值
免费 4 条/天
奖励 用完后再领 5 条(POST /api/chat?unlock=1)
合计 9 条/天
记账 按出口 IP,不种 cookie
重置 UTC 零点 = 北京时间 08:00
用完的报错 429 {"error":{"code":"limit"}}

额度用完时,反代会自动替你领一次奖励再重试(只做一次,不循环)。领完还是 0,就只能等重置或换出口 IP。

因为 DSH 的一轮工具调用可能连着消耗好几条,这个插件适合「问一句答一句」,不适合跑长任务。

出口池(额度用完自动换 IP)

额度既然是按出口 IP 记的,那「从哪个 IP 出去」就可以做成一个池子:一发请求被限流,就换下一个出口重试。

面板 ② 里粘贴代理,一行一个,支持这些写法:

http://1.2.3.4:8000                明文代理(CONNECT 隧道)
http://user:pass@1.2.3.4:8000      带 Basic 认证
socks5://user:pass@5.6.7.8:1080    SOCKS5(域名交给代理解析)
1.2.3.4:8000:user:pass             国内代理商常见的四段格式
http://gate.proxy.cn:15818 #rotating
http://acct-lite-country_SG-r_1m-s_{session}:pw@gate.nstproxy.io:24125   住宅代理(见下)

行尾加 #rotating(或 #动态)表示它是动态/隧道代理 —— 每次连接换一个出口 IP。

住宅代理:账号里写 {session} 才是真·按请求换 IP

住宅代理商的「动态」不是靠重连,而是靠换会话名:同一个账号 + 不同 s_xxxSuffix = 不同出口 IP。 有的代理商一个会话是 120 分钟粘性的 —— 这种情况下你重连一百次,IP 也不会变。

所以账号里可以写占位符,插件每次建连时换一个随机串:

http://账号-country_SG-r_1m-s_{session}:密码@gate.nstproxy.io:24125
                                 ^^^^^^^^^^ 每发请求换一个随机 10 位串

{session} / {s} / {sid} 三种写法都认;写在密码里也行(有些代理商把参数放密码)。 带占位符的行自动按动态代理处理,不用再写 #rotating,面板上标「自换 IP」。

实测(nstproxy 住宅,5 个国家各 3 发):每个新会话都是干净 IP,?credits=1 一律回 5 条 —— 也就是每次请求都是一份新额度,配额上限由代理商的流量/并发决定,而不是站点的 9 条。

关于 r_ 和 country_ 这两个参数怎么选:

参数 建议 原因
r_120m → r_1m 改短 既然每发请求都换会话,r_ 只决定"同一个会话能活多久"。120 分钟等于把 IP 攥两小时,没必要。实测 1 分钟够了:粘性会话名 75 秒后再连就换 IP,而会话到期不会掐断已经在跑的连接(拿维基媒体实时流压 82 秒,3 次里 2 次完整跑满,剩下 1 次是出口本身的抖动)
country_CN → 海外 改掉 CN 池子小(6 个随机会话只出现 4 个不同 IP)、而且要先出海再回源,单发 8–12 秒;SG 5.0s / JP 5.7s / 中国香港 6.0s。CN 留作最后兜底即可

改短 r_ 的真正好处是降级也安全:万一哪天占位符被删掉、或者代理商复用会话名, r_1m 下的出口仍然每分钟自己滚一次 IP;写 r_120m 就会把同一个 IP 攥两个小时。

类型 一天大概能拿多少 说明
直连 9 条 就是你自己的宽带出口
静态代理 × N ≈ 9N 条 每个出口各记各的 9 条,用完就没了
动态隧道代理(#rotating) 看代理商 每次连接换 IP;如果是 120 分钟粘性会话,等于没换
住宅代理(带 {session}) 看代理商流量 每发请求一个新 IP、一份新额度,实测稳定

它不是"无限":换 IP 绕开的是站点的免费额度设计,站点风控真要拦(403、加验证码、封段)的时候插件没办法。 别拿它当主力模型刷长任务。

轮换规则(lib/rotate.js):

  1. 只对跟 IP 有关的失败换出口:limit / network / rate; model_locked、too_long 换多少 IP 都一样,不浪费请求。
  2. 已经开始吐字就不换了 —— 否则会拼出两段半截回答,宁可报错。
  3. 排序:已知有额度的(多的优先)→ 未探测的 → 冷却中的 → 今天已确认用完的; 动态代理 / 带 {session} 的住宅代理始终排最前,多个国家之间按「最久没用」轮着来。
  4. 单发请求最多试 proxyMaxAttempts(默认 10)个出口,防止池子写错时打一串 429; 同一个动态出口还会再打 proxyRerollRotating 次(默认 2)—— 住宅出口的 TLS 抖动大约 10~20%, 重试一次就换一个新 IP,比直接跳到下一个国家便宜。
  5. 账本按 UTC 日清零,和站点重置对齐;网络类失败进 8–120 秒冷却,避免连续撞同一个坏代理。

面板

输入框下方「Grok」胶囊 / 插件页卡片,四块:

  1. 今日额度 —— 剩几条、奖励领没领、规则说明;「刷新」「领取 +5」
  2. 出口池 —— 粘贴代理、开关自动换出口、每个出口的状态(剩几条 / 出口 IP / 延迟 / 已用完 / 冷却中, 带 {session} 的标「自换 IP」);「测」「删」
  3. 模型 —— 两个可用模型 + 一个被锁的说明;「注册进 DSH」;反代地址与「重启反代」
  4. 试一句 —— 真打一发(会走出口池),分辨「模型不行」还是「没注册上」

接口

宿主半区挂在 /plugins/dsh-grok-online:

方法 路径 说明
GET /status 额度、模型、反代端口、provider 注册状态、出口池
POST /credits/refresh 打上游 ?credits=1
POST /credits/unlock 打上游 ?unlock=1 领 5 条
POST /models/register 把 provider 写进 llm-pi-ai
POST /relay/restart 换端口重启反代并重注册
POST /proxy/save {text, mode?} 保存出口池({clear:true} 才是清空)
POST /proxy/mode {mode:'auto'|'off'} 自动换出口开关
POST /proxy/test {id?} 探测出口额度 + 出口 IP(不消耗额度,不传 id 测全部,最多 12 个)
POST /proxy/remove {id} 删一个出口
POST /test {model, text} 真打一发(走出口池)

本机反代只监听 127.0.0.1,两个端点:

方法 路径 说明
GET /v1/models OpenAI 形状的模型列表
POST /v1/chat/completions 支持 stream,chunk 是标准 OpenAI chunk,结尾 data: [DONE]

注册进 DSH 的方式

settings.mutate('llm-pi-ai', [{
  op: 'set',
  path: ['providers', 'grok-online'],
  value: {
    displayName: 'Grok.online',
    apiKeyEnv: 'GROK_ONLINE_API_KEY',   // credentials 里放一个常量 local-relay,反代不校验
    api: 'openai-completions',
    baseURL: 'http://127.0.0.1:43690/v1',
    models: [{ id: 'grok-4-20', name: 'Grok 4.20', input: ['text'] }, ...],
  },
}])

开机就写一遍,所以插件重装、profile 重建后模型还在。

故障对照

现象 原因 / 处理
选择器里没有「Grok.online」组 宿主半区没加载。面板点「注册进 DSH」,然后刷新页面;仍没有就重启 DSH
面板报 404 / 405 宿主还是旧代码(浏览器半区热读、宿主不热更)。重启 DSH
发消息报 429「额度用完了」 今天 9 条用尽。等北京时间 08:00,或换出口 IP;面板可先「领取 +5」,或开出口池
出口池全「已用完」 这一批 IP 今天的额度都打光了。等 UTC 零点,或补新出口
出口一直「冷却中」 网络层就不通(ECONNREFUSED / 超时 / 407)。用「测」看具体报错,407 是代理账号密码不对
报「代理要认证(407)」 代理地址里的账号密码不对,或缺认证
换了很多出口还是不行 站点的风险控制在拦(同一 UA 高频换 IP)。停一会儿,别继续刷
报 403 model_locked 选了 Grok 4.7。换成 grok-4-20 / grok-4-3
报「上下文太长」 站点单轮只吃约 1 万字符,插件会从最早的开始裁;清会话再发
回复很慢或 502 上游 OpenRouter 忙。重试或换模型
反代端口冲突 会自动顺延到下一个端口;面板点「重启反代」可重新分配并重注册

开发

node scripts/smoke.mjs      # 62 项:store / 模型名归一 / 请求翻译 / 路由 / 反代真起真应答 /
                            #        出口池排序与记账 / 轮换策略(含"吐字后不换")/
                            #        真穿 CONNECT+SOCKS5 代理(本地自签证书)/
                            #        {session} 每发换会话名(起一个记账代理真收报文)/ 面板渲染

提醒

这是把网页端的免费额度接到个人使用环境里。额度限制是站点自己定的,出口池只是 「把同一个免费额度的规则换个 IP 再用一遍」,本质上绕过了它的限额设计: 换得太凶可能被风控(403 / 验证码 / 封出口段),也可能连累你用的代理服务商。 插件这边做了冷却、预算上限、失败不重复撞同一个出口,但那只是减少浪费,不是"保证不被发现"。

别拿它跑批量任务,也别指望它替代真 API —— 它的价值是「偶尔想问问 Grok 时不用切浏览器」, 出口池的价值是「今天那 9 条用完之后,不用等到明早」。

内容来自项目 README(GitHub)↗

链接

同类插件

查看整个分类 →

社区评论

评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。