DeepSeek Harness 连接 SCNet 模型

前言

DeepSeek Harness(DSH)通过插件扩展模型接入方式,超算互联网(SCNet)计算服务客户端已登录的模型可通过 dsh-connect-scnet 插件接入。使用时复用客户端已保存的 API key,无需二次配置。

插件说明

dsh-connect-scnet 是一个 DSH 插件,由维护者 hualuo520-h 开发,分类为「模型推理」。它的作用是把 SCNet 客户端里已登录的模型接入 DSH 的模型选择器,并复用客户端自己的 API key,不要求用户手动填写。

安装后,DSH 的模型选择器里会多出 scnet 这个 provider 和它的 30 个模型,包括 SCNet-Max、DeepSeek-V4-Pro-0813、Qwen3.8-Max、Kimi-K3、GLM-5.3 等。

安装与启用

安装前需要满足两个前提:1)DSH 版本 0.2.0-rc.0 及以上;2)先登录一次 SCNet 客户端。

安装命令:

dsh plugin --profile <你的 profile> add dsh-connect-scnet

也可以直接从仓库安装:

dsh plugin --profile <你的 profile> add github:hualuo520-h/dsh-connect-scnet

安装完成后重启 DSH,在模型选择器里选择 scnet。如需修改配置,见下文「配置项」。

API key 获取方式

插件按以下顺序查找 API key,命中第一个即使用:

  1. DSH 凭据服务里的 SCNET_API_KEY(ctx.credentials.resolve("SCNET_API_KEY"))。该服务会优先使用已存值而非环境变量,因此 setx SCNET_API_KEY sk-… 后重启 DSH 也算。
  2. 本插件的 credentialFile 配置,可以是 JSON 文件本身,也可以是装着它的目录。
  3. SCNet 客户端默认凭据目录:%USERPROFILE%\.sclaw\agent\scnet-credentials\。客户端把 key 落在 {"scnet":{"type":"api_key","key":"sk-…"}} 这种文件里。目录里有多个时按 mtime 取最新的一份(mtime 相同则按文件名定序)。

三处都没有时,插件抛 MISSING_CREDENTIAL,DSH 会把 scnet 显示成「未配置」而不是报错崩溃。

key 首尾的空白会被静默去掉;去掉之后如果还剩不能进 HTTP 头的字符(中间有空白、非 ASCII),插件报 INVALID_CREDENTIAL。

建议先启动一次 SCNet 客户端并登录,再装这个插件,最省事。

配置项

插件提供两个配置字段:

字段 默认值 说明
credentialFile "" SCNet 凭据 JSON 的路径,或装着它的目录。留空则自动找 ~/.sclaw/agent/scnet-credentials。
baseURL "" 网关地址,留空用 https://api.scnet.cn/api/llm/v1。

这两个字段都不是 volatile,所以在 UI 里改不了。如需修改,要写进 profile 的 cordis.patch.yml。注意只能写 id 定向覆盖,不要再 insert 一次(bundle 自己的 patch 已经插过 llm-scnet,同一个 id 出现两次会让插件树加载直接失败):

- id: llm-scnet
  config:
    baseURL: https://my-gateway.example/v1

为什么没有设置卡片

DSH 的 Models 设置页只给两个 settings namespace 画表单:llm-deepseek 和 llm-pi-ai。第三方插件的 namespace 都会落在 unknown 分支,页面只渲染一句「高级提示」,提交按钮恒为禁用。也就是说第三方插件没法借这个页面收 key。

dsh-connect-trae / dsh-connect-qoder 因此各自带了一个 lib/client.js 自绘卡片。本插件选择不带 client 半边,代价是设置页里看不到输入框,收益是少一个需要跟着 host 版本走的 React 半身,而 key 本来就应该由客户端自己提供。

模型目录

GET https://api.scnet.cn/api/llm/v1/models 能返回 31 个 id,但每条只有 {"id": "SCNet-Max", "object": "model", "ownedBy": "system"},没有 contextWindow、maxTokens,也没有模态信息。所以目录来自 models.js(30 条),由 scripts/gen-models.mjs 从 SCNet 客户端自己的 ~/.sclaw/agent/models.json 生成。

更新模型表:

node scripts/gen-models.mjs

生成脚本会校验来源(provider 必须是 scnet、api 必须是 openai-completions、条数必须是 30、每条 reasoning 模型必须有完整的 7 档 thinkingLevelMap、maxTokens 不得超过 contextWindow),任何一条不符就退出。

厂商表里有两个模型 maxTokens 大于 contextWindow(Qwen3.5-122B-A10B 102400/131072、Qwen3-235B-A22B 32768/131072),生成器把它们夹到窗口本身,并把夹过的条目记在 models.js 表头。

协议兼容性

dsh-connect-scnet 定义了八个兼容字段,前六条是通过真实端点跑探针定下来的,后两条是把 pi-ai 的默认值显式写出来(为了在代码里看得见依赖关系):

字段 取值
maxTokensField "max_completion_tokens"
thinkingFormat "qwen"
supportsReasoningEffort true
supportsStore false
supportsDeveloperRole false
requiresReasoningContentOnAssistantMessages false
supportsUsageInStreaming true
supportsFinishReason true

关于「怎么关思考」的实测结论:能关的有 enable_thinking:false、thinking:{type:"disabled"}、reasoning:{effort:"none"};不能关的有不传字段、chat_template_kwargs:{thinking:false}、reasoning_effort:"off";thinking_budget:0 会报 HTTP 400 code:"10013"。

reasoning_effort:"off" 关不掉思考,是选择 thinkingFormat:"qwen" 而不是 "openai" 的根本原因。

已知限制

  • 余额。实测账号里只有 SCNet-Max 能真正调通,其余 29 个模型返回 402 Insufficient Balance。这是账号侧的事,插件照实把它们列出来。
  • 思考等级照抄客户端 models.json 的 thinkingLevelMap,映射为 null 的档位 pi-ai 会剔除,所以那些模型不会显示 minimal / xhigh 之类的空档。
  • 图片:input 含 image 的 11 个模型走 DSH 的 durable attachment 服务;如果 profile 里没有 attachments 服务,带图请求会报 UNSUPPORTED_CONTENT。

文件说明

文件 作用
index.js host 半边:apply() 里注册 adapter / discovery / directory 三件套
models.js 静态模型目录(30 条,生成物)
scripts/gen-models.mjs 从 SCNet 客户端 models.json 重新生成 models.js
cordis.patch.yml bundle patch:往 profile 里插一条 llm-scnet
locale/{zh,en}.json 插件标题与描述
icon.svg 插件图标

生态背景

DeepSeek Harness 的理念是「一切皆插件」,社区目录与 DeepSeek / 幻方无官方从属关系。安装前建议检查源码与许可证。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye