前言¶
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,命中第一个即使用:
- DSH 凭据服务里的
SCNET_API_KEY(ctx.credentials.resolve("SCNET_API_KEY"))。该服务会优先使用已存值而非环境变量,因此setx SCNET_API_KEY sk-…后重启 DSH 也算。 - 本插件的
credentialFile配置,可以是 JSON 文件本身,也可以是装着它的目录。 - 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 / 幻方无官方从属关系。安装前建议检查源码与许可证。